
    k                        d Z ddlmZ ddlmZ ddlmZ ddlZddl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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.m0Z1 ddl2m3Z3 ddl2m4Z4 ddl5Z5ddl6m7Z7 ddl6m8Z8 d Z9d!Z:d"Z;d#Z<d$Z=d%Z>d&Z?d'Z@ G d( d)e	j                        ZA G d* d+eA      ZB G d, d-eA      ZC G d. d/e	j                        ZD G d0 d1e	j                        ZE G d2 d3e	j                        ZF G d4 d5e	j                        ZG G d6 d7e	j                        ZHd8 ZId9 ZJd: ZKd; ZLd< ZMd= ZNd> ZOej                  j                  d?d?fd@ZRdA ZSdB ZTdC ZUdD ZVdddde%j                  dEfdFZXdGZYy)Hz+Utility methods used by the deploy command.    )absolute_import)division)unicode_literalsN)
exceptions)ext_runtime)appengine_api_client)build)cloud_build)docker_image)metric_names)runtime_builders)util)yaml_parsing)config)fingerprinter)
enable_api)storage_util)appinfo)context_util)log)metrics)
properties)progress_tracker)creds)store)files)	platforms)filter)zipdefaultz-dot-?      iX  ap  Unable to verify that the Appengine Flexible API is enabled for project [{}]. You may not have permission to list enabled services on this project. If it is not enabled, this may cause problems in running your deployment. Please ask the project owner to ensure that the Appengine Flexible API has been enabled and that this account has permission to list enabled APIs.zNote: When deploying with a service account, the Service Management API needs to be enabled in order to verify that the Appengine Flexible API is enabled. Please ensure the Service Management API has been enabled on this project by the project owner.zEnabling the Appengine Flexible API failed on project [{}]. You may not have permission to enable APIs on this project. Please ask the project owner to enable the Appengine Flexible API on this project.c                       e Zd ZdZy)ErrorzBase error for this module.N__name__
__module____qualname____doc__     5lib/googlecloudsdk/api_lib/app/deploy_command_util.pyr$   r$   ^   s    #r+   r$   c                       e Zd Zy)PrepareFailureErrorN)r&   r'   r(   r*   r+   r,   r.   r.   b   s    r+   r.   c                   &     e Zd ZdZdZ fdZ xZS )WindowMaxPathErrorzCRaised if a file cannot be read because of the MAX_PATH limitation.a  The following file couldn't be read because its path is too long:

  [{0}]

For more information on this issue and possible workarounds, please read the
following (links are specific to Node.js, but the information is generally
applicable):

* https://github.com/Microsoft/nodejstools/issues/69
* https://github.com/Microsoft/nodejs-guidelines/blob/master/windows-environment.md#max_path-explanation-and-workaroundsc                 ^    t         t        |   | j                  j	                  |             y )N)superr0   __init__ _WINDOWS_MAX_PATH_ERROR_TEMPLATEformat)selffilename	__class__s     r,   r3   zWindowMaxPathError.__init__v   s(    	
d,--44X>@r+   )r&   r'   r(   r)   r4   r3   __classcell__)r8   s   @r,   r0   r0   f   s    K&"@ @r+   r0   c                       e Zd ZdZy)DockerfileErrorzARaised if a Dockerfile was found along with a non-custom runtime.Nr%   r*   r+   r,   r;   r;   {   s    Ir+   r;   c                       e Zd ZdZy)CloudbuildYamlErrorzFRaised if a cloudbuild.yaml was found along with a non-custom runtime.Nr%   r*   r+   r,   r=   r=      s    Nr+   r=   c                       e Zd ZdZy)CustomRuntimeFilesErrorzGRaised if a custom runtime has both a Dockerfile and a cloudbuild.yaml.Nr%   r*   r+   r,   r?   r?      s    Or+   r?   c                       e Zd ZdZy)NoDockerfileErrorzNo Dockerfile found.Nr%   r*   r+   r,   rA   rA      s    r+   rA   c                       e Zd ZdZy)UnsatisfiedRequirementsErrorz.Raised if we are unable to detect the runtime.Nr%   r*   r+   r,   rC   rC      s    6r+   rC   c                    t         j                  j                  t         j                  j                  |t        j
                              }t         j                  j                  t         j                  j                  |t        j                  j                              }| j                  dk(  r|rD|rBt        dj                  t        j
                  t        j                  j                  |            |r&t        j                  dt        j
                  |       y|r%t        j                  dt        j
                         yt        d      |r/t        dj                  | j                   | j                              |r/t#        d	j                  | j                   | j                              t        j                  d
| j                         y)a  Returns True if the given directory needs a Dockerfile for this app.

  A Dockerfile is necessary when there is no Dockerfile in source_dir,
  regardless of whether we generate it here on the client-side, or in Cloud
  Container Builder server-side.

  The reason this function is more complicated than that is that it additionally
  verifies the sanity of the provided configuration by raising an exception if:

  - The runtime is "custom", but no Dockerfile is present
  - The runtime is not "custom", and a Dockerfile or cloudbuild.yaml is present
  - The runtime is "custom", and has both a cloudbuild.yaml and a Dockerfile.

  (The reason cloudbuild.yaml is tied into this method is that its use should be
  mutually exclusive with the Dockerfile.)

  Args:
    info: (googlecloudsdk.api_lib.app.yaml_parsing.ServiceYamlInfo). The
      configuration for the service.
    source_dir: str, the path to the service's source directory

  Raises:
    CloudbuildYamlError: if a cloudbuild.yaml is present, but the runtime is not
      "custom".
    DockerfileError: if a Dockerfile is present, but the runtime is not
      "custom".
    NoDockerfileError: Raised if a user didn't supply a Dockerfile and chose a
      custom runtime.
    CustomRuntimeFilesError: if a custom runtime had both a Dockerfile and a
      cloudbuild.yaml file.

  Returns:
    bool, whether Dockerfile generation is necessary.
  customzcA custom runtime must have exactly one of [{}] and [{}] in the source directory; [{}] contains bothzUsing %s found in %sFz7Not using %s because cloudbuild.yaml was found instead.TzYou must provide your own Dockerfile when using a custom runtime. Otherwise provide a "runtime" field with one of the supported runtimes.a%  There is a Dockerfile in the current directory, and the runtime field in {0} is currently set to [runtime: {1}]. To use your Dockerfile to build a custom runtime, set the runtime field to [runtime: custom]. To continue using the [{1}] runtime, please remove the Dockerfile from this directory.a4  There is a cloudbuild.yaml in the current directory, and the runtime field in {0} is currently set to [runtime: {1}]. To use your cloudbuild.yaml to build a custom runtime, set the runtime field to [runtime: custom]. To continue using the [{1}] runtime, please remove the cloudbuild.yaml from this directory.z.Need Dockerfile to be generated for runtime %s)ospathexistsjoinr   
DOCKERFILEr   ResolverCLOUDBUILD_FILEruntimer?   r5   r   inforA   r;   filer=   )rN   
source_dirhas_dockerfilehas_cloudbuilds       r,   _NeedsDockerfilerS      sw   F 77>>ggll:v0013.77>>ggll:/88HHIK.	\\X.#2396  "2";";"K"K4 
 
	hh%v'8'8*E		hhH  " 
 7 8>vdii>Bll8LM M 
C DJ6iiD'( ( HH=t||Lr+   c                 ^    | j                         xr |j                  | j                  |      S )a  Returns whether we whould use runtime builders for this application build.

  If there is no image that needs to be built (service.RequiresImage() ==
  False), runtime builders are irrelevant, so they do not need to be built.

  If there is an image that needs to be built, whether to use runtime builders
  is determined by the RuntimeBuilderStrategy, based on the service runtime and
  whether the service being deployed has a Dockerfile already made, or whether
  it needs one built.

  Args:
    service: ServiceYamlInfo, The parsed service config.
    strategy: runtime_builders.RuntimeBuilderStrategy, the strategy for
      determining whether a runtime should use runtime builders.
    needs_dockerfile: bool, whether the Dockerfile in the source directory is
      absent.

  Returns:
    bool, whether to use the runtime builders.

  Raises:
    ValueError: if an unrecognized runtime_builder_strategy is given
  )RequiresImageShouldUseRuntimeBuildersrM   )servicestrategyneeds_dockerfiles      r,   rV   rV      s1    0 


! O

+
+GOO=M
NPr+   c                 0   t        j                  | j                  d      }t        j                  ||      }|r5|j                         }|D ci c]  }|j                  |j                   c}S t        dj                  | j                              c c}w )a  Returns map of in-memory Docker-related files to be packaged.

  Returns the files in-memory, so that we don't have to drop them on disk;
  instead, we include them in the archive sent to App Engine directly.

  Args:
    info: (googlecloudsdk.api_lib.app.yaml_parsing.ServiceYamlInfo)
      The service config.
    dockerfile_dir: str, path to the directory to fingerprint and generate
      Dockerfiles for.

  Raises:
    UnsatisfiedRequirementsError: Raised if the code in the directory doesn't
      satisfy the requirements of the specified runtime type.

  Returns:
    A dictionary of filename relative to the archive root (str) to file contents
    (str).
  T)r   deployzYour application does not satisfy all of the requirements for a runtime of type [{0}].  Please correct the errors and try again.)r   Paramsparsedr   IdentifyDirectoryGenerateConfigDatar7   contentsrC   r5   rM   )rN   dockerfile_dirparamsconfiguratordockerfilesds         r,   _GetDockerfilesrf      s    ( dkk$?&00H,113K,78KqAJJ

"K88
&	%' ' 9s   Bc                    i }d}	 t        j                  |       }	 t        j                  |      }t        j                  t        j                  |            |t         j                  <   |S # t         j                  $ r@}t        j                  |j                  t         j                  |             |cY d}~S d}~ww xY w# t        $ r?}t        j                  |j                  t         j                  |             Y d}~|S d}~ww xY w)zGets source context file information.

  Args:
    source_dir: str, path to the service's source directory
  Returns:
    A dict of filename to (str) source context file contents.
  zCould not generate [{name}]: {error}
Stackdriver Debugger may not be configured or enabled on this application. See https://cloud.google.com/debugger/ for more information.)nameerrorN)r   CalculateExtendedSourceContextsGenerateSourceContextErrorr   rN   r5   CONTEXT_FILENAMEBestSourceContextsix	text_typejsondumpsKeyError)rP   source_contextsmcontextsecontexts         r,   _GetSourceContextsForUploadrx     s     /!;;JGH
D,,X6G58]]

76OL112 
 
	0	0 HHQXX<88XBC 
 DHHQXX<88XBCC	Ds5   A, AC ,B??5B:4B?:B?	D
4DD
c                 b    | j                  d      }t        |      dk(  r|d   dfS |d   |d   fS )z)Returns tuple (displayed app id, domain).:   r   N)splitlen)
project_idls     r,   _GetDomainAndDisplayIdr   7  s=    s!Vq[Q4:	
1qtr+   c                     t        |       \  }}|rt        j                  nt        j                  j	                  |||||      S )z5Returns image tag according to App Engine convention.)
gcr_domaindisplaydomainrW   version)r   r   DOCKER_IMAGE_NAME_DOMAIN_FORMATDOCKER_IMAGE_NAME_FORMATr5   )projectrW   r   r   r   r   s         r,   _GetImageNamer   ?  sF    *73/'64:&
0
0..# 17 1r+   c                 x   t        j                  | |      r9t        j                  j	                  ||       }t        j                  ||      s|S t        j                  |      }t        j                         j                  |j                               j                         }dj                  |      }|||<   |S )a  Returns the yaml path, optionally updating gen_files.

  Args:
    source_dir: str, the absolute path to the root of the application directory.
    service_path: str, the absolute path to the service YAML file
    skip_files: appengine.api.Validation._RegexStr, the validated regex object
      from the service info file.
    gen_files: dict, the dict of files to generate. May be updated if a file
      needs to be generated.

  Returns:
    str, the relative path to the service YAML file that should be used for
      build.
  )startz_app_{}.yaml)r   IsDirAncestorOfrF   rG   relpathr   
ShouldSkipReadFileContentsChecksumAddContentsencode	HexDigestr5   )rP   service_path
skip_files	gen_filesrel_pathyaml_contentschecksumgenerated_paths           r,   _GetYamlPathr   K  s     :|4ww|:>H??:x0o((6-^^))-*>*>*@AKKM(!((2.+)N	r+   Fc
           	         t        ||      }
t        |||
      }|j                         syt        j                  j                  dj                  |j                               t        t        |            }|
r|s|j                  t        ||             t        j                  |t        | |j                  ||      dt        j                         }t#        j$                  t&        j(                         t*        j,                  j/                  ||j0                        }t3        ||j4                  |j6                  j8                  |      }	 t;        j<                  ||||       t#        j$                  t&        jP                         |rtS        jT                  |||	      }t        jV                  d|jX                         |j[                          t]        j^                  |      }|j0                  |d}|	rEta        jb                  |j6                  d	      }ta        jb                  |j6                  d	      r||d
<   |je                  |      }nt;        jf                  |j0                        }t;        jh                  ||      }tk        ||| |      S # t>        t@        f$ ra}tB        jD                  jG                         r=|jH                  r1tK        |jH                        tL        kD  rtO        |jH                         d}~ww xY w)a  Builds and pushes a set of docker images.

  Args:
    project: str, The project being deployed to.
    service: ServiceYamlInfo, The parsed service config.
    upload_dir: str, path to the service's upload directory
    source_files: [str], relative paths to upload.
    version_id: The version id to deploy these services under.
    code_bucket_ref: The reference to the GCS bucket where the source will be
      uploaded.
    gcr_domain: str, Cloud Registry domain, determines the physical location
      of the image. E.g. `us.gcr.io`.
    runtime_builder_strategy: runtime_builders.RuntimeBuilderStrategy, whether
      to use the new CloudBuild-based runtime builders (alternative is old
      externalized runtimes).
    parallel_build: bool, if True, enable parallel build and deploy.
    use_flex_with_buildpacks: bool, if true, use the build-image and
      run-image built through buildpacks.

  Returns:
    BuildArtifact, Representing the pushed container image or in-progress build.

  Raises:
    DockerfileError: if a Dockerfile is present, but the runtime is not
      "custom".
    NoDockerfileError: Raised if a user didn't supply a Dockerfile and chose a
      custom runtime.
    UnsatisfiedRequirementsError: Raised if the code in the directory doesn't
      satisfy the requirements of the specified runtime type.
    ValueError: if an unrecognized runtime_builder_strategy is given
  Nz2Building and pushing image for service [{service}])rW   F)ra   reponocachetag)r   zUsing runtime builder [%s])_OUTPUT_IMAGE_GAE_APPLICATION_YAML_PATHpython_version_GOOGLE_RUNTIME_VERSION)6rS   rV   rU   r   statusPrintr5   moduledictrx   updaterf   r   Imager   r   DOCKER_IMAGE_TAGr   CustomTimedEventr   CLOUDBUILD_UPLOAD_STARTr   ObjectReferenceFromBucketReftagged_repor   rO   r]   r   r
   UploadSourceOSErrorIOErrorr   OperatingSystem	IsWindowsr7   r}   _WINDOWS_MAX_PATHr0   CLOUDBUILD_UPLOADr   FromServiceInforN   build_file_uriWarnIfDeprecatedr   ConvertToPosixPathr   GetRuntimeConfigAttrLoadCloudBuildGetDefaultBuild
FixUpBuild_SubmitBuild)r   rW   
upload_dirsource_files
version_idcode_bucket_refr   runtime_builder_strategyparallel_builduse_flex_with_buildpacksrY   use_runtime_buildersr   image
object_refrelative_yaml_patherrbuilder_reference	yaml_path
substituter   r	   s                         r,   BuildAndPushDockerImager   f  s   T &gz:1'2J2BD
 
			 **:vgnnv%' .z:;)2 _Wj9:


'..*jI

!
!	#% 
<??@++99u((**#J$+NN$=$=yJ
Zz'02 
<99:(8857HH)+<+K+KL&&(''(:;I**&/J  #88
..*,n		*	*7>>;K	L0>
,-,,Z8E ''(9(9:E

 
 

3%	eUG^	<<; 7	 
  **,	#cll+.?? ..		
s   J L"AK>>Lc                    t        j                  t        j                  j                  j
                  j                               }|r4|t        kD  r+d}t        j                  dj                  |t                     |rgt        j                  t        j                         t        j                          j#                  | |      }t$        j&                  j)                  |      S t        j                  t        j*                         t        j                          j-                  | |       t        j                  t        j.                         t$        j&                  j1                  |j2                        S )a[  Builds and pushes a set of docker images.

  Args:
    build: A fixed up Build object.
    image: docker_image.Image, A docker image.
    project: str, The project being deployed to.
    parallel_build: bool, if True, enable parallel build and deploy.

  Returns:
    BuildArtifact, Representing the pushed container image or in-progress build.
  FzProperty cloud_build_timeout configured to [{0}], which exceeds the maximum build time for parallelized beta deployments of [{1}] seconds. Performing serial deployment.)r   )r
   GetServiceTimeoutSecondsr   VALUESappcloud_build_timeoutGetMAX_PARALLEL_BUILD_TIMEr   rN   r5   r   r   r   CLOUDBUILD_EXECUTE_ASYNC_STARTcloudbuild_buildCloudBuildClientExecuteCloudBuildAsync	app_buildBuildArtifactMakeBuildIdArtifactFromOpCLOUDBUILD_EXECUTE_STARTExecuteCloudBuildCLOUDBUILD_EXECUTEMakeImageArtifactr   )r	   r   r   r   build_timeoutbuild_ops         r,   r   r     s    66//3357-}'>>NHH	1172245 \HHI002IIw J  H""<<XFF\BBC%%'99w :  \<<=""44U5F5FGGr+   c                    t        j                  t        j                         	 d}t	        j
                  |      5  | j                          ddd       t        j                  j                          t        j                  t        j                         y# 1 sw Y   KxY w# t        j                  $ r5}t        j                  dt        j                  |      z          Y d}~sd}~ww xY w)z3Call an API to prepare the for App Engine Flexible.z7If this is your first deployment, this may take a whileNzWe couldn't validate that your project is ready to deploy to App Engine Flexible Environment. If deployment fails, please check the following message and try again:
)r   r   r   PREPARE_ENV_STARTr   ProgressTrackerPrepareVmRuntimer   r   r   r   RPCErrorwarningrn   ro   PREPARE_ENV)
gae_clientmessager   s      r,   DoPrepareManagedVmsr     s    	<99:EGG		)	)'	2 !!# 
3 JJ 
<334 
3	2
 
 E KK
.14s1C	DE EEs.   B# B&B# B B# #C+6+C&&C+c                    	 t        j                  | d       y# t        j                  $ rr t        j                  |       }t        j                  d      }|r-t        j                  |      r|dj                  t              z  }t        j                  |       Y yt        j                  $ r t        t        j                  |             t         j"                  $ r}t%        j&                  |d      d}~ww xY w)a  Attempts to enable the Flexible Environment API on the project.

  Possible scenarios:
  -If Flexible Environment is already enabled, success.
  -If Flexible Environment API is not yet enabled, attempts to enable it. If
   that succeeds, success.
  -If the account doesn't have permissions to confirm that the Flexible
   Environment API is or isn't enabled on this project, succeeds with a warning.
     -If the account is a service account, adds an additional warning that
      the Service Management API may need to be enabled.
  -If the Flexible Environment API is not enabled on the project and the attempt
   to enable it fails, raises PrepareFailureError.

  Args:
    project: str, the project ID.

  Raises:
    PrepareFailureError: if enabling the API fails with a 403 or 404 error code.
    googlecloudsdk.api_lib.util.exceptions.HttpException: miscellaneous errors
        returned by server.
  zappengineflex.googleapis.comT)use_google_authz

{}zVError [{status_code}] {status_message}{error.details?
Detailed error information:
{?}})error_formatN)r   EnableServiceIfDisableds_exceptions#GetServicePermissionDeniedExceptionFLEXIBLE_SERVICE_VERIFY_WARNINGr5   c_storeLoadIfEnabledr   IsServiceAccountCredentials,FLEXIBLE_SERVICE_VERIFY_WITH_SERVICE_ACCOUNTr   r   EnableServiceExceptionr.   PREPARE_FAILURE_MSGapitools_exceptions	HttpErrorapi_lib_exceptionsHttpException)r   r   
credentialr   s       r,   PossiblyEnableFlexr     s    ,C&&w'EG		9	9 	 .44W=G &&t<Je77
C!MNNgKK		,	, C 188A
BB		&	& C 
*
* AC CCs    BC;AC;C66C;c                 R   | j                   r&| j                  j                  st        j                  S | j                  j                  D ]4  }	 t        j                  |j                  dz   d      r|j                  c S 6 t        j                  S # t
        j                  $ r Y \w xY w)a!  Returns whether the root URL for an application is served over HTTPS.

  More specifically, returns the 'secure' setting of the handler that will serve
  the application. This can be 'always', 'optional', or 'never', depending on
  when the URL is served over HTTPS.

  Will miss a small number of cases, but HTTP is always okay (an HTTP URL to an
  HTTPS-only service will result in a redirect).

  Args:
    service_info: ServiceYamlInfo, the service configuration.

  Returns:
    str, the 'secure' setting of the handler for the root URL.
  $/)is_ti_runtimer]   handlersr   SECURE_HTTP_OR_HTTPSrematchurlsecureri   SECURE_HTTP)service_infohandlers     r,   UseSslr  8  s      (;(;(D(D'''$$--g	'++#S	)~~ 
* . 
			 88  s   .BB&%B&Tc                    | s|st        d      |xs d}|xs d}|t        k(  rd}| s.t        j                  j	                         }|j                         } | r| j                  j                  dd      \  }}t        t        t        |||g            }	d}
|t        j                  k(  rdj                  |	      }d}
nt        j                  |	      }t        |      t         k  rd}
n|rgg d}t        j                  t#        |||g|      D cg c]	  \  }}|r| c}}      }dj%                  ||t               }t'        j(                  |       dj                  |	      }|t        j*                  k(  rd}
n=|t        j,                  k(  r*|s&d	j%                  |      }t'        j(                  |       d}
d
j%                  |
|      S c c}}w )ar  Returns the hostname of the given version of the deployed app.

  Args:
    app: Application resource. One of {app, app_id} must be given.
    app_id: str, project ID. One of {app, app_id} must be given. If both are
      provided, the hostname from app is preferred.
    service: str, the (optional) service being deployed
    version: str, the deployed version ID (omit to get the default version URL).
    use_ssl: bool, whether to construct an HTTPS URL.
    deploy: bool, if this is called during a deployment.

  Returns:
    str. Constructed URL.

  Raises:
    TypeError: if neither an app nor an app_id is provided
  z7Must provide an application resource or application ID. .r{   httphttps)z$VERSION_IDz$SERVICE_IDz$APP_IDa  This deployment will result in an invalid SSL certificate for service [{0}]. The total length of your subdomain in the format {1} should not exceed {2} characters. Please verify that the certificate corresponds to the parent domain of your application when you connect.z@Most browsers will reject the SSL certificate for service [{0}].z{0}://{1}.{2})	TypeErrorDEFAULT_SERVICEr   AppengineApiClientGetApiClientGetApplicationdefaultHostnamer|   listr   boolr   r  rI   ALT_SEPARATORr}   MAX_DNS_LABEL_LENGTHr   r5   r   r   r  SECURE_HTTPS)r   app_idrW   r   use_sslr[   service_name
api_clientr   subdomain_partsscheme	subdomainformat_partsijsubdomain_formatmsgs                    r,   GetAppHostnamer+  U  s   & 
V
M
NNMr'B,L	%88EEGJ

#
#
%C((..sA6NFF wf&EFG/&###)IF""?3I
9~--f	@(-- '<!@,O O6Aq O / 17w7G7K1M	 	 	C((?+i	G00	0g***"#)6'? 
++c
				6	::)s   G
zapp.yaml)Zr)   
__future__r   r   r   rp   rF   r  apitools.base.pyr   r   gae_ext_runtimer   googlecloudsdk.api_lib.appr   r	   r   r
   r   r   r   r   r   !googlecloudsdk.api_lib.app.imagesr   #googlecloudsdk.api_lib.app.runtimesr   !googlecloudsdk.api_lib.cloudbuildr   googlecloudsdk.api_lib.servicesr   r   googlecloudsdk.api_lib.storager   googlecloudsdk.api_lib.utilr   googlecloudsdk.appengine.apir   googlecloudsdk.appengine.toolsr   googlecloudsdk.corer   r   r   googlecloudsdk.core.consoler   googlecloudsdk.core.credentialsr   r   r   googlecloudsdk.core.utilr   r   rn   	six.movesr   r   r  r  r  r   r   r   r   r   r$   r.   r0   r;   r=   r?   rA   rC   rS   rV   rf   rx   r   r   r   RuntimeBuilderStrategyNEVERr   r   r   r   r  r  r+  DEFAULT_DEPLOYABLEr*   r+   r,   <module>r@     s    2 &  '  	 	 > ' ; 9 2 3 3 7 + 3 4 = G 6 F 7 H 0 7 * # ' * 8 1 < * . 
   
  
    , -N $J $% @ @*Jj&& JO*** OPj.. P
(( 7:#3#3 7L^P8'@:	F .DDJJ"h=V HF5(-C`: D$"..tN;b   r+   