
    e                         S r SSKJr  SSK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SK	Jr  SS	K	Jr  SS
K	Jr  SSKJr  \R$                  R&                  4   SS jjr " S S\5      rg)z,Provides a parser for --container arguments.    )annotationsN)Sequence)Any)base)cli)parser_arguments)parser_errors)parser_extensionsflagsc                    [         R                  " 5       R                  U 5        UR                  U 5        [        U R                  X5      nUR
                  U R                  l        g)zAddContainerFlags updates parser to add --container arg parsing.

Args:
  parser: The parser to patch.
  container_arg_group: Arguments that can be specified per-container.
  release_track: The release track of the command.
N)r   ContainerFlagAddToParserContainerParserparserParseKnownArgsparse_known_args)r   container_arg_grouprelease_trackcontainer_parsers       6lib/googlecloudsdk/command_lib/run/container_parser.pyAddContainerFlagsr       sR     ##F+!!&)$mm( $4#B#B&--     c                      \ rS rSrSrSrSrSr      SS jrSS jr	SS jr
SS	 jrSS
 jrSS jr      SS jrSrg)r   4   zIContainerParser adds custom container parsing behavior to ArgumentParser.z--containerz--presetz^(--[^:=]+)[:=]?.*c                    UR                   U l        UR                  U l        UR                  U l        X l        X0l        g)zContainerParser constructor.

Args:
  parser: The original command's parser. Used to parse non-container args.
  container_arg_group: Arguments to add to per-container parsers.
  release_track: The release track of the command.
N)r   _parse_known_argsprog_prog_calliope_command_container_arg_group_release_track)selfr   r   r   s       r   __init__ContainerParser.__init__;   s7     $44DDJ#55D 3'r   c                "   U R                   /n/ nU(       ao  UR                  5       n[        U[        R                  5      (       a  UR                  UR                  5        OUR                  UR                  5        U(       a  Mo  [        U5      $ )zE_GetContainerFlags returns the configured set of per-container flags.)
r!   pop
isinstancecalliope_baseArgumentGroupextend	argumentsappendname	frozenset)r#   args
flag_namesargs       r   _GetContainerFlags"ContainerParser._GetContainerFlagsN   sl    %%&DJ
HHJc	C44	5	5CMM"#((# $ Z  r   c                    [         R                  " SU R                  U R                  S9n[        R
                  " USSSS9nU R                  R                  U5        [        R                  R                  U5        U$ )zD_NewContainerParser creates a new parser for parsing container args.F)add_helpr   calliope_commandNT)r   	is_globalcli_generatorallow_positional)
r
   ArgumentParserr   r    r   ArgumentInterceptorr!   r   r   FLAG_INTERNAL_FLAG_FILE_LINE)r#   r   ais      r   _NewContainerParser#ContainerParser._NewContainerParserZ   sr    --ZZ//F 
	-	-	
B 	))"-$$004Mr   c                    U R                  5       R                  UR                  5       5      nU(       a$  [        R                  " SSR                  U5      S9eg)zs_CheckForContainerFlags checks that no container flags were specified.

Args:
  namespace: The namespace to check.
zJWhen --container is specified {flags} must be specified after --container.z, r   N)r3   intersectionGetSpecifiedArgNamesr	   ArgumentErrorjoin)r#   	namespacecontainer_flagss      r   _CheckForContainerFlags'ContainerParser._CheckForContainerFlagsm   sW     --/<<&&(O ''		/*  r   c                R    [        U[        5      =(       a    UR                  S5      $ )N--)r(   str
startswith)r#   r2   s     r   
_IsFlagArgContainerParser._IsFlagArg}   s    c38CNN4$88r   c                v    [         R                  " U R                  U5      nU(       a  UR                  S5      $ g )N   )rematch_FLAG_PATTERNgroup)r#   r2   flags      r   _ExtractFlagContainerParser._ExtractFlag   s,    88D&&,DZZ]r   c                   / n[         R                  " [        5      nUnSnU[        U5      :  Ga  X   nUS-  nXpR                  :X  a0  U[        U5      :  a  UR                  U5        GOXAU      nUS-  nGO[        U[        5      (       a:  UR                  U R                  S-   5      (       a  XGR                  SSS9S      nGOe[        U[        5      (       au  UR                  U R                  S-   5      (       aR  UR                  SSS9S   nUR                  S5      S   n	U	[        R                  ;   a  XI   nUR                  U5        GO[        U[        5      (       a  UR                  U R                  5      (       am  U[        U5      :  a^  X   nUR                  S5      S   n	U	[        R                  ;   a+  XAU      nUR                  U5        UR                  X   5        US-  nGO9US:X  a&  UR                  U5        UR                  XS 5        GOU R                  [        R                   R"                  [        R                   R$                  4;   a  U(       a  U R'                  U5      (       a  U R)                  U5      U R+                  5       ;  az  UR                  U5        U[        U5      :  aY  U R'                  X   5      (       dA  UR                  X   5        US-  nU[        U5      :  a  U R'                  X   5      (       d  MA  OUR                  U5        U[        U5      :  a  GM  U(       d  U R-                  X2S9$ 0 Ul        U R                  UR0                  S	'   UR3                  5        HE  u  p[4        R6                  " 5       nU R9                  5       R;                  XS9nXR.                  U
'   MG     U R-                  X2S9u  p-U R=                  U5        X-4$ )
a  Performs custom --container arg parsing.

Groups arguments after each --container flag to be parsed into that
container's namespace. For each container a new parser is used to parse that
container's flags into fresh namespace and those namespaces are stored as a
dict in namespace.containers. Remaining args are parsed by the orignal
parser's parse_known_args method.

Args:
  args: The arguments to parse.
  namespace: The namespace to store parsed args in.

Returns:
  A tuple containing the updated namespace and a list of unknown args.
r   rQ   =)sepmaxsplit:rK   N)r0   rF   
containers)collectionsdefaultdictlistlen_CONTAINER_FLAG_NAMEr-   r(   rL   rM   split_PRESET_FLAG_NAMEr   INGRESS_CONTAINER_PRESETSr+   r"   r)   ReleaseTrackBETAALPHArN   rW   r3   r   r^   _specified_argsitemsr
   	Namespacer?   
parse_argsrH   )r#   r0   rF   	remainingr^   currentivalue
preset_argpreset_namecontainer_namecontainer_argscontainer_namespaceunknown_argss                 r   r   ContainerParser.ParseKnownArgs   s   ( I((.JG	A
c$i-ge1fa	++	+D	>


5
!Aw''
q&!eS!!e&6&6

#
#c
)' ' [[S1[=a@A UC
 
 t55;<<[[S1[5a8
 &&s+A.%999+' UC
 
 t5566#d)mW
 &&s+A.%999Aw''


5
!


47
#	QD=b"
 

((--}/I/I/O/OPQooe$$&d.E.E.GG#d)mDOODG$<$<


47
#
q&! #d)mDOODG$<$< 	uw c$i-z ###HHI.2.G.GIl+*4*:*:*<&-779 446AA B  .A>* += #44 5 I 	  +""r   )r    r!   r   r   r"   N)r    parser_extensions.ArgumentParserr   calliope_base.ArgumentGroupr   zcalliope_base.ReleaseTrack)returnzfrozenset[str])r{   ry   )rF   parser_extensions.Namespace)r2   r   )r2   rL   )r0   zSequence[Any]rF   r|   r{   z1tuple[parser_extensions.Namespace, Sequence[Any]])__name__
__module____qualname____firstlineno____doc__rc   re   rT   r$   r3   r?   rH   rN   rW   r   __static_attributes__ r   r   r   r   4   su    Q& '-(.( 7( 0	(&
!& 9f#f# -f# 9	f#r   r   )r   z$parser_arguments.ArgumentInterceptorr   rz   )r   
__future__r   r_   collections.abcr   rR   typingr   googlecloudsdk.callioper   r)   r   r   r	   r
   googlecloudsdk.command_lib.runr   rg   GAr   objectr   r   r   r   <module>r      sb    3 "  $ 	  9 ' 4 1 5 0  ,,//C0C4C(x#f x#r   