
                         
   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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  G d de
j                         Zd ZdZdZdZd ZddZd Zd Zd Z G d dej6                        Zy)z0Utility functions for gcloud datastore emulator.    )absolute_import)division)unicode_literalsN)util)
exceptions)execution_utils)log)
properties)	platformsc                        e Zd Z fdZ xZS )UnableToPrepareDataDirc                 ,    t         t        |   d       y )Nz5Unable to prepare the data directory for the emulator)superr   __init__)self	__class__s    :lib/googlecloudsdk/command_lib/emulators/datastore_util.pyr   zUnableToPrepareDataDir.__init__"   s    	
 $0?A    )__name__
__module____qualname__r   __classcell__)r   s   @r   r   r       s    A Ar   r   c                    t         j                  j                         }|t         j                  j                  u rOd}t        j
                  j                  t        j                  t              |      }t        j                  |g|  S d}t        j
                  j                  t        j                  t              |      }t        j                  |g|  S )zConstructs an argument list for calling the GCD emulator.

  Args:
    emulator_args: args for the emulator.

  Returns:
    An argument list to execute the GCD emulator.
  zcloud_datastore_emulator.cmdcloud_datastore_emulator)r   OperatingSystemCurrentWINDOWSospathjoinr   GetEmulatorRootCLOUD_DATASTOREr   ArgsForCMDToolArgsForExecutableTool)emulator_args
current_oscmdgcd_executables       r   ArgsForGCDEmulatorr)   '   s     ((002*9,,444
(CWW\\$"6"6"GMN)).I=II
$CWW\\$"6"6"GMN00P-PPr   	datastorezcloud-datastorezGoogle Cloud Datastore emulatorc                    | j                   }t        j                  j                  |      r:t        j                  |      r%t        j                  dj                  |             ydg}t        j                  j                  j                  j                  d      }|j                  dj                  |             |j                  |       t        |      }t
        j                  j!                  dj                  dj#                  |                   t%        j&                  |      5 }t%        j(                  |t*               |j-                         }|r
t/               	 ddd       y# 1 sw Y   yxY w)	zPrepares the given directory using gcd create.

  Raises:
    UnableToPrepareDataDir: If the gcd create execution fails.

  Args:
    args: The arguments passed to the command.
  zReusing existing data in [{0}].NcreateTrequiredz--project_id={0}Executing: {0} )data_dirr   r   isdirlistdirr	   warningformatr
   VALUEScoreprojectGetappendr)   statusPrintr    r   ExecPrefixOutput	DATASTOREpollr   )argsr1   gcd_create_argsr8   	exec_argsprocessfaileds          r   PrepareGCDDataDirrF   @   s    ]](WW]]8H!5KK188BC
J/""**...='+227;<" 1)**#**388I+>?@yywgy)\\^F"$$  s   +7E,,E5c                    dg}|j                  dj                  | j                  j                               |j                  dj                  | j                  j                               |j                  dj                  | j
                               |j                  d       | j                  r|j                  d       n*|j                  dj                  | j                               |j                  | j                         t        |      }t        j                  j                  dj                  d	j                  |                   t        j                  ||
      S )a  Starts the datastore emulator with the given arguments.

  Args:
    args: Arguments passed to the start command.
    log_file: optional file argument to reroute process's output.

  Returns:
    process, The handle of the child process running the datastore emulator.
  startz
--host={0}z
--port={0}z--store_on_disk={0}z--allow_remote_shutdownz--firestore_in_datastore_modez--consistency={0}r/   r0   )log_file)r:   r5   	host_porthostportstore_on_diskuse_firestore_in_datastore_modeconsistencyr1   r)   r	   r;   r<   r    r   r=   )rA   rI   gcd_start_argsrC   s       r   StartGCDEmulatorrQ   \   s    9.++DNN,?,?@A++DNN,?,?@A-44T5G5GHI12	))9:-44T5E5EFG& 0)**#**388I+>?@	9x	00r   c                 l   dj                  | j                  j                  | j                  j                        }t        j
                  j                  j                  j                  d      }dj                  |      |dj                  |      ||d}t        j                  || j                         y)zWrites the env.yaml file for the datastore emulator with provided args.

  Args:
    args: Arguments passed to the start command.
  z{0}:{1}Tr-   z
http://{0}z{0}/datastore)DATASTORE_HOSTDATASTORE_EMULATOR_HOSTDATASTORE_EMULATOR_HOST_PATHDATASTORE_DATASETDATASTORE_PROJECT_IDN)r5   rJ   rK   rL   r
   r6   r7   r8   r9   r   WriteEnvYamlr1   )rA   rJ   
project_idenvs       r   WriteGCDEnvYamlr[   v   s     t~~22DNN4G4GH)  %%--1141@*'..y9$-)8)?)?	)J(!+		
# C'r   c                  4    t        j                  t              S N)r   
GetDataDirr?    r   r   r^   r^      s    		##r   c                  4    t        j                  t              S r]   )r   GetHostPortr?   r_   r   r   ra   ra      s    			)	$$r   c                   V    e Zd ZdZd Zed        Zed        Zed        Zed        Z	y)DatastoreEmulatorz=Represents the ability to start and route datastore emulator.c                     t        j                  d|dddt        j                         d      }t	        |       t        || j                               S )N	localhost)rK   rL   Tg?)rJ   rM   rO   r1   )r   AttrDicttempfilemkdtemprF   rQ   	_GetLogNo)r   rL   rA   s      r   StartzDatastoreEmulator.Start   sR    ==
 $$& D dD$.."233r   c                 
    g dS )N)(zgoogle.datastore.v1.Datastorez&google.datastore.v1.AllocateIdsRequestz'google.datastore.v1.AllocateIdsResponsezgoogle.datastore.v1.ArrayValuez+google.datastore.v1.BeginTransactionRequestz,google.datastore.v1.BeginTransactionResponsez!google.datastore.v1.CommitRequestz&google.datastore.v1.CommitRequest.Modez"google.datastore.v1.CommitResponsez#google.datastore.v1.CompositeFilterz,google.datastore.v1.CompositeFilter.Operatorzgoogle.datastore.v1.Entityz google.datastore.v1.EntityResultz+google.datastore.v1.EntityResult.ResultTypezgoogle.datastore.v1.Filterzgoogle.datastore.v1.GqlQueryz%google.datastore.v1.GqlQueryParameterzgoogle.datastore.v1.Keyz#google.datastore.v1.Key.PathElementz"google.datastore.v1.KindExpressionz!google.datastore.v1.LookupRequestz"google.datastore.v1.LookupResponsezgoogle.datastore.v1.Mutationz"google.datastore.v1.MutationResultzgoogle.datastore.v1.PartitionIdzgoogle.datastore.v1.Projectionz"google.datastore.v1.PropertyFilterz+google.datastore.v1.PropertyFilter.Operatorz!google.datastore.v1.PropertyOrderz+google.datastore.v1.PropertyOrder.Directionz%google.datastore.v1.PropertyReferencezgoogle.datastore.v1.Queryz$google.datastore.v1.QueryResultBatchz4google.datastore.v1.QueryResultBatch.MoreResultsTypezgoogle.datastore.v1.ReadOptionszRgoogle.datastore.v1.ReadOptions.ReadConsistencygoogle.datastore.v1.RollbackRequestz$google.datastore.v1.RollbackResponsez#google.datastore.v1.RunQueryRequestz$google.datastore.v1.RunQueryResponsezgoogle.datastore.v1.Valuer_   r   s    r   prefixeszDatastoreEmulator.prefixes   s    * *r   c                     t         S r]   )r?   rl   s    r   service_namezDatastoreEmulator.service_name   s    r   c                     t         S r]   )DATASTORE_TITLErl   s    r   emulator_titlez DatastoreEmulator.emulator_title   s    r   c                      y)Nzcloud-datastore-emulatorr_   rl   s    r   emulator_componentz$DatastoreEmulator.emulator_component   s    %r   N)
r   r   r   __doc__rj   propertyrm   ro   rr   rt   r_   r   r   rc   rc      s[    E4 / /b     & &r   rc   r]   )ru   
__future__r   r   r   r   rg   $googlecloudsdk.command_lib.emulatorsr   googlecloudsdk.corer   r   r	   r
   googlecloudsdk.core.utilr   Errorr   r)   r?   r"   rq   rF   rQ   r[   r^   ra   Emulatorrc   r_   r   r   <module>r}      s     7 &  ' 	  5 * / # * .AZ-- AQ( 	#3%814("$%L& L&r   