volcano.sh/volcano@v1.9.0/test/e2e/jobp/job_scale_up_down.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 jobp 18 19 import ( 20 "context" 21 "fmt" 22 23 . "github.com/onsi/ginkgo/v2" 24 . "github.com/onsi/gomega" 25 26 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 27 28 "volcano.sh/volcano/pkg/controllers/job/plugins/svc" 29 30 e2eutil "volcano.sh/volcano/test/e2e/util" 31 ) 32 33 var _ = Describe("Dynamic Job scale up and down", func() { 34 It("Scale up", func() { 35 ctx := e2eutil.InitTestContext(e2eutil.Options{}) 36 defer e2eutil.CleanupTestContext(ctx) 37 38 jobName := "scale-up-job" 39 By("create job") 40 job := e2eutil.CreateJob(ctx, &e2eutil.JobSpec{ 41 Name: jobName, 42 Plugins: map[string][]string{ 43 "svc": {}, 44 }, 45 Tasks: []e2eutil.TaskSpec{ 46 { 47 Name: "default", 48 Img: e2eutil.DefaultNginxImage, 49 Min: 2, 50 Rep: 2, 51 Req: e2eutil.HalfCPU, 52 }, 53 }, 54 }) 55 56 // job phase: pending -> running 57 err := e2eutil.WaitJobReady(ctx, job) 58 Expect(err).NotTo(HaveOccurred()) 59 60 // scale up 61 job.Spec.MinAvailable = 4 62 job.Spec.Tasks[0].Replicas = 4 63 err = e2eutil.UpdateJob(ctx, job) 64 Expect(err).NotTo(HaveOccurred()) 65 66 // wait for tasks scaled up 67 err = e2eutil.WaitJobReady(ctx, job) 68 Expect(err).NotTo(HaveOccurred()) 69 70 // check configmap updated 71 pluginName := fmt.Sprintf("%s-svc", jobName) 72 cm, err := ctx.Kubeclient.CoreV1().ConfigMaps(ctx.Namespace).Get(context.TODO(), 73 pluginName, metav1.GetOptions{}) 74 Expect(err).NotTo(HaveOccurred()) 75 76 hosts := svc.GenerateHosts(job) 77 Expect(hosts).To(Equal(cm.Data)) 78 79 // TODO: check others 80 81 By("delete job") 82 err = ctx.Vcclient.BatchV1alpha1().Jobs(job.Namespace).Delete(context.TODO(), job.Name, metav1.DeleteOptions{}) 83 Expect(err).NotTo(HaveOccurred()) 84 85 err = e2eutil.WaitJobCleanedUp(ctx, job) 86 Expect(err).NotTo(HaveOccurred()) 87 88 }) 89 90 It("Scale down", func() { 91 ctx := e2eutil.InitTestContext(e2eutil.Options{}) 92 defer e2eutil.CleanupTestContext(ctx) 93 94 jobName := "scale-down-job" 95 By("create job") 96 job := e2eutil.CreateJob(ctx, &e2eutil.JobSpec{ 97 Name: jobName, 98 Plugins: map[string][]string{ 99 "svc": {}, 100 }, 101 Tasks: []e2eutil.TaskSpec{ 102 { 103 Name: "default", 104 Img: e2eutil.DefaultNginxImage, 105 Min: 2, 106 Rep: 2, 107 Req: e2eutil.HalfCPU, 108 }, 109 }, 110 }) 111 112 // job phase: pending -> running 113 err := e2eutil.WaitJobReady(ctx, job) 114 Expect(err).NotTo(HaveOccurred()) 115 116 // scale down 117 var taskMinAvailable int32 = 1 118 job.Spec.MinAvailable = 1 119 job.Spec.Tasks[0].Replicas = 1 120 job.Spec.Tasks[0].MinAvailable = &taskMinAvailable 121 err = e2eutil.UpdateJob(ctx, job) 122 Expect(err).NotTo(HaveOccurred()) 123 124 // wait for tasks scaled up 125 err = e2eutil.WaitJobReady(ctx, job) 126 Expect(err).NotTo(HaveOccurred()) 127 128 // check configmap updated 129 pluginName := fmt.Sprintf("%s-svc", jobName) 130 cm, err := ctx.Kubeclient.CoreV1().ConfigMaps(ctx.Namespace).Get(context.TODO(), 131 pluginName, metav1.GetOptions{}) 132 Expect(err).NotTo(HaveOccurred()) 133 134 hosts := svc.GenerateHosts(job) 135 Expect(hosts).To(Equal(cm.Data)) 136 137 // TODO: check others 138 139 By("delete job") 140 err = ctx.Vcclient.BatchV1alpha1().Jobs(job.Namespace).Delete(context.TODO(), job.Name, metav1.DeleteOptions{}) 141 Expect(err).NotTo(HaveOccurred()) 142 143 err = e2eutil.WaitJobCleanedUp(ctx, job) 144 Expect(err).NotTo(HaveOccurred()) 145 146 }) 147 148 It("Scale down to zero and scale up", func() { 149 ctx := e2eutil.InitTestContext(e2eutil.Options{}) 150 defer e2eutil.CleanupTestContext(ctx) 151 152 jobName := "scale-down-job" 153 By("create job") 154 job := e2eutil.CreateJob(ctx, &e2eutil.JobSpec{ 155 Name: jobName, 156 Plugins: map[string][]string{ 157 "svc": {}, 158 }, 159 Tasks: []e2eutil.TaskSpec{ 160 { 161 Name: "default", 162 Img: e2eutil.DefaultNginxImage, 163 Min: 2, 164 Rep: 2, 165 Req: e2eutil.HalfCPU, 166 }, 167 }, 168 }) 169 170 // job phase: pending -> running 171 err := e2eutil.WaitJobReady(ctx, job) 172 Expect(err).NotTo(HaveOccurred()) 173 174 // scale down 175 var taskMinAvailable int32 = 0 176 job.Spec.MinAvailable = 0 177 job.Spec.Tasks[0].Replicas = 0 178 job.Spec.Tasks[0].MinAvailable = &taskMinAvailable 179 err = e2eutil.UpdateJob(ctx, job) 180 Expect(err).NotTo(HaveOccurred()) 181 182 // wait for tasks scaled up 183 err = e2eutil.WaitJobReady(ctx, job) 184 Expect(err).NotTo(HaveOccurred()) 185 186 // check configmap updated 187 pluginName := fmt.Sprintf("%s-svc", jobName) 188 cm, err := ctx.Kubeclient.CoreV1().ConfigMaps(ctx.Namespace).Get(context.TODO(), 189 pluginName, metav1.GetOptions{}) 190 Expect(err).NotTo(HaveOccurred()) 191 192 hosts := svc.GenerateHosts(job) 193 Expect(hosts).To(Equal(cm.Data)) 194 195 // scale up 196 job.Spec.MinAvailable = 2 197 job.Spec.Tasks[0].Replicas = 2 198 err = e2eutil.UpdateJob(ctx, job) 199 Expect(err).NotTo(HaveOccurred()) 200 201 // wait for tasks scaled up 202 err = e2eutil.WaitJobReady(ctx, job) 203 Expect(err).NotTo(HaveOccurred()) 204 205 // check configmap updated 206 cm, err = ctx.Kubeclient.CoreV1().ConfigMaps(ctx.Namespace).Get(context.TODO(), 207 pluginName, metav1.GetOptions{}) 208 Expect(err).NotTo(HaveOccurred()) 209 210 hosts = svc.GenerateHosts(job) 211 Expect(hosts).To(Equal(cm.Data)) 212 213 // TODO: check others 214 215 By("delete job") 216 err = ctx.Vcclient.BatchV1alpha1().Jobs(job.Namespace).Delete(context.TODO(), job.Name, metav1.DeleteOptions{}) 217 Expect(err).NotTo(HaveOccurred()) 218 219 err = e2eutil.WaitJobCleanedUp(ctx, job) 220 Expect(err).NotTo(HaveOccurred()) 221 }) 222 })