2222
2323from awscli .customizations .commands import BasicCommand
2424from awscli .customizations .utils import uni_print
25+ from awscli .customizations .utils import validate_mutually_exclusive
2526
2627AUTH_SERVICE = "sts"
2728AUTH_COMMAND = "GetCallerIdentity"
6263
6364TOKEN_PREFIX = 'k8s-aws-v1.'
6465
65- CLUSTER_NAME_HEADER = 'x-k8s-aws-id'
66+ K8S_AWS_ID_HEADER = 'x-k8s-aws-id'
6667
6768
6869class GetTokenCommand (BasicCommand ):
@@ -78,9 +79,9 @@ class GetTokenCommand(BasicCommand):
7879 {
7980 'name' : 'cluster-name' ,
8081 'help_text' : (
81- "Specify the name of the Amazon EKS cluster to create a token for."
82+ "Specify the name of the Amazon EKS cluster to create a token for. (Note: for local clusters on AWS Outposts, please use --cluster-id parameter) "
8283 ),
83- 'required' : True ,
84+ 'required' : False ,
8485 },
8586 {
8687 'name' : 'role-arn' ,
@@ -93,6 +94,14 @@ class GetTokenCommand(BasicCommand):
9394 ),
9495 'required' : False ,
9596 },
97+ {
98+ 'name' : 'cluster-id' ,
99+ # When EKS in-region cluster supports cluster-id, we will need to update this help text
100+ 'help_text' : (
101+ "Specify the id of the Amazon EKS cluster to create a token for. (Note: for local clusters on AWS Outposts only)"
102+ ),
103+ 'required' : False ,
104+ },
96105 ]
97106
98107 def get_expiration_time (self ):
@@ -106,7 +115,17 @@ def _run_main(self, parsed_args, parsed_globals):
106115 sts_client = client_factory .get_sts_client (
107116 region_name = parsed_globals .region , role_arn = parsed_args .role_arn
108117 )
109- token = TokenGenerator (sts_client ).get_token (parsed_args .cluster_name )
118+
119+ validate_mutually_exclusive (parsed_args , ['cluster_name' ], ['cluster_id' ])
120+
121+ if parsed_args .cluster_id :
122+ identifier = parsed_args .cluster_id
123+ elif parsed_args .cluster_name :
124+ identifier = parsed_args .cluster_name
125+ else :
126+ return ValueError ("Either parameter --cluster-name or --cluster-id must be specified." )
127+
128+ token = TokenGenerator (sts_client ).get_token (identifier )
110129
111130 # By default STS signs the url for 15 minutes so we are creating a
112131 # rfc3339 timestamp with expiration in 14 minutes as part of the token, which
@@ -193,18 +212,18 @@ class TokenGenerator(object):
193212 def __init__ (self , sts_client ):
194213 self ._sts_client = sts_client
195214
196- def get_token (self , cluster_name ):
215+ def get_token (self , k8s_aws_id ):
197216 """Generate a presigned url token to pass to kubectl."""
198- url = self ._get_presigned_url (cluster_name )
217+ url = self ._get_presigned_url (k8s_aws_id )
199218 token = TOKEN_PREFIX + base64 .urlsafe_b64encode (
200219 url .encode ('utf-8' )
201220 ).decode ('utf-8' ).rstrip ('=' )
202221 return token
203222
204- def _get_presigned_url (self , cluster_name ):
223+ def _get_presigned_url (self , k8s_aws_id ):
205224 return self ._sts_client .generate_presigned_url (
206225 'get_caller_identity' ,
207- Params = {'ClusterName' : cluster_name },
226+ Params = {K8S_AWS_ID_HEADER : k8s_aws_id },
208227 ExpiresIn = URL_TIMEOUT ,
209228 HttpMethod = 'GET' ,
210229 )
@@ -222,7 +241,7 @@ def get_sts_client(self, region_name=None, role_arn=None):
222241 client_kwargs ['aws_secret_access_key' ] = creds ['SecretAccessKey' ]
223242 client_kwargs ['aws_session_token' ] = creds ['SessionToken' ]
224243 sts = self ._session .create_client ('sts' , ** client_kwargs )
225- self ._register_cluster_name_handlers (sts )
244+ self ._register_k8s_aws_id_handlers (sts )
226245 return sts
227246
228247 def _get_role_credentials (self , region_name , role_arn ):
@@ -231,22 +250,20 @@ def _get_role_credentials(self, region_name, role_arn):
231250 RoleArn = role_arn , RoleSessionName = 'EKSGetTokenAuth'
232251 )['Credentials' ]
233252
234- def _register_cluster_name_handlers (self , sts_client ):
253+ def _register_k8s_aws_id_handlers (self , sts_client ):
235254 sts_client .meta .events .register (
236255 'provide-client-params.sts.GetCallerIdentity' ,
237- self ._retrieve_cluster_name ,
256+ self ._retrieve_k8s_aws_id ,
238257 )
239258 sts_client .meta .events .register (
240259 'before-sign.sts.GetCallerIdentity' ,
241- self ._inject_cluster_name_header ,
260+ self ._inject_k8s_aws_id_header ,
242261 )
243262
244- def _retrieve_cluster_name (self , params , context , ** kwargs ):
245- if 'ClusterName' in params :
246- context ['eks_cluster' ] = params .pop ('ClusterName' )
263+ def _retrieve_k8s_aws_id (self , params , context , ** kwargs ):
264+ if K8S_AWS_ID_HEADER in params :
265+ context [K8S_AWS_ID_HEADER ] = params .pop (K8S_AWS_ID_HEADER )
247266
248- def _inject_cluster_name_header (self , request , ** kwargs ):
249- if 'eks_cluster' in request .context :
250- request .headers [CLUSTER_NAME_HEADER ] = request .context [
251- 'eks_cluster'
252- ]
267+ def _inject_k8s_aws_id_header (self , request , ** kwargs ):
268+ if K8S_AWS_ID_HEADER in request .context :
269+ request .headers [K8S_AWS_ID_HEADER ] = request .context [K8S_AWS_ID_HEADER ]
0 commit comments