
    "                     d   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rSSKJr  SSK	J
r
  SS	KJr  S
rSrS\-   rSrSrSrS r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rS r\S :X  a  \R<                  " \" 5       5        gg)!z0Performs translation of queue.xml to queue.yaml.    )absolute_import)division)print_function)unicode_literalsN)ElementTree)xml_parser_utils)AppEngineConfigException)ratezbucket-sizezmax-concurrent-requeststarget)ztask-age-limitzmin-backoff-secondszmax-backoff-secondszmax-doublings)task-retry-limitzMode, if specified, must be either push or pull (defaults to push) for queue entries. Bad value '%s' in <queue> entry with name '%s'zQThe element <%s> is not defined for pull queues; bad <queue> entry with name '%s'zSThe element <%s> in <retry-parameters> is not defined for pull queue with name '%s'c                 T    [        5       R                  U5      nUR                  5       $ N)QueueXmlParser
ProcessXmlToYaml)unused_applicationqueue_xml_str	queue_xmls      6lib/googlecloudsdk/appengine/tools/queue_xml_parser.pyGetQueueYamlr   4   s$    ))-8)				    c                   6    \ rS rSrSrS rS rS rS rS r	Sr
g	)
r   9   z:Provides logic for walking down XML tree and pulling data.c                 H    / U l         [        R                  " U5      n[        R                  " U5      S:w  a  [        S5      e[        5       U l        / U R                  l        [        R                  " US5      U R                  l
        [        R                  " US5       H  nU R                  U5        M     U R                   (       a$  [        SR                  U R                   5      5      eU R                  $ ! [        R                   a  n[        SU-  5      eSnAff = f)a  Parses XML string and returns object representation of relevant info.

Args:
  xml_str: The XML string.
Returns:
  A QueueXml object containing information about task queue
  specifications from the XML.
Raises:
  AppEngineConfigException: In case of malformed XML or illegal inputs.
zqueue-entriesz Root tag must be <queue-entries>ztotal-storage-limitqueue
zBad input -- not valid XML: %sN)errorsr   
fromstringr   GetTagr	   QueueXmlr   queuesGetChildNodeTexttotal_storage_limitGetNodesProcessQueueNodejoin
ParseError)selfxml_strxml_rootchildes        r   r   QueueXmlParser.ProcessXml<   s    Kdk''0h		 	 	*o	=&'IJJzdn dnn+;+L+L
),+dnn(#,,Xw?%e$ @ 
&tyy'=>>^^!! K$%E%IJJKs   C7C: :D!DD!c                    [         R                  " US5      nU(       d  U R                  R                  S5        g[         R                  " USS5      nUS;  a$  U R                  R                  [        X24-  5        gUS:X  a"  [        5       nX$l        U R                  X5        O![        5       nX$l        U R                  X5        U R                  R                  R                  U5        g)ae  Processes XML <queue> nodes into Queue objects.

The following information is parsed out:
  name
  mode: can be either push or pull
  retry-parameters:
    task-retry-limit
---- push queues only ----
    task-age-limit
    min-backoff-seconds
    max-back-off-seconds
    max-doubling
  bucket-size
  max-concurrent-requests
  rate: how often tasks are processed on this queue.
  target: version of application on which tasks on this queue will be
    invoked.
---- pull queues only ----
  acl: access control list - lists user and writer email addresses.

Args:
  node: Current <queue> XML node being processed.
namez*Must specify a name for each <queue> entryNmodepush)r1   pullr2   )r   r"   r   appendBAD_MODE_ERROR_MESSAGE	PullQueuer/   _ProcessPullQueueNode	PushQueue_ProcessPushQueueNoder   r!   )r(   noder/   r0   r   s        r   r%   QueueXmlParser.ProcessQueueNode^   s    2 ,,T6:D
kkEF ,,T66BD##
kk/4,>?v~kej
  -kej
  -NN  'r   c           	      $   [         R                  " US5      b(  U R                  R                  SUR                  -  5        [
         H5  nUR                  SS5      n[        X$[         R                  " X5      5        M7     U R                  X5        g )NaclzRThe element <acl> is not defined for push queues; bad <queue> entry with name '%s'-_)
r   GetChildr   r3   r/   PUSH_QUEUE_TAGSreplacesetattrr"   _ProcessRetryParametersNode)r(   r9   r   tag
field_names        r   r8   $QueueXmlParser._ProcessPushQueueNode   s|      u-9
kk57<zzBC ;;sC(je!1!B!B4!MN  	$$T1r   c                 B   [          HI  n[        R                  " X5      c  M  U R                  R	                  [
        X2R                  4-  5        MK     [        R                  " US5      nUb  [        5       Ul        [        R                  " US5       Vs/ s H  oUR                  PM     snUR                  l        [        R                  " US5       Vs/ s H  oUR                  PM     snUR                  l        OSUl        U R                  X5        gs  snf s  snf )z4Populates PullQueue-specific fields from parsed XML.Nr<   z
user-emailzwriter-email)r@   r   r?   r   r3   PULL_QUEUE_ERROR_MESSAGEr/   Aclr<   r$   textuser_emailswriter_emailsrC   )r(   r9   r   rD   acl_nodesub_nodes         r   r6   $QueueXmlParser._ProcessPullQueueNode   s    		"	"4	-	93sJJ6GGH   ((u5H%ei 
#
#Hl
;=
; %--
;=eii
 
#
#Hn
=!?
= %--
=!?eii ei$$T1=!?s   DDc           	         [         R                  " US5      nUc  SUl        g[        5       nXBl        [         R                  " US5      Ul        [         H  n[         R                  " X55      c  M  [        U[        5      (       a/  U R                  R                  [        XRR                  4-  5        M`  [        UUR                  SS5      [         R                  " X55      5        M     g)z1Pulls information out of <retry-parameters> node.zretry-parametersNr   r=   r>   )r   r?   retry_parametersRetryParametersr"   task_retry_limitPUSH_QUEUE_RETRY_PARAMS
isinstancer5   r   r3   RETRY_PARAM_ERROR_MESSAGEr/   rB   rA   )r(   r9   r   retry_parameters_noderQ   rD   s         r   rC   *QueueXmlParser._ProcessRetryParametersNode   s    ,55 "$#e&(-(8(I(I1)3% '		"	"#8	>	JeY''
++

6#zz9JJ
K
kk#s#//0EKM 'r   )r   r   N)__name__
__module____qualname____firstlineno____doc__r   r%   r8   r6   rC   __static_attributes__ r   r   r   r   9   s"    B KD-(^22*Mr   r   c                        \ rS rSrS rS rSrg)r       c                      / U l         S U l        g r   r!   r#   )r(   s    r   __init__QueueXml.__init__   s    DK#Dr   c                     / nU R                   (       a  UR                  SU R                   -  5        UR                  S5        U R                   H  nXR                  5       -  nM     SR	                  U5      S-   $ )Nztotal_storage_limit: %s
zqueue:r   )r#   r3   r!   GetYamlStatementsListr&   )r(   
statementsr   s      r   r   QueueXml.ToYaml   sm    J3d6N6NNOh//11j  99Z 4''r   rc   N)rY   rZ   r[   r\   rd   r   r^   r_   r   r   r    r       s    $(r   r    c                       \ rS rSrS rSrg)Queue   c                     SU R                   -  /nXR                  5       -  nU R                  (       a  XR                  R                  5       -  nU$ )Nz
- name: %s)r/   GetAdditionalYamlStatementsListrQ   rg   r(   rh   s     r   rg   Queue.GetYamlStatementsList   sJ    *+J6688J))??AAjr   r_   NrY   rZ   r[   r\   rg   r^   r_   r   r   rk   rk          r   rk   c                       \ rS rSrS rSrg)r7      c                     S/nS [          5       nU H0  n[        X5      nU(       d  M  UR                  SU< SU< 35        M2     U$ )Nz  mode: pushc              3   D   #    U  H  oR                  S S5      v   M     g7fr=   r>   NrA   .0rD   s     r   	<genexpr><PushQueue.GetAdditionalYamlStatementsList.<locals>.<genexpr>   s     ?kk#s##    z  : )r@   getattrr3   )r(   rh   fieldsfieldfield_values        r   rn   )PushQueue.GetAdditionalYamlStatementsList   sH     !J??FD(k	{;< 
 r   r_   NrY   rZ   r[   r\   rn   r^   r_   r   r   r7   r7      s    r   r7   c                       \ rS rSrS rSrg)r5      c                 f    S/nU R                   (       a  XR                   R                  5       -  nU$ )Nz  mode: pull)r<   rg   ro   s     r   rn   )PullQueue.GetAdditionalYamlStatementsList   s,     !JxxHH2244jr   r_   Nr   r_   r   r   r5   r5      s    r   r5   c                       \ rS rSrS rSrg)rI      c                     S/nUU R                    Vs/ s H  nSU-  PM
     sn-  nUU R                   Vs/ s H  nSU-  PM
     sn-  nU$ s  snf s  snf )Nz  acl:z  - user_email: %sz  - writer_email: %s)rK   rL   )r(   rh   
user_emailwriter_emails       r   rg   Acl.GetYamlStatementsList   s}    J##%# :D'*4#% %J%%'% >J)L8%' 'J	%'s
   AAr_   Nrq   r_   r   r   rI   rI      s    r   rI   c                       \ rS rSrS rSrg)rR   i  c                     S/nS [          5       nU H1  n[        XS 5      nU(       d  M  UR                  SU< SU< 35        M3     U$ )Nz  retry_parameters:c              3   D   #    U  H  oR                  S S5      v   M     g7frw   rx   ry   s     r   r{   8RetryParameters.GetYamlStatementsList.<locals>.<genexpr>  s     I4HS;;sC((4Hr}   z    r~   )RETRY_PARAMETER_TAGSr   r3   )r(   rh   field_namesr   r   s        r   rg   %RetryParameters.GetYamlStatementsList  sK    '(JI4HIKD.k	%=>  r   r_   Nrq   r_   r   r   rR   rR     rr   r   rR   c                  j    [         R                  R                  5       n [        [	        S U 5      5        g r   )sysstdinreadprintr   )xmls    r   mainr     s!    		#T3 r   __main__)r]   
__future__r   r   r   r   r   	xml.etreer   googlecloudsdk.appengine.toolsr   :googlecloudsdk.appengine.tools.app_engine_config_exceptionr	   r@   rT   r   r4   rH   rV   r   objectr   r    rk   r7   r5   rI   rR   r   rY   exitr_   r   r   <module>r      s    7 &  % ' 
 ! ; _@  -/FF , / , 

HMV HMV(v ("	F 	
 
 & 	f 	! z((46 r   