
    >                         d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z
 ddlmZ ddlmZ ddlmZ d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$y)z<Declarative hooks for Cloud Identity Groups Memberships CLI.    )absolute_import)division)unicode_literals)
exceptions)cloudidentity_client)hooks)timesc                     t        j                  |      }t        j                  |      }|j	                         |_        |S )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                     t        j                  |      }t        j                  |      }t	        |d      r>|j                  d      r-|j                  |j                        }||j                  _	        |S )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   sg     &&t,'""7+(T>"t'7'7'G##t'8'8#9J,6G)	.r   c                 t    t        |d      r+|j                  d      rt        |j                        |_        |S )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   s1     T;D$4$4[$A4>>*G	.r   c                     t        j                  |      }|j                  d      r&t        j                  ||j                  d      |_        |S )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/   [   sH     &&t,'	m$!<<!!?4GN 
.r   c                     t        j                  |      }t        |d      r9|j                  d      r(t        j                  ||j
                  d      |_        |S d|_        |S )r)   r*   r+   zgroups/-)r   r   r   r   r,   r*   r-   r.   s       r   SetTransitiveMembershipParentr1   q   s_     &&t,'T=!d&6&6}&E!<<!!?4GN 
.  GN	.r   c                    t        j                  |      }d}|j                  d      r |j                  d      rt        ||dd      }nt	        j
                  d      ||_        t        |d      r||j                  _        |S )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/(8:D 
-
-EG G ',Wl#"G	.r   c                     t        j                  |      }t        |d      r|j                  d      sg }t	        ||      |j
                  _        |S t	        ||j                        |j
                  _        |S )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<      sl     &&t,'	w	t'7'7'@J6w
KG 
.  7w

KG	.r   c                    t        |j                  d      st        j                  dd      t	        |j                  j
                        dk7  rt        j                  dd      t        j                  |      }t        |d      rd|j                  d      rS|dk(  r(t        ||j                  d      |j                  _        |S t        |||j                        |j                  _        |S )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*(<
4??E)+g% 
. "B
7DOO"-g 
.r   c                 R   g }t        |d      r;|j                  d      r*|j                  dj                  |j                               t        |d      r;|j                  d      r*|j                  dj                  |j
                               dj                  |      |_        |S )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
MM'..t/@/@ABT8!1!1(!;
MM"))$++67))F#'-	.r   c                     t        j                  |      }t        |d      r6|j                  d      r%t	        ||j
                        |j                  _        |S )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     sI     &&t,'T7 0 0 96w

KG	.r   c                 P   t        |d      r|j                  d      r|j                  j                  d      }t	        j
                  |      }g }t        j                  |      }|D ]%  }|j                  |      }|j                  |       ' |j                  |      |_        |S )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$$S)I ((.GE$$W-H //T/:oll?#  ,4+P+P ,Q ,G( 
.r   c                     t        |d      rf|j                  d      rUt        j                  |      }t	        j
                  |      }|j                  t        ||j                              |_	        |S )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  ss     T"$(,(8(89N(O((.G$$W-H+3+P+P3$**, ,Q ,-G( 
.r   c                 r   t        j                  | |j                  |      }	 t        j                  | ||j
                        j                  S # t        j                  t        j                  f$ rE |dz   |z   }dj                  |j                  |j
                        }t        j                  ||      w xY w)aa  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t1(I))4,,..2d3

0
0

/
/
1 	I $d*_<N%&,fT-=-=-1->->'@  
-
-ni
HH	Is   *A A(B6c                     t        j                  |       }d|z   }t        |      }| dk(  r|dk(  r|j                  |      S |j	                  |      S )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                     t        j                  |       }g }|s#|j                  |j                  d             |S |D ]%  }|j                  |      }|j                  |       ' |S )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                     g }| dk(  r|j                  d       |st        j                  |d      dj                  |      S )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                 z    d}t        j                  t        j                  | t         j                        |      S )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                 V   t        j                  |       }g }d}|j                  j                  D ]^  }t	        |d      r?|j
                  dk(  r0d}|j                  |j                  dt        | |d                   N|j                  |       ` |st        j                  dd      |S )	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**+GZG + I J ll4 ' 


-
-KM M 
,r   c                    |j                  d      }t        j                  |       }t        j                  |      }g }d}|D ]  }t        ||      \  }}	}
|	dk(  r,|dk7  r'dj                  |      }t        j                  ||      t        ||
d      }|j                  ||      }t        |	|      }|j                  ||      }|j                  |        |S )	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#<H$& D)[ L TX%5PVD\ //)DD )79M-- . /O  	84K%-%I%Io &J &?" 67+ 5. 
r   c                     | j                  d      }t        |      dk(  r|d   |d   |d   fS t        j                  |d| z         )aj  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   