Repository: aws/aws-cli

Issue:
`Empty KUBERNETES_EXEC_INFO` warning when running `aws eks get-token`
### Describe the bug

This is likely related to https://github.com/kubernetes/kubectl/issues/1210

Using the newest update contained the in above patch, `kubectl` auth commands run as expected. However any requests to `aws eks get-token` that don't come from `kubectl` itself (or a tool using a similar mechanism) result in the following warning:
```shell
Empty KUBERNETES_EXEC_INFO, defaulting to client.authentication.k8s.io/v1alpha1. This is likely a bug in your Kubernetes client. Please update your Kubernetes client.
```
This might just need some documentation to prevent confusion, but I'm already seeing users run into it and ask. And the usual [reddit suspects](https://www.reddit.com/r/kubernetes/comments/um1wa1/what_is_kubernetes_exec_info_and_why_would_it_be/)

### Expected Behavior

- More detailed warning message? 
- Suppression of warnings when an interactive prompt is detected?
- Documentation notes?

### Current Behavior

`aws eks get-token` (with valid credentials)
Output:
```shell
Empty KUBERNETES_EXEC_INFO, defaulting to client.authentication.k8s.io/v1alpha1. This is likely a bug in your Kubernetes client. Please update your Kubernetes client.
<token>
```

### Reproduction Steps

`aws eks get-token`

### Possible Solution

_No response_

### Additional Information/Context

_No response_

### CLI version used

`aws-cli/2.6.3 Python/3.9.12 Darwin/21.4.0 source/arm64 prompt/off`

### Environment details (OS name and version, etc.)

macOS 12.3.1


Discussion:
To workaround this pin `awscli==1.23.8` in your deployment images due to the api-version change in [1.23.9](https://github.com/aws/aws-cli/blob/develop/CHANGELOG.rst#1239)


This PR was merged into the latest CLI release (1.23.9 in v1 and 2.6.3 in v2): https://github.com/aws/aws-cli/pull/6476

Kubernetes deprecated v1alpha1 so the CLI is now supporting v1beta1 instead.

For more context you can refer to the discussion in this issue: https://github.com/aws/aws-cli/issues/6920

We're going to reach out to the EKS team for more clarification on that error message and what to do regarding that.
1. upgrade to kubectl 1.24, i use homebrew.

2a. in your ~/.kube/config, it is still using v1alpha1, replace it too.

```yaml
users:
- name: [redact]
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1beta1 ### was client.authentication.k8s.io/v1alpha1
      args:
      - --region
      - [redact]
      - eks
      - get-token
      - --cluster-name
      - [redact]
      command: aws
      env:
      - name: AWS_PROFILE
        value: [redact]
      interactiveMode: IfAvailable
      provideClusterInfo: false
```

2b. Or delete your ~/.kube/config and use awscli to recreate again.

```shell
aws eks update-kubeconfig --name [cluster_name]
```



Resolving patch:
diff --git a/awscli/customizations/eks/get_token.py b/awscli/customizations/eks/get_token.py
--- a/awscli/customizations/eks/get_token.py
+++ b/awscli/customizations/eks/get_token.py
@@ -126,8 +126,8 @@ def _run_main(self, parsed_args, parsed_globals):
     def discover_api_version(self):
         """
         Parses the KUBERNETES_EXEC_INFO environment variable and returns the
-        API version. If the environment variable is empty, malformed, or
-        invalid, return the v1alpha1 response and print a message to stderr.
+        API version. If the environment variable is malformed or invalid,
+        return the v1beta1 response and print a message to stderr.
 
         If the v1alpha1 API is specified explicitly, a message is printed to
         stderr with instructions to update.
@@ -139,7 +139,7 @@ def discover_api_version(self):
         # "v1beta1" will be removed. At or around that time, EKS will likely
         # support v1.22 through v1.28, in which client API version "v1beta1"
         # will be supported by all EKS versions.
-        fallback_api_version = ALPHA_API
+        fallback_api_version = BETA_API
 
         error_prefixes = {
             "error": "Error parsing",
@@ -148,16 +148,12 @@ def discover_api_version(self):
 
         exec_info_raw = os.environ.get("KUBERNETES_EXEC_INFO", "")
         if not exec_info_raw:
-            # All kube clients should be setting this. Otherewise, we'll return
-            # the fallback and write an error.
-            uni_print(
-                ERROR_MSG_TPL.format(
-                    error_prefixes["empty"],
-                    fallback_api_version,
-                ),
-                sys.stderr,
-            )
-            uni_print("\n", sys.stderr)
+            # All kube clients should be setting this, but client-go clients
+            # (kubectl, kubelet, etc) < 1.20 were not setting this if the API
+            # version defined in the kubeconfig was not v1alpha1.
+            #
+            # This was changed in kubernetes/kubernetes#95489 so that
+            # KUBERNETES_EXEC_INFO is always provided
             return fallback_api_version
         try:
             exec_info = json.loads(exec_info_raw)
@@ -177,7 +173,7 @@ def discover_api_version(self):
         if api_version_raw in FULLY_SUPPORTED_API_VERSIONS:
             return api_version_raw
         elif api_version_raw in DEPRECATED_API_VERSIONS:
-            uni_print(DEPRECATION_MSG_TPL.format(ALPHA_API), sys.stderr)
+            uni_print(DEPRECATION_MSG_TPL.format(api_version_raw), sys.stderr)
             uni_print("\n", sys.stderr)
             return api_version_raw
         else:


Test patch:
diff --git a/tests/functional/eks/test_get_token.py b/tests/functional/eks/test_get_token.py
--- a/tests/functional/eks/test_get_token.py
+++ b/tests/functional/eks/test_get_token.py
@@ -86,7 +86,7 @@ def test_get_token(self, mock_datetime):
             response,
             {
                 "kind": "ExecCredential",
-                "apiVersion": "client.authentication.k8s.io/v1alpha1",
+                "apiVersion": "client.authentication.k8s.io/v1beta1",
                 "spec": {},
                 "status": {
                     "expirationTimestamp": "2019-10-23T23:14:00Z",
@@ -185,13 +185,13 @@ def test_api_version_discovery_malformed(self):
 
         self.assertEqual(
             response["apiVersion"],
-            "client.authentication.k8s.io/v1alpha1",
+            "client.authentication.k8s.io/v1beta1",
         )
 
         self.assertEqual(
             stderr,
             (
-                "Error parsing KUBERNETES_EXEC_INFO, defaulting to client.authentication.k8s.io/v1alpha1. "
+                "Error parsing KUBERNETES_EXEC_INFO, defaulting to client.authentication.k8s.io/v1beta1. "
                 "This is likely a bug in your Kubernetes client. Please update your Kubernetes client.\n"
             ),
         )
@@ -203,16 +203,10 @@ def test_api_version_discovery_empty(self):
 
         self.assertEqual(
             response["apiVersion"],
-            "client.authentication.k8s.io/v1alpha1",
+            "client.authentication.k8s.io/v1beta1",
         )
 
-        self.assertEqual(
-            stderr,
-            (
-                "Empty KUBERNETES_EXEC_INFO, defaulting to client.authentication.k8s.io/v1alpha1. "
-                "This is likely a bug in your Kubernetes client. Please update your Kubernetes client.\n"
-            ),
-        )
+        self.assertEqual(stderr, "",)
 
     def test_api_version_discovery_v1(self):
         self.set_kubernetes_exec_info('v1')
@@ -248,13 +242,13 @@ def test_api_version_discovery_unknown(self):
 
         self.assertEqual(
             response["apiVersion"],
-            "client.authentication.k8s.io/v1alpha1",
+            "client.authentication.k8s.io/v1beta1",
         )
 
         self.assertEqual(
             stderr,
             (
-                "Unrecognized API version in KUBERNETES_EXEC_INFO, defaulting to client.authentication.k8s.io/v1alpha1. "
+                "Unrecognized API version in KUBERNETES_EXEC_INFO, defaulting to client.authentication.k8s.io/v1beta1. "
                 "This is likely due to an outdated AWS CLI. Please update your AWS CLI.\n"
             ),
         )