
    M              	          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ZdZdZedz   ZddddddZej>                  j@                  dej>                  jB                  diej>                  j@                  dej>                  jB                  diej>                  j@                  dej>                  jB                  diej>                  j@                  dej>                  jB                  diej>                  j@                  d ej>                  jB                  diej>                  j@                  d!ej>                  jB                  did"Z"d# Z#ed$fd%Z$efd&Z%efd'Z&d( Z'd) Z(ej>                  j@                  fd*Z)ej>                  j@                  fd+Z*d, Z+d- Z,d. Z-d/ Z.	 dFd0Z/d1 Z0d2 Z1d3 Z2d4 Z3d5 Z4ej>                  j@                  fd6Z5d7 Z6d8 Z7d9 Z8ej>                  j@                  fd:Z9d; Z:d< Z;d= Z<d> Z=d? Z>d@ Z?dA Z@dB ZAdC ZBej>                  j@                  fdDZCej>                  j@                  fdEZDy)GzCloud Datastream API utilities.    )absolute_import)division)unicode_literalsN)encoding)
exceptions)camel_case_utils)apis)base)util)	resources)yaml)
console_iov1
datastream_camel_case_conversioninclude_objectsexclude_objectssource_connection_profiledestination_connection_profilevpc)	allowlist
rejectlistsource_connection_profile_name#destination_connection_profile_namevpc_nameschema_nameschemadatabase_namedatabase
table_nametablecolumn_namecolumnr   r   )r   r   r!   r#   r   r   c                     t        j                  t        t        |d      }t	        j
                  | d      }t        j                  |      }t        |||      }|S )z2Parses a config message and validates it's schema.F)for_helpbinary)message_typeparsed_yamlschema_path)	export_utilGetSchemaPath_DEFAULT_API_NAME_DEFAULT_API_VERSIONr   ReadFromFileOrStdinr   load$CreateMessageWithCamelCaseConversion)config_file_pathr   r(   r*   datar)   messages          -lib/googlecloudsdk/api_lib/datastream/util.pyParseMessageAndValidateSchemar6   L   sX    ))-{U+
 
	'	'(8	G$		$+0' 
.    Fc                 2    t        j                  d| |      S )Nr   )no_http)r	   GetClientInstance)api_versionr9   s     r5   r:   r:   _   s    			k7	KKr7   c                 .    t        j                  d|       S Nr   )r	   GetMessagesModule)r;   s    r5   r>   r>   c   s    			k	::r7   c                 R    t        j                         }|j                  d|        |S r=   )r   RegistryRegisterApiByName)r;   resource_parsers     r5   GetResourceParserrC   g   s&    &&(/##L+>	r7   c                 &    dj                  | |      S )a  Get the resource name of the parent collection.

  Args:
    project: the project of the parent collection.
    location: the GCP region of the membership.

  Returns:
    the resource name of the parent collection in the format of
    `projects/{project}/locations/{location}`.
  zprojects/{}/locations/{})format)projectlocations     r5   	ParentRefrH   m   s     
$	*	*7H	==r7   c                  P    t        j                  t        j                               S )zoGenerates a UUID to use as the request ID.

  Returns:
    string, the 40-character UUID for the request ID.
  )six	text_typeuuiduuid4 r7   r5   GenerateRequestIdrO   |   s     
tzz|	$$r7   c                     |t         j                  j                  k7  rt        |d| j                        S t        | ||      S )z6Parses a mysql_rdbms_file into the MysqlRdbms message.
MysqlRdbms)r
   ReleaseTrackBETAr6   rQ   ParseMysqlRdbmsFileBeta)messagesmysql_rdbms_filerelease_tracks      r5   ParseMysqlRdbmsFilerX      sD     d'',,,(,(;(;  
!+;]	KKr7   c                     |t         j                  j                  k7  rt        |d| j                        S t        | ||      S )z8Parses a oracle_rdbms_file into the OracleRdbms message.OracleRdbms)r
   rR   rS   r6   rZ   ParseOracleRdbmsFileBeta)rU   oracle_rdbms_filerW   s      r5   ParseOracleRdbmsFiler]      sD     d'',,,(=(*>*>  
"(,=}	MMr7   c                 0    t        |d| j                        S )z@Parses a postgresql_rdbms_file into the PostgresqlRdbms message.PostgresqlRdbms)r6   r_   )rU   postgresql_rdbms_files     r5   ParsePostgresqlRdbmsFilera      s    	&.0H0H
 r7   c                 0    t        |d| j                        S )z>Parses a sqlserver_rdbms_file into the SqlServerRdbms message.SqlServerRdbms)r6   rc   )rU   sqlserver_rdbms_files     r5   ParseSqlServerRdbmsFilere      s    	&,h.E.E
 r7   c                 0    t        |d| j                        S )z<Parses a salesforce_org_file into the SalesforceOrg message.SalesforceOrg)r6   rg   )rU   salesforce_org_files     r5   ParseSalesforceOrgFileri      s    	&?H,B,B
 r7   c                 0    t        |d| j                        S )z6Parses a mongodb_file into the MongodbCluster message.MongodbCluster)r6   rk   )rU   mongodb_files     r5   ParseMongodbFilerm      s    	&$h&=&=
 r7   c                     t        j                  |      }|rt        j                  ||       	 t	        j
                  | |      }|S # t        $ r)}t        j                  dj                  |            d}~ww xY w)a/  Create a message from a yaml dict.

  Similar to export_util.Import (since we convert to camel case before)
  Args:
    message_type: a Datastream message type to create.
    parsed_yaml: dict
    schema_path: str, path to the message schema to validate against.

  Returns:
    a Datastream message.
  zCannot parse YAML: [{0}]N)
r   ConvertYamlToCamelCaser+   ValidateYAMLapi_encodingPyValueToMessage	Exceptionr   
ParseErrorrE   )r(   r)   r*   converted_yamlr4   es         r5   r1   r1      sw     $::;G.^[9F++L.IG 
. 
 F


 : A A! D
EEFs   A 	A9$A44A9c                 N    t         j                  | i       j                  ||       S N!RDBMS_FIELD_NAME_BY_RELEASE_TRACKgetfieldrW   s     r5   GetRDBMSV1alpha1ToV1FieldNamer~      '    	*	.	.ub	9	=	=U
 r7   c                 N    t         j                  | i       j                  ||       S rx   ry   r|   s     r5   _GetRDBMSFieldNamer      r   r7   c                    | j                  |j                  t        d|      d            }|j                  d      }|||_        |j                  d      }|||_        |j                  d      }|||_        |j                  d      }|||_        |j                  d      }|||_        |j                  d	      }	|	|	|_        |S )
zAParses a raw mysql column json/yaml into the MysqlColumn message.r#    r#   	data_type	collationlengthnullableordinal_positionprimary_key)	MysqlColumnr{   r   dataTyper   r   r   ordinalPosition
primaryKey)
rU   mysql_column_objectrW   r4   r   r   r   r   r   r   s
             r5   ParseMysqlColumnr      s       $$
X}
5r; ! <' "%%k2) G!%%k2)!G""8,&GN $$Z0(G(,,-?@!.G#''6+$G	.r7   c                     g }|j                  dg       D ]  }|j                  t        | ||               t        d|      }|j                  |      }|st	        j
                  d|z        | j                  ||      S )z?Parses a raw mysql table json/yaml into the MysqlTable message.mysql_columnsr!   $Cannot parse YAML: missing key "%s".)r!   mysqlColumns)r{   appendr   r   ds_exceptionsrt   
MysqlTable)rU   mysql_table_objectrW   mysql_column_msg_listr#   	table_keyr    s          r5   ParseMysqlTabler      s    "&&;f  6=9; < !-8)!%%i0*	

"
"#I#,$- . .			%: 
 
< <r7   c                     g }|j                  dg       D ]  }|j                  t        | ||               t        d|      }|j                  |      }|st	        j
                  d|z        | j                  ||      S )zEParses a raw mysql database json/yaml into the MysqlDatabase message.mysql_tablesr   r   )r   mysqlTables)r{   r   r   r   r   rt   MysqlDatabase)rU   mysql_database_objectrW   mysql_tables_msg_listr!   database_keyr   s          r5   ParseMysqlDatabaser   
  s    $((<e  %79 = $J>,'++L9-	

"
"#I#/$0 1 1			*? 
  
A Ar7   c                     |j                  dg       }g }|D ]  }|j                  t        | ||               | j                  |      }|S )zNParses an object of type {mysql_databases: [...]} into the MysqlRdbms message.mysql_databases)mysqlDatabases)r{   r   r   rQ   )rU   mysql_rdbms_datarW   mysql_databases_rawmysql_database_msg_listr   mysql_rdbms_msgs          r5   (ParseMysqlSchemasListToMysqlRdbmsMessager     sb    
 ),,->C#f""8V];= $ '', ( ./	r7   c                    | j                  |j                  t        d|      d            }|j                  d      }|||_        |j                  d      }|||_        |j                  d      }|||_        |j                  d      }|||_        |j                  d      }|||_        |j                  d	      }	|	|	|_        |j                  d
      }
|
|
|_	        |j                  d      }|||_
        |S )zCParses a raw oracle column json/yaml into the OracleColumn message.r#   r   r   r   r   r   r   r   	precisionr   scale)OracleColumnr{   r   r   r   r   r   r   r   r   r   )rU   oracle_column_objectrW   r4   r   r   r   r   r   r   r   r   s               r5   ParseOracleColumnr   )  s(   !!!%%
X}
5r; " <' #&&{3) G!%%j1(G##H-&GN!%%j1(G)--.@A!.G"&&{3)!G$((7+$G

"
"7
+%
GM	.r7   c                     g }|j                  dg       D ]  }|j                  t        | ||               t        d|      }|j                  |      }|st	        j
                  d|z        | j                  ||      S )zAParses a raw oracle table json/yaml into the OracleTable message.oracle_columnsr!   r   )r!   oracleColumns)r{   r   r   r   r   rt   OracleTable)rU   oracle_table_objectrW   oracle_columns_msg_listr#   r   r    s          r5   ParseOracleTabler   I  s    #''(8"=f""(FM:< > !-8)"&&y1*	

"
"#I#,$- . .			&= 
 
? ?r7   c                     g }|j                  dg       D ]  }|j                  t        | ||               t        d|      }|j                  |      }|st	        j
                  d|z        | j                  ||      S )zCParses a raw oracle schema json/yaml into the OracleSchema message.oracle_tablesr   r   )r   oracleTables)r{   r   r   r   r   rt   OracleSchema)rU   oracle_schema_objectrW   oracle_tables_msg_listr!   
schema_keyr   s          r5   ParseOracleSchemar   X  s    #''<e!!5-8: = "(M:*$((4+	

"
"#I#-$. / /			'= 
 
? ?r7   c                     |j                  dg       }g }|D ]  }|j                  t        | ||               | j                  |      }|S )zNParses an object of type {oracle_schemas: [...]} into the OracleRdbms message.oracle_schemas)oracleSchemas)r{   r   r   rZ   )rU   oracle_rdbms_datarW   oracle_schemas_raworacle_schema_msg_listr   oracle_rdbms_msgs          r5   *ParseOracleSchemasListToOracleRdbmsMessager   g  sc    
 ),,-=rB"f!!(FM:< # ))* * ,	r7   c                    | j                  |j                  dd            }|j                  d      }|||_        |j                  d      }|||_        |j                  d      }|||_        |j                  d      }|||_        |j                  d      }|||_        |j                  d	      }|||_        |j                  d
      }	|	|	|_        |S )zKParses a raw postgresql column json/yaml into the PostgresqlColumn message.r#   r   r   r   r   r   r   r   r   r   )	PostgresqlColumnr{   r   r   r   r   r   r   r   )
rU   postgresql_column_objectr4   r   r   r   r   r   r   r   s
             r5   ParsePostgresqlColumnr   w  s    %%%))(B7 & 9'&**;7) G#''1&GN&**;7)!G
"
&
&w
/%
GM(,,];+$G%))*5(G-112DE!.G	.r7   c                     g }|j                  dg       D ]  }|j                  t        | |              |j                  d      }|st        j                  d      | j                  ||      S )zIParses a raw postgresql table json/yaml into the PostgresqlTable message.postgresql_columnsr!   z'Cannot parse YAML: missing key "table".)r!   postgresqlColumns)r{   r   r   r   rt   PostgresqlTable)rU   postgresql_table_objectpostgresql_columns_msg_listr#   r    s        r5   ParsePostgresqlTabler     s|     "'++,@"Ef&&'<Xv'NO F&**73*	

"
"#L
MM		!	!*E 
" 
G Gr7   c                     g }|j                  dg       D ]  }|j                  t        | |              |j                  d      }|st        j                  d      | j                  ||      S )zKParses a raw postgresql schema json/yaml into the PostgresqlSchema message.postgresql_tablesr   z(Cannot parse YAML: missing key "schema".)r   postgresqlTables)r{   r   r   r   rt   PostgresqlSchema)rU   postgresql_schema_objectpostgresql_tables_msg_listr!   r   s        r5   ParsePostgresqlSchemar     s|    !'++,?De%%&:8U&KL E(,,X6+	

"
"#M
NN		"	"+E 
# 
G Gr7   c                     |j                  dg       }g }|D ]  }|j                  t        | |              | j                  |      }|S )zVParses an object of type {postgresql_schemas: [...]} into the PostgresqlRdbms message.postgresql_schemas)postgresqlSchemas)r{   r   r   r_   )rU   postgresql_rdbms_datapostgresql_schemas_rawpostgresql_schema_msg_listr   postgresql_rdbms_msgs         r5   2ParsePostgresqlSchemasListToPostgresqlRdbmsMessager     s_     1445I2N!&f%%&;Hf&MN ' "112 2 4	r7   c                 F    | j                  |j                  dd            S )zCParses a raw mongodb field json/yaml into the MongodbField message.r}   r   )r}   )MongodbFieldr{   )rU   mongodb_field_objects     r5   ParseMongodbFieldr     s$    			%9%=%=gr%J		KKr7   c                     |j                  dg       }g }|D ]  }|j                  t        | |              | j                  |j                  dd      |      S )zKParses a raw mongodb database json/yaml into the MongodbCollection message.fields
collectionr   )r   r   )r{   r   r   MongodbCollection)rU   mongodb_collection_object
fields_rawfields_msg_listr}   s        r5   ParseMongodbCollectionr     sd    (,,Xr:*/e,Xu=> 		#	#*..|R@ 
$ 
 r7   c                     |j                  dg       }g }|D ]  }|j                  t        | |              | j                  |      S )zIParses a raw mongodb database json/yaml into the MongodbDatabase message.collections)r   )r{   r   r   MongodbDatabase)rU   mongodb_database_objectcollections_rawcollections_msg_listr   s        r5   ParseMongodbDatabaser     sO    +//rB/#j 6x LM $		!	!.B	!	CCr7   c                     |j                  dg       }g }|D ]  }|j                  t        | |              | j                  |      S )zGParses a raw mongodb cluster json/yaml into the MongodbCluster message.	databases)r   )r{   r   r   rk   )rU   mongodb_cluster_objectdatabases_rawdatabases_msg_listr   s        r5   ParseMongodbClusterr     sO    (,,["=-h28XFG  		 	 +=	 	>>r7   c                     g }| D ]S  }d}t         D ]
  }||v s|} n |r)|j                  |j                  |t         |                C|j                  |       U |S )aU  Updates field mask paths according to the v1alpha1 > v1 Datastream API change.

  This allows for backwards compatibility with the current client field
  mask.

  Args:
    field_mask: List[str], list of stream fields to update

  Returns:
    updated_field_mask: List[str] field mask with fields translated
      from v1alpha1 API to v1.
  N)-_UPDATE_MASK_FIELD_TRANSLATION_V1ALPHA1_TO_V1r   replace)
field_maskupdated_field_maskpathfield_to_translater}   s        r5   UpdateV1alpha1ToV1MaskFieldsr    sx     d>	$" ? 
,, ;<NOQ %  
r7   c                    t        j                  |d      }	 t        j                  |      }|j                  d|      }t        | ||      S # t        $ r)}t        j                  dj                  |            d}~ww xY w)zBParses a mysql_rdbms_file into the MysqlRdbms message. deprecated.Fr&   Cannot parse YAML:[{0}]Nmysql_rdbms)
r   r/   r   r0   rs   r   rt   rE   r{   r   )rU   rV   rW   r3   mysql_rdbms_head_datarv   r   s          r5   rT   rT     s    
 
	'	'(8	G$H IIdO +..* 
2 -
  
 H

"
"#<#C#CA#F
GGH   A 	A?$A::A?c                    t        j                  |d      }	 t        j                  |      }|j                  d|      }t        | ||      S # t        $ r)}t        j                  dj                  |            d}~ww xY w)zDParses a oracle_rdbms_file into the OracleRdbms message. deprecated.Fr&   r  Noracle_rdbms)
r   r/   r   r0   rs   r   rt   rE   r{   r   )rU   r\   rW   r3   oracle_rdbms_head_datarv   r   s          r5   r[   r[     s     
	'	'(9%	H$H!YYt_ -00, 
4!=
  
 H

"
"#<#C#CA#F
GGHr  rx   )E__doc__
__future__r   r   r   rL   apitools.base.pyr   rq   googlecloudsdk.api_lib.dataprocr   !googlecloudsdk.api_lib.datastreamr   r   googlecloudsdk.api_lib.utilr	   googlecloudsdk.callioper
   !googlecloudsdk.command_lib.exportr   r+   googlecloudsdk.corer   r   googlecloudsdk.core.consoler   rJ   r.   r-   CAMEL_CASE_CONVERSION_EVENTr   rR   rS   GArz   r6   r:   r>   rC   rH   rO   rX   r]   ra   re   ri   rm   r1   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  rT   r[   rN   r7   r5   <module>r     s   & &  '  5 6 > I , ( A ) $ 2 
    /2JJ  ##&A+K1 - 	h
 	j
 	g
 	h
 	/
 	/+% !8& #7 L #7 ; #7 >% /3.?.?.D.D	L 04/@/@/E/E	N ,044<A" <@;L;L.2d @??" >B=N=N04 8	G	G
L
	D?@ /3.?.?.D.D( 04/@/@/E/Er7   