
    /                        S r SSKJr  SSKr\R                  R                  S5      S:X  a  SSKJr  SSKJr  SSKJ	r	  SS	KJ
r
  OSSKJ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rSrSrSrSrSrSrSr\" \\\/5      rSr " S S\5      r " S S\R@                  5      r!S r" " S S \R@                  5      r#S"S! jr$g)#z
A library for working with BackendInfoExternal records, describing backends
configured for an application. Supports loading the records from backend.yaml.
    )absolute_importNAPPENGINE_RUNTIMEpython27)
validation)yaml_builder)yaml_listener)yaml_objectz(?!-)[a-z\d\-]{1,100}z(?!\^).*(?!\$).{1,256}z^[bB](1|2|4|8|4_1G)$z
^[a-z, ]*$z^(START|STOP|DISABLED)$backendsnameclass	instancesoptionspublicdynamicfailfastmax_concurrent_requestsstartstatec                       \ rS rSrSrSrg)	BadConfigD   z&An invalid configuration was provided. N)__name__
__module____qualname____firstlineno____doc____static_attributes__r       /lib/googlecloudsdk/appengine/api/backendinfo.pyr   r   D   s    .r   r   c                     ^  \ rS rSrSr\\\\R                  " \
5      \\R                  " \R                  5      \\R                  " \R                  5      \\R                  " \5      \\R                  " \R"                  5      \\R                  " \R"                  5      \\R                  " \R"                  5      \\R                  " \5      \\R                  " \5      0
rU 4S jrS rS rS rU 4S jrS rS	 rS
r U =r!$ )BackendEntryH   z+A backend entry describes a single backend.c                 N   > [         [        U ]
  " U0 UD6  U R                  5         g N)superr"   __init__Init)selfargskwargs	__class__s      r    r'   BackendEntry.__init__[   s     	,&77IIKr   c                     U R                   (       a  [        S5      eU R                  (       a  [        S5      eU R                  (       a  [        S5      eU R	                  5         U $ )NzIllegal field: 'public'zIllegal field: 'dynamic'zIllegal field: 'failfast')r   r   r   r   ParseOptionsr)   s    r    r(   BackendEntry.Init_   sL    {{/00||011}}122Kr   c                 0    U R                  [        U5        g)z=Setter for 'class', since an attribute reference is an error.N)SetCLASS)r)   Classs     r    	set_classBackendEntry.set_classi   s    HHUEr   c                 ,    U R                  [        5      $ )z?Accessor for 'class', since an attribute reference is an error.)Getr4   r0   s    r    	get_classBackendEntry.get_classm   s    88E?r   c           	         > U R                  5       R                  5         [        [        U ]  5       n[
        R                  " [        [        [        [        [        [        [        /U5      $ )z;Returns a sorted dictionary representing the backend entry.)r/   WriteOptionsr&   r"   ToDictr   
SortedDictNAMEr4   	INSTANCESSTARTOPTIONSMAX_CONCURRENT_REQUESTSSTATE)r)   resultr,   s     r    r>   BackendEntry.ToDictq   sX    $$&<-/F  $"'"+"'")"9"'") "() )r   c                 :   U R                   (       a9  U R                   R                  S5       Vs/ s H  oR                  5       PM     nnO/ nU H  nU[        ;  d  M  [	        SU5      e   [
        U;   U l        [        U;   U l        [        U;   U l
        U $ s  snf )z7Parses the 'options' field and sets appropriate fields.,zUnrecognized option: %s)r   splitstripVALID_OPTIONSr   PUBLICr   DYNAMICr   FAILFASTr   )r)   optionr   s      r    r/   BackendEntry.ParseOptions~   s    ||.2ll.@.@.EF.EF.EgFgg	}	$16::  G#DKg%DL'DMK Gs   Bc                 "   / nU R                   (       a  UR                  S5        U R                  (       a  UR                  S5        U R                  (       a  UR                  S5        U(       a  SR	                  U5      U l        U $ SU l        U $ )z3Writes the 'options' field based on other settings.r   r   r   z, N)r   appendr   r   joinr   )r)   r   s     r    r=   BackendEntry.WriteOptions   sh    G{{nnX||nnY}}nnZ YYw'dl K dlKr   )r   r   r   r   )"r   r   r   r   r   r@   
NAME_REGEXr4   r   OptionalCLASS_REGEXrA   TYPE_INTrD   rC   OPTIONS_REGEXrM   	TYPE_BOOLrN   rO   rB   
FILE_REGEXrE   STATE_REGEX
ATTRIBUTESr'   r(   r6   r:   r>   r/   r=   r   __classcell__)r,   s   @r    r"   r"   H   s    3
JZ  -$$Z%8%89z22:3F3FG z""=1j!!*"6"67z"":#7#78
##J$8$89Z  , Z  -*")  r   r"   c                 ^   [         R                  " [        5      n[        R                  " U5      n[
        R                  " U5      nUR                  U 5        UR                  5       n[        U5      S:  a  [        S5      e[        U5      S:  a  [        S5      eUS   R                  5       $ )zParses a BackendEntry object from a string.

Args:
  backend_entry: a backend entry, as a string

Returns:
  A BackendEntry object.
   zEmpty backend configuration.z5Multiple backend entries were found in configuration.r   )r	   ObjectBuilderr"   r   BuilderHandlerr   EventListenerParse
GetResultslenr   r(   )backend_entrybuilderhandlerlistenerentriess        r    LoadBackendEntryrm      s     %%l3'''0'((1(
.. '\A
2
33\A
K
LL		r   c                   `    \ rS rSrSr\\R                  " \R                  " \	5      5      0r
Srg)BackendInfoExternal   zEBackendInfoExternal describes all backend entries for an application.r   N)r   r   r   r   r   BACKENDSr   rW   Repeatedr"   r^   r   r   r   r    ro   ro      s'    M
##J$7$7$EF*r   ro   c                    [         R                  " [        5      n[        R                  " U5      n[
        R                  " U5      nUR                  U 5        UR                  5       n [        U 5      S:  a	  [        / S9$ [        U 5      S:  a  [        S5      eU S   nUR                  (       d	  [        / S9$ UR                   H  nUR                  5         M     U$ )zParses a BackendInfoExternal object from a string.

Args:
  backend_info: a backends stanza (list of backends) as a string
  open_fn: Function for opening files. Unused.

Returns:
  A BackendInfoExternal object.
ra   )r
   z&Only one 'backends' clause is allowed.r   )r	   rb   ro   r   rc   r   rd   re   rf   rg   r   r
   r(   )backend_infoopen_fnri   rj   rk   infobackends          r    LoadBackendInforx      s     %%&9:'''0'((1(
..##%,++
<
==	a$	++gLLN 	+r   r%   )%r   
__future__r   osenvirongetgoogle.appengine.apir   r   r   r	   googlecloudsdk.appengine.apirV   r\   rX   rZ   r]   rq   r@   r4   rA   rC   rM   rN   rO   rD   rB   	frozensetrL   rE   	Exceptionr   	Validatedr"   rm   ro   rx   r   r   r    <module>r      s    
 ' 
::>>%&*4-/0.5786%
&
%(  	
	
3 67H56 	/	 /S:'' Sl.*.. r   