Skip to content

Commit

Permalink
add optional wait flag to scaleWorkload function (#1350)
Browse files Browse the repository at this point in the history
* add optional wait flag to scaleWorkloadFunction

* address review comments

* add docs

* address review comments

* address review comments
  • Loading branch information
kale-amruta committed Apr 19, 2022
1 parent 6bbc65f commit 843724b
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 44 deletions.
3 changes: 3 additions & 0 deletions docs/functions.rst
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ to stop a database process before restoring files.
`name`, No, `string`, name of the workload to scale
`kind`, No, `string`, `deployment` or `statefulset`
`replicas`, Yes, `int`, The desired number of replicas
`waitForReady`, No, `bool`, Whether to wait for the workload to be ready before executing next steps. Default Value is ``true``

Example of scaling down:

Expand All @@ -202,6 +203,8 @@ Example of scaling up:
namespace: "{{ .Deployment.Namespace }}"
kind: deployment
replicas: 1
waitForReady: false
PrepareData
-----------
Expand Down
63 changes: 35 additions & 28 deletions pkg/function/scale_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -238,13 +238,14 @@ func (s *ScaleSuite) TestScaleStatefulSet(c *C) {

func (s *ScaleSuite) TestGetArgs(c *C) {
for _, tc := range []struct {
tp param.TemplateParams
args map[string]interface{}
wantNamespace string
wantKind string
wantName string
wantReplicas int32
check Checker
tp param.TemplateParams
args map[string]interface{}
wantNamespace string
wantKind string
wantName string
wantReplicas int32
wantWaitForReady bool
check Checker
}{
{
tp: param.TemplateParams{},
Expand All @@ -258,12 +259,14 @@ func (s *ScaleSuite) TestGetArgs(c *C) {
ScaleWorkloadNamespaceArg: "foo",
ScaleWorkloadNameArg: "app",
ScaleWorkloadKindArg: param.StatefulSetKind,
ScaleWorkloadWaitArg: false,
},
wantKind: param.StatefulSetKind,
wantName: "app",
wantNamespace: "foo",
wantReplicas: int32(2),
check: IsNil,
wantKind: param.StatefulSetKind,
wantName: "app",
wantNamespace: "foo",
wantReplicas: int32(2),
wantWaitForReady: false,
check: IsNil,
},
{
tp: param.TemplateParams{
Expand All @@ -275,11 +278,12 @@ func (s *ScaleSuite) TestGetArgs(c *C) {
args: map[string]interface{}{
ScaleWorkloadReplicas: 2,
},
wantKind: param.StatefulSetKind,
wantName: "app",
wantNamespace: "foo",
wantReplicas: int32(2),
check: IsNil,
wantKind: param.StatefulSetKind,
wantName: "app",
wantNamespace: "foo",
wantReplicas: int32(2),
wantWaitForReady: true,
check: IsNil,
},
{
tp: param.TemplateParams{
Expand All @@ -291,11 +295,12 @@ func (s *ScaleSuite) TestGetArgs(c *C) {
args: map[string]interface{}{
ScaleWorkloadReplicas: int64(2),
},
wantKind: param.DeploymentKind,
wantName: "app",
wantNamespace: "foo",
wantReplicas: int32(2),
check: IsNil,
wantKind: param.DeploymentKind,
wantName: "app",
wantNamespace: "foo",
wantReplicas: int32(2),
wantWaitForReady: true,
check: IsNil,
},
{
tp: param.TemplateParams{
Expand All @@ -310,14 +315,15 @@ func (s *ScaleSuite) TestGetArgs(c *C) {
ScaleWorkloadNameArg: "notapp",
ScaleWorkloadKindArg: param.DeploymentKind,
},
wantKind: param.DeploymentKind,
wantName: "notapp",
wantNamespace: "notfoo",
wantReplicas: int32(2),
check: IsNil,
wantKind: param.DeploymentKind,
wantName: "notapp",
wantNamespace: "notfoo",
wantReplicas: int32(2),
wantWaitForReady: true,
check: IsNil,
},
} {
namespace, kind, name, replicas, err := getArgs(tc.tp, tc.args)
namespace, kind, name, replicas, waitForReady, err := getArgs(tc.tp, tc.args)
c.Assert(err, tc.check)
if err != nil {
continue
Expand All @@ -326,5 +332,6 @@ func (s *ScaleSuite) TestGetArgs(c *C) {
c.Assert(name, Equals, tc.wantName)
c.Assert(kind, Equals, tc.wantKind)
c.Assert(replicas, Equals, tc.wantReplicas)
c.Assert(waitForReady, Equals, tc.wantWaitForReady)
}
}
29 changes: 18 additions & 11 deletions pkg/function/scale_workload.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ const (
ScaleWorkloadNameArg = "name"
ScaleWorkloadKindArg = "kind"
ScaleWorkloadReplicas = "replicas"
ScaleWorkloadWaitArg = "waitForReady"
)

func init() {
Expand All @@ -54,7 +55,7 @@ func (*scaleWorkloadFunc) Name() string {
func (*scaleWorkloadFunc) Exec(ctx context.Context, tp param.TemplateParams, args map[string]interface{}) (map[string]interface{}, error) {
var namespace, kind, name string
var replicas int32
namespace, kind, name, replicas, err := getArgs(tp, args)
namespace, kind, name, replicas, waitForReady, err := getArgs(tp, args)
if err != nil {
return nil, err
}
Expand All @@ -69,15 +70,15 @@ func (*scaleWorkloadFunc) Exec(ctx context.Context, tp param.TemplateParams, arg
}
switch strings.ToLower(kind) {
case param.StatefulSetKind:
return nil, kube.ScaleStatefulSet(ctx, cli, namespace, name, replicas)
return nil, kube.ScaleStatefulSet(ctx, cli, namespace, name, replicas, waitForReady)
case param.DeploymentKind:
return nil, kube.ScaleDeployment(ctx, cli, namespace, name, replicas)
return nil, kube.ScaleDeployment(ctx, cli, namespace, name, replicas, waitForReady)
case param.DeploymentConfigKind:
osCli, err := osversioned.NewForConfig(cfg)
if err != nil {
return nil, errors.Wrapf(err, "Failed to create OpenShift client")
}
return nil, kube.ScaleDeploymentConfig(ctx, cli, osCli, namespace, name, replicas)
return nil, kube.ScaleDeploymentConfig(ctx, cli, osCli, namespace, name, replicas, waitForReady)
}
return nil, errors.New("Workload type not supported " + kind)
}
Expand All @@ -92,14 +93,16 @@ func (*scaleWorkloadFunc) Arguments() []string {
ScaleWorkloadNamespaceArg,
ScaleWorkloadNameArg,
ScaleWorkloadKindArg,
ScaleWorkloadWaitArg,
}
}

func getArgs(tp param.TemplateParams, args map[string]interface{}) (namespace, kind, name string, replicas int32, err error) {
func getArgs(tp param.TemplateParams, args map[string]interface{}) (namespace, kind, name string, replicas int32, waitForReady bool, err error) {
var rep interface{}
waitForReady = true
err = Arg(args, ScaleWorkloadReplicas, &rep)
if err != nil {
return namespace, kind, name, replicas, err
return
}

switch val := rep.(type) {
Expand Down Expand Up @@ -136,21 +139,25 @@ func getArgs(tp param.TemplateParams, args map[string]interface{}) (namespace, k
namespace = tp.DeploymentConfig.Namespace
default:
if !ArgExists(args, ScaleWorkloadNamespaceArg) || !ArgExists(args, ScaleWorkloadNameArg) || !ArgExists(args, ScaleWorkloadKindArg) {
return namespace, kind, name, replicas, errors.New("Workload information not available via defaults or namespace/name/kind parameters")
return namespace, kind, name, replicas, waitForReady, errors.New("Workload information not available via defaults or namespace/name/kind parameters")
}
}

err = OptArg(args, ScaleWorkloadNamespaceArg, &namespace, namespace)
if err != nil {
return namespace, kind, name, replicas, err
return
}
err = OptArg(args, ScaleWorkloadNameArg, &name, name)
if err != nil {
return namespace, kind, name, replicas, err
return
}
err = OptArg(args, ScaleWorkloadKindArg, &kind, kind)
if err != nil {
return namespace, kind, name, replicas, err
return
}
err = OptArg(args, ScaleWorkloadWaitArg, &waitForReady, waitForReady)
if err != nil {
return
}
return namespace, kind, name, replicas, err
return
}
15 changes: 12 additions & 3 deletions pkg/kube/workload.go
Original file line number Diff line number Diff line change
Expand Up @@ -357,7 +357,7 @@ func FetchPods(cli kubernetes.Interface, namespace string, uid types.UID) (runni
return runningPods, notRunningPods, nil
}

func ScaleStatefulSet(ctx context.Context, kubeCli kubernetes.Interface, namespace string, name string, replicas int32) error {
func ScaleStatefulSet(ctx context.Context, kubeCli kubernetes.Interface, namespace string, name string, replicas int32, waitForReady bool) error {
ss, err := kubeCli.AppsV1().StatefulSets(namespace).Get(ctx, name, metav1.GetOptions{})
if err != nil {
return errors.Wrapf(err, "Could not get Statefulset{Namespace %s, Name: %s}", namespace, name)
Expand All @@ -367,10 +367,13 @@ func ScaleStatefulSet(ctx context.Context, kubeCli kubernetes.Interface, namespa
if err != nil {
return errors.Wrapf(err, "Could not update Statefulset{Namespace %s, Name: %s}", namespace, name)
}
if !waitForReady {
return nil
}
return WaitOnStatefulSetReady(ctx, kubeCli, namespace, name)
}

func ScaleDeployment(ctx context.Context, kubeCli kubernetes.Interface, namespace string, name string, replicas int32) error {
func ScaleDeployment(ctx context.Context, kubeCli kubernetes.Interface, namespace string, name string, replicas int32, waitForReady bool) error {
d, err := kubeCli.AppsV1().Deployments(namespace).Get(ctx, name, metav1.GetOptions{})
if err != nil {
return errors.Wrapf(err, "Could not get Deployment{Namespace %s, Name: %s}", namespace, name)
Expand All @@ -380,10 +383,13 @@ func ScaleDeployment(ctx context.Context, kubeCli kubernetes.Interface, namespac
if err != nil {
return errors.Wrapf(err, "Could not update Deployment{Namespace %s, Name: %s}", namespace, name)
}
if !waitForReady {
return nil
}
return WaitOnDeploymentReady(ctx, kubeCli, namespace, name)
}

func ScaleDeploymentConfig(ctx context.Context, kubeCli kubernetes.Interface, osCli osversioned.Interface, namespace string, name string, replicas int32) error {
func ScaleDeploymentConfig(ctx context.Context, kubeCli kubernetes.Interface, osCli osversioned.Interface, namespace string, name string, replicas int32, waitForReady bool) error {
dc, err := osCli.AppsV1().DeploymentConfigs(namespace).Get(ctx, name, metav1.GetOptions{})
if err != nil {
return errors.Wrapf(err, "Could not get DeploymentConfig{Namespace %s, Name: %s}", namespace, name)
Expand All @@ -393,6 +399,9 @@ func ScaleDeploymentConfig(ctx context.Context, kubeCli kubernetes.Interface, os
if err != nil {
return errors.Wrapf(err, "Could not update DeploymentConfig{Namespace %s, Name: %s}", namespace, name)
}
if !waitForReady {
return nil
}
return WaitOnDeploymentConfigReady(ctx, osCli, kubeCli, namespace, name)
}

Expand Down
4 changes: 2 additions & 2 deletions pkg/kube/workload_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,9 @@ func (s *WorkloadSuite) TestScaleDeploymentConfig(c *C) {
dc, err = osCli.AppsV1().DeploymentConfigs(ns.GetName()).Create(ctx, dc, metav1.CreateOptions{})
c.Assert(err, IsNil)

err = ScaleDeploymentConfig(ctx, cli, osCli, dc.GetNamespace(), dc.GetName(), 0)
err = ScaleDeploymentConfig(ctx, cli, osCli, dc.GetNamespace(), dc.GetName(), 0, true)
c.Assert(err, IsNil)
err = ScaleDeploymentConfig(ctx, cli, osCli, dc.GetNamespace(), dc.GetName(), 1)
err = ScaleDeploymentConfig(ctx, cli, osCli, dc.GetNamespace(), dc.GetName(), 1, true)
c.Assert(err, IsNil)
}

Expand Down

0 comments on commit 843724b

Please sign in to comment.