
    G                     <   d Z ddlmZ ddlmZ ddlmZ ddlZddlmZ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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  ej<                  dddd      ZdZ dZ! G d d      Z" G d d      Z#y)z)Functions to add flags in fleet commands.    )absolute_import)division)unicode_literalsN)IteratorList)messages)types)util)arg_parsers)base)
exceptions)parser_arguments)parser_extensions)concepts)errors)	arg_utils)concept_parsers)	resourcesz--all-membershipsstore_constTzAll memberships in the fleet.)actionconsthelpz8projects/([^/]+)/platforms/gke/policies/([a-zA-Z0-9_-]+)z1Cannot specify --{opt} without --{prerequisite}.
c                      e Zd ZdZdej
                  fdZed        Zede	e
   fd       Zede
fd       Zedej                  fd       Zd	 Zd
 Zd Zdej
                  fdZdej
                  fdZdej
                  fdZdej
                  fdZdej
                  fdZdej
                  fdZdej
                  fdZd Zd Zd Zd Zy)
FleetFlagsz'Add flags to the fleet command surface.parserc                     || _         y N_parser)selfr   s     7lib/googlecloudsdk/command_lib/container/fleet/flags.py__init__zFleetFlags.__init__>   s     DL    c                     | j                   S r   r   r    s    r!   r   zFleetFlags.parserD   s    <<r#   returnc                 .    | j                   j                  S )a3  Returns the command name.

    This provides information on the command track, command group, and the
    action.

    Returns:
      A list of command, for `gcloud alpha container fleet operations describe`,
      it returns `['gcloud', 'alpha', 'container', 'fleet', 'operations',
      'describe']`.
    )r   command_namer%   s    r!   r(   zFleetFlags.command_nameH   s     ;;###r#   c                      | j                   d   S )N)r(   r%   s    r!   r   zFleetFlags.actionV   s    R  r#   c                     | j                   d   dk(  rt        j                  j                  S | j                   d   dk(  rt        j                  j                  S t        j                  j
                  S )z6Returns the release track from the given command name.   alphabeta)r(   r   ReleaseTrackALPHABETAGAr%   s    r!   release_trackzFleetFlags.release_trackZ   s`     w&$$$			1		'###!!!r#   c                 V    t         j                  j                  | j                         y r   )r   
ASYNC_FLAGAddToParserr   r%   s    r!   AddAsynczFleetFlags.AddAsyncd   s    OO,r#   c                 H    | j                   j                  dt        d       y )Nz--display-namezcDisplay name of the fleet to be created (optional). 4-30 characters, alphanumeric and [ '"!-] only.)typer   r   add_argumentstrr%   s    r!   AddDisplayNamezFleetFlags.AddDisplayNameg   s$    KK:	  r#   c                     | j                   j                  d      }| j                  |       | j                  |       | j	                  |       y )Nz9Default cluster configurations to apply across the fleet.r   )r   	add_group_AddSecurityPostureConfig_AddBinaryAuthorizationConfig_AddCompliancePostureConfig)r    default_cluster_config_groups     r!   AddDefaultClusterConfigz"FleetFlags.AddDefaultClusterConfigq   sN    #';;#8#8H $9 $  	""#?@&&'CD$$%ABr#   rD   c                 l    |j                  d      }| j                  |       | j                  |       y )NzSecurity posture config.r?   )r@   _AddSecurityPostureMode%_AddWorkloadVulnerabilityScanningMode)r    rD   security_posture_config_groups      r!   rA   z$FleetFlags._AddSecurityPostureConfigy   s?     %A$J$J' %K %! 	  !>?../LMr#   rI   c                 X    |j                  dg dd t        j                  d             y )N--security-posturedisabledstandard
enterprisez          To apply standard security posture to clusters in the fleet,

            $ {command} --security-posture=standard

          choicesdefaultr   r;   textwrapdedentr    rI   s     r!   rG   z"FleetFlags._AddSecurityPostureMode   s1     "..6__  	 / 
r#   c                 X    |j                  dg dd t        j                  d             y )N!--workload-vulnerability-scanningrL   z            To apply standard vulnerability scanning to clusters in the fleet,

              $ {command} --workload-vulnerability-scanning=standard

            rP   rS   rV   s     r!   rH   z0FleetFlags._AddWorkloadVulnerabilityScanningMode   s1     "..+6__  	 / 
r#   c                 l    |j                  d      }| j                  |       | j                  |       y )NzBinary Authorization config.r?   )r@   _AddBinauthzEvaluationMode_AddBinauthzPolicyBindings)r    rD   !binary_authorization_config_groups      r!   rB   z(FleetFlags._AddBinaryAuthorizationConfig   s?     )E(N(N+ )O )% 	##$EF##$EFr#   r\   c           	      \    |j                  dddgd d t        j                  d             y )N--binauthz-evaluation-moderM   policy-bindingsc                 B    | j                  dd      j                         S )N_-)replacelower)xs    r!   <lambda>z7FleetFlags._AddBinauthzEvaluationMode.<locals>.<lambda>   s    qyyc*002r#   z          Configure binary authorization mode for clusters to onboard the fleet,

            $ {command} --binauthz-evaluation-mode=policy-bindings

          )rQ   r9   rR   r   rS   )r    r\   s     r!   rZ   z%FleetFlags._AddBinauthzEvaluationMode   s<     &22$./ 3__   3 r#   c                     t        j                  t        d      }|j                  dd ddt	        j
                  d      t        j                  d|idgd      	       y )
NzsGKE policy resource names have the following format: `projects/{project_number}/platforms/gke/policies/{policy_id}`--binauthz-policy-bindingsappendzname=BINAUTHZ_POLICYz          The relative resource name of the Binary Authorization policy to audit
          and/or enforce. GKE policies have the following format:
          `projects/{project_number}/platforms/gke/policies/{policy_id}`.namer,   )specrequired_keys
max_length)rR   r   metavarr   r9   )r   RegexpValidator_BINAUTHZ_GKE_POLICY_REGEXr;   rT   rU   ArgDict)r    r\   platform_policy_types      r!   r[   z%FleetFlags._AddBinauthzPolicyBindings   sw     '66"	I
 &22$&__ M N   , "(
 3 r#   c           	          |j                  dd      }|j                  dddgddt        j                  d	      
       |j                  dt	        j
                         ddt        j                  d             y)z'Add compliance (posture) configuration.zCompliance configuration.T)r   hiddenz--complianceenabledrM   Nzcompliance=MODEz          To enable compliance for clusters in the fleet,

            $ {command} --compliance=enabled

          To disable compliance for clusters in the fleet,

            $ {command} --compliance=disabled

            )rQ   rR   rn   r   z--compliance-standardszcompliance-standards=STANDARDSz          To configure compliance standards for clusters in the fleet supply a
          comma-delimited list:

            $ {command} --compliance-standards=standard-1,standard-2

          If this flag is supplied, it cannot be empty.
          )r9   rR   rn   r   )r@   r;   rT   rU   r   ArgList)r    rD   compliance_posture_config_groups      r!   rC   z&FleetFlags._AddCompliancePostureConfig   s     'C&L&L( 'M '# $00J'!__ 	 	 1   $00   "0__   1 r#   c                     t        j                  ddt        j                  | j                     | j                         t         j                        S )Nz$gkehub.projects.locations.operations	operation)resource_nameapi_versionlocationsId
projectsId)r   ResourceSpecr
   VERSION_MAPr3   _LocationAttributeConfig DEFAULT_PROJECT_ATTRIBUTE_CONFIGr%   s    r!   _OperationResourceSpecz!FleetFlags._OperationResourceSpec   sD      .!$$T%7%78113<< r#   c                    t         j                  j                  d| j                         dj	                  | j
                        d      j                  | j                         | j                  j                  d       y )Nry   zoperation to {}.T)
group_helprequiredglobal)location)	r   ConceptParserForResourcer   formatr   r6   r   set_defaultsr%   s    r!   AddOperationResourceArgz"FleetFlags.AddOperationResourceArg  sd    !!--##%%,,T[[9	 . 
 k$++KKh/r#   c                 0    t        j                  dd      S )z.Gets Google Cloud location resource attribute.r   z)Google Cloud location for the {resource}.)rj   	help_text)r    ResourceParameterAttributeConfigr%   s    r!   r   z#FleetFlags._LocationAttributeConfig  s    44= r#   c                 J    | j                   j                  dt        dd       y )Nz
--locationzThe location name.rb   )r9   r   rR   r:   r%   s    r!   AddLocationzFleetFlags.AddLocation  s%    KK!	  r#   N)__name__
__module____qualname____doc__r   ArgumentInterceptorr"   propertyr   r   r<   r(   r   r   r/   r3   r7   r=   rE   rA   rG   rH   rB   rZ   r[   rC   r   r   r   r    r#   r!   r   r   ;   s5   /22   $DI $ $ !c ! ! "T.. " "-CN*:*N*NN+;+O+O+;+O+OG*:*N*NG)9)M)M&)9)M)M6%*:*N*N%N0r#   r   c                   @   e Zd ZdZdej
                  dej                  fdZde	j                  defdZde	j                  fdZddej                  fd
ZdefdZdefdZdefdZdej(                  fdZdej,                  fdZdej0                  fdZ	 ddej4                  fdZdej8                  fdZdeej>                     fdZ 	 ddejB                  dejB                  fdZ"	 ddejF                  fdZ$de%jL                  fdZ'defdZ(de)fdZ*de)fdZ+y	)FleetFlagParserz)Parse flags during fleet command runtime.argsr3   c                 T    || _         || _        t        j                  |      | _        y r   )r   r3   r
   GetMessagesModuler   )r    r   r3   s      r!   r"   zFleetFlagParser.__init__#  s%     DI&D**=9DMr#   messager&   c                 (    | t        |             k(  S )zDetermines if a message is empty.

    Args:
      message: A message to check the emptiness.

    Returns:
      A bool indictating if the message is equivalent to a newly initialized
      empty message instance.
    )r9   r    r   s     r!   IsEmptyzFleetFlagParser.IsEmpty*  s     md7mo%%r#   c                 *    | j                  |      s|S y)z/Trim empty messages to avoid cluttered request.N)r   r   s     r!   	TrimEmptyzFleetFlagParser.TrimEmpty6  s     << nr#   Nc                     | j                   j                         }t        j                  | j	                               |_        | j                         |_        | j                  |      |_	        |S )zFleet resource.)
r   Fleetr
   FleetResourceNameProjectrj   _DisplayNamedisplayName_DefaultClusterConfigdefaultClusterConfig)r    existing_fleetfleets      r!   r   zFleetFlagParser.Fleet=  sW     MM!E''7EJ))+E!%!;!;N!KELr#   c                 .    | j                   j                  S r   )r   display_namer%   s    r!   r   zFleetFlagParser._DisplayNameF  s    99!!!r#   c                 F    t        j                  | j                  dd      S )Nz	--projectT)use_defaults)r   GetFromNamespacer   r%   s    r!   r   zFleetFlagParser.ProjectI  s    %%dii4PPr#   c                 .    | j                   j                  S )zParses --async flag.

    The internal representation of --async is set to args.async_, defined in
    calliope/base.py file.

    Returns:
      bool, True if specified, False if unspecified.
    )r   async_r%   s    r!   AsynczFleetFlagParser.AsyncL  s     99r#   c                     | j                   j                         }| j                         |_        | j	                         |_        | j                  |      S r   )r   SecurityPostureConfig_SecurityPostureModemode!_VulnerabilityModeValueValuesEnumvulnerabilityModer   )r    rets     r!   _SecurityPostureConfigz&FleetFlagParser._SecurityPostureConfigW  sD    
--
-
-
/C((*CH BBDC>>#r#   c                     d| j                   j                         vry| j                  j                  j                  }|j
                  |j                  |j                  d}|| j                   j                     S )zParses --security-posture.rK   NrL   )	r   GetSpecifiedArgsr   r   ModeValueValuesEnumDISABLEDBASIC
ENTERPRISEsecurity_posturer    	enum_typemappings      r!   r   z$FleetFlagParser._SecurityPostureMode]  sh     499#=#=#??33GGI&&OO**G
 499--..r#   c                     d| j                   j                         vry| j                  j                  j                  }|j
                  |j                  |j                  d}|| j                   j                     S )z)Parses --workload-vulnerability-scanning.rX   NrL   )	r   r   r   r    VulnerabilityModeValueValuesEnumVULNERABILITY_DISABLEDVULNERABILITY_BASICVULNERABILITY_ENTERPRISEworkload_vulnerability_scanningr   s      r!   r   z1FleetFlagParser._VulnerabilityModeValueValuesEnuml  sq     +$))2L2L2NN 	++LL  441188G
 499<<==r#   c                 B   | j                   j                         }| j                         |_        t	        | j                               |_        ||}n<|}|j                  |j                  |_        |j                  |j                  |_        |j                  r7|j                  s+t        j                  dt        j                  dd            |j                  | j                   j                  j                  j                  k(  rg |_        | j                  |      S )z$Construct binauthz config from args.rh   zbinauthz-evaluation-modezbinauthz-policy-bindings)prerequisiteopt)r   BinaryAuthorizationConfig_EvaluationModeevaluationModelist_PolicyBindingspolicyBindingsr   InvalidArgumentException_PREREQUISITE_OPTION_ERROR_MSGr   EvaluationModeValueValuesEnumr   r   )r    existing_binauthznew_binauthzr   s       r!   _BinaryAuthorizationConfigz*FleetFlagParser._BinaryAuthorizationConfig}  s    ==::<L"&"6"6"8L"&t';';'=">L  cc		$	$	0)88		$	$	0)88 #"4"4//
&
(
/
/5, 0   //MMVV c>>#r#   c                     d| j                   j                         vry| j                  j                  j                  }|j
                  |j                  d}|| j                   j                     S )z"Parses --binauthz-evaluation-mode.r^   N)rM   r_   )r   r   r   r   r   r   POLICY_BINDINGSbinauthz_evaluation_moder   s      r!   r   zFleetFlagParser._EvaluationMode  sh     $499+E+E+GG 	//MM  &&$44G 4995566r#   c                 N      j                   j                  }| fd|D        S g S )z"Parses --binauthz-policy-bindings.c              3   \   K   | ]#  }j                   j                  |d           % yw)rj   )rj   N)r   PolicyBinding).0bindingr    s     r!   	<genexpr>z2FleetFlagParser._PolicyBindings.<locals>.<genexpr>  s/      (g --
%
%76?
%
;(s   ),)r   binauthz_policy_bindings)r    policy_bindingss   ` r!   r   zFleetFlagParser._PolicyBindings  s1    ii88O"(  Ir#   existing_cfgc                 b   ||n| j                   j                         }| j                  j                  '| j                  j                  | j                  |      S | j                  j                  | j                  j                  dvr)t        j                  | j                  j                        | j                  j                  dk(  r+| j                  j                  t        j                  d      | j                  j                  dk(  r0| j                   j                  j                  j                  |_        nH| j                  j                  dk(  r/| j                   j                  j                  j                  |_        |j                  t        j                  d      | j                  j                  [| j                  j                  D cg c]  }| j                   j                  |        }}|st        j                  d      ||_        | j                  |      S c c}w )z0Construct compliance (posture) config from args.>   ru   rM   rM   z@Cannot configure compliance standards when disabling Compliance.ru   zECannot configure compliance standards without a mode first being set.)rN   z@--compliance-standards must be a non-empty comma-delimited list.)r   CompliancePostureConfigr   
compliancecompliance_standardsr   r   InvalidComplianceModeConfiguringDisabledCompliancer   ENABLEDr   r   ConfiguringMissingComplianceComplianceStandardcomplianceStandards)r    r   cfgsdesired_standardss        r!   _CompliancePostureConfigz(FleetFlagParser._CompliancePostureConfig  s    # 	]]224  yy#		(F(F(N^^C   yy'			%<	<**499+?+?@@ ))

*
,ii,,822N
 	
 
			*MM11EEMM 	 99:-MM11EENN 	
 xx//  yy%%1 99111a --
*
*A
*
61   11N
 	
 !2c>>#s   #H,c                    ||j                   nd}| j                  j                         }| j                         |_        |!| j                  |j                        |_        n| j                         |_        |!| j                  |j                        |_        n| j                         |_        | j                  |      S )zConstruct default cluster config from args.

    Args:
      existing_fleet_cfg: proto message of any currently existing configuration.

    Returns:
      Proto message for the default cluster configuration.
    N)
r   r   DefaultClusterConfigr   securityPostureConfigr   binaryAuthorizationConfigr   compliancePostureConfigr   )r    existing_fleet_cfgexisting_default_cluster_configr   s       r!   r   z%FleetFlagParser._DefaultClusterConfig  s     ) 	// $
 --
,
,
.C $ ; ; =C&2&*&E&E
)
C
C'c# '+&E&E&Gc#&2$($A$A
)
A
A%c! %)$A$A$Cc!>>#r#   c                 ^    | j                   j                  j                  j                         S )z#Parses resource argument operation.)r   CONCEPTSry   Parser%   s    r!   OperationRefzFleetFlagParser.OperationRef  s!    99''--//r#   c                 .    | j                   j                  S r   )r   r   r%   s    r!   LocationzFleetFlagParser.Location  s    99r#   c                 .    | j                   j                  S )z$Returns page size in a list request.)r   	page_sizer%   s    r!   PageSizezFleetFlagParser.PageSize  s    99r#   c                 .    | j                   j                  S )z Returns limit in a list request.)r   limitr%   s    r!   LimitzFleetFlagParser.Limit!  s    99??r#   r   ),r   r   r   r   r   	Namespacer   r/   r"   r   Messageboolr   r   r	   r   r<   r   r   r   r   r   (SecurityPostureConfigModeValueValuesEnumr   5SecurityPostureConfigVulnerabilityModeValueValuesEnumr   r   r   6BinaryAuthorizationConfigEvaluationModeValueValuesEnumr   r   r   r   r   r   r   r   r   Resourcer  r  intr  r	  r   r#   r!   r   r      sz   1:#--:>B>O>O:
&X-- 
&$ 
&x// %++ "C "Qs Q	T 	e&A&A /55/>BB>$ #!&&!F7CC7 x(;(;<  ;?7777$$7v ! !!!F0I.. 0  S r#   r   )$r   
__future__r   r   r   rT   typingr   r   apitools.base.protorpcliter   &googlecloudsdk.api_lib.container.fleetr	   r
   googlecloudsdk.callioper   r   r   r   r    googlecloudsdk.calliope.conceptsr   *googlecloudsdk.command_lib.container.fleetr   $googlecloudsdk.command_lib.util.apisr   (googlecloudsdk.command_lib.util.conceptsr   googlecloudsdk.corer   ArgumentALL_MEMBERSHIPS_FLAGrp   r   r   r   r   r#   r!   <module>r     s    0 &  '  ! / 8 7 / ( . 4 5 5 = : D ) %t}}
	(	  ? " b bJC Cr#   