Skip to content

Commit

Permalink
add secret and namespace completion
Browse files Browse the repository at this point in the history
For this to work, you will need kubectl 1.26 and a shim that you can
create with the following command:

cat <<'EOF' >~/bin/kubectl_complete-view_secret && chmod u+x ~/bin/kubectl_complete-view_secret
kubectl view-secret __complete "$@"
EOF

See: kubernetes/kubernetes#105867
  • Loading branch information
maelvls committed Feb 3, 2023
1 parent 4625ca3 commit 1724f61
Showing 1 changed file with 100 additions and 0 deletions.
100 changes: 100 additions & 0 deletions pkg/cmd/view-secret.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ func NewCmdViewSecret() *cobra.Command {

return nil
},
ValidArgsFunction: getSecrets,
}

cmd.Flags().
Expand All @@ -92,6 +93,7 @@ func NewCmdViewSecret() *cobra.Command {
cmd.Flags().StringVarP(&res.customContext, "context", "c", res.customContext, "override the current context")
cmd.Flags().StringVarP(&res.kubeConfig, "kubeconfig", "k", res.kubeConfig, "explicitly provide the kubeconfig to use")

cmd.Root().RegisterFlagCompletionFunc("namespace", getNamespaces)
return cmd
}

Expand Down Expand Up @@ -191,3 +193,101 @@ func ProcessSecret(outWriter, errWriter io.Writer, secret map[string]interface{}

return nil
}

func getNamespaces(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
if len(args) > 0 {
return nil, cobra.ShellCompDirectiveNoFileComp
}

ctxOverride, _ := cmd.Flags().GetString("context")
kubeConfigOverride, _ := cmd.Flags().GetString("kubeconfig")

var res, cmdErr bytes.Buffer
commandArgs := []string{"get", "namespaces", "-o", "json"}

if ctxOverride != "" {
commandArgs = append(commandArgs, "--context", ctxOverride)
}

if kubeConfigOverride != "" {
commandArgs = append(commandArgs, "--kubeconfig", kubeConfigOverride)
}

out := exec.Command("kubectl", commandArgs...)
out.Stdout = &res
out.Stderr = &cmdErr
err := out.Run()
if err != nil {
return nil, cobra.ShellCompDirectiveError
}

var parsed struct {
Items []struct {
Metadata struct {
Name string `json:"name"`
} `json:"metadata,omitempty"`
}
}
if err := json.Unmarshal(res.Bytes(), &parsed); err != nil {
return nil, cobra.ShellCompDirectiveError
}

// turn into a list of strings
var namespaces []string
for _, item := range parsed.Items {
namespaces = append(namespaces, item.Metadata.Name)
}

return namespaces, cobra.ShellCompDirectiveNoFileComp
}

func getSecrets(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
if len(args) > 0 {
return nil, cobra.ShellCompDirectiveNoFileComp
}

nsOverride, _ := cmd.Flags().GetString("namespace")
ctxOverride, _ := cmd.Flags().GetString("context")
kubeConfigOverride, _ := cmd.Flags().GetString("kubeconfig")

var res, cmdErr bytes.Buffer
commandArgs := []string{"get", "secrets", "-o", "json"}
if nsOverride != "" {
commandArgs = append(commandArgs, "-n", nsOverride)
}

if ctxOverride != "" {
commandArgs = append(commandArgs, "--context", ctxOverride)
}

if kubeConfigOverride != "" {
commandArgs = append(commandArgs, "--kubeconfig", kubeConfigOverride)
}

out := exec.Command("kubectl", commandArgs...)
out.Stdout = &res
out.Stderr = &cmdErr
err := out.Run()
if err != nil {
return nil, cobra.ShellCompDirectiveError
}

var parsed struct {
Items []struct {
Metadata struct {
Name string `json:"name"`
} `json:"metadata,omitempty"`
}
}
if err := json.Unmarshal(res.Bytes(), &parsed); err != nil {
return nil, cobra.ShellCompDirectiveError
}

// turn into a list of strings
var names []string
for _, item := range parsed.Items {
names = append(names, item.Metadata.Name)
}

return names, cobra.ShellCompDirectiveNoFileComp
}

0 comments on commit 1724f61

Please sign in to comment.