
    )                     
   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S	KJr  SS
KJr  SSKJr   " S S\R&                  5      rSrSr\\S.rS rS rS rS rS rS rS rS rS r g)z*'functions deploy' utilities for triggers.    )absolute_import)division)unicode_literals)
exceptions)triggers)util)storage_util)log)
properties)	resourcesc                       \ rS rSrSrSrg)TriggerCompatibilityError    zARaised when deploy trigger is incompatible with existing trigger. N)__name__
__module____qualname____firstlineno____doc____static_attributes__r       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                     U R                  S5      (       d^  U R                  S5      (       dG  U R                  S5      (       d0  U R                  S5      (       d  [        R                  " / SQS5      eg g g g )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   sy    
''			*	+	+			.	)	)			/	*	*

=
=	
 	D  
+ 
* 
, (r   c                    [         R                  R                  U 5      nUR                  nU[         R                  :w  ao  [         R                  R                  XP5      R                  nUcC  U[         R                  R                  :w  a%  [        R                  " SR                  U 5      5      eU(       a  U(       a  [        R                  " SS5      egg)a#  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   ValidateTriggerArgsr5   V   s     77HH ,11xCCC66<<m  MX5G5G5O5O$O%%%vm4  /

;
;)  0_r   c                     U SS nSSUS.$ )N   zcloud.storagezgoogle.storage.object.finalizer3   r   r0   r   )r   bucket_names     r   _GetBucketTriggerEventParamsr;   x   s!    q$+)7%
 r   c                     SSU S.$ )Nzcloud.pubsubzgoogle.pubsub.topic.publishr9   r   )r   s    r   _GetTopicTriggerEventParamsr=      s    (4'
 r   c                 j   [         R                  R                  U 5      nUR                  nUU US.nU[         R                  :X  a  U$ [         R                  R                  X05      R                  nU[         R                  R                  :X  a  [        R                  " U5      nGOU[         R                  R                  :X  a*  [        R                  R                  U5      R                  nOU[         R                  R                   [         R                  R"                  [         R                  R$                  4;   a  OnU[         R                  R&                  :X  a;  U(       a3  [(        R*                  R,                  R.                  R1                  U5        O[2        R4                  " 5       eXS'   U$ )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.
r9   r0   )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   r0   r3   r4   resultr*   s         r   _GetEventTriggerEventParamsrP      sh    77HH ,110$*&
 xCCCM44::M  h((...>>?OP**111#33;;f  11$$&& 
 	**222$$--.>? 
'
'
))/		-r   c                     U (       a  gU(       a  [        U5      $ U(       a  [        U5      $ U(       a  [        X45      $ U(       a  [        R                  " S5        gg)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.)r;   r=   rP   r
   warning)r   r   r   r   r0   s        r   GetTriggerEventParamsrS      sN    * '77&}55&}GGKK	F r   c                 |   [         R                  R                  X5      R                  n0 nUR                  R
                  S;   a  U$ UR                  R
                  S:X  a2  [        R                  R                  R                  R                  US'   OgUR                  R
                  S:X  a2  [        R                  R                  R                  R                  US'   OUR                  R
                  S:X  a   [        R                  R                  UUUR                  R
                  S9nUR                  5       $ )af  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   rI   rJ   rK   	GetOrFailr   REGISTRYParseRelativeName)r3   r   r0   r*   paramsrefs         r    ConvertTriggerArgsToRelativeNamerc      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                     [         R                  " 5       nUR                  5       nXl        U [        R
                  :X  a  X$l        U$ [        XU5      Ul        U$ )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(   resourcerc   )r3   r   r0   messagesevent_triggers        r   CreateEventTriggerrk     s_     **,('')-)===-
 
 >)9M 
r   c                 t    U (       a1  U R                   nU[        ;   a  X!:w  a  [        U   n[        U5      eg g g )N)rg   LEGACY_TRIGGER_EVENTSr   )function_triggernew_trigger_eventfunction_event_typeerrors       r   CheckLegacyTriggerUpdaterr   $  sE    *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.corerM   r
   r   r   Errorr   GCS_COMPATIBILITY_ERRORPUBSUB_COMPATIBILITY_ERRORrm   r#   r5   r;   r=   rP   rS   rc   rk   rr   r   r   r   <module>r{      s    1 &  ' : 8 @ 7 E = # * )J 5 5 J
	/ -  9P" $D0f"J)X.-r   