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 }