Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
a145cf81
Unverified
Commit
a145cf81
authored
Aug 25, 2017
by
Lucas Käldström
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
kubeadm: Resolve tech debt; move commonly used funcs to a general package instead of duplicating
parent
59a63be0
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
120 additions
and
68 deletions
+120
-68
BUILD
cmd/kubeadm/app/BUILD
+1
-0
BUILD
cmd/kubeadm/app/cmd/BUILD
+4
-0
cmd.go
cmd/kubeadm/app/cmd/cmd.go
+2
-16
config.go
cmd/kubeadm/app/cmd/config.go
+3
-2
BUILD
cmd/kubeadm/app/cmd/phases/BUILD
+1
-1
bootstraptoken.go
cmd/kubeadm/app/cmd/phases/bootstraptoken.go
+4
-3
certs.go
cmd/kubeadm/app/cmd/phases/certs.go
+2
-1
controlplane.go
cmd/kubeadm/app/cmd/phases/controlplane.go
+2
-1
etcd.go
cmd/kubeadm/app/cmd/phases/etcd.go
+2
-1
kubeconfig.go
cmd/kubeadm/app/cmd/phases/kubeconfig.go
+2
-1
markmaster.go
cmd/kubeadm/app/cmd/phases/markmaster.go
+2
-1
phase.go
cmd/kubeadm/app/cmd/phases/phase.go
+2
-36
preflight.go
cmd/kubeadm/app/cmd/phases/preflight.go
+2
-1
selfhosting.go
cmd/kubeadm/app/cmd/phases/selfhosting.go
+2
-1
token.go
cmd/kubeadm/app/cmd/token.go
+2
-1
BUILD
cmd/kubeadm/app/cmd/util/BUILD
+28
-0
cmdutil.go
cmd/kubeadm/app/cmd/util/cmdutil.go
+57
-0
cmdutil_test.go
cmd/kubeadm/app/cmd/util/cmdutil_test.go
+2
-2
No files found.
cmd/kubeadm/app/BUILD
View file @
a145cf81
...
...
@@ -46,6 +46,7 @@ filegroup(
"//cmd/kubeadm/app/phases/markmaster:all-srcs",
"//cmd/kubeadm/app/phases/selfhosting:all-srcs",
"//cmd/kubeadm/app/phases/token:all-srcs",
"//cmd/kubeadm/app/phases/upgrade:all-srcs",
"//cmd/kubeadm/app/phases/uploadconfig:all-srcs",
"//cmd/kubeadm/app/preflight:all-srcs",
"//cmd/kubeadm/app/util:all-srcs",
...
...
cmd/kubeadm/app/cmd/BUILD
View file @
a145cf81
...
...
@@ -23,6 +23,8 @@ go_library(
"//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library",
"//cmd/kubeadm/app/apis/kubeadm/validation:go_default_library",
"//cmd/kubeadm/app/cmd/phases:go_default_library",
"//cmd/kubeadm/app/cmd/upgrade:go_default_library",
"//cmd/kubeadm/app/cmd/util:go_default_library",
"//cmd/kubeadm/app/constants:go_default_library",
"//cmd/kubeadm/app/discovery:go_default_library",
"//cmd/kubeadm/app/features:go_default_library",
...
...
@@ -95,6 +97,8 @@ filegroup(
srcs = [
":package-srcs",
"//cmd/kubeadm/app/cmd/phases:all-srcs",
"//cmd/kubeadm/app/cmd/upgrade:all-srcs",
"//cmd/kubeadm/app/cmd/util:all-srcs",
],
tags = ["automanaged"],
)
cmd/kubeadm/app/cmd/cmd.go
View file @
a145cf81
...
...
@@ -17,7 +17,6 @@ limitations under the License.
package
cmd
import
(
"fmt"
"io"
"github.com/renstrom/dedent"
...
...
@@ -25,6 +24,7 @@ import (
"k8s.io/apiserver/pkg/util/flag"
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases"
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/upgrade"
cmdutil
"k8s.io/kubernetes/pkg/kubectl/cmd/util"
)
...
...
@@ -75,6 +75,7 @@ func NewKubeadmCommand(f cmdutil.Factory, in io.Reader, out, err io.Writer) *cob
cmds
.
AddCommand
(
NewCmdReset
(
out
))
cmds
.
AddCommand
(
NewCmdVersion
(
out
))
cmds
.
AddCommand
(
NewCmdToken
(
out
,
err
))
cmds
.
AddCommand
(
upgrade
.
NewCmdUpgrade
(
out
))
// Wrap not yet fully supported commands in an alpha subcommand
experimentalCmd
:=
&
cobra
.
Command
{
...
...
@@ -86,18 +87,3 @@ func NewKubeadmCommand(f cmdutil.Factory, in io.Reader, out, err io.Writer) *cob
return
cmds
}
// subCmdRunE returns a function that handles a case where a subcommand must be specified
// Without this callback, if a user runs just the command without a subcommand,
// or with an invalid subcommand, cobra will print usage information, but still exit cleanly.
// We want to return an error code in these cases so that the
// user knows that their command was invalid.
func
subCmdRunE
(
name
string
)
func
(
*
cobra
.
Command
,
[]
string
)
error
{
return
func
(
_
*
cobra
.
Command
,
args
[]
string
)
error
{
if
len
(
args
)
<
1
{
return
fmt
.
Errorf
(
"missing subcommand; %q is not meant to be run on its own"
,
name
)
}
return
fmt
.
Errorf
(
"invalid subcommand: %q"
,
args
[
0
])
}
}
cmd/kubeadm/app/cmd/config.go
View file @
a145cf81
...
...
@@ -26,6 +26,7 @@ import (
metav1
"k8s.io/apimachinery/pkg/apis/meta/v1"
clientset
"k8s.io/client-go/kubernetes"
kubeadmapiext
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1"
cmdutil
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
"k8s.io/kubernetes/cmd/kubeadm/app/features"
"k8s.io/kubernetes/cmd/kubeadm/app/phases/uploadconfig"
...
...
@@ -52,7 +53,7 @@ func NewCmdConfig(out io.Writer) *cobra.Command {
// cobra will print usage information, but still exit cleanly.
// We want to return an error code in these cases so that the
// user knows that their command was invalid.
RunE
:
s
ubCmdRunE
(
"config"
),
RunE
:
cmdutil
.
S
ubCmdRunE
(
"config"
),
}
cmd
.
PersistentFlags
()
.
StringVar
(
&
kubeConfigFile
,
"kubeconfig"
,
"/etc/kubernetes/admin.conf"
,
"The KubeConfig file to use for talking to the cluster"
)
...
...
@@ -67,7 +68,7 @@ func NewCmdConfigUpload(out io.Writer, kubeConfigFile *string) *cobra.Command {
cmd
:=
&
cobra
.
Command
{
Use
:
"upload"
,
Short
:
"Upload configuration about the current state so 'kubeadm upgrade' later can know how to configure the upgraded cluster"
,
RunE
:
s
ubCmdRunE
(
"upload"
),
RunE
:
cmdutil
.
S
ubCmdRunE
(
"upload"
),
}
cmd
.
AddCommand
(
NewCmdConfigUploadFromFile
(
out
,
kubeConfigFile
))
...
...
cmd/kubeadm/app/cmd/phases/BUILD
View file @
a145cf81
...
...
@@ -25,6 +25,7 @@ go_library(
"//cmd/kubeadm/app/apis/kubeadm:go_default_library",
"//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library",
"//cmd/kubeadm/app/apis/kubeadm/validation:go_default_library",
"//cmd/kubeadm/app/cmd/util:go_default_library",
"//cmd/kubeadm/app/constants:go_default_library",
"//cmd/kubeadm/app/features:go_default_library",
"//cmd/kubeadm/app/phases/bootstraptoken/clusterinfo:go_default_library",
...
...
@@ -54,7 +55,6 @@ go_test(
"controlplane_test.go",
"etcd_test.go",
"kubeconfig_test.go",
"phase_test.go",
],
library = ":go_default_library",
deps = [
...
...
cmd/kubeadm/app/cmd/phases/bootstraptoken.go
View file @
a145cf81
...
...
@@ -22,6 +22,7 @@ import (
"github.com/spf13/cobra"
clientset
"k8s.io/client-go/kubernetes"
cmdutil
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
"k8s.io/kubernetes/cmd/kubeadm/app/phases/bootstraptoken/clusterinfo"
"k8s.io/kubernetes/cmd/kubeadm/app/phases/bootstraptoken/node"
kubeadmutil
"k8s.io/kubernetes/cmd/kubeadm/app/util"
...
...
@@ -36,7 +37,7 @@ func NewCmdBootstrapToken() *cobra.Command {
Use
:
"bootstrap-token"
,
Short
:
"Manage kubeadm-specific Bootstrap Token functions."
,
Aliases
:
[]
string
{
"bootstraptoken"
},
RunE
:
s
ubCmdRunE
(
"bootstrap-token"
),
RunE
:
cmdutil
.
S
ubCmdRunE
(
"bootstrap-token"
),
}
cmd
.
PersistentFlags
()
.
StringVar
(
&
kubeConfigFile
,
"kubeconfig"
,
"/etc/kubernetes/admin.conf"
,
"The KubeConfig file to use for talking to the cluster"
)
...
...
@@ -55,7 +56,7 @@ func NewSubCmdClusterInfo(kubeConfigFile *string) *cobra.Command {
Short
:
"Uploads and exposes the cluster-info ConfigMap publicly from the given cluster-info file"
,
Aliases
:
[]
string
{
"clusterinfo"
},
Run
:
func
(
cmd
*
cobra
.
Command
,
args
[]
string
)
{
err
:=
v
alidateExactArgNumber
(
args
,
[]
string
{
"clusterinfo-file"
})
err
:=
cmdutil
.
V
alidateExactArgNumber
(
args
,
[]
string
{
"clusterinfo-file"
})
kubeadmutil
.
CheckErr
(
err
)
client
,
err
:=
kubeconfigutil
.
ClientSetFromFile
(
*
kubeConfigFile
)
...
...
@@ -81,7 +82,7 @@ func NewSubCmdNodeBootstrapToken(kubeConfigFile *string) *cobra.Command {
Use
:
"node"
,
Short
:
"Manages Node Bootstrap Tokens"
,
Aliases
:
[]
string
{
"clusterinfo"
},
RunE
:
s
ubCmdRunE
(
"node"
),
RunE
:
cmdutil
.
S
ubCmdRunE
(
"node"
),
}
cmd
.
AddCommand
(
NewSubCmdNodeBootstrapTokenPostCSRs
(
kubeConfigFile
))
...
...
cmd/kubeadm/app/cmd/phases/certs.go
View file @
a145cf81
...
...
@@ -22,6 +22,7 @@ import (
kubeadmapi
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
kubeadmapiext
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1"
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation"
cmdutil
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
certsphase
"k8s.io/kubernetes/cmd/kubeadm/app/phases/certs"
kubeadmutil
"k8s.io/kubernetes/cmd/kubeadm/app/util"
configutil
"k8s.io/kubernetes/cmd/kubeadm/app/util/config"
...
...
@@ -34,7 +35,7 @@ func NewCmdCerts() *cobra.Command {
Use
:
"certs"
,
Aliases
:
[]
string
{
"certificates"
},
Short
:
"Generate certificates for a Kubernetes cluster."
,
RunE
:
s
ubCmdRunE
(
"certs"
),
RunE
:
cmdutil
.
S
ubCmdRunE
(
"certs"
),
}
cmd
.
AddCommand
(
getCertsSubCommands
()
...
)
...
...
cmd/kubeadm/app/cmd/phases/controlplane.go
View file @
a145cf81
...
...
@@ -21,6 +21,7 @@ import (
kubeadmapi
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
kubeadmapiext
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1"
cmdutil
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
kubeadmconstants
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
controlplanephase
"k8s.io/kubernetes/cmd/kubeadm/app/phases/controlplane"
"k8s.io/kubernetes/pkg/api"
...
...
@@ -31,7 +32,7 @@ func NewCmdControlplane() *cobra.Command {
cmd
:=
&
cobra
.
Command
{
Use
:
"controlplane"
,
Short
:
"Generate all static pod manifest files necessary to establish the control plane."
,
RunE
:
s
ubCmdRunE
(
"controlplane"
),
RunE
:
cmdutil
.
S
ubCmdRunE
(
"controlplane"
),
}
manifestPath
:=
kubeadmconstants
.
GetStaticPodDirectory
()
...
...
cmd/kubeadm/app/cmd/phases/etcd.go
View file @
a145cf81
...
...
@@ -21,6 +21,7 @@ import (
kubeadmapi
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
kubeadmapiext
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1"
cmdutil
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
kubeadmconstants
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
etcdphase
"k8s.io/kubernetes/cmd/kubeadm/app/phases/etcd"
"k8s.io/kubernetes/pkg/api"
...
...
@@ -31,7 +32,7 @@ func NewCmdEtcd() *cobra.Command {
cmd
:=
&
cobra
.
Command
{
Use
:
"etcd"
,
Short
:
"Generate static pod manifest file for etcd."
,
RunE
:
s
ubCmdRunE
(
"etcd"
),
RunE
:
cmdutil
.
S
ubCmdRunE
(
"etcd"
),
}
manifestPath
:=
kubeadmconstants
.
GetStaticPodDirectory
()
...
...
cmd/kubeadm/app/cmd/phases/kubeconfig.go
View file @
a145cf81
...
...
@@ -24,6 +24,7 @@ import (
kubeadmapi
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
kubeadmapiext
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1"
cmdutil
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
kubeadmconstants
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
kubeconfigphase
"k8s.io/kubernetes/cmd/kubeadm/app/phases/kubeconfig"
"k8s.io/kubernetes/pkg/api"
...
...
@@ -34,7 +35,7 @@ func NewCmdKubeConfig(out io.Writer) *cobra.Command {
cmd
:=
&
cobra
.
Command
{
Use
:
"kubeconfig"
,
Short
:
"Generate all kubeconfig files necessary to establish the control plane and the admin kubeconfig file."
,
RunE
:
s
ubCmdRunE
(
"kubeconfig"
),
RunE
:
cmdutil
.
S
ubCmdRunE
(
"kubeconfig"
),
}
cmd
.
AddCommand
(
getKubeConfigSubCommands
(
out
,
kubeadmconstants
.
KubernetesDir
)
...
)
...
...
cmd/kubeadm/app/cmd/phases/markmaster.go
View file @
a145cf81
...
...
@@ -19,6 +19,7 @@ package phases
import
(
"github.com/spf13/cobra"
cmdutil
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
markmasterphase
"k8s.io/kubernetes/cmd/kubeadm/app/phases/markmaster"
kubeadmutil
"k8s.io/kubernetes/cmd/kubeadm/app/util"
kubeconfigutil
"k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig"
...
...
@@ -32,7 +33,7 @@ func NewCmdMarkMaster() *cobra.Command {
Short
:
"Mark a node as master."
,
Aliases
:
[]
string
{
"markmaster"
},
RunE
:
func
(
_
*
cobra
.
Command
,
args
[]
string
)
error
{
err
:=
v
alidateExactArgNumber
(
args
,
[]
string
{
"node-name"
})
err
:=
cmdutil
.
V
alidateExactArgNumber
(
args
,
[]
string
{
"node-name"
})
kubeadmutil
.
CheckErr
(
err
)
client
,
err
:=
kubeconfigutil
.
ClientSetFromFile
(
kubeConfigFile
)
...
...
cmd/kubeadm/app/cmd/phases/phase.go
View file @
a145cf81
...
...
@@ -17,10 +17,10 @@ limitations under the License.
package
phases
import
(
"fmt"
"io"
"github.com/spf13/cobra"
cmdutil
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
)
// NewCmdPhase returns the cobra command for the "kubeadm phase" command (currently alpha-gated)
...
...
@@ -28,7 +28,7 @@ func NewCmdPhase(out io.Writer) *cobra.Command {
cmd
:=
&
cobra
.
Command
{
Use
:
"phase"
,
Short
:
"Invoke subsets of kubeadm functions separately for a manual install."
,
RunE
:
s
ubCmdRunE
(
"phase"
),
RunE
:
cmdutil
.
S
ubCmdRunE
(
"phase"
),
}
cmd
.
AddCommand
(
NewCmdBootstrapToken
())
...
...
@@ -43,37 +43,3 @@ func NewCmdPhase(out io.Writer) *cobra.Command {
return
cmd
}
// subCmdRunE returns a function that handles a case where a subcommand must be specified
// Without this callback, if a user runs just the command without a subcommand,
// or with an invalid subcommand, cobra will print usage information, but still exit cleanly.
// We want to return an error code in these cases so that the
// user knows that their command was invalid.
func
subCmdRunE
(
name
string
)
func
(
*
cobra
.
Command
,
[]
string
)
error
{
return
func
(
_
*
cobra
.
Command
,
args
[]
string
)
error
{
if
len
(
args
)
<
1
{
return
fmt
.
Errorf
(
"missing subcommand; %q is not meant to be run on its own"
,
name
)
}
return
fmt
.
Errorf
(
"invalid subcommand: %q"
,
args
[
0
])
}
}
// validateExactArgNumber validates that the required top-level arguments are specified
func
validateExactArgNumber
(
args
[]
string
,
supportedArgs
[]
string
)
error
{
validArgs
:=
0
// Disregard possible "" arguments; they are invalid
for
_
,
arg
:=
range
args
{
if
len
(
arg
)
>
0
{
validArgs
++
}
}
if
validArgs
<
len
(
supportedArgs
)
{
return
fmt
.
Errorf
(
"missing one or more required arguments. Required arguments: %v"
,
supportedArgs
)
}
if
validArgs
>
len
(
supportedArgs
)
{
return
fmt
.
Errorf
(
"too many arguments, only %d argument(s) supported: %v"
,
validArgs
,
supportedArgs
)
}
return
nil
}
cmd/kubeadm/app/cmd/phases/preflight.go
View file @
a145cf81
...
...
@@ -20,6 +20,7 @@ import (
"github.com/spf13/cobra"
kubeadmapi
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
cmdutil
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
"k8s.io/kubernetes/cmd/kubeadm/app/preflight"
)
...
...
@@ -27,7 +28,7 @@ func NewCmdPreFlight() *cobra.Command {
cmd
:=
&
cobra
.
Command
{
Use
:
"preflight"
,
Short
:
"Run pre-flight checks"
,
RunE
:
s
ubCmdRunE
(
"preflight"
),
RunE
:
cmdutil
.
S
ubCmdRunE
(
"preflight"
),
}
cmd
.
AddCommand
(
NewCmdPreFlightMaster
())
...
...
cmd/kubeadm/app/cmd/phases/selfhosting.go
View file @
a145cf81
...
...
@@ -29,6 +29,7 @@ import (
configutil
"k8s.io/kubernetes/cmd/kubeadm/app/util/config"
kubeconfigutil
"k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig"
"k8s.io/kubernetes/pkg/api"
cmdutil
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
)
// NewCmdSelfhosting returns the self-hosting Cobra command
...
...
@@ -37,7 +38,7 @@ func NewCmdSelfhosting() *cobra.Command {
Use
:
"selfhosting"
,
Aliases
:
[]
string
{
"selfhosted"
},
Short
:
"Make a kubeadm cluster self-hosted."
,
RunE
:
s
ubCmdRunE
(
"selfhosting"
),
RunE
:
cmdutil
.
S
ubCmdRunE
(
"selfhosting"
),
}
cmd
.
AddCommand
(
getSelfhostingSubCommand
())
...
...
cmd/kubeadm/app/cmd/token.go
View file @
a145cf81
...
...
@@ -33,6 +33,7 @@ import (
"k8s.io/apimachinery/pkg/fields"
clientset
"k8s.io/client-go/kubernetes"
kubeadmapi
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
cmdutil
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
kubeadmconstants
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
tokenphase
"k8s.io/kubernetes/cmd/kubeadm/app/phases/bootstraptoken/node"
kubeadmutil
"k8s.io/kubernetes/cmd/kubeadm/app/util"
...
...
@@ -77,7 +78,7 @@ func NewCmdToken(out io.Writer, errW io.Writer) *cobra.Command {
// cobra will print usage information, but still exit cleanly.
// We want to return an error code in these cases so that the
// user knows that their command was invalid.
RunE
:
s
ubCmdRunE
(
"token"
),
RunE
:
cmdutil
.
S
ubCmdRunE
(
"token"
),
}
tokenCmd
.
PersistentFlags
()
.
StringVar
(
&
kubeConfigFile
,
...
...
cmd/kubeadm/app/cmd/util/BUILD
0 → 100644
View file @
a145cf81
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
go_library(
name = "go_default_library",
srcs = ["cmdutil.go"],
visibility = ["//visibility:public"],
deps = ["//vendor/github.com/spf13/cobra:go_default_library"],
)
go_test(
name = "go_default_test",
srcs = ["cmdutil_test.go"],
library = ":go_default_library",
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
cmd/kubeadm/app/cmd/util/cmdutil.go
0 → 100644
View file @
a145cf81
/*
Copyright 2017 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package
phases
import
(
"fmt"
"github.com/spf13/cobra"
)
// SubCmdRunE returns a function that handles a case where a subcommand must be specified
// Without this callback, if a user runs just the command without a subcommand,
// or with an invalid subcommand, cobra will print usage information, but still exit cleanly.
// We want to return an error code in these cases so that the
// user knows that their command was invalid.
func
SubCmdRunE
(
name
string
)
func
(
*
cobra
.
Command
,
[]
string
)
error
{
return
func
(
_
*
cobra
.
Command
,
args
[]
string
)
error
{
if
len
(
args
)
<
1
{
return
fmt
.
Errorf
(
"missing subcommand; %q is not meant to be run on its own"
,
name
)
}
return
fmt
.
Errorf
(
"invalid subcommand: %q"
,
args
[
0
])
}
}
// ValidateExactArgNumber validates that the required top-level arguments are specified
func
ValidateExactArgNumber
(
args
[]
string
,
supportedArgs
[]
string
)
error
{
validArgs
:=
0
// Disregard possible "" arguments; they are invalid
for
_
,
arg
:=
range
args
{
if
len
(
arg
)
>
0
{
validArgs
++
}
}
if
validArgs
<
len
(
supportedArgs
)
{
return
fmt
.
Errorf
(
"missing one or more required arguments. Required arguments: %v"
,
supportedArgs
)
}
if
validArgs
>
len
(
supportedArgs
)
{
return
fmt
.
Errorf
(
"too many arguments, only %d argument(s) supported: %v"
,
validArgs
,
supportedArgs
)
}
return
nil
}
cmd/kubeadm/app/cmd/
phases/phase
_test.go
→
cmd/kubeadm/app/cmd/
util/cmdutil
_test.go
View file @
a145cf81
...
...
@@ -52,10 +52,10 @@ func TestValidateExactArgNumber(t *testing.T) {
},
}
for
_
,
rt
:=
range
tests
{
actual
:=
v
alidateExactArgNumber
(
rt
.
args
,
rt
.
supportedArgs
)
actual
:=
V
alidateExactArgNumber
(
rt
.
args
,
rt
.
supportedArgs
)
if
(
actual
!=
nil
)
!=
rt
.
expectedErr
{
t
.
Errorf
(
"failed
v
alidateExactArgNumber:
\n\t
expected error: %t
\n\t
actual error: %t"
,
"failed
V
alidateExactArgNumber:
\n\t
expected error: %t
\n\t
actual error: %t"
,
rt
.
expectedErr
,
(
actual
!=
nil
),
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment