
    >                         S r SSKJr  SSKJr  SSKJr  SSKJr  SSKJ	r
  SSKJr  SSKJr  SSKJr  S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS r S r!S r"S r#S r$g)z<Declarative hooks for Cloud Identity Groups Memberships CLI.    )absolute_import)division)unicode_literals)
exceptions)cloudidentity_client)hooks)timesc                     [         R                  " U5      n[        R                  " U5      nUR	                  5       Ul        U$ )zSet Membership in request.

Args:
  unused_ref: unused.
  args: The argparse namespace.
  request: The request to modify.

Returns:
  The updated request.

)groups_hooksGetApiVersion	ci_clientGetMessages
Membership
membership
unused_refargsrequestversionmessagess        Clib/googlecloudsdk/command_lib/identity/groups/memberships/hooks.pySetMembershipr      s:     &&t,'""7+(**,'	.    c                     [         R                  " U5      n[        R                  " U5      n[	        US5      (       a?  UR                  S5      (       a)  UR                  UR                  S9nXRR                  l	        U$ )zSet EntityKey in group resource.

Args:
  unused_ref: unused.
  args: The argparse namespace.
  request: The request to modify.

Returns:
  The updated request.

member_email)id)
r   r   r   r   hasattrIsSpecified	EntityKeyr   r   preferredMemberKey)r   r   r   r   r   
entity_keys         r   SetEntityKeyr"   2   sk     &&t,'""7+(T>""t'7'7'G'G##t'8'8#9J,6)	.r   c                     [        US5      (       a0  UR                  S5      (       a  [        UR                  5      Ul        U$ )zSet page size to request.pageSize.

Args:
  unused_ref: unused.
  args: The argparse namespace.
  request: The request to modify.

Returns:
  The updated request.

	page_size)r   r   intr$   pageSize)r   r   r   s      r   SetPageSizer'   H   s7     T;D$4$4[$A$A4>>*G	.r   c                     [         R                  " U5      nUR                  S5      (       a&  [         R                  " X1R                  S5      Ul        U$ )Set resource name to request.parent.

Args:
  unused_ref: unused.
  args: The argparse namespace.
  request: The request to modify.

Returns:
  The updated request.

group_email--group-email)r   r   r   ConvertEmailToResourceNamer*   parentr   r   r   r   s       r   SetMembershipParentr/   [   sI     &&t,'	m$$!<<!!?4GN 
.r   c                     [         R                  " U5      n[        US5      (       a>  UR                  S5      (       a(  [         R                  " X1R
                  S5      Ul        U$ SUl        U$ )r)   r*   r+   zgroups/-)r   r   r   r   r,   r*   r-   r.   s       r   SetTransitiveMembershipParentr1   q   sc     &&t,'T=!!d&6&6}&E&E!<<!!?4GN 
.  GN	.r   c                 $   [         R                  " U5      nSnUR                  S5      (       a$  UR                  S5      (       a  [        X1SS5      nO[        R
                  " S5      eXBl        [        US5      (       a  XBR                  l        U$ )zSet membership resource name to request.name.

Args:
  unused_ref: unused.
  args: The argparse namespace.
  request: The request to modify.

Returns:
  The updated request.

 r*   r   r+   z--member-emailz;Must specify `--group-email` and `--member-email` argument.r   )	r   r   r   $ConvertEmailToMembershipResourceNamer   InvalidArgumentExceptionnamer   r   )r   r   r   r   r6   s        r   SetMembershipResourceNamer7      s     &&t,'	$	m$$)9)9.)I)I/(8:D 
-
-EG G ,Wl##"	.r   c                    [         R                  " U5      n[        US5      (       a  UR                  S5      (       d  / n[	        X45      UR
                  l        U$ [	        X1R                  5      UR
                  l        U$ )zSet MembershipRoles to request.membership.roles.

Args:
  unused_ref: unused.
  args: The argparse namespace.
  request: The request to modify.

Returns:
  The updated request.

roles)r   r   r   r   ReformatMembershipRolesr   r9   )r   r   r   r   
empty_lists        r   SetMembershipRolesr<      sn     &&t,'	w		t'7'7'@'@J6wKG 
.  7w

KG	.r   c                    [        UR                  S5      (       d  [        R                  " SS5      e[	        UR                  R
                  5      S:w  a  [        R                  " SS5      e[        R                  " U5      n[        US5      (       ah  UR                  S5      (       aR  US:X  a'  [        X1R                  S5      UR                  l        U$ [        X2UR                  5      UR                  l        U$ )a  Set expiration to request.membership.expiryDetail (v1alpha1) or in request.membership.roles (v1beta1).

Args:
  unused_ref: unused.
  args: The argparse namespace.
  request: The request to modify.

Returns:
  The updated request.

Raises:
  InvalidArgumentException: If 'expiration' is specified upon following cases:
  1. 'request.membership' doesn't have 'roles' attribute, or
  2. multiple roles are provided.

r9   
expirationzroles must be specified.   z9When setting "expiration", a single role should be input.v1alpha1add)r   r   r   r5   lenr9   r   r   r   ReformatExpiryDetailr>   expiryDetail AddExpiryDetailInMembershipRolesr.   s       r   SetExpiryDetailrF      s    , 
##W	-	-

-
-02 2 				!	!"a'

-
-CE E &&t,'T<  T%5%5l%C%C*(<
??E)+g% 
. "B
DOO"-g 
.r   c                 z   / n[        US5      (       a@  UR                  S5      (       a*  UR                  SR                  UR                  5      5        [        US5      (       a@  UR                  S5      (       a*  UR                  SR                  UR
                  5      5        SR                  U5      Ul        U$ )zSets query paremeters to request.query.

Args:
  unused_ref: unused.
  args: The argparse namespace.
  request: The request to modify.

Returns:
  The updated request.
r   zmember_key_id=='{}'labelsz'{}' in labelsz&&)r   r   appendformatr   rH   joinquery)r   r   r   paramss       r   SetTransitiveQueryrN      s     &T>""t'7'7'G'G
MM'..t/@/@ABT8!1!1(!;!;
MM"))$++67))F#'-	.r   c                     [         R                  " U5      n[        US5      (       a:  UR                  S5      (       a$  [	        X1R
                  5      UR                  l        U$ )zUpdate MembershipRoles to request.membership.roles.

Args:
  unused_ref: unused.
  args: The argparse namespace.
  request: The request to modify.

Returns:
  The updated request.

r9   )r   r   r   r   r:   r9   r   r.   s       r   UpdateMembershipRolesrP     sM     &&t,'T7 0 0 9 96w

KG	.r   c                 `   [        US5      (       a  UR                  S5      (       a  UR                  R                  S5      n[        R
                  " U5      n/ n[        R                  " U5      nU H#  nUR                  US9nUR                  U5        M%     UR                  US9Ul        U$ )zUpdate 'MembershipRoles' to request.modifyMembershipRolesRequest.

Args:
  unused_ref: unused.
  args: The argparse namespace.
  request: The request to modify.

Returns:
  The updated request.

	add_roles,r6   )addRoles)r   r   rR   splitr   r   r   r   MembershipRolerI   ModifyMembershipRolesRequestmodifyMembershipRolesRequest)	r   r   r   	role_listr   r9   r   rolemembership_roles	            r   UpdateRolesr]     s     T;D$4$4[$A$A$$S)I ((.GE$$W-H //T/:oll?#  ,4+P+P ,Q ,G( 
.r   c                     [        US5      (       ai  UR                  S5      (       aS  [        R                  " U5      n[        R
                  " U5      nUR                  [        XR                  5      S9Ul	        U$ )a  Update 'MembershipRoles' to request.modifyMembershipRolesRequest.

Args:
  unused_ref: A string representing the operation reference. Unused and may
    be None.
  args: The argparse namespace.
  request: The request to modify.

Returns:
  The updated request.

update_roles_params)updateRolesParams)
r   r   r   r   r   r   rX   ReformatUpdateRolesParamsr_   rY   r   s        r   SetUpdateRolesParamsrb   7  sy     T"$ $(,(8(89N(O(O((.G$$W-H+3+P+P3**, ,Q ,-G( 
.r   c                 t   [         R                  " XR                  U5      n [        R                  " XUR
                  5      R                  $ ! [        R                  [        R                  4 aE    US-   U-   nSR                  UR                  UR
                  5      n[        R                  " XV5      ef = f)aQ  Convert email to membership resource name.

Args:
  version: Release track information
  args: The argparse namespace
  group_arg_name: argument/parameter name related to group info
  member_arg_name: argument/parameter name related to member info

Returns:
  Membership Id (e.g. groups/11zu0gzc3tkdgn2/memberships/1044279104595057141)

z, zKThere is no such membership associated with the specified arguments: {}, {})r   r,   r*   r   LookupMembershipNamer   r6   apitools_exceptionsHttpForbiddenErrorHttpNotFoundErrorrJ   r   r5   )r   r   group_arg_namemember_arg_namegroup_idparameter_name	error_msgs          r   r4   r4   Q  s      441(I))4,,..2d3

0
0

/
/
1 	I $d*_<N%&,fT-=-=-1->->'@  
-
-n
HH	Is   *A A)B7c                     [         R                  " U 5      nSU-   n[        U5      nU S:X  a  US:X  a  UR                  US9$ UR	                  US9$ )zReformat expiration string to ExpiryDetail object.

Args:
  version: Release track information
  expiration: expiration string.
  command: gcloud command name.

Returns:
  ExpiryDetail object that contains the expiration data.

Pr@   modify-membership-roles)
expireTime)r   r   FormatDateTimeMembershipRoleExpiryDetailExpiryDetail)r   r>   commandr   durationexpiration_tss         r   rC   rC   s  s`     ""7+(:( *-
w*CC..-.HH			-		88r   c                     [         R                  " U 5      n/ nU(       d   UR                  UR                  SS95        U$ U H#  nUR                  US9nUR                  U5        M%     U$ )zReformat roles string to MembershipRoles object list.

Args:
  version: Release track information
  roles_list: list of roles in a string format.

Returns:
  List of MembershipRoles object.

MEMBERrT   )r   r   rI   rW   )r   
roles_listr   r9   r[   new_membership_roles         r   r:   r:     sm     ""7+(
%		LL((h(78Ld"11t1<	LL$%  
,r   c                     / nU S:X  a  UR                  S5        U(       d  [        R                  " US5      eSR                  U5      $ )a  Set the update mask on the request based on the role param.

Args:
  role_param: The param that needs to be updated for a specified role.
  arg_name: The argument name

Returns:
  Update mask

Raises:
  InvalidArgumentException: If no fields are specified to update.

r>   zexpiry_detail.expire_timez%Must specify at least one field mask.rS   )rI   r   r5   rK   )
role_paramarg_nameupdate_masks      r   GetUpdateMaskr     sM     +<23	

-
-9; ; 
+	r   c                 r    Sn[         R                  " [         R                  " U [         R                  S9US9$ )zReturn RFC3339 string for datetime that is now + given duration.

Args:
  duration: string ISO 8601 duration, e.g. 'P5D' for period 5 days.

Returns:
  string timestamp

z%Y-%m-%dT%H:%M:%S.%3f%Oz)tzinfo)fmt)r	   rq   ParseDateTimeUTC)ru   r   s     r   rq   rq     s4     	##			(59953
@ @r   c                 n   [         R                  " U 5      n/ nSnUR                  R                   Hb  n[	        US5      (       a=  UR
                  S:X  a-  SnUR                  UR                  S[        XS5      S95        MQ  UR                  U5        Md     U(       d  [        R                  " SS5      eU$ )	a  Add an expiration in request.membership.roles.

Args:
  version: version
  request: The request to modify
  expiration: expiration date to set

Returns:
  The updated roles.

Raises:
  InvalidArgumentException: If 'expiration' is specified without MEMBER role.

Fr6   rx   TrA   r6   rD   r>   z3Expiration date can be set with a MEMBER role only.)r   r   r   r9   r   r6   rI   rW   rC   r   r5   )r   r   r>   r   r9   has_member_roler[   s          r   rE   rE     s      ""7+(
%/  &&dtVh!6oll8**+GG + I J ll4 ' 


-
-KM M 
,r   c                    UR                  S5      n[        R                  " U 5      n[        R                  " U5      n/ nSnU H  n[        Xv5      u  pn
U	S:X  a-  US:w  a'  SR                  U5      n[        R                  " Xk5      e[        X:S5      nUR                  XS9n[        X5      nUR                  XS9nUR                  U5        M     U$ )	a  Reformat update_roles_params string.

Reformatting update_roles_params will be done by following steps,
1. Split the comma separated string to a list of strings.
2. Convert the splitted string to UpdateMembershipRolesParams message.

Args:
  args: The argparse namespace.
  update_roles_params: A comma separated string.

Returns:
  A list of reformatted 'UpdateMembershipRolesParams'.

Raises:
  InvalidArgumentException: If invalid update_roles_params string is input.
rS   z--update-roles-paramsr>   rx   z;Membership Expiry is not supported on a specified role: {}.ro   r   )	fieldMaskmembershipRole)rV   r   r   r   r   TokenizeUpdateRolesParamsrJ   r   r5   rC   rW   r   UpdateMembershipRolesParamsrI   )r   r_   update_roles_params_listr   r   roles_paramsr}   update_roles_paramr[   	param_keyparam_valuerl   expiry_detailr\   r~   update_membership_roles_paramss                   r   ra   ra     s    & 166s;&&t,'""7+(,$(4#<$& D[ L TX%5PVD\ //DD )79M-- . /O  	4K%-%I%I &J &?" 67+ 5. 
r   c                     U R                  S5      n[        U5      S:X  a  US   US   US   4$ [        R                  " USU -   5      e)aX  Tokenize update_roles_params string.

Args:
  update_roles_param: 'update_roles_param' string (e.g. MEMBER=expiration=3d)
  arg_name: The argument name

Returns:
  Tokenized strings: role (e.g. MEMBER), param_key (e.g. expiration), and
  param_value (e.g. 3d)

Raises:
  InvalidArgumentException: If invalid update_roles_param string is input.
=   r   r?      zInvalid format: )rV   rB   r   r5   )r   r}   
token_lists      r   r   r   (  sX     "'',*_a=*Q-A66++"%77	9 9r   N)%__doc__
__future__r   r   r   apitools.base.pyr   re   googlecloudsdk.api_lib.identityr   r   googlecloudsdk.calliope*googlecloudsdk.command_lib.identity.groupsr   r   googlecloudsdk.core.utilr	   r   r"   r'   r/   r1   r7   r<   rF   rN   rP   r]   rb   r4   rC   r:   r   rq   rE   ra   r    r   r   <module>r      s     C &  ' > M . L *(,&,2<.)X0(@4ID9.44@&!H0f9r   