kubernetes / kubectl

Issue tracker and mirror of kubectl code
Apache License 2.0
2.82k stars 908 forks source link

Exit code of `kubectl config delete-*` is not unified #1641

Open wafuwafu13 opened 2 months ago

wafuwafu13 commented 2 months ago

What happened?

Only exit code of kubectl config delete-user is 1

$ kubectl config delete-cluster || echo $?
Delete the specified cluster from the kubeconfig.

Examples:
  # Delete the minikube cluster
  kubectl config delete-cluster minikube

Usage:
  kubectl config delete-cluster NAME [options]

Use "kubectl options" for a list of global command-line options (applies to all commands).
$ kubectl config delete-context || echo $?
Delete the specified context from the kubeconfig.

Examples:
  # Delete the context for the minikube cluster
  kubectl config delete-context minikube

Usage:
  kubectl config delete-context NAME [options]

Use "kubectl options" for a list of global command-line options (applies to all commands).
$ kubectl config delete-user || echo $?
error: user to delete is required
See 'kubectl config delete-user -h' for help and examples
1

What did you expect to happen?

Exit code of kubectl config delete-user is 0

How can we reproduce it (as minimally and precisely as possible)?

Run kubectl config delete-user

Anything else we need to know?

https://github.com/kubernetes/kubernetes/blob/a87612b6676723b34a5b3d2d80ab4e04552221ae/staging/src/k8s.io/kubectl/pkg/cmd/config/delete_cluster.go#L61-L64

https://github.com/kubernetes/kubernetes/blob/a87612b6676723b34a5b3d2d80ab4e04552221ae/staging/src/k8s.io/kubectl/pkg/cmd/config/delete_context.go#L61-L64

https://github.com/kubernetes/kubernetes/blob/a87612b6676723b34a5b3d2d80ab4e04552221ae/staging/src/k8s.io/kubectl/pkg/cmd/config/delete_user.go#L87-L89

Kubernetes version

```console $ kubectl version Client Version: v1.28.2 Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3 Server Version: v1.29.4-eks-036c24b ```

Cloud provider

All

OS version

```console $ uname -a Darwin tagawahirotakanoMacBook-Pro.local 23.5.0 Darwin Kernel Version 23.5.0: Wed May 1 20:12:58 PDT 2024; root:xnu-10063.121.3~5/RELEASE_ARM64_T6000 arm64 ```

Install tools

Homebrew

Container runtime (CRI) and version (if applicable)

Related plugins (CNI, CSI, ...) and versions (if applicable)

k8s-ci-robot commented 2 months ago

This issue is currently awaiting triage.

If a SIG or subproject determines this is a relevant issue, they will accept it by applying the triage/accepted label and provide further guidance.

The triage/accepted label can be added by org members by writing /triage accepted in a comment.

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md). If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes-sigs/prow](https://github.com/kubernetes-sigs/prow/issues/new?title=Prow%20issue:) repository.
wafuwafu13 commented 2 months ago

/sig cli

brianpursley commented 1 month ago

What exit code is expected here?

Technically I think the convention is for usage errors to exit with code 2, but kubectl doesn't do that. Instead it exits with 1 in the cases I have seen, sometimes printing the usage, but sometimes not. But in either case, the exit code has been 1.

~ $ kubectl get
You must specify the type of resource to get. Use "kubectl api-resources" for a complete list of supported resources.

error: Required resource not specified.
Use "kubectl explain <resource>" for a detailed description of that resource (e.g. kubectl explain pods).
See 'kubectl get -h' for help and examples
~ $ echo $?
1
~ $ 
~ $ 
~ $ kubectl label
error: one or more resources must be specified as <resource> <name> or <resource>/<name>
~ $ echo $?
1
~ $ 
~ $ 
~ $ kubectl create
Error: must specify one of -f and -k

Create a resource from a file or from stdin.

 JSON and YAML formats are accepted.

Examples:
  # Create a pod using the data in pod.json
  kubectl create -f ./pod.json

  # Create a pod based on the JSON passed into stdin
  cat pod.json | kubectl create -f -

  # Edit the data in registry.yaml in JSON then create the resource using the edited data
  kubectl create -f registry.yaml --edit -o json

Available Commands:
  clusterrole           Create a cluster role
  clusterrolebinding    Create a cluster role binding for a particular cluster role
  configmap             Create a config map from a local file, directory or literal value
  cronjob               Create a cron job with the specified name
  deployment            Create a deployment with the specified name
  ingress               Create an ingress with the specified name
  job                   Create a job with the specified name
  namespace             Create a namespace with the specified name
  poddisruptionbudget   Create a pod disruption budget with the specified name
  priorityclass         Create a priority class with the specified name
  quota                 Create a quota with the specified name
  role                  Create a role with single rule
  rolebinding           Create a role binding for a particular role or cluster role
  secret                Create a secret using a specified subcommand
  service               Create a service using a specified subcommand
  serviceaccount        Create a service account with the specified name
  token                 Request a service account token

Options:
    --allow-missing-template-keys=true:
    If true, ignore any errors in templates when a field or map key is missing in the template. Only applies to
    golang and jsonpath output formats.

    --dry-run='none':
    Must be "none", "server", or "client". If client strategy, only print the object that would be sent, without
    sending it. If server strategy, submit server-side request without persisting the resource.

    --edit=false:
    Edit the API resource before creating

    --field-manager='kubectl-create':
    Name of the manager used to track field ownership.

    -f, --filename=[]:
    Filename, directory, or URL to files to use to create the resource

    -k, --kustomize='':
    Process the kustomization directory. This flag can't be used together with -f or -R.

    -o, --output='':
    Output format. One of: (json, yaml, name, go-template, go-template-file, template, templatefile, jsonpath,
    jsonpath-as-json, jsonpath-file).

    --raw='':
    Raw URI to POST to the server.  Uses the transport specified by the kubeconfig file.

    -R, --recursive=false:
    Process the directory used in -f, --filename recursively. Useful when you want to manage related manifests
    organized within the same directory.

    --save-config=false:
    If true, the configuration of current object will be saved in its annotation. Otherwise, the annotation will
    be unchanged. This flag is useful when you want to perform kubectl apply on this object in the future.

    -l, --selector='':
    Selector (label query) to filter on, supports '=', '==', and '!='.(e.g. -l key1=value1,key2=value2). Matching
    objects must satisfy all of the specified label constraints.

    --show-managed-fields=false:
    If true, keep the managedFields when printing objects in JSON or YAML format.

    --template='':
    Template string or path to template file to use when -o=go-template, -o=go-template-file. The template format
    is golang templates [http://golang.org/pkg/text/template/#pkg-overview].

    --validate='strict':
    Must be one of: strict (or true), warn, ignore (or false).      "true" or "strict" will use a schema to validate
    the input and fail the request if invalid. It will perform server side validation if ServerSideFieldValidation
    is enabled on the api-server, but will fall back to less reliable client-side validation if not.        "warn" will
    warn about unknown or duplicate fields without blocking the request if server-side field validation is enabled
    on the API server, and behave as "ignore" otherwise.        "false" or "ignore" will not perform any schema
    validation, silently dropping any unknown or duplicate fields.

    --windows-line-endings=false:
    Only relevant if --edit=true. Defaults to the line ending native to your platform.

Usage:
  kubectl create -f FILENAME [options]

Use "kubectl create <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).
~ $ echo $?
1
~ $ 
~ $ 
~ $ kubectl create job
error: exactly one NAME is required, got 0
See 'kubectl create job -h' for help and examples
~ $ echo $?
1
~ $ 
brianpursley commented 1 month ago

/transfer kubectl

mpuckett159 commented 1 month ago

/triage accepted /kind feature /remove-kind bug

Add to https://github.com/kubernetes/enhancements/issues/2551