volcano.sh/volcano@v1.9.0/test/e2e/schedulingaction/predicates.go (about)

     1  /*
     2  Copyright 2021 The Volcano Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package schedulingaction
    18  
    19  import (
    20  	. "github.com/onsi/ginkgo/v2"
    21  	. "github.com/onsi/gomega"
    22  
    23  	v1 "k8s.io/api/core/v1"
    24  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    25  
    26  	e2eutil "volcano.sh/volcano/test/e2e/util"
    27  )
    28  
    29  var _ = Describe("Predicates E2E Test", func() {
    30  
    31  	It("Hostport", func() {
    32  		context := e2eutil.InitTestContext(e2eutil.Options{})
    33  		defer e2eutil.CleanupTestContext(context)
    34  
    35  		nn := e2eutil.ClusterNodeNumber(context)
    36  
    37  		spec := &e2eutil.JobSpec{
    38  			Name: "hp-spec",
    39  			Tasks: []e2eutil.TaskSpec{
    40  				{
    41  					Img:      e2eutil.DefaultNginxImage,
    42  					Min:      int32(nn),
    43  					Req:      e2eutil.OneCPU,
    44  					Rep:      int32(nn * 2),
    45  					Hostport: 28080,
    46  				},
    47  			},
    48  		}
    49  
    50  		job := e2eutil.CreateJob(context, spec)
    51  
    52  		err := e2eutil.WaitTasksReady(context, job, nn)
    53  		Expect(err).NotTo(HaveOccurred())
    54  
    55  		err = e2eutil.WaitTasksPending(context, job, nn)
    56  		Expect(err).NotTo(HaveOccurred())
    57  	})
    58  
    59  	It("NodeAffinity", func() {
    60  		context := e2eutil.InitTestContext(e2eutil.Options{})
    61  		defer e2eutil.CleanupTestContext(context)
    62  
    63  		slot := e2eutil.OneCPU
    64  		nodeName, rep := e2eutil.ComputeNode(context, e2eutil.OneCPU)
    65  		Expect(rep).NotTo(Equal(0))
    66  
    67  		affinity := &v1.Affinity{
    68  			NodeAffinity: &v1.NodeAffinity{
    69  				RequiredDuringSchedulingIgnoredDuringExecution: &v1.NodeSelector{
    70  					NodeSelectorTerms: []v1.NodeSelectorTerm{
    71  						{
    72  							MatchFields: []v1.NodeSelectorRequirement{
    73  								{
    74  									Key:      e2eutil.NodeFieldSelectorKeyNodeName,
    75  									Operator: v1.NodeSelectorOpIn,
    76  									Values:   []string{nodeName},
    77  								},
    78  							},
    79  						},
    80  					},
    81  				},
    82  			},
    83  		}
    84  
    85  		spec := &e2eutil.JobSpec{
    86  			Name: "na-job",
    87  			Tasks: []e2eutil.TaskSpec{
    88  				{
    89  					Img:      e2eutil.DefaultNginxImage,
    90  					Req:      slot,
    91  					Min:      1,
    92  					Rep:      rep,
    93  					Affinity: affinity,
    94  				},
    95  			},
    96  		}
    97  
    98  		job := e2eutil.CreateJob(context, spec)
    99  		err := e2eutil.WaitTasksReady(context, job, int(rep))
   100  		Expect(err).NotTo(HaveOccurred())
   101  
   102  		pods := e2eutil.GetTasksOfJob(context, job)
   103  		for _, pod := range pods {
   104  			Expect(pod.Spec.NodeName).To(Equal(nodeName))
   105  		}
   106  	})
   107  
   108  	It("Pod Affinity", func() {
   109  		context := e2eutil.InitTestContext(e2eutil.Options{})
   110  		defer e2eutil.CleanupTestContext(context)
   111  
   112  		slot := e2eutil.HalfCPU
   113  		_, rep := e2eutil.ComputeNode(context, e2eutil.HalfCPU)
   114  		Expect(rep).NotTo(Equal(0))
   115  
   116  		labels := map[string]string{"foo": "bar"}
   117  
   118  		affinity := &v1.Affinity{
   119  			PodAffinity: &v1.PodAffinity{
   120  				RequiredDuringSchedulingIgnoredDuringExecution: []v1.PodAffinityTerm{
   121  					{
   122  						LabelSelector: &metav1.LabelSelector{
   123  							MatchLabels: labels,
   124  						},
   125  						TopologyKey: "kubernetes.io/hostname",
   126  					},
   127  				},
   128  			},
   129  		}
   130  
   131  		spec := &e2eutil.JobSpec{
   132  			Name: "pa-job",
   133  			Tasks: []e2eutil.TaskSpec{
   134  				{
   135  					Img:      e2eutil.DefaultNginxImage,
   136  					Req:      slot,
   137  					Min:      rep / 2,
   138  					Rep:      rep / 2,
   139  					Affinity: affinity,
   140  					Labels:   labels,
   141  				},
   142  			},
   143  		}
   144  
   145  		job := e2eutil.CreateJob(context, spec)
   146  		err := e2eutil.WaitTasksReady(context, job, int(rep/2))
   147  		Expect(err).NotTo(HaveOccurred())
   148  
   149  		pods := e2eutil.GetTasksOfJob(context, job)
   150  		// All pods should be scheduled to the same node.
   151  		nodeName := pods[0].Spec.NodeName
   152  		for _, pod := range pods {
   153  			Expect(pod.Spec.NodeName).To(Equal(nodeName))
   154  		}
   155  	})
   156  
   157  	It("Pod Anti-Affinity", func() {
   158  		context := e2eutil.InitTestContext(e2eutil.Options{})
   159  		defer e2eutil.CleanupTestContext(context)
   160  
   161  		slot := e2eutil.OneCPU
   162  
   163  		labels := map[string]string{"foo": "bar"}
   164  
   165  		affinity := &v1.Affinity{
   166  			PodAntiAffinity: &v1.PodAntiAffinity{
   167  				RequiredDuringSchedulingIgnoredDuringExecution: []v1.PodAffinityTerm{
   168  					{
   169  						LabelSelector: &metav1.LabelSelector{
   170  							MatchLabels: labels,
   171  						},
   172  						TopologyKey: "kubernetes.io/hostname",
   173  					},
   174  				},
   175  			},
   176  		}
   177  
   178  		spec := &e2eutil.JobSpec{
   179  			Name: "pa-job",
   180  			Tasks: []e2eutil.TaskSpec{
   181  				{
   182  					Img:      e2eutil.DefaultNginxImage,
   183  					Req:      slot,
   184  					Min:      2,
   185  					Rep:      2,
   186  					Affinity: affinity,
   187  					Labels:   labels,
   188  				},
   189  			},
   190  		}
   191  
   192  		job := e2eutil.CreateJob(context, spec)
   193  		err := e2eutil.WaitTasksReady(context, job, 2)
   194  		Expect(err).NotTo(HaveOccurred())
   195  
   196  		pods := e2eutil.GetTasksOfJob(context, job)
   197  		// All pods should be scheduled to the same node.
   198  		nodeName := pods[0].Spec.NodeName
   199  
   200  		for index, pod := range pods {
   201  			if index != 0 {
   202  				Expect(pod.Spec.NodeName).NotTo(Equal(nodeName))
   203  			}
   204  		}
   205  	})
   206  
   207  	It("Taints", func() {
   208  		context := e2eutil.InitTestContext(e2eutil.Options{})
   209  		defer e2eutil.CleanupTestContext(context)
   210  
   211  		taints := []v1.Taint{
   212  			{
   213  				Key:    "test-taint-key",
   214  				Value:  "test-taint-val",
   215  				Effect: v1.TaintEffectNoSchedule,
   216  			},
   217  		}
   218  		defer e2eutil.RemoveTaintsFromAllNodes(context, taints)
   219  
   220  		err := e2eutil.TaintAllNodes(context, taints)
   221  		Expect(err).NotTo(HaveOccurred())
   222  
   223  		spec := &e2eutil.JobSpec{
   224  			Name: "tt-job",
   225  			Tasks: []e2eutil.TaskSpec{
   226  				{
   227  					Img: e2eutil.DefaultNginxImage,
   228  					Req: e2eutil.OneCPU,
   229  					Min: 1,
   230  					Rep: 1,
   231  				},
   232  			},
   233  		}
   234  
   235  		job := e2eutil.CreateJob(context, spec)
   236  		err = e2eutil.WaitTasksPending(context, job, 1)
   237  		Expect(err).NotTo(HaveOccurred())
   238  
   239  		err = e2eutil.RemoveTaintsFromAllNodes(context, taints)
   240  		Expect(err).NotTo(HaveOccurred())
   241  
   242  		err = e2eutil.WaitTasksReady(context, job, 1)
   243  		Expect(err).NotTo(HaveOccurred())
   244  	})
   245  
   246  	It("Taints and Tolerations", func() {
   247  		context := e2eutil.InitTestContext(e2eutil.Options{})
   248  		defer e2eutil.CleanupTestContext(context)
   249  
   250  		taints := []v1.Taint{
   251  			{
   252  				Key:    "test-taint-key",
   253  				Value:  "test-taint-val",
   254  				Effect: v1.TaintEffectNoSchedule,
   255  			},
   256  		}
   257  		defer e2eutil.RemoveTaintsFromAllNodes(context, taints)
   258  
   259  		tolerations := []v1.Toleration{
   260  			{
   261  				Key:      "test-taint-key",
   262  				Value:    "test-taint-val",
   263  				Operator: v1.TolerationOpEqual,
   264  				Effect:   v1.TaintEffectNoSchedule,
   265  			},
   266  		}
   267  
   268  		err := e2eutil.TaintAllNodes(context, taints)
   269  		Expect(err).NotTo(HaveOccurred())
   270  
   271  		spec1 := &e2eutil.JobSpec{
   272  			Name: "tt-job",
   273  			Tasks: []e2eutil.TaskSpec{
   274  				{
   275  					Img:         e2eutil.DefaultNginxImage,
   276  					Req:         e2eutil.OneCPU,
   277  					Min:         1,
   278  					Rep:         1,
   279  					Tolerations: tolerations,
   280  				},
   281  			},
   282  		}
   283  
   284  		spec2 := &e2eutil.JobSpec{
   285  			Name: "tt-job-no-toleration",
   286  			Tasks: []e2eutil.TaskSpec{
   287  				{
   288  					Img: e2eutil.DefaultNginxImage,
   289  					Req: e2eutil.OneCPU,
   290  					Min: 1,
   291  					Rep: 1,
   292  				},
   293  			},
   294  		}
   295  
   296  		job1 := e2eutil.CreateJob(context, spec1)
   297  		err = e2eutil.WaitTasksReady(context, job1, 1)
   298  		Expect(err).NotTo(HaveOccurred())
   299  
   300  		job2 := e2eutil.CreateJob(context, spec2)
   301  		err = e2eutil.WaitTasksPending(context, job2, 1)
   302  		Expect(err).NotTo(HaveOccurred())
   303  
   304  		err = e2eutil.RemoveTaintsFromAllNodes(context, taints)
   305  		Expect(err).NotTo(HaveOccurred())
   306  
   307  		err = e2eutil.WaitTasksReady(context, job2, 1)
   308  		Expect(err).NotTo(HaveOccurred())
   309  	})
   310  })