From 141c6cc50d9ed26c3f670de968986571fba6ade5 Mon Sep 17 00:00:00 2001 From: "myoung-su,shin" Date: Fri, 20 Jan 2023 16:46:17 +0900 Subject: [PATCH] Feat: restart -node-selector (#5) * feat: node selector * feat(restart): support `-node-selector=empty` for empty node selecting --- pkg/cmd/restart.go | 43 +++++++++++++++++++++++++++++++++++-- pkg/cmd/version.go | 2 +- pkg/resource/argorollout.go | 4 ++++ pkg/resource/deploy.go | 4 ++++ pkg/resource/rollout.go | 1 + pkg/resource/statefulset.go | 4 ++++ 6 files changed, 55 insertions(+), 3 deletions(-) diff --git a/pkg/cmd/restart.go b/pkg/cmd/restart.go index 32b9e89..a085b0b 100644 --- a/pkg/cmd/restart.go +++ b/pkg/cmd/restart.go @@ -4,6 +4,7 @@ import ( "context" "flag" "fmt" + "log" "github.com/anarcher/kroller/pkg/resource" "github.com/anarcher/kroller/pkg/target" @@ -11,11 +12,14 @@ import ( "github.com/fatih/color" "github.com/peterbourgon/ff/v3" "github.com/peterbourgon/ff/v3/ffcli" + + "k8s.io/apimachinery/pkg/labels" ) type RestartConfig struct { - rootCfg *RootConfig - targets stringSlice + rootCfg *RootConfig + targets stringSlice + nodeSelector string } func NewRestartCmd(rootCfg *RootConfig) *ffcli.Command { @@ -26,6 +30,7 @@ func NewRestartCmd(rootCfg *RootConfig) *ffcli.Command { fs := flag.NewFlagSet("kroller restart", flag.ExitOnError) fs.String("config", "", "config file (optional)") fs.Var(&cfg.targets, "target", "only use the specified objects (Format: //)") + fs.StringVar(&cfg.nodeSelector, "node-selector", "", "node label selector used to filter nodes. if value is `empty`, all resources which has no node selector are selected. (Format: empty,group=nodegroup), ") rootCfg.RegisterFlags(fs) c := &ffcli.Command{ @@ -52,7 +57,12 @@ func (c *RestartConfig) Exec(ctx context.Context, args []string) error { return err } + if c.nodeSelector != "" { + rl = c.matchNodeSelector(rl) + } + if len(c.targets) > 0 { + exprs, err := target.StrExps(c.targets...) if err != nil { return err @@ -83,3 +93,32 @@ func (c *RestartConfig) Exec(ctx context.Context, args []string) error { return nil } + +func (c *RestartConfig) matchNodeSelector(rl resource.RolloutList) resource.RolloutList { + out := make(resource.RolloutList, 0, len(rl)) + + if c.nodeSelector == "nil" || c.nodeSelector == "empty" { + for _, r := range rl { + if len(r.NodeSelector()) <= 0 { + out = append(out, r) + } + } + return out + } + + var nodeSelector labels.Selector + if ns, err := labels.Parse(c.nodeSelector); err != nil { + log.Fatalf("parsing node selector: %s", err) + } else { + nodeSelector = ns + } + + for _, r := range rl { + set := labels.Set(r.NodeSelector()) + if nodeSelector.Matches(set) { + out = append(out, r) + } + } + + return out +} diff --git a/pkg/cmd/version.go b/pkg/cmd/version.go index a1c5ef3..1090d7a 100644 --- a/pkg/cmd/version.go +++ b/pkg/cmd/version.go @@ -7,7 +7,7 @@ import ( "github.com/peterbourgon/ff/v3/ffcli" ) -const Version = "v0.1.1" +const Version = "v0.2.0" func NewVersionCmd() *ffcli.Command { c := &ffcli.Command{ diff --git a/pkg/resource/argorollout.go b/pkg/resource/argorollout.go index 6a5dfbc..1658ba1 100644 --- a/pkg/resource/argorollout.go +++ b/pkg/resource/argorollout.go @@ -35,6 +35,10 @@ func (r *ArgoRollout) Namespace() string { return r.rollout.Namespace } +func (r *ArgoRollout) NodeSelector() map[string]string { + return r.rollout.Spec.Template.Spec.NodeSelector +} + func (r *ArgoRollout) Restart(ctx context.Context) error { patch := map[string]interface{}{ "spec": map[string]interface{}{ diff --git a/pkg/resource/deploy.go b/pkg/resource/deploy.go index 3492567..7939822 100644 --- a/pkg/resource/deploy.go +++ b/pkg/resource/deploy.go @@ -35,6 +35,10 @@ func (d *Deployment) Namespace() string { return d.deploy.Namespace } +func (d *Deployment) NodeSelector() map[string]string { + return d.deploy.Spec.Template.Spec.NodeSelector +} + func (d *Deployment) Restart(ctx context.Context) error { patch := map[string]interface{}{ "spec": map[string]interface{}{ diff --git a/pkg/resource/rollout.go b/pkg/resource/rollout.go index 5dbee34..49aaced 100644 --- a/pkg/resource/rollout.go +++ b/pkg/resource/rollout.go @@ -10,6 +10,7 @@ type Rollout interface { Kind() string Name() string Namespace() string + NodeSelector() map[string]string Restart(context.Context) error } diff --git a/pkg/resource/statefulset.go b/pkg/resource/statefulset.go index 27e5ea1..5f8bc31 100644 --- a/pkg/resource/statefulset.go +++ b/pkg/resource/statefulset.go @@ -35,6 +35,10 @@ func (s *StatefulSet) Namespace() string { return s.sts.Namespace } +func (s *StatefulSet) NodeSelector() map[string]string { + return s.sts.Spec.Template.Spec.NodeSelector +} + func (s *StatefulSet) Restart(ctx context.Context) error { patch := map[string]interface{}{ "spec": map[string]interface{}{