mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-31 07:20:13 +00:00
Merge pull request #3768 from deads2k/deads-make-kubectl-config-easier-alt
make kubectl config set-cluster easier to use
This commit is contained in:
commit
6ba8b7dfb2
@ -344,13 +344,13 @@ Usage:
|
|||||||
kubectl config [command]
|
kubectl config [command]
|
||||||
|
|
||||||
Available Commands:
|
Available Commands:
|
||||||
view displays the specified .kubeconfig file or a merged result
|
view displays the specified .kubeconfig file or a merged result
|
||||||
set-cluster name [server] [insecure-skip-tls-verify] [certificate-authority] [api-version] Sets a cluster entry in .kubeconfig
|
set-cluster name [--server=server] [--certificate-authority=path/to/certficate/authority] [--api-version=apiversion] [--insecure-skip-tls-verify=true] Sets a cluster entry in .kubeconfig
|
||||||
set-credentials name Sets a user entry in .kubeconfig
|
set-credentials name [--auth-path=path/to/auth/file] [--client-certificate=path/to/certficate/file] [--client-key=path/to/key/file] [--token=bearer_token_string] Sets a user entry in .kubeconfig
|
||||||
set-context name Sets a context entry in .kubeconfig
|
set-context name [--cluster=cluster-nickname] [--user=user-nickname] [--namespace=namespace] Sets a context entry in .kubeconfig
|
||||||
set property-name property-value Sets an individual value in a .kubeconfig file
|
set property-name property-value Sets an individual value in a .kubeconfig file
|
||||||
unset property-name Unsets an individual value in a .kubeconfig file
|
unset property-name Unsets an individual value in a .kubeconfig file
|
||||||
use-context context-name Sets the current-context in a .kubeconfig file
|
use-context context-name Sets the current-context in a .kubeconfig file
|
||||||
|
|
||||||
Available Flags:
|
Available Flags:
|
||||||
--alsologtostderr=false: log to standard error as well as files
|
--alsologtostderr=false: log to standard error as well as files
|
||||||
@ -440,19 +440,21 @@ Usage:
|
|||||||
|
|
||||||
#### config set-cluster
|
#### config set-cluster
|
||||||
Sets a cluster entry in .kubeconfig
|
Sets a cluster entry in .kubeconfig
|
||||||
|
Specifying a name that already exists will merge new fields on top of existing values for those fields.
|
||||||
Specifying a name that already exists overwrites that cluster entry.
|
e.g.
|
||||||
|
kubectl config set-cluster e2e --certificate-authority=~/.kube/e2e/.kubernetes.ca.cert
|
||||||
|
only sets the certificate-authority field on the e2e cluster entry without touching other values.
|
||||||
|
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
```
|
```
|
||||||
kubectl config set-cluster name [server] [insecure-skip-tls-verify] [certificate-authority] [api-version] [flags]
|
kubectl config set-cluster name [--server=server] [--certificate-authority=path/to/certficate/authority] [--api-version=apiversion] [--insecure-skip-tls-verify=true] [flags]
|
||||||
|
|
||||||
Available Flags:
|
Available Flags:
|
||||||
--alsologtostderr=false: log to standard error as well as files
|
--alsologtostderr=false: log to standard error as well as files
|
||||||
--api-version="": api-version for the cluster entry in .kubeconfig
|
--api-version=: api-version for the cluster entry in .kubeconfig
|
||||||
-a, --auth-path="": Path to the auth info file. If missing, prompt the user. Only used if using https.
|
-a, --auth-path="": Path to the auth info file. If missing, prompt the user. Only used if using https.
|
||||||
--certificate-authority="": certificate-authority for the cluster entry in .kubeconfig
|
--certificate-authority=: certificate-authority for the cluster entry in .kubeconfig
|
||||||
--client-certificate="": Path to a client key file for TLS.
|
--client-certificate="": Path to a client key file for TLS.
|
||||||
--client-key="": Path to a client key file for TLS.
|
--client-key="": Path to a client key file for TLS.
|
||||||
--cluster="": The name of the kubeconfig cluster to use
|
--cluster="": The name of the kubeconfig cluster to use
|
||||||
@ -469,7 +471,7 @@ Usage:
|
|||||||
--match-server-version=false: Require server version to match client version
|
--match-server-version=false: Require server version to match client version
|
||||||
--namespace="": If present, the namespace scope for this CLI request.
|
--namespace="": If present, the namespace scope for this CLI request.
|
||||||
--ns-path="": Path to the namespace info file that holds the namespace context to use for CLI requests.
|
--ns-path="": Path to the namespace info file that holds the namespace context to use for CLI requests.
|
||||||
--server="": server for the cluster entry in .kubeconfig
|
--server=: server for the cluster entry in .kubeconfig
|
||||||
--stderrthreshold=2: logs at or above this threshold go to stderr
|
--stderrthreshold=2: logs at or above this threshold go to stderr
|
||||||
--token="": Bearer token for authentication to the API server.
|
--token="": Bearer token for authentication to the API server.
|
||||||
--user="": The name of the kubeconfig user to use
|
--user="": The name of the kubeconfig user to use
|
||||||
@ -481,21 +483,23 @@ Usage:
|
|||||||
|
|
||||||
#### config set-credentials
|
#### config set-credentials
|
||||||
Sets a user entry in .kubeconfig
|
Sets a user entry in .kubeconfig
|
||||||
|
Specifying a name that already exists will merge new fields on top of existing values for those fields.
|
||||||
Specifying a name that already exists overwrites that user entry.
|
e.g.
|
||||||
|
kubectl config set-credentials cluster-admin --client-key=~/.kube/cluster-admin/.kubecfg.key
|
||||||
|
only sets the client-key field on the cluster-admin user entry without touching other values.
|
||||||
|
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
```
|
```
|
||||||
kubectl config set-credentials name [flags]
|
kubectl config set-credentials name [--auth-path=path/to/auth/file] [--client-certificate=path/to/certficate/file] [--client-key=path/to/key/file] [--token=bearer_token_string] [flags]
|
||||||
|
|
||||||
Available Flags:
|
Available Flags:
|
||||||
--alsologtostderr=false: log to standard error as well as files
|
--alsologtostderr=false: log to standard error as well as files
|
||||||
--api-version="": The API version to use when talking to the server
|
--api-version="": The API version to use when talking to the server
|
||||||
--auth-path="": auth-path for the user entry in .kubeconfig
|
--auth-path=: auth-path for the user entry in .kubeconfig
|
||||||
--certificate-authority="": Path to a cert. file for the certificate authority.
|
--certificate-authority="": Path to a cert. file for the certificate authority.
|
||||||
--client-certificate="": client-certificate for the user entry in .kubeconfig
|
--client-certificate=: client-certificate for the user entry in .kubeconfig
|
||||||
--client-key="": client-key for the user entry in .kubeconfig
|
--client-key=: client-key for the user entry in .kubeconfig
|
||||||
--cluster="": The name of the kubeconfig cluster to use
|
--cluster="": The name of the kubeconfig cluster to use
|
||||||
--context="": The name of the kubeconfig context to use
|
--context="": The name of the kubeconfig context to use
|
||||||
--global=false: use the .kubeconfig from /home/username
|
--global=false: use the .kubeconfig from /home/username
|
||||||
@ -512,7 +516,7 @@ Usage:
|
|||||||
--ns-path="": Path to the namespace info file that holds the namespace context to use for CLI requests.
|
--ns-path="": Path to the namespace info file that holds the namespace context to use for CLI requests.
|
||||||
-s, --server="": The address of the Kubernetes API server
|
-s, --server="": The address of the Kubernetes API server
|
||||||
--stderrthreshold=2: logs at or above this threshold go to stderr
|
--stderrthreshold=2: logs at or above this threshold go to stderr
|
||||||
--token="": token for the user entry in .kubeconfig
|
--token=: token for the user entry in .kubeconfig
|
||||||
--user="": The name of the kubeconfig user to use
|
--user="": The name of the kubeconfig user to use
|
||||||
--v=0: log level for V logs
|
--v=0: log level for V logs
|
||||||
--validate=false: If true, use a schema to validate the input before sending it
|
--validate=false: If true, use a schema to validate the input before sending it
|
||||||
@ -522,13 +526,15 @@ Usage:
|
|||||||
|
|
||||||
#### config set-context
|
#### config set-context
|
||||||
Sets a context entry in .kubeconfig
|
Sets a context entry in .kubeconfig
|
||||||
|
Specifying a name that already exists will merge new fields on top of existing values for those fields.
|
||||||
Specifying a name that already exists overwrites that context entry.
|
e.g.
|
||||||
|
kubectl config set-context gce --user=cluster-admin
|
||||||
|
only sets the user field on the gce context entry without touching other values.
|
||||||
|
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
```
|
```
|
||||||
kubectl config set-context name [flags]
|
kubectl config set-context name [--cluster=cluster-nickname] [--user=user-nickname] [--namespace=namespace] [flags]
|
||||||
|
|
||||||
Available Flags:
|
Available Flags:
|
||||||
--alsologtostderr=false: log to standard error as well as files
|
--alsologtostderr=false: log to standard error as well as files
|
||||||
@ -537,7 +543,7 @@ Usage:
|
|||||||
--certificate-authority="": Path to a cert. file for the certificate authority.
|
--certificate-authority="": Path to a cert. file for the certificate authority.
|
||||||
--client-certificate="": Path to a client key file for TLS.
|
--client-certificate="": Path to a client key file for TLS.
|
||||||
--client-key="": Path to a client key file for TLS.
|
--client-key="": Path to a client key file for TLS.
|
||||||
--cluster="": cluster for the context entry in .kubeconfig
|
--cluster=: cluster for the context entry in .kubeconfig
|
||||||
--context="": The name of the kubeconfig context to use
|
--context="": The name of the kubeconfig context to use
|
||||||
--global=false: use the .kubeconfig from /home/username
|
--global=false: use the .kubeconfig from /home/username
|
||||||
-h, --help=false: help for set-context
|
-h, --help=false: help for set-context
|
||||||
@ -549,12 +555,12 @@ Usage:
|
|||||||
--log_flush_frequency=5s: Maximum number of seconds between log flushes
|
--log_flush_frequency=5s: Maximum number of seconds between log flushes
|
||||||
--logtostderr=true: log to standard error instead of files
|
--logtostderr=true: log to standard error instead of files
|
||||||
--match-server-version=false: Require server version to match client version
|
--match-server-version=false: Require server version to match client version
|
||||||
--namespace="": namespace for the context entry in .kubeconfig
|
--namespace=: namespace for the context entry in .kubeconfig
|
||||||
--ns-path="": Path to the namespace info file that holds the namespace context to use for CLI requests.
|
--ns-path="": Path to the namespace info file that holds the namespace context to use for CLI requests.
|
||||||
-s, --server="": The address of the Kubernetes API server
|
-s, --server="": The address of the Kubernetes API server
|
||||||
--stderrthreshold=2: logs at or above this threshold go to stderr
|
--stderrthreshold=2: logs at or above this threshold go to stderr
|
||||||
--token="": Bearer token for authentication to the API server.
|
--token="": Bearer token for authentication to the API server.
|
||||||
--user="": user for the context entry in .kubeconfig
|
--user=: user for the context entry in .kubeconfig
|
||||||
--v=0: log level for V logs
|
--v=0: log level for V logs
|
||||||
--validate=false: If true, use a schema to validate the input before sending it
|
--validate=false: If true, use a schema to validate the input before sending it
|
||||||
--vmodule=: comma-separated list of pattern=N settings for file-filtered logging
|
--vmodule=: comma-separated list of pattern=N settings for file-filtered logging
|
||||||
|
@ -35,7 +35,7 @@ func newRedFederalCowHammerConfig() clientcmdapi.Config {
|
|||||||
Clusters: map[string]clientcmdapi.Cluster{
|
Clusters: map[string]clientcmdapi.Cluster{
|
||||||
"cow-cluster": {Server: "http://cow.org:8080"}},
|
"cow-cluster": {Server: "http://cow.org:8080"}},
|
||||||
Contexts: map[string]clientcmdapi.Context{
|
Contexts: map[string]clientcmdapi.Context{
|
||||||
"federal-context": {AuthInfo: "red-user", Cluster: "cow-cluster", Namespace: "hammer-ns"}},
|
"federal-context": {AuthInfo: "red-user", Cluster: "cow-cluster"}},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,11 +166,11 @@ func TestAdditionalAuth(t *testing.T) {
|
|||||||
test.run(t)
|
test.run(t)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestOverwriteExistingAuth(t *testing.T) {
|
func TestMergeExistingAuth(t *testing.T) {
|
||||||
expectedConfig := newRedFederalCowHammerConfig()
|
expectedConfig := newRedFederalCowHammerConfig()
|
||||||
authInfo := clientcmdapi.NewAuthInfo()
|
authInfo := expectedConfig.AuthInfos["red-user"]
|
||||||
authInfo.AuthPath = "auth-path"
|
authInfo.AuthPath = "auth-path"
|
||||||
expectedConfig.AuthInfos["red-user"] = *authInfo
|
expectedConfig.AuthInfos["red-user"] = authInfo
|
||||||
test := configCommandTest{
|
test := configCommandTest{
|
||||||
args: []string{"set-credentials", "red-user", "--" + clientcmd.FlagAuthPath + "=auth-path"},
|
args: []string{"set-credentials", "red-user", "--" + clientcmd.FlagAuthPath + "=auth-path"},
|
||||||
startingConfig: newRedFederalCowHammerConfig(),
|
startingConfig: newRedFederalCowHammerConfig(),
|
||||||
@ -252,14 +252,14 @@ func TestAdditionalContext(t *testing.T) {
|
|||||||
test.run(t)
|
test.run(t)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestOverwriteExistingContext(t *testing.T) {
|
func TestMergeExistingContext(t *testing.T) {
|
||||||
expectedConfig := newRedFederalCowHammerConfig()
|
expectedConfig := newRedFederalCowHammerConfig()
|
||||||
context := *clientcmdapi.NewContext()
|
context := expectedConfig.Contexts["federal-context"]
|
||||||
context.Cluster = "clustername"
|
context.Namespace = "hammer"
|
||||||
expectedConfig.Contexts["federal-context"] = context
|
expectedConfig.Contexts["federal-context"] = context
|
||||||
|
|
||||||
test := configCommandTest{
|
test := configCommandTest{
|
||||||
args: []string{"set-context", "federal-context", "--" + clientcmd.FlagClusterName + "=clustername"},
|
args: []string{"set-context", "federal-context", "--" + clientcmd.FlagNamespace + "=hammer"},
|
||||||
startingConfig: newRedFederalCowHammerConfig(),
|
startingConfig: newRedFederalCowHammerConfig(),
|
||||||
expectedConfig: expectedConfig,
|
expectedConfig: expectedConfig,
|
||||||
}
|
}
|
||||||
|
@ -25,26 +25,29 @@ import (
|
|||||||
|
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/client/clientcmd"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/client/clientcmd"
|
||||||
clientcmdapi "github.com/GoogleCloudPlatform/kubernetes/pkg/client/clientcmd/api"
|
clientcmdapi "github.com/GoogleCloudPlatform/kubernetes/pkg/client/clientcmd/api"
|
||||||
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
type createAuthInfoOptions struct {
|
type createAuthInfoOptions struct {
|
||||||
pathOptions *pathOptions
|
pathOptions *pathOptions
|
||||||
name string
|
name string
|
||||||
authPath string
|
authPath util.StringFlag
|
||||||
clientCertificate string
|
clientCertificate util.StringFlag
|
||||||
clientKey string
|
clientKey util.StringFlag
|
||||||
token string
|
token util.StringFlag
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewCmdConfigSetAuthInfo(out io.Writer, pathOptions *pathOptions) *cobra.Command {
|
func NewCmdConfigSetAuthInfo(out io.Writer, pathOptions *pathOptions) *cobra.Command {
|
||||||
options := &createAuthInfoOptions{pathOptions: pathOptions}
|
options := &createAuthInfoOptions{pathOptions: pathOptions}
|
||||||
|
|
||||||
cmd := &cobra.Command{
|
cmd := &cobra.Command{
|
||||||
Use: "set-credentials name",
|
Use: fmt.Sprintf("set-credentials name [--%v=path/to/auth/file] [--%v=path/to/certficate/file] [--%v=path/to/key/file] [--%v=bearer_token_string]", clientcmd.FlagAuthPath, clientcmd.FlagCertFile, clientcmd.FlagKeyFile, clientcmd.FlagBearerToken),
|
||||||
Short: "Sets a user entry in .kubeconfig",
|
Short: "Sets a user entry in .kubeconfig",
|
||||||
Long: `Sets a user entry in .kubeconfig
|
Long: `Sets a user entry in .kubeconfig
|
||||||
|
Specifying a name that already exists will merge new fields on top of existing values for those fields.
|
||||||
Specifying a name that already exists overwrites that user entry.
|
e.g.
|
||||||
|
kubectl config set-credentials cluster-admin --client-key=~/.kube/cluster-admin/.kubecfg.key
|
||||||
|
only sets the client-key field on the cluster-admin user entry without touching other values.
|
||||||
`,
|
`,
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
if !options.complete(cmd) {
|
if !options.complete(cmd) {
|
||||||
@ -58,10 +61,10 @@ func NewCmdConfigSetAuthInfo(out io.Writer, pathOptions *pathOptions) *cobra.Com
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd.Flags().StringVar(&options.authPath, clientcmd.FlagAuthPath, "", clientcmd.FlagAuthPath+" for the user entry in .kubeconfig")
|
cmd.Flags().Var(&options.authPath, clientcmd.FlagAuthPath, clientcmd.FlagAuthPath+" for the user entry in .kubeconfig")
|
||||||
cmd.Flags().StringVar(&options.clientCertificate, clientcmd.FlagCertFile, "", clientcmd.FlagCertFile+" for the user entry in .kubeconfig")
|
cmd.Flags().Var(&options.clientCertificate, clientcmd.FlagCertFile, clientcmd.FlagCertFile+" for the user entry in .kubeconfig")
|
||||||
cmd.Flags().StringVar(&options.clientKey, clientcmd.FlagKeyFile, "", clientcmd.FlagKeyFile+" for the user entry in .kubeconfig")
|
cmd.Flags().Var(&options.clientKey, clientcmd.FlagKeyFile, clientcmd.FlagKeyFile+" for the user entry in .kubeconfig")
|
||||||
cmd.Flags().StringVar(&options.token, clientcmd.FlagBearerToken, "", clientcmd.FlagBearerToken+" for the user entry in .kubeconfig")
|
cmd.Flags().Var(&options.token, clientcmd.FlagBearerToken, clientcmd.FlagBearerToken+" for the user entry in .kubeconfig")
|
||||||
|
|
||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
@ -77,7 +80,7 @@ func (o createAuthInfoOptions) run() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
authInfo := o.authInfo()
|
authInfo := o.modifyAuthInfo(config.AuthInfos[o.name])
|
||||||
config.AuthInfos[o.name] = authInfo
|
config.AuthInfos[o.name] = authInfo
|
||||||
|
|
||||||
err = clientcmd.WriteToFile(*config, filename)
|
err = clientcmd.WriteToFile(*config, filename)
|
||||||
@ -89,15 +92,23 @@ func (o createAuthInfoOptions) run() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// authInfo builds an AuthInfo object from the options
|
// authInfo builds an AuthInfo object from the options
|
||||||
func (o *createAuthInfoOptions) authInfo() clientcmdapi.AuthInfo {
|
func (o *createAuthInfoOptions) modifyAuthInfo(existingAuthInfo clientcmdapi.AuthInfo) clientcmdapi.AuthInfo {
|
||||||
authInfo := clientcmdapi.AuthInfo{
|
modifiedAuthInfo := existingAuthInfo
|
||||||
AuthPath: o.authPath,
|
|
||||||
ClientCertificate: o.clientCertificate,
|
if o.authPath.Provided() {
|
||||||
ClientKey: o.clientKey,
|
modifiedAuthInfo.AuthPath = o.authPath.Value()
|
||||||
Token: o.token,
|
}
|
||||||
|
if o.clientCertificate.Provided() {
|
||||||
|
modifiedAuthInfo.ClientCertificate = o.clientCertificate.Value()
|
||||||
|
}
|
||||||
|
if o.clientKey.Provided() {
|
||||||
|
modifiedAuthInfo.ClientKey = o.clientKey.Value()
|
||||||
|
}
|
||||||
|
if o.token.Provided() {
|
||||||
|
modifiedAuthInfo.Token = o.token.Value()
|
||||||
}
|
}
|
||||||
|
|
||||||
return authInfo
|
return modifiedAuthInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *createAuthInfoOptions) complete(cmd *cobra.Command) bool {
|
func (o *createAuthInfoOptions) complete(cmd *cobra.Command) bool {
|
||||||
|
@ -25,26 +25,29 @@ import (
|
|||||||
|
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/client/clientcmd"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/client/clientcmd"
|
||||||
clientcmdapi "github.com/GoogleCloudPlatform/kubernetes/pkg/client/clientcmd/api"
|
clientcmdapi "github.com/GoogleCloudPlatform/kubernetes/pkg/client/clientcmd/api"
|
||||||
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
type createClusterOptions struct {
|
type createClusterOptions struct {
|
||||||
pathOptions *pathOptions
|
pathOptions *pathOptions
|
||||||
name string
|
name string
|
||||||
server string
|
server util.StringFlag
|
||||||
apiVersion string
|
apiVersion util.StringFlag
|
||||||
insecureSkipTLSVerify bool
|
insecureSkipTLSVerify util.BoolFlag
|
||||||
certificateAuthority string
|
certificateAuthority util.StringFlag
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewCmdConfigSetCluster(out io.Writer, pathOptions *pathOptions) *cobra.Command {
|
func NewCmdConfigSetCluster(out io.Writer, pathOptions *pathOptions) *cobra.Command {
|
||||||
options := &createClusterOptions{pathOptions: pathOptions}
|
options := &createClusterOptions{pathOptions: pathOptions}
|
||||||
|
|
||||||
cmd := &cobra.Command{
|
cmd := &cobra.Command{
|
||||||
Use: "set-cluster name [server] [insecure-skip-tls-verify] [certificate-authority] [api-version]",
|
Use: fmt.Sprintf("set-cluster name [--%v=server] [--%v=path/to/certficate/authority] [--%v=apiversion] [--%v=true]", clientcmd.FlagAPIServer, clientcmd.FlagCAFile, clientcmd.FlagAPIVersion, clientcmd.FlagInsecure),
|
||||||
Short: "Sets a cluster entry in .kubeconfig",
|
Short: "Sets a cluster entry in .kubeconfig",
|
||||||
Long: `Sets a cluster entry in .kubeconfig
|
Long: `Sets a cluster entry in .kubeconfig
|
||||||
|
Specifying a name that already exists will merge new fields on top of existing values for those fields.
|
||||||
Specifying a name that already exists overwrites that cluster entry.
|
e.g.
|
||||||
|
kubectl config set-cluster e2e --certificate-authority=~/.kube/e2e/.kubernetes.ca.cert
|
||||||
|
only sets the certificate-authority field on the e2e cluster entry without touching other values.
|
||||||
`,
|
`,
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
if !options.complete(cmd) {
|
if !options.complete(cmd) {
|
||||||
@ -58,10 +61,12 @@ func NewCmdConfigSetCluster(out io.Writer, pathOptions *pathOptions) *cobra.Comm
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd.Flags().StringVar(&options.server, clientcmd.FlagAPIServer, "", clientcmd.FlagAPIServer+" for the cluster entry in .kubeconfig")
|
options.insecureSkipTLSVerify.Default(false)
|
||||||
cmd.Flags().StringVar(&options.apiVersion, clientcmd.FlagAPIVersion, "", clientcmd.FlagAPIVersion+" for the cluster entry in .kubeconfig")
|
|
||||||
cmd.Flags().BoolVar(&options.insecureSkipTLSVerify, clientcmd.FlagInsecure, false, clientcmd.FlagInsecure+" for the cluster entry in .kubeconfig")
|
cmd.Flags().Var(&options.server, clientcmd.FlagAPIServer, clientcmd.FlagAPIServer+" for the cluster entry in .kubeconfig")
|
||||||
cmd.Flags().StringVar(&options.certificateAuthority, clientcmd.FlagCAFile, "", clientcmd.FlagCAFile+" for the cluster entry in .kubeconfig")
|
cmd.Flags().Var(&options.apiVersion, clientcmd.FlagAPIVersion, clientcmd.FlagAPIVersion+" for the cluster entry in .kubeconfig")
|
||||||
|
cmd.Flags().Var(&options.insecureSkipTLSVerify, clientcmd.FlagInsecure, clientcmd.FlagInsecure+" for the cluster entry in .kubeconfig")
|
||||||
|
cmd.Flags().Var(&options.certificateAuthority, clientcmd.FlagCAFile, clientcmd.FlagCAFile+" for the cluster entry in .kubeconfig")
|
||||||
|
|
||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
@ -81,7 +86,7 @@ func (o createClusterOptions) run() error {
|
|||||||
config.Clusters = make(map[string]clientcmdapi.Cluster)
|
config.Clusters = make(map[string]clientcmdapi.Cluster)
|
||||||
}
|
}
|
||||||
|
|
||||||
cluster := o.cluster()
|
cluster := o.modifyCluster(config.Clusters[o.name])
|
||||||
config.Clusters[o.name] = cluster
|
config.Clusters[o.name] = cluster
|
||||||
|
|
||||||
err = clientcmd.WriteToFile(*config, filename)
|
err = clientcmd.WriteToFile(*config, filename)
|
||||||
@ -93,15 +98,23 @@ func (o createClusterOptions) run() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// cluster builds a Cluster object from the options
|
// cluster builds a Cluster object from the options
|
||||||
func (o *createClusterOptions) cluster() clientcmdapi.Cluster {
|
func (o *createClusterOptions) modifyCluster(existingCluster clientcmdapi.Cluster) clientcmdapi.Cluster {
|
||||||
cluster := clientcmdapi.Cluster{
|
modifiedCluster := existingCluster
|
||||||
Server: o.server,
|
|
||||||
APIVersion: o.apiVersion,
|
if o.server.Provided() {
|
||||||
InsecureSkipTLSVerify: o.insecureSkipTLSVerify,
|
modifiedCluster.Server = o.server.Value()
|
||||||
CertificateAuthority: o.certificateAuthority,
|
}
|
||||||
|
if o.apiVersion.Provided() {
|
||||||
|
modifiedCluster.APIVersion = o.apiVersion.Value()
|
||||||
|
}
|
||||||
|
if o.insecureSkipTLSVerify.Provided() {
|
||||||
|
modifiedCluster.InsecureSkipTLSVerify = o.insecureSkipTLSVerify.Value()
|
||||||
|
}
|
||||||
|
if o.certificateAuthority.Provided() {
|
||||||
|
modifiedCluster.CertificateAuthority = o.certificateAuthority.Value()
|
||||||
}
|
}
|
||||||
|
|
||||||
return cluster
|
return modifiedCluster
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *createClusterOptions) complete(cmd *cobra.Command) bool {
|
func (o *createClusterOptions) complete(cmd *cobra.Command) bool {
|
||||||
|
@ -25,26 +25,30 @@ import (
|
|||||||
|
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/client/clientcmd"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/client/clientcmd"
|
||||||
clientcmdapi "github.com/GoogleCloudPlatform/kubernetes/pkg/client/clientcmd/api"
|
clientcmdapi "github.com/GoogleCloudPlatform/kubernetes/pkg/client/clientcmd/api"
|
||||||
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
type createContextOptions struct {
|
type createContextOptions struct {
|
||||||
pathOptions *pathOptions
|
pathOptions *pathOptions
|
||||||
name string
|
name string
|
||||||
cluster string
|
cluster util.StringFlag
|
||||||
authInfo string
|
authInfo util.StringFlag
|
||||||
namespace string
|
namespace util.StringFlag
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewCmdConfigSetContext(out io.Writer, pathOptions *pathOptions) *cobra.Command {
|
func NewCmdConfigSetContext(out io.Writer, pathOptions *pathOptions) *cobra.Command {
|
||||||
options := &createContextOptions{pathOptions: pathOptions}
|
options := &createContextOptions{pathOptions: pathOptions}
|
||||||
|
|
||||||
cmd := &cobra.Command{
|
cmd := &cobra.Command{
|
||||||
Use: "set-context name",
|
Use: fmt.Sprintf("set-context name [--%v=cluster-nickname] [--%v=user-nickname] [--%v=namespace]", clientcmd.FlagClusterName, clientcmd.FlagAuthInfoName, clientcmd.FlagNamespace),
|
||||||
Short: "Sets a context entry in .kubeconfig",
|
Short: "Sets a context entry in .kubeconfig",
|
||||||
Long: `Sets a context entry in .kubeconfig
|
Long: `Sets a context entry in .kubeconfig
|
||||||
|
Specifying a name that already exists will merge new fields on top of existing values for those fields.
|
||||||
Specifying a name that already exists overwrites that context entry.
|
e.g.
|
||||||
|
kubectl config set-context gce --user=cluster-admin
|
||||||
|
only sets the user field on the gce context entry without touching other values.
|
||||||
`,
|
`,
|
||||||
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
if !options.complete(cmd) {
|
if !options.complete(cmd) {
|
||||||
return
|
return
|
||||||
@ -57,9 +61,9 @@ func NewCmdConfigSetContext(out io.Writer, pathOptions *pathOptions) *cobra.Comm
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd.Flags().StringVar(&options.cluster, clientcmd.FlagClusterName, "", clientcmd.FlagClusterName+" for the context entry in .kubeconfig")
|
cmd.Flags().Var(&options.cluster, clientcmd.FlagClusterName, clientcmd.FlagClusterName+" for the context entry in .kubeconfig")
|
||||||
cmd.Flags().StringVar(&options.authInfo, clientcmd.FlagAuthInfoName, "", clientcmd.FlagAuthInfoName+" for the context entry in .kubeconfig")
|
cmd.Flags().Var(&options.authInfo, clientcmd.FlagAuthInfoName, clientcmd.FlagAuthInfoName+" for the context entry in .kubeconfig")
|
||||||
cmd.Flags().StringVar(&options.namespace, clientcmd.FlagNamespace, "", clientcmd.FlagNamespace+" for the context entry in .kubeconfig")
|
cmd.Flags().Var(&options.namespace, clientcmd.FlagNamespace, clientcmd.FlagNamespace+" for the context entry in .kubeconfig")
|
||||||
|
|
||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
@ -75,7 +79,7 @@ func (o createContextOptions) run() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
context := o.context()
|
context := o.modifyContext(config.Contexts[o.name])
|
||||||
config.Contexts[o.name] = context
|
config.Contexts[o.name] = context
|
||||||
|
|
||||||
err = clientcmd.WriteToFile(*config, filename)
|
err = clientcmd.WriteToFile(*config, filename)
|
||||||
@ -86,14 +90,20 @@ func (o createContextOptions) run() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *createContextOptions) context() clientcmdapi.Context {
|
func (o *createContextOptions) modifyContext(existingContext clientcmdapi.Context) clientcmdapi.Context {
|
||||||
context := clientcmdapi.Context{
|
modifiedContext := existingContext
|
||||||
Cluster: o.cluster,
|
|
||||||
AuthInfo: o.authInfo,
|
if o.cluster.Provided() {
|
||||||
Namespace: o.namespace,
|
modifiedContext.Cluster = o.cluster.Value()
|
||||||
|
}
|
||||||
|
if o.authInfo.Provided() {
|
||||||
|
modifiedContext.AuthInfo = o.authInfo.Value()
|
||||||
|
}
|
||||||
|
if o.namespace.Provided() {
|
||||||
|
modifiedContext.Namespace = o.namespace.Value()
|
||||||
}
|
}
|
||||||
|
|
||||||
return context
|
return modifiedContext
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *createContextOptions) complete(cmd *cobra.Command) bool {
|
func (o *createContextOptions) complete(cmd *cobra.Command) bool {
|
||||||
|
64
pkg/util/bool_flag.go
Normal file
64
pkg/util/bool_flag.go
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2014 Google Inc. All rights reserved.
|
||||||
|
|
||||||
|
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 util
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
// BoolFlag is a boolean flag compatible with flags and pflags that keeps track of whether it had a value supplied or not.
|
||||||
|
// Beware! If you use this type, you must actually specify --flag-name=true, you cannot leave it as --flag-name and still have
|
||||||
|
// the value set
|
||||||
|
type BoolFlag struct {
|
||||||
|
// If Set has been invoked this value is true
|
||||||
|
provided bool
|
||||||
|
// The exact value provided on the flag
|
||||||
|
value bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *BoolFlag) Default(value bool) {
|
||||||
|
f.value = value
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f BoolFlag) String() string {
|
||||||
|
return fmt.Sprintf("%t", f.value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f BoolFlag) Value() bool {
|
||||||
|
return f.value
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *BoolFlag) Set(value string) error {
|
||||||
|
boolVal, err := strconv.ParseBool(value)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
f.value = boolVal
|
||||||
|
f.provided = true
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f BoolFlag) Provided() bool {
|
||||||
|
return f.provided
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *BoolFlag) Type() string {
|
||||||
|
return "bool"
|
||||||
|
}
|
54
pkg/util/string_flag.go
Normal file
54
pkg/util/string_flag.go
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2014 Google Inc. All rights reserved.
|
||||||
|
|
||||||
|
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 util
|
||||||
|
|
||||||
|
import ()
|
||||||
|
|
||||||
|
// StringFlag is a string flag compatible with flags and pflags that keeps track of whether it had a value supplied or not.
|
||||||
|
type StringFlag struct {
|
||||||
|
// If Set has been invoked this value is true
|
||||||
|
provided bool
|
||||||
|
// The exact value provided on the flag
|
||||||
|
value string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *StringFlag) Default(value string) {
|
||||||
|
f.value = value
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f StringFlag) String() string {
|
||||||
|
return f.value
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f StringFlag) Value() string {
|
||||||
|
return f.value
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *StringFlag) Set(value string) error {
|
||||||
|
f.value = value
|
||||||
|
f.provided = true
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f StringFlag) Provided() bool {
|
||||||
|
return f.provided
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *StringFlag) Type() string {
|
||||||
|
return "string"
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user