Files
talos/cmd/talosctl/cmd/root.go
Andrey Smirnov 96aa9638f7 chore: rename talos-systems/talos to siderolabs/talos
There's a cyclic dependency on siderolink library which imports talos
machinery back. We will fix that after we get talos pushed under a new
name.

Signed-off-by: Andrey Smirnov <andrey.smirnov@talos-systems.com>
2022-11-03 16:50:32 +04:00

72 lines
2.7 KiB
Go

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package cmd
import (
"fmt"
"os"
"path/filepath"
"strings"
"github.com/spf13/cobra"
"github.com/siderolabs/talos/cmd/talosctl/cmd/mgmt"
"github.com/siderolabs/talos/cmd/talosctl/cmd/talos"
"github.com/siderolabs/talos/pkg/cli"
"github.com/siderolabs/talos/pkg/machinery/constants"
)
// rootCmd represents the base command when called without any subcommands.
var rootCmd = &cobra.Command{
Use: "talosctl",
Short: "A CLI for out-of-band management of Kubernetes nodes created by Talos",
Long: ``,
SilenceErrors: true,
SilenceUsage: true,
DisableAutoGenTag: true,
}
// Execute adds all child commands to the root command and sets flags appropriately.
// This is called by main.main(). It only needs to happen once to the rootCmd.
func Execute() error {
rootCmd.PersistentFlags().StringVar(
&talos.GlobalArgs.Talosconfig,
"talosconfig",
"",
fmt.Sprintf("The path to the Talos configuration file. Defaults to '%s' env variable if set, otherwise '%s' and '%s' in order.",
constants.TalosConfigEnvVar,
filepath.Join("$HOME", constants.TalosDir, constants.TalosconfigFilename),
filepath.Join(constants.ServiceAccountMountPath, constants.TalosconfigFilename),
),
)
rootCmd.PersistentFlags().StringVar(&talos.GlobalArgs.CmdContext, "context", "", "Context to be used in command")
rootCmd.PersistentFlags().StringSliceVarP(&talos.GlobalArgs.Nodes, "nodes", "n", []string{}, "target the specified nodes")
rootCmd.PersistentFlags().StringSliceVarP(&talos.GlobalArgs.Endpoints, "endpoints", "e", []string{}, "override default endpoints in Talos configuration")
cli.Should(rootCmd.RegisterFlagCompletionFunc("context", talos.CompleteConfigContext))
cli.Should(rootCmd.RegisterFlagCompletionFunc("nodes", talos.CompleteNodes))
rootCmd.PersistentFlags().StringVar(&talos.GlobalArgs.Cluster, "cluster", "", "Cluster to connect to if a proxy endpoint is used.")
cmd, err := rootCmd.ExecuteC()
if err != nil {
fmt.Fprintln(os.Stderr, err.Error())
errorString := err.Error()
// TODO: this is a nightmare, but arg-flag related validation returns simple `fmt.Errorf`, no way to distinguish
// these errors
if strings.Contains(errorString, "arg(s)") || strings.Contains(errorString, "flag") || strings.Contains(errorString, "command") {
fmt.Fprintln(os.Stderr)
fmt.Fprintln(os.Stderr, cmd.UsageString())
}
}
return err
}
func init() {
for _, cmd := range append(talos.Commands, mgmt.Commands...) {
rootCmd.AddCommand(cmd)
}
}