mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-03 09:22:44 +00:00
Merge pull request #122023 from ardaguclu/set-credentials-exec-flags
kubectl config set-credentials: Add InteractiveMode and ProvideClusterInfo flags
This commit is contained in:
commit
cacdf6c707
@ -279,6 +279,91 @@ func TestEmbedClientCert(t *testing.T) {
|
|||||||
test.run(t)
|
test.run(t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestExecPlugin(t *testing.T) {
|
||||||
|
fakeCertFile, _ := os.CreateTemp(os.TempDir(), "")
|
||||||
|
defer utiltesting.CloseAndRemove(t, fakeCertFile)
|
||||||
|
fakeData := []byte("fake-data")
|
||||||
|
err := os.WriteFile(fakeCertFile.Name(), fakeData, 0600)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("unexpected error %v", err)
|
||||||
|
}
|
||||||
|
expectedConfig := newRedFederalCowHammerConfig()
|
||||||
|
authInfo := clientcmdapi.NewAuthInfo()
|
||||||
|
authInfo.Exec = &clientcmdapi.ExecConfig{
|
||||||
|
Command: "example-client-go-exec-plugin",
|
||||||
|
Args: []string{"arg1", "arg2"},
|
||||||
|
Env: []clientcmdapi.ExecEnvVar{
|
||||||
|
{
|
||||||
|
Name: "FOO",
|
||||||
|
Value: "bar",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
APIVersion: "client.authentication.k8s.io/v1",
|
||||||
|
ProvideClusterInfo: false,
|
||||||
|
InteractiveMode: "Never",
|
||||||
|
}
|
||||||
|
expectedConfig.AuthInfos["cred-exec-user"] = authInfo
|
||||||
|
|
||||||
|
test := configCommandTest{
|
||||||
|
args: []string{
|
||||||
|
"set-credentials",
|
||||||
|
"cred-exec-user",
|
||||||
|
"--exec-api-version=client.authentication.k8s.io/v1",
|
||||||
|
"--exec-command=example-client-go-exec-plugin",
|
||||||
|
"--exec-arg=arg1,arg2",
|
||||||
|
"--exec-env=FOO=bar",
|
||||||
|
"--exec-interactive-mode=Never",
|
||||||
|
},
|
||||||
|
startingConfig: newRedFederalCowHammerConfig(),
|
||||||
|
expectedConfig: expectedConfig,
|
||||||
|
}
|
||||||
|
|
||||||
|
test.run(t)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestExecPluginWithProveClusterInfo(t *testing.T) {
|
||||||
|
fakeCertFile, _ := os.CreateTemp(os.TempDir(), "")
|
||||||
|
defer utiltesting.CloseAndRemove(t, fakeCertFile)
|
||||||
|
fakeData := []byte("fake-data")
|
||||||
|
err := os.WriteFile(fakeCertFile.Name(), fakeData, 0600)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("unexpected error %v", err)
|
||||||
|
}
|
||||||
|
expectedConfig := newRedFederalCowHammerConfig()
|
||||||
|
authInfo := clientcmdapi.NewAuthInfo()
|
||||||
|
authInfo.Exec = &clientcmdapi.ExecConfig{
|
||||||
|
Command: "example-client-go-exec-plugin",
|
||||||
|
Args: []string{"arg1", "arg2"},
|
||||||
|
Env: []clientcmdapi.ExecEnvVar{
|
||||||
|
{
|
||||||
|
Name: "FOO",
|
||||||
|
Value: "bar",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
APIVersion: "client.authentication.k8s.io/v1",
|
||||||
|
ProvideClusterInfo: true,
|
||||||
|
InteractiveMode: "Always",
|
||||||
|
}
|
||||||
|
expectedConfig.AuthInfos["cred-exec-user"] = authInfo
|
||||||
|
|
||||||
|
test := configCommandTest{
|
||||||
|
args: []string{
|
||||||
|
"set-credentials",
|
||||||
|
"cred-exec-user",
|
||||||
|
"--exec-api-version=client.authentication.k8s.io/v1",
|
||||||
|
"--exec-command=example-client-go-exec-plugin",
|
||||||
|
"--exec-arg=arg1,arg2",
|
||||||
|
"--exec-env=FOO=bar",
|
||||||
|
"--exec-interactive-mode=Always",
|
||||||
|
"--exec-provide-cluster-info=true",
|
||||||
|
},
|
||||||
|
startingConfig: newRedFederalCowHammerConfig(),
|
||||||
|
expectedConfig: expectedConfig,
|
||||||
|
}
|
||||||
|
|
||||||
|
test.run(t)
|
||||||
|
}
|
||||||
|
|
||||||
func TestEmbedClientKey(t *testing.T) {
|
func TestEmbedClientKey(t *testing.T) {
|
||||||
fakeKeyFile, _ := os.CreateTemp(os.TempDir(), "")
|
fakeKeyFile, _ := os.CreateTemp(os.TempDir(), "")
|
||||||
defer utiltesting.CloseAndRemove(t, fakeKeyFile)
|
defer utiltesting.CloseAndRemove(t, fakeKeyFile)
|
||||||
|
@ -48,21 +48,25 @@ type setCredentialsOptions struct {
|
|||||||
authProviderArgs map[string]string
|
authProviderArgs map[string]string
|
||||||
authProviderArgsToRemove []string
|
authProviderArgsToRemove []string
|
||||||
|
|
||||||
execCommand cliflag.StringFlag
|
execCommand cliflag.StringFlag
|
||||||
execAPIVersion cliflag.StringFlag
|
execAPIVersion cliflag.StringFlag
|
||||||
execArgs []string
|
execInteractiveMode cliflag.StringFlag
|
||||||
execEnv map[string]string
|
execProvideClusterInfo cliflag.Tristate
|
||||||
execEnvToRemove []string
|
execArgs []string
|
||||||
|
execEnv map[string]string
|
||||||
|
execEnvToRemove []string
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
flagAuthProvider = "auth-provider"
|
flagAuthProvider = "auth-provider"
|
||||||
flagAuthProviderArg = "auth-provider-arg"
|
flagAuthProviderArg = "auth-provider-arg"
|
||||||
|
|
||||||
flagExecCommand = "exec-command"
|
flagExecCommand = "exec-command"
|
||||||
flagExecAPIVersion = "exec-api-version"
|
flagExecAPIVersion = "exec-api-version"
|
||||||
flagExecArg = "exec-arg"
|
flagExecArg = "exec-arg"
|
||||||
flagExecEnv = "exec-env"
|
flagExecEnv = "exec-env"
|
||||||
|
flagExecInteractiveMode = "exec-interactive-mode"
|
||||||
|
flagExecProvideClusterInfo = "exec-provide-cluster-info"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -105,6 +109,9 @@ var (
|
|||||||
# Enable new exec auth plugin for the "cluster-admin" entry
|
# Enable new exec auth plugin for the "cluster-admin" entry
|
||||||
kubectl config set-credentials cluster-admin --exec-command=/path/to/the/executable --exec-api-version=client.authentication.k8s.io/v1beta1
|
kubectl config set-credentials cluster-admin --exec-command=/path/to/the/executable --exec-api-version=client.authentication.k8s.io/v1beta1
|
||||||
|
|
||||||
|
# Enable new exec auth plugin for the "cluster-admin" entry with interactive mode
|
||||||
|
kubectl config set-credentials cluster-admin --exec-command=/path/to/the/executable --exec-api-version=client.authentication.k8s.io/v1beta1 --exec-interactive-mode=Never
|
||||||
|
|
||||||
# Define new exec auth plugin arguments for the "cluster-admin" entry
|
# Define new exec auth plugin arguments for the "cluster-admin" entry
|
||||||
kubectl config set-credentials cluster-admin --exec-arg=arg1 --exec-arg=arg2
|
kubectl config set-credentials cluster-admin --exec-arg=arg1 --exec-arg=arg2
|
||||||
|
|
||||||
@ -179,6 +186,9 @@ func newCmdConfigSetCredentials(out io.Writer, options *setCredentialsOptions) *
|
|||||||
cmd.Flags().StringSlice(flagAuthProviderArg, nil, "'key=value' arguments for the auth provider")
|
cmd.Flags().StringSlice(flagAuthProviderArg, nil, "'key=value' arguments for the auth provider")
|
||||||
cmd.Flags().Var(&options.execCommand, flagExecCommand, "Command for the exec credential plugin for the user entry in kubeconfig")
|
cmd.Flags().Var(&options.execCommand, flagExecCommand, "Command for the exec credential plugin for the user entry in kubeconfig")
|
||||||
cmd.Flags().Var(&options.execAPIVersion, flagExecAPIVersion, "API version of the exec credential plugin for the user entry in kubeconfig")
|
cmd.Flags().Var(&options.execAPIVersion, flagExecAPIVersion, "API version of the exec credential plugin for the user entry in kubeconfig")
|
||||||
|
cmd.Flags().Var(&options.execInteractiveMode, flagExecInteractiveMode, "InteractiveMode of the exec credentials plugin for the user entry in kubeconfig")
|
||||||
|
flagClusterInfo := cmd.Flags().VarPF(&options.execProvideClusterInfo, flagExecProvideClusterInfo, "", "ProvideClusterInfo of the exec credentials plugin for the user entry in kubeconfig")
|
||||||
|
flagClusterInfo.NoOptDefVal = "true"
|
||||||
cmd.Flags().StringSlice(flagExecArg, nil, "New arguments for the exec credential plugin command for the user entry in kubeconfig")
|
cmd.Flags().StringSlice(flagExecArg, nil, "New arguments for the exec credential plugin command for the user entry in kubeconfig")
|
||||||
cmd.Flags().StringArray(flagExecEnv, nil, "'key=value' environment values for the exec credential plugin")
|
cmd.Flags().StringArray(flagExecEnv, nil, "'key=value' environment values for the exec credential plugin")
|
||||||
f := cmd.Flags().VarPF(&options.embedCertData, clientcmd.FlagEmbedCerts, "", "Embed client cert/key for the user entry in kubeconfig")
|
f := cmd.Flags().VarPF(&options.embedCertData, clientcmd.FlagEmbedCerts, "", "Embed client cert/key for the user entry in kubeconfig")
|
||||||
@ -306,6 +316,14 @@ func (o *setCredentialsOptions) modifyAuthInfo(existingAuthInfo clientcmdapi.Aut
|
|||||||
modifiedAuthInfo.Exec.Args = o.execArgs
|
modifiedAuthInfo.Exec.Args = o.execArgs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if o.execInteractiveMode.Provided() {
|
||||||
|
modifiedAuthInfo.Exec.InteractiveMode = clientcmdapi.ExecInteractiveMode(o.execInteractiveMode.Value())
|
||||||
|
}
|
||||||
|
|
||||||
|
if o.execProvideClusterInfo.Provided() {
|
||||||
|
modifiedAuthInfo.Exec.ProvideClusterInfo = o.execProvideClusterInfo.Value()
|
||||||
|
}
|
||||||
|
|
||||||
// iterate over the existing exec env values and remove the specified
|
// iterate over the existing exec env values and remove the specified
|
||||||
if o.execEnvToRemove != nil {
|
if o.execEnvToRemove != nil {
|
||||||
newExecEnv := []clientcmdapi.ExecEnvVar{}
|
newExecEnv := []clientcmdapi.ExecEnvVar{}
|
||||||
@ -437,5 +455,14 @@ func (o setCredentialsOptions) validate() error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if o.execInteractiveMode.Provided() {
|
||||||
|
interactiveMode := o.execInteractiveMode.Value()
|
||||||
|
if interactiveMode != string(clientcmdapi.IfAvailableExecInteractiveMode) &&
|
||||||
|
interactiveMode != string(clientcmdapi.AlwaysExecInteractiveMode) &&
|
||||||
|
interactiveMode != string(clientcmdapi.NeverExecInteractiveMode) {
|
||||||
|
return fmt.Errorf("invalid interactive mode type, can be only IfAvailable, Never, Always")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user