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 })