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/__init__.py +1 -1
- pyodps_catalog/client.py +2132 -8
- pyodps_catalog/models.py +2105 -25
- {pyodps_catalog-0.1.1.dist-info → pyodps_catalog-1.1.0.dist-info}/METADATA +4 -3
- pyodps_catalog-1.1.0.dist-info/RECORD +7 -0
- {pyodps_catalog-0.1.1.dist-info → pyodps_catalog-1.1.0.dist-info}/WHEEL +1 -1
- pyodps_catalog-0.1.1.dist-info/RECORD +0 -7
- {pyodps_catalog-0.1.1.dist-info → pyodps_catalog-1.1.0.dist-info}/top_level.txt +0 -0
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
|
|
4
|
+
from typing import Dict, List
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
class
|
|
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:
|
|
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 =
|
|
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
|
|
785
|
+
class ListTablesResponse(TeaModel):
|
|
587
786
|
def __init__(
|
|
588
787
|
self,
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
body: str = None,
|
|
788
|
+
tables: List[Table] = None,
|
|
789
|
+
next_page_token: str = None,
|
|
592
790
|
):
|
|
593
|
-
self.
|
|
594
|
-
self.
|
|
595
|
-
|
|
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.
|
|
607
|
-
result['
|
|
608
|
-
if self.
|
|
609
|
-
result['
|
|
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('
|
|
617
|
-
self.
|
|
618
|
-
if m.get('
|
|
619
|
-
self.
|
|
620
|
-
|
|
621
|
-
|
|
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
|
|