github.com/oam-dev/kubevela@v1.9.11/references/cli/env.go (about)

     1  /*
     2  Copyright 2021 The KubeVela Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package cli
    18  
    19  import (
    20  	"fmt"
    21  
    22  	"github.com/kubevela/pkg/util/singleton"
    23  	"github.com/spf13/cobra"
    24  
    25  	"github.com/oam-dev/kubevela/apis/types"
    26  	"github.com/oam-dev/kubevela/pkg/utils/common"
    27  	"github.com/oam-dev/kubevela/pkg/utils/env"
    28  	cmdutil "github.com/oam-dev/kubevela/pkg/utils/util"
    29  )
    30  
    31  // NewEnvCommand creates `env` command and its nested children
    32  func NewEnvCommand(c common.Args, order string, ioStream cmdutil.IOStreams) *cobra.Command {
    33  	cmd := &cobra.Command{
    34  		Use:                   "env",
    35  		DisableFlagsInUseLine: true,
    36  		Short:                 "Manage environments for vela applications to run.",
    37  		Long:                  "Manage environments for vela applications to run.",
    38  		Annotations: map[string]string{
    39  			types.TagCommandOrder: order,
    40  			types.TagCommandType:  types.TypeStart,
    41  		},
    42  	}
    43  	cmd.SetOut(ioStream.Out)
    44  	cmd.AddCommand(NewEnvListCommand(c, ioStream), NewEnvInitCommand(c, ioStream), NewEnvSetCommand(c, ioStream), NewEnvDeleteCommand(c, ioStream))
    45  	return cmd
    46  }
    47  
    48  // NewEnvListCommand creates `env list` command for listing all environments
    49  func NewEnvListCommand(c common.Args, ioStream cmdutil.IOStreams) *cobra.Command {
    50  	cmd := &cobra.Command{
    51  		Use:                   "ls",
    52  		Aliases:               []string{"list"},
    53  		DisableFlagsInUseLine: true,
    54  		Short:                 "List environments for vela applications to run.",
    55  		Long:                  "List all environments for vela applications to run.",
    56  		Example:               `vela env ls [env-name]`,
    57  		RunE: func(cmd *cobra.Command, args []string) error {
    58  			clt, err := c.GetClient()
    59  			if err != nil {
    60  				return err
    61  			}
    62  			singleton.KubeClient.Set(clt)
    63  			return ListEnvs(args, ioStream)
    64  		},
    65  		Annotations: map[string]string{
    66  			types.TagCommandType: types.TypeStart,
    67  		},
    68  	}
    69  	cmd.SetOut(ioStream.Out)
    70  	return cmd
    71  }
    72  
    73  // NewEnvInitCommand creates `env init` command for initializing environments
    74  func NewEnvInitCommand(c common.Args, ioStreams cmdutil.IOStreams) *cobra.Command {
    75  	var envArgs types.EnvMeta
    76  	cmd := &cobra.Command{
    77  		Use:                   "init <envName>",
    78  		DisableFlagsInUseLine: true,
    79  		Short:                 "Create environment for vela applications to run.",
    80  		Long:                  "Create environment for vela applications to run.",
    81  		Example:               `vela env init test --namespace test`,
    82  		RunE: func(cmd *cobra.Command, args []string) error {
    83  			clt, err := c.GetClient()
    84  			if err != nil {
    85  				return err
    86  			}
    87  			singleton.KubeClient.Set(clt)
    88  			return CreateEnv(&envArgs, args, ioStreams)
    89  		},
    90  		Annotations: map[string]string{
    91  			types.TagCommandType: types.TypeStart,
    92  		},
    93  	}
    94  	cmd.SetOut(ioStreams.Out)
    95  	cmd.Flags().StringVar(&envArgs.Namespace, "namespace", "", "specify K8s namespace for env")
    96  	return cmd
    97  }
    98  
    99  // NewEnvDeleteCommand creates `env delete` command for deleting environments
   100  func NewEnvDeleteCommand(c common.Args, ioStreams cmdutil.IOStreams) *cobra.Command {
   101  	cmd := &cobra.Command{
   102  		Use:                   "delete",
   103  		DisableFlagsInUseLine: true,
   104  		Short:                 "Delete an environment.",
   105  		Long:                  "Delete an environment.",
   106  		Example:               `vela env delete test`,
   107  		RunE: func(cmd *cobra.Command, args []string) error {
   108  			clt, err := c.GetClient()
   109  			if err != nil {
   110  				return err
   111  			}
   112  			singleton.KubeClient.Set(clt)
   113  			return DeleteEnv(args, ioStreams)
   114  		},
   115  		Annotations: map[string]string{
   116  			types.TagCommandType: types.TypeStart,
   117  		},
   118  	}
   119  	cmd.SetOut(ioStreams.Out)
   120  	return cmd
   121  }
   122  
   123  // NewEnvSetCommand creates `env set` command for setting current environment
   124  func NewEnvSetCommand(c common.Args, ioStreams cmdutil.IOStreams) *cobra.Command {
   125  	var envArgs types.EnvMeta
   126  	cmd := &cobra.Command{
   127  		Use:                   "set",
   128  		Aliases:               []string{"sw"},
   129  		DisableFlagsInUseLine: true,
   130  		Short:                 "Set an environment.",
   131  		Long:                  "Set an environment as the default one for running vela applications.",
   132  		Example:               `vela env set test`,
   133  		RunE: func(cmd *cobra.Command, args []string) error {
   134  			clt, err := c.GetClient()
   135  			if err != nil {
   136  				return err
   137  			}
   138  			singleton.KubeClient.Set(clt)
   139  			return SetEnv(&envArgs, args, ioStreams)
   140  		},
   141  		Annotations: map[string]string{
   142  			types.TagCommandType: types.TypeStart,
   143  		},
   144  	}
   145  	cmd.SetOut(ioStreams.Out)
   146  	cmd.Flags().StringVar(&envArgs.Labels, "labels", "", "set labels for namespace")
   147  	return cmd
   148  }
   149  
   150  // ListEnvs shows info of all environments
   151  func ListEnvs(args []string, ioStreams cmdutil.IOStreams) error {
   152  	table := newUITable()
   153  	table.AddRow("NAME", "NAMESPACE", "CURRENT")
   154  	var envName = ""
   155  	if len(args) > 0 {
   156  		envName = args[0]
   157  	}
   158  	envList, err := env.ListEnvs(envName)
   159  	if err != nil {
   160  		return err
   161  	}
   162  	for _, envMeta := range envList {
   163  		table.AddRow(envMeta.Name, envMeta.Namespace, envMeta.Current)
   164  	}
   165  	ioStreams.Info(table.String())
   166  	return nil
   167  }
   168  
   169  // DeleteEnv deletes an environment
   170  func DeleteEnv(args []string, ioStreams cmdutil.IOStreams) error {
   171  	if len(args) < 1 {
   172  		return fmt.Errorf("you must specify environment name for 'vela env delete' command")
   173  	}
   174  	for _, envName := range args {
   175  		msg, err := env.DeleteEnv(envName)
   176  		if err != nil {
   177  			return err
   178  		}
   179  		ioStreams.Info(msg)
   180  	}
   181  	return nil
   182  }
   183  
   184  // CreateEnv creates an environment
   185  func CreateEnv(envArgs *types.EnvMeta, args []string, ioStreams cmdutil.IOStreams) error {
   186  	if len(args) > 0 {
   187  		envArgs.Name = args[0]
   188  	}
   189  	err := env.CreateEnv(envArgs)
   190  	if err != nil {
   191  		return err
   192  	}
   193  	ioStreams.Infof("environment %s with namespace %s created\n", envArgs.Name, envArgs.Namespace)
   194  	return env.SetCurrentEnv(envArgs)
   195  }
   196  
   197  // SetEnv sets current environment
   198  func SetEnv(envArgs *types.EnvMeta, args []string, ioStreams cmdutil.IOStreams) error {
   199  	if len(args) < 1 {
   200  		return fmt.Errorf("you must specify environment name for vela env command")
   201  	}
   202  	envName := args[0]
   203  	envMeta, err := env.GetEnvByName(envName)
   204  	if err != nil {
   205  		return err
   206  	}
   207  	if envArgs.Labels != "" {
   208  		envArgs.Name = envMeta.Name
   209  		// just set labels, not change current env
   210  		return env.SetEnvLabels(envArgs)
   211  	}
   212  	err = env.SetCurrentEnv(envMeta)
   213  	if err != nil {
   214  		return err
   215  	}
   216  	ioStreams.Info(fmt.Sprintf("Current environment switched to %s (namespace = %s)", envName, envMeta.Namespace))
   217  	return nil
   218  }
   219  
   220  // GetFlagEnvOrCurrent gets environment by name or current environment
   221  // if no env exists, return default namespace as env
   222  func GetFlagEnvOrCurrent(cmd *cobra.Command, args common.Args) (*types.EnvMeta, error) {
   223  	clt, err := args.GetClient()
   224  	if err != nil {
   225  		return nil, err
   226  	}
   227  	singleton.KubeClient.Set(clt)
   228  	var envName string
   229  	if cmd != nil {
   230  		envName = cmd.Flag("env").Value.String()
   231  	}
   232  	if envName != "" {
   233  		return env.GetEnvByName(envName)
   234  	}
   235  	cur, err := env.GetCurrentEnv()
   236  	if err != nil {
   237  		// ignore this error and return a default value
   238  		// nolint:nilerr
   239  		ns := args.GetNamespaceFromConfig()
   240  		if ns == "" {
   241  			ns = types.DefaultAppNamespace
   242  		}
   243  		return &types.EnvMeta{Name: "", Namespace: ns}, nil
   244  	}
   245  	return cur, nil
   246  }