
    2                     8   d Z ddlmZ ddlmZ ddlmZ ddl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 ddlmZ ddlmZ ddlZ G d dej<                        Z G d dej@                        Z!y)z'Command for modifying backend services.    )absolute_import)division)unicode_literalsN)messages)encoding)base_classes)property_selector)base)
exceptions)flags)backend_services_utils)	resources)yaml)
console_io)editc                       e Zd Zy)InvalidResourceErrorN)__name__
__module____qualname__     ,lib/surface/compute/backend_services/edit.pyr   r   (   s     r   r   c                   l    e Zd ZdZdZej                  Zed        Z	d Z
d Zd Zd Zd Zd	 Zd
 Zd Zy)Editak  Modify a backend service.

    *{command}* modifies a backend service of a Google Cloud load balancer or
    Traffic Director. The backend service resource is fetched from the server
    and presented in a text editor that displays the configurable fields.

    The specific editor is defined by the ``EDITOR'' environment variable.

    The name of each backend corresponds to the name of an instance group,
    zonal NEG, serverless NEG, or internet NEG.

    To add, remove, or swap backends, use the `gcloud compute backend-services
    remove-backend` and `gcloud compute backend-services add-backend` commands.
  r   c                 :    | j                   j                  |       y )N)_BACKEND_SERVICE_ARGAddArgument)clsparsers     r   Argsz	Edit.ArgsB   s    ((0r   c                 l   dj                  d |j                         D              }t        j                  ||j                  xs t
        j                        }	t        j                  | j                  |j                              }
|
j                  |	      }	||	k(  rd}nT|d   |	d<   |j                  d      }|r||	d<   t        j                  |	|j                  j                   j"                        }|r||k(  r|gS |j                  j%                  | j'                  |j                  ||      g      S )z8Returns an updated resource that was edited by the user.
c              3   ^   K   | ]%  }|j                  d       rdt        |      z  n| ' yw)# N)
startswithlen).0lines     r   	<genexpr>z.Edit._ProcessEditedResource.<locals>.<genexpr>S   s0      "0.D  ??3/c$iT9.s   +-)transformationsNnamefingerprint)join
splitlinesr   DeserializeValueformatr   DEFAULT_FORMATr	   PropertySelectorGetReferenceNormalizersr   Applygetr   DictToMessageclientr   BackendServiceMakeRequestsGetSetRequest)selfholderbackend_service_reffile_contentsoriginal_objectoriginal_recordmodifiable_recordargsnon_comment_linesmodified_recordreference_normalizer
new_objectr.   s                r   _ProcessEditedResourcezEdit._ProcessEditedResourceF   s0    		 "0!,,."0 0 #334;;=$*=*=?O
 -==44V5E5EFH*00AOO+j !0 7of#''6k	)4&))/*0--*@*@*O*OQj J6==%%			FMM+>
	KLN Nr   c           	   #   @  K   t        j                  | j                               }|j                  }| j                  j                  ||j                  t        j                         t        j                  |            }| j                  ||      }|j                  |g      }|d   }t        j                  |      }t        j                   g d      }	|	j#                  |      }
| j%                  ||||
      }| j'                  |||||
||      }|D ]  }|  y w)N)default_scopescope_listerr   )backendscustomRequestHeaderscustomResponseHeadersdescription	enableCDNhealthChecksziap.enabledziap.oauth2ClientIdziap.oauth2ClientSecretportportNameprotocol
timeoutSec)
properties)r   ComputeApiHolderReleaseTrackr9   r   ResolveAsResourcer   r   GetDefaultScopecompute_flagsGetDefaultScopeListerGetGetRequestr;   r   MessageToDictr	   r4   r6   BuildFileContentsEditResource)r=   rD   r>   r9   r?   get_requestobjectsrA   rB   field_selectorrC   r@   resource_listresources                 r   RunzEdit.Runu   s$    **4+<+<+>?F]]F33EE,<<>"88@	 F B
 $$V-@AK!!;-0GajO,,_=O '77 D N ',,_=**4+<>M%%d,?&,.?&5HM "n "s   DDc                 l   t        j                         }t        j                  j	                         D ]H  }|j                  d       |r|j                  d       |j                  |       |j                  d       J |j                  d       |j                  t        j                  ||j                  xs t        j                               |j                  d       t        j                  t        j                  | j                  |            |j                  xs t        j                        }t        j                  |d|       |j                  d       t        j                  ||j                  xs t        j                        }t        j                  |d|       |j                         S )Nr%   r&   r#   zExample resource:z#
zOriginal resource:)ioStringIOr   HELPr0   writeSerializeDictr2   r   r3   r   r_   GetExampleResourceWriteResourceInCommentBlockgetvalue)	r=   rD   r9   rB   rC   bufr*   exampleoriginals	            r   r`   zEdit.BuildFileContents   s@   
++-C!!,,.	iin			#	iio	iio / IIdOIIl(():)-)K8K8KM NIIdO((t66v>?*t**,G ,,W6I3OIIe))/*.++*L9L9LNH,,X7K-02<<>r   c           	      D   	 	 t        j                  |      }	 | j                  |||||||      }	 |S # t         j                  $ r t        j                  d      w xY w# t        t        j                  t        j                  t        j                  f$ r}	t        |	dt        j                  |	            }
t!        |	t        j                        rd}nd}dj#                  ||
      }
t%        j&                  |
d      st        j                  d      Y d }	~	nd }	~	ww xY w )NzEdit aborted by user.messageapplyingparsingz)There was a problem {0} your changes: {1}z*Would you like to edit the resource again?)ru   prompt_string)r   
OnlineEditNoSaveExceptionr   AbortedErrorrI   
ValueErrorr   YAMLParseErrorr   ValidationErrorcalliope_exceptionsToolExceptiongetattrsix	text_type
isinstancer2   r   PromptContinue)r=   rD   r?   r@   r>   rC   rA   rB   re   eru   problem_types               r   ra   zEdit.EditResource   s&   
?6A33F<O4A4C4C4Et	M
 	" 3 !! ?%%&=>>? $--&&!//1 A !Ya(89a,::;#,",>F<1 	((FH ''(?@
@HA s!   3 A )A7DA=DDc                    d}d}|j                   j                  |j                   j                  |j                   j                  j                  j                  |dz   d      |j                   j                  |j                   j                  j                  j                  |dz   d      gdgd	gd
|dz   |dz   gddd|j                   j                  j
                  j                  |dz   d      S )Nz>https://compute.googleapis.com/compute/v1/projects/my-project/zDhttps://compute.googleapis.com/compute/v1/projects/my-project/zones/z$us-central1-a/instanceGroups/group-1d   )balancingModegroupmaxRatez%europe-west1-a/instanceGroups/group-2   zX-Forwarded-Port:443z&X-Client-Geo-Location:US,Mountain ViewzMy backend servicez)global/httpHealthChecks/my-health-check-1z)global/httpHealthChecks/my-health-check-2zbackend-serviceP   httpz&global/backendServices/backend-service   )rM   rN   rO   rP   rR   r-   rS   rT   rU   selfLinkrV   )r   r:   BackendBalancingModeValueValuesEnumRATEProtocolValueValuesEnumHTTP)r=   r9   
uri_prefixinstance_groups_uri_prefixs       r   rn   zEdit.GetExampleResource   s    J	  ??))OO##OO++HHMM1=> $  OO##OO++HHMM1>? $ 
 55GH(DDDD
 //GGLLFF7 *  r   c                 :    fd}d |dd      fd |dd      fgS )Nc                       fd}|S )z4Returns a function to normalize resource references.c                    	 j                  |       }|j                         vrt        dj	                  |             |j                         S # t        j                  $ r t        dj	                              w xY w)z&Returns normalized URI for field_name.z-[{field_name}] must be referenced using URIs.)
field_namez,Invalid [{field_name}] reference: [{value}].)r   value)Parser   UnknownCollectionExceptionr   r2   
CollectionSelfLink)	reference	value_refallowed_collectionsr   resource_registrys     r   NormalizeReferencezYEdit.GetReferenceNormalizers.<locals>.MakeReferenceNormalizer.<locals>.NormalizeReference   s    	*'--i8) !)<<$<DD'y E :; ; !!## 33 	*$=DD' E )* *	*s   A /Br   )r   r   r   r   s   `` r   MakeReferenceNormalizerz=Edit.GetReferenceNormalizers.<locals>.MakeReferenceNormalizer   s    $  r   zhealthChecks[]rR   )zcompute.httpHealthCheckszcompute.httpsHealthCheckszcompute.healthCheckszcompute.regionHealthCheckszbackends[].groupr   )zcompute.instanceGroupszcompute.regionInstanceGroupsr   )r=   r   r   s    ` r   r5   zEdit.GetReferenceNormalizers   sI     , 
	 D
E	F
 
	 G
I	J
 
r   c                 ,   |j                         dk(  rA|j                  j                  d |j                  j                  di |j                         fS |j                  j                  d |j                  j                  di |j                         fS )Ncompute.regionBackendServicesGetr   )r   apitools_clientregionBackendServicesr   &ComputeRegionBackendServicesGetRequestAsDictbackendServices ComputeBackendServicesGetRequest)r=   r9   r?   s      r   r^   zEdit.GetGetRequest  s    %%'+JJ$$::EDfooDD 2'..023 3 ""22E<FOO<< 0%,,.01 1r   c                 4   |j                         dk(  rC|j                  j                  d |j                  j                  dd|i|j                         fS |j                  j                  d |j                  j                  dd|i|j                         fS )Nr   UpdatebackendServiceResourcer   )r   r   r   r   )ComputeRegionBackendServicesUpdateRequestr   r   #ComputeBackendServicesUpdateRequest)r=   r9   r?   replacements       r   r<   zEdit.GetSetRequest(  s    %%'+JJ$$::HGfooGG 2)42'..023 3 ""22H?FOO?? 0'20%,,.01 1r   N)r   r   r   __doc__r3   r   #GLOBAL_REGIONAL_BACKEND_SERVICE_ARGr   classmethodr!   rI   rg   r`   ra   rn   r5   r^   r<   r   r   r   r   r   /   sZ     .BB1 1-N^)V.@#J!F1	1r   r   )"r   
__future__r   r   r   ri   apitools.base.protorpcliter   apitools.base.pyr   googlecloudsdk.api_lib.computer   r	   googlecloudsdk.callioper
   r   r   "googlecloudsdk.command_lib.computer   r\   3googlecloudsdk.command_lib.compute.backend_servicesr   googlecloudsdk.corer   r   googlecloudsdk.core.consoler   googlecloudsdk.core.utilr   r   r   r   Commandr   r   r   r   <module>r      sh    . &  ' 	 / % 7 < ( E 9 E V E ) $ 2 ) 
.<< B14<< B1r   