// Update scales the DeploymentConfig for the given Scale subresource, returning the updated Scale. func (r *ScaleREST) Update(ctx kapi.Context, name string, objInfo rest.UpdatedObjectInfo) (runtime.Object, bool, error) { deploymentConfig, err := r.registry.GetDeploymentConfig(ctx, name) if err != nil { return nil, false, errors.NewNotFound(extensions.Resource("scale"), name) } old := api.ScaleFromConfig(deploymentConfig) obj, err := objInfo.UpdatedObject(ctx, old) if err != nil { return nil, false, err } scale, ok := obj.(*extensions.Scale) if !ok { return nil, false, errors.NewBadRequest(fmt.Sprintf("wrong object passed to Scale update: %v", obj)) } if errs := extvalidation.ValidateScale(scale); len(errs) > 0 { return nil, false, errors.NewInvalid(extensions.Kind("Scale"), scale.Name, errs) } deploymentConfig.Spec.Replicas = scale.Spec.Replicas if err := r.registry.UpdateDeploymentConfig(ctx, deploymentConfig); err != nil { return nil, false, err } return scale, false, nil }
// Get retrieves (computes) the Scale subresource for the given DeploymentConfig name. func (r *ScaleREST) Get(ctx kapi.Context, name string) (runtime.Object, error) { deploymentConfig, err := r.registry.GetDeploymentConfig(ctx, name) if err != nil { return nil, err } return api.ScaleFromConfig(deploymentConfig), nil }
// ScaleSimple does a simple one-shot attempt at scaling - not useful on it's // own, but a necessary building block for Scale func (scaler *DeploymentConfigScaler) ScaleSimple(namespace, name string, preconditions *kubectl.ScalePrecondition, newSize uint) error { dc, err := scaler.dcClient.DeploymentConfigs(namespace).Get(name) if err != nil { return err } scale := deployapi.ScaleFromConfig(dc) scale.Spec.Replicas = int(newSize) if _, err := scaler.dcClient.DeploymentConfigs(namespace).UpdateScale(scale); err != nil { return kubectl.ControllerScaleError{FailureType: kubectl.ControllerScaleUpdateFailure, ResourceVersion: dc.ResourceVersion, ActualError: err} } return nil }
// ScaleSimple does a simple one-shot attempt at scaling - not useful on its // own, but a necessary building block for Scale func (scaler *DeploymentConfigScaler) ScaleSimple(namespace, name string, preconditions *kubectl.ScalePrecondition, newSize uint) error { dc, err := scaler.dcClient.DeploymentConfigs(namespace).Get(name) if err != nil { return err } if dc.Spec.Test { fmt.Fprintln(os.Stderr, "Replica size for a test deployment applies only when the deployment is running.") } scale := deployapi.ScaleFromConfig(dc) scale.Spec.Replicas = int32(newSize) if _, err := scaler.dcClient.DeploymentConfigs(namespace).UpdateScale(scale); err != nil { return kubectl.ScaleError{FailureType: kubectl.ScaleUpdateFailure, ResourceVersion: dc.ResourceVersion, ActualError: err} } return nil }
func TestDeployScale(t *testing.T) { const namespace = "test-deploy-scale" testutil.RequireEtcd(t) _, clusterAdminKubeConfig, err := testserver.StartTestMaster() checkErr(t, err) clusterAdminClientConfig, err := testutil.GetClusterAdminClientConfig(clusterAdminKubeConfig) checkErr(t, err) clusterAdminClient, err := testutil.GetClusterAdminClient(clusterAdminKubeConfig) checkErr(t, err) _, err = testserver.CreateNewProject(clusterAdminClient, *clusterAdminClientConfig, namespace, "my-test-user") checkErr(t, err) osClient, _, _, err := testutil.GetClientForUser(*clusterAdminClientConfig, "my-test-user") checkErr(t, err) config := deploytest.OkDeploymentConfig(0) config.Spec.Triggers = []deployapi.DeploymentTriggerPolicy{} config.Spec.Replicas = 1 dc, err := osClient.DeploymentConfigs(namespace).Create(config) if err != nil { t.Fatalf("Couldn't create DeploymentConfig: %v %#v", err, config) } condition := func() (bool, error) { config, err := osClient.DeploymentConfigs(namespace).Get(dc.Name) if err != nil { return false, nil } return deployutil.HasSynced(config), nil } if err := wait.PollImmediate(500*time.Millisecond, 10*time.Second, condition); err != nil { t.Fatalf("Deployment config never synced: %v", err) } scale, err := osClient.DeploymentConfigs(namespace).GetScale(config.Name) if err != nil { t.Fatalf("Couldn't get DeploymentConfig scale: %v", err) } if scale.Spec.Replicas != 1 { t.Fatalf("Expected scale.spec.replicas=1, got %#v", scale) } scaleUpdate := deployapi.ScaleFromConfig(dc) scaleUpdate.Spec.Replicas = 3 updatedScale, err := osClient.DeploymentConfigs(namespace).UpdateScale(scaleUpdate) if err != nil { // If this complains about "Scale" not being registered in "v1", check the kind overrides in the API registration in SubresourceGroupVersionKind t.Fatalf("Couldn't update DeploymentConfig scale to %#v: %v", scaleUpdate, err) } if updatedScale.Spec.Replicas != 3 { t.Fatalf("Expected scale.spec.replicas=3, got %#v", scale) } persistedScale, err := osClient.DeploymentConfigs(namespace).GetScale(config.Name) if err != nil { t.Fatalf("Couldn't get DeploymentConfig scale: %v", err) } if persistedScale.Spec.Replicas != 3 { t.Fatalf("Expected scale.spec.replicas=3, got %#v", scale) } }