From 618596b98e62ef025ebb45b9de0728c3b1c92cce Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 29 Jul 2022 19:18:32 +0800 Subject: [PATCH] [Backport release-1.5] Feat: support set labels for env (#4506) * Feat: support set labels for env Signed-off-by: codinghuang (cherry picked from commit 25558c1f187b368025b53956726412e48e3cd9ab) * Refactor: Remove util.ParseLabelString use k8s.io/apimachinery/pkg/labels Signed-off-by: codinghuang (cherry picked from commit abf756fb1432f7ca3b1fea305ecc856013a3e021) Co-authored-by: codinghuang --- apis/types/types.go | 1 + pkg/utils/env/env.go | 59 +++++++++++++++++++++++++++++++++++-------- references/cli/env.go | 11 ++++++-- 3 files changed, 58 insertions(+), 13 deletions(-) diff --git a/apis/types/types.go b/apis/types/types.go index 15329731a..4210ee489 100644 --- a/apis/types/types.go +++ b/apis/types/types.go @@ -106,6 +106,7 @@ type Config map[string]string type EnvMeta struct { Name string `json:"name"` Namespace string `json:"namespace"` + Labels string `json:"labels"` Current string `json:"current"` } diff --git a/pkg/utils/env/env.go b/pkg/utils/env/env.go index bd74f2eae..6a798a598 100644 --- a/pkg/utils/env/env.go +++ b/pkg/utils/env/env.go @@ -27,11 +27,13 @@ import ( "github.com/pkg/errors" v1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" "sigs.k8s.io/controller-runtime/pkg/client" "github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1" "github.com/oam-dev/kubevela/apis/types" "github.com/oam-dev/kubevela/pkg/oam" + "github.com/oam-dev/kubevela/pkg/oam/util" "github.com/oam-dev/kubevela/pkg/utils" "github.com/oam-dev/kubevela/pkg/utils/common" "github.com/oam-dev/kubevela/pkg/utils/system" @@ -98,22 +100,13 @@ func GetEnvByName(name string) (*types.EnvMeta, error) { if name == DefaultEnvNamespace { return &types.EnvMeta{Name: DefaultEnvNamespace, Namespace: DefaultEnvNamespace}, nil } - clt, err := common.GetClient() + namespace, err := getEnvNamespaceByName(name) if err != nil { return nil, err } - ctx := context.Background() - var nsList v1.NamespaceList - err = clt.List(ctx, &nsList, client.MatchingLabels{oam.LabelNamespaceOfEnvName: name}) - if err != nil { - return nil, err - } - if len(nsList.Items) < 1 { - return nil, errors.Errorf("Env %s not exist", name) - } return &types.EnvMeta{ Name: name, - Namespace: nsList.Items[0].Name, + Namespace: namespace.Name, }, nil } @@ -240,3 +233,47 @@ func SetCurrentEnv(meta *types.EnvMeta) error { } return nil } + +// getEnvNamespaceByName get v1.Namespace object by env name +func getEnvNamespaceByName(name string) (*v1.Namespace, error) { + clt, err := common.GetClient() + if err != nil { + return nil, err + } + ctx := context.Background() + var nsList v1.NamespaceList + err = clt.List(ctx, &nsList, client.MatchingLabels{oam.LabelNamespaceOfEnvName: name}) + if err != nil { + return nil, err + } + if len(nsList.Items) < 1 { + return nil, errors.Errorf("Env %s not exist", name) + } + + return &nsList.Items[0], nil +} + +// SetEnvLabels set labels for namespace +func SetEnvLabels(envArgs *types.EnvMeta) error { + c, err := common.GetClient() + if err != nil { + return err + } + + namespace, err := getEnvNamespaceByName(envArgs.Name) + if err != nil { + return err + } + labels, err := labels.ConvertSelectorToLabelsMap(envArgs.Labels) + if err != nil { + return err + } + + namespace.Labels = util.MergeMapOverrideWithDst(namespace.GetLabels(), labels) + + err = c.Update(context.Background(), namespace) + if err != nil { + return errors.Wrapf(err, "fail to set env labels") + } + return nil +} diff --git a/references/cli/env.go b/references/cli/env.go index e0c223c95..9ed014c21 100644 --- a/references/cli/env.go +++ b/references/cli/env.go @@ -131,6 +131,7 @@ func NewEnvDeleteCommand(c common.Args, ioStreams cmdutil.IOStreams) *cobra.Comm // NewEnvSetCommand creates `env set` command for setting current environment func NewEnvSetCommand(c common.Args, ioStreams cmdutil.IOStreams) *cobra.Command { + var envArgs types.EnvMeta cmd := &cobra.Command{ Use: "set", Aliases: []string{"sw"}, @@ -147,13 +148,14 @@ func NewEnvSetCommand(c common.Args, ioStreams cmdutil.IOStreams) *cobra.Command if err != nil { return err } - return SetEnv(args, ioStreams) + return SetEnv(&envArgs, args, ioStreams) }, Annotations: map[string]string{ types.TagCommandType: types.TypeStart, }, } cmd.SetOut(ioStreams.Out) + cmd.Flags().StringVar(&envArgs.Labels, "labels", "", "set labels for namespace") return cmd } @@ -205,7 +207,7 @@ func CreateEnv(envArgs *types.EnvMeta, args []string, ioStreams cmdutil.IOStream } // SetEnv sets current environment -func SetEnv(args []string, ioStreams cmdutil.IOStreams) error { +func SetEnv(envArgs *types.EnvMeta, args []string, ioStreams cmdutil.IOStreams) error { if len(args) < 1 { return fmt.Errorf("you must specify environment name for vela env command") } @@ -214,6 +216,11 @@ func SetEnv(args []string, ioStreams cmdutil.IOStreams) error { if err != nil { return err } + if envArgs.Labels != "" { + envArgs.Name = envMeta.Name + // just set labels, not change current env + return env.SetEnvLabels(envArgs) + } err = env.SetCurrentEnv(envMeta) if err != nil { return err