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