
    >                     v   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S	KJr  S
rSS0r " S S\5      r\R*                  " \R,                  R.                  \R,                  R0                  5       " S S\R2                  \R4                  5      5       rS rS rS rS rS r S r!g)z;The command to get the status of Config Management Feature.    )absolute_import)division)unicode_literals)util)base)api_util)utils)logNAEXAMPLESa     Print the status of the Config Management feature:

    $ {command}

    Name            | Status | Last_Synced_Token | Sync_Branch | Last_Synced_Time              | Policy_Controller | Hierarchy_Controller | Version | Upgrades | Synced_To_Fleet_Default
    --------------- | ------ | ----------------- | ----------- | ----------------------------- | ----------------- | -------------------- | ------- | -------- | ----------------------------
    managed-cluster | SYNCED | 2945500b7f        | acme        | 2020-03-23 11:12:31 -0700 PDT | NA                | NA                   | 1.18.3  | auto     | FLEET_DEFAULT_NOT_CONFIGURED


  View the status for the cluster named `managed-cluster-a`:

    $ {command} --flatten=acm_status --filter="acm_status.name:managed-cluster-a"

  Use a regular expression to list status for multiple clusters:

    $ {command} --flatten=acm_status --filter="acm_status.name ~ managed-cluster.*"

  List all clusters where current Config Sync `Status` is `SYNCED`:

    $ {command} --flatten=acm_status --filter="acm_status.config_sync:SYNCED"

  List all the clusters where sync_branch is `v1` and current Config Sync
  `Status` is not `SYNCED`:

    $ {command} --flatten=acm_status --filter="acm_status.sync_branch:v1 AND -acm_status.config_sync:SYNCED"
  c                   6    \ rS rSrSrS rS rS rS rS r	Sr
g	)
ConfigmanagementFeatureState>   z&Feature state class stores ACM status.c                     Xl         [        U l        [        U l        [        U l        [        U l        [        U l        [        U l        [        U l        [        U l	        [        U l
        g N)namer   config_synclast_synced_tokenlast_syncedsync_branchpolicy_controller_statehierarchy_controller_stateversionupgradessynced_to_fleet_default)selfcluster_names     7lib/surface/container/fleet/config_management/status.py__init__%ConfigmanagementFeatureState.__init__A   sM    IDDDD#%D &(D#DLDM#%D     c                    UR                   b$  UR                   R                  R                  S:w  a  gUR                   R                  (       a  UR                   R                  R                  (       a(  UR                   R                  R                  SS U l        UR                   R                  R                  U l        [        U5      (       a0  UR                  R                  R                  R                  U l        ggg)znUpdate config_sync state for the membership that has ACM installed.

Args:
  fs: ConfigManagementFeatureState
NCONFIG_SYNC_INSTALLED   )configSyncStatestater   	syncState	syncTokenr   lastSyncTimer   has_config_sync_gitmembershipSpec
configSyncgit
syncBranchr   )r   fss     r   update_sync_state.ConfigmanagementFeatureState.update_sync_stateM   s     	"##((,CC	##				%	%	/	/!#!3!3!=!=!G!G!K++55BBd	R	 	 ,,77;;FF 
!	 $r!   c                    UR                   R                  R                  S:w  a+  SR                  UR                   R                  5      U l        gUR                  nUR                  (       a  UR                  R                  (       d  [        U l        gUR                  R                  nSUR                  0nUR                  (       aD  UR                  R                  (       a)  UR                  R                  S:  a  UR                  US'   UR                  5        HG  u  pVU(       d  M  UR                  S:w  a  SR                  XV5      U l          gUR                  U l        MI     g)	znUpdate policy controller state for the membership that has ACM installed.

Args:
  md: MembershipFeatureState
OKz	ERROR: {}NGatekeeperControllerManagerz1.4.1GatekeeperAudit	INSTALLEDz{} {})r&   coder   formatdescriptionr   configmanagementpolicyControllerStatedeploymentStater    gatekeeperControllerManagerStater+   r   gatekeeperAudititems)r   mdr/   pc_deployment_stateexpected_deploysdeployment_namedeployment_states          r   update_policy_controller_state;ConfigmanagementFeatureState.update_policy_controller_state`   s    
xx}}T!%0%7%78L8L%Md"			B
  R%=%=%M%M%'d"22BB%@@ 	%%%%/,?,O,O()-=-C-C-E)  K/'.~~(
$ 	%5%:%:d" .Fr!   c                    UR                   (       a  UR                   R                  (       d  [        U l        gUR                   R                  nSnSnUR                  (       a  UR                  R
                  nUR                  (       a  UR                  R
                  nSS[        S.nX44U;   a  UX44   U l        gSU l        g)a  Update hierarchy controller state for the membership that has ACM installed.

The PENDING state is set separately after this logic. The PENDING state
suggests the HC part in feature_spec and feature_state are inconsistent, but
the HC status from feature_state is not ERROR. This suggests that HC might
be still in the updating process, so we mark it as PENDING

Args:
  fs: ConfigmanagementFeatureState
NNOT_INSTALLEDr6   ))r6   r6   )r6   rH   )rH   rH   ERROR)hierarchyControllerStater&   r   r   hncr   	extension)r   r/   hc_deployment_state	hnc_state	ext_statedeploys_to_statuss         r   !update_hierarchy_controller_state>ConfigmanagementFeatureState.update_hierarchy_controller_state   s     ''B,G,G,M,M(*d%55;;II%))..i$$%//44i %0(3,.
 	!22(9
 )d% )0d%r!   c                 n  ^ USL =(       a    USLnU(       ah  [         R                  U l        [         R                  U l        [         R                  U l        U R
                  [        :X  a  [         R                  U l        U R                  R                  5       SS[        4;   a  U(       a  [         R                  U l        U4S jnU R                  R                  5       [         R                  :w  a  U(       d&  U" UR                  5      U" UR                  5      :w  a  [         R                  U l	        gg)zUpdate Config Management component states if spec does not match state.

Args:
  api: GKE Hub API
  feature_spec_mc: MembershipConfig
  feature_state_mc: MembershipConfig
Nr6   zGatekeeperAudit NOT_INSTALLEDc                 .   > U b  U $ TR                  5       $ r   ))ConfigManagementHierarchyControllerConfig)hc_specapis    r   <lambda>CConfigmanagementFeatureState.update_pending_state.<locals>.<lambda>   s     7#6 =::<=r!   )r	   STATUS_PENDINGr   r   r   r   r   r   __str__r   STATUS_ERRORhierarchyController)r   rW   feature_spec_mcfeature_state_mcfeature_state_pendinghc_semantic_copys    `    r   update_pending_state1ConfigmanagementFeatureState.update_pending_state   s     	D @_D%@  $33d--d--d			R	 //$$,,.8"=	>!%*%9%9d"	= 
 	''//1U5G5GG!O??@,@@AB ).(<(<d%Br!   )
r   r   r   r   r   r   r   r   r   r   N)__name__
__module____qualname____firstlineno____doc__r   r0   rE   rQ   rb   __static_attributes__ r!   r   r   r   >   s!    .
&G&$;L"0H"=r!   r   c                   <    \ rS rSrSr\rSr\S 5       r	S r
S rSrg)	Status   a  Print the status of all clusters with Config Management enabled.

The `Status` column indicates the status of the Config Sync component.
`Status` displays `NOT_INSTALLED` when Config Sync is not installed.
`Status` displays `NOT_CONFIGURED` when Config Sync is installed but git/oci
is not configured. `Status` displays `SYNCED` when Config Sync is installed
and git/oci is configured and the last sync was successful. `Status` displays
`ERROR` when Config Sync encounters errors. `Status` displays `STOPPED` when
Config Sync stops syncing configs to the cluster. `Status` displays
`PENDING` when Config Sync has not reached the desired state. Otherwise,
`Status` displays `UNSPECIFIED`.

The `Synced_to_Fleet_Default` status indicates whether each membership's
configuration has been synced with the [fleet-default membership configuration
](https://cloud.google.com/kubernetes-engine/fleet-management/docs/manage-features).
`Synced_to_Fleet_Default` displays `FLEET_DEFAULT_NOT_CONFIGURED` when
fleet-default membership configuration is not enabled.
`Synced_to_Fleet_Default` for an individual membership may be `UNKNOWN` if
configuration has yet to be applied to this membership since enabling
fleet-default membership configuration.
See the `enable` and `apply` commands for more details.
r:   c                 :    U R                   R                  S5        g )NaB  
    multi(acm_status:format='table(
            name:label=Name:sort=1,
            config_sync:label=Status,
            last_synced_token:label="Last_Synced_Token",
            sync_branch:label="Sync_Branch",
            last_synced:label="Last_Synced_Time",
            policy_controller_state:label="Policy_Controller",
            hierarchy_controller_state:label="Hierarchy_Controller",
            version:label="Version",
            upgrades:label="Upgrades",
            synced_to_fleet_default:label="Synced_to_Fleet_Default"
      )' , acm_errors:format=list)
    )display_info	AddFormat)parsers    r   ArgsStatus.Args   s    
!! # 	r!   c                 ^	   [         R                  " 5       u  p#U(       a%  [        R                  " SR	                  U5      5        U(       d  g U R                  5       U l        / n/ nU R                  R                  U R                  R                  5      R                  5        VVs0 s H0  u  pgUc  M
  UR                  c  M  [        R                  " U5      U_M2     snnU l        U R                  R                  U R                  R                  5      R                  5        VVs0 s H  u  pg[        R                  " U5      U_M     nnnU GHM  n	[        R                  " U	5      n	[!        U	5      n
U R#                  U	5      U
l        X;  aL  XR                  ;   a*  U
R'                  U R(                  U R                  U	   S 5        UR+                  U
5        M  X   nUR                  nUR,                  b  UR,                  R.                  c	  SU
l        GOsUc  [2        R4                  U
l        GOY[7        U5      (       a   [9        XR:                  R<                  U5        U
R?                  U5        [A        U5      (       dT  UR,                  R.                  RB                  S:w  a'  UR,                  R.                  RB                  U
l        GOSU
l        GOURD                  b_  URD                  RF                  bH  URD                  RF                  RB                  [2        RH                  :X  a  [2        RJ                  U
l&        O[2        RN                  U
l&        URD                  b  URD                  RP                  U
l(        URR                  R,                  b  [U        U5      U
l        U
RW                  U5        URR                  R<                  (       a   [9        XRR                  R<                  U5        [Y        U5      (       a*  [9        XRR                  RZ                  R<                  U5        U
R]                  U5        XR                  ;   a>  U
R'                  U R(                  U R                  U	   R                  URD                  5        UR+                  U
5        GMP     XTS.$ s  snnf s  snnf )NzHLocations {} are currently unreachable. Status entries may be incompleteCODE_UNSPECIFIEDr3   OPERATOR_STATE_UNSPECIFIED)
acm_errors
acm_status)/r   ListMembershipsFullr
   warningr8   
GetFeaturef	hubclientToPyDictmembershipSpecsr?   r:   r   MembershipPartialNamefeature_spec_membershipsmembershipStatesr   fleet_default_sync_statusr   rb   messagesappendr&   r7   r   r	   STATUS_NOT_INSTALLEDhas_operator_errorappend_erroroperatorStateerrorsrE   has_operator_stater   r+   
managementMANAGEMENT_AUTOMATICUPGRADES_AUTOr   UPGRADES_MANUALr   r%   config_sync_stater0   has_config_sync_sync_errorr'   rQ   )r   _membershipsunreachablerx   rw   msfeature_state_membershipsr   clusterr@   r/   s                r   Run
Status.Run   s   ';;=K	kk&&,f[&9 __DFJJ NN++DFF,B,BCIIK%KDA 	)// 	)""1%q(K%D! NN++DFF,C,CDJJL!LDA 	""1%q(L  !
 ''-d,T2g(,(F(Ft(Lg%		.000 
&
&mm++D1
 	'"$*bb 
	RXX]]20:#88 b!!
t--44j
A..r2!"%%XX]]4'"$((--"4"4G">G +##..:##..33++,  %22G$44G * //77GO %%1"3B"7G 
#
#B
' &&1188*E'++11;;BBJO 
3
3B
7222((--d3DD!!
  S T %??i%
!s   %	R#2R#R#%#R)c                    U R                   R                  (       d  gXR                  ;  d  U R                  U   R                  c  gU R                  U   R                  R                  nX R
                  R                  R                  R                  :X  a  gX R
                  R                  R                  R                  :X  d-  X R
                  R                  R                  R                  :X  a  gg)NFLEET_DEFAULT_NOT_CONFIGUREDUNKNOWNYESNO)r|   fleetDefaultMemberConfigr   origintyper   OriginTypeValueValuesEnumFLEETUSERFLEET_OUT_OF_SYNC)r   
membershipr   s      r   r    Status.fleet_default_sync_status`  s    66**+777%%j188@**:6==BBF%%99???--&&::???--&&::LLLr!   )r|   r   N)rd   re   rf   rg   rh   DETAILED_HELPdetailed_helpfeature_namestaticmethodrr   r   r   ri   rj   r!   r   rl   rl      s2    .  -#,	 	 a@Fr!   rl   c                    U R                   by  U R                   R                  bb  U R                   R                  R                  [        R                  [        R
                  4;   a   U R                   R                  R                  $ U R                   R                  R                  nUS:X  a  [        R
                  $ US:X  af  U R                   (       aE  U R                   R                  (       a*  U R                   R                  R                  R                  $ [        R                  $ US:X  a  [        R                  $ US:X  a  [        R                  $ g)zConvert state to a string shown to the users.

Args:
  fs: ConfigManagementFeatureState

Returns:
  a string shown to the users representing the Config Sync state.
CONFIG_SYNC_PENDINGr#   CONFIG_SYNC_NOT_INSTALLEDCONFIG_SYNC_ERRORUNSPECIFIED)r%   clusterLevelStopSyncingStater   r	   STATUS_STOPPEDrZ   r&   r'   r7   STATUS_INSTALLEDr   r\   )r/   cs_installation_states     r   r   r   o  s    	$



9
9
E	66;;@  <<AAA,,22773355	b00::))..333!!!99%%%11	r!   c                 f    U =(       a)    U R                   =(       a    U R                   R                  $ r   )r   r<   r/   s    r   r   r     s$    		E  	ER%5%5%E%EEr!   c                 f    U =(       a)    U R                   =(       a    U R                   R                  $ r   )r   r   r   s    r   r   r     s$    		<  	<R%5%5%<%<<r!   c                     U =(       aP    U R                   =(       a=    U R                   R                  =(       a     U R                   R                  R                  $ r   )r%   r'   r   r   s    r   r   r     sH     .


.



&
&. 


&
&
-
-	r!   c                     U R                   =(       a=    U R                   R                  =(       a     U R                   R                  R                  $ r   )r+   r,   r-   r   s    r   r*   r*     s>     +



&
&+



&
&
*
*r!   c                 P    U H   nUR                  XR                  S.5        M"     g )N)r   error)r   errorMessage)r   state_errorsrw   r   s       r   r   r     s#    e'4F4FGH r!   N)"rh   
__future__r   r   r   &googlecloudsdk.api_lib.container.fleetr   googlecloudsdk.callioper   *googlecloudsdk.command_lib.container.fleetr   <googlecloudsdk.command_lib.container.fleet.config_managementr	   3googlecloudsdk.command_lib.container.fleet.featuresfeature_basegooglecloudsdk.corer
   r   r   objectr   ReleaseTracksReleaseTrackALPHABETAFeatureCommandListCommandrl   r   r   r   r   r*   r   rj   r!   r   <module>r      s    B &  ' 7 ( ? N T # 
  >N=6 N=b D%%++T->->-C-CD\\(($*:*: \ E\~$NF=Ir!   