
    )                     
   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d	lmZ dd
lmZ ddlmZ  G d dej&                        ZdZdZeedZd Zd Zd Zd Zd Zd Zd Zd Zd Z y)z*'functions deploy' utilities for triggers.    )absolute_import)division)unicode_literals)
exceptions)triggers)util)storage_util)log)
properties)	resourcesc                       e Zd ZdZy)TriggerCompatibilityErrorzARaised when deploy trigger is incompatible with existing trigger.N)__name__
__module____qualname____doc__     Blib/googlecloudsdk/command_lib/functions/v1/deploy/trigger_util.pyr   r       s    Ir   r   a2  The `--trigger-bucket` flag corresponds to the `google.storage.object.finalize` event on file creation.  You are trying to update a function that is using the legacy `providers/cloud.storage/eventTypes/object.change` event type. To get the legacy behavior, use the `--trigger-event` and `--trigger-resource` flags e.g. `gcloud functions deploy --trigger-event providers/cloud.storage/eventTypes/object.change --trigger-resource [your_bucket_name]`.Please see https://cloud.google.com/storage/docs/pubsub-notifications for more information on storage event types.a  The format of the Pub/Sub event source has changed.  You are trying to update a function that is using the legacy `providers/cloud.pubsub/eventTypes/topic.publish` event type. To get the legacy behavior, use the `--trigger-event` and `--trigger-resource` flags e.g. `gcloud functions deploy --trigger-event providers/cloud.pubsub/eventTypes/topic.publish --trigger-resource [your_topic_name]`.)z0providers/cloud.storage/eventTypes/object.changez/providers/cloud.pubsub/eventTypes/topic.publishc                     | j                  d      sN| j                  d      s<| j                  d      s*| j                  d      st        j                  g dd      y y y y )Ntrigger_topictrigger_buckettrigger_httptrigger_event)z--trigger-topicz--trigger-bucket--trigger-httpz--trigger-eventz9You must specify a trigger when deploying a new function.)IsSpecifiedcalliope_exceptionsOneOfArgumentsRequiredException)argss    r   CheckTriggerSpecifiedr    D   sm    
'			*	+			.	)			/	*

=
=	
 	D  
+ 
* 
, (r   c                    t         j                  j                  |       }|j                  }|t         j                  k7  rmt         j                  j                  ||       j                  }|A|t         j                  j                  k7  r$t        j                  dj                  |             |r|rt        j                  dd      yy)a3  Check if args related function triggers are valid.

  Args:
    trigger_event: The trigger event
    trigger_resource: The trigger resource
    retry_specified: Whether or not `--retry` was specified
    trigger_http_specified: Whether or not `--trigger-http` was specified

  Raises:
    FunctionsError.
  NzAYou must provide --trigger-resource when using --trigger-event={}r   z--retry)r   TRIGGER_PROVIDER_REGISTRYProviderForEventlabelUNADVERTISED_PROVIDER_LABELEventresource_type	ResourcesPROJECTr   FunctionsErrorformatr   ConflictingArgumentsException)r   trigger_resourceretry_specifiedtrigger_http_specifiedtrigger_providertrigger_provider_labelr'   s          r   ValidateTriggerArgsr2   V   s     77HH ,11xCCC66<<m  MX5G5G5O5O$O%%%vm4  /

;
;)  0_r   c                     | dd }dd|dS )N   zcloud.storagezgoogle.storage.object.finalizer0   r   r-   r   )r   bucket_names     r   _GetBucketTriggerEventParamsr8   x   s!    q$+)7%
 r   c                     dd| dS )Nzcloud.pubsubzgoogle.pubsub.topic.publishr6   r   )r   s    r   _GetTopicTriggerEventParamsr:      s    (4'
 r   c                 R   t         j                  j                  |       }|j                  }|| |d}|t         j                  k(  r|S t         j                  j                  ||       j                  }|t         j                  j                  k(  rt        j                  |      }n|t         j                  j                  k(  r*t        j                  j                  |      j                  }n|t         j                  j                   t         j                  j"                  t         j                  j$                  fv rng|t         j                  j&                  k(  r6|rHt(        j*                  j,                  j.                  j1                  |       nt3        j4                         ||d<   |S )zGet the args for creating an event trigger.

  Args:
    trigger_event: The trigger event
    trigger_resource: The trigger resource

  Returns:
    A dictionary containing trigger_provider, trigger_event, and
    trigger_resource.
  r6   r-   )r   r"   r#   r$   r%   r&   r'   r(   TOPICapi_utilValidatePubsubTopicNameOrRaiseBUCKETr	   BucketReferenceFromUrlbucketFIREBASE_ANALYTICS_EVENTFIREBASE_DBFIRESTORE_DOCr)   r   VALUEScoreprojectValidatecore_exceptionsInternalError)r   r-   r0   r1   resultr'   s         r   _GetEventTriggerEventParamsrM      sk    77HH ,110$*&
 xCCCM44::mM  h((...>>?OP**111#33;;f  11$$&& 
 	**222$$--.>? 
'
'
))/&		-r   c                     | ry|rt        |      S |rt        |      S |rt        ||      S |rt        j                  d       yy)a  Check --trigger-*  arguments and deduce if possible.

  0. if --trigger-http is return None.
  1. if --trigger-bucket return bucket trigger args (_GetBucketTriggerArgs)
  2. if --trigger-topic return pub-sub trigger args (_GetTopicTriggerArgs)
  3. if --trigger-event, deduce provider and resource from registry and return

  Args:
    trigger_http: The trigger http
    trigger_bucket: The trigger bucket
    trigger_topic: The trigger topic
    trigger_event: The trigger event
    trigger_resource: The trigger resource

  Returns:
    None, when using HTTPS trigger. Otherwise a dictionary containing
    trigger_provider, trigger_event, and trigger_resource.
  NzIgnoring the flag --trigger-resource. The flag --trigger-resource is provided but --trigger-event is not. If you intend to change trigger-resource you need to provide trigger-event as well.)r8   r:   rM   r
   warning)r   r   r   r   r-   s        r   GetTriggerEventParamsrP      sQ    * '77&}55&}6FGGKK	F r   c                 z   t         j                  j                  | |      j                  }i }|j                  j
                  dv r|S |j                  j
                  dk(  r2t        j                  j                  j                  j                  |d<   ne|j                  j
                  dk(  r2t        j                  j                  j                  j                  |d<   n|j                  j
                  dk(  r	 t        j                  j                  |||j                  j
                        }|j                         S )a~  Prepares resource field for Function EventTrigger to use in API call.

  API uses relative resource name in EventTrigger message field. The
  structure of that identifier depends on the resource type which depends on
  combination of --trigger-provider and --trigger-event arguments' values.
  This function chooses the appropriate form, fills it with required data and
  returns as a string.

  Args:
    trigger_provider: The --trigger-provider flag value.
    trigger_event: The --trigger-event flag value.
    trigger_resource: The --trigger-resource flag value.

  Returns:
    Relative resource name to use in EventTrigger field.
  >   google.firestore.documentgoogle.firebase.database.refgoogle.firebase.analytics.eventzcloudresourcemanager.projects	projectIdzpubsub.projects.topics
projectsIdzcloudfunctions.projects.buckets)
collection)r   r"   r&   r'   valuecollection_idr   rF   rG   rH   	GetOrFailr   REGISTRYParseRelativeName)r0   r   r-   r'   paramsrefs         r    ConvertTriggerArgsToRelativeNamer`      s   & 44::M  &&& + 
 ((,KK$++0088BBF;((,DD%,,1199CCF<((,MM  $$22 	! 	#
 
			r   c                     t        j                         }|j                         }||_        | t        j
                  k(  r	||_        |S t        | ||      |_        |S )zCreate event trigger message.

  Args:
    trigger_provider: str, trigger provider label.
    trigger_event: str, trigger event label.
    trigger_resource: str, trigger resource name.

  Returns:
    A EventTrigger protobuf message.
  )r=   GetApiMessagesModuleEventTrigger	eventTyper   r%   resourcer`   )r0   r   r-   messagesevent_triggers        r   CreateEventTriggerrh     se     **,('')-)-===-M
 
 >-)9M 
r   c                 f    | r/| j                   }|t        v r||k7  rt        |   }t        |      y y y )N)rd   LEGACY_TRIGGER_EVENTSr   )function_triggernew_trigger_eventfunction_event_typeerrors       r   CheckLegacyTriggerUpdatero   $  sH    *4444#44#$78e%e,, 5 	5 r   N)!r   
__future__r   r   r   #googlecloudsdk.api_lib.functions.v1r   r   r   r=   googlecloudsdk.api_lib.storager	   googlecloudsdk.callioper   googlecloudsdk.corerJ   r
   r   r   Errorr   GCS_COMPATIBILITY_ERRORPUBSUB_COMPATIBILITY_ERRORrj   r    r2   r8   r:   rM   rP   r`   rh   ro   r   r   r   <module>rx      s    1 &  ' : 8 @ 7 E = # * )J 5 5 J
	/ -  9P" $D0f"J)X.-r   