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' ,
@@ -89,6 +90,14 @@ class GetTokenCommand(BasicCommand):
8990 ),
9091 'required' : False ,
9192 },
93+ {
94+ 'name' : 'cluster-id' ,
95+ # When EKS in-region cluster supports cluster-id, we will need to update this help text
96+ 'help_text' : (
97+ "Specify the id of the Amazon EKS cluster to create a token for. (Note: for local clusters on AWS Outposts only)"
98+ ),
99+ 'required' : False ,
100+ },
92101 ]
93102
94103 def get_expiration_time (self ):
@@ -102,7 +111,17 @@ def _run_main(self, parsed_args, parsed_globals):
102111 sts_client = client_factory .get_sts_client (
103112 region_name = parsed_globals .region , role_arn = parsed_args .role_arn
104113 )
105- token = TokenGenerator (sts_client ).get_token (parsed_args .cluster_name )
114+
115+ validate_mutually_exclusive (parsed_args , ['cluster_name' ], ['cluster_id' ])
116+
117+ if parsed_args .cluster_id :
118+ identifier = parsed_args .cluster_id
119+ elif parsed_args .cluster_name :
120+ identifier = parsed_args .cluster_name
121+ else :
122+ return ValueError ("Either parameter --cluster-name or --cluster-id must be specified." )
123+
124+ token = TokenGenerator (sts_client ).get_token (identifier )
106125
107126 # By default STS signs the url for 15 minutes so we are creating a
108127 # rfc3339 timestamp with expiration in 14 minutes as part of the token, which
@@ -189,18 +208,18 @@ class TokenGenerator(object):
189208 def __init__ (self , sts_client ):
190209 self ._sts_client = sts_client
191210
192- def get_token (self , cluster_name ):
211+ def get_token (self , k8s_aws_id ):
193212 """Generate a presigned url token to pass to kubectl."""
194- url = self ._get_presigned_url (cluster_name )
213+ url = self ._get_presigned_url (k8s_aws_id )
195214 token = TOKEN_PREFIX + base64 .urlsafe_b64encode (
196215 url .encode ('utf-8' )
197216 ).decode ('utf-8' ).rstrip ('=' )
198217 return token
199218
200- def _get_presigned_url (self , cluster_name ):
219+ def _get_presigned_url (self , k8s_aws_id ):
201220 return self ._sts_client .generate_presigned_url (
202221 'get_caller_identity' ,
203- Params = {'ClusterName' : cluster_name },
222+ Params = {K8S_AWS_ID_HEADER : k8s_aws_id },
204223 ExpiresIn = URL_TIMEOUT ,
205224 HttpMethod = 'GET' ,
206225 )
@@ -218,7 +237,7 @@ def get_sts_client(self, region_name=None, role_arn=None):
218237 client_kwargs ['aws_secret_access_key' ] = creds ['SecretAccessKey' ]
219238 client_kwargs ['aws_session_token' ] = creds ['SessionToken' ]
220239 sts = self ._session .create_client ('sts' , ** client_kwargs )
221- self ._register_cluster_name_handlers (sts )
240+ self ._register_k8s_aws_id_handlers (sts )
222241 return sts
223242
224243 def _get_role_credentials (self , region_name , role_arn ):
@@ -227,22 +246,20 @@ def _get_role_credentials(self, region_name, role_arn):
227246 RoleArn = role_arn , RoleSessionName = 'EKSGetTokenAuth'
228247 )['Credentials' ]
229248
230- def _register_cluster_name_handlers (self , sts_client ):
249+ def _register_k8s_aws_id_handlers (self , sts_client ):
231250 sts_client .meta .events .register (
232251 'provide-client-params.sts.GetCallerIdentity' ,
233- self ._retrieve_cluster_name ,
252+ self ._retrieve_k8s_aws_id ,
234253 )
235254 sts_client .meta .events .register (
236255 'before-sign.sts.GetCallerIdentity' ,
237- self ._inject_cluster_name_header ,
256+ self ._inject_k8s_aws_id_header ,
238257 )
239258
240- def _retrieve_cluster_name (self , params , context , ** kwargs ):
241- if 'ClusterName' in params :
242- context ['eks_cluster' ] = params .pop ('ClusterName' )
259+ def _retrieve_k8s_aws_id (self , params , context , ** kwargs ):
260+ if K8S_AWS_ID_HEADER in params :
261+ context [K8S_AWS_ID_HEADER ] = params .pop (K8S_AWS_ID_HEADER )
243262
244- def _inject_cluster_name_header (self , request , ** kwargs ):
245- if 'eks_cluster' in request .context :
246- request .headers [CLUSTER_NAME_HEADER ] = request .context [
247- 'eks_cluster'
248- ]
263+ def _inject_k8s_aws_id_header (self , request , ** kwargs ):
264+ if K8S_AWS_ID_HEADER in request .context :
265+ request .headers [K8S_AWS_ID_HEADER ] = request .context [K8S_AWS_ID_HEADER ]
0 commit comments