dubboctl/cmd/root.go (113 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cmd
import (
"flag"
"github.com/apache/dubbo-kubernetes/dubboctl/pkg/cli"
"github.com/apache/dubbo-kubernetes/dubboctl/pkg/hub/builder/pack"
"github.com/apache/dubbo-kubernetes/dubboctl/pkg/hub/credentials"
"github.com/apache/dubbo-kubernetes/dubboctl/pkg/hub/credentials/prompt"
"github.com/apache/dubbo-kubernetes/dubboctl/pkg/hub/deployer"
"github.com/apache/dubbo-kubernetes/dubboctl/pkg/hub/pusher"
"github.com/apache/dubbo-kubernetes/dubboctl/pkg/sdk"
"github.com/apache/dubbo-kubernetes/dubboctl/pkg/util"
"github.com/apache/dubbo-kubernetes/dubboctl/pkg/validate"
"github.com/apache/dubbo-kubernetes/dubboctl/pkg/version"
"github.com/apache/dubbo-kubernetes/operator/cmd/cluster"
"github.com/spf13/cobra"
"net/http"
"os"
// "os"
)
const ChartFlag = "charts"
type staticClient struct {
clientFactory ClientFactory
}
type ClientFactory func(...sdk.Option) (*sdk.Client, func())
func NewClientFactory(options ...sdk.Option) (*sdk.Client, func()) {
var (
t = newTransport(false)
c = newCredentialsProvider(util.Dir(), t)
d = newDeployer()
o = []sdk.Option{
sdk.WithRepositoriesPath(util.RepositoriesPath()),
sdk.WithBuilder(pack.NewBuilder()),
sdk.WithPusher(pusher.NewPusher(
pusher.WithCredentialsProvider(c),
pusher.WithTransport(t))),
sdk.WithDeployer(d),
}
)
client := sdk.New(append(o, options...)...)
cleanup := func() {}
return client, cleanup
}
func newTransport(insecureSkipVerify bool) pusher.RoundTripCloser {
return pusher.NewRoundTripper(pusher.WithInsecureSkipVerify(insecureSkipVerify))
}
func newCredentialsProvider(configPath string, t http.RoundTripper) pusher.CredentialsProvider {
options := []credentials.Opt{
credentials.WithPromptForCredentials(prompt.NewPromptForCredentials(os.Stdin, os.Stdout, os.Stderr)),
credentials.WithPromptForCredentialStore(prompt.NewPromptForCredentialStore()),
credentials.WithTransport(t),
}
return credentials.NewCredentialsProvider(configPath, options...)
}
func newDeployer() sdk.Deployer {
var options []deployer.DeployerOption
return deployer.NewDeployer(options...)
}
func AddFlags(cmd *cobra.Command) {
cmd.PersistentFlags().AddGoFlagSet(flag.CommandLine)
}
func GetRootCmd(args []string) *cobra.Command {
rootCmd := &cobra.Command{
Use: "dubboctl",
Short: "Dubbo command line utilities",
Long: `Dubbo configuration command line utility for debug and use dubbo applications.`,
SilenceUsage: true,
SilenceErrors: false,
}
AddFlags(rootCmd)
rootCmd.SetArgs(args)
flags := rootCmd.PersistentFlags()
rootOptions := cli.AddRootFlags(flags)
ctx := cli.NewCLIContext(rootOptions)
dcfg := staticClient{}
factory := dcfg.clientFactory
if factory == nil {
factory = NewClientFactory
}
installCmd := cluster.InstallCmd(ctx)
rootCmd.AddCommand(installCmd)
hideFlags(installCmd, ChartFlag)
uninstallCmd := cluster.UninstallCmd(ctx)
rootCmd.AddCommand(uninstallCmd)
upgradeCmd := cluster.UpgradeCmd(ctx)
rootCmd.AddCommand(upgradeCmd)
manifestCmd := cluster.ManifestCmd(ctx)
rootCmd.AddCommand(manifestCmd)
hideFlags(manifestCmd, ChartFlag)
validateCmd := validate.NewValidateCommand(ctx)
rootCmd.AddCommand(validateCmd)
hideFlags(validateCmd, ChartFlag)
versionCmd := version.NewVersionCommand(ctx)
rootCmd.AddCommand(versionCmd)
hideFlags(versionCmd, ChartFlag)
createCmd := CreateCmd(ctx, rootCmd, factory)
rootCmd.AddCommand(createCmd)
hideFlags(createCmd, ChartFlag)
repoCmd := RepoCmd(ctx, rootCmd, factory)
rootCmd.AddCommand(repoCmd)
hideFlags(repoCmd, ChartFlag)
imageCmd := ImageCmd(ctx, rootCmd, factory)
rootCmd.AddCommand(imageCmd)
hideFlags(imageCmd, ChartFlag)
return rootCmd
}
func hideFlags(origin *cobra.Command, hide ...string) {
origin.SetHelpFunc(func(command *cobra.Command, args []string) {
for _, hf := range hide {
_ = command.Flags().MarkHidden(hf)
}
origin.SetHelpFunc(nil)
origin.HelpFunc()(command, args)
})
}