github.com/oam-dev/kubevela@v1.9.11/references/cli/cli.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 "flag" 21 "fmt" 22 "os" 23 "runtime" 24 25 gov "github.com/hashicorp/go-version" 26 "github.com/pkg/errors" 27 "github.com/spf13/cobra" 28 "github.com/spf13/pflag" 29 "k8s.io/klog/v2" 30 "sigs.k8s.io/controller-runtime/pkg/client/config" 31 32 workflowv1alpha1 "github.com/kubevela/workflow/api/v1alpha1" 33 34 "github.com/oam-dev/kubevela/apis/types" 35 velacmd "github.com/oam-dev/kubevela/pkg/cmd" 36 "github.com/oam-dev/kubevela/pkg/utils/common" 37 "github.com/oam-dev/kubevela/pkg/utils/helm" 38 "github.com/oam-dev/kubevela/pkg/utils/system" 39 "github.com/oam-dev/kubevela/pkg/utils/util" 40 velalog "github.com/oam-dev/kubevela/references/cli/log" 41 "github.com/oam-dev/kubevela/version" 42 ) 43 44 var assumeYes bool 45 46 // NewCommand will contain all commands 47 func NewCommand() *cobra.Command { 48 return NewCommandWithIOStreams(util.NewDefaultIOStreams()) 49 } 50 51 // NewCommandWithIOStreams will contain all commands and initialize them with given ioStream 52 func NewCommandWithIOStreams(ioStream util.IOStreams) *cobra.Command { 53 cmds := &cobra.Command{ 54 Use: "vela", 55 DisableFlagParsing: true, 56 Run: func(cmd *cobra.Command, args []string) { 57 runHelp(cmd, cmd.Commands(), nil) 58 }, 59 SilenceUsage: true, 60 ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { 61 return nil, cobra.ShellCompDirectiveNoFileComp 62 }, 63 FParseErrWhitelist: cobra.FParseErrWhitelist{ 64 // Allow unknown flags for backward-compatibility. 65 UnknownFlags: true, 66 }, 67 } 68 69 scheme := common.Scheme 70 err := workflowv1alpha1.AddToScheme(scheme) 71 if err != nil { 72 klog.Fatal(err) 73 } 74 commandArgs := common.Args{ 75 Schema: scheme, 76 } 77 f := velacmd.NewDeferredFactory(config.GetConfig) 78 79 if err := system.InitDirs(); err != nil { 80 fmt.Println("InitDir err", err) 81 os.Exit(1) 82 } 83 84 cmds.AddCommand( 85 // Getting Start 86 NewInitCommand(commandArgs, "1", ioStream), 87 NewUpCommand(f, "2", commandArgs, ioStream), 88 NewAppStatusCommand(commandArgs, "3", ioStream), 89 NewListCommand(commandArgs, "4", ioStream), 90 NewDeleteCommand(f, "5"), 91 NewEnvCommand(commandArgs, "6", ioStream), 92 NewCapabilityShowCommand(commandArgs, "7", ioStream), 93 94 // Manage Apps 95 NewDryRunCommand(commandArgs, "1", ioStream), 96 NewLiveDiffCommand(commandArgs, "2", ioStream), 97 NewLogsCommand(commandArgs, "3", ioStream), 98 NewPortForwardCommand(commandArgs, "4", ioStream), 99 NewExecCommand(commandArgs, "5", ioStream), 100 RevisionCommandGroup(commandArgs, "6"), 101 NewDebugCommand(commandArgs, "7", ioStream), 102 103 // Continuous Delivery 104 NewWorkflowCommand(commandArgs, "1", ioStream), 105 NewAdoptCommand(f, "2", ioStream), 106 107 // Platform 108 NewTopCommand(commandArgs, "1", ioStream), 109 ClusterCommandGroup(f, "2", commandArgs, ioStream), 110 AuthCommandGroup(f, "3", ioStream), 111 // Config management 112 ConfigCommandGroup(f, "4", ioStream), 113 TemplateCommandGroup(f, "5", ioStream), 114 115 // Extension 116 // Addon 117 NewAddonCommand(commandArgs, "1", ioStream), 118 NewUISchemaCommand(commandArgs, "2", ioStream), 119 // Definitions 120 NewComponentsCommand(commandArgs, "3", ioStream), 121 NewTraitCommand(commandArgs, "4", ioStream), 122 DefinitionCommandGroup(commandArgs, "5", ioStream), 123 124 // System 125 NewInstallCommand(commandArgs, "1", ioStream), 126 NewUnInstallCommand(commandArgs, "2", ioStream), 127 NewSystemCommand(commandArgs, "3"), 128 NewVersionCommand(ioStream, "4"), 129 130 // aux 131 KubeCommandGroup(f, "1", ioStream), 132 CueXCommandGroup(f, "2"), 133 NewQlCommand(commandArgs, "3", ioStream), 134 NewCompletionCommand("4"), 135 NewHelpCommand("5"), 136 137 // hide (below commands will not be displayed in help command but still 138 // can be used by direct call) 139 NewWorkloadsCommand(commandArgs, ioStream), 140 NewExportCommand(commandArgs, ioStream), 141 NewRegistryCommand(ioStream, ""), 142 NewProviderCommand(commandArgs, "", ioStream), 143 ) 144 145 fset := flag.NewFlagSet("logs", flag.ContinueOnError) 146 klog.InitFlags(fset) 147 pfset := pflag.NewFlagSet("logs", pflag.ContinueOnError) 148 pfset.AddGoFlagSet(fset) 149 pflg := pfset.Lookup("v") 150 pflg.Name = "verbosity" 151 pflg.Shorthand = "V" 152 153 klog.SetLogger(velalog.NewLogger("vela-cli")) 154 // init global flags 155 cmds.PersistentFlags().BoolVarP(&assumeYes, "yes", "y", false, "Assume yes for all user prompts") 156 cmds.PersistentFlags().AddFlag(pflg) 157 return cmds 158 } 159 160 // NewVersionCommand print client version 161 func NewVersionCommand(ioStream util.IOStreams, order string) *cobra.Command { 162 version := &cobra.Command{ 163 Use: "version", 164 Short: "Prints vela build version information.", 165 Long: "Prints vela build version information.", 166 Run: func(cmd *cobra.Command, args []string) { 167 clusterVersion, _ := GetOAMReleaseVersion(types.DefaultKubeVelaNS) 168 fmt.Printf(`CLI Version: %v 169 Core Version: %s 170 GitRevision: %v 171 GolangVersion: %v 172 `, 173 version.VelaVersion, 174 clusterVersion, 175 version.GitRevision, 176 runtime.Version()) 177 }, 178 Annotations: map[string]string{ 179 types.TagCommandType: types.TypeSystem, 180 types.TagCommandOrder: order, 181 }, 182 } 183 version.AddCommand(NewVersionListCommand(ioStream)) 184 return version 185 } 186 187 // NewVersionListCommand show all versions command 188 func NewVersionListCommand(ioStream util.IOStreams) *cobra.Command { 189 var showAll bool 190 cmd := &cobra.Command{ 191 Use: "list", 192 Short: "List all available versions", 193 Long: "Query all available versions from remote server.", 194 Args: cobra.ExactArgs(0), 195 RunE: func(cmd *cobra.Command, args []string) error { 196 helmHelper := helm.NewHelper() 197 versions, err := helmHelper.ListVersions(LegacyKubeVelaInstallerHelmRepoURL, kubeVelaChartName, true, nil) 198 if err != nil { 199 return err 200 } 201 clusterVersion, err := GetOAMReleaseVersion(types.DefaultKubeVelaNS) 202 if err != nil { 203 clusterVersion = version.VelaVersion 204 } 205 currentV, err := gov.NewVersion(clusterVersion) 206 if err != nil && !showAll { 207 return fmt.Errorf("can not parse current version %s", clusterVersion) 208 } 209 for _, chartV := range versions { 210 if chartV != nil { 211 v, err := gov.NewVersion(chartV.Version) 212 if err != nil { 213 continue 214 } 215 if v.GreaterThan(currentV) { 216 ioStream.Info("Newer Version:", v.String()) 217 } else if showAll { 218 ioStream.Info("Older Version:", v.String()) 219 } 220 } 221 } 222 return nil 223 }, 224 Annotations: map[string]string{ 225 types.TagCommandType: types.TypeSystem, 226 }, 227 } 228 cmd.PersistentFlags().BoolVarP(&showAll, "all", "a", false, "List all available versions, if not, only list newer version") 229 return cmd 230 } 231 232 // GetOAMReleaseVersion gets version of vela-core runtime helm release 233 func GetOAMReleaseVersion(ns string) (string, error) { 234 results, err := helm.GetHelmRelease(ns) 235 if err != nil { 236 return "", err 237 } 238 239 for _, result := range results { 240 if result.Chart.ChartFullPath() == types.DefaultKubeVelaChartName { 241 return result.Chart.AppVersion(), nil 242 } 243 } 244 return "", errors.New("kubevela chart not found in your kubernetes cluster, refer to 'https://kubevela.io/docs/install' for installation") 245 }