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  }