Unverified Commit 51fb5b78 authored by Derek Nola's avatar Derek Nola Committed by GitHub

Migrate to UrfaveCLI v2 (#11831) (#12030)

* Bump rootlesskit tov 1.1.1, last of the v1 line * Migrate to urfavecli v2 * Disable StringSlice seperattion Signed-off-by: 's avatarDerek Nola <derek.nola@suse.com>
parent e050ca66
...@@ -9,12 +9,13 @@ import ( ...@@ -9,12 +9,13 @@ import (
"github.com/k3s-io/k3s/pkg/cli/cmds" "github.com/k3s-io/k3s/pkg/cli/cmds"
"github.com/k3s-io/k3s/pkg/configfilearg" "github.com/k3s-io/k3s/pkg/configfilearg"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
func main() { func main() {
app := cmds.NewApp() app := cmds.NewApp()
app.Commands = []cli.Command{ app.DisableSliceFlagSeparator = true
app.Commands = []*cli.Command{
cmds.NewAgentCommand(agent.Run), cmds.NewAgentCommand(agent.Run),
} }
......
...@@ -9,12 +9,12 @@ import ( ...@@ -9,12 +9,12 @@ import (
"github.com/k3s-io/k3s/pkg/cli/cmds" "github.com/k3s-io/k3s/pkg/cli/cmds"
"github.com/k3s-io/k3s/pkg/configfilearg" "github.com/k3s-io/k3s/pkg/configfilearg"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
func main() { func main() {
app := cmds.NewApp() app := cmds.NewApp()
app.Commands = []cli.Command{ app.Commands = []*cli.Command{
cmds.NewCertCommands( cmds.NewCertCommands(
cert.Check, cert.Check,
cert.Rotate, cert.Rotate,
......
...@@ -8,12 +8,12 @@ import ( ...@@ -8,12 +8,12 @@ import (
"github.com/k3s-io/k3s/pkg/cli/cmds" "github.com/k3s-io/k3s/pkg/cli/cmds"
"github.com/k3s-io/k3s/pkg/cli/completion" "github.com/k3s-io/k3s/pkg/cli/completion"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
func main() { func main() {
app := cmds.NewApp() app := cmds.NewApp()
app.Commands = []cli.Command{ app.Commands = []*cli.Command{
cmds.NewCompletionCommand(completion.Run), cmds.NewCompletionCommand(completion.Run),
} }
......
...@@ -9,12 +9,12 @@ import ( ...@@ -9,12 +9,12 @@ import (
"github.com/k3s-io/k3s/pkg/cli/secretsencrypt" "github.com/k3s-io/k3s/pkg/cli/secretsencrypt"
"github.com/k3s-io/k3s/pkg/configfilearg" "github.com/k3s-io/k3s/pkg/configfilearg"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
func main() { func main() {
app := cmds.NewApp() app := cmds.NewApp()
app.Commands = []cli.Command{ app.Commands = []*cli.Command{
cmds.NewSecretsEncryptCommands( cmds.NewSecretsEncryptCommands(
secretsencrypt.Status, secretsencrypt.Status,
secretsencrypt.Enable, secretsencrypt.Enable,
......
...@@ -9,12 +9,12 @@ import ( ...@@ -9,12 +9,12 @@ import (
"github.com/k3s-io/k3s/pkg/cli/etcdsnapshot" "github.com/k3s-io/k3s/pkg/cli/etcdsnapshot"
"github.com/k3s-io/k3s/pkg/configfilearg" "github.com/k3s-io/k3s/pkg/configfilearg"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
func main() { func main() {
app := cmds.NewApp() app := cmds.NewApp()
app.Commands = []cli.Command{ app.Commands = []*cli.Command{
cmds.NewEtcdSnapshotCommands( cmds.NewEtcdSnapshotCommands(
etcdsnapshot.Delete, etcdsnapshot.Delete,
etcdsnapshot.List, etcdsnapshot.List,
......
...@@ -25,7 +25,7 @@ import ( ...@@ -25,7 +25,7 @@ import (
"github.com/rancher/wrangler/v3/pkg/resolvehome" "github.com/rancher/wrangler/v3/pkg/resolvehome"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/spf13/pflag" "github.com/spf13/pflag"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
var criDefaultConfigPath = "/etc/crictl.yaml" var criDefaultConfigPath = "/etc/crictl.yaml"
...@@ -52,7 +52,8 @@ func main() { ...@@ -52,7 +52,8 @@ func main() {
// Handle subcommand invocation (k3s server, k3s crictl, etc) // Handle subcommand invocation (k3s server, k3s crictl, etc)
app := cmds.NewApp() app := cmds.NewApp()
app.EnableBashCompletion = true app.EnableBashCompletion = true
app.Commands = []cli.Command{ app.DisableSliceFlagSeparator = true
app.Commands = []*cli.Command{
cmds.NewServerCommand(internalCLIAction(version.Program+"-server"+programPostfix, dataDir, os.Args)), cmds.NewServerCommand(internalCLIAction(version.Program+"-server"+programPostfix, dataDir, os.Args)),
cmds.NewAgentCommand(internalCLIAction(version.Program+"-agent"+programPostfix, dataDir, os.Args)), cmds.NewAgentCommand(internalCLIAction(version.Program+"-agent"+programPostfix, dataDir, os.Args)),
cmds.NewKubectlCommand(externalCLIAction("kubectl", dataDir)), cmds.NewKubectlCommand(externalCLIAction("kubectl", dataDir)),
...@@ -173,7 +174,7 @@ func runCLIs(dataDir string) bool { ...@@ -173,7 +174,7 @@ func runCLIs(dataDir string) bool {
// externalCLIAction returns a function that will call an external binary, be used as the Action of a cli.Command. // externalCLIAction returns a function that will call an external binary, be used as the Action of a cli.Command.
func externalCLIAction(cmd, dataDir string) func(cli *cli.Context) error { func externalCLIAction(cmd, dataDir string) func(cli *cli.Context) error {
return func(cli *cli.Context) error { return func(cli *cli.Context) error {
return externalCLI(cmd, dataDir, cli.Args()) return externalCLI(cmd, dataDir, cli.Args().Slice())
} }
} }
......
...@@ -23,7 +23,7 @@ import ( ...@@ -23,7 +23,7 @@ import (
ctr2 "github.com/k3s-io/k3s/pkg/ctr" ctr2 "github.com/k3s-io/k3s/pkg/ctr"
kubectl2 "github.com/k3s-io/k3s/pkg/kubectl" kubectl2 "github.com/k3s-io/k3s/pkg/kubectl"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
crictl2 "sigs.k8s.io/cri-tools/cmd/crictl" crictl2 "sigs.k8s.io/cri-tools/cmd/crictl"
) )
...@@ -43,7 +43,8 @@ func main() { ...@@ -43,7 +43,8 @@ func main() {
os.Args[0] = cmd os.Args[0] = cmd
app := cmds.NewApp() app := cmds.NewApp()
app.Commands = []cli.Command{ app.DisableSliceFlagSeparator = true
app.Commands = []*cli.Command{
cmds.NewServerCommand(server.Run), cmds.NewServerCommand(server.Run),
cmds.NewAgentCommand(agent.Run), cmds.NewAgentCommand(agent.Run),
cmds.NewKubectlCommand(kubectl.Run), cmds.NewKubectlCommand(kubectl.Run),
......
...@@ -9,12 +9,12 @@ import ( ...@@ -9,12 +9,12 @@ import (
"github.com/k3s-io/k3s/pkg/cli/token" "github.com/k3s-io/k3s/pkg/cli/token"
"github.com/k3s-io/k3s/pkg/configfilearg" "github.com/k3s-io/k3s/pkg/configfilearg"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
func main() { func main() {
app := cmds.NewApp() app := cmds.NewApp()
app.Commands = []cli.Command{ app.Commands = []*cli.Command{
cmds.NewTokenCommands( cmds.NewTokenCommands(
token.Create, token.Create,
token.Delete, token.Delete,
......
...@@ -137,13 +137,12 @@ require ( ...@@ -137,13 +137,12 @@ require (
github.com/rancher/wharfie v0.6.7 github.com/rancher/wharfie v0.6.7
github.com/rancher/wrangler/v3 v3.1.0 github.com/rancher/wrangler/v3 v3.1.0
github.com/robfig/cron/v3 v3.0.1 github.com/robfig/cron/v3 v3.0.1
github.com/rootless-containers/rootlesskit v1.0.1 github.com/rootless-containers/rootlesskit v1.1.1
github.com/sirupsen/logrus v1.9.3 github.com/sirupsen/logrus v1.9.3
github.com/spegel-org/spegel v1.0.18 github.com/spegel-org/spegel v1.0.18
github.com/spf13/pflag v1.0.5 github.com/spf13/pflag v1.0.5
github.com/stretchr/testify v1.10.0 github.com/stretchr/testify v1.10.0
github.com/urfave/cli v1.22.15 github.com/urfave/cli/v2 v2.27.6
github.com/urfave/cli/v2 v2.27.5
github.com/vishvananda/netlink v1.3.0 github.com/vishvananda/netlink v1.3.0
github.com/yl2chen/cidranger v1.0.2 github.com/yl2chen/cidranger v1.0.2
go.etcd.io/etcd/api/v3 v3.5.19 go.etcd.io/etcd/api/v3 v3.5.19
...@@ -444,6 +443,7 @@ require ( ...@@ -444,6 +443,7 @@ require (
github.com/tchap/go-patricia/v2 v2.3.1 // indirect github.com/tchap/go-patricia/v2 v2.3.1 // indirect
github.com/tidwall/btree v1.6.0 // indirect github.com/tidwall/btree v1.6.0 // indirect
github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 // indirect github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 // indirect
github.com/urfave/cli v1.22.15 // indirect
github.com/vbatts/tar-split v0.11.6 // indirect github.com/vbatts/tar-split v0.11.6 // indirect
github.com/vishvananda/netns v0.0.4 // indirect github.com/vishvananda/netns v0.0.4 // indirect
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect
......
...@@ -1259,8 +1259,8 @@ github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/f ...@@ -1259,8 +1259,8 @@ github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/f
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
github.com/rootless-containers/rootlesskit v1.0.1 h1:jepqW1txFSowKSMAEkVhWH3Oa1TCY9S400MVYe/6Iro= github.com/rootless-containers/rootlesskit v1.1.1 h1:F5psKWoWY9/VjZ3ifVcaosjvFZJOagX85U22M0/EQZE=
github.com/rootless-containers/rootlesskit v1.0.1/go.mod h1:t2UAiYagxrJ+wmpFAUIZPcqsm4k2B7ve6g7lILKbloc= github.com/rootless-containers/rootlesskit v1.1.1/go.mod h1:UD5GoA3dqKCJrnvnhVgQQnweMF2qZnf9KLw8EewcMZI=
github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=
github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
...@@ -1367,8 +1367,8 @@ github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX ...@@ -1367,8 +1367,8 @@ github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX
github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/urfave/cli v1.22.15 h1:nuqt+pdC/KqswQKhETJjo7pvn/k4xMUxgW6liI7XpnM= github.com/urfave/cli v1.22.15 h1:nuqt+pdC/KqswQKhETJjo7pvn/k4xMUxgW6liI7XpnM=
github.com/urfave/cli v1.22.15/go.mod h1:wSan1hmo5zeyLGBjRJbzRTNk8gwoYa2B9n4q9dmRIc0= github.com/urfave/cli v1.22.15/go.mod h1:wSan1hmo5zeyLGBjRJbzRTNk8gwoYa2B9n4q9dmRIc0=
github.com/urfave/cli/v2 v2.27.5 h1:WoHEJLdsXr6dDWoJgMq/CboDmyY/8HMMH1fTECbih+w= github.com/urfave/cli/v2 v2.27.6 h1:VdRdS98FNhKZ8/Az8B7MTyGQmpIr36O1EHybx/LaZ4g=
github.com/urfave/cli/v2 v2.27.5/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ= github.com/urfave/cli/v2 v2.27.6/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ=
github.com/vbatts/tar-split v0.11.6 h1:4SjTW5+PU11n6fZenf2IPoV8/tz3AaYHMWjf23envGs= github.com/vbatts/tar-split v0.11.6 h1:4SjTW5+PU11n6fZenf2IPoV8/tz3AaYHMWjf23envGs=
github.com/vbatts/tar-split v0.11.6/go.mod h1:dqKNtesIOr2j2Qv3W/cHjnvk9I8+G7oAkFDFN6TCBEI= github.com/vbatts/tar-split v0.11.6/go.mod h1:dqKNtesIOr2j2Qv3W/cHjnvk9I8+G7oAkFDFN6TCBEI=
github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU=
......
...@@ -20,12 +20,13 @@ import ( ...@@ -20,12 +20,13 @@ import (
"github.com/k3s-io/k3s/pkg/cli/server" "github.com/k3s-io/k3s/pkg/cli/server"
"github.com/k3s-io/k3s/pkg/configfilearg" "github.com/k3s-io/k3s/pkg/configfilearg"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
func main() { func main() {
app := cmds.NewApp() app := cmds.NewApp()
app.Commands = []cli.Command{ app.DisableSliceFlagSeparator = true
app.Commands = []*cli.Command{
cmds.NewServerCommand(server.Run), cmds.NewServerCommand(server.Run),
cmds.NewAgentCommand(agent.Run), cmds.NewAgentCommand(agent.Run),
cmds.NewKubectlCommand(kubectl.Run), cmds.NewKubectlCommand(kubectl.Run),
......
...@@ -442,7 +442,7 @@ func get(ctx context.Context, envInfo *cmds.Agent, proxy proxy.Proxy) (*config.N ...@@ -442,7 +442,7 @@ func get(ctx context.Context, envInfo *cmds.Agent, proxy proxy.Proxy) (*config.N
} }
// If the supervisor and externally-facing apiserver are not on the same port, tell the proxy where to find the apiserver. // If the supervisor and externally-facing apiserver are not on the same port, tell the proxy where to find the apiserver.
if controlConfig.SupervisorPort != controlConfig.HTTPSPort { if controlConfig.SupervisorPort != controlConfig.HTTPSPort {
isIPv6 := utilsnet.IsIPv6(net.ParseIP(util.GetFirstValidIPString(envInfo.NodeIP))) isIPv6 := utilsnet.IsIPv6(net.ParseIP(util.GetFirstValidIPString(envInfo.NodeIP.Value())))
if err := proxy.SetAPIServerPort(controlConfig.HTTPSPort, isIPv6); err != nil { if err := proxy.SetAPIServerPort(controlConfig.HTTPSPort, isIPv6); err != nil {
return nil, pkgerrors.WithMessagef(err, "failed to set apiserver port to %d", controlConfig.HTTPSPort) return nil, pkgerrors.WithMessagef(err, "failed to set apiserver port to %d", controlConfig.HTTPSPort)
} }
...@@ -483,7 +483,7 @@ func get(ctx context.Context, envInfo *cmds.Agent, proxy proxy.Proxy) (*config.N ...@@ -483,7 +483,7 @@ func get(ctx context.Context, envInfo *cmds.Agent, proxy proxy.Proxy) (*config.N
newNodePasswordFile := filepath.Join(nodeConfigPath, "password") newNodePasswordFile := filepath.Join(nodeConfigPath, "password")
upgradeOldNodePasswordPath(oldNodePasswordFile, newNodePasswordFile) upgradeOldNodePasswordPath(oldNodePasswordFile, newNodePasswordFile)
nodeName, nodeIPs, err := util.GetHostnameAndIPs(envInfo.NodeName, envInfo.NodeIP) nodeName, nodeIPs, err := util.GetHostnameAndIPs(envInfo.NodeName, envInfo.NodeIP.Value())
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -515,10 +515,10 @@ func get(ctx context.Context, envInfo *cmds.Agent, proxy proxy.Proxy) (*config.N ...@@ -515,10 +515,10 @@ func get(ctx context.Context, envInfo *cmds.Agent, proxy proxy.Proxy) (*config.N
// Overwrite nodeip and flannel interface and throw a warning if user explicitly set those parameters // Overwrite nodeip and flannel interface and throw a warning if user explicitly set those parameters
if len(vpnIPs) != 0 { if len(vpnIPs) != 0 {
logrus.Infof("Node-ip changed to %v due to VPN", vpnIPs) logrus.Infof("Node-ip changed to %v due to VPN", vpnIPs)
if len(envInfo.NodeIP) != 0 { if len(envInfo.NodeIP.Value()) != 0 {
logrus.Warn("VPN provider overrides configured node-ip parameter") logrus.Warn("VPN provider overrides configured node-ip parameter")
} }
if len(envInfo.NodeExternalIP) != 0 { if len(envInfo.NodeExternalIP.Value()) != 0 {
logrus.Warn("VPN provider overrides node-external-ip parameter") logrus.Warn("VPN provider overrides node-external-ip parameter")
} }
nodeIPs = vpnIPs nodeIPs = vpnIPs
...@@ -537,7 +537,7 @@ func get(ctx context.Context, envInfo *cmds.Agent, proxy proxy.Proxy) (*config.N ...@@ -537,7 +537,7 @@ func get(ctx context.Context, envInfo *cmds.Agent, proxy proxy.Proxy) (*config.N
} }
} }
nodeExternalIPs, err := util.ParseStringSliceToIPs(envInfo.NodeExternalIP) nodeExternalIPs, err := util.ParseStringSliceToIPs(envInfo.NodeExternalIP.Value())
if err != nil { if err != nil {
return nil, fmt.Errorf("invalid node-external-ip: %w", err) return nil, fmt.Errorf("invalid node-external-ip: %w", err)
} }
...@@ -755,7 +755,7 @@ func get(ctx context.Context, envInfo *cmds.Agent, proxy proxy.Proxy) (*config.N ...@@ -755,7 +755,7 @@ func get(ctx context.Context, envInfo *cmds.Agent, proxy proxy.Proxy) (*config.N
} }
nodeConfig.AgentConfig.PauseImage = envInfo.PauseImage nodeConfig.AgentConfig.PauseImage = envInfo.PauseImage
nodeConfig.AgentConfig.AirgapExtraRegistry = envInfo.AirgapExtraRegistry nodeConfig.AgentConfig.AirgapExtraRegistry = envInfo.AirgapExtraRegistry.Value()
nodeConfig.AgentConfig.SystemDefaultRegistry = controlConfig.SystemDefaultRegistry nodeConfig.AgentConfig.SystemDefaultRegistry = controlConfig.SystemDefaultRegistry
// Apply SystemDefaultRegistry to PauseImage and AirgapExtraRegistry // Apply SystemDefaultRegistry to PauseImage and AirgapExtraRegistry
...@@ -768,10 +768,10 @@ func get(ctx context.Context, envInfo *cmds.Agent, proxy proxy.Proxy) (*config.N ...@@ -768,10 +768,10 @@ func get(ctx context.Context, envInfo *cmds.Agent, proxy proxy.Proxy) (*config.N
} }
} }
nodeConfig.AgentConfig.ExtraKubeletArgs = envInfo.ExtraKubeletArgs nodeConfig.AgentConfig.ExtraKubeletArgs = envInfo.ExtraKubeletArgs.Value()
nodeConfig.AgentConfig.ExtraKubeProxyArgs = envInfo.ExtraKubeProxyArgs nodeConfig.AgentConfig.ExtraKubeProxyArgs = envInfo.ExtraKubeProxyArgs.Value()
nodeConfig.AgentConfig.NodeTaints = envInfo.Taints nodeConfig.AgentConfig.NodeTaints = envInfo.Taints.Value()
nodeConfig.AgentConfig.NodeLabels = envInfo.Labels nodeConfig.AgentConfig.NodeLabels = envInfo.Labels.Value()
nodeConfig.AgentConfig.ImageCredProvBinDir = envInfo.ImageCredProvBinDir nodeConfig.AgentConfig.ImageCredProvBinDir = envInfo.ImageCredProvBinDir
nodeConfig.AgentConfig.ImageCredProvConfig = envInfo.ImageCredProvConfig nodeConfig.AgentConfig.ImageCredProvConfig = envInfo.ImageCredProvConfig
nodeConfig.AgentConfig.DisableCCM = controlConfig.DisableCCM nodeConfig.AgentConfig.DisableCCM = controlConfig.DisableCCM
......
...@@ -311,7 +311,7 @@ func Run(ctx context.Context, cfg cmds.Agent) error { ...@@ -311,7 +311,7 @@ func Run(ctx context.Context, cfg cmds.Agent) error {
} }
if cfg.Rootless && !cfg.RootlessAlreadyUnshared { if cfg.Rootless && !cfg.RootlessAlreadyUnshared {
dualNode, err := utilsnet.IsDualStackIPStrings(cfg.NodeIP) dualNode, err := utilsnet.IsDualStackIPStrings(cfg.NodeIP.Value())
if err != nil { if err != nil {
return err return err
} }
...@@ -336,7 +336,7 @@ func createProxyAndValidateToken(ctx context.Context, cfg *cmds.Agent) (proxy.Pr ...@@ -336,7 +336,7 @@ func createProxyAndValidateToken(ctx context.Context, cfg *cmds.Agent) (proxy.Pr
if err := os.MkdirAll(agentDir, 0700); err != nil { if err := os.MkdirAll(agentDir, 0700); err != nil {
return nil, err return nil, err
} }
isIPv6 := utilsnet.IsIPv6(net.ParseIP(util.GetFirstValidIPString(cfg.NodeIP))) isIPv6 := utilsnet.IsIPv6(net.ParseIP(util.GetFirstValidIPString(cfg.NodeIP.Value())))
proxy, err := proxy.NewSupervisorProxy(ctx, !cfg.DisableLoadBalancer, agentDir, cfg.ServerURL, cfg.LBServerPort, isIPv6) proxy, err := proxy.NewSupervisorProxy(ctx, !cfg.DisableLoadBalancer, agentDir, cfg.ServerURL, cfg.LBServerPort, isIPv6)
if err != nil { if err != nil {
......
...@@ -24,7 +24,7 @@ import ( ...@@ -24,7 +24,7 @@ import (
pkgerrors "github.com/pkg/errors" pkgerrors "github.com/pkg/errors"
"github.com/rancher/wrangler/v3/pkg/signals" "github.com/rancher/wrangler/v3/pkg/signals"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
func Run(ctx *cli.Context) error { func Run(ctx *cli.Context) error {
...@@ -72,7 +72,7 @@ func Run(ctx *cli.Context) error { ...@@ -72,7 +72,7 @@ func Run(ctx *cli.Context) error {
return fmt.Errorf("--server is required") return fmt.Errorf("--server is required")
} }
if cmds.AgentConfig.FlannelIface != "" && len(cmds.AgentConfig.NodeIP) == 0 { if cmds.AgentConfig.FlannelIface != "" && len(cmds.AgentConfig.NodeIP.Value()) == 0 {
ip, err := util.GetIPFromInterface(cmds.AgentConfig.FlannelIface) ip, err := util.GetIPFromInterface(cmds.AgentConfig.FlannelIface)
if err != nil { if err != nil {
return err return err
...@@ -88,7 +88,7 @@ func Run(ctx *cli.Context) error { ...@@ -88,7 +88,7 @@ func Run(ctx *cli.Context) error {
} }
cfg := cmds.AgentConfig cfg := cmds.AgentConfig
cfg.Debug = ctx.GlobalBool("debug") cfg.Debug = ctx.Bool("debug")
cfg.DataDir = dataDir cfg.DataDir = dataDir
contextCtx := signals.SetupSignalContext() contextCtx := signals.SetupSignalContext()
......
...@@ -25,7 +25,7 @@ import ( ...@@ -25,7 +25,7 @@ import (
pkgerrors "github.com/pkg/errors" pkgerrors "github.com/pkg/errors"
certutil "github.com/rancher/dynamiclistener/cert" certutil "github.com/rancher/dynamiclistener/cert"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
func commandSetup(app *cli.Context, cfg *cmds.Server, sc *server.Config) (string, error) { func commandSetup(app *cli.Context, cfg *cmds.Server, sc *server.Config) (string, error) {
...@@ -72,7 +72,7 @@ func check(app *cli.Context, cfg *cmds.Server) error { ...@@ -72,7 +72,7 @@ func check(app *cli.Context, cfg *cmds.Server) error {
return err return err
} }
if len(cmds.ServicesList) == 0 { if len(cmds.ServicesList.Value()) == 0 {
// detecting if the command is being run on an agent or server based on presence of the server data-dir // detecting if the command is being run on an agent or server based on presence of the server data-dir
_, err := os.Stat(serverConfig.ControlConfig.DataDir) _, err := os.Stat(serverConfig.ControlConfig.DataDir)
if err != nil { if err != nil {
...@@ -80,14 +80,14 @@ func check(app *cli.Context, cfg *cmds.Server) error { ...@@ -80,14 +80,14 @@ func check(app *cli.Context, cfg *cmds.Server) error {
return err return err
} }
logrus.Infof("Agent detected, checking agent certificates") logrus.Infof("Agent detected, checking agent certificates")
cmds.ServicesList = services.Agent cmds.ServicesList = *cli.NewStringSlice(services.Agent...)
} else { } else {
logrus.Infof("Server detected, checking agent and server certificates") logrus.Infof("Server detected, checking agent and server certificates")
cmds.ServicesList = services.All cmds.ServicesList = *cli.NewStringSlice(services.All...)
} }
} }
fileMap, err := services.FilesForServices(serverConfig.ControlConfig, cmds.ServicesList) fileMap, err := services.FilesForServices(serverConfig.ControlConfig, cmds.ServicesList.Value())
if err != nil { if err != nil {
return err return err
} }
...@@ -172,7 +172,7 @@ func rotate(app *cli.Context, cfg *cmds.Server) error { ...@@ -172,7 +172,7 @@ func rotate(app *cli.Context, cfg *cmds.Server) error {
return err return err
} }
if len(cmds.ServicesList) == 0 { if len(cmds.ServicesList.Value()) == 0 {
// detecting if the command is being run on an agent or server based on presence of the server data-dir // detecting if the command is being run on an agent or server based on presence of the server data-dir
_, err := os.Stat(serverConfig.ControlConfig.DataDir) _, err := os.Stat(serverConfig.ControlConfig.DataDir)
if err != nil { if err != nil {
...@@ -180,14 +180,14 @@ func rotate(app *cli.Context, cfg *cmds.Server) error { ...@@ -180,14 +180,14 @@ func rotate(app *cli.Context, cfg *cmds.Server) error {
return err return err
} }
logrus.Infof("Agent detected, rotating agent certificates") logrus.Infof("Agent detected, rotating agent certificates")
cmds.ServicesList = services.Agent cmds.ServicesList = *cli.NewStringSlice(services.Agent...)
} else { } else {
logrus.Infof("Server detected, rotating agent and server certificates") logrus.Infof("Server detected, rotating agent and server certificates")
cmds.ServicesList = services.All cmds.ServicesList = *cli.NewStringSlice(services.All...)
} }
} }
fileMap, err := services.FilesForServices(serverConfig.ControlConfig, cmds.ServicesList) fileMap, err := services.FilesForServices(serverConfig.ControlConfig, cmds.ServicesList.Value())
if err != nil { if err != nil {
return err return err
} }
...@@ -201,7 +201,7 @@ func rotate(app *cli.Context, cfg *cmds.Server) error { ...@@ -201,7 +201,7 @@ func rotate(app *cli.Context, cfg *cmds.Server) error {
// The dynamiclistener cache file can't be simply deleted, we need to create a trigger // The dynamiclistener cache file can't be simply deleted, we need to create a trigger
// file to indicate that the cert needs to be regenerated on startup. // file to indicate that the cert needs to be regenerated on startup.
for _, service := range cmds.ServicesList { for _, service := range cmds.ServicesList.Value() {
if service == version.Program+services.ProgramServer { if service == version.Program+services.ProgramServer {
dynamicListenerRegenFilePath := filepath.Join(serverConfig.ControlConfig.DataDir, "tls", "dynamic-cert-regenerate") dynamicListenerRegenFilePath := filepath.Join(serverConfig.ControlConfig.DataDir, "tls", "dynamic-cert-regenerate")
if err := os.WriteFile(dynamicListenerRegenFilePath, []byte{}, 0600); err != nil { if err := os.WriteFile(dynamicListenerRegenFilePath, []byte{}, 0600); err != nil {
...@@ -257,7 +257,7 @@ func backupCertificates(serverDataDir, agentDataDir string, fileMap map[string][ ...@@ -257,7 +257,7 @@ func backupCertificates(serverDataDir, agentDataDir string, fileMap map[string][
} }
func validateCertConfig() error { func validateCertConfig() error {
for _, s := range cmds.ServicesList { for _, s := range cmds.ServicesList.Value() {
if !services.IsValid(s) { if !services.IsValid(s) {
return errors.New("service " + s + " is not recognized") return errors.New("service " + s + " is not recognized")
} }
......
...@@ -5,7 +5,7 @@ import ( ...@@ -5,7 +5,7 @@ import (
"path/filepath" "path/filepath"
"github.com/k3s-io/k3s/pkg/version" "github.com/k3s-io/k3s/pkg/version"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
type Agent struct { type Agent struct {
...@@ -68,35 +68,37 @@ var ( ...@@ -68,35 +68,37 @@ var (
appName = filepath.Base(os.Args[0]) appName = filepath.Base(os.Args[0])
AgentConfig Agent AgentConfig Agent
AgentTokenFlag = &cli.StringFlag{ AgentTokenFlag = &cli.StringFlag{
Name: "token,t", Name: "token",
Aliases: []string{"t"},
Usage: "(cluster) Token to use for authentication", Usage: "(cluster) Token to use for authentication",
EnvVar: version.ProgramUpper + "_TOKEN", EnvVars: []string{version.ProgramUpper + "_TOKEN"},
Destination: &AgentConfig.Token, Destination: &AgentConfig.Token,
} }
NodeIPFlag = &cli.StringSliceFlag{ NodeIPFlag = &cli.StringSliceFlag{
Name: "node-ip,i", Name: "node-ip",
Usage: "(agent/networking) IPv4/IPv6 addresses to advertise for node", Aliases: []string{"i"},
Value: &AgentConfig.NodeIP, Usage: "(agent/networking) IPv4/IPv6 addresses to advertise for node",
Destination: &AgentConfig.NodeIP,
} }
NodeExternalIPFlag = &cli.StringSliceFlag{ NodeExternalIPFlag = &cli.StringSliceFlag{
Name: "node-external-ip", Name: "node-external-ip",
Usage: "(agent/networking) IPv4/IPv6 external IP addresses to advertise for node", Usage: "(agent/networking) IPv4/IPv6 external IP addresses to advertise for node",
Value: &AgentConfig.NodeExternalIP, Destination: &AgentConfig.NodeExternalIP,
} }
NodeInternalDNSFlag = &cli.StringSliceFlag{ NodeInternalDNSFlag = &cli.StringSliceFlag{
Name: "node-internal-dns", Name: "node-internal-dns",
Usage: "(agent/networking) internal DNS addresses to advertise for node", Usage: "(agent/networking) internal DNS addresses to advertise for node",
Value: &AgentConfig.NodeInternalDNS, Destination: &AgentConfig.NodeInternalDNS,
} }
NodeExternalDNSFlag = &cli.StringSliceFlag{ NodeExternalDNSFlag = &cli.StringSliceFlag{
Name: "node-external-dns", Name: "node-external-dns",
Usage: "(agent/networking) external DNS addresses to advertise for node", Usage: "(agent/networking) external DNS addresses to advertise for node",
Value: &AgentConfig.NodeExternalDNS, Destination: &AgentConfig.NodeExternalDNS,
} }
NodeNameFlag = &cli.StringFlag{ NodeNameFlag = &cli.StringFlag{
Name: "node-name", Name: "node-name",
Usage: "(agent/node) Node name", Usage: "(agent/node) Node name",
EnvVar: version.ProgramUpper + "_NODE_NAME", EnvVars: []string{version.ProgramUpper + "_NODE_NAME"},
Destination: &AgentConfig.NodeName, Destination: &AgentConfig.NodeName,
} }
WithNodeIDFlag = &cli.BoolFlag{ WithNodeIDFlag = &cli.BoolFlag{
...@@ -113,13 +115,13 @@ var ( ...@@ -113,13 +115,13 @@ var (
Name: "selinux", Name: "selinux",
Usage: "(agent/node) Enable SELinux in containerd", Usage: "(agent/node) Enable SELinux in containerd",
Destination: &AgentConfig.EnableSELinux, Destination: &AgentConfig.EnableSELinux,
EnvVar: version.ProgramUpper + "_SELINUX", EnvVars: []string{version.ProgramUpper + "_SELINUX"},
} }
LBServerPortFlag = &cli.IntFlag{ LBServerPortFlag = &cli.IntFlag{
Name: "lb-server-port", Name: "lb-server-port",
Usage: "(agent/node) Local port for supervisor client load-balancer. If the supervisor and apiserver are not colocated an additional port 1 less than this port will also be used for the apiserver client load-balancer.", Usage: "(agent/node) Local port for supervisor client load-balancer. If the supervisor and apiserver are not colocated an additional port 1 less than this port will also be used for the apiserver client load-balancer.",
Destination: &AgentConfig.LBServerPort, Destination: &AgentConfig.LBServerPort,
EnvVar: version.ProgramUpper + "_LB_SERVER_PORT", EnvVars: []string{version.ProgramUpper + "_LB_SERVER_PORT"},
Value: 6444, Value: 6444,
} }
DockerFlag = &cli.BoolFlag{ DockerFlag = &cli.BoolFlag{
...@@ -184,40 +186,40 @@ var ( ...@@ -184,40 +186,40 @@ var (
VPNAuth = &cli.StringFlag{ VPNAuth = &cli.StringFlag{
Name: "vpn-auth", Name: "vpn-auth",
Usage: "(agent/networking) (experimental) Credentials for the VPN provider. It must include the provider name and join key in the format name=<vpn-provider>,joinKey=<key>[,controlServerURL=<url>][,extraArgs=<args>]", Usage: "(agent/networking) (experimental) Credentials for the VPN provider. It must include the provider name and join key in the format name=<vpn-provider>,joinKey=<key>[,controlServerURL=<url>][,extraArgs=<args>]",
EnvVar: version.ProgramUpper + "_VPN_AUTH", EnvVars: []string{version.ProgramUpper + "_VPN_AUTH"},
Destination: &AgentConfig.VPNAuth, Destination: &AgentConfig.VPNAuth,
} }
VPNAuthFile = &cli.StringFlag{ VPNAuthFile = &cli.StringFlag{
Name: "vpn-auth-file", Name: "vpn-auth-file",
Usage: "(agent/networking) (experimental) File containing credentials for the VPN provider. It must include the provider name and join key in the format name=<vpn-provider>,joinKey=<key>[,controlServerURL=<url>][,extraArgs=<args>]", Usage: "(agent/networking) (experimental) File containing credentials for the VPN provider. It must include the provider name and join key in the format name=<vpn-provider>,joinKey=<key>[,controlServerURL=<url>][,extraArgs=<args>]",
EnvVar: version.ProgramUpper + "_VPN_AUTH_FILE", EnvVars: []string{version.ProgramUpper + "_VPN_AUTH_FILE"},
Destination: &AgentConfig.VPNAuthFile, Destination: &AgentConfig.VPNAuthFile,
} }
ResolvConfFlag = &cli.StringFlag{ ResolvConfFlag = &cli.StringFlag{
Name: "resolv-conf", Name: "resolv-conf",
Usage: "(agent/networking) Kubelet resolv.conf file", Usage: "(agent/networking) Kubelet resolv.conf file",
EnvVar: version.ProgramUpper + "_RESOLV_CONF", EnvVars: []string{version.ProgramUpper + "_RESOLV_CONF"},
Destination: &AgentConfig.ResolvConf, Destination: &AgentConfig.ResolvConf,
} }
ExtraKubeletArgs = &cli.StringSliceFlag{ ExtraKubeletArgs = &cli.StringSliceFlag{
Name: "kubelet-arg", Name: "kubelet-arg",
Usage: "(agent/flags) Customized flag for kubelet process", Usage: "(agent/flags) Customized flag for kubelet process",
Value: &AgentConfig.ExtraKubeletArgs, Destination: &AgentConfig.ExtraKubeletArgs,
} }
ExtraKubeProxyArgs = &cli.StringSliceFlag{ ExtraKubeProxyArgs = &cli.StringSliceFlag{
Name: "kube-proxy-arg", Name: "kube-proxy-arg",
Usage: "(agent/flags) Customized flag for kube-proxy process", Usage: "(agent/flags) Customized flag for kube-proxy process",
Value: &AgentConfig.ExtraKubeProxyArgs, Destination: &AgentConfig.ExtraKubeProxyArgs,
} }
NodeTaints = &cli.StringSliceFlag{ NodeTaints = &cli.StringSliceFlag{
Name: "node-taint", Name: "node-taint",
Usage: "(agent/node) Registering kubelet with set of taints", Usage: "(agent/node) Registering kubelet with set of taints",
Value: &AgentConfig.Taints, Destination: &AgentConfig.Taints,
} }
NodeLabels = &cli.StringSliceFlag{ NodeLabels = &cli.StringSliceFlag{
Name: "node-label", Name: "node-label",
Usage: "(agent/node) Registering and starting kubelet with set of labels", Usage: "(agent/node) Registering and starting kubelet with set of labels",
Value: &AgentConfig.Labels, Destination: &AgentConfig.Labels,
} }
ImageCredProvBinDirFlag = &cli.StringFlag{ ImageCredProvBinDirFlag = &cli.StringFlag{
Name: "image-credential-provider-bin-dir", Name: "image-credential-provider-bin-dir",
...@@ -258,8 +260,8 @@ var ( ...@@ -258,8 +260,8 @@ var (
} }
) )
func NewAgentCommand(action func(ctx *cli.Context) error) cli.Command { func NewAgentCommand(action func(ctx *cli.Context) error) *cli.Command {
return cli.Command{ return &cli.Command{
Name: "agent", Name: "agent",
Usage: "Run node agent", Usage: "Run node agent",
UsageText: appName + " agent [OPTIONS]", UsageText: appName + " agent [OPTIONS]",
...@@ -275,23 +277,25 @@ func NewAgentCommand(action func(ctx *cli.Context) error) cli.Command { ...@@ -275,23 +277,25 @@ func NewAgentCommand(action func(ctx *cli.Context) error) cli.Command {
&cli.StringFlag{ &cli.StringFlag{
Name: "token-file", Name: "token-file",
Usage: "(cluster) Token file to use for authentication", Usage: "(cluster) Token file to use for authentication",
EnvVar: version.ProgramUpper + "_TOKEN_FILE", EnvVars: []string{version.ProgramUpper + "_TOKEN_FILE"},
Destination: &AgentConfig.TokenFile, Destination: &AgentConfig.TokenFile,
}, },
&cli.StringFlag{ &cli.StringFlag{
Name: "server,s", Name: "server",
Aliases: []string{"s"},
Usage: "(cluster) Server to connect to", Usage: "(cluster) Server to connect to",
EnvVar: version.ProgramUpper + "_URL", EnvVars: []string{version.ProgramUpper + "_URL"},
Destination: &AgentConfig.ServerURL, Destination: &AgentConfig.ServerURL,
}, },
// Note that this is different from DataDirFlag used elswhere in the CLI, // Note that this is different from DataDirFlag used elswhere in the CLI,
// as this is bound to AgentConfig instead of ServerConfig. // as this is bound to AgentConfig instead of ServerConfig.
&cli.StringFlag{ &cli.StringFlag{
Name: "data-dir,d", Name: "data-dir",
Aliases: []string{"d"},
Usage: "(agent/data) Folder to hold state", Usage: "(agent/data) Folder to hold state",
Destination: &AgentConfig.DataDir, Destination: &AgentConfig.DataDir,
Value: "/var/lib/rancher/" + version.Program + "", Value: "/var/lib/rancher/" + version.Program + "",
EnvVar: version.ProgramUpper + "_DATA_DIR", EnvVars: []string{version.ProgramUpper + "_DATA_DIR"},
}, },
NodeNameFlag, NodeNameFlag,
WithNodeIDFlag, WithNodeIDFlag,
......
...@@ -2,7 +2,7 @@ package cmds ...@@ -2,7 +2,7 @@ package cmds
import ( import (
"github.com/k3s-io/k3s/pkg/version" "github.com/k3s-io/k3s/pkg/version"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
const CertCommand = "certificate" const CertCommand = "certificate"
...@@ -22,27 +22,29 @@ var ( ...@@ -22,27 +22,29 @@ var (
AlsoLogToStderr, AlsoLogToStderr,
DataDirFlag, DataDirFlag,
&cli.StringSliceFlag{ &cli.StringSliceFlag{
Name: "service,s", Name: "service",
Usage: "List of services to manage certificates for. Options include (admin, api-server, controller-manager, scheduler, supervisor, " + version.Program + "-controller, " + version.Program + "-server, cloud-controller, etcd, auth-proxy, kubelet, kube-proxy)", Aliases: []string{"s"},
Value: &ServicesList, Usage: "List of services to manage certificates for. Options include (admin, api-server, controller-manager, scheduler, supervisor, " + version.Program + "-controller, " + version.Program + "-server, cloud-controller, etcd, auth-proxy, kubelet, kube-proxy)",
Destination: &ServicesList,
}, },
} }
CertRotateCACommandFlags = []cli.Flag{ CertRotateCACommandFlags = []cli.Flag{
DataDirFlag, DataDirFlag,
cli.StringFlag{ &cli.StringFlag{
Name: "server,s", Name: "server",
Aliases: []string{"s"},
Usage: "(cluster) Server to connect to", Usage: "(cluster) Server to connect to",
EnvVar: version.ProgramUpper + "_URL", EnvVars: []string{version.ProgramUpper + "_URL"},
Value: "https://127.0.0.1:6443", Value: "https://127.0.0.1:6443",
Destination: &ServerConfig.ServerURL, Destination: &ServerConfig.ServerURL,
}, },
cli.StringFlag{ &cli.StringFlag{
Name: "path", Name: "path",
Usage: "Path to directory containing new CA certificates", Usage: "Path to directory containing new CA certificates",
Destination: &CertRotateCAConfig.CACertPath, Destination: &CertRotateCAConfig.CACertPath,
Required: true, Required: true,
}, },
cli.BoolFlag{ &cli.BoolFlag{
Name: "force", Name: "force",
Usage: "Force certificate replacement, even if consistency checks fail", Usage: "Force certificate replacement, even if consistency checks fail",
Destination: &CertRotateCAConfig.Force, Destination: &CertRotateCAConfig.Force,
...@@ -50,30 +52,28 @@ var ( ...@@ -50,30 +52,28 @@ var (
} }
) )
func NewCertCommands(check, rotate, rotateCA func(ctx *cli.Context) error) cli.Command { func NewCertCommands(check, rotate, rotateCA func(ctx *cli.Context) error) *cli.Command {
return cli.Command{ return &cli.Command{
Name: CertCommand, Name: CertCommand,
Usage: "Manage K3s certificates", Usage: "Manage K3s certificates",
SkipFlagParsing: false, SkipFlagParsing: false,
SkipArgReorder: true, Subcommands: []*cli.Command{
Subcommands: []cli.Command{
{ {
Name: "check", Name: "check",
Usage: "Check " + version.Program + " component certificates on disk", Usage: "Check " + version.Program + " component certificates on disk",
SkipFlagParsing: false, SkipFlagParsing: false,
SkipArgReorder: true,
Action: check, Action: check,
Flags: append(CertRotateCommandFlags, &cli.StringFlag{ Flags: append(CertRotateCommandFlags, &cli.StringFlag{
Name: "output,o", Name: "output",
Usage: "Format output. Options: text, table", Aliases: []string{"o"},
Value: "text", Usage: "Format output. Options: text, table",
Value: "text",
}), }),
}, },
{ {
Name: "rotate", Name: "rotate",
Usage: "Rotate " + version.Program + " component certificates on disk", Usage: "Rotate " + version.Program + " component certificates on disk",
SkipFlagParsing: false, SkipFlagParsing: false,
SkipArgReorder: true,
Action: rotate, Action: rotate,
Flags: CertRotateCommandFlags, Flags: CertRotateCommandFlags,
}, },
...@@ -81,7 +81,6 @@ func NewCertCommands(check, rotate, rotateCA func(ctx *cli.Context) error) cli.C ...@@ -81,7 +81,6 @@ func NewCertCommands(check, rotate, rotateCA func(ctx *cli.Context) error) cli.C
Name: "rotate-ca", Name: "rotate-ca",
Usage: "Write updated " + version.Program + " CA certificates to the datastore", Usage: "Write updated " + version.Program + " CA certificates to the datastore",
SkipFlagParsing: false, SkipFlagParsing: false,
SkipArgReorder: true,
Action: rotateCA, Action: rotateCA,
Flags: CertRotateCACommandFlags, Flags: CertRotateCACommandFlags,
}, },
......
package cmds package cmds
import ( import (
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
func NewCheckConfigCommand(action func(*cli.Context) error) cli.Command { func NewCheckConfigCommand(action func(*cli.Context) error) *cli.Command {
return cli.Command{ return &cli.Command{
Name: "check-config", Name: "check-config",
Usage: "Run config check", Usage: "Run config check",
SkipFlagParsing: true, SkipFlagParsing: true,
SkipArgReorder: true,
Action: action, Action: action,
} }
} }
package cmds package cmds
import ( import (
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
func NewCompletionCommand(action func(*cli.Context) error) cli.Command { func NewCompletionCommand(action func(*cli.Context) error) *cli.Command {
return cli.Command{ return &cli.Command{
Name: "completion", Name: "completion",
Usage: "Install shell completion script", Usage: "Install shell completion script",
UsageText: appName + " completion [SHELL] (valid shells: bash, zsh)", UsageText: appName + " completion [SHELL] (valid shells: bash, zsh)",
......
...@@ -2,16 +2,17 @@ package cmds ...@@ -2,16 +2,17 @@ package cmds
import ( import (
"github.com/k3s-io/k3s/pkg/version" "github.com/k3s-io/k3s/pkg/version"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
var ( var (
// ConfigFlag is here to show to the user, but the actually processing is done by configfileargs before // ConfigFlag is here to show to the user, but the actually processing is done by configfileargs before
// call urfave // call urfave
ConfigFlag = &cli.StringFlag{ ConfigFlag = &cli.StringFlag{
Name: "config,c", Name: "config",
Usage: "(config) Load configuration from `FILE`", Aliases: []string{"c"},
EnvVar: version.ProgramUpper + "_CONFIG_FILE", Usage: "(config) Load configuration from `FILE`",
Value: "/etc/rancher/" + version.Program + "/config.yaml", EnvVars: []string{version.ProgramUpper + "_CONFIG_FILE"},
Value: "/etc/rancher/" + version.Program + "/config.yaml",
} }
) )
package cmds package cmds
import ( import (
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
func NewCRICTL(action func(*cli.Context) error) cli.Command { func NewCRICTL(action func(*cli.Context) error) *cli.Command {
return cli.Command{ return &cli.Command{
Name: "crictl", Name: "crictl",
Usage: "Run crictl", Usage: "Run crictl",
SkipFlagParsing: true, SkipFlagParsing: true,
SkipArgReorder: true,
Action: action, Action: action,
} }
} }
package cmds package cmds
import ( import (
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
func NewCtrCommand(action func(*cli.Context) error) cli.Command { func NewCtrCommand(action func(*cli.Context) error) *cli.Command {
return cli.Command{ return &cli.Command{
Name: "ctr", Name: "ctr",
Usage: "Run ctr", Usage: "Run ctr",
SkipFlagParsing: true, SkipFlagParsing: true,
SkipArgReorder: true,
Action: action, Action: action,
} }
} }
...@@ -4,7 +4,7 @@ import ( ...@@ -4,7 +4,7 @@ import (
"time" "time"
"github.com/k3s-io/k3s/pkg/version" "github.com/k3s-io/k3s/pkg/version"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
const EtcdSnapshotCommand = "etcd-snapshot" const EtcdSnapshotCommand = "etcd-snapshot"
...@@ -17,23 +17,26 @@ var EtcdSnapshotFlags = []cli.Flag{ ...@@ -17,23 +17,26 @@ var EtcdSnapshotFlags = []cli.Flag{
&cli.StringFlag{ &cli.StringFlag{
Name: "node-name", Name: "node-name",
Usage: "(agent/node) Node name", Usage: "(agent/node) Node name",
EnvVar: version.ProgramUpper + "_NODE_NAME", EnvVars: []string{version.ProgramUpper + "_NODE_NAME"},
Destination: &AgentConfig.NodeName, Destination: &AgentConfig.NodeName,
}, },
DataDirFlag, DataDirFlag,
&cli.StringFlag{ &cli.StringFlag{
Name: "etcd-token,t", Name: "etcd-token",
Aliases: []string{"t"},
Usage: "(cluster) Shared secret used to authenticate to etcd server", Usage: "(cluster) Shared secret used to authenticate to etcd server",
Destination: &ServerConfig.Token, Destination: &ServerConfig.Token,
}, },
&cli.StringFlag{ &cli.StringFlag{
Name: "etcd-server, s", Name: "etcd-server",
Aliases: []string{"s"},
Usage: "(cluster) Server with etcd role to connect to for snapshot management operations", Usage: "(cluster) Server with etcd role to connect to for snapshot management operations",
Value: "https://127.0.0.1:6443", Value: "https://127.0.0.1:6443",
Destination: &ServerConfig.ServerURL, Destination: &ServerConfig.ServerURL,
}, },
&cli.StringFlag{ &cli.StringFlag{
Name: "dir,etcd-snapshot-dir", Name: "dir",
Aliases: []string{"etcd-snapshot-dir"},
Usage: "(db) Directory to save etcd on-demand snapshot. (default: ${data-dir}/server/db/snapshots)", Usage: "(db) Directory to save etcd on-demand snapshot. (default: ${data-dir}/server/db/snapshots)",
Destination: &ServerConfig.EtcdSnapshotDir, Destination: &ServerConfig.EtcdSnapshotDir,
}, },
...@@ -44,105 +47,119 @@ var EtcdSnapshotFlags = []cli.Flag{ ...@@ -44,105 +47,119 @@ var EtcdSnapshotFlags = []cli.Flag{
Value: "on-demand", Value: "on-demand",
}, },
&cli.BoolFlag{ &cli.BoolFlag{
Name: "snapshot-compress,etcd-snapshot-compress", Name: "snapshot-compress",
Aliases: []string{"etcd-snapshot-compress"},
Usage: "(db) Compress etcd snapshot", Usage: "(db) Compress etcd snapshot",
Destination: &ServerConfig.EtcdSnapshotCompress, Destination: &ServerConfig.EtcdSnapshotCompress,
}, },
&cli.IntFlag{ &cli.IntFlag{
Name: "snapshot-retention,etcd-snapshot-retention", Name: "snapshot-retention,",
Aliases: []string{"etcd-snapshot-retention"},
Usage: "(db) Number of snapshots to retain.", Usage: "(db) Number of snapshots to retain.",
Destination: &ServerConfig.EtcdSnapshotRetention, Destination: &ServerConfig.EtcdSnapshotRetention,
Value: defaultSnapshotRentention, Value: defaultSnapshotRentention,
}, },
&cli.BoolFlag{ &cli.BoolFlag{
Name: "s3,etcd-s3", Name: "s3",
Aliases: []string{"etcd-s3"},
Usage: "(db) Enable backup to S3", Usage: "(db) Enable backup to S3",
Destination: &ServerConfig.EtcdS3, Destination: &ServerConfig.EtcdS3,
}, },
&cli.StringFlag{ &cli.StringFlag{
Name: "s3-endpoint,etcd-s3-endpoint", Name: "s3-endpoint",
Aliases: []string{"etcd-s3-endpoint"},
Usage: "(db) S3 endpoint url", Usage: "(db) S3 endpoint url",
Destination: &ServerConfig.EtcdS3Endpoint, Destination: &ServerConfig.EtcdS3Endpoint,
Value: "s3.amazonaws.com", Value: "s3.amazonaws.com",
}, },
&cli.StringFlag{ &cli.StringFlag{
Name: "s3-endpoint-ca,etcd-s3-endpoint-ca", Name: "s3-endpoint-ca",
Aliases: []string{"etcd-s3-endpoint-ca"},
Usage: "(db) S3 custom CA cert to connect to S3 endpoint", Usage: "(db) S3 custom CA cert to connect to S3 endpoint",
Destination: &ServerConfig.EtcdS3EndpointCA, Destination: &ServerConfig.EtcdS3EndpointCA,
}, },
&cli.BoolFlag{ &cli.BoolFlag{
Name: "s3-skip-ssl-verify,etcd-s3-skip-ssl-verify", Name: "s3-skip-ssl-verify",
Aliases: []string{"etcd-s3-skip-ssl-verify"},
Usage: "(db) Disables S3 SSL certificate validation", Usage: "(db) Disables S3 SSL certificate validation",
Destination: &ServerConfig.EtcdS3SkipSSLVerify, Destination: &ServerConfig.EtcdS3SkipSSLVerify,
}, },
&cli.StringFlag{ &cli.StringFlag{
Name: "s3-access-key,etcd-s3-access-key", Name: "s3-access-key",
Aliases: []string{"etcd-s3-access-key"},
Usage: "(db) S3 access key", Usage: "(db) S3 access key",
EnvVar: "AWS_ACCESS_KEY_ID", EnvVars: []string{"AWS_ACCESS_KEY_ID"},
Destination: &ServerConfig.EtcdS3AccessKey, Destination: &ServerConfig.EtcdS3AccessKey,
}, },
&cli.StringFlag{ &cli.StringFlag{
Name: "s3-secret-key,etcd-s3-secret-key", Name: "s3-secret-key",
Aliases: []string{"etcd-s3-secret-key"},
Usage: "(db) S3 secret key", Usage: "(db) S3 secret key",
EnvVar: "AWS_SECRET_ACCESS_KEY", EnvVars: []string{"AWS_SECRET_ACCESS_KEY"},
Destination: &ServerConfig.EtcdS3SecretKey, Destination: &ServerConfig.EtcdS3SecretKey,
}, },
&cli.StringFlag{ &cli.StringFlag{
Name: "s3-session-token,etcd-s3-session-token", Name: "s3-session-token",
Aliases: []string{"etcd-s3-session-token"},
Usage: "(db) S3 session token", Usage: "(db) S3 session token",
EnvVar: "AWS_SESSION_TOKEN", EnvVars: []string{"AWS_SESSION_TOKEN"},
Destination: &ServerConfig.EtcdS3SessionToken, Destination: &ServerConfig.EtcdS3SessionToken,
}, },
&cli.StringFlag{ &cli.StringFlag{
Name: "s3-bucket,etcd-s3-bucket", Name: "s3-bucket",
Aliases: []string{"etcd-s3-bucket"},
Usage: "(db) S3 bucket name", Usage: "(db) S3 bucket name",
Destination: &ServerConfig.EtcdS3BucketName, Destination: &ServerConfig.EtcdS3BucketName,
}, },
&cli.StringFlag{ &cli.StringFlag{
Name: "s3-region,etcd-s3-region", Name: "s3-region",
Aliases: []string{"etcd-s3-region"},
Usage: "(db) S3 region / bucket location (optional)", Usage: "(db) S3 region / bucket location (optional)",
Destination: &ServerConfig.EtcdS3Region, Destination: &ServerConfig.EtcdS3Region,
Value: "us-east-1", Value: "us-east-1",
}, },
&cli.StringFlag{ &cli.StringFlag{
Name: "s3-folder,etcd-s3-folder", Name: "s3-folder",
Aliases: []string{"etcd-s3-folder"},
Usage: "(db) S3 folder", Usage: "(db) S3 folder",
Destination: &ServerConfig.EtcdS3Folder, Destination: &ServerConfig.EtcdS3Folder,
}, },
&cli.StringFlag{ &cli.StringFlag{
Name: "s3-proxy,etcd-s3-proxy", Name: "s3-proxy",
Aliases: []string{"etcd-s3-proxy"},
Usage: "(db) Proxy server to use when connecting to S3, overriding any proxy-releated environment variables", Usage: "(db) Proxy server to use when connecting to S3, overriding any proxy-releated environment variables",
Destination: &ServerConfig.EtcdS3Proxy, Destination: &ServerConfig.EtcdS3Proxy,
}, },
&cli.StringFlag{ &cli.StringFlag{
Name: "s3-config-secret,etcd-s3-config-secret", Name: "s3-config-secret",
Aliases: []string{"etcd-s3-config-secret"},
Usage: "(db) Name of secret in the kube-system namespace used to configure S3, if etcd-s3 is enabled and no other etcd-s3 options are set", Usage: "(db) Name of secret in the kube-system namespace used to configure S3, if etcd-s3 is enabled and no other etcd-s3 options are set",
Destination: &ServerConfig.EtcdS3ConfigSecret, Destination: &ServerConfig.EtcdS3ConfigSecret,
}, },
&cli.BoolFlag{ &cli.BoolFlag{
Name: "s3-insecure,etcd-s3-insecure", Name: "s3-insecure",
Aliases: []string{"etcd-s3-insecure"},
Usage: "(db) Disables S3 over HTTPS", Usage: "(db) Disables S3 over HTTPS",
Destination: &ServerConfig.EtcdS3Insecure, Destination: &ServerConfig.EtcdS3Insecure,
}, },
&cli.DurationFlag{ &cli.DurationFlag{
Name: "s3-timeout,etcd-s3-timeout", Name: "s3-timeout",
Aliases: []string{"etcd-s3-timeout"},
Usage: "(db) S3 timeout", Usage: "(db) S3 timeout",
Destination: &ServerConfig.EtcdS3Timeout, Destination: &ServerConfig.EtcdS3Timeout,
Value: 5 * time.Minute, Value: 5 * time.Minute,
}, },
} }
func NewEtcdSnapshotCommands(delete, list, prune, save func(ctx *cli.Context) error) cli.Command { func NewEtcdSnapshotCommands(delete, list, prune, save func(ctx *cli.Context) error) *cli.Command {
return cli.Command{ return &cli.Command{
Name: EtcdSnapshotCommand, Name: EtcdSnapshotCommand,
SkipFlagParsing: false, SkipFlagParsing: false,
SkipArgReorder: true, Subcommands: []*cli.Command{
Subcommands: []cli.Command{
{ {
Name: "save", Name: "save",
Usage: "Trigger an immediate etcd snapshot", Usage: "Trigger an immediate etcd snapshot",
SkipFlagParsing: false, SkipFlagParsing: false,
SkipArgReorder: true,
Action: save, Action: save,
Flags: EtcdSnapshotFlags, Flags: EtcdSnapshotFlags,
}, },
...@@ -150,7 +167,6 @@ func NewEtcdSnapshotCommands(delete, list, prune, save func(ctx *cli.Context) er ...@@ -150,7 +167,6 @@ func NewEtcdSnapshotCommands(delete, list, prune, save func(ctx *cli.Context) er
Name: "delete", Name: "delete",
Usage: "Delete given snapshot(s)", Usage: "Delete given snapshot(s)",
SkipFlagParsing: false, SkipFlagParsing: false,
SkipArgReorder: true,
Action: delete, Action: delete,
Flags: EtcdSnapshotFlags, Flags: EtcdSnapshotFlags,
}, },
...@@ -159,10 +175,10 @@ func NewEtcdSnapshotCommands(delete, list, prune, save func(ctx *cli.Context) er ...@@ -159,10 +175,10 @@ func NewEtcdSnapshotCommands(delete, list, prune, save func(ctx *cli.Context) er
Aliases: []string{"list", "l"}, Aliases: []string{"list", "l"},
Usage: "List snapshots", Usage: "List snapshots",
SkipFlagParsing: false, SkipFlagParsing: false,
SkipArgReorder: true,
Action: list, Action: list,
Flags: append(EtcdSnapshotFlags, &cli.StringFlag{ Flags: append(EtcdSnapshotFlags, &cli.StringFlag{
Name: "o,output", Name: "output",
Aliases: []string{"o"},
Usage: "(db) List format. Default: standard. Optional: json", Usage: "(db) List format. Default: standard. Optional: json",
Destination: &ServerConfig.EtcdListFormat, Destination: &ServerConfig.EtcdListFormat,
}), }),
...@@ -171,7 +187,6 @@ func NewEtcdSnapshotCommands(delete, list, prune, save func(ctx *cli.Context) er ...@@ -171,7 +187,6 @@ func NewEtcdSnapshotCommands(delete, list, prune, save func(ctx *cli.Context) er
Name: "prune", Name: "prune",
Usage: "Remove snapshots that match the name prefix that exceed the configured retention count", Usage: "Remove snapshots that match the name prefix that exceed the configured retention count",
SkipFlagParsing: false, SkipFlagParsing: false,
SkipArgReorder: true,
Action: prune, Action: prune,
Flags: EtcdSnapshotFlags, Flags: EtcdSnapshotFlags,
}, },
......
package cmds package cmds
import ( import (
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
func NewKubectlCommand(action func(*cli.Context) error) cli.Command { func NewKubectlCommand(action func(*cli.Context) error) *cli.Command {
return cli.Command{ return &cli.Command{
Name: "kubectl", Name: "kubectl",
Usage: "Run kubectl", Usage: "Run kubectl",
SkipFlagParsing: true, SkipFlagParsing: true,
SkipArgReorder: true,
Action: action, Action: action,
} }
} }
...@@ -6,7 +6,7 @@ import ( ...@@ -6,7 +6,7 @@ import (
"time" "time"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
type Log struct { type Log struct {
...@@ -30,7 +30,8 @@ var ( ...@@ -30,7 +30,8 @@ var (
Destination: &LogConfig.VModule, Destination: &LogConfig.VModule,
} }
LogFile = &cli.StringFlag{ LogFile = &cli.StringFlag{
Name: "log,l", Name: "log",
Aliases: []string{"l"},
Usage: "(logging) Log to file", Usage: "(logging) Log to file",
Destination: &LogConfig.LogFile, Destination: &LogConfig.LogFile,
} }
......
...@@ -6,7 +6,7 @@ import ( ...@@ -6,7 +6,7 @@ import (
"runtime" "runtime"
"github.com/k3s-io/k3s/pkg/version" "github.com/k3s-io/k3s/pkg/version"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
var ( var (
...@@ -15,7 +15,7 @@ var ( ...@@ -15,7 +15,7 @@ var (
Name: "debug", Name: "debug",
Usage: "(logging) Turn on debug logs", Usage: "(logging) Turn on debug logs",
Destination: &Debug, Destination: &Debug,
EnvVar: version.ProgramUpper + "_DEBUG", EnvVars: []string{version.ProgramUpper + "_DEBUG"},
} }
PreferBundledBin = &cli.BoolFlag{ PreferBundledBin = &cli.BoolFlag{
Name: "prefer-bundled-bin", Name: "prefer-bundled-bin",
......
...@@ -2,14 +2,15 @@ package cmds ...@@ -2,14 +2,15 @@ package cmds
import ( import (
"github.com/k3s-io/k3s/pkg/version" "github.com/k3s-io/k3s/pkg/version"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
const SecretsEncryptCommand = "secrets-encrypt" const SecretsEncryptCommand = "secrets-encrypt"
var ( var (
forceFlag = &cli.BoolFlag{ forceFlag = &cli.BoolFlag{
Name: "f,force", Name: "force",
Aliases: []string{"f"},
Usage: "Force this stage.", Usage: "Force this stage.",
Destination: &ServerConfig.EncryptForce, Destination: &ServerConfig.EncryptForce,
} }
...@@ -17,65 +18,60 @@ var ( ...@@ -17,65 +18,60 @@ var (
DataDirFlag, DataDirFlag,
ServerToken, ServerToken,
&cli.StringFlag{ &cli.StringFlag{
Name: "server, s", Name: "server",
Aliases: []string{"s"},
Usage: "(cluster) Server to connect to", Usage: "(cluster) Server to connect to",
EnvVar: version.ProgramUpper + "_URL", EnvVars: []string{version.ProgramUpper + "_URL"},
Value: "https://127.0.0.1:6443", Value: "https://127.0.0.1:6443",
Destination: &ServerConfig.ServerURL, Destination: &ServerConfig.ServerURL,
}, },
} }
) )
func NewSecretsEncryptCommands(status, enable, disable, prepare, rotate, reencrypt, rotateKeys func(ctx *cli.Context) error) cli.Command { func NewSecretsEncryptCommands(status, enable, disable, prepare, rotate, reencrypt, rotateKeys func(ctx *cli.Context) error) *cli.Command {
return cli.Command{ return &cli.Command{
Name: SecretsEncryptCommand, Name: SecretsEncryptCommand,
Usage: "Control secrets encryption and keys rotation", Usage: "Control secrets encryption and keys rotation",
SkipArgReorder: true, Subcommands: []*cli.Command{
Subcommands: []cli.Command{
{ {
Name: "status", Name: "status",
Usage: "Print current status of secrets encryption", Usage: "Print current status of secrets encryption",
SkipArgReorder: true, Action: status,
Action: status,
Flags: append(EncryptFlags, &cli.StringFlag{ Flags: append(EncryptFlags, &cli.StringFlag{
Name: "output,o", Name: "output",
Aliases: []string{"o"},
Usage: "Status format. Default: text. Optional: json", Usage: "Status format. Default: text. Optional: json",
Destination: &ServerConfig.EncryptOutput, Destination: &ServerConfig.EncryptOutput,
}), }),
}, },
{ {
Name: "enable", Name: "enable",
Usage: "Enable secrets encryption", Usage: "Enable secrets encryption",
SkipArgReorder: true, Action: enable,
Action: enable, Flags: EncryptFlags,
Flags: EncryptFlags,
}, },
{ {
Name: "disable", Name: "disable",
Usage: "Disable secrets encryption", Usage: "Disable secrets encryption",
SkipArgReorder: true, Action: disable,
Action: disable, Flags: EncryptFlags,
Flags: EncryptFlags,
}, },
{ {
Name: "prepare", Name: "prepare",
Usage: "Prepare for encryption keys rotation", Usage: "Prepare for encryption keys rotation",
SkipArgReorder: true, Action: prepare,
Action: prepare, Flags: append(EncryptFlags, forceFlag),
Flags: append(EncryptFlags, forceFlag),
}, },
{ {
Name: "rotate", Name: "rotate",
Usage: "Rotate secrets encryption keys", Usage: "Rotate secrets encryption keys",
SkipArgReorder: true, Action: rotate,
Action: rotate, Flags: append(EncryptFlags, forceFlag),
Flags: append(EncryptFlags, forceFlag),
}, },
{ {
Name: "reencrypt", Name: "reencrypt",
Usage: "Reencrypt all data with new encryption key", Usage: "Reencrypt all data with new encryption key",
SkipArgReorder: true, Action: reencrypt,
Action: reencrypt,
Flags: append(EncryptFlags, Flags: append(EncryptFlags,
forceFlag, forceFlag,
&cli.BoolFlag{ &cli.BoolFlag{
...@@ -85,11 +81,10 @@ func NewSecretsEncryptCommands(status, enable, disable, prepare, rotate, reencry ...@@ -85,11 +81,10 @@ func NewSecretsEncryptCommands(status, enable, disable, prepare, rotate, reencry
}), }),
}, },
{ {
Name: "rotate-keys", Name: "rotate-keys",
Usage: "(experimental) Dynamically rotates secrets encryption keys and re-encrypt secrets", Usage: "(experimental) Dynamically rotates secrets encryption keys and re-encrypt secrets",
SkipArgReorder: true, Action: rotateKeys,
Action: rotateKeys, Flags: EncryptFlags,
Flags: EncryptFlags,
}, },
}, },
} }
......
...@@ -4,7 +4,7 @@ import ( ...@@ -4,7 +4,7 @@ import (
"time" "time"
"github.com/k3s-io/k3s/pkg/version" "github.com/k3s-io/k3s/pkg/version"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
const TokenCommand = "token" const TokenCommand = "token"
...@@ -26,22 +26,21 @@ var ( ...@@ -26,22 +26,21 @@ var (
TokenConfig = Token{} TokenConfig = Token{}
TokenFlags = []cli.Flag{ TokenFlags = []cli.Flag{
DataDirFlag, DataDirFlag,
cli.StringFlag{ &cli.StringFlag{
Name: "kubeconfig", Name: "kubeconfig",
Usage: "(cluster) Server to connect to", Usage: "(cluster) Server to connect to",
EnvVar: "KUBECONFIG", EnvVars: []string{"KUBECONFIG"},
Destination: &TokenConfig.Kubeconfig, Destination: &TokenConfig.Kubeconfig,
}, },
} }
) )
func NewTokenCommands(create, delete, generate, list, rotate func(ctx *cli.Context) error) cli.Command { func NewTokenCommands(create, delete, generate, list, rotate func(ctx *cli.Context) error) *cli.Command {
return cli.Command{ return &cli.Command{
Name: TokenCommand, Name: TokenCommand,
Usage: "Manage tokens", Usage: "Manage tokens",
SkipFlagParsing: false, SkipFlagParsing: false,
SkipArgReorder: true, Subcommands: []*cli.Command{
Subcommands: []cli.Command{
{ {
Name: "create", Name: "create",
Usage: "Create bootstrap tokens on the server", Usage: "Create bootstrap tokens on the server",
...@@ -50,21 +49,20 @@ func NewTokenCommands(create, delete, generate, list, rotate func(ctx *cli.Conte ...@@ -50,21 +49,20 @@ func NewTokenCommands(create, delete, generate, list, rotate func(ctx *cli.Conte
Usage: "A human friendly description of how this token is used", Usage: "A human friendly description of how this token is used",
Destination: &TokenConfig.Description, Destination: &TokenConfig.Description,
}, &cli.StringSliceFlag{ }, &cli.StringSliceFlag{
Name: "groups", Name: "groups",
Usage: "Extra groups that this token will authenticate as when used for authentication", Usage: "Extra groups that this token will authenticate as when used for authentication",
Value: &TokenConfig.Groups, Destination: &TokenConfig.Groups,
}, &cli.DurationFlag{ }, &cli.DurationFlag{
Name: "ttl", Name: "ttl",
Usage: "The duration before the token is automatically deleted (e.g. 1s, 2m, 3h). If set to '0', the token will never expire", Usage: "The duration before the token is automatically deleted (e.g. 1s, 2m, 3h). If set to '0', the token will never expire",
Value: time.Hour * 24, Value: time.Hour * 24,
Destination: &TokenConfig.TTL, Destination: &TokenConfig.TTL,
}, &cli.StringSliceFlag{ }, &cli.StringSliceFlag{
Name: "usages", Name: "usages",
Usage: "Describes the ways in which this token can be used.", Usage: "Describes the ways in which this token can be used.",
Value: &TokenConfig.Usages, Destination: &TokenConfig.Usages,
}), }),
SkipFlagParsing: false, SkipFlagParsing: false,
SkipArgReorder: true,
Action: create, Action: create,
}, },
{ {
...@@ -72,7 +70,6 @@ func NewTokenCommands(create, delete, generate, list, rotate func(ctx *cli.Conte ...@@ -72,7 +70,6 @@ func NewTokenCommands(create, delete, generate, list, rotate func(ctx *cli.Conte
Usage: "Delete bootstrap tokens on the server", Usage: "Delete bootstrap tokens on the server",
Flags: TokenFlags, Flags: TokenFlags,
SkipFlagParsing: false, SkipFlagParsing: false,
SkipArgReorder: true,
Action: delete, Action: delete,
}, },
{ {
...@@ -80,19 +77,18 @@ func NewTokenCommands(create, delete, generate, list, rotate func(ctx *cli.Conte ...@@ -80,19 +77,18 @@ func NewTokenCommands(create, delete, generate, list, rotate func(ctx *cli.Conte
Usage: "Generate and print a bootstrap token, but do not create it on the server", Usage: "Generate and print a bootstrap token, but do not create it on the server",
Flags: TokenFlags, Flags: TokenFlags,
SkipFlagParsing: false, SkipFlagParsing: false,
SkipArgReorder: true,
Action: generate, Action: generate,
}, },
{ {
Name: "list", Name: "list",
Usage: "List bootstrap tokens on the server", Usage: "List bootstrap tokens on the server",
Flags: append(TokenFlags, &cli.StringFlag{ Flags: append(TokenFlags, &cli.StringFlag{
Name: "output,o", Name: "output",
Aliases: []string{"o"},
Value: "text", Value: "text",
Destination: &TokenConfig.Output, Destination: &TokenConfig.Output,
}), }),
SkipFlagParsing: false, SkipFlagParsing: false,
SkipArgReorder: true,
Action: list, Action: list,
}, },
{ {
...@@ -100,16 +96,18 @@ func NewTokenCommands(create, delete, generate, list, rotate func(ctx *cli.Conte ...@@ -100,16 +96,18 @@ func NewTokenCommands(create, delete, generate, list, rotate func(ctx *cli.Conte
Usage: "Rotate original server token with a new server token", Usage: "Rotate original server token with a new server token",
Flags: append(TokenFlags, Flags: append(TokenFlags,
&cli.StringFlag{ &cli.StringFlag{
Name: "token,t", Name: "token",
Aliases: []string{"t"},
Usage: "Existing token used to join a server or agent to a cluster", Usage: "Existing token used to join a server or agent to a cluster",
Destination: &TokenConfig.Token, Destination: &TokenConfig.Token,
EnvVar: version.ProgramUpper + "_TOKEN", EnvVars: []string{version.ProgramUpper + "_TOKEN"},
}, },
&cli.StringFlag{ &cli.StringFlag{
Name: "server, s", Name: "server",
Aliases: []string{"s"},
Usage: "(cluster) Server to connect to", Usage: "(cluster) Server to connect to",
Destination: &TokenConfig.ServerURL, Destination: &TokenConfig.ServerURL,
EnvVar: version.ProgramUpper + "_URL", EnvVars: []string{version.ProgramUpper + "_URL"},
Value: "https://127.0.0.1:6443", Value: "https://127.0.0.1:6443",
}, },
&cli.StringFlag{ &cli.StringFlag{
...@@ -118,7 +116,6 @@ func NewTokenCommands(create, delete, generate, list, rotate func(ctx *cli.Conte ...@@ -118,7 +116,6 @@ func NewTokenCommands(create, delete, generate, list, rotate func(ctx *cli.Conte
Destination: &TokenConfig.NewToken, Destination: &TokenConfig.NewToken,
}), }),
SkipFlagParsing: false, SkipFlagParsing: false,
SkipArgReorder: true,
Action: rotate, Action: rotate,
}, },
}, },
......
...@@ -6,14 +6,14 @@ import ( ...@@ -6,14 +6,14 @@ import (
"github.com/k3s-io/k3s/pkg/version" "github.com/k3s-io/k3s/pkg/version"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
func Run(ctx *cli.Context) error { func Run(ctx *cli.Context) error {
if ctx.NArg() < 1 { if ctx.NArg() < 1 {
return fmt.Errorf("must provide a valid SHELL argument") return fmt.Errorf("must provide a valid SHELL argument")
} }
shell := ctx.Args()[0] shell := ctx.Args().Get(0)
completetionScript, err := genCompletionScript(shell) completetionScript, err := genCompletionScript(shell)
if err != nil { if err != nil {
return err return err
......
...@@ -4,7 +4,7 @@ import ( ...@@ -4,7 +4,7 @@ import (
"os" "os"
"runtime" "runtime"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
"sigs.k8s.io/cri-tools/cmd/crictl" "sigs.k8s.io/cri-tools/cmd/crictl"
) )
......
...@@ -2,7 +2,7 @@ package ctr ...@@ -2,7 +2,7 @@ package ctr
import ( import (
"github.com/k3s-io/k3s/pkg/ctr" "github.com/k3s-io/k3s/pkg/ctr"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
func Run(ctx *cli.Context) error { func Run(ctx *cli.Context) error {
......
...@@ -24,7 +24,7 @@ import ( ...@@ -24,7 +24,7 @@ import (
util2 "github.com/k3s-io/k3s/pkg/util" util2 "github.com/k3s-io/k3s/pkg/util"
pkgerrors "github.com/pkg/errors" pkgerrors "github.com/pkg/errors"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/cli-runtime/pkg/printers" "k8s.io/cli-runtime/pkg/printers"
) )
...@@ -105,7 +105,7 @@ func Save(app *cli.Context) error { ...@@ -105,7 +105,7 @@ func Save(app *cli.Context) error {
} }
func save(app *cli.Context, cfg *cmds.Server) error { func save(app *cli.Context, cfg *cmds.Server) error {
if len(app.Args()) > 0 { if app.Args().Len() > 0 {
return util2.ErrCommandNoArgs return util2.ErrCommandNoArgs
} }
...@@ -150,7 +150,7 @@ func Delete(app *cli.Context) error { ...@@ -150,7 +150,7 @@ func Delete(app *cli.Context) error {
func delete(app *cli.Context, cfg *cmds.Server) error { func delete(app *cli.Context, cfg *cmds.Server) error {
snapshots := app.Args() snapshots := app.Args()
if len(snapshots) == 0 { if snapshots.Len() == 0 {
return errors.New("no snapshots given for removal") return errors.New("no snapshots given for removal")
} }
...@@ -160,7 +160,7 @@ func delete(app *cli.Context, cfg *cmds.Server) error { ...@@ -160,7 +160,7 @@ func delete(app *cli.Context, cfg *cmds.Server) error {
} }
sr.Operation = etcd.SnapshotOperationDelete sr.Operation = etcd.SnapshotOperationDelete
sr.Name = snapshots sr.Name = snapshots.Slice()
b, err := json.Marshal(sr) b, err := json.Marshal(sr)
if err != nil { if err != nil {
...@@ -178,7 +178,7 @@ func delete(app *cli.Context, cfg *cmds.Server) error { ...@@ -178,7 +178,7 @@ func delete(app *cli.Context, cfg *cmds.Server) error {
for _, name := range resp.Deleted { for _, name := range resp.Deleted {
logrus.Infof("Snapshot %s deleted.", name) logrus.Infof("Snapshot %s deleted.", name)
} }
for _, name := range snapshots { for _, name := range snapshots.Slice() {
if !slices.Contains(resp.Deleted, name) { if !slices.Contains(resp.Deleted, name) {
logrus.Warnf("Snapshot %s not found.", name) logrus.Warnf("Snapshot %s not found.", name)
} }
......
...@@ -2,7 +2,7 @@ package kubectl ...@@ -2,7 +2,7 @@ package kubectl
import ( import (
"github.com/k3s-io/k3s/pkg/kubectl" "github.com/k3s-io/k3s/pkg/kubectl"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
func Run(ctx *cli.Context) error { func Run(ctx *cli.Context) error {
......
...@@ -18,7 +18,7 @@ import ( ...@@ -18,7 +18,7 @@ import (
"github.com/k3s-io/k3s/pkg/server/handlers" "github.com/k3s-io/k3s/pkg/server/handlers"
"github.com/k3s-io/k3s/pkg/version" "github.com/k3s-io/k3s/pkg/version"
pkgerrors "github.com/pkg/errors" pkgerrors "github.com/pkg/errors"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
"k8s.io/utils/ptr" "k8s.io/utils/ptr"
) )
......
...@@ -33,7 +33,7 @@ import ( ...@@ -33,7 +33,7 @@ import (
pkgerrors "github.com/pkg/errors" pkgerrors "github.com/pkg/errors"
"github.com/rancher/wrangler/v3/pkg/signals" "github.com/rancher/wrangler/v3/pkg/signals"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
etcdversion "go.etcd.io/etcd/api/v3/version" etcdversion "go.etcd.io/etcd/api/v3/version"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
utilnet "k8s.io/apimachinery/pkg/util/net" utilnet "k8s.io/apimachinery/pkg/util/net"
...@@ -87,7 +87,7 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont ...@@ -87,7 +87,7 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont
} }
cfg.DataDir = dataDir cfg.DataDir = dataDir
if !cfg.DisableAgent { if !cfg.DisableAgent {
dualNode, err := utilsnet.IsDualStackIPStrings(cmds.AgentConfig.NodeIP) dualNode, err := utilsnet.IsDualStackIPStrings(cmds.AgentConfig.NodeIP.Value())
if err != nil { if err != nil {
return err return err
} }
...@@ -139,17 +139,17 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont ...@@ -139,17 +139,17 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont
serverConfig.ControlConfig.HelmJobImage = cfg.HelmJobImage serverConfig.ControlConfig.HelmJobImage = cfg.HelmJobImage
serverConfig.ControlConfig.Rootless = cfg.Rootless serverConfig.ControlConfig.Rootless = cfg.Rootless
serverConfig.ControlConfig.ServiceLBNamespace = cfg.ServiceLBNamespace serverConfig.ControlConfig.ServiceLBNamespace = cfg.ServiceLBNamespace
serverConfig.ControlConfig.SANs = util.SplitStringSlice(cfg.TLSSan) serverConfig.ControlConfig.SANs = util.SplitStringSlice(cfg.TLSSan.Value())
serverConfig.ControlConfig.SANSecurity = cfg.TLSSanSecurity serverConfig.ControlConfig.SANSecurity = cfg.TLSSanSecurity
serverConfig.ControlConfig.BindAddress = cmds.AgentConfig.BindAddress serverConfig.ControlConfig.BindAddress = cmds.AgentConfig.BindAddress
serverConfig.ControlConfig.SupervisorPort = cfg.SupervisorPort serverConfig.ControlConfig.SupervisorPort = cfg.SupervisorPort
serverConfig.ControlConfig.HTTPSPort = cfg.HTTPSPort serverConfig.ControlConfig.HTTPSPort = cfg.HTTPSPort
serverConfig.ControlConfig.APIServerPort = cfg.APIServerPort serverConfig.ControlConfig.APIServerPort = cfg.APIServerPort
serverConfig.ControlConfig.APIServerBindAddress = cfg.APIServerBindAddress serverConfig.ControlConfig.APIServerBindAddress = cfg.APIServerBindAddress
serverConfig.ControlConfig.ExtraAPIArgs = cfg.ExtraAPIArgs serverConfig.ControlConfig.ExtraAPIArgs = cfg.ExtraAPIArgs.Value()
serverConfig.ControlConfig.ExtraControllerArgs = cfg.ExtraControllerArgs serverConfig.ControlConfig.ExtraControllerArgs = cfg.ExtraControllerArgs.Value()
serverConfig.ControlConfig.ExtraEtcdArgs = cfg.ExtraEtcdArgs serverConfig.ControlConfig.ExtraEtcdArgs = cfg.ExtraEtcdArgs.Value()
serverConfig.ControlConfig.ExtraSchedulerAPIArgs = cfg.ExtraSchedulerArgs serverConfig.ControlConfig.ExtraSchedulerAPIArgs = cfg.ExtraSchedulerArgs.Value()
serverConfig.ControlConfig.ClusterDomain = cfg.ClusterDomain serverConfig.ControlConfig.ClusterDomain = cfg.ClusterDomain
serverConfig.ControlConfig.Datastore.NotifyInterval = 5 * time.Second serverConfig.ControlConfig.Datastore.NotifyInterval = 5 * time.Second
serverConfig.ControlConfig.Datastore.EmulatedETCDVersion = etcdversion.Version serverConfig.ControlConfig.Datastore.EmulatedETCDVersion = etcdversion.Version
...@@ -164,7 +164,7 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont ...@@ -164,7 +164,7 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont
serverConfig.ControlConfig.FlannelIPv6Masq = cfg.FlannelIPv6Masq serverConfig.ControlConfig.FlannelIPv6Masq = cfg.FlannelIPv6Masq
serverConfig.ControlConfig.FlannelExternalIP = cfg.FlannelExternalIP serverConfig.ControlConfig.FlannelExternalIP = cfg.FlannelExternalIP
serverConfig.ControlConfig.EgressSelectorMode = cfg.EgressSelectorMode serverConfig.ControlConfig.EgressSelectorMode = cfg.EgressSelectorMode
serverConfig.ControlConfig.ExtraCloudControllerArgs = cfg.ExtraCloudControllerArgs serverConfig.ControlConfig.ExtraCloudControllerArgs = cfg.ExtraCloudControllerArgs.Value()
serverConfig.ControlConfig.DisableCCM = cfg.DisableCCM serverConfig.ControlConfig.DisableCCM = cfg.DisableCCM
serverConfig.ControlConfig.DisableNPC = cfg.DisableNPC serverConfig.ControlConfig.DisableNPC = cfg.DisableNPC
serverConfig.ControlConfig.DisableHelmController = cfg.DisableHelmController serverConfig.ControlConfig.DisableHelmController = cfg.DisableHelmController
...@@ -251,7 +251,7 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont ...@@ -251,7 +251,7 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont
} }
} }
if cmds.AgentConfig.FlannelIface != "" && len(cmds.AgentConfig.NodeIP) == 0 { if cmds.AgentConfig.FlannelIface != "" && len(cmds.AgentConfig.NodeIP.Value()) == 0 {
ip, err := util.GetIPFromInterface(cmds.AgentConfig.FlannelIface) ip, err := util.GetIPFromInterface(cmds.AgentConfig.FlannelIface)
if err != nil { if err != nil {
return err return err
...@@ -259,14 +259,14 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont ...@@ -259,14 +259,14 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont
cmds.AgentConfig.NodeIP.Set(ip) cmds.AgentConfig.NodeIP.Set(ip)
} }
if serverConfig.ControlConfig.PrivateIP == "" && len(cmds.AgentConfig.NodeIP) != 0 { if serverConfig.ControlConfig.PrivateIP == "" && len(cmds.AgentConfig.NodeIP.Value()) != 0 {
serverConfig.ControlConfig.PrivateIP = util.GetFirstValidIPString(cmds.AgentConfig.NodeIP) serverConfig.ControlConfig.PrivateIP = util.GetFirstValidIPString(cmds.AgentConfig.NodeIP.Value())
} }
// Ensure that we add the localhost name/ip and node name/ip to the SAN list. This list is shared by the // Ensure that we add the localhost name/ip and node name/ip to the SAN list. This list is shared by the
// certs for the supervisor, kube-apiserver cert, and etcd. DNS entries for the in-cluster kubernetes // certs for the supervisor, kube-apiserver cert, and etcd. DNS entries for the in-cluster kubernetes
// service endpoint are added later when the certificates are created. // service endpoint are added later when the certificates are created.
nodeName, nodeIPs, err := util.GetHostnameAndIPs(cmds.AgentConfig.NodeName, cmds.AgentConfig.NodeIP) nodeName, nodeIPs, err := util.GetHostnameAndIPs(cmds.AgentConfig.NodeName, cmds.AgentConfig.NodeIP.Value())
if err != nil { if err != nil {
return err return err
} }
...@@ -310,13 +310,13 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont ...@@ -310,13 +310,13 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont
} else { } else {
// if not set, try setting advertise-ip from agent node-external-ip // if not set, try setting advertise-ip from agent node-external-ip
if serverConfig.ControlConfig.AdvertiseIP == "" && len(cmds.AgentConfig.NodeExternalIP) != 0 { if serverConfig.ControlConfig.AdvertiseIP == "" && len(cmds.AgentConfig.NodeExternalIP.Value()) != 0 {
serverConfig.ControlConfig.AdvertiseIP = util.GetFirstValidIPString(cmds.AgentConfig.NodeExternalIP) serverConfig.ControlConfig.AdvertiseIP = util.GetFirstValidIPString(cmds.AgentConfig.NodeExternalIP.Value())
} }
// if not set, try setting advertise-ip from agent node-ip // if not set, try setting advertise-ip from agent node-ip
if serverConfig.ControlConfig.AdvertiseIP == "" && len(cmds.AgentConfig.NodeIP) != 0 { if serverConfig.ControlConfig.AdvertiseIP == "" && len(cmds.AgentConfig.NodeIP.Value()) != 0 {
serverConfig.ControlConfig.AdvertiseIP = util.GetFirstValidIPString(cmds.AgentConfig.NodeIP) serverConfig.ControlConfig.AdvertiseIP = util.GetFirstValidIPString(cmds.AgentConfig.NodeIP.Value())
} }
} }
...@@ -329,10 +329,10 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont ...@@ -329,10 +329,10 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont
// configure ClusterIPRanges. Use default 10.42.0.0/16 or fd00:42::/56 if user did not set it // configure ClusterIPRanges. Use default 10.42.0.0/16 or fd00:42::/56 if user did not set it
_, defaultClusterCIDR, defaultServiceCIDR, _ := util.GetDefaultAddresses(nodeIPs[0]) _, defaultClusterCIDR, defaultServiceCIDR, _ := util.GetDefaultAddresses(nodeIPs[0])
if len(cmds.ServerConfig.ClusterCIDR) == 0 { if len(cmds.ServerConfig.ClusterCIDR.Value()) == 0 {
cmds.ServerConfig.ClusterCIDR.Set(defaultClusterCIDR) cmds.ServerConfig.ClusterCIDR.Set(defaultClusterCIDR)
} }
for _, cidr := range util.SplitStringSlice(cmds.ServerConfig.ClusterCIDR) { for _, cidr := range util.SplitStringSlice(cmds.ServerConfig.ClusterCIDR.Value()) {
_, parsed, err := net.ParseCIDR(cidr) _, parsed, err := net.ParseCIDR(cidr)
if err != nil { if err != nil {
return pkgerrors.WithMessagef(err, "invalid cluster-cidr %s", cidr) return pkgerrors.WithMessagef(err, "invalid cluster-cidr %s", cidr)
...@@ -344,10 +344,10 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont ...@@ -344,10 +344,10 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont
serverConfig.ControlConfig.ClusterIPRange = serverConfig.ControlConfig.ClusterIPRanges[0] serverConfig.ControlConfig.ClusterIPRange = serverConfig.ControlConfig.ClusterIPRanges[0]
// configure ServiceIPRanges. Use default 10.43.0.0/16 or fd00:43::/112 if user did not set it // configure ServiceIPRanges. Use default 10.43.0.0/16 or fd00:43::/112 if user did not set it
if len(cmds.ServerConfig.ServiceCIDR) == 0 { if len(cmds.ServerConfig.ServiceCIDR.Value()) == 0 {
cmds.ServerConfig.ServiceCIDR.Set(defaultServiceCIDR) cmds.ServerConfig.ServiceCIDR.Set(defaultServiceCIDR)
} }
for _, cidr := range util.SplitStringSlice(cmds.ServerConfig.ServiceCIDR) { for _, cidr := range util.SplitStringSlice(cmds.ServerConfig.ServiceCIDR.Value()) {
_, parsed, err := net.ParseCIDR(cidr) _, parsed, err := net.ParseCIDR(cidr)
if err != nil { if err != nil {
return pkgerrors.WithMessagef(err, "invalid service-cidr %s", cidr) return pkgerrors.WithMessagef(err, "invalid service-cidr %s", cidr)
...@@ -374,7 +374,7 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont ...@@ -374,7 +374,7 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont
// i.e. when you set service-cidr to 192.168.0.0/16 and don't provide cluster-dns, it will be set to 192.168.0.10 // i.e. when you set service-cidr to 192.168.0.0/16 and don't provide cluster-dns, it will be set to 192.168.0.10
// If there are no IPv4 ServiceCIDRs, an IPv6 ServiceCIDRs will be used. // If there are no IPv4 ServiceCIDRs, an IPv6 ServiceCIDRs will be used.
// If neither of IPv4 or IPv6 are found an error is raised. // If neither of IPv4 or IPv6 are found an error is raised.
if len(cmds.ServerConfig.ClusterDNS) == 0 { if len(cmds.ServerConfig.ClusterDNS.Value()) == 0 {
for _, svcCIDR := range serverConfig.ControlConfig.ServiceIPRanges { for _, svcCIDR := range serverConfig.ControlConfig.ServiceIPRanges {
clusterDNS, err := utilsnet.GetIndexedIP(svcCIDR, 10) clusterDNS, err := utilsnet.GetIndexedIP(svcCIDR, 10)
if err != nil { if err != nil {
...@@ -383,7 +383,7 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont ...@@ -383,7 +383,7 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont
serverConfig.ControlConfig.ClusterDNSs = append(serverConfig.ControlConfig.ClusterDNSs, clusterDNS) serverConfig.ControlConfig.ClusterDNSs = append(serverConfig.ControlConfig.ClusterDNSs, clusterDNS)
} }
} else { } else {
for _, ip := range util.SplitStringSlice(cmds.ServerConfig.ClusterDNS) { for _, ip := range util.SplitStringSlice(cmds.ServerConfig.ClusterDNS.Value()) {
parsed := net.ParseIP(ip) parsed := net.ParseIP(ip)
if parsed == nil { if parsed == nil {
return fmt.Errorf("invalid cluster-dns address %s", ip) return fmt.Errorf("invalid cluster-dns address %s", ip)
...@@ -543,7 +543,7 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont ...@@ -543,7 +543,7 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont
agentConfig := cmds.AgentConfig agentConfig := cmds.AgentConfig
agentConfig.ContainerRuntimeReady = containerRuntimeReady agentConfig.ContainerRuntimeReady = containerRuntimeReady
agentConfig.Debug = app.GlobalBool("debug") agentConfig.Debug = app.Bool("debug")
agentConfig.DataDir = filepath.Dir(serverConfig.ControlConfig.DataDir) agentConfig.DataDir = filepath.Dir(serverConfig.ControlConfig.DataDir)
agentConfig.ServerURL = url agentConfig.ServerURL = url
agentConfig.Token = token agentConfig.Token = token
......
...@@ -21,7 +21,7 @@ import ( ...@@ -21,7 +21,7 @@ import (
"github.com/k3s-io/k3s/pkg/util" "github.com/k3s-io/k3s/pkg/util"
"github.com/k3s-io/k3s/pkg/version" "github.com/k3s-io/k3s/pkg/version"
pkgerrors "github.com/pkg/errors" pkgerrors "github.com/pkg/errors"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
"gopkg.in/yaml.v2" "gopkg.in/yaml.v2"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/fields"
...@@ -70,8 +70,8 @@ func create(app *cli.Context, cfg *cmds.Token) error { ...@@ -70,8 +70,8 @@ func create(app *cli.Context, cfg *cmds.Token) error {
Token: bts, Token: bts,
Description: cfg.Description, Description: cfg.Description,
TTL: &metav1.Duration{Duration: cfg.TTL}, TTL: &metav1.Duration{Duration: cfg.TTL},
Usages: cfg.Usages, Usages: cfg.Usages.Value(),
Groups: cfg.Groups, Groups: cfg.Groups.Value(),
} }
secretName := bootstraputil.BootstrapTokenSecretName(bt.Token.ID) secretName := bootstraputil.BootstrapTokenSecretName(bt.Token.ID)
...@@ -102,7 +102,7 @@ func Delete(app *cli.Context) error { ...@@ -102,7 +102,7 @@ func Delete(app *cli.Context) error {
func delete(app *cli.Context, cfg *cmds.Token) error { func delete(app *cli.Context, cfg *cmds.Token) error {
args := app.Args() args := app.Args()
if len(args) < 1 { if args.Len() < 1 {
return errors.New("missing argument; 'token delete' is missing token") return errors.New("missing argument; 'token delete' is missing token")
} }
...@@ -112,7 +112,7 @@ func delete(app *cli.Context, cfg *cmds.Token) error { ...@@ -112,7 +112,7 @@ func delete(app *cli.Context, cfg *cmds.Token) error {
return err return err
} }
for _, token := range args { for _, token := range args.Slice() {
if !bootstraputil.IsValidBootstrapTokenID(token) { if !bootstraputil.IsValidBootstrapTokenID(token) {
bts, err := kubeadm.NewBootstrapTokenString(cfg.Token) bts, err := kubeadm.NewBootstrapTokenString(cfg.Token)
if err != nil { if err != nil {
......
...@@ -7,7 +7,7 @@ import ( ...@@ -7,7 +7,7 @@ import (
"github.com/k3s-io/k3s/pkg/cli/cmds" "github.com/k3s-io/k3s/pkg/cli/cmds"
"github.com/k3s-io/k3s/pkg/version" "github.com/k3s-io/k3s/pkg/version"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
var DefaultParser = &Parser{ var DefaultParser = &Parser{
......
...@@ -14,7 +14,7 @@ import ( ...@@ -14,7 +14,7 @@ import (
"github.com/k3s-io/k3s/pkg/agent/util" "github.com/k3s-io/k3s/pkg/agent/util"
"github.com/rancher/wrangler/v3/pkg/data/convert" "github.com/rancher/wrangler/v3/pkg/data/convert"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
"gopkg.in/yaml.v2" "gopkg.in/yaml.v2"
) )
...@@ -76,7 +76,7 @@ func (p *Parser) stripInvalidFlags(command string, args []string) ([]string, err ...@@ -76,7 +76,7 @@ func (p *Parser) stripInvalidFlags(command string, args []string) ([]string, err
validFlags := make(map[string]bool, len(cmdFlags)) validFlags := make(map[string]bool, len(cmdFlags))
for _, f := range cmdFlags { for _, f := range cmdFlags {
//split flags with aliases into 2 entries //split flags with aliases into 2 entries
for _, s := range strings.Split(f.GetName(), ",") { for _, s := range f.Names() {
validFlags[s] = true validFlags[s] = true
} }
} }
......
...@@ -5,7 +5,7 @@ import ( ...@@ -5,7 +5,7 @@ import (
"github.com/k3s-io/k3s/pkg/cli/cmds" "github.com/k3s-io/k3s/pkg/cli/cmds"
"github.com/k3s-io/k3s/pkg/version" "github.com/k3s-io/k3s/pkg/version"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
bootstrapapi "k8s.io/cluster-bootstrap/token/api" bootstrapapi "k8s.io/cluster-bootstrap/token/api"
bootstraputil "k8s.io/cluster-bootstrap/token/util" bootstraputil "k8s.io/cluster-bootstrap/token/util"
) )
...@@ -19,11 +19,11 @@ var ( ...@@ -19,11 +19,11 @@ var (
// importing the cluster-bootstrap packages into the CLI. // importing the cluster-bootstrap packages into the CLI.
func SetDefaults(clx *cli.Context, cfg *cmds.Token) error { func SetDefaults(clx *cli.Context, cfg *cmds.Token) error {
if !clx.IsSet("groups") { if !clx.IsSet("groups") {
cfg.Groups = []string{NodeBootstrapTokenAuthGroup} cfg.Groups = *cli.NewStringSlice(NodeBootstrapTokenAuthGroup)
} }
if !clx.IsSet("usages") { if !clx.IsSet("usages") {
cfg.Usages = bootstrapapi.KnownTokenUsages cfg.Usages = *cli.NewStringSlice(bootstrapapi.KnownTokenUsages...)
} }
if cfg.Output == "" { if cfg.Output == "" {
...@@ -36,9 +36,8 @@ func SetDefaults(clx *cli.Context, cfg *cmds.Token) error { ...@@ -36,9 +36,8 @@ func SetDefaults(clx *cli.Context, cfg *cmds.Token) error {
} }
} }
args := clx.Args() if clx.Args().Len() > 0 {
if len(args) > 0 { cfg.Token = clx.Args().Get(0)
cfg.Token = args[0]
} }
if cfg.Token == "" { if cfg.Token == "" {
......
...@@ -63,8 +63,11 @@ func GetUserAgent(controllerName string) string { ...@@ -63,8 +63,11 @@ func GetUserAgent(controllerName string) string {
} }
// SplitStringSlice is a helper function to handle StringSliceFlag containing multiple values // SplitStringSlice is a helper function to handle StringSliceFlag containing multiple values
// By default, StringSliceFlag only supports repeated values, not multiple values // By default, StringSliceFlag supports repeated values, and multiple values, seperated by a comma
// e.g. --foo="bar,car" --foo=baz will result in []string{"bar", "car". "baz"} // e.g. --foo="bar,car" --foo=baz will result in []string{"bar", "car". "baz"}
// However, we disable this with urfave/cli/v2, as controls are not granular enough. You can either have all flags
// support comma separated values, or no flags. We can't have all flags support comma separated values
// because our kube-XXX-arg flags need to pass the value "as is" to the kubelet/kube-apiserver etc.
func SplitStringSlice(ss []string) []string { func SplitStringSlice(ss []string) []string {
result := []string{} result := []string{}
for _, s := range ss { for _, s := range ss {
......
...@@ -4,34 +4,34 @@ import ( ...@@ -4,34 +4,34 @@ import (
"reflect" "reflect"
"testing" "testing"
"github.com/urfave/cli" "github.com/urfave/cli/v2"
) )
func Test_UnitSplitSliceString(t *testing.T) { func Test_UnitSplitSliceString(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
arg cli.StringSlice arg *cli.StringSlice
want []string want []string
}{ }{
{ {
name: "Single Argument", name: "Single Argument",
arg: cli.StringSlice{"foo"}, arg: cli.NewStringSlice("foo"),
want: []string{"foo"}, want: []string{"foo"},
}, },
{ {
name: "Repeated Arguments", name: "Repeated Arguments",
arg: cli.StringSlice{"foo", "bar", "baz"}, arg: cli.NewStringSlice("foo", "bar", "baz"),
want: []string{"foo", "bar", "baz"}, want: []string{"foo", "bar", "baz"},
}, },
{ {
name: "Multiple Arguments and Repeated Arguments", name: "Multiple Arguments and Repeated Arguments",
arg: cli.StringSlice{"foo,bar", "zoo,clar", "baz"}, arg: cli.NewStringSlice("foo,bar", "zoo,clar", "baz"),
want: []string{"foo", "bar", "zoo", "clar", "baz"}, want: []string{"foo", "bar", "zoo", "clar", "baz"},
}, },
} }
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
if got := SplitStringSlice(tt.arg); !reflect.DeepEqual(got, tt.want) { if got := SplitStringSlice(tt.arg.Value()); !reflect.DeepEqual(got, tt.want) {
t.Errorf("SplitSliceString() = %+v\nWant = %+v", got, tt.want) t.Errorf("SplitSliceString() = %+v\nWant = %+v", got, tt.want)
} }
}) })
......
...@@ -11,7 +11,6 @@ import ( ...@@ -11,7 +11,6 @@ import (
"github.com/rancher/wrangler/v3/pkg/merr" "github.com/rancher/wrangler/v3/pkg/merr"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/urfave/cli"
apinet "k8s.io/apimachinery/pkg/util/net" apinet "k8s.io/apimachinery/pkg/util/net"
netutils "k8s.io/utils/net" netutils "k8s.io/utils/net"
) )
...@@ -137,7 +136,7 @@ func JoinIP6Nets(elems []*net.IPNet) string { ...@@ -137,7 +136,7 @@ func JoinIP6Nets(elems []*net.IPNet) string {
// GetHostnameAndIPs takes a node name and list of IPs, usually from CLI args. // GetHostnameAndIPs takes a node name and list of IPs, usually from CLI args.
// If set, these are used to return the node's name and addresses. If not set, // If set, these are used to return the node's name and addresses. If not set,
// the system hostname and primary interface addresses are returned instead. // the system hostname and primary interface addresses are returned instead.
func GetHostnameAndIPs(name string, nodeIPs cli.StringSlice) (string, []net.IP, error) { func GetHostnameAndIPs(name string, nodeIPs []string) (string, []net.IP, error) {
ips := []net.IP{} ips := []net.IP{}
if len(nodeIPs) == 0 { if len(nodeIPs) == 0 {
hostIP, err := apinet.ChooseHostInterface() hostIP, err := apinet.ChooseHostInterface()
...@@ -177,7 +176,7 @@ func GetHostnameAndIPs(name string, nodeIPs cli.StringSlice) (string, []net.IP, ...@@ -177,7 +176,7 @@ func GetHostnameAndIPs(name string, nodeIPs cli.StringSlice) (string, []net.IP,
// ParseStringSliceToIPs converts slice of strings that in turn can be lists of comma separated unparsed IP addresses // ParseStringSliceToIPs converts slice of strings that in turn can be lists of comma separated unparsed IP addresses
// into a single slice of net.IP, it returns error if at any point parsing failed // into a single slice of net.IP, it returns error if at any point parsing failed
func ParseStringSliceToIPs(s cli.StringSlice) ([]net.IP, error) { func ParseStringSliceToIPs(s []string) ([]net.IP, error) {
var ips []net.IP var ips []net.IP
for _, unparsedIP := range s { for _, unparsedIP := range s {
for _, v := range strings.Split(unparsedIP, ",") { for _, v := range strings.Split(unparsedIP, ",") {
...@@ -194,7 +193,7 @@ func ParseStringSliceToIPs(s cli.StringSlice) ([]net.IP, error) { ...@@ -194,7 +193,7 @@ func ParseStringSliceToIPs(s cli.StringSlice) ([]net.IP, error) {
// GetFirstValidIPString returns the first valid address from a list of IP address strings, // GetFirstValidIPString returns the first valid address from a list of IP address strings,
// without preference for IP family. If no address are found, an empty string is returned. // without preference for IP family. If no address are found, an empty string is returned.
func GetFirstValidIPString(s cli.StringSlice) string { func GetFirstValidIPString(s []string) string {
for _, unparsedIP := range s { for _, unparsedIP := range s {
for _, v := range strings.Split(unparsedIP, ",") { for _, v := range strings.Split(unparsedIP, ",") {
if ip := net.ParseIP(v); ip != nil { if ip := net.ParseIP(v); ip != nil {
......
...@@ -4,14 +4,12 @@ import ( ...@@ -4,14 +4,12 @@ import (
"net" "net"
"reflect" "reflect"
"testing" "testing"
"github.com/urfave/cli"
) )
func Test_UnitParseStringSliceToIPs(t *testing.T) { func Test_UnitParseStringSliceToIPs(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
arg cli.StringSlice arg []string
want []net.IP want []net.IP
wantErr bool wantErr bool
}{ }{
...@@ -22,17 +20,17 @@ func Test_UnitParseStringSliceToIPs(t *testing.T) { ...@@ -22,17 +20,17 @@ func Test_UnitParseStringSliceToIPs(t *testing.T) {
}, },
{ {
name: "empty string slice must return no errors", name: "empty string slice must return no errors",
arg: cli.StringSlice{}, arg: []string{},
want: nil, want: nil,
}, },
{ {
name: "single element slice with correct IP must succeed", name: "single element slice with correct IP must succeed",
arg: cli.StringSlice{"10.10.10.10"}, arg: []string{"10.10.10.10"},
want: []net.IP{net.ParseIP("10.10.10.10")}, want: []net.IP{net.ParseIP("10.10.10.10")},
}, },
{ {
name: "single element slice with correct IP list must succeed", name: "single element slice with correct IP list must succeed",
arg: cli.StringSlice{"10.10.10.10,10.10.10.11"}, arg: []string{"10.10.10.10,10.10.10.11"},
want: []net.IP{ want: []net.IP{
net.ParseIP("10.10.10.10"), net.ParseIP("10.10.10.10"),
net.ParseIP("10.10.10.11"), net.ParseIP("10.10.10.11"),
...@@ -40,7 +38,7 @@ func Test_UnitParseStringSliceToIPs(t *testing.T) { ...@@ -40,7 +38,7 @@ func Test_UnitParseStringSliceToIPs(t *testing.T) {
}, },
{ {
name: "multi element slice with correct IP list must succeed", name: "multi element slice with correct IP list must succeed",
arg: cli.StringSlice{"10.10.10.10,10.10.10.11", "10.10.10.12,10.10.10.13"}, arg: []string{"10.10.10.10,10.10.10.11", "10.10.10.12,10.10.10.13"},
want: []net.IP{ want: []net.IP{
net.ParseIP("10.10.10.10"), net.ParseIP("10.10.10.10"),
net.ParseIP("10.10.10.11"), net.ParseIP("10.10.10.11"),
...@@ -50,19 +48,19 @@ func Test_UnitParseStringSliceToIPs(t *testing.T) { ...@@ -50,19 +48,19 @@ func Test_UnitParseStringSliceToIPs(t *testing.T) {
}, },
{ {
name: "single element slice with correct IP list with trailing comma must fail", name: "single element slice with correct IP list with trailing comma must fail",
arg: cli.StringSlice{"10.10.10.10,"}, arg: []string{"10.10.10.10,"},
want: nil, want: nil,
wantErr: true, wantErr: true,
}, },
{ {
name: "single element slice with incorrect IP (overflow) must fail", name: "single element slice with incorrect IP (overflow) must fail",
arg: cli.StringSlice{"10.10.10.256"}, arg: []string{"10.10.10.256"},
want: nil, want: nil,
wantErr: true, wantErr: true,
}, },
{ {
name: "single element slice with incorrect IP (foreign symbols) must fail", name: "single element slice with incorrect IP (foreign symbols) must fail",
arg: cli.StringSlice{"xxx.yyy.zzz.www"}, arg: []string{"xxx.yyy.zzz.www"},
want: nil, want: nil,
wantErr: true, wantErr: true,
}, },
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment