pyodps-catalog 0.1.1__py3-none-any.whl → 1.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
pyodps_catalog/models.py CHANGED
@@ -1,10 +1,156 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # This file is auto-generated, don't edit it. Thanks.
3
3
  from Tea.model import TeaModel
4
- from typing import List, Dict
4
+ from typing import Dict, List
5
5
 
6
6
 
7
- class PolicyTag(TeaModel):
7
+ class HttpResponse(TeaModel):
8
+ """
9
+ ==================================== Common ====================================\
10
+ """
11
+ def __init__(
12
+ self,
13
+ headers: Dict[str, str] = None,
14
+ status_code: int = None,
15
+ body: str = None,
16
+ ):
17
+ self.headers = headers
18
+ self.status_code = status_code
19
+ self.body = body
20
+
21
+ def validate(self):
22
+ pass
23
+
24
+ def to_map(self):
25
+ _map = super().to_map()
26
+ if _map is not None:
27
+ return _map
28
+
29
+ result = dict()
30
+ if self.headers is not None:
31
+ result['headers'] = self.headers
32
+ if self.status_code is not None:
33
+ result['statusCode'] = self.status_code
34
+ if self.body is not None:
35
+ result['body'] = self.body
36
+ return result
37
+
38
+ def from_map(self, m: dict = None):
39
+ m = m or dict()
40
+ if m.get('headers') is not None:
41
+ self.headers = m.get('headers')
42
+ if m.get('statusCode') is not None:
43
+ self.status_code = m.get('statusCode')
44
+ if m.get('body') is not None:
45
+ self.body = m.get('body')
46
+ return self
47
+
48
+
49
+ class Binding(TeaModel):
50
+ def __init__(
51
+ self,
52
+ role: str = None,
53
+ members: List[str] = None,
54
+ ):
55
+ self.role = role
56
+ self.members = members
57
+
58
+ def validate(self):
59
+ pass
60
+
61
+ def to_map(self):
62
+ _map = super().to_map()
63
+ if _map is not None:
64
+ return _map
65
+
66
+ result = dict()
67
+ if self.role is not None:
68
+ result['role'] = self.role
69
+ if self.members is not None:
70
+ result['members'] = self.members
71
+ return result
72
+
73
+ def from_map(self, m: dict = None):
74
+ m = m or dict()
75
+ if m.get('role') is not None:
76
+ self.role = m.get('role')
77
+ if m.get('members') is not None:
78
+ self.members = m.get('members')
79
+ return self
80
+
81
+
82
+ class Policy(TeaModel):
83
+ def __init__(
84
+ self,
85
+ etag: str = None,
86
+ bindings: List[Binding] = None,
87
+ ):
88
+ self.etag = etag
89
+ self.bindings = bindings
90
+
91
+ def validate(self):
92
+ if self.bindings:
93
+ for k in self.bindings:
94
+ if k:
95
+ k.validate()
96
+
97
+ def to_map(self):
98
+ _map = super().to_map()
99
+ if _map is not None:
100
+ return _map
101
+
102
+ result = dict()
103
+ if self.etag is not None:
104
+ result['etag'] = self.etag
105
+ result['bindings'] = []
106
+ if self.bindings is not None:
107
+ for k in self.bindings:
108
+ result['bindings'].append(k.to_map() if k else None)
109
+ return result
110
+
111
+ def from_map(self, m: dict = None):
112
+ m = m or dict()
113
+ if m.get('etag') is not None:
114
+ self.etag = m.get('etag')
115
+ self.bindings = []
116
+ if m.get('bindings') is not None:
117
+ for k in m.get('bindings'):
118
+ temp_model = Binding()
119
+ self.bindings.append(temp_model.from_map(k))
120
+ return self
121
+
122
+
123
+ class SetPolicyRequest(TeaModel):
124
+ def __init__(
125
+ self,
126
+ policy: Policy = None,
127
+ ):
128
+ # 设置的 Policy。
129
+ self.policy = policy
130
+
131
+ def validate(self):
132
+ if self.policy:
133
+ self.policy.validate()
134
+
135
+ def to_map(self):
136
+ _map = super().to_map()
137
+ if _map is not None:
138
+ return _map
139
+
140
+ result = dict()
141
+ if self.policy is not None:
142
+ result['policy'] = self.policy.to_map()
143
+ return result
144
+
145
+ def from_map(self, m: dict = None):
146
+ m = m or dict()
147
+ if m.get('policy') is not None:
148
+ temp_model = Policy()
149
+ self.policy = temp_model.from_map(m['policy'])
150
+ return self
151
+
152
+
153
+ class PolicyTags(TeaModel):
8
154
  def __init__(
9
155
  self,
10
156
  names: List[str] = None,
@@ -32,6 +178,9 @@ class PolicyTag(TeaModel):
32
178
 
33
179
 
34
180
  class TableFieldSchema(TeaModel):
181
+ """
182
+ ==================================== Table ====================================\
183
+ """
35
184
  def __init__(
36
185
  self,
37
186
  field_name: str = None,
@@ -40,7 +189,7 @@ class TableFieldSchema(TeaModel):
40
189
  mode: str = None,
41
190
  fields: List['TableFieldSchema'] = None,
42
191
  description: str = None,
43
- policy_tags: PolicyTag = None,
192
+ policy_tags: PolicyTags = None,
44
193
  max_length: str = None,
45
194
  precision: str = None,
46
195
  scale: str = None,
@@ -127,7 +276,7 @@ class TableFieldSchema(TeaModel):
127
276
  if m.get('description') is not None:
128
277
  self.description = m.get('description')
129
278
  if m.get('policyTags') is not None:
130
- temp_model = PolicyTag()
279
+ temp_model = PolicyTags()
131
280
  self.policy_tags = temp_model.from_map(m['policyTags'])
132
281
  if m.get('maxLength') is not None:
133
282
  self.max_length = m.get('maxLength')
@@ -431,6 +580,48 @@ class ExpirationOptions(TeaModel):
431
580
  return self
432
581
 
433
582
 
583
+ class ExternalDataConfiguration(TeaModel):
584
+ def __init__(
585
+ self,
586
+ source_uris: List[str] = None,
587
+ source_format: str = None,
588
+ connection: str = None,
589
+ ):
590
+ # 表数据所在的 URI
591
+ self.source_uris = source_uris
592
+ # 支持格式:PAIMON/ICEBERG/ORC/PARQUET/CSV 等
593
+ self.source_format = source_format
594
+ # 关联的 Connection ID
595
+ self.connection = connection
596
+
597
+ def validate(self):
598
+ pass
599
+
600
+ def to_map(self):
601
+ _map = super().to_map()
602
+ if _map is not None:
603
+ return _map
604
+
605
+ result = dict()
606
+ if self.source_uris is not None:
607
+ result['sourceUris'] = self.source_uris
608
+ if self.source_format is not None:
609
+ result['sourceFormat'] = self.source_format
610
+ if self.connection is not None:
611
+ result['connection'] = self.connection
612
+ return result
613
+
614
+ def from_map(self, m: dict = None):
615
+ m = m or dict()
616
+ if m.get('sourceUris') is not None:
617
+ self.source_uris = m.get('sourceUris')
618
+ if m.get('sourceFormat') is not None:
619
+ self.source_format = m.get('sourceFormat')
620
+ if m.get('connection') is not None:
621
+ self.connection = m.get('connection')
622
+ return self
623
+
624
+
434
625
  class Table(TeaModel):
435
626
  def __init__(
436
627
  self,
@@ -450,6 +641,7 @@ class Table(TeaModel):
450
641
  last_modified_time: str = None,
451
642
  expiration_options: ExpirationOptions = None,
452
643
  labels: Dict[str, str] = None,
644
+ external_data_configuration: ExternalDataConfiguration = None,
453
645
  ):
454
646
  # 用于 read-modify-write 一致性校验。
455
647
  self.etag = etag
@@ -483,10 +675,10 @@ class Table(TeaModel):
483
675
  self.expiration_options = expiration_options
484
676
  # 可选。表上的标签。
485
677
  self.labels = labels
678
+ # 外部表配置
679
+ self.external_data_configuration = external_data_configuration
486
680
 
487
681
  def validate(self):
488
- self.validate_required(self.project_id, 'project_id')
489
- self.validate_required(self.table_name, 'table_name')
490
682
  if self.table_schema:
491
683
  self.table_schema.validate()
492
684
  if self.clustering:
@@ -499,6 +691,8 @@ class Table(TeaModel):
499
691
  self.table_format_definition.validate()
500
692
  if self.expiration_options:
501
693
  self.expiration_options.validate()
694
+ if self.external_data_configuration:
695
+ self.external_data_configuration.validate()
502
696
 
503
697
  def to_map(self):
504
698
  _map = super().to_map()
@@ -538,6 +732,8 @@ class Table(TeaModel):
538
732
  result['expirationOptions'] = self.expiration_options.to_map()
539
733
  if self.labels is not None:
540
734
  result['labels'] = self.labels
735
+ if self.external_data_configuration is not None:
736
+ result['externalDataConfiguration'] = self.external_data_configuration.to_map()
541
737
  return result
542
738
 
543
739
  def from_map(self, m: dict = None):
@@ -580,19 +776,63 @@ class Table(TeaModel):
580
776
  self.expiration_options = temp_model.from_map(m['expirationOptions'])
581
777
  if m.get('labels') is not None:
582
778
  self.labels = m.get('labels')
779
+ if m.get('externalDataConfiguration') is not None:
780
+ temp_model = ExternalDataConfiguration()
781
+ self.external_data_configuration = temp_model.from_map(m['externalDataConfiguration'])
583
782
  return self
584
783
 
585
784
 
586
- class HttpResponse(TeaModel):
785
+ class ListTablesResponse(TeaModel):
587
786
  def __init__(
588
787
  self,
589
- headers: Dict[str, str] = None,
590
- status_code: int = None,
591
- body: str = None,
788
+ tables: List[Table] = None,
789
+ next_page_token: str = None,
592
790
  ):
593
- self.headers = headers
594
- self.status_code = status_code
595
- self.body = body
791
+ self.tables = tables
792
+ self.next_page_token = next_page_token
793
+
794
+ def validate(self):
795
+ if self.tables:
796
+ for k in self.tables:
797
+ if k:
798
+ k.validate()
799
+
800
+ def to_map(self):
801
+ _map = super().to_map()
802
+ if _map is not None:
803
+ return _map
804
+
805
+ result = dict()
806
+ result['tables'] = []
807
+ if self.tables is not None:
808
+ for k in self.tables:
809
+ result['tables'].append(k.to_map() if k else None)
810
+ if self.next_page_token is not None:
811
+ result['nextPageToken'] = self.next_page_token
812
+ return result
813
+
814
+ def from_map(self, m: dict = None):
815
+ m = m or dict()
816
+ self.tables = []
817
+ if m.get('tables') is not None:
818
+ for k in m.get('tables'):
819
+ temp_model = Table()
820
+ self.tables.append(temp_model.from_map(k))
821
+ if m.get('nextPageToken') is not None:
822
+ self.next_page_token = m.get('nextPageToken')
823
+ return self
824
+
825
+
826
+ class CloudResourceOptions(TeaModel):
827
+ def __init__(
828
+ self,
829
+ delegated_account: str = None,
830
+ ram_role_arn: str = None,
831
+ ):
832
+ # 被委托的账号名。在创建 connection 时自动保存为创建者的账号。
833
+ self.delegated_account = delegated_account
834
+ # 授权给 MaxCompute 服务扮演的 RAM 角色 ARN。
835
+ self.ram_role_arn = ram_role_arn
596
836
 
597
837
  def validate(self):
598
838
  pass
@@ -603,22 +843,1862 @@ class HttpResponse(TeaModel):
603
843
  return _map
604
844
 
605
845
  result = dict()
606
- if self.headers is not None:
607
- result['headers'] = self.headers
608
- if self.status_code is not None:
609
- result['statusCode'] = self.status_code
610
- if self.body is not None:
611
- result['body'] = self.body
846
+ if self.delegated_account is not None:
847
+ result['delegatedAccount'] = self.delegated_account
848
+ if self.ram_role_arn is not None:
849
+ result['ramRoleArn'] = self.ram_role_arn
612
850
  return result
613
851
 
614
852
  def from_map(self, m: dict = None):
615
853
  m = m or dict()
616
- if m.get('headers') is not None:
617
- self.headers = m.get('headers')
618
- if m.get('statusCode') is not None:
619
- self.status_code = m.get('statusCode')
620
- if m.get('body') is not None:
621
- self.body = m.get('body')
854
+ if m.get('delegatedAccount') is not None:
855
+ self.delegated_account = m.get('delegatedAccount')
856
+ if m.get('ramRoleArn') is not None:
857
+ self.ram_role_arn = m.get('ramRoleArn')
858
+ return self
859
+
860
+
861
+ class Connection(TeaModel):
862
+ """
863
+ ==================================== Connection ====================================\
864
+ """
865
+ def __init__(
866
+ self,
867
+ name: str = None,
868
+ connection_name: str = None,
869
+ description: str = None,
870
+ creation_time: str = None,
871
+ last_modified_time: str = None,
872
+ connection_type: str = None,
873
+ cloud_resource: CloudResourceOptions = None,
874
+ region: str = None,
875
+ ):
876
+ # 资源全局唯一名:namespaces/{namespace_ID}/connections/{connectionName}
877
+ self.name = name
878
+ # namespace 内唯一。大小写敏感。包含字符:[a-z][A-Z][0-9]_,字节数范围 [3, 32]。
879
+ self.connection_name = connection_name
880
+ # 可选。最多 1KB。
881
+ self.description = description
882
+ # Connection 的创建时间(毫秒)
883
+ self.creation_time = creation_time
884
+ # 最后修改时间(毫秒)
885
+ self.last_modified_time = last_modified_time
886
+ # Connection 的类型。必需项。
887
+ self.connection_type = connection_type
888
+ # 云上资源类型的 connection 对应的选项配置。仅当 connectionType 为 CLOUD_RESOURCE 时才设置。
889
+ self.cloud_resource = cloud_resource
890
+ # 此 connection 所属的 region。
891
+ self.region = region
892
+
893
+ def validate(self):
894
+ if self.cloud_resource:
895
+ self.cloud_resource.validate()
896
+
897
+ def to_map(self):
898
+ _map = super().to_map()
899
+ if _map is not None:
900
+ return _map
901
+
902
+ result = dict()
903
+ if self.name is not None:
904
+ result['name'] = self.name
905
+ if self.connection_name is not None:
906
+ result['connectionName'] = self.connection_name
907
+ if self.description is not None:
908
+ result['description'] = self.description
909
+ if self.creation_time is not None:
910
+ result['creationTime'] = self.creation_time
911
+ if self.last_modified_time is not None:
912
+ result['lastModifiedTime'] = self.last_modified_time
913
+ if self.connection_type is not None:
914
+ result['connectionType'] = self.connection_type
915
+ if self.cloud_resource is not None:
916
+ result['cloudResource'] = self.cloud_resource.to_map()
917
+ if self.region is not None:
918
+ result['region'] = self.region
919
+ return result
920
+
921
+ def from_map(self, m: dict = None):
922
+ m = m or dict()
923
+ if m.get('name') is not None:
924
+ self.name = m.get('name')
925
+ if m.get('connectionName') is not None:
926
+ self.connection_name = m.get('connectionName')
927
+ if m.get('description') is not None:
928
+ self.description = m.get('description')
929
+ if m.get('creationTime') is not None:
930
+ self.creation_time = m.get('creationTime')
931
+ if m.get('lastModifiedTime') is not None:
932
+ self.last_modified_time = m.get('lastModifiedTime')
933
+ if m.get('connectionType') is not None:
934
+ self.connection_type = m.get('connectionType')
935
+ if m.get('cloudResource') is not None:
936
+ temp_model = CloudResourceOptions()
937
+ self.cloud_resource = temp_model.from_map(m['cloudResource'])
938
+ if m.get('region') is not None:
939
+ self.region = m.get('region')
940
+ return self
941
+
942
+
943
+ class ListConnectionsResponse(TeaModel):
944
+ def __init__(
945
+ self,
946
+ connections: List[Connection] = None,
947
+ next_page_token: str = None,
948
+ ):
949
+ self.connections = connections
950
+ self.next_page_token = next_page_token
951
+
952
+ def validate(self):
953
+ if self.connections:
954
+ for k in self.connections:
955
+ if k:
956
+ k.validate()
957
+
958
+ def to_map(self):
959
+ _map = super().to_map()
960
+ if _map is not None:
961
+ return _map
962
+
963
+ result = dict()
964
+ result['connections'] = []
965
+ if self.connections is not None:
966
+ for k in self.connections:
967
+ result['connections'].append(k.to_map() if k else None)
968
+ if self.next_page_token is not None:
969
+ result['nextPageToken'] = self.next_page_token
970
+ return result
971
+
972
+ def from_map(self, m: dict = None):
973
+ m = m or dict()
974
+ self.connections = []
975
+ if m.get('connections') is not None:
976
+ for k in m.get('connections'):
977
+ temp_model = Connection()
978
+ self.connections.append(temp_model.from_map(k))
979
+ if m.get('nextPageToken') is not None:
980
+ self.next_page_token = m.get('nextPageToken')
981
+ return self
982
+
983
+
984
+ class Role(TeaModel):
985
+ """
986
+ ==================================== Role ====================================\
987
+ """
988
+ def __init__(
989
+ self,
990
+ name: str = None,
991
+ role_name: str = None,
992
+ description: str = None,
993
+ included_permissions: List[str] = None,
994
+ etag: str = None,
995
+ deleted: bool = None,
996
+ ):
997
+ # 资源全局唯一名。e.g., namespaces/{namespace_ID}/roles/{roleName}
998
+ self.name = name
999
+ # namespace 内唯一。大小写敏感。包含字符:[a-z][A-Z][0-9]_,字节数范围 [3, 255]。
1000
+ self.role_name = role_name
1001
+ # 可选。最多 1KB。
1002
+ self.description = description
1003
+ # Role 包含的权限。
1004
+ self.included_permissions = included_permissions
1005
+ # 用于一致性校验。
1006
+ self.etag = etag
1007
+ # 表示是否被删除。
1008
+ self.deleted = deleted
1009
+ # ListRolesResponse model
1010
+
1011
+ def validate(self):
1012
+ pass
1013
+
1014
+ def to_map(self):
1015
+ _map = super().to_map()
1016
+ if _map is not None:
1017
+ return _map
1018
+
1019
+ result = dict()
1020
+ if self.name is not None:
1021
+ result['name'] = self.name
1022
+ if self.role_name is not None:
1023
+ result['roleName'] = self.role_name
1024
+ if self.description is not None:
1025
+ result['description'] = self.description
1026
+ if self.included_permissions is not None:
1027
+ result['includedPermissions'] = self.included_permissions
1028
+ if self.etag is not None:
1029
+ result['etag'] = self.etag
1030
+ if self.deleted is not None:
1031
+ result['deleted'] = self.deleted
1032
+ return result
1033
+
1034
+ def from_map(self, m: dict = None):
1035
+ m = m or dict()
1036
+ if m.get('name') is not None:
1037
+ self.name = m.get('name')
1038
+ if m.get('roleName') is not None:
1039
+ self.role_name = m.get('roleName')
1040
+ if m.get('description') is not None:
1041
+ self.description = m.get('description')
1042
+ if m.get('includedPermissions') is not None:
1043
+ self.included_permissions = m.get('includedPermissions')
1044
+ if m.get('etag') is not None:
1045
+ self.etag = m.get('etag')
1046
+ if m.get('deleted') is not None:
1047
+ self.deleted = m.get('deleted')
1048
+ return self
1049
+
1050
+
1051
+ class ListRolesResponse(TeaModel):
1052
+ def __init__(
1053
+ self,
1054
+ roles: List[Role] = None,
1055
+ next_page_token: str = None,
1056
+ ):
1057
+ # 角色列表。
1058
+ self.roles = roles
1059
+ # 下一页的token。
1060
+ self.next_page_token = next_page_token
1061
+ # Path generation helper
1062
+
1063
+ def validate(self):
1064
+ if self.roles:
1065
+ for k in self.roles:
1066
+ if k:
1067
+ k.validate()
1068
+
1069
+ def to_map(self):
1070
+ _map = super().to_map()
1071
+ if _map is not None:
1072
+ return _map
1073
+
1074
+ result = dict()
1075
+ result['roles'] = []
1076
+ if self.roles is not None:
1077
+ for k in self.roles:
1078
+ result['roles'].append(k.to_map() if k else None)
1079
+ if self.next_page_token is not None:
1080
+ result['nextPageToken'] = self.next_page_token
1081
+ return result
1082
+
1083
+ def from_map(self, m: dict = None):
1084
+ m = m or dict()
1085
+ self.roles = []
1086
+ if m.get('roles') is not None:
1087
+ for k in m.get('roles'):
1088
+ temp_model = Role()
1089
+ self.roles.append(temp_model.from_map(k))
1090
+ if m.get('nextPageToken') is not None:
1091
+ self.next_page_token = m.get('nextPageToken')
1092
+ return self
1093
+
1094
+
1095
+ class Taxonomy(TeaModel):
1096
+ """
1097
+ ==================================== Taxonomy ====================================\
1098
+ """
1099
+ def __init__(
1100
+ self,
1101
+ name: str = None,
1102
+ taxonomy_name: str = None,
1103
+ description: str = None,
1104
+ activated_policy_types: List[str] = None,
1105
+ policy_tag_count: int = None,
1106
+ create_time: str = None,
1107
+ last_modified_time: str = None,
1108
+ ):
1109
+ # 资源全局唯一名。e.g., namespaces/{namespace_ID}/taxonomies/{ID}
1110
+ self.name = name
1111
+ # namespace 内唯一。大小写敏感。包含字符:[a-z][A-Z][0-9]_,字节数范围 [3, 255]。
1112
+ self.taxonomy_name = taxonomy_name
1113
+ # 可选。最多 1KB。
1114
+ self.description = description
1115
+ # Taxonomy 下开启的 policy 类型列表,默认为 POLICY_TYPE_UNSPECIFIED
1116
+ self.activated_policy_types = activated_policy_types
1117
+ # 此 Taxonomy 内 policy tag 的个数。
1118
+ self.policy_tag_count = policy_tag_count
1119
+ # Taxonomy 的创建时间戳(毫秒)。仅输出。
1120
+ self.create_time = create_time
1121
+ # Taxonomy 的最后修改时间戳(毫秒)。仅输出。
1122
+ self.last_modified_time = last_modified_time
1123
+ # PolicyTag model
1124
+
1125
+ def validate(self):
1126
+ pass
1127
+
1128
+ def to_map(self):
1129
+ _map = super().to_map()
1130
+ if _map is not None:
1131
+ return _map
1132
+
1133
+ result = dict()
1134
+ if self.name is not None:
1135
+ result['name'] = self.name
1136
+ if self.taxonomy_name is not None:
1137
+ result['taxonomyName'] = self.taxonomy_name
1138
+ if self.description is not None:
1139
+ result['description'] = self.description
1140
+ if self.activated_policy_types is not None:
1141
+ result['activatedPolicyTypes'] = self.activated_policy_types
1142
+ if self.policy_tag_count is not None:
1143
+ result['policyTagCount'] = self.policy_tag_count
1144
+ if self.create_time is not None:
1145
+ result['createTime'] = self.create_time
1146
+ if self.last_modified_time is not None:
1147
+ result['lastModifiedTime'] = self.last_modified_time
1148
+ return result
1149
+
1150
+ def from_map(self, m: dict = None):
1151
+ m = m or dict()
1152
+ if m.get('name') is not None:
1153
+ self.name = m.get('name')
1154
+ if m.get('taxonomyName') is not None:
1155
+ self.taxonomy_name = m.get('taxonomyName')
1156
+ if m.get('description') is not None:
1157
+ self.description = m.get('description')
1158
+ if m.get('activatedPolicyTypes') is not None:
1159
+ self.activated_policy_types = m.get('activatedPolicyTypes')
1160
+ if m.get('policyTagCount') is not None:
1161
+ self.policy_tag_count = m.get('policyTagCount')
1162
+ if m.get('createTime') is not None:
1163
+ self.create_time = m.get('createTime')
1164
+ if m.get('lastModifiedTime') is not None:
1165
+ self.last_modified_time = m.get('lastModifiedTime')
1166
+ return self
1167
+
1168
+
1169
+ class PolicyTag(TeaModel):
1170
+ def __init__(
1171
+ self,
1172
+ name: str = None,
1173
+ policy_tag_name: str = None,
1174
+ description: str = None,
1175
+ parent_policy_tag: str = None,
1176
+ child_policy_tags: List[str] = None,
1177
+ ):
1178
+ # PolicyTag的完整路径。e.g., namespaces/{namespace_ID}/taxonomies/{TID}/policyTags/{ID}
1179
+ self.name = name
1180
+ # 父 Taxonomy 内唯一。大小写敏感。包含字符:[a-z][A-Z][0-9]_,字节数范围 [3, 255]。
1181
+ self.policy_tag_name = policy_tag_name
1182
+ # 可选。最多 1KB。
1183
+ self.description = description
1184
+ # 父节点的name。空代表根节点。
1185
+ self.parent_policy_tag = parent_policy_tag
1186
+ # 子节点的name列表。仅输出。
1187
+ self.child_policy_tags = child_policy_tags
1188
+ # List responses
1189
+
1190
+ def validate(self):
1191
+ pass
1192
+
1193
+ def to_map(self):
1194
+ _map = super().to_map()
1195
+ if _map is not None:
1196
+ return _map
1197
+
1198
+ result = dict()
1199
+ if self.name is not None:
1200
+ result['name'] = self.name
1201
+ if self.policy_tag_name is not None:
1202
+ result['policyTagName'] = self.policy_tag_name
1203
+ if self.description is not None:
1204
+ result['description'] = self.description
1205
+ if self.parent_policy_tag is not None:
1206
+ result['parentPolicyTag'] = self.parent_policy_tag
1207
+ if self.child_policy_tags is not None:
1208
+ result['childPolicyTags'] = self.child_policy_tags
1209
+ return result
1210
+
1211
+ def from_map(self, m: dict = None):
1212
+ m = m or dict()
1213
+ if m.get('name') is not None:
1214
+ self.name = m.get('name')
1215
+ if m.get('policyTagName') is not None:
1216
+ self.policy_tag_name = m.get('policyTagName')
1217
+ if m.get('description') is not None:
1218
+ self.description = m.get('description')
1219
+ if m.get('parentPolicyTag') is not None:
1220
+ self.parent_policy_tag = m.get('parentPolicyTag')
1221
+ if m.get('childPolicyTags') is not None:
1222
+ self.child_policy_tags = m.get('childPolicyTags')
1223
+ return self
1224
+
1225
+
1226
+ class ListTaxonomiesResponse(TeaModel):
1227
+ def __init__(
1228
+ self,
1229
+ taxonomies: List[Taxonomy] = None,
1230
+ next_page_token: str = None,
1231
+ ):
1232
+ # Taxonomy列表。
1233
+ self.taxonomies = taxonomies
1234
+ # 下一页的token。
1235
+ self.next_page_token = next_page_token
1236
+
1237
+ def validate(self):
1238
+ if self.taxonomies:
1239
+ for k in self.taxonomies:
1240
+ if k:
1241
+ k.validate()
1242
+
1243
+ def to_map(self):
1244
+ _map = super().to_map()
1245
+ if _map is not None:
1246
+ return _map
1247
+
1248
+ result = dict()
1249
+ result['taxonomies'] = []
1250
+ if self.taxonomies is not None:
1251
+ for k in self.taxonomies:
1252
+ result['taxonomies'].append(k.to_map() if k else None)
1253
+ if self.next_page_token is not None:
1254
+ result['nextPageToken'] = self.next_page_token
1255
+ return result
1256
+
1257
+ def from_map(self, m: dict = None):
1258
+ m = m or dict()
1259
+ self.taxonomies = []
1260
+ if m.get('taxonomies') is not None:
1261
+ for k in m.get('taxonomies'):
1262
+ temp_model = Taxonomy()
1263
+ self.taxonomies.append(temp_model.from_map(k))
1264
+ if m.get('nextPageToken') is not None:
1265
+ self.next_page_token = m.get('nextPageToken')
1266
+ return self
1267
+
1268
+
1269
+ class ListPolicyTagsResponse(TeaModel):
1270
+ def __init__(
1271
+ self,
1272
+ policy_tags: List[PolicyTag] = None,
1273
+ next_page_token: str = None,
1274
+ ):
1275
+ # PolicyTag列表。
1276
+ self.policy_tags = policy_tags
1277
+ # 下一页的token。
1278
+ self.next_page_token = next_page_token
1279
+ # Path generation helpers
1280
+
1281
+ def validate(self):
1282
+ if self.policy_tags:
1283
+ for k in self.policy_tags:
1284
+ if k:
1285
+ k.validate()
1286
+
1287
+ def to_map(self):
1288
+ _map = super().to_map()
1289
+ if _map is not None:
1290
+ return _map
1291
+
1292
+ result = dict()
1293
+ result['policyTags'] = []
1294
+ if self.policy_tags is not None:
1295
+ for k in self.policy_tags:
1296
+ result['policyTags'].append(k.to_map() if k else None)
1297
+ if self.next_page_token is not None:
1298
+ result['nextPageToken'] = self.next_page_token
1299
+ return result
1300
+
1301
+ def from_map(self, m: dict = None):
1302
+ m = m or dict()
1303
+ self.policy_tags = []
1304
+ if m.get('policyTags') is not None:
1305
+ for k in m.get('policyTags'):
1306
+ temp_model = PolicyTag()
1307
+ self.policy_tags.append(temp_model.from_map(k))
1308
+ if m.get('nextPageToken') is not None:
1309
+ self.next_page_token = m.get('nextPageToken')
1310
+ return self
1311
+
1312
+
1313
+ class DataMaskingPolicy(TeaModel):
1314
+ def __init__(
1315
+ self,
1316
+ predefined_expression: str = None,
1317
+ parameters: List[str] = None,
1318
+ ):
1319
+ # 预定义脱敏策略的类型。
1320
+ self.predefined_expression = predefined_expression
1321
+ # 预定义脱敏策略的参数。
1322
+ self.parameters = parameters
1323
+
1324
+ def validate(self):
1325
+ pass
1326
+
1327
+ def to_map(self):
1328
+ _map = super().to_map()
1329
+ if _map is not None:
1330
+ return _map
1331
+
1332
+ result = dict()
1333
+ if self.predefined_expression is not None:
1334
+ result['predefinedExpression'] = self.predefined_expression
1335
+ if self.parameters is not None:
1336
+ result['parameters'] = self.parameters
1337
+ return result
1338
+
1339
+ def from_map(self, m: dict = None):
1340
+ m = m or dict()
1341
+ if m.get('predefinedExpression') is not None:
1342
+ self.predefined_expression = m.get('predefinedExpression')
1343
+ if m.get('parameters') is not None:
1344
+ self.parameters = m.get('parameters')
1345
+ return self
1346
+
1347
+
1348
+ class DataPolicy(TeaModel):
1349
+ """
1350
+ ==================================== DataPolicy ====================================\
1351
+ """
1352
+ def __init__(
1353
+ self,
1354
+ name: str = None,
1355
+ data_policy_name: str = None,
1356
+ policy_tag: str = None,
1357
+ data_policy_type: str = None,
1358
+ data_masking_policy: DataMaskingPolicy = None,
1359
+ ):
1360
+ # namespaces/{namespace_ID}/dataPolicies/{dataPolicyName}。仅输出。
1361
+ self.name = name
1362
+ # 用户指定的 data policy 名,在账号级唯一。
1363
+ self.data_policy_name = data_policy_name
1364
+ # Data policy 绑定的 policy tag 资源全名。
1365
+ self.policy_tag = policy_tag
1366
+ # data policy 的类型,目前仅支持 DATA_MASKING_POLICY 类型。
1367
+ self.data_policy_type = data_policy_type
1368
+ # Data policy 上定义的脱敏规则。
1369
+ self.data_masking_policy = data_masking_policy
1370
+
1371
+ def validate(self):
1372
+ if self.data_masking_policy:
1373
+ self.data_masking_policy.validate()
1374
+
1375
+ def to_map(self):
1376
+ _map = super().to_map()
1377
+ if _map is not None:
1378
+ return _map
1379
+
1380
+ result = dict()
1381
+ if self.name is not None:
1382
+ result['name'] = self.name
1383
+ if self.data_policy_name is not None:
1384
+ result['dataPolicyName'] = self.data_policy_name
1385
+ if self.policy_tag is not None:
1386
+ result['policyTag'] = self.policy_tag
1387
+ if self.data_policy_type is not None:
1388
+ result['dataPolicyType'] = self.data_policy_type
1389
+ if self.data_masking_policy is not None:
1390
+ result['dataMaskingPolicy'] = self.data_masking_policy.to_map()
1391
+ return result
1392
+
1393
+ def from_map(self, m: dict = None):
1394
+ m = m or dict()
1395
+ if m.get('name') is not None:
1396
+ self.name = m.get('name')
1397
+ if m.get('dataPolicyName') is not None:
1398
+ self.data_policy_name = m.get('dataPolicyName')
1399
+ if m.get('policyTag') is not None:
1400
+ self.policy_tag = m.get('policyTag')
1401
+ if m.get('dataPolicyType') is not None:
1402
+ self.data_policy_type = m.get('dataPolicyType')
1403
+ if m.get('dataMaskingPolicy') is not None:
1404
+ temp_model = DataMaskingPolicy()
1405
+ self.data_masking_policy = temp_model.from_map(m['dataMaskingPolicy'])
1406
+ return self
1407
+
1408
+
1409
+ class ListDataPoliciesResponse(TeaModel):
1410
+ def __init__(
1411
+ self,
1412
+ data_policies: List[DataPolicy] = None,
1413
+ next_page_token: str = None,
1414
+ ):
1415
+ self.data_policies = data_policies
1416
+ # 分页标记。
1417
+ self.next_page_token = next_page_token
1418
+
1419
+ def validate(self):
1420
+ if self.data_policies:
1421
+ for k in self.data_policies:
1422
+ if k:
1423
+ k.validate()
1424
+
1425
+ def to_map(self):
1426
+ _map = super().to_map()
1427
+ if _map is not None:
1428
+ return _map
1429
+
1430
+ result = dict()
1431
+ result['dataPolicies'] = []
1432
+ if self.data_policies is not None:
1433
+ for k in self.data_policies:
1434
+ result['dataPolicies'].append(k.to_map() if k else None)
1435
+ if self.next_page_token is not None:
1436
+ result['nextPageToken'] = self.next_page_token
1437
+ return result
1438
+
1439
+ def from_map(self, m: dict = None):
1440
+ m = m or dict()
1441
+ self.data_policies = []
1442
+ if m.get('dataPolicies') is not None:
1443
+ for k in m.get('dataPolicies'):
1444
+ temp_model = DataPolicy()
1445
+ self.data_policies.append(temp_model.from_map(k))
1446
+ if m.get('nextPageToken') is not None:
1447
+ self.next_page_token = m.get('nextPageToken')
1448
+ return self
1449
+
1450
+
1451
+ class Project(TeaModel):
1452
+ """
1453
+ ==================================== Project/Schema ====================================\
1454
+ """
1455
+ def __init__(
1456
+ self,
1457
+ name: str = None,
1458
+ project_id: str = None,
1459
+ owner: str = None,
1460
+ description: str = None,
1461
+ create_time: str = None,
1462
+ last_modified_time: str = None,
1463
+ schema_enabled: bool = None,
1464
+ region: str = None,
1465
+ ):
1466
+ # Project的资源全名:projects/{projectId}。仅输出。
1467
+ self.name = name
1468
+ # Project唯一ID
1469
+ self.project_id = project_id
1470
+ # Project的拥有者
1471
+ self.owner = owner
1472
+ # Project描述
1473
+ self.description = description
1474
+ # 创建时间戳(UTC毫秒)
1475
+ self.create_time = create_time
1476
+ # 最后修改时间戳(UTC毫秒)
1477
+ self.last_modified_time = last_modified_time
1478
+ # 是否开启三层模型
1479
+ self.schema_enabled = schema_enabled
1480
+ # 所属region
1481
+ self.region = region
1482
+
1483
+ def validate(self):
1484
+ pass
1485
+
1486
+ def to_map(self):
1487
+ _map = super().to_map()
1488
+ if _map is not None:
1489
+ return _map
1490
+
1491
+ result = dict()
1492
+ if self.name is not None:
1493
+ result['name'] = self.name
1494
+ if self.project_id is not None:
1495
+ result['projectId'] = self.project_id
1496
+ if self.owner is not None:
1497
+ result['owner'] = self.owner
1498
+ if self.description is not None:
1499
+ result['description'] = self.description
1500
+ if self.create_time is not None:
1501
+ result['createTime'] = self.create_time
1502
+ if self.last_modified_time is not None:
1503
+ result['lastModifiedTime'] = self.last_modified_time
1504
+ if self.schema_enabled is not None:
1505
+ result['schemaEnabled'] = self.schema_enabled
1506
+ if self.region is not None:
1507
+ result['region'] = self.region
1508
+ return result
1509
+
1510
+ def from_map(self, m: dict = None):
1511
+ m = m or dict()
1512
+ if m.get('name') is not None:
1513
+ self.name = m.get('name')
1514
+ if m.get('projectId') is not None:
1515
+ self.project_id = m.get('projectId')
1516
+ if m.get('owner') is not None:
1517
+ self.owner = m.get('owner')
1518
+ if m.get('description') is not None:
1519
+ self.description = m.get('description')
1520
+ if m.get('createTime') is not None:
1521
+ self.create_time = m.get('createTime')
1522
+ if m.get('lastModifiedTime') is not None:
1523
+ self.last_modified_time = m.get('lastModifiedTime')
1524
+ if m.get('schemaEnabled') is not None:
1525
+ self.schema_enabled = m.get('schemaEnabled')
1526
+ if m.get('region') is not None:
1527
+ self.region = m.get('region')
1528
+ return self
1529
+
1530
+
1531
+ class ExternalCatalogSchemaOptions(TeaModel):
1532
+ def __init__(
1533
+ self,
1534
+ parameters: Dict[str, str] = None,
1535
+ ):
1536
+ # 外部schema属性配置
1537
+ self.parameters = parameters
1538
+
1539
+ def validate(self):
1540
+ pass
1541
+
1542
+ def to_map(self):
1543
+ _map = super().to_map()
1544
+ if _map is not None:
1545
+ return _map
1546
+
1547
+ result = dict()
1548
+ if self.parameters is not None:
1549
+ result['parameters'] = self.parameters
1550
+ return result
1551
+
1552
+ def from_map(self, m: dict = None):
1553
+ m = m or dict()
1554
+ if m.get('parameters') is not None:
1555
+ self.parameters = m.get('parameters')
1556
+ return self
1557
+
1558
+
1559
+ class ExternalSchemaConfiguration(TeaModel):
1560
+ def __init__(
1561
+ self,
1562
+ connection: str = None,
1563
+ external_catalog_schema_options: ExternalCatalogSchemaOptions = None,
1564
+ ):
1565
+ # 关联的connection ID
1566
+ self.connection = connection
1567
+ # 外部catalog schema配置
1568
+ self.external_catalog_schema_options = external_catalog_schema_options
1569
+
1570
+ def validate(self):
1571
+ if self.external_catalog_schema_options:
1572
+ self.external_catalog_schema_options.validate()
1573
+
1574
+ def to_map(self):
1575
+ _map = super().to_map()
1576
+ if _map is not None:
1577
+ return _map
1578
+
1579
+ result = dict()
1580
+ if self.connection is not None:
1581
+ result['connection'] = self.connection
1582
+ if self.external_catalog_schema_options is not None:
1583
+ result['externalCatalogSchemaOptions'] = self.external_catalog_schema_options.to_map()
1584
+ return result
1585
+
1586
+ def from_map(self, m: dict = None):
1587
+ m = m or dict()
1588
+ if m.get('connection') is not None:
1589
+ self.connection = m.get('connection')
1590
+ if m.get('externalCatalogSchemaOptions') is not None:
1591
+ temp_model = ExternalCatalogSchemaOptions()
1592
+ self.external_catalog_schema_options = temp_model.from_map(m['externalCatalogSchemaOptions'])
1593
+ return self
1594
+
1595
+
1596
+ class Schema(TeaModel):
1597
+ def __init__(
1598
+ self,
1599
+ name: str = None,
1600
+ schema_name: str = None,
1601
+ description: str = None,
1602
+ type: str = None,
1603
+ owner: str = None,
1604
+ external_schema_configuration: ExternalSchemaConfiguration = None,
1605
+ ):
1606
+ # Schema的资源全名:projects/{projectId}/schemas/{schemaName}。仅输出。
1607
+ self.name = name
1608
+ # Project下唯一名称
1609
+ self.schema_name = schema_name
1610
+ # 可选描述,不超过xxKB
1611
+ self.description = description
1612
+ # Schema类型:DEFAULT/EXTERNAL
1613
+ self.type = type
1614
+ # Schema拥有者
1615
+ self.owner = owner
1616
+ # 外部schema配置
1617
+ self.external_schema_configuration = external_schema_configuration
1618
+
1619
+ def validate(self):
1620
+ if self.schema_name is not None:
1621
+ self.validate_max_length(self.schema_name, 'schema_name', 128)
1622
+ if self.external_schema_configuration:
1623
+ self.external_schema_configuration.validate()
1624
+
1625
+ def to_map(self):
1626
+ _map = super().to_map()
1627
+ if _map is not None:
1628
+ return _map
1629
+
1630
+ result = dict()
1631
+ if self.name is not None:
1632
+ result['name'] = self.name
1633
+ if self.schema_name is not None:
1634
+ result['schemaName'] = self.schema_name
1635
+ if self.description is not None:
1636
+ result['description'] = self.description
1637
+ if self.type is not None:
1638
+ result['type'] = self.type
1639
+ if self.owner is not None:
1640
+ result['owner'] = self.owner
1641
+ if self.external_schema_configuration is not None:
1642
+ result['externalSchemaConfiguration'] = self.external_schema_configuration.to_map()
1643
+ return result
1644
+
1645
+ def from_map(self, m: dict = None):
1646
+ m = m or dict()
1647
+ if m.get('name') is not None:
1648
+ self.name = m.get('name')
1649
+ if m.get('schemaName') is not None:
1650
+ self.schema_name = m.get('schemaName')
1651
+ if m.get('description') is not None:
1652
+ self.description = m.get('description')
1653
+ if m.get('type') is not None:
1654
+ self.type = m.get('type')
1655
+ if m.get('owner') is not None:
1656
+ self.owner = m.get('owner')
1657
+ if m.get('externalSchemaConfiguration') is not None:
1658
+ temp_model = ExternalSchemaConfiguration()
1659
+ self.external_schema_configuration = temp_model.from_map(m['externalSchemaConfiguration'])
1660
+ return self
1661
+
1662
+
1663
+ class ListProjectsResponse(TeaModel):
1664
+ def __init__(
1665
+ self,
1666
+ projects: List[Project] = None,
1667
+ next_page_token: str = None,
1668
+ ):
1669
+ self.projects = projects
1670
+ self.next_page_token = next_page_token
1671
+
1672
+ def validate(self):
1673
+ if self.projects:
1674
+ for k in self.projects:
1675
+ if k:
1676
+ k.validate()
1677
+
1678
+ def to_map(self):
1679
+ _map = super().to_map()
1680
+ if _map is not None:
1681
+ return _map
1682
+
1683
+ result = dict()
1684
+ result['projects'] = []
1685
+ if self.projects is not None:
1686
+ for k in self.projects:
1687
+ result['projects'].append(k.to_map() if k else None)
1688
+ if self.next_page_token is not None:
1689
+ result['nextPageToken'] = self.next_page_token
1690
+ return result
1691
+
1692
+ def from_map(self, m: dict = None):
1693
+ m = m or dict()
1694
+ self.projects = []
1695
+ if m.get('projects') is not None:
1696
+ for k in m.get('projects'):
1697
+ temp_model = Project()
1698
+ self.projects.append(temp_model.from_map(k))
1699
+ if m.get('nextPageToken') is not None:
1700
+ self.next_page_token = m.get('nextPageToken')
1701
+ return self
1702
+
1703
+
1704
+ class ListSchemasResponse(TeaModel):
1705
+ def __init__(
1706
+ self,
1707
+ schemas: List[Schema] = None,
1708
+ next_page_token: str = None,
1709
+ ):
1710
+ self.schemas = schemas
1711
+ self.next_page_token = next_page_token
1712
+ # Paths
1713
+
1714
+ def validate(self):
1715
+ if self.schemas:
1716
+ for k in self.schemas:
1717
+ if k:
1718
+ k.validate()
1719
+
1720
+ def to_map(self):
1721
+ _map = super().to_map()
1722
+ if _map is not None:
1723
+ return _map
1724
+
1725
+ result = dict()
1726
+ result['schemas'] = []
1727
+ if self.schemas is not None:
1728
+ for k in self.schemas:
1729
+ result['schemas'].append(k.to_map() if k else None)
1730
+ if self.next_page_token is not None:
1731
+ result['nextPageToken'] = self.next_page_token
1732
+ return result
1733
+
1734
+ def from_map(self, m: dict = None):
1735
+ m = m or dict()
1736
+ self.schemas = []
1737
+ if m.get('schemas') is not None:
1738
+ for k in m.get('schemas'):
1739
+ temp_model = Schema()
1740
+ self.schemas.append(temp_model.from_map(k))
1741
+ if m.get('nextPageToken') is not None:
1742
+ self.next_page_token = m.get('nextPageToken')
1743
+ return self
1744
+
1745
+
1746
+ class Partition(TeaModel):
1747
+ """
1748
+ ==================================== Partition ====================================\
1749
+ """
1750
+ def __init__(
1751
+ self,
1752
+ spec: str = None,
1753
+ ):
1754
+ # 分区spec,格式样例为 bu=tt/ds=20250515
1755
+ self.spec = spec
1756
+
1757
+ def validate(self):
1758
+ pass
1759
+
1760
+ def to_map(self):
1761
+ _map = super().to_map()
1762
+ if _map is not None:
1763
+ return _map
1764
+
1765
+ result = dict()
1766
+ if self.spec is not None:
1767
+ result['spec'] = self.spec
1768
+ return result
1769
+
1770
+ def from_map(self, m: dict = None):
1771
+ m = m or dict()
1772
+ if m.get('spec') is not None:
1773
+ self.spec = m.get('spec')
1774
+ return self
1775
+
1776
+
1777
+ class ListPartitionsResponse(TeaModel):
1778
+ def __init__(
1779
+ self,
1780
+ partitions: List[Partition] = None,
1781
+ next_page_token: str = None,
1782
+ ):
1783
+ self.partitions = partitions
1784
+ self.next_page_token = next_page_token
1785
+ # Path Functions
1786
+
1787
+ def validate(self):
1788
+ if self.partitions:
1789
+ for k in self.partitions:
1790
+ if k:
1791
+ k.validate()
1792
+
1793
+ def to_map(self):
1794
+ _map = super().to_map()
1795
+ if _map is not None:
1796
+ return _map
1797
+
1798
+ result = dict()
1799
+ result['partitions'] = []
1800
+ if self.partitions is not None:
1801
+ for k in self.partitions:
1802
+ result['partitions'].append(k.to_map() if k else None)
1803
+ if self.next_page_token is not None:
1804
+ result['nextPageToken'] = self.next_page_token
1805
+ return result
1806
+
1807
+ def from_map(self, m: dict = None):
1808
+ m = m or dict()
1809
+ self.partitions = []
1810
+ if m.get('partitions') is not None:
1811
+ for k in m.get('partitions'):
1812
+ temp_model = Partition()
1813
+ self.partitions.append(temp_model.from_map(k))
1814
+ if m.get('nextPageToken') is not None:
1815
+ self.next_page_token = m.get('nextPageToken')
1816
+ return self
1817
+
1818
+
1819
+ class DataScanSource(TeaModel):
1820
+ """
1821
+ ==================================== DataScans ====================================\
1822
+ """
1823
+ def __init__(
1824
+ self,
1825
+ location: str = None,
1826
+ connection: str = None,
1827
+ ignores: List[str] = None,
1828
+ ):
1829
+ # location地址。支持oss、dlf 和 holo
1830
+ self.location = location
1831
+ # connection name。提供访问source需要的身份与网络信息。需要鉴权
1832
+ self.connection = connection
1833
+ # 忽略访问的路径。支持正则表达式
1834
+ self.ignores = ignores
1835
+
1836
+ def validate(self):
1837
+ pass
1838
+
1839
+ def to_map(self):
1840
+ _map = super().to_map()
1841
+ if _map is not None:
1842
+ return _map
1843
+
1844
+ result = dict()
1845
+ if self.location is not None:
1846
+ result['location'] = self.location
1847
+ if self.connection is not None:
1848
+ result['connection'] = self.connection
1849
+ if self.ignores is not None:
1850
+ result['ignores'] = self.ignores
1851
+ return result
1852
+
1853
+ def from_map(self, m: dict = None):
1854
+ m = m or dict()
1855
+ if m.get('location') is not None:
1856
+ self.location = m.get('location')
1857
+ if m.get('connection') is not None:
1858
+ self.connection = m.get('connection')
1859
+ if m.get('ignores') is not None:
1860
+ self.ignores = m.get('ignores')
1861
+ return self
1862
+
1863
+
1864
+ class DataScanTarget(TeaModel):
1865
+ def __init__(
1866
+ self,
1867
+ project: str = None,
1868
+ schema: str = None,
1869
+ name_prefix: str = None,
1870
+ properties: str = None,
1871
+ ):
1872
+ # 结果写入的project name。
1873
+ self.project = project
1874
+ # 当dataScan.type为table时,table写入的schema
1875
+ self.schema = schema
1876
+ # 爬取任务自动生成的table/schema名称的前缀,防止命名冲突。
1877
+ self.name_prefix = name_prefix
1878
+ # 用户可指定的最终表 / schema 的属性
1879
+ self.properties = properties
1880
+
1881
+ def validate(self):
1882
+ pass
1883
+
1884
+ def to_map(self):
1885
+ _map = super().to_map()
1886
+ if _map is not None:
1887
+ return _map
1888
+
1889
+ result = dict()
1890
+ if self.project is not None:
1891
+ result['project'] = self.project
1892
+ if self.schema is not None:
1893
+ result['schema'] = self.schema
1894
+ if self.name_prefix is not None:
1895
+ result['namePrefix'] = self.name_prefix
1896
+ if self.properties is not None:
1897
+ result['properties'] = self.properties
1898
+ return result
1899
+
1900
+ def from_map(self, m: dict = None):
1901
+ m = m or dict()
1902
+ if m.get('project') is not None:
1903
+ self.project = m.get('project')
1904
+ if m.get('schema') is not None:
1905
+ self.schema = m.get('schema')
1906
+ if m.get('namePrefix') is not None:
1907
+ self.name_prefix = m.get('namePrefix')
1908
+ if m.get('properties') is not None:
1909
+ self.properties = m.get('properties')
1910
+ return self
1911
+
1912
+
1913
+ class DataScanProperties(TeaModel):
1914
+ def __init__(
1915
+ self,
1916
+ format_filter: str = None,
1917
+ scan_mode: str = None,
1918
+ enable_stats: bool = None,
1919
+ options: str = None,
1920
+ pattern: str = None,
1921
+ update_policy: str = None,
1922
+ sync_remove: bool = None,
1923
+ auto_commit: bool = None,
1924
+ ):
1925
+ # AUTO/PARQUET/ORC/JSON/CSV。只爬取对应属性的数据。若指定,则忽略其他类型的文件。auto为不指定属性自动探测。
1926
+ self.format_filter = format_filter
1927
+ # enum SAMPLE/TOTAL。 默认为SAMPLE。扫描时抽样扫描或者完整扫描
1928
+ self.scan_mode = scan_mode
1929
+ # 是否统计信息用于查询优化
1930
+ self.enable_stats = enable_stats
1931
+ # 其余的配置可选项,如csv格式下的一些额外选项
1932
+ self.options = options
1933
+ # 分区路径识别的pattern, 例如{table}/{part1}={value1}/{part2}={value2}
1934
+ self.pattern = pattern
1935
+ # 发现表元数据发生变化时的处理策略。APPEND_ONLY/OVERWRITE/IGNORE
1936
+ self.update_policy = update_policy
1937
+ # 发现表删除时是否自动删除
1938
+ self.sync_remove = sync_remove
1939
+ # false代表爬取任务只输出结果,不提交ddl
1940
+ self.auto_commit = auto_commit
1941
+
1942
+ def validate(self):
1943
+ pass
1944
+
1945
+ def to_map(self):
1946
+ _map = super().to_map()
1947
+ if _map is not None:
1948
+ return _map
1949
+
1950
+ result = dict()
1951
+ if self.format_filter is not None:
1952
+ result['formatFilter'] = self.format_filter
1953
+ if self.scan_mode is not None:
1954
+ result['scanMode'] = self.scan_mode
1955
+ if self.enable_stats is not None:
1956
+ result['enableStats'] = self.enable_stats
1957
+ if self.options is not None:
1958
+ result['options'] = self.options
1959
+ if self.pattern is not None:
1960
+ result['options'] = self.pattern
1961
+ if self.update_policy is not None:
1962
+ result['updatePolicy'] = self.update_policy
1963
+ if self.sync_remove is not None:
1964
+ result['syncRemove'] = self.sync_remove
1965
+ if self.auto_commit is not None:
1966
+ result['autoCommit'] = self.auto_commit
1967
+ return result
1968
+
1969
+ def from_map(self, m: dict = None):
1970
+ m = m or dict()
1971
+ if m.get('formatFilter') is not None:
1972
+ self.format_filter = m.get('formatFilter')
1973
+ if m.get('scanMode') is not None:
1974
+ self.scan_mode = m.get('scanMode')
1975
+ if m.get('enableStats') is not None:
1976
+ self.enable_stats = m.get('enableStats')
1977
+ if m.get('options') is not None:
1978
+ self.options = m.get('options')
1979
+ if m.get('options') is not None:
1980
+ self.pattern = m.get('options')
1981
+ if m.get('updatePolicy') is not None:
1982
+ self.update_policy = m.get('updatePolicy')
1983
+ if m.get('syncRemove') is not None:
1984
+ self.sync_remove = m.get('syncRemove')
1985
+ if m.get('autoCommit') is not None:
1986
+ self.auto_commit = m.get('autoCommit')
1987
+ return self
1988
+
1989
+
1990
+ class DataScan(TeaModel):
1991
+ def __init__(
1992
+ self,
1993
+ name: str = None,
1994
+ scan_name: str = None,
1995
+ type: str = None,
1996
+ creator: str = None,
1997
+ customer_id: str = None,
1998
+ namespace_id: str = None,
1999
+ description: str = None,
2000
+ scan_id: str = None,
2001
+ creation_time: int = None,
2002
+ last_modified_time: int = None,
2003
+ last_triggered_time: int = None,
2004
+ last_triggered_by: str = None,
2005
+ scheduling_status: str = None,
2006
+ source: DataScanSource = None,
2007
+ target: DataScanTarget = None,
2008
+ properties: DataScanProperties = None,
2009
+ scheduler_mode: str = None,
2010
+ scheduler_interval: str = None,
2011
+ ):
2012
+ # 资源全局唯一名。e.g., namespaces/{namespaceID}/dataScans/{dataScanName}
2013
+ self.name = name
2014
+ # 用户指定的爬取任务名称
2015
+ self.scan_name = scan_name
2016
+ # 取值范围为:TABLE_DISCOVERY, SCHEMA_DISCOVERY
2017
+ self.type = type
2018
+ # dataScan 的创建者
2019
+ self.creator = creator
2020
+ # 客户 ID
2021
+ self.customer_id = customer_id
2022
+ # dataScan 所属的 namespace
2023
+ self.namespace_id = namespace_id
2024
+ # 用户自定义的描述
2025
+ self.description = description
2026
+ # 系统自动生成的 scan ID,只读字段。展示项
2027
+ self.scan_id = scan_id
2028
+ # 创建的时间,UTC timestamp
2029
+ self.creation_time = creation_time
2030
+ # 上次修改的时间,UTC timestamp
2031
+ self.last_modified_time = last_modified_time
2032
+ # 爬取任务上次触发的时间(开始调度时间),UTC timestamp。未触发过默认值为 0
2033
+ self.last_triggered_time = last_triggered_time
2034
+ # 触发当前调度的来源;具体用户或调度器
2035
+ self.last_triggered_by = last_triggered_by
2036
+ # dataScan 对象的调度状态。包含 IDLE/IMMEDIATE/PENDING/SCHEDULING 四种状态。dataScan 初始化状态为 IDLE,如果创建后立刻执行,设置为 IMMEDIATE
2037
+ self.scheduling_status = scheduling_status
2038
+ # 元数据爬取和发现来源,包括 location、connection 等信息
2039
+ self.source = source
2040
+ # 控制 dataScan 发现结果写入的参数,包含 project、namePrefix、以及透传的 Tbl Properties 等
2041
+ self.target = target
2042
+ # 爬取任务的可选参数,包含更新策略、分类器等
2043
+ self.properties = properties
2044
+ # manual/periodic,手动触发或者周期性自动触发
2045
+ self.scheduler_mode = scheduler_mode
2046
+ # 当 schedulerMode 为 periodic 时,两次爬取任务之间间隔的最大间隔,取值为 [1h-7d]
2047
+ self.scheduler_interval = scheduler_interval
2048
+
2049
+ def validate(self):
2050
+ if self.source:
2051
+ self.source.validate()
2052
+ if self.target:
2053
+ self.target.validate()
2054
+ if self.properties:
2055
+ self.properties.validate()
2056
+
2057
+ def to_map(self):
2058
+ _map = super().to_map()
2059
+ if _map is not None:
2060
+ return _map
2061
+
2062
+ result = dict()
2063
+ if self.name is not None:
2064
+ result['name'] = self.name
2065
+ if self.scan_name is not None:
2066
+ result['scanName'] = self.scan_name
2067
+ if self.type is not None:
2068
+ result['type'] = self.type
2069
+ if self.creator is not None:
2070
+ result['creator'] = self.creator
2071
+ if self.customer_id is not None:
2072
+ result['customerId'] = self.customer_id
2073
+ if self.namespace_id is not None:
2074
+ result['namespaceId'] = self.namespace_id
2075
+ if self.description is not None:
2076
+ result['description'] = self.description
2077
+ if self.scan_id is not None:
2078
+ result['scanId'] = self.scan_id
2079
+ if self.creation_time is not None:
2080
+ result['creationTime'] = self.creation_time
2081
+ if self.last_modified_time is not None:
2082
+ result['lastModifiedTime'] = self.last_modified_time
2083
+ if self.last_triggered_time is not None:
2084
+ result['lastTriggeredTime'] = self.last_triggered_time
2085
+ if self.last_triggered_by is not None:
2086
+ result['lastTriggeredBy'] = self.last_triggered_by
2087
+ if self.scheduling_status is not None:
2088
+ result['schedulingStatus'] = self.scheduling_status
2089
+ if self.source is not None:
2090
+ result['source'] = self.source.to_map()
2091
+ if self.target is not None:
2092
+ result['target'] = self.target.to_map()
2093
+ if self.properties is not None:
2094
+ result['properties'] = self.properties.to_map()
2095
+ if self.scheduler_mode is not None:
2096
+ result['schedulerMode'] = self.scheduler_mode
2097
+ if self.scheduler_interval is not None:
2098
+ result['schedulerInterval'] = self.scheduler_interval
2099
+ return result
2100
+
2101
+ def from_map(self, m: dict = None):
2102
+ m = m or dict()
2103
+ if m.get('name') is not None:
2104
+ self.name = m.get('name')
2105
+ if m.get('scanName') is not None:
2106
+ self.scan_name = m.get('scanName')
2107
+ if m.get('type') is not None:
2108
+ self.type = m.get('type')
2109
+ if m.get('creator') is not None:
2110
+ self.creator = m.get('creator')
2111
+ if m.get('customerId') is not None:
2112
+ self.customer_id = m.get('customerId')
2113
+ if m.get('namespaceId') is not None:
2114
+ self.namespace_id = m.get('namespaceId')
2115
+ if m.get('description') is not None:
2116
+ self.description = m.get('description')
2117
+ if m.get('scanId') is not None:
2118
+ self.scan_id = m.get('scanId')
2119
+ if m.get('creationTime') is not None:
2120
+ self.creation_time = m.get('creationTime')
2121
+ if m.get('lastModifiedTime') is not None:
2122
+ self.last_modified_time = m.get('lastModifiedTime')
2123
+ if m.get('lastTriggeredTime') is not None:
2124
+ self.last_triggered_time = m.get('lastTriggeredTime')
2125
+ if m.get('lastTriggeredBy') is not None:
2126
+ self.last_triggered_by = m.get('lastTriggeredBy')
2127
+ if m.get('schedulingStatus') is not None:
2128
+ self.scheduling_status = m.get('schedulingStatus')
2129
+ if m.get('source') is not None:
2130
+ temp_model = DataScanSource()
2131
+ self.source = temp_model.from_map(m['source'])
2132
+ if m.get('target') is not None:
2133
+ temp_model = DataScanTarget()
2134
+ self.target = temp_model.from_map(m['target'])
2135
+ if m.get('properties') is not None:
2136
+ temp_model = DataScanProperties()
2137
+ self.properties = temp_model.from_map(m['properties'])
2138
+ if m.get('schedulerMode') is not None:
2139
+ self.scheduler_mode = m.get('schedulerMode')
2140
+ if m.get('schedulerInterval') is not None:
2141
+ self.scheduler_interval = m.get('schedulerInterval')
2142
+ return self
2143
+
2144
+
2145
+ class ScanJob(TeaModel):
2146
+ def __init__(
2147
+ self,
2148
+ job_id: str = None,
2149
+ namespace_id: str = None,
2150
+ data_scan_id: str = None,
2151
+ data_scan_name: str = None,
2152
+ triggered_by: str = None,
2153
+ start_time: int = None,
2154
+ end_time: int = None,
2155
+ status: str = None,
2156
+ status_detail: str = None,
2157
+ ddl: str = None,
2158
+ stats: str = None,
2159
+ ):
2160
+ # Job ID
2161
+ self.job_id = job_id
2162
+ # 作业所属的 namespace
2163
+ self.namespace_id = namespace_id
2164
+ # 系统自动生成的 dataScan ID
2165
+ self.data_scan_id = data_scan_id
2166
+ # 所属爬取任务名称。此处为全称 namespace/$nsId/dataScan/$scanName
2167
+ self.data_scan_name = data_scan_name
2168
+ # 触发此次爬取作业的人,定时触发则为 scheduler
2169
+ self.triggered_by = triggered_by
2170
+ # 爬取作业开始时间,UTC timestamp
2171
+ self.start_time = start_time
2172
+ # 爬取作业结束时间,UTC timestamp
2173
+ self.end_time = end_time
2174
+ # 爬取作业状态,取值范围:Created/Running/Terminated/Failed
2175
+ self.status = status
2176
+ # 爬取作业状态详细信息,如报错信息
2177
+ self.status_detail = status_detail
2178
+ # 爬取作业返回的需要提交的 DDL 信息
2179
+ self.ddl = ddl
2180
+ # 爬取作业返回的 stats 信息,JSON 格式
2181
+ self.stats = stats
2182
+
2183
+ def validate(self):
2184
+ pass
2185
+
2186
+ def to_map(self):
2187
+ _map = super().to_map()
2188
+ if _map is not None:
2189
+ return _map
2190
+
2191
+ result = dict()
2192
+ if self.job_id is not None:
2193
+ result['jobId'] = self.job_id
2194
+ if self.namespace_id is not None:
2195
+ result['namespaceId'] = self.namespace_id
2196
+ if self.data_scan_id is not None:
2197
+ result['dataScanId'] = self.data_scan_id
2198
+ if self.data_scan_name is not None:
2199
+ result['dataScanName'] = self.data_scan_name
2200
+ if self.triggered_by is not None:
2201
+ result['triggeredBy'] = self.triggered_by
2202
+ if self.start_time is not None:
2203
+ result['startTime'] = self.start_time
2204
+ if self.end_time is not None:
2205
+ result['endTime'] = self.end_time
2206
+ if self.status is not None:
2207
+ result['status'] = self.status
2208
+ if self.status_detail is not None:
2209
+ result['statusDetail'] = self.status_detail
2210
+ if self.ddl is not None:
2211
+ result['ddl'] = self.ddl
2212
+ if self.stats is not None:
2213
+ result['stats'] = self.stats
2214
+ return result
2215
+
2216
+ def from_map(self, m: dict = None):
2217
+ m = m or dict()
2218
+ if m.get('jobId') is not None:
2219
+ self.job_id = m.get('jobId')
2220
+ if m.get('namespaceId') is not None:
2221
+ self.namespace_id = m.get('namespaceId')
2222
+ if m.get('dataScanId') is not None:
2223
+ self.data_scan_id = m.get('dataScanId')
2224
+ if m.get('dataScanName') is not None:
2225
+ self.data_scan_name = m.get('dataScanName')
2226
+ if m.get('triggeredBy') is not None:
2227
+ self.triggered_by = m.get('triggeredBy')
2228
+ if m.get('startTime') is not None:
2229
+ self.start_time = m.get('startTime')
2230
+ if m.get('endTime') is not None:
2231
+ self.end_time = m.get('endTime')
2232
+ if m.get('status') is not None:
2233
+ self.status = m.get('status')
2234
+ if m.get('statusDetail') is not None:
2235
+ self.status_detail = m.get('statusDetail')
2236
+ if m.get('ddl') is not None:
2237
+ self.ddl = m.get('ddl')
2238
+ if m.get('stats') is not None:
2239
+ self.stats = m.get('stats')
2240
+ return self
2241
+
2242
+
2243
+ class ListDataScansResponse(TeaModel):
2244
+ def __init__(
2245
+ self,
2246
+ next_page_token: str = None,
2247
+ data_scans: List[DataScan] = None,
2248
+ ):
2249
+ # 分页 token
2250
+ self.next_page_token = next_page_token
2251
+ # 返回所有的 dataScans 列表。
2252
+ self.data_scans = data_scans
2253
+
2254
+ def validate(self):
2255
+ if self.data_scans:
2256
+ for k in self.data_scans:
2257
+ if k:
2258
+ k.validate()
2259
+
2260
+ def to_map(self):
2261
+ _map = super().to_map()
2262
+ if _map is not None:
2263
+ return _map
2264
+
2265
+ result = dict()
2266
+ if self.next_page_token is not None:
2267
+ result['nextPageToken'] = self.next_page_token
2268
+ result['dataScans'] = []
2269
+ if self.data_scans is not None:
2270
+ for k in self.data_scans:
2271
+ result['dataScans'].append(k.to_map() if k else None)
2272
+ return result
2273
+
2274
+ def from_map(self, m: dict = None):
2275
+ m = m or dict()
2276
+ if m.get('nextPageToken') is not None:
2277
+ self.next_page_token = m.get('nextPageToken')
2278
+ self.data_scans = []
2279
+ if m.get('dataScans') is not None:
2280
+ for k in m.get('dataScans'):
2281
+ temp_model = DataScan()
2282
+ self.data_scans.append(temp_model.from_map(k))
2283
+ return self
2284
+
2285
+
2286
+ class ListDataScanJobsResponse(TeaModel):
2287
+ def __init__(
2288
+ self,
2289
+ scan_jobs: List[ScanJob] = None,
2290
+ next_page_token: str = None,
2291
+ ):
2292
+ # 返回所有的 dataScan jobs 列表
2293
+ self.scan_jobs = scan_jobs
2294
+ # 分页 token
2295
+ self.next_page_token = next_page_token
2296
+
2297
+ def validate(self):
2298
+ if self.scan_jobs:
2299
+ for k in self.scan_jobs:
2300
+ if k:
2301
+ k.validate()
2302
+
2303
+ def to_map(self):
2304
+ _map = super().to_map()
2305
+ if _map is not None:
2306
+ return _map
2307
+
2308
+ result = dict()
2309
+ result['scanJobs'] = []
2310
+ if self.scan_jobs is not None:
2311
+ for k in self.scan_jobs:
2312
+ result['scanJobs'].append(k.to_map() if k else None)
2313
+ if self.next_page_token is not None:
2314
+ result['nextPageToken'] = self.next_page_token
2315
+ return result
2316
+
2317
+ def from_map(self, m: dict = None):
2318
+ m = m or dict()
2319
+ self.scan_jobs = []
2320
+ if m.get('scanJobs') is not None:
2321
+ for k in m.get('scanJobs'):
2322
+ temp_model = ScanJob()
2323
+ self.scan_jobs.append(temp_model.from_map(k))
2324
+ if m.get('nextPageToken') is not None:
2325
+ self.next_page_token = m.get('nextPageToken')
2326
+ return self
2327
+
2328
+
2329
+ class ModelFieldSchema(TeaModel):
2330
+ def __init__(
2331
+ self,
2332
+ field_name: str = None,
2333
+ sql_type_definition: str = None,
2334
+ type_category: str = None,
2335
+ mode: str = None,
2336
+ fields: List['ModelFieldSchema'] = None,
2337
+ description: str = None,
2338
+ max_length: str = None,
2339
+ precision: str = None,
2340
+ scale: str = None,
2341
+ default_value_expression: str = None,
2342
+ ):
2343
+ # 列名或 struct 字段名
2344
+ self.field_name = field_name
2345
+ # SQL DDL 中的列类型定义
2346
+ self.sql_type_definition = sql_type_definition
2347
+ # 字段类型
2348
+ self.type_category = type_category
2349
+ # 字段模式:REQUIRED 或 NULLABLE
2350
+ self.mode = mode
2351
+ # STRUCT 类型的子字段
2352
+ self.fields = fields
2353
+ # 列的 comment
2354
+ self.description = description
2355
+ # CHAR/VARCHAR 类型的最大长度
2356
+ self.max_length = max_length
2357
+ # DECIMAL 类型的精度
2358
+ self.precision = precision
2359
+ # DECIMAL 类型的 scale
2360
+ self.scale = scale
2361
+ # 默认值的表达式字符串
2362
+ self.default_value_expression = default_value_expression
2363
+
2364
+ def validate(self):
2365
+ if self.fields:
2366
+ for k in self.fields:
2367
+ if k:
2368
+ k.validate()
2369
+
2370
+ def to_map(self):
2371
+ _map = super().to_map()
2372
+ if _map is not None:
2373
+ return _map
2374
+
2375
+ result = dict()
2376
+ if self.field_name is not None:
2377
+ result['fieldName'] = self.field_name
2378
+ if self.sql_type_definition is not None:
2379
+ result['sqlTypeDefinition'] = self.sql_type_definition
2380
+ if self.type_category is not None:
2381
+ result['typeCategory'] = self.type_category
2382
+ if self.mode is not None:
2383
+ result['mode'] = self.mode
2384
+ result['fields'] = []
2385
+ if self.fields is not None:
2386
+ for k in self.fields:
2387
+ result['fields'].append(k.to_map() if k else None)
2388
+ if self.description is not None:
2389
+ result['description'] = self.description
2390
+ if self.max_length is not None:
2391
+ result['maxLength'] = self.max_length
2392
+ if self.precision is not None:
2393
+ result['precision'] = self.precision
2394
+ if self.scale is not None:
2395
+ result['scale'] = self.scale
2396
+ if self.default_value_expression is not None:
2397
+ result['defaultValueExpression'] = self.default_value_expression
2398
+ return result
2399
+
2400
+ def from_map(self, m: dict = None):
2401
+ m = m or dict()
2402
+ if m.get('fieldName') is not None:
2403
+ self.field_name = m.get('fieldName')
2404
+ if m.get('sqlTypeDefinition') is not None:
2405
+ self.sql_type_definition = m.get('sqlTypeDefinition')
2406
+ if m.get('typeCategory') is not None:
2407
+ self.type_category = m.get('typeCategory')
2408
+ if m.get('mode') is not None:
2409
+ self.mode = m.get('mode')
2410
+ self.fields = []
2411
+ if m.get('fields') is not None:
2412
+ for k in m.get('fields'):
2413
+ temp_model = ModelFieldSchema()
2414
+ self.fields.append(temp_model.from_map(k))
2415
+ if m.get('description') is not None:
2416
+ self.description = m.get('description')
2417
+ if m.get('maxLength') is not None:
2418
+ self.max_length = m.get('maxLength')
2419
+ if m.get('precision') is not None:
2420
+ self.precision = m.get('precision')
2421
+ if m.get('scale') is not None:
2422
+ self.scale = m.get('scale')
2423
+ if m.get('defaultValueExpression') is not None:
2424
+ self.default_value_expression = m.get('defaultValueExpression')
2425
+ return self
2426
+
2427
+
2428
+ class Model(TeaModel):
2429
+ """
2430
+ ==================================== Models ====================================\
2431
+ """
2432
+ def __init__(
2433
+ self,
2434
+ name: str = None,
2435
+ model_name: str = None,
2436
+ version_name: str = None,
2437
+ default_version: str = None,
2438
+ create_time: str = None,
2439
+ update_time: str = None,
2440
+ version_create_time: str = None,
2441
+ version_update_time: str = None,
2442
+ description: str = None,
2443
+ version_description: str = None,
2444
+ expiration_days: int = None,
2445
+ version_expiration_days: int = None,
2446
+ source_type: str = None,
2447
+ model_type: str = None,
2448
+ labels: Dict[str, str] = None,
2449
+ transform: Dict[str, str] = None,
2450
+ path: str = None,
2451
+ options: Dict[str, str] = None,
2452
+ extra_info: Dict[str, str] = None,
2453
+ version_extra_info: Dict[str, str] = None,
2454
+ training_info: Dict[str, str] = None,
2455
+ inference_parameters: Dict[str, str] = None,
2456
+ feature_columns: ModelFieldSchema = None,
2457
+ tasks: List[str] = None,
2458
+ ):
2459
+ # 模型的完整路径。e.g., projects/{projectId}/schemas/{schemaName}/models/{modelName}
2460
+ self.name = name
2461
+ # 模型名。上级 Schema 内唯一。大小写不敏感。包含字符:[a-z][A-Z][0-9]_,字节个数范围 [3, 255]
2462
+ self.model_name = model_name
2463
+ # 版本名。同一 model 范围内唯一。大小写不敏感。包含字符:[a-z][A-Z][0-9]_,字节个数范围 [3, 255]
2464
+ self.version_name = version_name
2465
+ # 模型的默认版本名
2466
+ self.default_version = default_version
2467
+ # 模型的创建时间(毫秒)
2468
+ self.create_time = create_time
2469
+ # 模型的修改时间(毫秒)
2470
+ self.update_time = update_time
2471
+ # 版本的创建时间(毫秒)
2472
+ self.version_create_time = version_create_time
2473
+ # 版本的修改时间(毫秒)
2474
+ self.version_update_time = version_update_time
2475
+ # 模型的描述,最长 1KB
2476
+ self.description = description
2477
+ # 版本的描述,最长 1KB
2478
+ self.version_description = version_description
2479
+ # 模型基于最近更新时间的生命周期(天)
2480
+ self.expiration_days = expiration_days
2481
+ # 版本基于最近更新时间的生命周期(天)
2482
+ self.version_expiration_days = version_expiration_days
2483
+ # 模型的来源类型,创建后不支持修改
2484
+ self.source_type = source_type
2485
+ # 模型的类型,创建后不支持修改
2486
+ self.model_type = model_type
2487
+ # 模型的标签
2488
+ self.labels = labels
2489
+ # 版本的预处理信息
2490
+ self.transform = transform
2491
+ # 版本对应模型文件的路径
2492
+ self.path = path
2493
+ # 版本的参数
2494
+ self.options = options
2495
+ # 模型的额外信息
2496
+ self.extra_info = extra_info
2497
+ # 版本的额外信息
2498
+ self.version_extra_info = version_extra_info
2499
+ # 版本的训练信息
2500
+ self.training_info = training_info
2501
+ # 版本的推理参数
2502
+ self.inference_parameters = inference_parameters
2503
+ # 版本的列 schema 定义
2504
+ self.feature_columns = feature_columns
2505
+ # version 支持的所有 task 类型。要求:对于 LLM/MLLM 类型模型,可取值 text-generation,chat,sentence-embedding 中的一个或多个. 对于 BOOSTED_TREE_CLASSIFIER 类型模型,只能取值为 [predict, predict-proba, feature-importance](顺序任意). 对于 BOOSTED_TREE_REGRESSOR 类型模型,只能取值为 [predict, feature-importance](顺序任意)
2506
+ self.tasks = tasks
2507
+
2508
+ def validate(self):
2509
+ if self.feature_columns:
2510
+ self.feature_columns.validate()
2511
+
2512
+ def to_map(self):
2513
+ _map = super().to_map()
2514
+ if _map is not None:
2515
+ return _map
2516
+
2517
+ result = dict()
2518
+ if self.name is not None:
2519
+ result['name'] = self.name
2520
+ if self.model_name is not None:
2521
+ result['modelName'] = self.model_name
2522
+ if self.version_name is not None:
2523
+ result['versionName'] = self.version_name
2524
+ if self.default_version is not None:
2525
+ result['defaultVersion'] = self.default_version
2526
+ if self.create_time is not None:
2527
+ result['createTime'] = self.create_time
2528
+ if self.update_time is not None:
2529
+ result['updateTime'] = self.update_time
2530
+ if self.version_create_time is not None:
2531
+ result['versionCreateTime'] = self.version_create_time
2532
+ if self.version_update_time is not None:
2533
+ result['versionUpdateTime'] = self.version_update_time
2534
+ if self.description is not None:
2535
+ result['description'] = self.description
2536
+ if self.version_description is not None:
2537
+ result['versionDescription'] = self.version_description
2538
+ if self.expiration_days is not None:
2539
+ result['expirationDays'] = self.expiration_days
2540
+ if self.version_expiration_days is not None:
2541
+ result['versionExpirationDays'] = self.version_expiration_days
2542
+ if self.source_type is not None:
2543
+ result['sourceType'] = self.source_type
2544
+ if self.model_type is not None:
2545
+ result['modelType'] = self.model_type
2546
+ if self.labels is not None:
2547
+ result['labels'] = self.labels
2548
+ if self.transform is not None:
2549
+ result['transform'] = self.transform
2550
+ if self.path is not None:
2551
+ result['path'] = self.path
2552
+ if self.options is not None:
2553
+ result['options'] = self.options
2554
+ if self.extra_info is not None:
2555
+ result['extraInfo'] = self.extra_info
2556
+ if self.version_extra_info is not None:
2557
+ result['versionExtraInfo'] = self.version_extra_info
2558
+ if self.training_info is not None:
2559
+ result['trainingInfo'] = self.training_info
2560
+ if self.inference_parameters is not None:
2561
+ result['inferenceParameters'] = self.inference_parameters
2562
+ if self.feature_columns is not None:
2563
+ result['featureColumns'] = self.feature_columns.to_map()
2564
+ if self.tasks is not None:
2565
+ result['tasks'] = self.tasks
2566
+ return result
2567
+
2568
+ def from_map(self, m: dict = None):
2569
+ m = m or dict()
2570
+ if m.get('name') is not None:
2571
+ self.name = m.get('name')
2572
+ if m.get('modelName') is not None:
2573
+ self.model_name = m.get('modelName')
2574
+ if m.get('versionName') is not None:
2575
+ self.version_name = m.get('versionName')
2576
+ if m.get('defaultVersion') is not None:
2577
+ self.default_version = m.get('defaultVersion')
2578
+ if m.get('createTime') is not None:
2579
+ self.create_time = m.get('createTime')
2580
+ if m.get('updateTime') is not None:
2581
+ self.update_time = m.get('updateTime')
2582
+ if m.get('versionCreateTime') is not None:
2583
+ self.version_create_time = m.get('versionCreateTime')
2584
+ if m.get('versionUpdateTime') is not None:
2585
+ self.version_update_time = m.get('versionUpdateTime')
2586
+ if m.get('description') is not None:
2587
+ self.description = m.get('description')
2588
+ if m.get('versionDescription') is not None:
2589
+ self.version_description = m.get('versionDescription')
2590
+ if m.get('expirationDays') is not None:
2591
+ self.expiration_days = m.get('expirationDays')
2592
+ if m.get('versionExpirationDays') is not None:
2593
+ self.version_expiration_days = m.get('versionExpirationDays')
2594
+ if m.get('sourceType') is not None:
2595
+ self.source_type = m.get('sourceType')
2596
+ if m.get('modelType') is not None:
2597
+ self.model_type = m.get('modelType')
2598
+ if m.get('labels') is not None:
2599
+ self.labels = m.get('labels')
2600
+ if m.get('transform') is not None:
2601
+ self.transform = m.get('transform')
2602
+ if m.get('path') is not None:
2603
+ self.path = m.get('path')
2604
+ if m.get('options') is not None:
2605
+ self.options = m.get('options')
2606
+ if m.get('extraInfo') is not None:
2607
+ self.extra_info = m.get('extraInfo')
2608
+ if m.get('versionExtraInfo') is not None:
2609
+ self.version_extra_info = m.get('versionExtraInfo')
2610
+ if m.get('trainingInfo') is not None:
2611
+ self.training_info = m.get('trainingInfo')
2612
+ if m.get('inferenceParameters') is not None:
2613
+ self.inference_parameters = m.get('inferenceParameters')
2614
+ if m.get('featureColumns') is not None:
2615
+ temp_model = ModelFieldSchema()
2616
+ self.feature_columns = temp_model.from_map(m['featureColumns'])
2617
+ if m.get('tasks') is not None:
2618
+ self.tasks = m.get('tasks')
2619
+ return self
2620
+
2621
+
2622
+ class ListModelsResponse(TeaModel):
2623
+ def __init__(
2624
+ self,
2625
+ models: List[Model] = None,
2626
+ next_page_token: str = None,
2627
+ ):
2628
+ self.models = models
2629
+ self.next_page_token = next_page_token
2630
+
2631
+ def validate(self):
2632
+ if self.models:
2633
+ for k in self.models:
2634
+ if k:
2635
+ k.validate()
2636
+
2637
+ def to_map(self):
2638
+ _map = super().to_map()
2639
+ if _map is not None:
2640
+ return _map
2641
+
2642
+ result = dict()
2643
+ result['models'] = []
2644
+ if self.models is not None:
2645
+ for k in self.models:
2646
+ result['models'].append(k.to_map() if k else None)
2647
+ if self.next_page_token is not None:
2648
+ result['nextPageToken'] = self.next_page_token
2649
+ return result
2650
+
2651
+ def from_map(self, m: dict = None):
2652
+ m = m or dict()
2653
+ self.models = []
2654
+ if m.get('models') is not None:
2655
+ for k in m.get('models'):
2656
+ temp_model = Model()
2657
+ self.models.append(temp_model.from_map(k))
2658
+ if m.get('nextPageToken') is not None:
2659
+ self.next_page_token = m.get('nextPageToken')
2660
+ return self
2661
+
2662
+
2663
+ class ListModelVersionsResponse(TeaModel):
2664
+ def __init__(
2665
+ self,
2666
+ models: List[Model] = None,
2667
+ next_page_token: str = None,
2668
+ ):
2669
+ self.models = models
2670
+ self.next_page_token = next_page_token
2671
+ # 路径生成函数
2672
+
2673
+ def validate(self):
2674
+ if self.models:
2675
+ for k in self.models:
2676
+ if k:
2677
+ k.validate()
2678
+
2679
+ def to_map(self):
2680
+ _map = super().to_map()
2681
+ if _map is not None:
2682
+ return _map
2683
+
2684
+ result = dict()
2685
+ result['models'] = []
2686
+ if self.models is not None:
2687
+ for k in self.models:
2688
+ result['models'].append(k.to_map() if k else None)
2689
+ if self.next_page_token is not None:
2690
+ result['nextPageToken'] = self.next_page_token
2691
+ return result
2692
+
2693
+ def from_map(self, m: dict = None):
2694
+ m = m or dict()
2695
+ self.models = []
2696
+ if m.get('models') is not None:
2697
+ for k in m.get('models'):
2698
+ temp_model = Model()
2699
+ self.models.append(temp_model.from_map(k))
2700
+ if m.get('nextPageToken') is not None:
2701
+ self.next_page_token = m.get('nextPageToken')
622
2702
  return self
623
2703
 
624
2704