
    >                     v   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d	lmZ d
ZddiZ G d de      Z ej*                  ej,                  j.                  ej,                  j0                         G d dej2                  ej4                               Zd Zd Zd Zd Zd Z d Z!y)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                   .    e Zd ZdZd Zd Zd Zd Zd Zy)ConfigmanagementFeatureStatez&Feature state class stores ACM status.c                     || _         t        | _        t        | _        t        | _        t        | _        t        | _        t        | _        t        | _        t        | _	        t        | _
        y 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__z%ConfigmanagementFeatureState.__init__A   sO    DIDDDD#%D &(D#DLDM#%D     c                    |j                   #|j                   j                  j                  dk7  ry|j                   j                  r|j                   j                  j                  r(|j                   j                  j                  dd | _        |j                   j                  j                  | _        t        |      r0|j                  j                  j                  j                  | _        yyy)zzUpdate 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_statez.ConfigmanagementFeatureState.update_sync_stateM   s     	"##((,CC	##				%	%	/	/!#!3!3!=!=!G!G!K++55BBd	R	 ,,77;;FF 
!	 $r   c                    |j                   j                  j                  dk7  r+dj                  |j                   j                        | _        y|j                  }|j                  r|j                  j                  st        | _        y|j                  j                  }d|j                  i}|j                  r>|j                  j                  r(|j                  j                  dkD  r|j                  |d<   |j                         D ]A  \  }}|s	|j                  dk7  rdj                  ||      | _         y|j                  | _        C y)	zzUpdate 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_statez;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                 d   |j                   r|j                   j                  st        | _        y|j                   j                  }d}d}|j                  r|j                  j
                  }|j                  r|j                  j
                  }ddt        d}||f|v r|||f   | _        yd| _        y)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_INSTALLEDr3   ))r3   r3   )r3   rD   )rD   rD   ERROR)hierarchyControllerStater$   r   r   hncr   	extension)r   r-   hc_deployment_state	hnc_state	ext_statedeploys_to_statuss         r   !update_hierarchy_controller_statez>ConfigmanagementFeatureState.update_hierarchy_controller_state   s     ''B,G,G,M,M(*d%55;;II%))..i$$%//44i %0(3,.
 	9!22(9i
 )d% )0d%r   c                 :   |du xr |du}|rgt         j                  | _        t         j                  | _        t         j                  | _        | j
                  t        k(  rt         j                  | _        | j                  j                         ddt        fv r|rt         j                  | _        fd}| j                  j                         t         j                  k7  r|s% ||j                         ||j                        k7  rt         j                  | _	        yy)zUpdate Config Management component states if spec does not match state.

    Args:
      api: GKE Hub API
      feature_spec_mc: MembershipConfig
      feature_state_mc: MembershipConfig
    Nr3   zGatekeeperAudit NOT_INSTALLEDc                 ,    | | S j                         S r   ))ConfigManagementHierarchyControllerConfig)hc_specapis    r   <lambda>zCConfigmanagementFeatureState.update_pending_state.<locals>.<lambda>   s     7#6 =::<=r   )r	   STATUS_PENDINGr   r   r   r   r   r   __str__r   STATUS_ERRORhierarchyController)r   rR   feature_spec_mcfeature_state_mcfeature_state_pendinghc_semantic_copys    `    r   update_pending_statez1ConfigmanagementFeatureState.update_pending_state   s     	D @_D%@  $33d--d--d			R	 //$$,,.8"=	>!%*%9%9d"	= 
 	''//1U5G5GG!O??@,@@AB ).(<(<d%Br   N)	__name__
__module____qualname____doc__r   r.   rB   rM   r\    r   r   r   r   >   s!    .
&G&$;L"0H"=r   r   c                   4    e Zd ZdZeZdZed        Zd Z	d Z
y)Statusa3  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.
  r7   c                 :    | j                   j                  d       y )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   ArgszStatus.Args   s    
!! # 	r   c                    t        j                         \  }}|r$t        j                  dj	                  |             |sy | j                         | _        g }g }| j                  j                  | j                  j                        j                         D ci c])  \  }}|"|j                  t        j                  |      |+ c}}| _        | j                  j                  | j                  j                        j                         D ci c]  \  }}t        j                  |      | }}}|D ].  }	t        j                  |	      }	t!        |	      }
| j#                  |	      |
_        |	|vrJ|	| j                  v r*|
j'                  | j(                  | j                  |	   d        |j+                  |
       ||	   }|j                  }|j,                  |j,                  j.                  	d|
_        nZ|t2        j4                  |
_        nAt7        |      r!t9        |	|j:                  j<                  |       |
j?                  |       tA        |      sS|j,                  j.                  jB                  dk7  r'|j,                  j.                  jB                  |
_        nd|
_        n|jD                  ]|jD                  jF                  G|jD                  jF                  jB                  t2        jH                  k(  rt2        jJ                  |
_&        nt2        jN                  |
_&        |jD                  |jD                  jP                  |
_(        |jR                  j,                  tU        |      |
_        |
jW                  |       |jR                  j<                  r!t9        |	|jR                  j<                  |       tY        |      r+t9        |	|jR                  jZ                  j<                  |       |
j]                  |       |	| j                  v r>|
j'                  | j(                  | j                  |	   j                  |jD                         |j+                  |
       1 ||dS c c}}w c c}}w )NzHLocations {} are currently unreachable. Status entries may be incompleteCODE_UNSPECIFIEDr0   OPERATOR_STATE_UNSPECIFIED)
acm_errors
acm_status)/r   ListMembershipsFullr
   warningr5   
GetFeaturef	hubclientToPyDictmembershipSpecsr<   r7   r   MembershipPartialNamefeature_spec_membershipsmembershipStatesr   fleet_default_sync_statusr   r\   messagesappendr$   r4   r   r	   STATUS_NOT_INSTALLEDhas_operator_errorappend_erroroperatorStateerrorsrB   has_operator_stater   r)   
managementMANAGEMENT_AUTOMATICUPGRADES_AUTOr   UPGRADES_MANUALr   r#   config_sync_stater.   has_config_sync_sync_errorr%   rM   )r   _membershipsunreachablerm   rl   msfeature_state_membershipsr   clusterr=   r-   s                r   Runz
Status.Run   s   ';;=K	kk&&,f[&9 __DFJJ NN++DFF,B,BCIIK%KDAq=Q//; 	""1%q(K%D! NN++DFF,C,CDJJL!LDAq 	""1%q(L  !
 ''-d,T2g(,(F(Ft(Lg%	.	.4000 
&
&mm++D1
 	'"$T*bb 
	RXX]]20:#88 b!
tR--44j
A..r2!"%XX]]4'"$((--"4"4G">G +##..:##..33++,  %22G$44G * //77GO %%1"3B"7G 
#
#B
' &&r1188*E'+r11;;BBJO 
3
3B
7T222((--d3DD!!
  S T %J??i%
!s   .Q- Q3c                    | j                   j                  sy|| j                  vs| j                  |   j                  y| j                  |   j                  j                  }|| j
                  j                  j                  j                  k(  ry|| j
                  j                  j                  j                  k(  s-|| j
                  j                  j                  j                  k(  ryy)NFLEET_DEFAULT_NOT_CONFIGUREDUNKNOWNYESNO)rq   fleetDefaultMemberConfigrv   origintypery   OriginTypeValueValuesEnumFLEETUSERFLEET_OUT_OF_SYNC)r   
membershipr   s      r   rx   z Status.fleet_default_sync_status`  s    66**+$777%%j188@**:6==BBF%%99???$--&&::???$--&&::LLLr   N)r]   r^   r_   r`   DETAILED_HELPdetailed_helpfeature_namestaticmethodrh   r   rx   ra   r   r   rc   rc      s2    .  -#,	 	 a@Fr   rc   c                    | j                   v| j                   j                  `| j                   j                  j                  t        j                  t        j
                  fv r | j                   j                  j                  S | j                   j                  j                  }|dk(  rt        j
                  S |dk(  r\| j                   r@| j                   j                  r*| j                   j                  j                  j                  S t        j                  S |dk(  rt        j                  S |dk(  rt        j                  S y)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_STOPPEDrT   r$   r%   r4   STATUS_INSTALLEDr{   rV   )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                 R    | xr$ | j                   xr | j                   j                  S r   )r~   r9   r-   s    r   r   r     s$    		E  	ER%5%5%E%EEr   c                 R    | xr$ | j                   xr | j                   j                  S r   )r~   r   r   s    r   r|   r|     s$    		<  	<R%5%5%<%<<r   c                     | xrF | j                   xr8 | j                   j                  xr  | j                   j                  j                  S r   )r#   r%   r   r   s    r   r   r     sH     .


.



&
&. 


&
&
-
-	r   c                     | j                   xr8 | j                   j                  xr  | j                   j                  j                  S r   )r)   r*   r+   r   s    r   r(   r(     s>     +



&
&+



&
&
*
*r   c                 N    |D ]   }|j                  | |j                  d       " y )N)r   error)rz   errorMessage)r   state_errorsrl   r   s       r   r}   r}     s%    e'E4F4FGH r   N)"r`   
__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ListCommandrc   r   r   r|   r   r(   r}   ra   r   r   <module>r      s    B &  ' 7 ( ? N T # 
  >N=6 N=b D%%++T->->-C-CD\\(($*:*: \ E\~$NF=Ir   