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