
    L                         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Z
dZ G d	 d
ej                        Zd Zd Zy)z;Common logic between commands on Config Management surface.    )utils)base)	constants)
exceptions)yamlz{} must be a YAML mapping node. This field should either contain indented key, value pairs or have the empty map {{}} as its value. See --help flag output for links to examples.zw{} must be a YAML list. This field should contain indented list elements. See --help flag output for links to examples.c                   R    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdefdZy)CommonzCCommon operations between commands on Config Management surface.
  c           
         	 t        j                  |      }t        |       | j                  j                  | j                  |      | j                  |      | j                  |      | j                  |      |j                  di       j                  dd      |d   j                  t        j                              S # t         j                  $ r*}t        j                  dj	                  |      |      d}~ww xY w)ap  Parse a Config Management membership spec from config_file_path.

    Args:
      config_file_path: Path to file with syntax following the --config flag of
        the apply command.
    Returns:
      config_management: Populated ConfigManagementMembershipSpec message.
    Raises: Any errors during parsing. May not check semantic meaning of
      field values.
    zInvalid config yaml file {}Nspeccluster )
configSyncpolicyControllerhierarchyController
managementr   version)r   	load_pathErrorr   format_validate_metamessagesConfigManagementMembershipSpec_parse_config_sync_parse_policy_controller"_parse_hierarchy_controller_config_parse_upgradesgetr   VERSION)selfconfig_file_pathconfiges       Klib/googlecloudsdk/command_lib/container/fleet/config_management/command.pyparse_config_managementzCommon.parse_config_management+   s    ~~./f
 6 ==77**6266v> CCFK''/

62&**9b9v""5==1 8   :: 
'
.
./?
@! s   B? ?C<%C77C<c                    d|vst         j                  |d   vryt        |d   t         j                     t              s9t	        j
                  t        j                  dt         j                  z               |d   t         j                     }t        |t        j                  t         j                        d   t         j                           }|r_t	        j
                  dj                  dj                  |D cg c]"  }dj                  t         j                  |      $ c}                  | j                  j                         }t         j                  |v r;t!        |t         j                  | j#                  |t         j                                  d|_        d|v r
|d   |_        |j'                  d	d
      }|d
k(  r| j)                  |      |_        nO|dk(  r| j-                  |      |_        n3t	        j
                  dj                  t         j                  |            d|v r
|d   |_        d|v r
|d   |_        d|v r
|d   |_        d|v r
|d   |_        |S c c}w )a:  Load ConfigSync configuration with the parsed configmanagement yaml.

    Args:
      configmanagement: dict, The data loaded from the config-management.yaml
        given by user.

    Returns:
      config_sync: The ConfigSync configuration holds configmanagement.spec.git
      or configmanagement.spec.oci being used in MembershipConfigs
    Raises: gcloud core Error, if the configSync field on configmanagement has
      invalid syntax. Note that this function does not check semantic meaning of
      field values, other than for .spec.configSync.sourceType.
    r   N.spec.!Please remove illegal field(s) {}, z.spec.{}.{}Tenabled
sourceTypegitocizL.spec.{}.sourceType has illegal value {}. Please replace with `git` or `oci`sourceFormatstopSyncingpreventDriftmetricsGcpServiceAccountEmail)r   CONFIG_SYNC
isinstancedictr   r   MAP_NODE_EXCEPTION_FORMATr   _find_unknown_fieldsr   loadAPPLY_SPEC_VERSION_1joinr   ConfigManagementConfigSyncDEPLOYMENT_OVERRIDESsetattr_parse_deployment_overridesr)   r   _parse_git_configr+   _parse_oci_configr,   r-   r.   r/   r0   )r   configmanagementspec_sourceillegal_fieldsfconfig_syncsource_types          r#   r   zCommon._parse_config_syncM   sa     	&&$4V$<<&v.u/@/@A4H
#
*
*8E4E4E+E
F  #6*5+<+<=K)+*.))E4N4N*O+1+3383D3D+FGN @GG
)),., #))%*;*;Q?,. / 	 	
 --::<K!![0


$
$

*
*%445 KK'	2k//,6Ke..{;ko		..{;ko0061	 	 $!,^!<k# +M :k$!,^!<k&+52=
)3k/ Q.s   :'I#c                 n   t        |t              s9t        j                  t        j                  dt        j                  z               g }|D ]  }t        |ddt        j                  h      }|rDt        j                  dj                  dj                  |D cg c]  }d|z   	 c}                  |j                  | j                  j                  |j                  dd      |j                  dd      | j                  |j                  t        j                  g                           |S c c}w )	z@Load DeploymentOverrides with the parsed config-management.yaml..spec.configSync.name	namespacer'   r(   z%.spec.configSync.deploymentOverrides.r   )deploymentNamedeploymentNamespace
containers)r2   listr   r   LIST_EXCEPTION_FORMATr   r   r:   r5   CONTAINER_OVERRIDESr8   appendr   "ConfigManagementDeploymentOverrider   _parse_containers)r   spec_deployment_overridesdeployment_overridesdeployment_overriderA   rB   s         r#   r<   z"Common._parse_deployment_overrides   s?   /6

&
&!E$>$>> 
 8+
''n 
/66		++ <a?+ 
 	
 !!
--
:
:044VR@"5"9"9r# //%))%*C*CRH ; 
%  9:  #s   D2c                    t        |t              sMt        j                  t        j                  dt        j                  z   dz   t        j                  z               g }|D ]  }t        |h d      }|rDt        j                  dj                  dj                  |D cg c]  }d|z   	 c}                  |j                  | j                  j                  |j                  dd      |j                  d	d      |j                  d
d      |j                  dd      |j                  dd                    |S c c}w )z7Load Containers with the parsed config-management.yaml.rF   .>   rG   cpuLimit
cpuRequestmemoryLimitmemoryRequestr'   r(   z0.spec.configSync.deploymentOverrides.containers.rG   r   rX   rZ   rW   rY   )containerNamerX   rZ   rW   rY   )r2   rL   r   r   rM   r   r   r:   rN   r5   r8   rO   r   !ConfigManagementContainerOverrider   )r   spec_containersrK   	containerrA   rB   s         r#   rQ   zCommon._parse_containers   sF   ot,

&
&!**+ ))*  J$	+
	n 
/66		++ GJ+ 
 	
 
--
9
9%MM&"5"|R8%MM/2> }}Z4#--r: : ) %: s   D<c                     | j                   j                         }d|v r
|d   |_        dD ]  }||v st        ||||           |S )a  Load GitConfig with the parsed config_sync yaml.

    Args:
      spec_source: The config_sync dict loaded from the config-management.yaml
        given by user.

    Returns:
      git_config: The GitConfig configuration being used in MembershipConfigs
    syncWait)	policyDir
secretType
syncBranchsyncReposyncRev
httpsProxygcpServiceAccountEmail)r   ConfigManagementGitConfigsyncWaitSecsr;   )r   r@   
git_configfields       r#   r=   zCommon._parse_git_config   sZ     88:J[  +J 7j 
+	
E;u#56     c                     | j                   j                         }d|v r
|d   |_        dD ]  }||v st        ||||           |S )zLoad OciConfig with the parsed config_sync yaml.

    Args:
      spec_source: The config_sync dict loaded from the config-management.yaml
        given by user.

    Returns:
      oci_config: The OciConfig being used in MembershipConfigs
    r`   )ra   rb   rd   rg   )r   ConfigManagementOciConfigri   r;   )r   r@   
oci_configrk   s       r#   r>   zCommon._parse_oci_config  sZ     88:J[  +J 7j 
+	
E;u#56 rl   c                    d|vsd|d   vryt        |d   d   t              s(t        j                  t        j                  d            |d   d   }d|vrt        j                  d      |d   }t        |t              st        j                  d      | j                  j                         }t        |h d      }|rDt        j                  d	j                  d
j                  |D cg c]  }d|z   	 c}                  |D ]9  }|dk(  r"| j                  ||         }t        |||       *t        ||||          ; |S c c}w )a(  Load PolicyController with the parsed config-management.yaml.

    Args:
      configmanagement: dict, The data loaded from the config-management.yaml
        given by user.

    Returns:
      policy_controller: The Policy Controller configuration for
      MembershipConfigs, filled in the data parsed from
      configmanagement.spec.policyController
    Raises:
      gcloud core Error, if Policy Controller has invalid syntax. Note that
      this function does not check semantic meaning of field values other than
      monitoring backends.
    r   r   Nz.spec.policyControllerr)   z5Missing required field .spec.policyController.enabledz4policyController.enabled should be `true` or `false`>   r)   
monitoringmutationEnabledlogDeniesEnabledauditIntervalSecondsexemptableNamespacesreferentialRulesEnabledtemplateLibraryInstalledr'   r(   z.spec.policyController.rq   )r2   r3   r   r   r4   r   boolr    ConfigManagementPolicyControllerr5   r8   _build_monitoring_msgr;   )	r   r?   spec_policy_controllerr)   policy_controllerrA   rB   rk   rq   s	            r#   r   zCommon._parse_policy_controller  s}   $ 	&&%5f%==&v./ABDI
#
*
*+C
D  .f56HI..
A  %Y/Ggt$
@  FFH **@ 	C 	N @GG
)).I.Q.q0.I
J 	 	 (	,	//0Fu0MN
!5*5!5*@*GH (  Js   )Ec                    t        |t              s(t        j                  t        j                  d            |j                  dg       }|syt        j                  | j                        fd}	 |D cg c]
  } ||       }}| j                  j                  |      S c c}w # t        t        f$ r t        j                  d      w xY w)a  Build PolicyControllerMonitoring message from the parsed spec.

    Args:
      spec_monitoring: dict, The monitoring data loaded from the
        config-management.yaml given by user.

    Returns:
      monitoring: The Policy Controller Monitoring configuration for
      MembershipConfigs, filled in the data parsed from
      configmanagement.spec.policyController.monitoring
    Raises: gcloud core Error, if spec_monitoring is invalid, including its
      backend values.
    z!.spec.policyController.monitoringbackendsNc                     j                  | j                               }|s$t        j                  dj	                  |             |S )Nz8policyController.monitoring.backend {} is not recognized)r   lowerr   r   r   )backendresult	converters     r#   convertz-Common._build_monitoring_msg.<locals>.convertv  sE    }}W]]_-fFMM
 	

 mrl   zk.spec.policyController.monitoring.backend must be a sequence of strings. See --help flag output for details)r~   )r2   r3   r   r   r4   r   r   r   monitoring_backend_converterr   	TypeErrorAttributeError*ConfigManagementPolicyControllerMonitoring)r   spec_monitoringr~   r   r   monitoring_backendsr   s         @r#   rz   zCommon._build_monitoring_msg]  s     ot,
#
*
*+N
O  "":r2H 66t}}EI=EFX'WW-XF ==CC$ D   G~& : s   4B* 8B%B* %B* *%Cc                 @   d|vsd|d   vryt        |d   d   t              s(t        j                  t        j                  d            |d   d   }d|vrt        j                  d      t        |d   t              st        j                  d      | j                  j                         }t        |h d      }|rDt        j                  d	j                  d
j                  |D cg c]  }d|z   	 c}                  |D ]  }t        ||||           |S c c}w )a  Load HierarchyController with the parsed config-management.yaml.

    Args:
      configmanagement: dict, The data loaded from the config-management.yaml
        given by user.

    Returns:
      hierarchy_controller: The Hierarchy Controller configuration for
      MembershipConfigs, filled in the data parsed from
      configmanagement.spec.hierarchyController
    Raises: gcloud core Error, if Hierarchy Controller has invalid syntax. Note
      that this function does not check semantic meaning of field values.
    r   r   Nz.spec.hierarchyControllerr)   z8Missing required field .spec.hierarchyController.enabledz7hierarchyController.enabled should be `true` or `false`>   r)   enablePodTreeLabelsenableHierarchicalResourceQuotar'   r(   z.spec.hierarchyController.)r2   r3   r   r   r4   r   rx   r   )ConfigManagementHierarchyControllerConfigr5   r8   r;   )r   r?   r   config_protorA   rB   rk   s          r#   r   z)Common._parse_hierarchy_controller_config  sD     	&& (8(@@&v./DEtL
#
*
*+F
G  F#$9:D
D  d9ot,
C  ==JJLL *$ 1 N
 @GG
))^L^1!3^L
M 	 	 lE4;/   Ms   'Dreturnc                    |j                  di       j                  t        j                  d      }t        j                  t        j                  t        j
                  g}dj                  d |D              }||vr3t        j                  dj                  t        j                  |            | j                  j                  }|t        j                  k(  r|j                  j                  S |j                  j                  S )aV  Parse configmanagement `.spec.upgrades` into management  enum.

    Args:
      configmanagement: dict of file contents for --config flag on apply command
        that represents Config Management membership spec.
    Returns:
      v1main ConfigManagementMembershipSpec management value.
    Raises: gcloud core Error for invalid value.
    r   r    c              3   (   K   | ]
  }d | d   yw)'N ).0rk   s     r#   	<genexpr>z)Common._parse_upgrades.<locals>.<genexpr>  s     ClUawaLls   z*The valid values of field .spec.{} are: {})r   r   UPGRADESUPGRADES_AUTOUPGRADES_MANUALUPGRADES_EMPTYr8   r   r   r   r   r   ManagementValueValuesEnumMANAGEMENT_AUTOMATICMANAGEMENT_MANUAL)r   r?   upgradeslegal_fieldsvalid_valuesspec_apis         r#   r   zCommon._parse_upgrades  s      ##FB/33ENNBGHL
 88ClCCL|#
6
=
=nnl 
 }};;H5&&&//DDD//AAArl   N)__name__
__module____qualname____doc__r$   r   r<   rQ   r=   r>   r   rz   r   strr   r   rl   r#   r	   r	   '   sK     DFP& P)V60@D+Z4lB Brl   r	   c                 |   t        | t              st        j                  d      t	        | ddh      }|rDt        j                  dj                  dj                  |D cg c]  }d|z   	 c}                  d| vrt        j                  d      | d   dk7  rt        j                  d	      d| vrt        j                  d
      t        | d   t              s(t        j                  t        j                  d            t	        | d   t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  h      }|rDt        j                  dj                  dj                  |D cg c]  }d|z   	 c}                  yc c}w c c}w )zValidate the parsed configmanagement yaml.

  Args:
    configmanagement: Data type loaded from yaml.
  Raises: gcloud core Error, if the top-level fields have invalid syntax.
  z"Invalid ConfigManagement template.applySpecVersionr   r'   r(   rV   z(Missing required field .applySpecVersion   zOnly "applySpecVersion: 1" is supported. To use a later version,please fetch the config by running
gcloud container fleet config-management fetch-for-applyzMissing required field .specz.specr&   N)r2   r3   r   r   r5   r   r8   r4   r   r1   POLICY_CONTROLLERHNCCLUSTERr   r   )r?   illegal_root_fieldsrB   illegal_spec_fieldss       r#   r   r     s    
$d	+


?
@@,-=@  


>EE		"56"5Q3q5"567  
 //


E
FF()Q.


	C 
 ##


9
::	$V,d	3


4;;GD
EE,-=f-EiimmnnmmH  


>EE		':;':!8A:':;<   1 74 <s   F4F9c                 D    g }| D ]  }||vs|j                  |        |S )zReturns the list of string elements in source not in known_fields.

  Args:
    source: The source iterable to check.
    known_fields: The collection of known fields.
  )rO   )sourceknown_fieldsrA   rk   s       r#   r5   r5     s1     .eL E"  
rl   N)r   <googlecloudsdk.command_lib.container.fleet.config_managementr   3googlecloudsdk.command_lib.container.fleet.featuresr   ;googlecloudsdk.command_lib.container.fleet.policycontrollerr   googlecloudsdk.corer   r   r4   rM   FeatureCommandr	   r   r5   r   rl   r#   <module>r      sO    B N D Q * $N 5 tBT   tBn*Zrl   