
                             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	Zd
Zd Zd Zd Z G d de      Zy)zUtils for GKE Hub commands.    )absolute_import)division)print_function)unicode_literals)waiter)	kube_util)
exceptionsa  apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: memberships.hub.gke.io
spec:
  group: hub.gke.io
  scope: Cluster
  names:
    plural: memberships
    singular: membership
    kind: Membership
  versions:
  - name: v1beta1
    served: true
    storage: true
  validation:
    openAPIV3Schema:
      required:
      - spec
      properties:
        metadata:
          type: object
          properties:
            name:
              type: string
              pattern: '^(membership|test-.*)$'
        spec:
          type: object
          properties:
            owner:
              type: object
              properties:
                id:
                  type: string
                  description: Membership owner ID. Should be immutable.zykind: Membership
apiVersion: hub.gke.io/v1beta1
metadata:
  name: membership
spec:
  owner:
    id: projects/{project_id}c                     | j                         }|yd}|j                  |      s$t        j                  dj	                  |            |t        |      d S )a  Returns the project id of the fleet the cluster is a member of.

  The Membership Custom Resource stores the project id of the fleet the cluster
  is registered to in the `.spec.owner.id` field.

  Args:
    kube_client: A KubernetesClient.

  Returns:
    a string, the project id
    None, if the Membership CRD or CR do not exist on the cluster.

  Raises:
    exceptions.Error: if the Membership resource does not have a valid owner id
  Nz	projects/z(Membership .spec.owner.id is invalid: {})GetMembershipOwnerID
startswithr	   Errorformatlen)kube_clientowner_id	id_prefixs      Blib/googlecloudsdk/command_lib/container/fleet/exclusivity_util.pyGetMembershipCROwnerIDr   N   sb    " --/()			Y	'


299(CE E	#i./	""    c                 \    t         j                  |      }| j                  t        |       y)a  Creates or updates the Membership CRD and CR with the hub project id.

  Args:
    kube_client: A KubernetesClient.
    project: The project id of the hub the cluster is a member of.

  Raises:
    exceptions.Error: if the Membership CR or CRD couldn't be applied.
  )
project_idN)MEMBERSHIP_CR_TEMPLATEr   ApplyMembershipMEMBERSHIP_CRD_MANIFEST)r   projectmembership_cr_manifests      r   ApplyMembershipResourcesr   i   s*     288G8L57MNr   c           	         	 t        j                  t        j                         t	        |       dt        j
                  t        j                  t        j                  t        j                        \  }}|s$t        j                  dj                  |            y# t         j                  $ r t        j                  d      w xY w)zDeletes the Membership CRD.

  Due to garbage collection all Membership resources will also be deleted.

  Args:
    kube_client: A KubernetesClient.
  z%Deleting membership CR in the cluster)pre_start_sleep_msmax_wait_mswait_ceiling_mssleep_msz,Timeout deleting membership CR from cluster.z6Could not delete membership CR from cluster. Error: {}N)r   WaitForr   KubernetesPollerMembershipCRDeleteOperation"NAMESPACE_DELETION_INITIAL_WAIT_MSNAMESPACE_DELETION_TIMEOUT_MS'NAMESPACE_DELETION_MAX_POLL_INTERVAL_MS+NAMESPACE_DELETION_INITIAL_POLL_INTERVAL_MSTimeoutErrorr	   r   r   )r   	succeedederrors      r   DeleteMembershipResourcesr-   x   s    K~~""$#K0/$GG;;!IIFFHIu 



@GGNP P 
 
		 K 

I
JJKs   A2B )Cc                   "    e Zd ZdZd Zd Zd Zy)r%   z:An operation that waits for a membership CR to be deleted.c                 <    || _         d| _        d| _        d | _        y )NF)r   doner+   r,   )selfr   s     r   __init__z$MembershipCRDeleteOperation.__init__   s    "DDIDNDJr   c                      y)Nz<deleting membership CR> )r1   s    r   __str__z#MembershipCRDeleteOperation.__str__   s    %r   c                 r    | j                   j                         }|syd|v rd| _        d| _        y|| _        y)zEUpdates this operation with the latest membership CR deletion status.NNotFoundT)r   DeleteMembershipr0   r+   r,   )r1   errs     r   Updatez"MembershipCRDeleteOperation.Update   s=    



+
+
-C  Sdidndjr   N)__name__
__module____qualname____doc__r2   r5   r:   r4   r   r   r%   r%      s    B&r   r%   N)r>   
__future__r   r   r   r   googlecloudsdk.api_lib.utilr   *googlecloudsdk.command_lib.container.fleetr   googlecloudsdk.corer	   r   r   r   r   r-   objectr%   r4   r   r   <module>rD      sN    " &  % ' . @ *#L P! #6OP8& r   