diff --git a/CHANGELOG.md b/CHANGELOG.md index 03ab7c51..7da80598 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,303 @@ +## 0.11.45 (2023-04-24) + +ENHANCEMENTS: +- Remove Region and Zone parameters from SendUVMSMessage API. + +## 0.11.33 (2022-06-15) + +ENHANCEMENTS: + +- Update all APIs of `VPC2.0` (#) + +## 0.11.32 (2022-06-13) + +## 0.11.31 (2022-05-26) + +ENHANCEMENTS: + +- Update all APIs of `UNet` (#) + +## 0.11.30 (2022-04-28) + +ENHANCEMENTS: + +- Update all APIs of `UPhone` (#) + +## 0.11.29 (2022-04-28) + +ENHANCEMENTS: + +- Update all APIs of `UHost` (#219) + +## 0.11.28 (2022-03-30) + +ENHANCEMENTS: + +- Update all APIs of `UVMS` (#212) +- Update all APIs of `UNet` (#210) + +## 0.11.27 (2022-03-25) + +ENHANCEMENTS: + +- Update all APIs of `IAM` (#208) +- Update all APIs of `UPHost` (#207) + +## 0.11.26 (2022-03-01) + +ENHANCEMENTS: + +- Update all APIs of `UBill` (#205) + +## 0.11.25 (2022-01-20) + +ENHANCEMENTS: + +- Update all APIs of `UK8S` (#203) +- Update all APIs of `UFile` (#202) + +## 0.11.24 (2022-01-13) + +ENHANCEMENTS: + +- Update all APIs of `UTSDB` (#200) +- Update all APIs of `UHub` (#199) +- Update all APIs of `UCDN` (#198) + +## 0.11.23 (2021-12-31) + +ENHANCEMENTS: + +- Update all APIs of `UDB` (#194) + +## 0.11.22 (2021-12-30) + +ENHANCEMENTS: + +- Update all APIs of `UBill` (#192) + +## 0.11.21 (2021-12-16) + +ENHANCEMENTS: + +- Update all APIs of `UK8S` (#190) + +## 0.11.20 (2021-12-14) + +BUG FIXES: + +- Fix deprecated class: `collections.Iterable` to `collections.abc.Iterable` at 3.10 + +## 0.11.19 (2021-11-25) + +ENHANCEMENTS: + +- Update all APIs of `TiDB` (#184) + +## 0.11.18 (2021-11-18) + +ENHANCEMENTS: + +- Update all APIs of `UEC` (#182) +- Update all APIs of `UNVS` (#179) + +## 0.11.17 (2021-11-11) + +ENHANCEMENTS: + +- Update all APIs of `UNet` (#177) +- Update all APIs of `UMem` (#176) + +## 0.11.16 (2021-11-04) + +ENHANCEMENTS: + +- Update all APIs of `UDisk` (#174) + +## 0.11.15 (2021-09-06) + +ENHANCEMENTS: + +- Update all APIs of `ISMS` (#172) + +## 0.11.14 (2021-09-03) + +ENHANCEMENTS: + +- Update all APIs of `Cube` (#170) + +## 0.11.13 (2021-08-31) + +ENHANCEMENTS: + +- Update all APIs of `UCDN` (#168) +- Update all APIs of `ISMS` (#166) + +## 0.11.12 (2021-08-30) + +ENHANCEMENTS: + +- Update all APIs of `USMS` (#163) + +## 0.11.11 (2021-08-17) + +ENHANCEMENTS: + +- Update all APIs of `Cube` (#161) + +## 0.11.10 (2021-08-13) + +ENHANCEMENTS: + +- Update all APIs of `PathX` (#) + +## 0.11.9 (2021-08-12) + +ENHANCEMENTS: + +- Update all APIs of `UMem` (#156) +- Update all APIs of `PathX` (#155) + +## 0.11.8 (2021-07-27) + +ENHANCEMENTS: + +- Update all APIs of `UDTS` (#153) + +## 0.11.7 (2021-07-22) + +ENHANCEMENTS: + +- Update all APIs of `UHost` (#151) +- Update all APIs of `USMS` (#150) + +## 0.11.6 (2021-07-08) + +ENHANCEMENTS: + +- Update all APIs of `UCDN` (#147) +- Update all APIs of `UK8S` (#145) + +## 0.11.5 (2021-07-02) + +ENHANCEMENTS: + +- Update all APIs of `UMem` (#143) +- Update all APIs of `UCDN` (#142) + +## 0.11.4 (2021-05-14) + +ENHANCEMENTS: + +- Update all APIs of `UAccount` (#139) +- Update all APIs of `UK8S` (#140) +- Update all APIs of `Cube` (#138) + +## 0.11.3 (2021-05-08) + +ENHANCEMENTS: + +- Update all APIs of `UDDB` (#135) +- Update all APIs of `UDB` (#134) +- Update all APIs of `ULB` (#132) +- Update all APIs of `UMem` (#133) +- Update all APIs of `UFile` (#131) +- Update all APIs of `UBill` (#128) +- Update all APIs of `UEC` (#126) + +## 0.11.2 (2021-04-30) + +ENHANCEMENTS: + +- Update all APIs of `UCDN` (#113) +- Update all APIs of `UBill` (#112) +- Update all APIs of `UDPN` (#112) +- Update all APIs of `UEC` (#110) +- Update all APIs of `USMS` (#109) +- Update all APIs of `VPC2.0` (#108) +- Update all APIs of `IPSecVPN` (#107) +- Update all APIs of `UNet` (#106) + +## 0.11.1 (2021-04-28) + +ENHANCEMENTS: + +- Update all APIs of `UDDB` (#102) +- Update all APIs of `UCDN` (#103) +- Update all APIs of `UFS` (#101) +- Update all APIs of `UDisk` (#99) +- Update all APIs of `PathX` (#100) +- Update all APIs of `UHost` (#98) + +## 0.11.0 (2021-04-22) + +FEATURES: + +- add `URocketMQ ` apis to be consistent with official document(#96 ) +- add `ISMS ` apis to be consistent with official document(#95 ) +- add `UGN ` apis to be consistent with official document(#94 ) + +ENHANCEMENTS: + +- add U-Timestamp-Ms in request header for tracing the e2e latency + +## 0.10.3 (2021-04-14) + +## 0.10.2 (2021-03-03) + +BUG FIXES: + +- Fix `timeout` options for requests transport (#88) + +## 0.10.1 (2021-02-07) + +ENHANCEMENTS: + +- Update all APIs of `VPC` (#82) +- Update all APIs of `UDisk` (#81) +- Update all APIs of `UNet` (#80) +- Update all APIs of `UHost` (#76) + +BUG FIXES: + +- (**BROKEN CHANGE**) Fix `DescribeRouteTable` field `SubnetCount` from `string` to `integer` (#82) +- (**BROKEN CHANGE**) Fix `CloneRouteTable` field `Region` as `Required` (#82) +- (**BROKEN CHANGE**) Fix `UHostDiskSet` field `Encrypted` from `string` to `boolean` (#76) + +## 0.10.0 (2020-11-26) + +FEATURES: + +- Add product `UK8S` +- Add product `Cube` + +## 0.9.4 (2020-09-25) + +ENHANCEMENTS: + +- Update all APIs of `UMem` (#195) + +## 0.9.3 (2020-09-22) + +BUG FIXES: + +- Fix python 2 compatible helpers for nested CJK charset + +## 0.9.2 (2020-07-31) + +ENHANCEMENTS: + +- Improve testing with `requests_mock` +- Add `InvalidResponseException` and `HTTPStatusException` +- Add `request_uuid` to response and exception logging +- Add default exception middileware +- Change documentation url +- Update all APIs of `UCloudStack` + +BUG FIXES: + +- Fix `pytest` version compatible + ## 0.9.1 (2020-06-05) ENHANCEMENTS: diff --git a/Makefile b/Makefile index 44b9fb70..acd2cfa2 100644 --- a/Makefile +++ b/Makefile @@ -37,6 +37,10 @@ test: clean test-cov: clean pytest --cov=ucloud/core tests +test-cov-html: + pytest --cov=ucloud/core tests --cov-report html + $(BROWSER) htmlcov/index.html + test-acc: clean USDKACC=1 pytest --cov=ucloud diff --git a/README.md b/README.md index b3fc270b..da940731 100644 --- a/README.md +++ b/README.md @@ -17,4 +17,4 @@ This client can run on Linux, macOS and Windows. - Website: https://www.ucloud.cn/ - Free software: Apache 2.0 license -- [Documentation](https://ucloud.github.io/ucloud-sdk-python3/) +- [Documentation](https://docs.ucloud.cn/opensdk-python/) diff --git a/VERSION b/VERSION new file mode 100644 index 00000000..1b800278 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.11.34 diff --git a/docs/services.rst b/docs/services.rst index f083e74e..4141e404 100644 --- a/docs/services.rst +++ b/docs/services.rst @@ -87,6 +87,20 @@ VPC +Cube +---- + +.. autoclass:: ucloud.services.cube.client.CubeClient + :members: + + +IAM +--- + +.. autoclass:: ucloud.services.iam.client.IAMClient + :members: + + IPSecVPN -------- @@ -94,10 +108,115 @@ IPSecVPN :members: -UCloudStack +ISMS +---- + +.. autoclass:: ucloud.services.isms.client.ISMSClient + :members: + + +NLB +--- + +.. autoclass:: ucloud.services.nlb.client.NLBClient + :members: + + +STS +--- + +.. autoclass:: ucloud.services.sts.client.STSClient + :members: + + +TiDB +---- + +.. autoclass:: ucloud.services.tidb.client.TiDBClient + :members: + + +UAAA +---- + +.. autoclass:: ucloud.services.uaaa.client.UAAAClient + :members: + + +UADS +---- + +.. autoclass:: ucloud.services.uads.client.UADSClient + :members: + + +UBill +----- + +.. autoclass:: ucloud.services.ubill.client.UBillClient + :members: + + +UClickhouse ----------- -.. autoclass:: ucloud.services.ucloudstack.client.UCloudStackClient +.. autoclass:: ucloud.services.uclickhouse.client.UClickhouseClient + :members: + + +UCompShare +---------- + +.. autoclass:: ucloud.services.ucompshare.client.UCompShareClient + :members: + + +UDBProxy +-------- + +.. autoclass:: ucloud.services.udbproxy.client.UDBProxyClient + :members: + + +UDDB +---- + +.. autoclass:: ucloud.services.uddb.client.UDDBClient + :members: + + +UDI +--- + +.. autoclass:: ucloud.services.udi.client.UDIClient + :members: + + +UDNS +---- + +.. autoclass:: ucloud.services.udns.client.UDNSClient + :members: + + +UDTS +---- + +.. autoclass:: ucloud.services.udts.client.UDTSClient + :members: + + +UEC +--- + +.. autoclass:: ucloud.services.uec.client.UECClient + :members: + + +UES +--- + +.. autoclass:: ucloud.services.ues.client.UESClient :members: @@ -108,9 +227,135 @@ UFS :members: +UFile +----- + +.. autoclass:: ucloud.services.ufile.client.UFileClient + :members: + + +UGN +--- + +.. autoclass:: ucloud.services.ugn.client.UGNClient + :members: + + +UHIDS +----- + +.. autoclass:: ucloud.services.uhids.client.UHIDSClient + :members: + + +UHadoop +------- + +.. autoclass:: ucloud.services.uhadoop.client.UHadoopClient + :members: + + UHub ---- .. autoclass:: ucloud.services.uhub.client.UHubClient :members: + +UK8S +---- + +.. autoclass:: ucloud.services.uk8s.client.UK8SClient + :members: + + +UKafka +------ + +.. autoclass:: ucloud.services.ukafka.client.UKafkaClient + :members: + + +ULogService +----------- + +.. autoclass:: ucloud.services.ulogservice.client.ULogServiceClient + :members: + + +UMongoDB +-------- + +.. autoclass:: ucloud.services.umongodb.client.UMongoDBClient + :members: + + +UNVS +---- + +.. autoclass:: ucloud.services.unvs.client.UNVSClient + :members: + + +UPFS +---- + +.. autoclass:: ucloud.services.upfs.client.UPFSClient + :members: + + +UPgSQL +------ + +.. autoclass:: ucloud.services.upgsql.client.UPgSQLClient + :members: + + +UPhone +------ + +.. autoclass:: ucloud.services.uphone.client.UPhoneClient + :members: + + +USLK +---- + +.. autoclass:: ucloud.services.uslk.client.USLKClient + :members: + + +UTSDB +----- + +.. autoclass:: ucloud.services.utsdb.client.UTSDBClient + :members: + + +UVMS +---- + +.. autoclass:: ucloud.services.uvms.client.UVMSClient + :members: + + +UWSC +---- + +.. autoclass:: ucloud.services.uwsc.client.UWSCClient + :members: + + +VPC +--- + +.. autoclass:: ucloud.services.vpc.client.VPCClient + :members: + + +ipv6gw +------ + +.. autoclass:: ucloud.services.ipv6gw.client.ipv6gwClient + :members: + diff --git a/examples/auth/README.md b/examples/auth/README.md new file mode 100644 index 00000000..b5cbf070 --- /dev/null +++ b/examples/auth/README.md @@ -0,0 +1,15 @@ +# UCloud SDK Auth Example + +## What is the goal + +Create signature from request payload. + +## Setup Environment + +Don't need. + +## How to run + +```sh +python main.py +``` diff --git a/examples/auth/__init__.py b/examples/auth/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/auth/main.py b/examples/auth/main.py new file mode 100644 index 00000000..8348488c --- /dev/null +++ b/examples/auth/main.py @@ -0,0 +1,14 @@ +from ucloud.core import auth + + +def main(): + cred = auth.Credential( + "ucloudsomeone@example.com1296235120854146120", + "46f09bb9fab4f12dfc160dae12273d5332b5debe", + ) + d = {"Action": "DescribeUHostInstance", "Region": "cn-bj2", "Limit": 10} + print(cred.verify_ac(d)) + + +if __name__ == "__main__": + main() diff --git a/setup.py b/setup.py index 6ba5febd..ba27f976 100644 --- a/setup.py +++ b/setup.py @@ -59,7 +59,7 @@ def load_requirements(requirements_file): dependencies = load_requirements("requirements.txt") -dependencies_test = dependencies + ["flake8>=3.6.0", "pytest", "pytest-cov"] +dependencies_test = dependencies + ["flake8>=3.6.0", "pytest>=4.6", "pytest-cov", "requests_mock"] dependencies_doc = dependencies + ["sphinx"] diff --git a/tests/test_acceptance/test_scenario_5183.py b/tests/test_acceptance/test_scenario_5183.py index fc8bacfd..8b60a1f7 100644 --- a/tests/test_acceptance/test_scenario_5183.py +++ b/tests/test_acceptance/test_scenario_5183.py @@ -1,6 +1,5 @@ """ Code is generated by ucloud-model, DO NOT EDIT IT. """ - import pytest from ucloud.core import exc @@ -17,8 +16,15 @@ def test_scenario_5183(ustack_client, variables): scenario.store["Region"] = "cn" scenario.store["Zone"] = "zone-01" - scenario.store["BeginTime"] = funcs.get_timestamp(10,) - 3600 - scenario.store["EndTime"] = funcs.get_timestamp(10,) + scenario.store["BeginTime"] = ( + funcs.get_timestamp( + 10, + ) + - 3600 + ) + scenario.store["EndTime"] = funcs.get_timestamp( + 10, + ) # 查询VPC信息 describe_vpc_00(ustack_client) @@ -351,7 +357,9 @@ def describe_vm_instance_07(step, client): d = { "Zone": variables.get("Zone"), - "VMIDs": [variables.get("VMID"),], + "VMIDs": [ + variables.get("VMID"), + ], "Region": variables.get("Region"), } @@ -458,7 +466,9 @@ def describe_lb_10(step, client): d = { "Zone": variables.get("Zone"), "Region": variables.get("Region"), - "LBIDs": [variables.get("LBID"),], + "LBIDs": [ + variables.get("LBID"), + ], } try: @@ -682,7 +692,9 @@ def describe_rs_17(step, client): "Zone": variables.get("Zone"), "VSID": variables.get("VSID"), "Region": variables.get("Region"), - "RSIDs": [variables.get("RSID"),], + "RSIDs": [ + variables.get("RSID"), + ], "LBID": variables.get("LBID"), } @@ -745,7 +757,9 @@ def describe_rs_19(step, client): "Zone": variables.get("Zone"), "VSID": variables.get("VSID"), "Region": variables.get("Region"), - "RSIDs": [variables.get("RSID"),], + "RSIDs": [ + variables.get("RSID"), + ], "LBID": variables.get("LBID"), } @@ -776,7 +790,9 @@ def create_vs_policy_20(step, client): "Zone": variables.get("Zone"), "VSID": variables.get("VSID"), "Region": variables.get("Region"), - "RSIDs": [variables.get("RSID"),], + "RSIDs": [ + variables.get("RSID"), + ], "Path": "/test12321", "LBID": variables.get("LBID"), "Domain": "test.com11", @@ -810,7 +826,9 @@ def describe_vs_policy_21(step, client): "Zone": variables.get("Zone"), "VSID": variables.get("VSID"), "Region": variables.get("Region"), - "PolicyIDs": [variables.get("PolicyID"),], + "PolicyIDs": [ + variables.get("PolicyID"), + ], "LBID": variables.get("LBID"), } diff --git a/tests/test_acceptance/test_scenario_5292.py b/tests/test_acceptance/test_scenario_5292.py index 2be1b826..beed1d85 100644 --- a/tests/test_acceptance/test_scenario_5292.py +++ b/tests/test_acceptance/test_scenario_5292.py @@ -1,6 +1,5 @@ """ Code is generated by ucloud-model, DO NOT EDIT IT. """ - import pytest from ucloud.core import exc @@ -17,8 +16,15 @@ def test_scenario_5292(ustack_client, variables): scenario.store["Region"] = "cn" scenario.store["Zone"] = "zone-01" - scenario.store["BeginTime"] = funcs.get_timestamp(10,) - 3600 - scenario.store["EndTime"] = funcs.get_timestamp(10,) + scenario.store["BeginTime"] = ( + funcs.get_timestamp( + 10, + ) + - 3600 + ) + scenario.store["EndTime"] = funcs.get_timestamp( + 10, + ) # 查询VPC信息 describe_vpc_00(ustack_client) @@ -358,7 +364,9 @@ def describe_vm_instance_07(step, client): d = { "Zone": variables.get("Zone"), - "VMIDs": [variables.get("VMID"),], + "VMIDs": [ + variables.get("VMID"), + ], "Region": variables.get("Region"), } @@ -388,7 +396,9 @@ def describe_vm_instance_08(step, client): d = { "Zone": variables.get("Zone"), - "VMIDs": [variables.get("VMID_1"),], + "VMIDs": [ + variables.get("VMID_1"), + ], "Region": variables.get("Region"), } @@ -488,7 +498,9 @@ def describe_certificate_11(step, client): "Zone": variables.get("Zone"), "Region": variables.get("Region"), "CertificateType": "ServerCrt", - "CertificateIDs": [variables.get("CertificateID_server"),], + "CertificateIDs": [ + variables.get("CertificateID_server"), + ], } try: @@ -519,7 +531,9 @@ def describe_certificate_12(step, client): "Zone": variables.get("Zone"), "Region": variables.get("Region"), "CertificateType": "CACrt", - "CertificateIDs": [variables.get("CertificateID_client"),], + "CertificateIDs": [ + variables.get("CertificateID_client"), + ], } try: diff --git a/tests/test_services/test_set_2935.py b/tests/test_services/test_set_2935.py index 91135651..1f65d5c7 100644 --- a/tests/test_services/test_set_2935.py +++ b/tests/test_services/test_set_2935.py @@ -16,9 +16,9 @@ def test_set_2935(client: utest.Client, variables: dict): scenario.initial(variables) - scenario.variables[ - "Image_Id_ucloud" - ] = "#{u_get_image_resource($Region,$Zone)}" + scenario.variables["Image_Id_ucloud"] = ( + "#{u_get_image_resource($Region,$Zone)}" + ) scenario.variables["saopaulo_image"] = "uimage-1bkjka" scenario.run(client) diff --git a/tests/test_services/test_set_3278.py b/tests/test_services/test_set_3278.py index 2f3f5be1..e7bcc2a9 100644 --- a/tests/test_services/test_set_3278.py +++ b/tests/test_services/test_set_3278.py @@ -16,9 +16,9 @@ def test_set_3278(client: utest.Client, variables: dict): scenario.initial(variables) - scenario.variables[ - "Image_Id_cloud" - ] = "#{u_get_image_resource($Region,$Zone)}" + scenario.variables["Image_Id_cloud"] = ( + "#{u_get_image_resource($Region,$Zone)}" + ) scenario.variables["saopaulo_image"] = "uimage-1bkjka" scenario.run(client) diff --git a/tests/test_services/test_set_4079.py b/tests/test_services/test_set_4079.py index 42b0dce0..aaadc2b3 100644 --- a/tests/test_services/test_set_4079.py +++ b/tests/test_services/test_set_4079.py @@ -16,9 +16,9 @@ def test_set_4079(client: utest.Client, variables: dict): scenario.initial(variables) - scenario.variables[ - "file" - ] = "data:image/jpeg;base64,/9j/4SRFRXhpZgAASUkqAAgAAAALAA4BAgAgAAAAkgAAAA8BAgAQAAAAsgAAABABAgAJAAAAygAAABIBAwABAAAAAQAAABoBBQABAAAA2AAAABsBBQABAAAA4AAAACgBAwABAAAAAgAAADEBAgAIAAAA6AAAADIBAgAUAAAACAEAABMCAwABAAAAAgAAAGmHBAABAAAAHAEAABgDAABNSU5PTFRBIERJR0lUQUwgQ0FNRVJBICAgICAgICAgAE1JTk9MVEEgQ08uLExURAAAAAAAAAAAAERpTUFHRSBYAAAAAAAASAAAAAEAAABIAAAAAQAAAFYxMDAtMDIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwMjowODoxMiAxNjowNjo1OAAYAJqCBQABAAAAQgIAAJ2CBQABAAAASgIAACKIAwABAAAAAgAAACeIAwABAAAAZAAAAACQBwAEAAAAMDIxMAOQAgAUAAAAUgIAAASQAgAUAAAAZgIAAAGRBwAEAAAAAQIDAAKRBQABAAAAegIAAASSCgABAAAAggIAAAWSBQABAAAAigIAAAeSAwABAAAABQAAAAiSAwABAAAAAAAAAAmSAwABAAAAAAAAAAqSBQABAAAAkgIAAHySBwB4AgAAlAMAAIaSBwB9AAAAmgIAAACgBwAEAAAAMDEwMAGgAwABAAAAAQAAAAOgBAABAAAAAAUAAAKgBAABAAAAwAMAAAWgBAABAAAAdgMAAACjBwABAAAAAwAAAAGjBwABAAAAAQAAAAAAAAAKAAAApRsAABwAAAAKAAAAMjAwMjowODoxMiAxNjowNjo1OAAyMDAyOjA4OjEyIDE2OjA2OjU4AAQAAAABAAAAAAAAAAoAAAAeAAAACgAAADwAAAAKAAAAAAAAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAABgCGkgMAAQAAAAYAAACGkgUAAQAAAGYDAACGkgUAAQAAAG4DAACGkgMAAQAAAAIAAACGkgQAAQAAAPQPAACGkgQAAQAAABAPAAAAAAAASAAAAAEAAABIAAAAAQAAAAIAAQACAAQAAABSOTgAAgAHAAQAAAAwMTAwAAAAABoAAAAHAAQAAABNTFQwAAIEAAMAAADSBAAAAQIDAAEAAAADAAAAAgIDAAEAAAAAAAAAAwIDAAEAAAAAAAAABAIFAAEAAADeBAAADgIDAAEAAAAAAAAADwIDAAEAAAAAAAAAEAIDAAEAAAAAAAAAEQIDAAEAAAAAAAAAEgIDAAEAAAAAAAAAEwIDAAEAAAAAAAAAFAIDAAEAAAAAAAAAFQIDAAEAAAAAAAAAFgIDAAEAAAAAAAAAFwIDAAEAAAAAAAAAGAIDAAEAAAAAAAAAGQIDAAEAAAAAAAAAGgIDAAEAAAAAAAAAGwIDAAEAAAAAAAAAHAIDAAEAAAAAAAAAHQIDAAEAAAAAAAAAHgIDAAEAAAAAAAAAHwIDAAEAAAAAAAAAAA4HACgAAADmBAAAAA8HAP4AAAAOBQAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAAUHJpbnRJTQAwMTAwAAAEAAEAFgAWAAIAAQAAAAABAQAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAFli4AAAAAAAVnAAAsngAABWcAACyeAAAAAAEAAAAL+gAdAdQBBAAAAAAAAAAAAAAAxREAAAAsLhYEAAAAAAAAAAAAAAAAGRwAADsADkIAAAAAAAAAAAAAAAAAAAAAAAAFhf/wdQAAAAAAAMUQNgAAAACZmZmZGWESMXV4iYoOExgUEhAWEgAAAIUADAAGAQCAUwABA4QAAAAPatX+aw5RAGIOgSNXAGQA0gwXDQb/////AQIQQAACAP8AQABAAAAAEAAAAAARERERAAJhAgBDAAAaHRseAAAAAAAAFDIPYQAAHyIbHh4hHyOHZUMh///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Y/9sAxQALBwgKCAcLCgkKDAwLDRAbEhAPDxAhGBkUGycjKSknIyYlLDE/NSwuOy8lJjZKNztBQ0ZHRio0TVJMRFI/RUZDAQwMDBAOECASEiBDLSYtQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0MCDAwMEA4QIBISIEMtJi1DQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ//EAaIAAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKCxAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx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nkbYk+tayKjquYXB2j5x3repfl0M4bjZbVeSpwSOpFUHJjkKHqKmnO+hU421Ogvir6fIsjFVwMkDOOaZa2s1xbQSQTDYq7fmGCeTWjM0+qLSWt7HyJcj2c1pWryrAFm5fPXOaixTloP3U5MYJNMlCsueaYwAoQMglmjjIDsB9aYZ4uvmLj61diRRdRICwkXgetVpL23lBV5FAbr81RNaFQ3KT3kbOXaVQo4Ve5rCuARLJkDdjk5zWdOMru5rUasiW1aSHR1lE4hI3FQQPm68c0ZuLzTzKboNgZeMADGP/wBVQ+XmvYa5lGyKcrEQKT2NXkuHeJf3jYxwBxXQ4prUxUmtiIqD8xOX9TyaquzbyWJJ9TTUUhttnS6j82nyAd8D9RUdtNeQ26JDv8tRxhMik9hRtrclGpXaL8wB+q1o6bdPdW5eQAENjip1KdrFoHNOz0qiR+7ionbmhCZj61/rEPsapLJhVG1Tx3rZLQm9iE3kTLhkQEjpUUcIYhktt49geaG7K7Ba6CNaTTsMWCoo7swGazoXimkwYcKBljuPFRGpGTaRUoNLUnttWhWIwPah448lc8/zqVb+OSNo7a1EQkGGbgcVhKk+bfQ1jNJbalW9wYiMdKktDmBa2Mh7N85FV5upNCBnQWd5a3EO2SeIAjn5wK0IbizhhCLcxbR0zIKgeo9b616faYf++xThf2uP+PmH/v4KB2HDULX/AJ+Yf+/gpRf2v/PzD/38FArMkW/tM/8AHzB/38FMkvrXd/x8w/8AfwU1uKV7GVq91bO8eLiI9ejis77TAVCmaMjBB+YVtFohp2I47mASLmWPGf7wrVbWrORMPceSfVWBrKtHmtY1pO25Vu5YLi1222pJuBzv8wAnrwa5n7TGtqyIw3E/Mc1nRsrq1iqt3Ybash3DenI7kVbSVIvmEseB23CtXYz1B7iKSBsumSf71SWk8SwjMiZ/3hSCzHPPFvz5if8AfQqKSeIc+YmD15FO4WZ//9n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////bAEMAAQEBAQEBAQEBAQICAQEBAgICAgIDBAUDAgMDBAYFBAQEBQUFBAYHBQUGBwgHBgkGBAUICAgICQoJBgcKCAgICP/bAEMBAQEBAgICBAICBAgFBAUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICP/AABEIBQADwAMBEgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APx90DwTH+6P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" + scenario.variables["file"] = ( + "data:image/jpeg;base64,/9j/4SRFRXhpZgAASUkqAAgAAAALAA4BAgAgAAAAkgAAAA8BAgAQAAAAsgAAABABAgAJAAAAygAAABIBAwABAAAAAQAAABoBBQABAAAA2AAAABsBBQABAAAA4AAAACgBAwABAAAAAgAAADEBAgAIAAAA6AAAADIBAgAUAAAACAEAABMCAwABAAAAAgAAAGmHBAABAAAAHAEAABgDAABNSU5PTFRBIERJR0lUQUwgQ0FNRVJBICAgICAgICAgAE1JTk9MVEEgQ08uLExURAAAAAAAAAAAAERpTUFHRSBYAAAAAAAASAAAAAEAAABIAAAAAQAAAFYxMDAtMDIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwMjowODoxMiAxNjowNjo1OAAYAJqCBQABAAAAQgIAAJ2CBQABAAAASgIAACKIAwABAAAAAgAAACeIAwABAAAAZAAAAACQBwAEAAAAMDIxMAOQAgAUAAAAUgIAAASQAgAUAAAAZgIAAAGRBwAEAAAAAQIDAAKRBQABAAAAegIAAASSCgABAAAAggIAAAWSBQABAAAAigIAAAeSAwABAAAABQAAAAiSAwABAAAAAAAAAAmSAwABAAAAAAAAAAqSBQABAAAAkgIAAHySBwB4AgAAlAMAAIaSBwB9AAAAmgIAAACgBwAEAAAAMDEwMAGgAwABAAAAAQAAAAOgBAABAAAAAAUAAAKgBAABAAAAwAMAAAWgBAABAAAAdgMAAACjBwABAAAAAwAAAAGjBwABAAAAAQAAAAAAAAAKAAAApRsAABwAAAAKAAAAMjAwMjowODoxMiAxNjowNjo1OAAyMDAyOjA4OjEyIDE2OjA2OjU4AAQAAAABAAAAAAAAAAoAAAAeAAAACgAAADwAAAAKAAAAAAAAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAABgCGkgMAAQAAAAYAAACGkgUAAQAAAGYDAACGkgUAAQAAAG4DAACGkgMAAQAAAAIAAACGkgQAAQAAAPQPAACGkgQAAQAAABAPAAAAAAAASAAAAAEAAABIAAAAAQAAAAIAAQACAAQAAABSOTgAAgAHAAQAAAAwMTAwAAAAABoAAAAHAAQAAABNTFQwAAIEAAMAAADSBAAAAQIDAAEAAAADAAAAAgIDAAEAAAAAAAAAAwIDAAEAAAAAAAAABAIFAAEAAADeBAAADgIDAAEAAAAAAAAADwIDAAEAAAAAAAAAEAIDAAEAAAAAAAAAEQIDAAEAAAAAAAAAEgIDAAEAAAAAAAAAEwIDAAEAAAAAAAAAFAIDAAEAAAAAAAAAFQIDAAEAAAAAAAAAFgIDAAEAAAAAAAAAFwIDAAEAAAAAAAAAGAIDAAEAAAAAAAAAGQIDAAEAAAAAAAAAGgIDAAEAAAAAAAAAGwIDAAEAAAAAAAAAHAIDAAEAAAAAAAAAHQIDAAEAAAAAAAAAHgIDAAEAAAAAAAAAHwIDAAEAAAAAAAAAAA4HACgAAADmBAAAAA8HAP4AAAAOBQAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAAUHJpbnRJTQAwMTAwAAAEAAEAFgAWAAIAAQAAAAABAQAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAFli4AAAAAAAVnAAAsngAABWcAACyeAAAAAAEAAAAL+gAdAdQBBAAAAAAAAAAAAAAAxREAAAAsLhYEAAAAAAAAAAAAAAAAGRwAADsADkIAAAAAAAAAAAAAAAAAAAAAAAAFhf/wdQAAAAAAAMUQNgAAAACZmZmZGWESMXV4iYoOExgUEhAWEgAAAIUADAAGAQCAUwABA4QAAAAPatX+aw5RAGIOgSNXAGQA0gwXDQb/////AQIQQAACAP8AQABAAAAAEAAAAAARERERAAJhAgBDAAAaHRseAAAAAAAAFDIPYQAAHyIbHh4hHyOHZUMh///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Y/9sAxQALBwgKCAcLCgkKDAwLDRAbEhAPDxAhGBkUGycjKSknIyYlLDE/NSwuOy8lJjZKNztBQ0ZHRio0TVJMRFI/RUZDAQwMDBAOECASEiBDLSYtQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0MCDAwMEA4QIBISIEMtJi1DQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ//EAaIAAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKCxAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx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nkbYk+tayKjquYXB2j5x3repfl0M4bjZbVeSpwSOpFUHJjkKHqKmnO+hU421Ogvir6fIsjFVwMkDOOaZa2s1xbQSQTDYq7fmGCeTWjM0+qLSWt7HyJcj2c1pWryrAFm5fPXOaixTloP3U5MYJNMlCsueaYwAoQMglmjjIDsB9aYZ4uvmLj61diRRdRICwkXgetVpL23lBV5FAbr81RNaFQ3KT3kbOXaVQo4Ve5rCuARLJkDdjk5zWdOMru5rUasiW1aSHR1lE4hI3FQQPm68c0ZuLzTzKboNgZeMADGP/wBVQ+XmvYa5lGyKcrEQKT2NXkuHeJf3jYxwBxXQ4prUxUmtiIqD8xOX9TyaquzbyWJJ9TTUUhttnS6j82nyAd8D9RUdtNeQ26JDv8tRxhMik9hRtrclGpXaL8wB+q1o6bdPdW5eQAENjip1KdrFoHNOz0qiR+7ionbmhCZj61/rEPsapLJhVG1Tx3rZLQm9iE3kTLhkQEjpUUcIYhktt49geaG7K7Ba6CNaTTsMWCoo7swGazoXimkwYcKBljuPFRGpGTaRUoNLUnttWhWIwPah448lc8/zqVb+OSNo7a1EQkGGbgcVhKk+bfQ1jNJbalW9wYiMdKktDmBa2Mh7N85FV5upNCBnQWd5a3EO2SeIAjn5wK0IbizhhCLcxbR0zIKgeo9b616faYf++xThf2uP+PmH/v4KB2HDULX/AJ+Yf+/gpRf2v/PzD/38FArMkW/tM/8AHzB/38FMkvrXd/x8w/8AfwU1uKV7GVq91bO8eLiI9ejis77TAVCmaMjBB+YVtFohp2I47mASLmWPGf7wrVbWrORMPceSfVWBrKtHmtY1pO25Vu5YLi1222pJuBzv8wAnrwa5n7TGtqyIw3E/Mc1nRsrq1iqt3Ybash3DenI7kVbSVIvmEseB23CtXYz1B7iKSBsumSf71SWk8SwjMiZ/3hSCzHPPFvz5if8AfQqKSeIc+YmD15FO4WZ//9n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////bAEMAAQEBAQEBAQEBAQICAQEBAgICAgIDBAUDAgMDBAYFBAQEBQUFBAYHBQUGBwgHBgkGBAUICAgICQoJBgcKCAgICP/bAEMBAQEBAgICBAICBAgFBAUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICP/AABEIBQADwAMBEgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APx90DwTH+6Pk4+YDPr/APqr6X0bw6qeWWjB3EYx29a7nRaV3qj5H+0E0pT01OG0jwkkSqWiBUEAcfrXvFpoihEwvcde9dVKhe0UcFXFxqSk2rRPNrXw2m7aVBG7djFe02ukqCGQnzCefQ12KgnBR6nD7fmk5NWj0PPbTw9GNo8vIkGcAdDXsNtp6/u2Cj53Ix6e9FGgm/e3R0Sxj5k11OOstBT5BsGVAH0r02008A7v755z6CppYBOPKu5hPNZOdpK7Odh0QIAVAywA6da9BhtFDKWTPpThBxla17HQ6jlG17X6HM2ujrsC4yCSQSO9d7BbBlUlBkEjBodJNpWOeviZKm+fY5uDSEUqFAGSeT2rtoYOflXAUZIHr3rpp0eaSb3MIYlaKOkTAh00AYbg5yuBXXx2zbUDLgEjIH+RTdON1Y0o4lQqOLej6nOx6aSMjIXIBBHX1NdjFanBfPcgConJ8qSQ/YJXmndI59NNLKdpGFIBHqfWusityq9eSep71pZpaLU41NSbnKVkjB/s8cL9QB6j3rplt/unkY4B9aVGldXmdLrPktTfc51LAKq/LnJIBPpXVCEKDlQTtJNcyknNN6mtGcnBVN7/AKHNCw2jIUEEj8K32hGzPIXBzitqdNXsjnr4icffm/uMMWY2qu37hJB9a2Qi5bgkg8j+VUqPK9Re0jWTUdLfiYBtl2qNv3m/LFaskXy8EZyDgetdboRlK6drnK24RTnqc4YIyWHXIAye2K0dm5d7cEMTgd66nTbsjPCyjHRmObVTtAwecZPathISXxkjcFGRUuCi2dFG0ocz279jE+wHI9CcmuhEII9lIBI9xWc6UnJNdTCc4uk+phrpibAw6gkEV1llArhEI/iJGazqwadrnThqihTinr+hhw6SZCowDyAMjrXb29vJv4wCFJxWElKEUrasccQ5vW/KvxMSz0rjI/Eeldxb2O4K5wGUg/Wsp2aV+p3Yfm5bM5v+zwFTcpIzwfSuxFsoj2HHOSAaz5OWSizGWJ0aijhTaBnGMZAJOO9dV9jGccjOCCe/rXc5qC5I7M86VGVRc7VmuvUwY7BAy/KChbg11SQLt2gYGCc+lTJJw5VsdEKk4tXf3nPC2RTgDAwQDXQmNcdCcEYHrUUIqDt1N6s+ZXa0MGO0Ge+Mk89613iJB5IyCOO1b1LSaSOWzpyc/smb5CjGOvp61o+WeA5G5uQaKlFRkm+hMaiqJ8uxnmyjxGNuQzdK0goG0nI28kGtqN3eUjLERnzx5UYzWQwSvAIIJ+tdAyK6bQevU/WsotS96K1NFGck0mcxHYBc/wCyAFP0rpGgVdpzjKnJ9PrW3tOZcsNkZ4XDODd3d9TmJbP+AnIyM/7Oa3pIwUDA4JAOR3q6aSd0jmr3kk0/kYK2i4PHIP51tCMjA28ZGSe1TPmasi/bU4xUYpuRiLa8qdp7iug8kddxKt1I7+4rSSbsurNIyXs3dWjfU55bMkLuB7jBre8kAjA5DDkn/wDXVSpOLVtTjjNwmm3ZPT5GMtmEbb1Bzkn9K3BGqld3zZOKiU5Tg7oqXvP2alor2MoWoVclRhzgj1xWoYuVHUZH4Y71osPzR5lsClKPKluzKFttzxx6itUJ8uck/Nggd896zlVaVkjrp10naTsv1MhrcAAEnbkEqP1rXeAYC44A5FEZpSTbuNxcJJvqYogVskZODyDWkYOrD7zcnHQUoXSv3Kr1YSmoSRTWAfJlSSpzWrGrLn5csMcHvWVOq3JytdHTLCqnDV9SFYVUgkfKwHPqcdKtghwCFxhhn2qY0NUr2OfE4+alGaV12KRhAaMEcBhjHatpYxlcYPzAk+taRp2u3uzWeIUmklayK0Vv83XOOmaspkYUgnHIJ7+1YSwyaSWw54qSjGO19g8lO4GRkj69quKAVVMH5sZNSoJK7NcNTcYv2mpWhtwVHUFufoa0lVBhQcHuB2rWELu8dmcdWqpQvcz/ALLyrADAIBB7VpADknt83FYSb3ktGTh5p/Fv5dTFltgzdMAkBvwracDC8DIySKuMnZcqNauHT669jm0svmB46Z57nPSt8RKVDYwGIJPp6Vr7JT0ehjPmpxhFPTsYgtBj5Mkg4IPat7ygy4RjnIz71cp8qSjsb+wlJ80na2yMFrZd4TqTyM+3Wtp0AUA8lSD9KmnTaWr1HUcoO8ktTG+zpwQuQGHXuK0ciMkMOueB2oqTfyJ5PapNys1qvQyJbAtnaAFK4Oe5raDfKdxBwvJI9qqi22lbqVWqxk1Kb8vU46az4wR1xn39a3p4t2SQcg4B9K66jUkpNHE+Wm7uV/I5j7MCMbeM85rdNtt2ICOoHPfmpnTh8a3MKFSVSSi1ZP8AAwja/Jkc4IBFdBHAXxztG7BHrVyircz0RvKspSVNvQ5o6fhQSDyQa6aaMfJgZI4BrCUW48y1OjDSSrci3Ry7WnHTB3D8a3hD5ZGTktkDNXTsnsKVNtuUmYX2P5JCBgg4+nFb4h3EgnCZAANWpKLUkjzeWbl7Nvd/8MYK2qqqADBGc4HWuh8kqwXJwOTnvQoptzSPSlCejbV1oZCWp+Xqec59K6AWykAknBJAIPY1FS89XuRKjGVWy2iYjWoO0kEFs5AFbZAwADk8YI7e1Th7q6Zz4qMUoyi9bmB9lUEs/B7D1rYMLuyk8MhJyO+BXVTppxXM9TCMFJ3h03ZirbK3LYPJAHpWybdjsIyCyghcd6mK2t1O2NCooqUtjHezB3Er9wDFbQRTjGeT09PeiKbV2rag6jjPbmMB7NFyFxnHT04roPsy7cMD3OPWh07Xk3qjlrRdSXPBtLsjm2tcFV4JJwD6V08drnYcjOSCaVOaSbW56NOgl7u6fR/ic6bJdoVlJx1AroDAdyDJ6kj2rnULPm8zGWKkpRcY6fmcybNEIRSM5GDW80Q3Nle5OfStnt7q0NJqUpOadl2MQWxClQucqAfathYW3HKALxg9/cVHLKOr2M6eLhOCpJWZgvbqBySV65Ht2rWlhUMoBIDMePXFEKanqjonVUounTXkc21uXcAcHHHt9a3TCAVOMZ5Oa6Ye4rHmYeTqVbT7WRhCzLYPB2nIxW0I1jQrnIHJ980o3StAmtzc6m1rsYP2SMAdckng/WtrZuXvkNgH1xUSm4/EdFXnnacVZmD9kDEDGM8kelbjRZGOS3Qmly3d49R0Kc4pyk9GYBtPuAAE5IAxW6sQI4ztjxgt1AqJtRdjB4V1JqcJadTCS0OFHcMenet+OAcdMZ61pNu6cVqd8klBzbsjOjtduzkHkkVtCIJ82c9APenFNqz2OdUXGTqQV7mJIgkVjtxzgA960NnyZPfJUe9ROCdRW2QRxSq0+aKMhIirZxkY6jtV7ymBUr905zntVypu10YYLG04zcGveY2OJDz0bZ8pq3HyQhXBA4J7Vz1FJJq2h20+apUvsu48Wy/M/UjBwO9T/wAKnPGcEjtjpWKpNtW3Mqs5p8y2uVhGqrg4JJxz3pZBu2/MfvjcfatfqqdorczeYz0d9NbmdKoPyNkqCcH09qmkQ5JXg4/P1rV0m7WWhdHEUqrfM7NGJPD5wcbQV4x7+orT8kbV/wBtsjFHs2npuOddJWjG6MYWhdSWIOwjJ9fatjbjGzjoCT3qKcJyulsYTXK1CTu3t5GC9qxUsVwyEnHoK3fILkZbPQZPcZp+xUbX/rzNqsW2oy2XXz7HPm03qTgfMQcH0NdG9srgdQQ2K6bxa02MKPuwtUje77nOSWikLwOxwBXR+SpAXGSASDWFJuN0ka4tKclNO/kYJs0KYHG5iDj3rZ8lgECt8xIyDTUXB8qOWCVakpN9enkYn2IjGBkkYIPbit5YTxznJBAHf0pSgmrI2pzkqVt7MwGs0yhA525Ird8rl3JIGRnFXB6Jip3abitUzCazAB+Xhyce1bixg57bc80V6DUlKRp7ScqcnBHOtZg5Jx8wwQR0NbrQghs5B3EDHbPpURp6JPRDipS0ttbXucy1nxuAJbIJx2roGtycLt5Vs896uFJOdk9Eb1681BQmtDlxYp90jqQCD2rpvswGGHKnqPSlUotyepzUtFaK0OYbTgOSMAMBg+9dG9ttGRkBc5z3rGUHKV4nXDEKnGXtNf0OXa0QH5R91jnPv0roPJTI4wGJIzWsIOmrmLpxnaT0ic49moAGMbWPA710f2dedxHGACO3vWFWPs1fcKVONSXub+e3qc39gXzAxwDxwO4roVtx1bk5xmtFCUY8i2KlOMaqdXVdzm/sKtjCdjmulEIPI4LHGT6mk3G3LFC+qTlLnhK9jlTZrkJ5ZHm4GDXTG1+YHn5W5NdSslewTquMY667WObNlGm1dpGCAf8ACt822Y2I55yQf4q5fq8U7N6g8ZeDil7v6nKSWXKnrhua6P7OzfNjAAxg9hXTRtB2ZzYjmk48qsk0cs1jHxgAlzgk10hiCqccYHT1oneUrRVzehSlUjKnN2VvvOQk01cBRypIBz2rqFtwynkg5yCKumpRszzlRqRiot6J7HIHTwijaufmAOO30rrDangg4wTj396K83KdrHZhowqQbWj2OOeyXIfuQQcDrXUeT0YJ8obqewrh+rtptPW50YbEtyVKS0X6HLw6btbnknp9BXWwxryScEEjJq60GrJmlPEQk7PTszIXT43CoGAwTnPatWXaCOSRgnIrFK1o9TPE432TbjG67nLzWcXPAB6ZArae338t25+taxoJPnbMVipuCjF+rOUSDCFc5wxBFdA1tknpycsAOvFaujBu70ZdKDhBRir3vqYb2a7cBQCQSR6VtLAQG5AwAAfSuF00rFuc1T5ZrXuc7/Zm9c9ecjGOfSul8oRqQVG7JxjtV1KXO0tio41Rio9U9zk5NOXeoK4QkAAit+UAiMHJPsP0roVCbg7E18z5q13o2vkcbNppUlHUbeTn1rp57cOSScNgEZ7VjTgpvXcfJKnUU6cnrueez6QhwFXgKeRXcC3X0AUg4I70KHLJu+h1xm5Sjd6Pc87OkIgLHIbcNufauyu4ACVIzk5IFb/V/eTWx5rxipuVl179DgpdKjBAKlWZiOO4966ua3Y7dxz1II9f8+9E8PbRvU6aOOgoxcY6N7nm91paFwFQYBycdq7KeEKeFGEHJPv1rgcZKLlY7amKTmlB30/Mi0/TfKjX2kJBr0xNBdVDgZUvyK82nWjN8rWh1122oyhumc3b2mFUBcr1J9K76DRyTGm3A6EnoBW0uRPlXTUydGcqiu99H5HNWtquCNvAPU9+K7L+zgjLtOQBjPqauM1ONo7FVkoTUUr+ZhwW6LtG3JdgfpXRraKm3bjGD07cVToqas2cNDFKnUaqdCjBbqMY/iYZrZt7cg52g56E9iRXRVwajo3cjBZrao+VXY63t+SQvTOCPatVF4C9iSePauWFH2j5lodtbEP4lq7pjYocL82B8xJ9q0ERdxQ5O7AwBxT9lrzrYWKklG0tHuxiW4LKTkAnH1NX0ichTnAU9qc6basmZuTsml0EiiJYKOSCpJPpntV6Irnrz1B7iqlF3sGGUZ++3rqhmxlYMBhFByf51KcjKEghiSPcVc4puzRz0ar5pQXQFGMD+6ygH1zVkAgKSAckjJ74qJwaXKjbCxfK7rQUBVO0e4IPcUhYM5zwefwoVFy0b9SZVG4OkltsG0vnORljgjsPenRuFDM2SGI49KipDkaS+RWDpuNNtP1Q51LIB1IzjFI7KVwMgDJwKys2ufqa1qd4K2zKu7CHccnPJP8AOomJ24XDMuSM9z6Gu2VBOSuzhnW5HGHLt+oyQbmLMQQcAk9qsAFgBgZHOTTqxbj7z0Ro6kHJcivJfgZbxlUIGMkgAetXmjyzAty2cVtSs2pPr+BhBShKU3v1KsMfG1xg9cjvxV+JTyrDALEA+vpVTrc1m1uZYPFttxl3IEtMlTyAuSQa3IYSRFj5tuSfas41NGmexGUEk47kUFuPlwSGB4ArfhiDKSB6fhXJKsqk1FI5IqUG/abFaKJgwHRcnJ9fatqKIsFy3KHJB71TXNq+h3TinFJOyuSW6ZVAF4zkg9hVmNwnzdOSM1hLlUuVoPZr2fNCV1/luTvATHnoSuMj+dPe4VxznGTU0ocrdtjz8bim1GLWtzJcb8Kc54Az7dRVpmiYpye5Ax1rWLjG6S1OmFKU5ptldVG0AnAwQPzp7IQp2DJDce3tWqpp6t3OadSU53URkiLjjkEYI9asxpycAD5QcDtSpScm21dGlVQVNJadylHB95mGQpIOPQdMVqKij23EfhW8pqTSURQpS3U/MxpoguT0Y4OPWtqaBXKtj5txI96uhO8bGc6/M3F+hzrKc8gYyACe3FXHiZZGYYywAwaJQ5UmjjlzKDhFvmRVJI2rzknkip/KPIZcEEYz61olGKT6m8MXOMoxl5jTuCjHJOSR6+1PP3QoHIYEZHWs0pRlaOzNIVIyg49SsE2hc5BJ5x3HpVpVLEMATyQK2q+8+Zs5sE0+advh2IAu8BhxtOOe9WgjIu08jOcjtUy96SSN600k2tJaWK7QfIMHh24I7VZdAIxjJUN0+tOF9n0OWdJ1E5t7lQxcqMAnYckds96txcscE7MADj86UZNJ8251/VISipbqNiiInVw2MqTgZ7Voso3kDIAGD6VpSmnGz1OV4XlehnqeHZgfvAGrBUOq9QeTjsRWXs7S10RVPETcHCDvIgGwKwK4HGDU5hyAMEnoPc04TUpJt6IVbDNRc7aq3/BKrnIwASVOOe9WhGMKozuBycdqLRUro0hiZKnaKu108jPCsQOSMgjPpVx0IG4kgNwCOo9639mk0kYe0couo1a5WZdhB67hj6VcMY2rhidq4I7/AFNZx5HG6QpSlKXNUevYijUkk87eMqegrSRQxC+mOfWueLvZPY6I1pSk4x2GRqoUIc5DE5NWPLx97rkge1CUlK63LnXnC1O25TRSc5BA3nB+lT7CCoyRuIJx39cVrdSXNsOhKNnzNkkS7sNgg4wRU0Y2ncRyxyRn8qwlCUveTKrYlVIxgnZrr3ARNwSMuAeT3FWd23DLkFAACO1VTuldA5KbtezI/KYkHnnpVsFiAoOAcj60qc3a8lexVSmkm2/IrhMFS7AHA4HepFwGG4kjk5JolyxS5jGHLFuTREYAxKkgDJIB7VIAZFDKQAG5J7+tTJ25UnY6E3KLlbQWJDtUMTtLDJHUU9n8tDyRkgZHbNbVNbKOxdCkoJSlvvYqyIMEk5weMUx2yq7CRk4FaRSU7NnmVMRNyTte/wCBnuu7Cs2N3cd6sFGz0AX+EiqXux5UdMv3lRtK1l95CI9qA8Y3FceuKnjDYZTyQQSfWuetzKaSIlOTppyVmVvLJDAr1JGa0oIgxXAJDuOvpWkoNq7Kp01GSbd7LYxViw4DZJXJB9a67+zAib353HjPcVbr3Sine4/q0pv2my2sctCqozqepzz6cV0T2qQ7gFACEED1z2rCvok4BSpxVRyqLRWOamiLEAZxtJGe9dC1oGGQQARgiqpVHFcr6sSoWXtKfqcubZm2MASFPJH0rs4LMY2f3cDHpXTTrRi7RRq8LVcHJ21OOa1IIJJIZSCDXWtYFiNozs5I71zPFJScZIiGEc0qnVHKLEFxgjqDgdq6M6eFfpwRnPpW07cvMxRc3JOJjrFjAAPAJz6ZrUMIXoQBk5HrUU4yteJxurKTUai3MRYFRsk4CMCua2jFnGBle+O1W5yat0HPDyTWluxjNAoXttIIIHatLyAW9T0AAppKEdXdG1StKUOdq3T1M9ox+7YsQF4+tWHjwSQMKMjB7+9OMlB6bMxoVqk17OS1XUpiIYOMZ3DAP61Z2EmNxkAtgY6fSrV5vmWluhvRqScfYPr1GIilfLyQxwA31qdF7qflUgGlTxTckkjz6lFxSu9ixFBHt28546fzq1G22MNxxkcdTWSak9D1qFnG3V7+RUeFNuB64NNkl4PlZ2juep9qr2bcdXd3ObDUVGrzRWi2Mt4wCSmdwPANXDyy8Z5zVxXJF3HUqPEVLz3ZllGx87EnOCavSRsyDgAqcZHf2pRa5/eVjkqTbuoO6WxkuijYAT8q4APapZFK4G7IGdw9KdfDtu67j+txnD2bVmkZ+wt8o5JyMHtU7DGW/wBoiqUnytyNsPUSato9tSo6sQDzhjzVkr2HA5GR3qqCSaSZM2lNN/CyntxgA8+YcZ7ZxV2MfKvf58g+lZJNOz1uXTjNRavazKhR920rn5uuetXQqhwWyVY8HuKc6UnHm6i+tS5lTi9CiIsHYOMYGa0kUDb8oyRyB6ZqVFOKUdzoo41xi6dRW6feUlgJIG0Z3A4HfAq98wYnA+XIGe1RFK9lucyjKS9mnZR1M94S2zHG3rVz/Z4A3YGPStISlq2ied8loPUoeUvGeAzYGO1XXGCoIPXnP8qurNtXiVShFpRjuZ7xYbjk8Dj3qfhXCbTgsSPxrRzkocyK9nFSTv1sVDDtG0jG5gATVoqygYJyORnvWcYqW5vXj7ODknuyr5ZOTuO1SMe1WVwcYU5dsE+tE6UlYwo4iMpfvCm6JkAr/FwRVp1y5B5yDThFr3kykoczpw33+8ovH07YI6d6vOAo5wWyevbFZKE1qtieZOSTWplrEwJwx4JIz39avrHyoxncOtXVi4tKTL5pVE7dChtI2dnVs5H8qv8AlgKAT8zE4966IaOy2M50Zypqct9kU44ASWJAGQAPT1q+UMZJUAKD+VZyknK0S/aOkuaor2X3lCRCoVucdBnvV5k+QByDtyDj69KygpbLYzp4iClzKOrX3FArt2grgY4Pr7VohN2NzEgHv+tJT5k0+hnOm20l8TZlgBSh2n52HNaRjLZU5PzE/SpgnJtvqd8MPTi01v2MsR7iXwQSeAK1ViClcnjecD1zWlSTaUTmpU2neT1uZABYhMkZJz7mtfylAABA+b061XxK2xVKuoVOaqrmQEXnIPHP1+tavlqMqMk4Az9amSS0TOWunFyjDZmaF9RnLAZFXxFsBUDJ3E81o4Wak3odGG5qVLkev/BMox7gXbOQxAz2q8QCxVgcMxIA7UVKXLyysa060Yp0+u9+5n7BtUAEBlbJ9Kuuo2ggEEYwfSuf3nK6InGnKmpQVn1M6VNzbQScDFXJI9u4oecnr3Pb/OKKTinZbmNOPuty26eZmiPOd2NoxzVooyBgATyTz2rqq0XPYidOyvUWnQpmMMoQthl5yKtFTuAUYAABP+FZQ3TvrsaSmnDkSvddHaxnNFnaAM8Dg9jWiIxyechuCe9OnL3rNXY44eU1GMXZL5lE2+9gWOeACTVsZCknPLYGP60czSskY0aU3ValsikyFFPI+Y4NTkj7uchTggVMqcrOUzenXp1JJJWd/wAjPYM5Y5znIGe9XimWA2noCoH0rNKElZKwe3lFONtGZwg+6Rkc8g9vpWgUHBIyzcjPUU9HHlep10oTVmun4mSYhu3AkEcgjrWh5O85KghSCc9vpWsKijFOJnTpe0leTt/wTJeIHG1SCMkk9qvYYfw53MSSP61vGo+W3U568XCTpyld3uZkqEkKoAbg5HSrzRKv3TtUEE+xrhVeN+e3kVytwbqaJa+pjOrAgb8jOSB2zVoqCN2CGLEZHtXVCyd2t+hyVOWMU4vT/MqeW23nByM49cVcClQqrkqMDmsZ1E3dLRHRFRqJN6Mo7SdpPG7IIParxjDEA47EH1rRK6t0KnGU6Sa08jJkRwNuQTgZxWgY1yckgg4xjrUKKTTSNqLapKMnoZBgOxQcjbkkVoGI4BA5ZQWB7VTpNtzb6mTxEIQcILQyGRvMU/wbScjt7fjV7gj0PHJpeyje0mEMTz0nKO62M4qcYA5+8c9s1adAwBGQeenfNVGLTu0YUopRUL3d9fIzmRD3xkk8dqs7Tg/UDHvQ+em1G2h2/W1NNRWxlPGSAC3ylvlB6irbL3OTg4Ge1OnGKldGLc3bmehmPg7SRhlYYx39RU8iZGAx+VietONN8yTWjPSliYOn7trfkZPkkcscgkc1pldygNn7xAxXO4tXSWh5dZuNTkkvRnOva5IBySCcA9vWtiSI8EDOMAn1FXTqpq8VqTOm4QUI6a6nOzWiAbcYU5OB3JFakqBuBydwOB2qWm7TR288X7z3en3HsdvZgttK5yTjPeulgg3jfn/ZBr5KK93lifQV6k1NTb21MdbHdt+XAAJB9a6+3tgVwc810Sq63Zytuu1zaHIHTNyE4yQcAiu2W2C5JbC5JGPaqq105qUdCI0Wlywevc86k09o2U7T26egr0xtOjlAeRSFVSQB2rqjjIyj8zgqUZ88Z9Uefw6e0pyARyD9a7GSOGwUvMwCNnB9Pam6rTSjsbRoSinJJNs5c2ToOFPB5Fadxr2kBF33CDrnPf3rONdKNzXCvkk3Fq35Gan8QKglT0PasS98V6JAXLXKknBznrir9vGceaJjJe0m1JpHRowUAHJ7AfWvItT+J+i2LKrXakoxJOR0x9a3jSk+hyRxFNScoSV+x7GjIo+9gEj8B3r5+f43+Hh1vYw5IxkjkVboVWk2gpZlRorncb7/AHn0DvwwywK5XFfPg+Nnhv5T9vUgMADkc89q6I4Z2vbU46maxq1It6RPogORjJOAxAB718/t8bvDo5+2oXPIAPQ1yqnUT1idn9p0opxbvvY+gGmQkDAHYYr58Hxr8OlAVvE3Bjklq19jNLla2ORZnGMeeL3PoDzCGKr0Y8k9vpXhcfxn8PdRfIQy4HI+Xn+tZ04TaU3HVGzx0Iz5W1yuzaPdN5wuGI2nnNeLJ8XNAl24vYxv5JLdKcVNPWJpUxNKUf3cr9j2yMYOGbJ6ZPavHE+LGhPtBvEwHyeevsK6JU5TtoYLNYRnyyXvHtSleFZiWz0PevKIvihoLlWF8gDcnLdfauSWHkldHfQzOi5JR7P5nqg2xlQeeMA+vNecL8R9AmZP9LUEHAyRxUzg5N30HGulbkXunpsaBiMrk7yea4ay8f6E8wX7WpJ64I/xpVaUlFTOqMoyqKnzb/genW0eMEnjOB7Y7VWsrqO6iE6MTGwBBFZKo2lJmtJShJprU6GKMYVd5HXivJNX+KGj+Hrxra8uVVvMGQT1xRKlOT50tDjr5pCCUJ/Fc9ojZY8DjbzkCvmu8+PnhxN6rdqNhyeRxW0MNUn7yWljmrZnGnpF6vofRZk/eBsn5Tkj/Cvk65/aL0GDZ/paYYkE5+761u4TlCyWhzYXMZtKH4H1nJOm5uTjAbn+VfEmoftP6KSWiulPzEYB6ipjgalvxJWPpxk5tXW3zPtSKXqpbPzfnXy78NvjlZeMdV+xQv0IOB2HvWeJw84e9PY6MLVdRtxi7H1xE4IUPk8gHb35qKziDRrMCfmCkH3qFThKziz0OaSbjPRdzUW225OM5PX0rRtwuCMk7iKmTto9iUlHmhomrGa0Sg7W5wQCD61rNbFwCHGQSTgdq0p1OXRCoNOpczFyd+SchcAjtVl4JQ3qFAJA71dKoqiszGrGKmopPUxp4QeQxOUHJ9auzxsRhsgDkE+prSLlN8i0NatSCp2nG7/yMUhhl89hgHt61YKPkg529vce9dKio2vseeqqjTta1ysiFiCFB5IOfSrqjLDdkYAP1rGrNN3OyjSjypKWnoQAYK4PIIyP6VYCbunR8HI7Y6U6jSd57nJ7JU4pJadCuAG5zzvIzUgU7SRkcsCPT3q3HXRD9u7OEnvqMwp2puxluMdvY0vyqwH+1ge9KtGNuZorCOUY8kvkIFO4EEbR0UdqRBs2nJJ5x7ZouopReqJpwbbdrD2UsmFOAOCD2zT1O4Iu4liSDSk9b9h18O1TtB/F+BCqZIXacI6kj1FW0wSeh+QkA9yKwxLv70kdFDDXoKUXqVwCDvySwXAB7c1NIQucHAIwD/SiLd+W2jOWFWcFaXYqMFzuHrjBpX+cBgTwdw9/au6nG7SZcaba916sZw0gJ7HK+wpyZALMMMB0Papm9FFAuSMlBLRfqPCjd3yQM1NuX5WAJ4B4rnpSlZ9jrxijCEVT1/Ow5CuBtJI6HNKqnBDdeTk1aqRbszm/s2TknF+dh6kdAOnGT29qQbhHhSTgkgHvS0lJJMzrXp3c02xyhWU7VJKk/j60qH5ehzuCgCiVK2hCquLk2tLaDQuSoB+VcADsMU4KcnGfmGMGrqtq12YVKMU4zkrtrREhXLJ1PQ06NgqliSc8ADtUzbTsjujNPl5law9STwG44x70L1jbOFOBk0+XljzRWptWkuZKK+fmSNtJBIHy4BI7HuKCCScnGeSB3qL9eppS9pzuMlp/WpCDsc46kAA9h9KOpyO3T61VKLa5ZamFfCyTSpvUb8rO7HJyQMHtinFMojhsEsMn8ehrWhUUrxZyYylGU4Tle7K7HGefvHr71dEZCltud2DzUKo9j0akFShzJ6L8TO2HKN1BPI9KuRJt+Xkjdx7D9ah1LbK9zCGH51FX1v8AmRhegXvk5Fa8ECyrnaeMkCsY1ZN2R1UcLGLvLuS2NopUMR3JINbVkmETOMLtP19cUVq0mkmhSw/JP2kduxXlzH5RXvkH2q5NE7NGMArnkn9BVUasVFqSLr0pVKcZ0Vqtzn5W4d2wAeRjtil8TK9lpdxPGSfLiZsj2p4et7Saitjz61OVm2tXoVkubY5DSD7pI96+EdY+NOsaZqlzaIp8tJiFJ7/Q/wA66cVh3BJKRlCnVUnUit/0PviK4i3R/OMZAB9+1fBUX7QGogEyZycbQe+K5o1HGdubc6qVarGnzOGp+gpeJefMX5+TivgKf9ojUYgx2A56kZ5z7VhUg5NRTudbqTTsk1+p92TTQqA3m5A4H41+e17+0XqTR+XGhDNngng812Q91OLaueVCNdyVoOPmfd7yRO52SjBwQB+uK+UPhN8VdR8Xa8LScEBVAKnv71z1MUoJ3ZvQy+Va8oprufWKFgeCccHFbMNqGjVz0wCT6104StGULyZccG1ddvuMcNhAxPVjyK0Li22FY8Z5zmphV5ne2hp8UOVtJmM+47AvIDBifWrs0Rz14VSB7V1Q5W+aWxwpctJ832X95nspHl5wCmRke5qR1dflLEk4A96yh7yUejLhiaVTVK3L+IyOIuAz5BOQQO1WEwM7T6YJ71tTinG8GHJGTdNrV7kgjChOpboPenYy0ZPLDqfTpWD5nJyfQ0jBRioR/wCGKcqbWBUA7j2qxKWZFC4yHPFae21UXoQ6EYp3V7P+vvK0aKrKCcqewqcRH5EGcqKKjV2vsszVJOXLFW6kj2ytHvKgnOTnv6VpRxgRkkkBlzjsK5ZYlRaS2N/qklDnktWcnd2+GOBndkAHtita/RGAH8YbGaqniJ8yS0NquBdSHNpa1jlZEwcdBkcDvV9ossNuCBg4NdntktkeFGhz1ouWtuhQVDhBtPUkn+96VcRcBmORnGTXPKq09VuezToKpNxbtoVI4w55BCo4APrWhsHGeAQck9q2jWsr2OSlRVKs1N81ikq4zuBPA2j0x1q8yYw2TgcHHehyU3ddC+aKSpRe5UPAXJwVI5PepGA24xliSQR2rNKKlp94/Z8sEm767FcodpfGWBOFHerBQ7VyeRgEmqg3fmb0KxkYqMG1pfoVmDDG3J7gCrBjIyeMAEEntVqtBPXVsnC0/dunbexVKqeGJ4wPp9KtFRtLNwOABVYdxvyIxxVOUaXPLUzdoBAyQRk4/nV4xBSncng/0pe0SV1sKvFRguZXe6KWzO1cZO3Jb19BVxImZQMdzxSpV1F6bM7UnKKqRRT8vaoCknJPI7Vcxs3Ngj5gQD3+lN1E5ps4UoOTctEigyhFLkDlsknv61daMBcbSVJBx6VEfedmzrxScUpPdmeyqWCngkAjNXPLBO/qecj0pU+aMWmzrVOFVqUe1jPQcq2ScnnIq3LgKrAEjOQAOtTTmpPl3POr1XQbhLVPS5UGflbgjcRnv74qw0WY9irw4AI9KtVGlZbGkOVqLa0Gbdx6nawzg96trGZF3HlMDr2qaMlDRanR9W5m6ie2pWBUgFeQTz71a8s5U9FDYOBSou92jDEVqk4xjPcolBjaD8xyDir5jVnZwME4yPXHSs6VeUlytGmGoqD1ldJlAqdmF3Fsg4PU1px2oJid8ENgkHv7GnGqotdWTPlqK7Vr3/AoxxlgUbpzgjvWr5XAx97IwfSqniJNaKzRvOL0f2TIkiZSFGN7EAAetabQEEvzncBj1o5re6+pKqpOyWu1zHERI2tk5OfpWgyZyzg5XgY75rXmTkpJHNSg0nGWvYzQhYNnIDDJBq8qYYqAcuoIqZPqOMZU5KMmm2UTGsZ3tjGRg1ceIEkMvQjg0oVNLXN604yk01ZmWycq2DyTkGp3Rgp25yCFx61opJaW3Ii41G/eKjKqE7c/N0H92p2iCghs4LLyf4vWq1T3MaNOSdpbGZIoK5ySQcHPbB61ckU72DAhHBxgU4uSjzI7MQ1JKm/hKQiz8wOckjnvVgR4IAzgAHNOEG4ucXa55mGnFVXTSK4y+cHGCOvf2qTAAXHJwGye3sK525NWjo0ZxtFxTd79CqyDaAWOEZjgUAru44GSB9a6aUWkm+ptVrRlNKCsl+JWG07gMbiQxPrU5UcNgfKR17e9aVmpL3uhdKpzfu4+voRiN9oUZJyckHpVrbjYuQcEkg1zKMYtqA4tykoydo3Kb5GOpPAGO/tVyTlUbjkAk+9NpKHNazNYwm6nItl1Mwo23jJJIUn2q27MdgB6hsg1alzrmlsc9p0rwh8T/pGesePmzwuAPenn5gMAAMx5HaplBNciViYVFGabV2VnXcRg5VScj1qULuIQHDhl69/rThTildLQ1rcsZKmt2yjiM/Moyc/lmpgmwPjIIJIwOn0p+w5bK97maoUqkk1vErhADwcgMCAO1Trg/McFmz07CoqYeLgpN6mVPF89aVOitCq8YQoSCQPTvU+dyKOcc49sUqMn8LWh00aUptScr7oqYXaDg5bI5qUq4yWyVBAJ79a1hTT0Zw4mrJwUI9HqV3i4IzgggHHbipRwhQgDLEn2FXOfLaKR24SlGELMz9gwTgsAeFHVvatB0XO4LgLg59fesqM1KOiFiMK4zU5bdjLkjOwDcRhiSB2q4wDcEknJGP7tVJq95HZRgnBOO2r+4xljyoJ4ZieB2rTZFwGwRzwBTrVG2oNHmxk3Tc46O+5iiPgLtO5jgHHStJ1YIeDnaQMdq55QjGat3O6lJVabpyd33MSSEDA4HIJPrWi6khMEZTOce4FdHs27pvVnCoOEVU+yna3Uy2iBYZB7gfXvWmkRRBzuduQMVFNcicG7s6oQc2qrWvQxZIuRkAlsDj1rRaPIX5D0C4PcjvRBJe63cp1E4r2qs1qYTxfL6AsRx7VpyRoF3YI+Y9fXvWcaP7y72E3BRi4/Ez6AtrTAGRgLjn1rr201EAYMcYGAPpXxFStdpSZ9NjKalSfKutvkZsNvuGBkMSVFbMUDLnDDkjJ9K6KVZ6OWxwUoOElyLVfkZy2gWFF2glRgmt0QJ5eAP4jmrjUUql1sy3ZJ3fyOeRWV2RwB6E+lbUlqPLGWOAQMVqmlotGc8cEnFSi3bqfPvxb1OWw0xjE7KwViCO1c18c5PJs3RnO4kADsK9XAyUU5S3POq0nWrRSWjdj451PxT4heRwl44UMxAGf8TVYp5kshbDZcYNeJjczqKd49T7qPDlCKV1ojm7jVtfuMCfUpCGJBJramhRSCP4yQM9hXK8yqJJ2JocPUXB2Wp5B4ksNYvss17LtG4gAn9a9Y+wxXO4IMAjp612rPK8koxNMPw7Rou7V27HyXeaLrsTBWup3AOVJJ+X2FfVc3heF2jbYOAQcVvT4kqJa7mb4bipcsErddD5GOm66QjeZK0WcbQTzz9a+pW8OW0DIrx4y2AMdK0jxFVb0N6mQYZ07W8j5d+xa+0m1ZZQqMCBk8CvqQeHrMFmEQIIyQe/tTefVYRTSJ/wBXaM4KMmfK0k2pWpIluJBmbGATz/8AWr1HxfoDzTKIowqbvlI7Yrto5jKas3ax49TLobRhe1zyr+1r8MfLvZVcdSCefrUl/o1xYOHkUkO45HfFbQxk204M56eS06lK8oq2q+ZZj17VIVXbfSFicjLH5axhG0eWbGTyBWUcW9ZSeppPKaTSoQS0t95uDxFqvD/b5SMHgsfxrm97DcMjByBW8MTKU7rc4sRhaKg3K110Z2kHivWjtX+0JMqQQQT+lclENoJHzEYIA65rGtVloovc9CjhIeyftIKy2PRI/GmvAKhv5AzfNyTXAo/CZDbuhAp0KjlP3uhX1N04KUY3v+B7LoHjDWpNStFGpS7DOhKqT2PNcj4MV5dbs4Uyd06j8zTxFSpThKUXdHfleGpTnZw95fkfsv8ADi5nk8KQSXE7M32YHcevTt71g+A5J7HwpEvIK2wIwfu4FfK5fJuqpt3PP4rg5wlFLTZWPh/4+65cDxDdJHKwQysSVPIOa4X41XTT+I7skkbJcnHqT0r9OzRKNKMUrXR8lwpgGqcuZ366njk2rTyMBLNJnAGSev1rEmIBU7iSGI57n3r5yM5ctkz6+WDi6cUoq/S5prdeawWWZguQByeMelYkEZJ3HLYPHqPas6iTVuY2p4erBKNlZX1NBbZmmDBjsdsgf3uetaljmZokVSGLgDPYe9KWInGNiMHh1WfIrX/A+y/2UdBM+tPO2WCtk59f89a9f/ZK0B9y3JADGTlj0Br5jNq0pTjDmPs/qsaOHStuz9BLC0ZLWOMgfJGCSP6V1lvabYQozgqMj0x1ruwMJL3kz8+x+Jgp8ij3MmCLLRqQAwyeO+Olba2mOSMB2yfce9azaceXob4TGU5W5/SxRFqTgZB2gED3rbtoCXDqMFSCCe/1pqouVWRlTiotzi/KxnRWYK8rluMgiurt7ZWI+UjdkHFVPEKKTSMsPFOo7nLSaWsvT1IOf0rtVsQjAJjaMdKiGKk2mkd0MPzQ5FseU3eiXKlnjjyg4/8A1V63Hag4Ei4B5OB0rro5gk+VnJDK6c24Tdn0PEv7NuIxgoQMHANe0XGmQMA2wDcABxWksVok0OnhIw8ux4QyNGGV+ueR6V6DrGhARlo1+cknjvXZTrxlayPOq4ec04VNEtjzpgw29PcirMkMm7A4AJJJ6jHWqqxUXeTOeMnKajBeVygxOACCXyMYqeZW3YUkuTkU41E43S0FOpKMrt3exCmSVJBB55/u0hUlVBJyDnIrBxvLTYuFR8rUlqKVUk8YRgM+ooU4GMZwQeK39nq0uoTpRaXOrPsPh2qCTnggc0zcWbJyAR27VlOMnLnb0M6KUk4xViWcEKpboFyQO1I54XJ45BB71lGbUm3qFeUZwVOBTIwVwCRwCD0FT7clBgAbiDXXRdk2jlo0nODh0j1GJuIXORtyTjv6VMo28A5wwOfSlUqOSvY3pKVNJNa2CMLuwcjACg+tSqd3I4BOMjt7msYVFKKdjrlGKXtU7yQKCXxnI2gkntTyu4ZHQ9R6+9XGSleMdDkpS5k5rcRX52kDJJyadkAKRywwSPx70RhFvlkjqWKmkpR1fURA3zfN8qsMk9qkJAUITzkgn0rWOrs9jKjOUpabdhgLgsCTkDqamZEbAZQdxJO7oRST95xsaKMub2t726diNE+6Nx2sMc+vrVmJBglslR1B7VTquyuxU6TqRbS7skSM4AC4XnOamO8SKR91SSQO9YVLtcxtCq4pQk/+ARbDxjooAPtxVlQWK4JAYj8aUG0/dWxz16s4ytJ6XKAj2gjBOw5A9auSZRlxjkHNVNuTtFWZVKSk1GRUA8vaDwhJ5PepCSXBONoZSParhDnSb3NMRG8PZJ7DwwfaNx6dCOuKbGrAhupGQcfpWEqLpq/W5nBwjJRa7FuG3U5Y85OcCrFsDuBzwWA+tSmlK1zqUFf2lreRetoFGFbOBwfTPcVZVNm1t25jgYPYVEIuT5YvXcqMZKN7aFuKELkDoDnHrTPN+YAZBz0NVa1n2Ir01KHKuhdUBwF/E47c1UgnC8Nn7wOPSqknCPLDqbYf3o3eljI8XIsXh7U2GT/o7A469Kr+NbjPhzU3D4KWzYqMC4+0T2OPNVNSjbS5+Rni94/+EgviSVVZ3JXtz/jWJ40vlXWrtmIAaZs46daeaaRutz6LBUldQ6aNsy3uIyxUZBA4PqfQ1xc2qbSByVLksQe2a8yhTfKnbY6JThNSSdux1Mtz13sfugYHauSGqibhckjIwe1H1JqTaYe0m6Sk1t26mvNIMjO47SSCe+ayxMcD5ucg4PfjgVHsJKXJe5tWm4R55LU+qf2YF83xk7HkLGGyehxVj9lhA/ip/MUkCFC2O3NeZj5pyUY9Dabg8M5SVr7n6cQgCGMn1BOe/rVqJGEURPGI1J969jL6icbvZHytTDx9gpJbvZmXNFkdyc5B9a0ZRu2kcYBBB716FGV07LVHPiqVKE41F1OTlR1YrzyTn3rpfswkKuVIPI4HWtFXhLSSuaPmlHlvo+py7Rj5RjBUZwe5rfksGb5gD1A/KijUUZN7HFDCRc1TtfS9/MwFjDAsvAGCfetg25UYBJBzkHvVe1vLmvobRdptytzLUy1XBVhnGMH2zV9YiVU5JGSMitKcYcrTerHCrKU1UW9yjDECw4x8xJPpitGBFEoQcZwazpqTjyy1RzVKkFVdRLUYLXlQBgtnGO3FbkcROxckjdj/AOtXPLERl7rR3wot001q2ZrweWmS2BtPHrW1LajaAMH69qxpu6tF6lujOHXRnA3hZpGAX7gH0rbvLTKuNpHPB9K9ClKMYpSON80G6knqciifNnk5cA57+laXlYJznGSAD2pqtGKtvcuEfaXk1ZIpmH5kUEkbskj+tXSi4AycKxHHepp0052luTUi4z54P3bakJt9wAzhjjjtx0q6hUc7TkAgVUpOMr2OB4NyadR6dPMzZbUKmeNxGQD3rUMeQGY4Ck4zTqSlF6s7KOFpSp3gtWYhiJcMOcjp659avtHtAGSTuP4irk1KPLH1IlSlFKV720M14iNoGNzNyPX2q60YZC+4/KQT7VzUJNStJHRVqN004qyVvmZ5QoHYn5QCcHoPWtCRAMDIH8WB6CupO0k1qzjcpODdrX3Mwru2/Kc8de1XRFzgknBBFbaqV2RTmoyVN7bmeUZsEKQBngd6vhVJwSMFhnFRdRTSWh0RXtKqfNtcosu4gcgkkHHerO3IPBCh8c96wlKUo3XyMVGSk5rVL9SghbADHHJ4PerqIMnGcb8kHvTjOLktLMulOUYeS6FBw3lgHIBBBNaHlnALfeB6elXOSctdmZ4KDnFpvqZ6xEggDBJzk9xV0gKVPOSRwe3uKylF3ujfDSja1R6XKTxZ2sM8GrpRXOcEASBgPU1dOqrNsww1JVK7hOPu9zPWLDh+cAgMo7VoFV2/LnYXBOO+K1fM3ZLQcKsYvke97FQq33WIKgkEjpV9grDjAG4Eg9+Kxi+W1+oqkJQcoR1sil5apGDyScYAq0V3dCMjOMf0pwVmpMyhblWmyK+3LY77eD6VMVACquT83Oe9ZtSckuhcYwcuaCETIRSOTyCfTNOVkxyAQMnHpThJN8q2Ouc3FprTyJRJudBjGGAPv9ajDAjOMFUJyO9ZVJuEXdXQsUlUnFp2b3FYqxyCQoYnn+VRsoAwOXJ4J+nFb+yutETpTilPVLUh2rkKp5Y9AOtSMioC2SMckjtSlO9ox2J9s5Q9o9l0IdgXJbjuc9RilXdgMSC5Bz+NKcW1yt6mcK0ZSU4qyY3CNt5JLkkE9sUvXoTxgmop0bNI65qSk6qV2thhgAYkE/6zcD6elSjlsuRuVRgGtopp2k9ia85yfNFK7sZk8Bz8vQk8Vokrs3cjgg5/pWSqtSSa1QuVzjKUVZdTnW3KR8udzYJ9K0Z4RhVU89l+ld9HEqS1VjCpzxcIXvcyym4sc5G0jI7VbeHa4XJzwSR0Fc/tIyjZIUqLg1NvXt2Mxo+VByCwIA9KvFduQeQWBGPWtpcyWhvTxDlSva1jHMYUKCQSCCMdq02j5IVslmJJ9M0QrqLVkc2GoxhTbtdp3RmiM/exyFAyfap3PGSTkcAjv7UpttXZipU4SdndsqFeMEk5yc+lSsOEU8B3GPx9aMPLmje1rHRGo1GUW7PcrlQFADfIBkAVMYlVSNxJzg+1P2qTUYmU5yqUuaWj/MpPjYS3zHONxqR8hsYwoIPPartGdmzTDxlFpyd2QsOU4JwxyBUvz888KSQcdamo202kKjFwmuboyntwTg8nP4VIV6EZyW5ApyipxXNuEZzpzbb0ZTlYlgOQAuSPXFTlV54JYEjHrWkaCi+axUYTjKzlZMqK21TxjOCMe9WCPur04Jx6e1c1RRlO6MVRSXKtG/xK+NqYI6g8n2pcEqMgdCM+lTyN1Ls3w1RqKi9r/eQtwEG4k5yQPShhsWMswO5iOetaU04zbTKqJtLmW7GtsCZycNyAB1PvQTtHJJBOSa0jeTSexxVYThzTT0IyG2EOCctwPWpwrcAg45wD2omotJvQ9VVGouSjfQqOXLfMBlwMg+1O2lSM845//VVVFFWujkVPmioSlpv6EG3AI65ZiRUuz5wAR8yk89qU4KKTQ5NwjZary7FVl3evZfr6Zq66cdSFLAcd6hVeZ3FDCRs6kGZzIkZHygh8A+3pVyRAwC55VhwO1E3ryvYijZaxerZmgbWQpggk5NWCgVQcDjcQO9XJRcbXJWIqylzT0UfxKBIwWZeMsMd6ftHygg4Y8Vm6a5bPcuhWag4yV+xn4yRJIckScZ9atsnADZABHP8AUfStHHma1sdDcYxTa0/I+t/LVgTvAjK5yaseSdgVchBwQfSvhqcUmuY9yvWi5XflczArLyOhcE4rVFvgKGBLbc5PvWsaiSaa0OeDc5pylZv8imVGDg47kiryxFMEckYBYdx6VEZcvu9TulUlFXSTXfqVNoKEYxgcn096kdRsdCT2Ix6U54duSUWRN81NQufFfx7uj5jRKw+fJrvviR8NL7xFetLEzGJjgZ9zXvucaNBrm944snwMp4qz0S1PgVY2xlXycjAFfUcfwEv2KERuRvGQa+MlNSlzXsfo0sI5pKTutz5YdXPyFc5GDnsK+rn+AF8ysPKfBJOT1+opQkm+V6nL9WjFuCd10PlizUxyLk4+YFR9K+lpvgTqECA7WIVS3PeplZKyZrT95qMdLHhLXEflAAgZYjIrY8UeGrrQbkxzoQAwwSPSinF7oKeIUajgjkruLznTqQQTuHemRll9eDgEdqUZNJpdQqYdTknOW+xSIELAE5AYEgdj3NXWhSRgwJAIPPc+tbaOPKjGEZU0kluZU+m218NzqCc4INa8cDYA3krkYPc1m1JSukNVVKHI46dTyXxF4TF0g+zgn5uB6ete02tpGcZz98gD+ldVDHzpK0QWCSgk+jTPm22+Hpm+9ESrEAkdQa+4fCHw2utdw8EORuJwB1rT+0pLfqddTDwm1OK1PjS5+F0M9uRChWbIY7R+lfoSfgVrAIKQMBkckdaIY6ampKRx1cshWi4pW8z8ntS8M32lSMs8DKqsVBwcDHSv02179nnU9RhkDWpL4bqOfrXowzGnNuL2OaplM3G8XZ7XPyxS1lZvmGGAwM96+7tQ/Zd1+Jg9rAwPU5HT6V6UMwgo2gzjWW1Y1E5vmaS1PmT4b6YZfEelIUIb7QvI719SeBfgf4h8PeJbS6v7RhFHMpJGcLzwTXm5pUSg5J6s9/LJtJtqzPs3T7YWHg9JCCSlsOn0r0PT9I83SYbOVQUEYBB6HjvWeSKEWp1F1Pzrie9RTpwl7z6n49fFKCe88Q3nlxuxMzEAD3r9K9S+AukX9697JEu6R8kEDua+gzXP4SWkD0MmymjGlGi5+9FXPyAfQrnYXETZbnIB4r9co/2f/DkbALAoBGSQOtcFLGqavKJ6VSrTjC7lqfkXBo17EQUtpCxwPuniv2c0f4A+GWbJtlJLA428H61lPMYpKMoNmlGlConNzsn0Py18F+A9VvSk8tk5/eDBI681+1fhn4P+F9OVY1tE4bOAPzzXl4nMHKd4x0PZjHD0opJ/0jxn9mbw62mWzCaMoQAcEdK+vtJ8JaZoO17CMIHOCAO9ePOg5VFNojM8ZCWH5I7dDo1RETgjOcgegrOmmKgqGPUg47V7mHptWk9EfH4izhZ6stSojDDE+W+RweQPaqcd0AFRmGM85pxaTSWqMfaJUrqyd9jVswuQOykAk+1UY7pEdOT1Gferly2unoKOKcXeSbO7gtFKptHOSSPWjTLpJFTJ4LADPfiuOM5Rjfc7JwjJJxV9S4tuAVKgYABI/pVvdHjhwM4OPp1raFZuyRjGgnLV2W5R8k4wBwDnI61OShKnGfmAB/xrOq00pbJG2Hm1J87uiqq4L5XIOAue9SSsDkliDznPat3NJcz0sc9LDzoy5oq6kYd9CD8xzypBHpj0pby6hjXc7gDBOD1JrX6xd6nJTipz5pbr7jj7jSYHY44VhkE9T3qjfeI9Ot5AjXKhjwFJFbwlJpNnTWxSivZRXl95zGqaa9uxdMlTkcV1REWpRiQEFcAgnua7aVdwVzkxMVJKLVrHmpXaO+Rgc9zW3qdiIZMA8bScV3UqinBTscNSDjNRehhgZZQOCOQRSAnKEYwDn86OdSVmYYeo1Ky3GhmUJGpyCTuJ7CoXk2sSePmHPrRFRS5nudVOok1Tb0LWR8ig5CnjPcmqP2m3RjlwMEEZrllJQbfVmft2morXl3+exd+6N3Jxzg9qxp9eso8q06gggAEjmumMk1dI59VJVXLR6WNxRtU7SBk5+lc5/wAJLpY+9coADgHjjFZTcm+Zm/t0o+yg9Vr2OmySAyjhic5rl4/FWj4KfboweSckZHtVOolZWK/dKl7stUdUGGwHoc9uo+tc1b+JdKY5N5GM84BHIPSsHVVk+5nhmpXTOmAztYsCwrNi1azl2COYFS+eP0pyqrmtF6HRKo+Tm+1+Zro22QbmIBbn6VVW6jl5D8g9PWrc048jWoU4uFZVJbSLoU8ZHHWpYpFwvUZUHjtWkKsY+43qa1ajUU4rb8SVFDkjPsQKcmSByQTk8djVSvyqMTLDqTqOVrLqSqnAB+8Dnin7yo3YGckfSuapzqbbROHVKLauOxlQM4wpwR1FKGTI2vu5PB7VpTgkztfs5wSgrFU4YngjaxHPf1q3xIMhep5z2rVys1FHBRpycm21p3KOHVjkErwCT3rR3whQemTzn+dZvEK3LJbmkqSjafW5UaFlCbScA5x61Vu9ZsbVd0soG055NZ4aclD3lqGYU4qer9DYt5AAFYAcZ4rzi78eaLbt/wAfKDaxzgjn681MU0tFqKOZ04wtJ7HqIuIgpHoB+npXlFt8RNClKKb+MZGeCOc+lVyTi2pdAhmdKfLFf8OesfaCVz0O4ceorhbTxdpd1sVLpW3cArjn2FZzqqMrWumd+H5XON976HZtcFtiqfukHJ7+lYgvYZoQFcA9AR1A7mmpJSUUtzyMTSVSs4uW1zE+IWomHwpq0gLFktHAA7nHSuX+J9yV8I6wTIc/Z2I59q78DSTmlJbnPjMQnyqX2Wj8dPGetXEmtXZZznzmIH93J6VynilpJdZu3V8kyEgHvz0NdOOiubTRn1NCu01Z3jYgbUGO0M5LZJJPas2yt5bhmUAKMkZPevIqqKfPJ6nqU8Mprlm7KWh01pd7nUckKowfWrVjYbUGW+Yg/hXLVrpLl6s6XN0Icsdo6G7GyYy4G3oKgVXQAjBRSBx9awqSbTitzLmi6ak9n+B9kfsqKP8AhJLgDJLRqMeo7VY/ZNVm8QXMgGGUqSR224xXh4iLUopqzPRxcF9WaTuj9NItzQgDByCAPXipoeIogWJxgD29a92inypJanyNbCykk4Sv5Cwxhh6gnABpjXQtyqu4AY55q5VJJOyIjTSnyyd3bYvxQLhTwMgA49jVZNXtchGkHJwOalVFGTnbQ6pScYqEt+5fa3DgheDnIHYDP86i/tS1GMTL82SQPc9PwrFVovWJLgoJSlrYoy2YVgMgEdj3p1zqlowULLjBAIJHFbJpJJHNyU5Tbe5mPbqOM4QMMgU6K7t5HysoIJ24FdCm9pPRl1Iprmjol1KZtXARlJIbAB9K6FVRtoUYw2TjvWqqtLmOWd5y5FutzMtst8vowya1Fh2tv4yM5x3FZSnpZFKClJSUtSbYpG1SSy5OT2qKW/ggTBlUcdM1yRUm00zb6wrKK6FS6t+vA5JIxVKfWbTb/rVG0kZJHNb0sTbRsyrTcJqa2e5h3Fu24KuBlyenYdalbU7WV8CZTliSxIwa3jiYtctjgrWnLng9jKeME5D8ZIIHfNTzz2yn5SAWbOf8KuUm7RQUq0VKXMisSIyBuPBH4U9WXKtnIyBkmt/bXjzPU6KrnJxcfhYZLAbiSQTg+vsakjQ72ByFxwPWpbSakyJwSXsVot2Q4yCx55PFTmPywMtnkkgfhWtScFO0QlUc4Jr5lTarjG0HcOR61Nw6FVyAVIyO1YtNu0TWDlL3alrdCqyndnksTwfXPWnEAFRnheQPWt6lNNJLU5YpcvJIq7cBgWIJBOfT2FWZSBkdGIIBHaqTTjzNEc8nNRtptqUZCUXABAByWx0z2olKjGAScFsVMIaqbM8d7slCD1Y0EM7BOVwGPp7GoXuIk3NuxjjjHNZ+1V7Pc6MPKMFZ/MkUEOrEYBXAHp7ms46jbKVDXGFRgSB1AP5fzq5T5mlEwjKm2pTdtdu5obiR8/BJJBHes77fakq3mBju4ANaQq2ioJaoavKvKaa5Wt+xcZWZlHJBYA56Cn/bLSSL5ZQGJB5I5oeLUU1JbnPTpTaSg72YnI2s+QVQg47ilNxEd2xuwwB6+1cdOcYySZ6mGouE2mSqg+QnhDgketWoykhiIbhTyfWto1FZyl0JhUXPZarsVXh+ViBnZkfQVaJCA7hzuJOO9VHmUrt3RxTSUpJXszPKmN1XrnJz6VOzhjuDZ6celaSxLm1FjqZfBfDqipj5lj5+UnB9KcxCDJ5AJY+9RG8U3uy4xjFezirxX5kARskDqynBPt0qwh8yVAM/Njj09TTpTkocy0aNKOGjUcud3Q1QSEPO3IJP061aQBETJwMAA+n/AOus62IbaSR2UqlKEbct2yjI4XA55YZJqd2U8bRjjHvTu203sYVE6kVGLsVpHKg5JJzgZ70TA454IyMjtVRpOLuzilOMbxcdSqZufk4BwBnoKgllVQAzAMMDP16VammrW+ZrFcy5pStbbz/4Yt+aCgyM4yMj2rJOoWybSZQeufasZ1Yxt3ZVWr76mndKxpCXKuWwRuAB+vY1hnVLRFbMwG4kkE9at1UpKSHLlk24uz/M6BX2qOeeFOe9Yq6pbSxh/NBC44BHXFZxmlO8mGIqKT9nCN16mvtXg9BnJHrWYt9DIikOCQSCB29qIyc52e5hOrKSaT2LJRWUg5LZBGKhWdGKhMEDH4Vo42k7Fe1537LS1tWNSPcCckgOSCO9T7iTwQdpwFIrXncHeSMatWmkqfQpMCik4I3cHdVlzgFQwJyQT61nKL5eU75OKp3gtjN2qhbd91mAAH61KYmAHzEndkH0PpVUouTu3YwounD3ZrdXKTxZdQc4VSeaugg/N1xgECtFNXdkZ1sJKMYzk7roZyrgfNyTnn1q3JjaoGQCSM/XoKqM1P3mZUp8j5ZLRsxpmYBgxyDgj3q1LHjb3JGMCuinVhdO2w66nZRluzP4Cg7iRwSAelSs24NkcHjPpWLqxcvJm9KlFRc3Kz9CNu+BhcjmmCQbQvPUg571UnGLUm9DClTc/wB5DUj6cMORkg01pAMDIYtk5PvRXrKSui/YXnaWlrfiI6pgAPgLgsT3NV2wSAOjAkj0+tZxi4R9pc6amJlUqKCj7q6gSMsOnOB9ahLDLZJJQZwe9aubcU2ZYms21COjT/MhkXcqrjncSG9PamhmYqcjIY4HpWyUVLnaORqfPGmpbskCjbnHycAY7U0SAsowQDjkdqxq2ilOO52Wqufs3sPRztQjJywH0p4ibOOBxnApVLWXKN3UOW235si3HaoLEjdjP0ppDHPOcHBHrWsm1KyHKThTUJra34jo9jFiFOGJHHaogdhByMHGAO5pXXJeW5z4iXsZOMlp3JjyMZ6HgjvVcneOCVVSQc9qiFPXYzqNNR10YrlVVcAgEHGO+KIzhVwMjn8KiS5m0kVUoS9mqi+H8Su0Tk5PJIBwO9WOCvPILADFVCTT5Xrc5qcIt2gnZ9SiwUIB7kkirL4+RAOCckntmlzJyV1odk24QtGN7sz3DELnGckDNWJMMUEQyyYBxRF2fuo6q9P2kE3KzX4n19EF4OcA8ioFJXb1GMDaOlfC+zU5XueurRTqJFshSvrnPI7CkVguWBJ3YHPfFdUoJe8tznhPmkpuOnYo7nUtHwNwJyB0NErKOPQ4OPWrnKDlfqZYLFtz9m1bUrtwcliACOfWmAnbtJOSCuPTPpWsqttFsdUsKnNtvct7Qy5cA85ApkTnIByG2Hk9qwjSSd3r0OipSdF8stmWQiAMFHQgew44qNWyo6ZyTgd6wnTUXytnViMfTcFbfqI/X1JBH/66YxCHf3ZSSSaiVOLlddDB1XBe2i7qRm3aqFPGCwPIp126pC3IJILfT3pqEUtVqRiGmlNT8j4S+NcitqDL0XcR7jnrWV8YpVk1plL5G9sH1r0sWoxoWua8O8spuSV5HhLJyzEnKHK5HBpzPxIGJAJ5A7V87BRi02fWU4yhJ2eg4MSV6nbk47fjVR5BsUhiMynr2FY21sjqpzd7tbmisqKTljsyQQOp+lZyPwA+cE5Oe9aN8yu9EY1qkoxcorU24JAskbBsgODg9ayUlbcMZAaTIwfyAqo04tXRyUpummnqz9E/2bYoruJJGjAIbBLdwQOKpfs0yPFYoTnLKMDPevOqU+eqrbHp5lifZYZO3vP9T7iGmac4/wCPdcqFyD396gs77cYlkBOTk+4r1J4dpJo+bpy5kouVk/zM660mzQZWFQXABOOeK1bj5sEH5SQcH6813QtFWtozjm52UG3dHDz6Val1Bt1Cjpn+dbVwoBHc85PrmtY0qcbRS1OOpUqykpKVmjzvX9EsjEsqW6B1Oc4HNdFqAxG0ZOc9D3NdlJxtyyRyV/ae0U3o1ueN6hqlvo0RllYiNGJJHQelcD8cZm07wpfyRZWYI5Uk8DjivawmFjWkqaR4uZZhUoSjJ7NksvxW0CNihu0AVupP8q/I7V/FeoyX1wv2l1CuxYKa5sThY0nZbnf7Kq1eOz1P1avPi74ehkH+mqFHJO7r9K/KjSdWu711hMz4kdd2e/1rnnKlFe9uaRybEP34uyfU/X7TPjF4fFurxXSjGcjPSvzw0SO5igiQ3DHOMY7V5U8ZDn5Wj0llFWqm4S1Vj9Gk+N+kRSjbKMkYU55Jr4Z06N5riNixP7xcE1lHEUlFRnHU9HB5LOfM3Oy2P1f8G+KE8S6elypOHXof4frXDfBSydPDtqfmIcAknvjFcKxqlJrlsdOZ5THD01yu7S/M9R1vMNpJPHgMsbEY9cUviaEx6ReMFx8jHA78cE16mFjGUlB7Hg5hUlKgufR9z458QfGe60y+ltC5OyTAH414R4ztQ2uXRYknzjgHtg1pmFWNKVoq6Rrg8op1aS55av8AA9ps/jreSuhAYckAjODXz1HEyFNhABbOK8tYmLg0lY9Shk0JyUoSdtj690342XwwfmARhx6V832Nwpi2/wAWBlqx+sN2dtTs/sqnB8kE7/gfUZ+OF8SqhiXLgFQf/r183xyKk0BwOJRgetazxDbUluceGySlGo03Zn6ReBfEkmuaJFeXBIdl+YenSvDvDvjK28PeEoB5wEojJyD16dKzw/tKs7LuPOHSoL2cVeTSse1eK/HOn6LFI8k4DRrkZPXivzv+IfxDu9cnlCykRh2AIPWvedGlFLnZ89QoV6jUorRHqXjr48vueOzlO4fxetfEWo6i0pKmQDDHGOlaUpw5lJR0ZTyj3uWTb7/M9Gvviv4h1DWLdDdkq1yrfKTg89K8o0VPtevaegB2vcqB789TRi8clTbij2soy2nCpyNX9T9YPButSy+H7CWZiZDEu4/Udqw/C9tJDoNjGG+VoUJ96wy+m3Tcm9DysyjF1eV6NP8AM6e7vXuH3FgV3EH1NV7kRWlo9xIcImDwK9apJOChHc8qSVOftZ6Iyr2aO1jZ3cKBlgfTFfN3xL+JJRLjT7F+QGBI960oU5O0qmiOerWu7YbW92zb8Y/F/SvD6SMblco2MEjqK+DfE0WoaxJI8szGOUng9605sOo2lqi1lmKqXlzcrt2PSfE/7Tsm+VbFiFOQCK+Ltd0a8sp25YxvLnceg5712QlTck1HQiHD8YQvUm3J+W57Zqf7QfiW4dzHdFA7EjGefevm1g4BDEblDEEfpWk8Sk+VJFrLackqc07ntc3xn8WyBWbU3yQ3CsduB/WvFU3cZJyCT+lHPOLtI0o8N05u0nt+R6qPi/4sJV3vm+UnHzHNeSybhuVsbTjaPeohUlODRp/YmG5lCEfO/oetw/GnxhHtVdRc7ZMqSTwPSvHjl2XcnIbKgd6mdZRW25tTy6nV/dvpt3PpvQf2jPFtgwEt4z4wCMnmvmmCJiATncHJAFYSlFy1V2aRymmpcyXu/qfo/wCB/wBqmG5khtNYfDOwUMPX3/8A11+fmmb4mBBwVbBUHge9cVaCUrrYxjkkY+9GVuZ+p+6XhjxvpniK1hmsbpXMgBIBGRX5VfDr4l6x4P1C2mS6c2gkUGMk9OK5VNwfOlua1MpqK7i72eh+zUDPtTDdAOT39682+G/jqw8ZaPbXsE4LyKAy55BrshiXOPM2eX9RlRnq23+B6uuSQCcqCAR6etSKq7cq2PmAPvWsKt0k9jorXm+a1nsN25cDJ5yOKnA8vb17gH0rOdSLaaFUy6pCfNJ62+8jJxHnkgE5P4Vy3jDxJD4f0q4upHKlICwJ7+1XChOT5YHDOpGnFc62OK+IfxH0/wALWk8kk43pHwuevpX5rfFXxxf+J9XuRHK/klnXr0Feh9WhTac1r1MaFCvWm7S5Y9Dp/H37RGs30skVjcbUJIyp5A7V8p6nZzDL5JwMjHU+tafXaalyxWp6FHIHKpF1r9V5XOgvvif4ounkZ9Tk2ljwCevv9K86uNOuXXBVlJIPy+g70/bucuW9n0KlkNKmm3018jsV+I/iNQoj1OUHeQSCef1rgJIDHywOAASD7UlWUm09TFYOnShCol1Pa9E+MfizTpkeHUpQEYHBJOa8isGJkVeQDwoFcVSrJpNqx7H1anKpzrV6H6G/Dj9piUzWlrr877ZcIHPRc+tfBsontfLYSlV3Alh6dqwpyctEYZllT+Om9V+p+xPjjxLY618P9SurW5V4ZbQksD04r8z/AAr8XdQ07w/qWgXkzvb3EIRMkkj6+1dWXzcKtmzx81wbk6agtf1PONXdRqt1zu/fHaD1+tYUzyXuoS3K/dD5Ujqc9arHqFRNtn0eFUqFGE3vs/NHa2Fvb7A6qQ2FJB9aNJl3feyW2AhT7V89Ugk7bM9+pU5ny20tdM6FLchIyTjB6Ada1IBu4wcsRkCuSVR819vM0jgo1aacnqnqZoCMAqZ5PXHSugitA+4Kc5IyD2pTq2mmth+y5abmo2Z9cfslWv8AxONRkPJKgYHbArp/2TLQC/1BxgElVGOijjmvKxclKok9Tsq019XjOHTc/QEMgRFChd3AA7VpG13Rhl54yMd+K9ehUtufLOElZp9T5e+O/jK88KQWUtjMVBQkj+8SetcZ+1VAV06xwT/qiD7YPU19BhFD2cm3qzhw2Fq1sXzNWWh89H9oDxJzGbk7AxwB156mvmWU5fcGI2nIPrXlVKibuj1cdlkYw5lq9UfS/wDwvzxOrBY7lxyckZ59K+dlcrtOSN4wPr61y/WZcvMOGUQdOCaakfRK/HbxQ+S0zNJkk4PJ968X0ixMg3kk9wx7UPFNSUupvLJacVaaPpnwx8avEV5qlhbTSs0E9wqkk9Mnk15H4Zt1tdW0+STIjiuEJz7HrXHjcTUnG62O3Lsro005z2P1k0vUYYdGtbu5ZRviBJJ6HHNfHnjr4rMNIt9N02XGIFUlTyMD8K6MtouUf3jtE+YxWMqVZN0Y6J2PV/HPxl0nQWmhtrhXlj3EqD97HTvX59ajeXeo3Ek90xdpGAOffpXpSrUqaUoq4sPl1XESSTsj2bxB8fNfuGK2fCGQsMHrxXz5LCz8fdDNgDuc1nUxqnFuKsejhMgiqictY31O5u/i54qlbeL1lwwwBnnPY15pMhcKD1BA+vvXPh8VNO6PTr4GhKonFI7V/jd4rsAJFumkycBW6AD868k1BWJC7RtCNgntXTHENuzR5WKyqkldrVvWx9GaF+0neK8KapGTGSoYg9Pcewr5HuIZFgAdDuyAcds1tLFyi3FI8z+x6WIipqWiP1x8GfELSPElnbyWtwjOyqWXIyDX5g+C/G9/4Q1C2urSdzGkih0zwQKmNe+qRGDyirGTlf3T9jYZi3IYkHGMdq87+HvjG28V6NZ3kEoYzIC2OxxXRQxMZrTQzjSmpNX1PT1YkbT36e1QZOVAY9CD7Vva6vbc5ljG5OX8v9WHbSTncdpIx703zMICWI5xgfWulUvd5GaUq8ZT9py76kci7RluTjiuD8deN9O8J6XNeXVyAY4iAGPJPY1VOk7pxV0c2NzFKTjfZfma+razaaepa5nVWUk4yO3btX5TfFf9obU9aubm1064ZYWJwATx69K655euSzdmcuHqVa7VSKslv8j7Q8aftB+HdBaRI7pSwJAAPFfjxf69e38jyz3DtuZiQScH1qJQpUnySV2dFfKq1SKm6ll5L8D7w1z9rNd7JZ5dSwwVPvyK/PVHDEsrn72efairiIJWjExy/Jvec6kmvI+zrn9qPXZnYjegYkDHU/WvjVbr5QMgsr4JB5Oawk4yjoj2MRlMYJTk9ND67H7THipJVy7FHwVctzx/T8a+SjI0jBcZ25IyelRhZTUE0tCMRlVOULwT9D7Usf2o/EEKgv8ANtwOOlfFommJZASNgADD2olJNJSWhzvKaaVqbaeh+g2kftWsZUN7CykqFLKe9fAKTyqHLfe4AbPX3qak1ooJNNm6yROThKbXKtO5+ufhP9pDw9qbwxy3YSRuoY9favyYtdRmt5EkikKyq4YMvaspxSi0zmwmXzlP3Jddbn7y6V400zWIEnt7pHLjOFI49c1+Ofg34x+IPDd7G0N+7xRyAsrk4IrGlNxenY662Cnz3a1TtofthDdrL8ynK4J4718z/Cb4y6d4vtYo5Z1W7xho/Q+tRDFyTvbRnLW918l7SR9Mu6nCsDkAnNVbe4W4SN1POeprSFdKbfQmjQTjdmhFLhdwzywz75qrukyOm7Odp7Y711RjKc3bY7KbpxjZ6W3LrurEgMQVUkj0PaqFzcRQxLLIMKAcg/1rnacn7qDFRp01eO29xtxcrAhMrgDcCMdq+PPjX8c7Xw8j6ZptwpuMNuIPIr06WElUi5Sdkj57E1JxqKnRTlLfT8j3Hxf8UNB0CCR574GRCcrn061+NPiz4i6z4jupWur1yszjC5PIz35qo4ajSle9zrlgcVi6dn7r/I+7fFv7VGn2+6Oyk3IrYDDGa/NppjK29snHGD2NJ14JWijpw+RTlJKrPVLtofWWr/tSa5K0gtmb7xPHb3r46dt5JBOBwR2PFSqqcr2N8Tk+GnJRcm3psfUh/aZ8TyMhE5A3YBJ5PT9K+TGEi4JO0kkAe1Uqjcm7Gn9lUqilKTtGKsfYsH7TuvWzK0vzhSQM/wAVfHEs7bAoOQeDnvmuaMXKV0hTymg6anTlaR+guh/tWQs0a6hlSCCwHp61+dombABzuU4AJrpUEp7as5amRpxVWMntr/wT9jfCX7QfhzW2jVL9E3qCdx65/GvyLtNSvLVo3guHRsFcqf5UsQ6ajy21PJp5biHJVIPRd+p++ej+KrDUI45YrpWWToQRX5G/Dz46a/4cmgt7m6eS2U4YO3vXnYiCcUm9D1FRmkqiXqfs5FOsqAFs5OQfWvnv4a/FfSvFdpBJBdKZCoBUnketRHmsoo7KWIdrVFeOh9EEdSDzkcGqcFyJY0k3ZU4OPUVcKtlyPcxxNJ1ZXg7E3ysATkHJJ/pQxLBjnaRwCP510+2bd302Jp0nODpN3XcZmMIN2AAck+pqpcyIiF2JA5JodKU3Z9TacYxtd2S/Gw2aRNxz05zXzV8UvjTpnhG1mijug10u4BVPzZx0rto5bUk+VM8TFY1SvUSu5P7rHtmra7Y2EXmS3KLt+UFiO9fjz46/aA8S+ILi4SC6dYDnAJ+761VTKFCVqktGT/aFStFSpx1W/wAj9Jtc+M3hjTC4N+hG4gkEcV+Leo+JNWu2eWa9kzJlioJI+taLCUFG3NsVRw2Jk7p2cvwufqzf/tJeGrdCPtqFewzyuK/Is3k20sdxDdMnoaJSo3vFX8zX+zcRQjfnV+1tz9XT+034fRDsvAXPoRgD1r8ljcSsQfMYMGxgE0ONNwvYFgMROChOTinfU/XWy/aQ8OXD/NfqMkjk9K/Ig39ySq73yozgngn0rNYenUVmc9anVoxjafvPRH7V6V8aPD960SpeRln6EMMCvxr0/wAQazavG0F86MDggZ5qMRGhJtJtI6cPRrxj7O933t1Z+7OneMdMvmUw3AO5gDk/yr8efDHxj8VaNcIpvmkjTDFWJAJHXNYxwvLTfK7q50J11OMLH7bQahDOoKsrBgFPPU18H/Dn9oK11F7e2vJykpYAqx6+9ZQw7SsebVzGtQk4zXvXR99uI3ACr1Ixj61xvh/xNa6vbwPHLnzMHOR3rNpRdlue1UxTxLUpPf8AQ6t1CHDAErwCO1NYsQDyRI5GO/tW1KT0kncmqlKXs3t0IMhgFCHGeQe9ISu1Dk7jnFaOonLliFSMY0Yu60ew/BABZgMZP0FRSA4XPc4JFXZJ3kznm05PlfTQkLlY+DkHOP8AGoyyAADGFI+70IFaQikuaLuY+0VGFnq9xzkE4wDnjnqOe1P3qrHkk4JBNZykpJSS1Lg6Uql5NtMgUIjBjyzMcAe9PMgXAZCCvOB705OTX7xHXRw6uowlZ9fI+rVlUAk9z271jxzADBbPOa+AhRTkop6HtYirDkba1NgSeWAuOCSQKqeaPu5xwDkVUpyvytGeHUabvL7icSZZGOQduQD71GzghQeQ2Rg961ak1ZlOeq5t+g1iRnBwcZz6elQl8leeFJU57+lUk3oYqlG6XmPUhcvnAU9PSq+5kAPO1mIxWkWnsaN8kLd39xcDHcACe/A6CqokUNzkluM/XvU+0utVodFam0lGDs2XAdyjpjPftUQcbduSVJAwf0rBVYu9lodWFpvkUZPVfiVNSO22kIGRsbPvVPV5Aun3JJIIRse9UlzSUU9zHMKUYQcpRuuiPz3+K1x5mszbScRyMCKxviTPu1m4AIILnOf0rpzajzTUU9Dv4dhCFBpvfoeWTMQd5YkYBApszMUJVhhs4J/WvBq6e43sfTQw8FFKKumRh2Lo5BK7hnPakVwEy4JJAAPoKzVmrJaijaEkpkqj76tk7txyfT0pdg35JJyuAD3rX3Zat2MFOTnaKu1uOgyGiB4VmAAHapbaMmaJWIwWBz61m7KWh30qKaSlu7H6Jfs+RtBo8TgDDBQT65q78CojFoNuOilQR71y4aTnVsyeJKXsqNps+pra4ZQpOSdwGap27fLGc8len0r3XJJ2toj4nDNwjzRV79+hum5MiBR1ycHPesUuenPGcAdj61o0oteZx42rJSTk9DSldemAQeRWb5hyBxhcHJ789KdGm+R33Noyp00pRV79CheqBhjjL8EjvRd4Ibn5cE49K3w8m5cr2OPETpuqpSX+TPl79ouEv4Mu9i/dRifUVF+0NeeR4ZuUlY4MbE++etfQZHVlCbmj5/NoRqVVHpHqfi5q88i3s/y8CQ5Prg5Oa27/AEl9S1K8miyAZ24oxdSPMnfW59hgqNSVJzmm1Yf4Pu4jqCB2xuJYAnrU2j+Eb9Zo5UBEgfII7e1eBmk6cm4p3aPbyGhKnKU5LSVrH1HoHl3EMXQhuQKh8HW09vbQi4yQmAc96+f3joe9UouE+aVnc9F0zSyLiF15Bdf59K6PQwZLi3BGfnXkdhWd9TOhhqbkovRn6A/CSA2/huyQZ2eWMYHGT1rrfhza/wDFN2IGNggBAHfIrLARV1c4uI6koTSevSweMX8vQr9uS5tyAB256UvxDjNv4dvZB94o2AO1fS4GS9ryrdHw2aUW6UZpWTdj8xfFyyNqtyWJJ3lsn3PatHXIC+oTMzHHmEY9K4MyrqVTl7H2mAjyYZOUdTkYI2I2lsnggHtW0luiFVyQCyn3/wD1VwSk07HdhGoU1JktvBsWMBSSzAYFaiqqiPBO7BAJ75pRd1ZI3hFuo5SeiKzsWZWxgdvY5qeRAnJ5HQAdqIrSyKbUXzJasr3+uag9qtpJKRHGSBg+lZl4EYFQRk5wMdPeutVpKHJE4Fhozn7WenQ891Sd3MmWPU4GelRa6rIGYcqOMY6130L21V2cyV/eg7Lax5tqsk2XIk2jdnj0q1cxi7kUEEZbAIFbuqnJNo5KtCcYJU3qzW+HEst14m01OWP2hF57e9dp8KdHRPFmnMFJxcLnPfNcuY1EocqO3KqE/a+1m9ErH6jeGtNDaVZqBgiMEA9sV0WlGK10aJ2IBjgXGegOKWDnJQsj5nMqUZVHJPTV2PB/i14gXRrFrOFwHZCpC9ua8P8Ai1rzalrFx85KLKcD1r6OFZUY3eszy3gpV1GtP4NkkeEakst7cPLLIWDuSCfTNWpSiBXUkLweepr5rFYqpJXb0R9lgcMoR5oq1zAks1Tar84Y4J/rUs8/ykDOASRRhcUlaLWp14mF1zSe55v4l0GC5jdAo3MCSPQ1e1+9eNMAnLHkn0Felh5ynZX21OHE+y5lGUbM+btS0O4s52ATIWTAVa9i8OaM/inxDa2QVmWRhu29RzxXrxxippzqbHHUwHtpRnFa9PLzPM9I8F6xq/NpZO2eQcd+1frx8PPhNomlaXavJZqZggySOTmuKOOdR8yR2OpSpS9nN+9/kfk/N8IfFMKecbGQAgknB4Ir9wI/BGjTRrHJaRlfu4wOR716McVKUXzLQ8yrjcKkpcrufgHd6Be6fOUu4isseck5/Kv1C/aH+COk2+lya9plnskjLbgvetaUVUjdPU58LOnKq5SdnpZenn5n5bW0TKxLLgtkHNdlqGgtbSM8eSwY5A7fSsZVbrlvqjvlh1GPPDr+hzsP7jfkg5c846UjpIQFZSGDkD3qEnKSkzkq4iUqfNy+6mdDYKZXR1ycENin6DFIxGQduec9/rXJiZOMeRvdno0MLSnKNSWkmfWn7O3jC40LxFFpk8rNZ3uPlJ4U57V5D4ZuZNO1nTr2BsKk6sCD156Zrx6y91zjKzR6jwsaqdGSu7aM/ZmGbzYY5UY7Cikk9qxfBl2dS8PWM56GJGJHU5FehgMQqsLSep8ZWozo1lTa0idRuJUlmyF5A9Mdqiuo3jjDDkAEjHeu2nh+Z86eqOXGV04O3Y+Rv2k/F62GlnTUkIMgJJXt/wDqr55/aS1mS68RT2aSkrFJtKg9wea+ho044fDc6erPCyyk8XiU5K0Y2+8+dUmF1IzseGkJY+xpLGxLLlTgnAAFfIYuq5zdRu1z9DlBuPsrbde5HJbLI3zgYPUnvWwbFyqBgTuwM+mKzjV5krPUhwmnae1jIFhC+FIXdsAI7n3rd+ziN025wDxnuPetac24819bhUhH2Tgv+HOM1Dw7GzSMgIIwACOvrXobQLOqKODJj8amnKpHTsdlKEEo66PoeS2Ph5lkywPl53AqP0r69+HvwX1XxQiTpCyxk4II4or5vy3i2d08sc7OD0PlS60ndB5BydinAx09q/QTUv2WdWa0E8JBkUZKgdR/9etaOZUmtHqTUyuUlyqScT8ypLOaOQRKhBYgcdsV9JeKvhzd+GNQktb+1ZGj5BbvzXW8Y4xu1dHDPJ5uF3KzR4pp2lDaJXI3nHHpXoX9n+SUUJw02fpXDica5xansdeAwErc60ucvaWvkyKOQMAjP9a6J7V0G7qN2QR/WsudLVPVnLUxcpvlkrctjSt8Kyk/eaLPHelt0d/LIOCpBye1cWjTcjshBxi5wdzRgKqyME6sAPb1qeEZO3k4IxjvUTSaTsZQhGNpW1Puj9kuHbc6hKx5EqlQf4eAa1P2T4+b9iQA7AYPbB4FebOpJVlc7cyf+zpJNH3osWVQAYJbA+nercaZCndkB+/bFe5h7Re58zHmqL3VZnwp+1rGwt7MhiMROxB9CeKuftUqzJaocHfESQe4r2aNflpJNbs5Muw8oV5Rk9eh+ar2u87gQCGxwOtdQ9uTt3YHIzjv614mIqNVG4PU+lhgoyUXU2OZgt2Lx9TuYDB7etdYtqqKrf7QIOOTWPtLxtFXudSjy1PeeiNPSoxAM5JXgAdqu2NpJtwjYDMCfYVyObfuvS5vOjypuKvc6GA5wwHzeo7UyK3kRlZWIyCCBU8qbUG9TnWFk6bUn6Es0TzkOSSu8A++K7Dw9od1r14lnaqSzMAQR69KzdW8bG+FwyhUSa8rnnv9mytICo4DA8d6+6vDf7PrS2sT3jYZ1ViPQ1fOuSyZap0qcrRdtz4NuLFgoOCGBJNfZPxB+BMuj2MmoWZLIFYlAOgxXbQjFu60RhUxSjaMdWfCk9u33n4KZP19K6bUrFYZWgkGXViuT1FVKrKnO6WhzSwsKqvF69Tz+7tc7SRkY69h71tX0SMoG8gZzj6dBWtOrFvlMq1OsoOSV7L+vuPP7mJfLVxkkHJ3d62LuEurDjDkYNOdZqV3sicDL93zRjrfU8n17UBp8Z2sAMgc981R8XafdhvnBMYJKn8K9rAU4VJc0tTzq9WScow0b0PtL9kbxy1yLrRLiVmMDhlUk87ulfPv7MN9LYfEC0gaQgXCFQB7YxXBjHClOLirXPOWDcYe3kr238z9k4pCY/mPUjB9arQJJ5KHkl8DPpxXq0a6ilJnz06kZpyirO5Dqd+tlbSTyuFijRiSe1eQ/HLxK3h7wXeujnzJRtAHUjHJ/wAK9XAYb29TmWxy43EOnRi4P3m7W7H5+/tF/Fm71vVbjTbO5P2ZJCAAT2PFfKHinUptR1G6uHkLZmJJPue1evjMSo2p04nflmSuHv1Y3cjBubgyyFpHJLPkt61UXAxuyc5Kgdq8ms5L3luz3Iwpzbdr8hXbb853AhjwO1KVJ+UEgdCvrWSjOSu0RQqRpO7V+voVX+/vLkAgA1YWNAgBU4BOKPaJe4ZVoVJv26sOijZ3jIXOcHA719K/An4St471NLi4BFlG4YnscVx4ivCklpuerGCkoyqNcqPFbDw/qF4/7uCQrKpIBHSv2Z8PfA3wpaQW8bWSs+wDJA5rCGLvFKEdjPFqgqlua6lbTtc/H2Lwlf27MbiB0Oe/Tp1r9gPE3wA8O6pazCytljuVjIQnHP1q5YuTai1Y6vqlKlJSpPXufjdqVuLeJty57Eeor1z4peBbnwtf3djPFtMEzZIHB5rd4VcytvuZRnJJ1JPTY+d3ZgRtJBORkduma0ZY0Q7sEAYzn9a2g4KSlJaCnzU4uMfmUYXU5bHzZ6+tNKBCzDHJBJ9adWMXO3Q8xKc4NRXvLW99/kd/4H8a6h4W1e2vrSdwI5QXVT94d68/VtrKMDeTgn0BrirUozb5XZmWHqqcXOSV/wAT9xvhR40g8VaNZ3kcpZniXcBjivir9kfxncRajc6DPNmGQI8YJ6Y6jvXmKKUfZze5zvDShW9qtY2ufqAgXKnacPgkjtimxuPsisQQwQk/lXVRqNrlT2GqcfZOcdL9GfP/AMefHsfhDw5cCGTbdyoQMds9D2r4x/ax8VXNz4hn00SHyrWUjAPTjvX2GGy9UaSrSeu585HDSxr9k3ZJ/efIfi/xJeeIdQlu7i4ZladiAT19a46SQOxLEj5uRXHVqSlK62sfWYfARp0/Zr7xrsSQVICg4Yn9MUzZEWYlSdh2j3+lcc6qkrX06nRhoTpu0FqKjbcBmJBJIz2xU6Qq/wB0tkDGOwxWEFGdnU2JlUqUknHV3/EgWJn2xop3Mx4Hc19JfAf4aQ+NvESi5Qm1s3RnUevYGufE5hTpJNat7HbDAqUG56Jfm+h41ZeBfEGrQiSCycrhSG2n5q/bzw98L/Dml2UEUVhGSI+cqOamjmDqNJQ/4JdB4WMXeV3LT0sfiVefDjWbNN8lrIHHzElTz9K/bHXPhp4e1C2liexT54yMqAOfaumnXai0lc4a6w6qwh+J+CF7p8trK0cyESISTnv719dfHz4Sx+FdSmaCMCBuUOOxr06OHg48yeptXcoVZQS916HxcJREAGJ+Ukk1fvLTBkAOG5BOOuKmpGM5cpwvDzcVeSUU0V1uRGwyMnGAT34qm6noPvFsfSsalOnNcvYqupyfMlZJ/eeyfDT4jX/hHVreeK4c25mCvHngDivHIWET7EU78gsPWueeHTV4u9jnzHCqrDl5rdfPQ/d/4deL4fE2j2N3BIGWSIE7e2elfHf7JPjKa6gfRZ5CWt5AVBPUYHT6VwOo4SaseYoumlF632P0WLMqrlieCMGoHGLcTDLEISM9vrXbShFx02FiqlSnacNL3v6HhPxt+JEPgvRpUW4CXcyOuM8kYr4Z/ag8Z3Go+Ir6zjmJihYoM+gr6bD4RKmm+p5rvNKc1pf8D5j8b+NL7xFqk80927+bMSAx6AV55cZaQbmJLAEY7VzYnEupHlT8j6TB06UXFtaaaEEhy7sSQ0mVGe9RSDknGVXHPrXmOkmrSep6FSkk/aLRN2a8iJ8gMeWByCPSnN+8IzkZKgY/nVTUpSTa0MvbKE3GP9IhRC56Y3E/e6fhXsnww+Gep+PNUWC1hLWwZcsex71y4jEwpxTZlh6NWVaVSSTja68rHky2rygEKcZHIHXBr9SfDn7LGm21tC1yoeTy1Lbh1rnoZlTXTqey8JTlKNaTWit95+Xn9jyhNzowPOD6e9fpv4x/Zqht7GWWzgU4BbgDsK6qWOUlqtBrA4ep7sPvPy0kV4WI64HXHr1r1Hx34Qm0C8uYjE2I3ZQuOTit3hFL3lvY5p04qfs4PVNHmEDKp37eTxzSSRyBmBbChScDvWEqTcOZ7djqq46Uaroxjp3Nyy1Oe0kilt5CsiMACD05rEWVQgAyBgEn1+lTGko3aR4VarCCcJ+9zP7j7t+B/wAXrj7Ta6ZqFyC2QEJPX9a+L9H1mTT762urclXicFSO3/16uzqRunocTyyFN80Jbao/d7SdVXUbOCWOQncAxx3xXgPwP8WNr+h2JaYlkjVTz045pUbU1e/us86WKc5qE9GfS5clY2CkZAP1qMRYClMnJzz2+lTCpGSfIzv5ZQiotbfiSZUrkAnc/I9aQqw+VMAcgkdqp009Xt0OGSjGLSj73XyG7gPukj5gMD2pdhDLx/C3T+tXFKN2y6VJ00qknuvuEA2HDckgHjvmnFQgJySeAfcV0Tmk9EZ88ppJqyIixMob+BiP0poUn5mxuyOvoOlVCoqcVFo05nWapN9XqfSkL7SN2PmwB7VS8zcq5YnDEgDuRX52p3dnofSSm5R51HVGuj7toJO7caqrJh85OGAODWyd0kuo6WIipc00XgwbBzjJOB6VV8xAc9CMkE9jV80VK7ZpXjzNaX/rct+ZwCQSw/WqokLDHQ7unpVqo4rmktArUIxkoReqsWGAYAFiCeQfSq6PgZJJBJAzXNKTgrrqXyRqc3tHZDcFTk4AVuQO9SM3O3GSBiqhKSSSLaSanFXBnCnPmHPJwP1qDAY5yQeoz2NEpe5dLU48ROUatoLT9TF8R3Bj0q95IVIyee/FZXjGSQaRd7m6xnkd/et6Ki5JPYxxkajhzJ6rU/Ofx9eB9ZugxYjzSR+JrB8XyyS6zcMWYlZjgnsM8VlmN3UvH7j6XKYctJSm7po5szMVjYbsE4APeo/LJCnJwXzj0rxrWlZn0DqJQi4q0WWFcHYFzuBOAOh+tMjGz5nfAyD9OauKWtnoYVozk2302L6OjY+YjBIIHb3qqqqzheT8wOR39Kyas7mmG5YQcd2+p0WmQ+bcwLgkeYAT7VJ4dZjqEC5YCWVQMdRzWkqTSutisFaUo3Z+l3wftTHoNlx/ABz34roPhbH5Xh+0XaQxRdoHbiufAUfev1uY8RU1KfNJ6I9XiUhfm4YdcfyFS4PyErkBxkHuK+icVKzaPl/ZqUpT6JfkQKM7yGIBwADVpASpPUggHNa1KlpKNtEccLtc0Xe5XZBhW3nAwp9+KsFMY4OAQR7+9ZUarauKfuyUEm0Z8q4jOCcc4NaCoPujLZ5ye1VK8mpR3N3OLi1Je729D4y/aVgkn0cwZJ3JxWt+0GyGFoX4LZIA717mDrOlQbtqz5ehhfb5lKSV46H5j2WjGK4cSKW3TY56/jXpEtqqSFiAPnJ+tfO4vFNzbjo7H6jlzSpuD9Cjp9rHC0cfB6gD+7Wzaxqq73xvHP4V5TSb7sqNFSaU1ZI6mwEZUKhwFIz71Hp+7b8oyWAx7Gs4ScHdFyvVhZbdGemeGVLahZwoc75VAxWj4Asml1qxG4/NOpPvjH86xrTcYuSPSwVLlaUkfpt8P7bytCtI2UKUgTGPp0rqPCNoI9KsioyBAoBPb1qsClCKZ8xnMZVaiu7JHD/FGIReHbknAdlbAPU8VP8AF0bdCljzgkEAn9fxr28Dyxk6l7o8HGSdSUKa0Wp+cWp2qPczOfub25PfNbd7ETLIxABDtkDtXlYh3nofbUZydNN7nDfZlMijgj1PatyW3IYH+LBJIrJN2sjqk7WUkZZQAKVHAfmpZDtwAMHcAAehNFmlruYVb8vJJ6dypJkomCc7sE+lNe4V3wGJOQM+lVGTSujzqajWSad2jPS1luZdgBZmbqOpNe3fCnwf/bd+lzMgMUTgjP8AFRKsoKy3PQw8JTXNKVux55bfCnVNci3GJh5mMKR1r9F7LQLSzt0WKNVZAMEjrXoYerUlGy0PLxWKpwmozV2j84bn9njWEYLHGQ2d3A6DsK/SF7JF24AG6QdutdkYVG02yMRmtOL5YR1ufnr4K+F+s6B4js7i4tWWGJ1XJHTB5r75m0+BmzJGCFPBx0rCth5Vo26HTSzuKn7Nq119x554o1B9P8LyS7ioEZBA9QBj86xfi9cCy8LXQ52e3bFetlGHUZNdUfnOb0pVpKEZNa/1958EeItYN7qE7liX81+vsa5m8kEl1LznMpOR3rmzKopT3PtcBCNHDRjFXRJczkRlgTkc81iSykfI2SrZyD29K8WlC0ldnpvGRbUYLT9SleXBSMFsnqeO31qrcFZPmGR8pBI74rujKPO5teRxRqpyUF63ZxeuT/uMFtzbjjPVaqa5FvTGT8uQCO3sa9PCVIuV7fI5cZebXM9mes/s06SuoeLmmJL+VtXB7c12H7LNzY2OvXAuSATGDg4454zXnZviU5qCeh6k5xjhpVEtdvkfpjp+nbbWIEAKApBHbirFtr2meWFFzGdicZI9K6MNiEo3PjIVHKonN2NOG0VWGzJB6H3NV4/EmlbQRdJnJI5Fa1sVOHutaG1OEZSlKcrbfccN8WdMhu/BuqRTDObdwDjocdapfFDxLYSeF9SgjuUMkkJUAEc16eXVW6ibVjixFebSVOzR+SGtaUkF9cx8FSzgcdK6HXWguL65Iwf3jHPrXDisTFVGutz6qjGSUYrfp31PIr3QU3SMUwMjAHY4rvTatIA24EEnI9PQiuKGMnHRLV/gdFXDpNy2S0fmeewWz28ixKGX5lBI6N716HHpoDqrqd7d/qKVXFxTtJXLhhVCPOpb6XILCHfNbIVJxIuAO/PGK39MsALqIKcETLgnoDmuOpVi05M6Msg4yUHsj9VvhJbPN4R0oZyfsyjJ75Heuj+ENuY/COlDoxhAOfw61hleIUalmcufYTkrc8N7anRanaeTZSOCAUQkE9sDrWj4sJh0LVWB2mOB+D9Ov419XRvKrZHyOLpKNNqW7PxZ+NMk9x4wvpVLMomc59eeRWx8QIEudevppBh2nfJx09K7M4xKdqSWh6uQ4CFGlG73PONFi8+2jYHnB6jpW9bRpbqm1cFMA+9fLwcpTbi9Oh9E5J2V9XYnjtRtRRgKCMCpFbDL+8IwQSB3PpUzg4NylqKNOzSvrqRfYo3QuFIKZ4NaUMiF2XkEYJz3pSqyUFJozcfaJxS/4JN4W0J9U1mytFyRPcIQAOlex/BTS01Dxjp4wSsbhwT256GssVipONloduW0HRheSulrY/RH4ceErPRdDtEjhC4hALEdeOa9T0q18u1gRBwFU7R39RRgaMUlOT1R4WNxsqtV3fu9hrWCBBuQYOfw4rZKb0JRv4SAa6faLmStoZe0jTjfdnxF+034Js30yDWYLcCV/v4A7enTrXtvx5sEm8FXTFRiKVQAewI6ivWwUIuLh0MKeJlTqJyenU/IC4tVDEDgKxyMdPpXTX9ntu5+CFR2AU15NW8JX6n0spqbbjt3OSawyyMFJ2qDz9a3yFCbORuPUetZxq3jtrczTjOXs5LRLQwktETqRkMR9c1rpAv/AD0J4IBHQ+xqJVGpJrqTVw6jfleqM2G1cyAE4HYg/nXQW9kwwC3J5AHaprVGmot6lUaKivap38vM+3f2UoitveycAicfjjFbv7KtmRZ3eANv2gDk9OBxXkq/tvI6s1qSnh4201PtRFZ1QZw2BWgkIHynPGcn0r2bNR5up4NalGSUah8L/tPRLLJbEkb/AC+vqauftPMv2uAGMD9wCD2AHUfjXt2SoKXQMrwUo1ZVIOy/yPg6WwJB+UA54zV6a62SdCSxHIr5+dPlnc9fm9rDmatYijs1AUFuM4BA61tabE08hZmJXgkHtXPWUouzOmFeNZJNWI7SLyisWDgOMt610WyNSNq58xgBjuKU5ytaWpNGVuXkWmpUMR3JtwHJ5I71cVGLxFSCgcAn/Gpg7RZ1VE3JQZ9cfs7+E4riM6rcwqxWUhSe9e1/APTkg8IWToADJHuKnvz/ADrC0ajuzlx9aVBcqeyPao4Uh2xoBtQAcCrzuiqcjG3INe7h4wjZdD5WOInNNRXuv7zm9esIb3Tb6GRQyyW7gDjnjtV+8XdG4XjHc/0rqjJJp3KqYmStGKt5n48/EeyWx8Q6jEMAQ3DAD0x0ra+L8IbxLqWMKv2pyAe/PFa5hUa0aPTwc+enGb2Pn+5BbOSflccVbmgw20nOWBJPauFyUZKT1udEOaUdHZRZn+TuRRkHJHPpj1q+saoAGIJY5GPeuaN1U0ZpjJSlSc07Wf3nN6lpMV7HtdQTgqCfQ1vTgDb8vyn9K2w9Rptszl71NOUf67kXwc8MfYfiJotxEoKNdqDgda9Q+EXk/wDCaaPtH/LwOT7VnmFeU4Jt6GuHwScJuS3P0zstK8y1i3EkmMAZ/Su2sLZfskB6BUAXPpiurAVpW5Y7HzrhRilCr0Pzv/a5WeDRYLCJiCwY4HfJrqf2pLZJ75IpATtiGM9s19Vh81dOjzW1ZxYPKaVau5Svbofj7f6FclpHZSQzNyR0r6FvtFhbcrKCnoK8yrmc5v3Xoj2IZb7KN1Ld7PofMUGkXDAZRsKvHtX0EuiQozLtwBgUqmZxUUmthxwEoSU4PV7o8CTQ5pGHyEEjBJ617RPpSxyKI0G1c9O1Sszm4NI63gFzXcbpfmeGvoskBRJEI2scE9/evVL2yibbuyXyME/Wto4tPTqc2CwKp3jy3/S5+iX7KXhS2tPBVvd+ViW4YMT9euf6V6D+zg8cXgLR1aQArE2MY46V87QqTnWc5Pc58/UU/ZPsfRMdssSgqOP4QO9WxPbhC3mDGeOnPFe/FxilBs+ep4pzpqUI2cSJm2YBHPTnoKoSXKDf8wyQOD2rVQjZS3NK2Yuq4pu1n95+ev7W2j2UFzFfLGV85QDjufU11P7XEkJ0zThuBfY2SPTPFfS4SalSbSJwFaTrunHZan5f3jIpK4AAduD3NVLt3M5L7vkJwTj1rhnyxdm9Ed2JnGpJNxt2K0+wqflBwDnHrTSxaMkISTyfb61y+15Z6ao2dN0qfO1psQIm5hycbckGrIIVNuCS2MA9CayqNyaaWjM6Uowq8ktHI97/AGd7yTS/HmleZJtFzKUJH8OR3rmfhRcvH400FkJ+W9QE+gzXmZlB+z9otGtD0o0k+aFt+voft7YSsbKFwCWMQGD3yO9O0H97pFq/IItwRnvWeWz1sz53G0oxpNp3fU/HD9olpZfGOpNMSdtzICPWu+/ad8OPZeKtQbYwMk5ZSRwQRX3lOtKSUb2RGAwNOnFTbvLofE0kYUmJQSyqWwe1as9usZJfICrwQOp9K8WpJq93rf8AA9yWM9mm2tHbXszOtoN6Ycn7+cHtir1uyqvI5bI471M6ib905o13Slor3JLGHyg4JBVXBIqVWzD8uRwOK5qibmknszenVo0Uqko+6faH7KWs2VnrF/ZTzBXuCrIW/jx/9evmnwXrN34c1C31SzmIeLGSO3tXm16LjUUlqcmMnOuk46L/ADP3NsLqKaON1bgqAAK+Mfh3+0JYXkdvaatN5dwoCn0Jruw75NXufNVatWM25rTuj7Zfc6gghecDHv0rhtK8Z6ZqqKbW6V84xgjg9s0RqNvnS0OufJGMU3eR4H+1B4fjvvDkNykWZ4mKEgcmvovV9F0zxVZm1vFWSBnJOea6sPiYp++9T0MHinh5c046XR+DmqeG777RKTbksWY4r9n5PgP4PnkZ/sKDgknA5NZzzPmesdT28Q8PPmadl+dz8QLjw7qTHetu3ybQFA/n/wDqr9s5/wBnnwid7CyXdtGAAKqGNjFJct7nPOnQaXtHaKsfiGNDvldDJA4yTyR+tftNL+zf4ScRB7JSS5II7e1H19W5HA76dLB0mpRl8z8/P2ZRdaf45toTGwimQjA6cYr9JvC3wK8OeGtTj1OxiCvAxKkL1Pc15OMxE5zUoLVmGNo06tF2lr0PQrlfK0Odx95bclSO/FdLqFismn3ECMA0ts6KT0ORXo4Ws4zSmj5WeCjNWUrvRM/Br403MsvijVWLFzJdMMenNdN8dtKbT/FWoErwbts5HB5r67EV3KmnE97B4KnTTi3ofLxjdShcE57Z61rABiE2YXduPFeP9ZbXJNamby6Uqiqw2XQ5x0G3yzn5mJyO9bV/buBF5QBO8Ek+lYOtF2T2MZ1J05ez2UvwMiOD5lJJGHXcParcUJOwt94vgnPpVOXMrLQ5Y05U5SpRV7apo/TH9kfSbNNAE5Cee8wHPUDHavEP2ePihH4Uuzp95IFtZXXBY9c9R1rwcRhZc127snHYucpRi17qP1tgtVEZ2sDwACfpXJeGfGOnatBGYrlSjAAEEcD/ABralOUVGUlojgp2jUcYvRnV3Fms0TI6KyshGG6VZSaGYFo2Bwc4BrqdSM3zW2Lp4l09O5+X/wC0z4Pt7DVZ3ij2rKu/A75HOK+vPjH8NX8cNDsQcIFOOxzxXoLF04wSe1z6PK+acWk0ra+p+JV9anzMqCVzge2K/Qe9/ZWmaUO0OSp7ds1OIxNJ6xeiNFlEqk03LS97H5xeUwmA5HIK+2K+/bn9lG/IkliUq/GAO1c8MTRaV3rc2lk8nVvzLlsfAkEO0EjIYyZyOwr7tj/ZW1X+KIgyHKkDj2xVyxVGCUZM1xeATjzUrJvS66mr+ylqzSRyWsjkhJeFz1xXrfwU+DN94K1CczIw8xhlj3PpWGKUZ1GoPQ+feVwpR9o3qunn3PraADyUOSG29u2O9XI4mijjUrkjrVUYWd1scatRipN3dyBU3bcZIducdqvRIwHJJAyVB7YroqXp6mNVTqSTW/crsjD7oBAyMntV4RmUBeRyAc96hqLVnudNKm2lfQynQbgT0JyPatVrYktgHCqQPajlSSSZc5wk3Si7W1MXCgEA5JPQVuw2flpwuQrEj/Cs60kppR1MZ4ebactE+p6lG5J3dAGOSPU0xEcncSdpZTweDXyCStZo9dUouKadr6GgspyoBBBxknvUMa8HaSdpGc9uKdPDxasmFOq957bXLYLFsHBOe3anxnITGNvUilSk0m0i61NNxbegqvt+bJzu/Km4yNqg/eAx6irvGS5jOFOE5pvRibzgg4G3OR6/Sl8os4AyMEEn09KqTi7TS1G0lG0tVceGHLBt3JB9uOKctsU3kMSAwHPrWVOml7qZulGnFTT3ewvBYHJJDZCjoc+tWUiYgBhjGcfj6UqikoWRtF805Qb06nnnj2TZod2V4AiJz6+1J8SY/K0OcDJHlk89/auvCUYyl7Rbo8nHSbqRox0i+p+aHiLLalNkkgSEkn+tXdbthJeXLdC0rAg15+NrxlJxaPssPhJ0qajJ6aaHMw8N5ZyEIByO3tV7yjhAPlABAP0615vLrY63Ui5xbWn+Q1UX5icbkbGKtFCNjZ7DOO/vVRuk02N1JuatolsVo4lkYFGIdACCO1WBGyD0ViCcVF3J+Z3OUo2aN3wzAZtZtEPG64UAjpzWv4FtTN4jtI0J8rz1HNVOoo07o2owTqJPqfqB8PYlTQdPXbyI1JJ79K3vBlr5WkWgVs7UXJP0FPLG370T4/Nm1Kag+Zp6o7KIZJx90AEmp1iYnJb5OR+JPevYU3ayPOVSLTT0lYaEDYbJ69TVyKLByRuK4A9jSk+WSa2IVKT5WiAxhhjr5Z6epq2YlD8/x4yR39qxpSinzsynKNSbg1ZJmf5QEZPPzZJB9qtspXkc4Y4HrW9STk9DXnjCHvHwv+0NdlJ1QE/KSpB+veua/aHuN+sTIrEhc454zXr4qPLh1J6I8HhpValeom7P9D5Wn/eNtDEEv1PYU9Bk/vANxXt79q+RdaXNdn6nRSnBRejsS2iZK8jqRirMUarz/sgZHrnisnrsZ0sNGKab00Ok0yNY3UkkMWOB2qC0K7kYDaq5BHr70n5Cpyi1yyj6Hv8A8MIIptfsUI5WZWGe+D1qL4LOz+KrRSSQHJINcuNm4U7rdnvYGipKU+iP1W8N2+3TLcHIbygAfTjirvh+5VrO3jbOVj4/IYrekrR97c+RxNVubkjyb40qRohTJzk9OoOOah+OFwosYk34JIBAr28E17KTZ4FGhz4lRcrP0Phy5jHmSANkljg/Wtie3XBfuJDz/KvE0ctT7d8zSjHozjLqEAZDFVAOf8a0LqNQoHOdxyDRBbtG3MlfmONuo8kZ6KxIIq5drtyAoKA5FVFp7HPCPM+aRyzId4wpO4kha0IYWN3AC2cyKT/QVtdNamUYttJKyufbfwO0aODR4J9uDJnNeg/CmwEPh2yYYBaLP15rjoQUnzPcnOMVSi+VaJHfPBgYPX1PerssYAU7iCxIA7V9NTTUUm9UfH3cqvubGI8G5tvU44PpV6SMgqSPmVsE0c94XgrDqKSkpN6mFJbMco5JKpnNajsoByOTk5qafuoqpKVSXNLe1mfJn7QczW/h/bFkAFgMdzWX+0zdldGSIcYyQB1PpXv5dBqDqXPPg4TxMact0fnsbqRppCxIIlOax5J8StyfvHJFeNifeldH1so22Wi0NGWYDa4LH5uSaxzc5dW3nDdQa4XC0XfodE61LmUSWaRtnBPQ8VTlkwG6nCkZPU1nRspKb2H9XjJNmNqC+ZtXpuJHPaqF9P8AONucgDj+dejTnJJyaOevKM2qq6WOn0G/utHcTWLsjsQCVPSsvSZTKqKcg7u/t2rlqNN6rSxWIaqvleiPXbbx94nACjUZNhAGATwP/wBdclBGGwU7ScmlTxTSukebLJ6TXO9rnfRePfEhYY1GQAN3Pr3rmEj3bRx8mfxJ7UV8ZOUbM9KWT0FyxSv/AME3L7xXrt7C9tNqEhD5JBPUGsgwsVVwuGUgAHvmsvrlVXimXTyqilHkjp1ZzckBcZYHDMdxPX8a6eWLcRwDhSDjuaIYiTV0jf3ovlv7y/qxziWXzjHCtgAGt8Q7GXG45YEj0qJw5leL1NIYVyjeT3MpYclMr1zye1bAgw3AOSTkDoMf41S5oWinqy/q8W+V/CiHS7fN5DhR/rQcjvW/pNvKLu0XYTmcHI6nnpRVmnFxX3lxw8XWT/rQ/Ub4UxtD4W0xT2tlBB78dK6H4b2jR+G9NUjpbqcjvkVy4FqSba0PEzapKniUovbch8fOV8M6gwyD9mOQe/NL8T8w+E9THRJIWyfTFfUZbXXtby7Hz2ZUVUUU31PyH8Wog1K7YkEiVvx5qXxMpe8uflOQ7Ak9sVxY2pUnVcuh9VH2cqcIraxw6ttyV4zyAKr3nyQkDIOcgd6x+JpIrEUYcik9u36khlUkLzuZsk/SuUe+dmAG4sGPPpmhQcHzBTlzvmcdPzO1Eq/JtJ5JBrK06Z5ApfqhHP49qmMJJtr5FYepZWTs10PrP9mm1Nz4uVs5VE4J9c9K3/2Vbff4mncOd21S2OwHSvIx0rzTaO/ltSc29WfptZQKkMIClTkZA7Z6Cr0BQpGu7BGD+fXFduHTUWlufL1YVYNSTunoRSR/NjnBx+OOlX22luDgbiRkV180eXmjujOSTi6bd5fkeLfGWNB4LvwxBwAVz3OOBVX47yhfBF4quA6kj6+lerlLUpOS3OKvNqcIw1dz8rdSjX7ROSwA8w4z146VHeziW4YAEBXbGa8mvFNyk1ax9QqrVL2U3zNsw5I8gdhzz/jVtcsxjGMrggnvXPzNO6Z1UXF+4ldq25HaxcgKCB1JH86urtBBXkgkEGsFJtOUdzR0YtpJkYUAhckupGT9fWrHcfMScgVnTaTXMDppSTgtOvkfeX7LCgabe7D+7EgZs92wKufssxh9JuW3EE3B6DqMDg1wwbVUWZKM6KhLbU+yCSU6kAvyR1NKzbUXjnBLAdq9qm23yyV7Hzs60fZXT0R8HftPzsb2A7jgQkkY6EelZ37Us+zVIRuwzRZVR717k6HPQSSscmU49Sk4TV1c+M5NjyA5IAPOew71ReWRigQgbeMivEk5L3V0PpKNNTlzx27HcafiKEMMAKBj3+tYFvevGqIXP3sEVwzld81zdJ1LxXus7TzuFwcEfMMdqzI7xXiXGCNgDD1pQVmm0FRtQak9jSicOQo5O4HA7+1ZdsxWXO4lW5wPeiMVezM6WIu0lsmj9TvgpGU8FaUOjPb4J9cAUz4LyhfBulbs5W3XBPpissDJqd30OHP4+2apwerPYJE3jgkHAP19qUgfwnG8ggjvXuS7Qep85g1UpVHCT1RSu0GyUE4UoAM9qW8yY3bBYAH5R3HeuvBpq0WdH1d1Iub2WjPyZ+LRB8T6krDJa5cj354qv8WznxPqOGIf7Q5JPbmqzKcFLbU+gyug3hlFaX2PF7rHTaOemO/tSzgHaFYYAPNeI4uUk2i6jqRkqd9kZMh/hXjAJyO1K64HIB3fKc9vetVOCXM3qjocpqKg1dMqFkbIfONwwB39aa+VyM5DHAPpxThKUlZuzOd0qaUVHvt2PT/hGg/4TXRUXOPtAwKT4Sbj410I7ifLu1BPqK5cdOT9w76NaKhOVtEtPuP1+0pQ1hb8ZOwEn8BS6EwaxjGTnylXntxzWmHjy2fc+ThUVWKm42fmfCH7TCltalUAgCJc8+hpf2mXC+IXQZHAwfX1Fe9iHGVGKWx2ZNCVOc6iV23Y+KpYvNbhM4OBjvWu6jzVO/OSCB6+teR7RRaUd2e5zOqktmjlWtmALOMksRgDg/Wt+ZNpYqxIJJPvWcLWdi6cJQbbehxF3CEXaxIByTt6ip9S6lSTwCTj+VdNODUVO+pxSjKM1OT07Hmep4WY+WQcsAAew9alubRmuTIxOCRgHtXXCEoQ5m7tHO8XTjfkW57Z4E+K+v8AhnS4LG0YfZo1AVSfu+teV2OI1jzkhnIWtKTUGqh5NTLY1bVLXl28j6hl/aD8S5CmY84OeefrXzu5QRcsQnAyOppQrWb5ioZXCMmox5V6nt11+0R4kiKtypyGDZORjpXz9OoKoCpOwgZNdNLEqFkkcVTKKNaVkb/xG+JOtePYYI705MKnap7DPT865D7MCxQAjdn8M1pTzCo4NLRHXTyikrezbbTPNIdCYzM0wAV5AST39f0r0RrEkqDknkj0zXMsRKSu2dkoKDUd1fX5nEz+HbRFAUkLnPHcV1VxaGIKVydhGT6+9ZU6jUrp6k4iqqa5OXmv+BwU3h8ttMY/iPXvivQbWISeWhOSG6f3a6KuNlFtyZ0UMDTqRi2rpasg+HWjGHxZoLsoITUIwSOxzXqXgXTifEuiuFAH26Mso9M8/jXm47FRcHfdl4ej7SreOkVsfrf4U0qZtH09WXOIUGPTjmvS/BmnkaTY8AqsQA9+KrLsXy/vDwsTl8XWVOW6Phf9pn4UXGs2Q1u0iLMYsOMdNv8A9av0D8ReGbfWdNns54lMUyFSMevSvoqeYNJpI6MNp+7ltfQ/mr1zwrqNnNPAYmIWRiFA4I9q/TX4sfA5tGv57mKz3RO5IZRwM1hLMVtFaH0VDLY35k9D8objQb22HmSwMFY5BNfYWt+CVCCN4M7ccntXKsyupOSJxGXwcf3T1PjEQSfdZduMED/OK+n7j4eWjqzeQAcDqOlaRxkWtFY8jFwrycVJaLr+p892irHHxwcgFu5r2P8A4V2FBBJYo5wR3qnjqakoNjp4CFFN295nkkcskLtIJGBJz1r1OTwIuCi5B6gegqHiKMpNJ7GeKws7RjNaGL4c+JfiPw3LE9pqUgQvgqSdpHvXDeJdLn0ptpBwhPAroo1ZuSjf3dzxKuTqdW842fc+7vh7+0raTyQ2+sSFGyEJHcdzX5s2+oXMcyyxuybXBBHf1zXdVwsZpqO55E8rqUpqU2+W+lz98PDHj3QdZgSW3vUYMgOFIzjHBxmvxk8J/EnX/D00MljqMihWU4JOB+Fcf1ZKTm2Z144t3aV0+h+68NzDc7PJdcEdTXwT8Mv2k7a5NtY65KI53K5bPWpqqUk4pbFUcVB2dTbzPvlY2dgVHGSOegrndA8W6bq9rHLa3IdJORgjnNYxxE00kj03WU04pXidKQHC4H3lAJ9QDTxIrBShznJI7Ct4WlJNIyU0oqKlo3Yz5clCCRkHg+lPmn2yY6ZOCPX0reUuVp21YTw0FF04u6PzM/ai8AzLqVzqcNv+6uckYHQ55r7c+KHgyLxV4fuYTGTOgYoPU4r0aOMbaR6GWYyLSw8l5L5n4TT6WY5SmCHQkbSOv0r3H4geCbrQ765Sa2ZAjsCPT3rHFU5TfNF3sejGi4yV9FHT7zwiSzWXYsgP3QCR2zWy8O1lVxkkfL7c9fxrlcmmnJamSy1STad+3zOWl02RuYVGFwpBroGJjAb8gO1R7Zr3YE/V1BX27o5eFpLOVJFcgq/Qdcj/AArTugkifLwAcgr1FdN1JttbnnUcK40+eMtOx6p4L+MXiTw3IiC7dosjOSea8cw6FlByeM56VUGnFNao46uTUmlUm7N/hY/SPwP+0rYXawQ6nN5cihQQxGWr84oL1oWTY7KxUgnHv0rPE8kVqjLBZDOdSNSNS1r6Nbn7baD8RNI1mGIx3SFWbjkcV+QGg/EHxFobxi1vnEceTtJPze1RQabtbQnE4XEQScdbP7z9uYLm0ulDxurNnqO9fnn8PP2kHV4bXWZiuSBnPX0zVVKMr2TMqVVuXLNNedz9HY7WMhQQCBkf/Wrznwh8RdJ1yCGWK7RvMIC8g4+vNZVEo2TWppTxTlrHXWx6U1giISeNpyCOoqaK5juI2VWyCQD6mlZTcVI7amNeHg762/Uz2tVDllXhsMD2J9auyDJQDcBk5HcD2rujRjKKaIrWnazspblHygBhhncRyKvmMlt38O08DvTjaSutjknNqfs4rYyTGcMA3O4kY9u1aJjwVOepI47V06TdkZyUZLlb90rRRE5yAcZGT2rZtogF2kjOQc+tcNVRjLQ6oczjeT922ligIijKX5G4AD+dajpuXJ65xn0rP2zlFps5p04uCVtbkSJvG1gch8D2FSsrBcg55BNTazTS2OmGHmnaT0Z1UaYAHJ7Y9BVuOPB4PpXx9Od43R9HWowgnyrREITbgNwGJyB/WtFYuQDglehHet6aUoNN633OfDySlFW917kSKMJjrx0q0VxtIJxvIIHanTg4ys3obwcY2UttbDMFsAd8ge2aEX5yqtj5c8d6qrQ0unocVGc6srLZaksQwSxB9CMVbRWwmP4SDk1nzRclFvY3VGTk09LlqKNZFBJ6tgAVagYK209AQRilNpRWmhVNNzUE+pOsCqzZ+9nHNO3Z7ksSdpPt6VjQhLS7OnF1Ixbgpao8i+LCbdBmAbHU5Pc4rO+Md1t0Z97EHBBB6CvTwOkXN9DwoOc8ZCCei1Pz01SIyXMuM5M2ee+am1C4L3L/ACgAE7T6/WvArNylqfodHCu7qN6sw2gVWZGzkSE5HarnySbHVTlSCQO/0rnvYc6UakUpPRFZotxQNgbc9O9TsVPzFecjr+lXTipaG+ikpJ6WIPlYEEE+WuRj6UyVnVsqSRtxkevrSWjt1M4ObV9+x6N8LYvtHie2RcnDqpPp6YrovgrZC48U20ikkh1Yg+tZYuVo2T+Z6GD96MquzSP088M23laXbBgQQgGDjjitXSAUsY0fnKA4HaurD0U7JHxlavFapas1EB4ZeQoJA9aXKlQvONwJFdkoWdnscdSMJSU3uIQwzl8cgACpBgtjOD79DXXQtKPMuhwvCLmanLXVr/IQRtggEgHIyOoq1FtIVW7Y59KxblH3pdTrw9SMoqDVmilcErDISCCgBGKZqr+VazsvBEbHPpgf5xRTSlJSvqXiKqhCUbaM/NL48Tebr9yGICrKTxWD8YZmn8QXqEksZSADXq5zKPIot7GXDNOUaDnHv8zxKCFncLkDfyPb61bgAWUBj3BPt9K+W51Jan1mJ5k4OJbjBBVTnCMM474rWhQlMjH3uCB1qW9LM9GDi0TxxF4o3DYJ/wA4q/FuYICMFgQCO1TTbiroqsrrlS17nunwHtXm8TQkkEo6gj19K6j9nayJ19mbONqkE+tcGOtJKHW520nUpU3N63P0l0FU+zwl+BsBOaTTW2RRs4I2hQeetenCm+S7Z8vWxzjK6ieD/HS4ES26Bhk8kH1Ncb8c9T8y/Ee4lEyox+hr1HFRw9meJkzc8S6i32PETIGGDnsOKy4rjYSu/IHb0+tfNTUldo+8TivUqahH1aMAgHIpJ5o2XlST2NdN2mk2ZSi1qkchd7svjBBByPpS3e5SVPJZiSR2ojZJJHLaUptNaFCwjzfWQfqzqTjsM4qxox36vCOSzOFI9ietaVJpJyZ05dOMqqpLofpJ8P4vJ0HTxnBSJcY7Z9KteEAI9GsQF5EKDPrwM1pl0OZJs8TOpxnUaav3OmkAjjIXJG4kH05qOZzsJByefxr1otSSb2R4EI+zVrbleZhyuexI9qrSvgEschmO0DtVwg5R5r7HPUq07arVPb9SnMxVQ27PbPrVS5kYKMDjacY7VreSVnqd1NXhZLU+J/2o7gtaxRbtu1csRWT+1FI22NDkp5POe5brXtUZwWGbejPCy5uri5J7qx8DSsPNx1G4nJ7CoZWIbLbs5wK+bhFxvNH1da86kYp6io2W5GSFLAnt6U5AQGO0Ec4Ydvasqle7StozetQ9i+ZO7IpXOOGAZTnAqvvOd4GV3kDPX3FbUUpttrU3opxopydmV2tBOFwDtkY5z2rZs186WEZK5YAkdjntXTTnKEbLU51hueTSe57T4G+Cmq+I7CG/so8B8Emvvj4A2ccXg/TVVSPOVSV9cYrycPiJTqNpm+OrrDtJrRI+X7f9nbxAqRt5TcOu4HvX6XxwR7VIUAqcD2Ndyotttszq5slBTUdP8z86o/2e9eX5RESpOQCK/R8W6A9B1OSB1rOlSVrtkRzF005ON36n54j9nrXUZCYc5w2PSv0XAt48dBngj1rFRnZuRrHN6as3H5H50H9nvW2YsICAwyQO1fouscDNkAAhsHPeppUW4XT0NJZlCbu47n51Qfs+a+Ww0Q2nrgdK/R9IYiWXIIbAJPp6Vlqo3T0MP7WXtIqdPQ/OeP8AZ51xcnyhhiQM+1fo/shOGIBCg8HsB60SipWuzb+2EpcqjofnrafADXI5oJUUAhwc+lfoXHBEA2zAZu3qKudFRs29CKWaOMnGK0RzfhLS5NP0iztpQFeCJQcd+B1rsVg+RhjKk4/OuijBwTUTy61RYhOslrc8d+MI2+DtSYHDGIjBqT43rt8GXgLEs64Y+tenlyU22meXj/ZurCEVfqfkbrsW+8nJycuTzWlq8Qe7uMkn94ygHtivOrSca3KfZU4WpqTdvI4C8tFdRnG0AgHHNas8ZZFPQrkt7UqdblbcjmrcsqV4rqecX+iyRSKyKNuQQfrXo1vZNcZZsk8HafSn9YUIq2rLjHmVpOytojirW1kj2ITjJB+vtXdyaYVKunUtg1Kr3jo9ewQw6lq9PM+nf2VYDHrt45YsTCGx7f5xW3+y9a+TrN22AW2hiD7dK8erVvUjGR6GIwtsPZs/QeGYld6kncRk+ufSnwR4QIOflB+le7RrRsmo6HxvsptWT22JRPuHyZ5YEZ7VBL1OOmBg1183PqloZQclNKT1V2eE/tAXSw+DLssQCzYBPY4rk/2lr4x+EGiJOEYn6162XvlbckcEKXNONnazufnC9x585ZQRhjnPvWdZ3SSMyZyQQMnua+ZxaTqtS2Z97RScFOLsbDbPk2k8DqO9TBQYwoByq8Y9qwoxSbi3oaSmpNJ6L8zNM5RlGcBsYB7U+W1B/ecEocEnvRCKaSOepzQkoRd7lpXJKndkAAgHrUcAfKliQSQST39qlt09GbunGpZSWh+iH7LiqNClkBO5bgnB6A98Va/ZgQp4dYsx+a5Iz6Y/pXFQgnWu9jlznERhCNOL1PrcurRD5cEZ6/SpJF/djPGcE4r26TjdNHgxlKLUZLTufnX+1HmXWYjghlQ5yPu+1Wf2nUMmvtu7Kp/POa9fEV5KinbQ6sohGVVxfVnxX5TiQyLy3JAHetaWHaRsGWyQM96+blJTShE+gnBwk5LqUi42K7EAIMkmp1XgDaSysCwPQ0qVk+RluVm1EltHYKgBLZJznse1XLcHAABDFicelKpKzve5zz5ZwcXozQsziaNW4G8ZPpmmWylbiItkp5i5x7msJzSu47HZRp2imlqfqj8Gcf8ACH6TuJDLbptAHXgcmj4N/wDIo6UwckmJcj06YrnwFPljdPTc8bNJxlWUeqPY2bpk4zgcd6hdgWA3HIUMcdgT/WvoqbTjzWPKq0YwilHUhu8GKQHIUIwJ/Cor5nNtPtcj5GKsDyOOv1pUK0tnuZ+yi6XNa3U/JX4rYfxPqWGYbrtwfbBqH4qlm8Uaiu7GZ3AHpg9fxrszaLbTuerw/XU6Si42PIpEUBc4BwcCmSBDtOw4JOW9MV5PLJbo9CtJc6i1ovwKEpJOQcsTg+1NkBGAMnoTntUwpqKUlqQ60pVL27laSNQoHAIJBx056mrKLnYNxyCc596zVTlqcz6G9Ok6kEup6J8IYGTxtorE5H2xT9PWr/wnAPjTRlHT7QCcdqzxVXnldkYSnGFOUYrXU/WjR5VFlEOvyjI+o70acdtquONqABT1Hvmu7BpKPMz5avinKSjNaI+D/wBpMqfEs4Kll8vBDdjxisb9p64ePxNgOQrKMj0PpXv4iE3QjyPQ1ySrFOSXV6ny85DDKfe4AIrONwDwrFW6gjtivnKsJNJvc9lQhze5rrYlncnGSfmIAx2qMyqRySXwRk9zUOVkktTuo4eUYtzd/IwLq1E0hY5AJANa0gwozyFJOfStItpNN6k06c4PnWsX0OPvLNCQVBOCBwOua6EQbpUGQSWBAH1rSl7kW3I46+FTnFJaP8Ctp3gPW7yBby2sXIfBUAHB9K/Vn4R+E9Jm8F6KJLRGZrYEsR14GaKOPlNWS0FXxUITUIp32Z+YEXw78SGJmfTpFbIJBU81+yc3grSACfsUe04BBHA5ropTlOSa2RliMTSUUrtpv8UfjTH8NPEcg80WUpfccKBwBX7EjwtpEYx/Z8e0c4AHauyMJt3a0IeMouHvKyWp+PU/w68QRRkixkLNkDAOeK/XCbwvpjMB9ijwTgfKOK09jJS9DleZUqlFRjFrXQ/HiTwH4kdkKWbjGQAVOCc1+v48G6QxXNmmGb0HFYw0baSNsJio1NJ69D8gY/h3r8gA+xSAcZO08e1fshbeC9GZgpsIySRjKj8hWVOLSsdizOjGbUdT8mNI+EetyNHKbFxnB4B5r9krDwZpCoAlkigcEgcmuStKpJezJwuOoS9+zTPzO8FfCnVIdW02c2Mi7LpCcjpg85+tfq/pnhnTIJYytog2HJIHX2rmrUqjXKzSnnlGnFyimXPCej/Z9IskKgFYFA/Ku2jMUECpCCFUEL7+1Z0abTSa1ONYhNOpe/cx57ZIl+YZBJ6VNe3SBRuwAck16Cm2td0efOlPnUKUtJHK654SsPEdm9teQowdOCR09q3UvAIgqt/ECfpVNOyi9zWjjnBy5d1+h8G/EP4HXFnLdXdnbmSDLEAdua+57kW1xCYJkDB84z3x1rWVNykkd1HNoqPLJas/IDVPC9xZhhJEVZGwQa/Rbxj8KtD1xTLDGEncEnAFcNSSctOhtCdKa5ZN3Z+YbaWnVkwNpJOBzX094q+EGraSXkigLwqTgoOv1rKlTXxdjprTu4wSvrufJF9p0UIDKuMgkMe1d7rnhy8tfleFgpfB3DpTpRc3e+p21qKa5Ys+WvFvhyO/8z90PmBBI6+1erapo3mOqyocPnPt9K7KGIlTpu+1zzpYWMZ899V0PkrVPBaW1uCgJJJJA7ivo268PwyxjeOQSMDtXTTzWUZp9S8Rl86qsmkux8YT2d1bEt5eecgEHivpXVPCVsxz5QCoDg+v1r1ljoPRrQ8L6lKNNRU9VdbdWfMf2yeAo6SOrBgB6iun8VaGtjPiLIQNwR3NdlOvGpC0dEeROnHmUKi1PdPg98dtV8MXUGn3twz6fI6qS56DpxXzLbWdyMNuI2OuABXLUpRc7R1aOvF4aEqadPSTSTP3l8D+K7bxJp9veWtyWjlQAMPp0r4D/Zf+JV7YX8fhrU7omGVlaIMeh4GB71yKrNq8jwI05JNNbM/SHVZPs88Up5Uyck/oKg1sfb9JieHIYcgjtUTrqUE5PY7KVBSk2lvubOnyR3kW442NnNc74UmO0wM+XjYZGetVTr8yutjR0YU5qFTVpqx5R8X/AIOWHim3nvLKIC52ksoH3j3r6XMW+MkgYZskDv8AWuijUcLtanZh8yj7f2U9kfht44+Gmp+HrqfdaMmHYlSOBiv1y8bfDHRPE9s8dxbKZJzgtjkfWumOIk93dI9SnicNWnzTVtdNT8KbqzZMxupXa5BB96+7PiP+zdeWrTzadAzwnJwo6CtVOLdl8yqvI5vk1T6n59tau6Hbnrg++K9M1/wLrGkSKJbVljWQ8Ec9e9ZuknJqBhP2rjyyty9DyKW0wh4ODkEit65szApRiQV657+1TT5oNRa0RjiaUlT9q1efbyOZRGA2Ln5WAye1XzbtHjBxk8kd6iUop2epjOElFKK1l+ZnMQqDGTuyMH+dNkOx+SSpcD6ZrWEE0dHLGoo0pOz1V/1H7mWNjG2HXp7ms5p8y43nCsDg10Qi2uaXQ8nDzUW6bjddT1Pwh8TNd8I3Vs8N85t1K5Qk8fSvJZ7hnwAhAPIJ710QpSctTnzXLaUuWUdH27H62/CL432Xia3igmulFyNu4E9TX5d+DPE154evIb2C5dCr/MFPFceKw7i+Z6nK8vqKDi5aH736deR3sQkRgQRXzL8EPiZB4p0633TYmQqsik98Dn8azlZtRTsJ4qEWoVFqj6qUgMqocbhke/0pkD+bHuBygUBT6cV2QxKjHkitTOPNVfNa1hJ0JI+bguSfpTthACthl6sD3o1Xws1VO75YvUmDBWj2tggggjrUWeD1DDBGP0FRGLeklucsqsOZyi/VF3zgM7lJckkD+VRQgtIiDlHyCT24qI4WMWnLoddPEqFNxtq7D3ZyqpwAcj6U6QYA3fwr0HemrTeisOaqKMVJb3O6hU5C9cZJzUsannPBHTFfF0Iw5L21PcSlKXsqmqHHiSIjIJYHHbr0qeNTIVDPlcj5aKs1GNmiIycXZPW//DDVEm/DA9cH0NWwhC7cYA9e1awmrDp0aipNp6jFiOc5+XJx7etWOVwpOQwwMdqhX5UmZULWck+n9IkiH8PXd8wFLEuGwD0HGO9RUpxV5QOvBV3JqUtiyi7W5HBJIx6mpV4CZYHOMk+taUpOaWtjrxUpSp3USfbkDvtBAI/hzSAhBgMAx9e9Q4pzuzmoyjdT5bM+bvjrc+XpjxhhkpgE/wAOe9c/8f7vZaeWSTjOQO9erCKeHdt0ePgOZ46Ur362PiW7uSJctnmQggVmTS/NuZhkSDg96+Xsoy1P0Sk5OKmn8vIviYlPlPBJxt7VjeaRgocZbp61Nk3oKunOmqT/AOGuarTrJsYZ4Ixn1FZkc7AMCRhWJJJ6CnJWdkLDyhpCT95bmmZF2ohyHBJAFUVb5hIWzhhgDtUxjyu/cupiJKbi1Zo+lPgBDu8RJM3QlM47DPFbX7OkTS6r5hyFD4B9B2rmrwTlFM9GGMlToybW5+jentsgjzn5UUcVDb/6iNGIwMZOele1hkou73PgMTNx996x/U1EZtoBIHY57+9VVcY5x82SMd67KyS0etx4SMlG6VtfvLjMCuVyCScH3HrVJJBluT2I9qys4q8eptKk5v33ZdjRM2z5gwxuAzWZ5pIK7SF3AAGjls0pI5JUUpKpDUh1252aZcOScCNiT7Y7Vzviq6aHRL1sn5YWwD+NbYGPNNJqyPNzPHRwyaktz81PiVe/aPEN2GyP3rAH8ayPF6vd63dMH3Hz3znvk8VOcTXPY+syCLVKMo6nFjYZ02J6ZxW9BpwZ0Y8MWAGa8WpUTfNY+ghBKXK9zQtIwwUBSQcA+1bdjZOgGcAhsEHvXM5vn5WtC+SLXNF3bJrW3xgAd8AHt71uW9twqjoc4P8AjVqTejKkpU4qMdbn1D+zzYqJ5JcZ+bJFdT+z9bFUaRSQcqpA+navOlByr3tsdeJap4VNvVn19GxSLav8KjBPbipGBSIE9hnj2r2qcmrWPg5OTbktmfFHxnvfN1RlHG1zgemPWud+Mt1v1+UBjhmAAHt1r1cwqL2MYqNmHDmGUFOcetzytLpFJVmyc4OO9YeU3K27q4Br5+NJLQ+mjKSSlHpubk1wSgwDwCRj6VktcMUTOCRnHv6VSVr2N6rUkpSdkVbqVnYnJABJA9MiqN3IwGeuSQcVKikkmiJRlOTTe2xr+G2EmuWAUnm4Q5x7il8EIr+JNOjViGa5HHrTqStBtnXhaCT5Y+Z+kvhxtukWqZyEiGCPUjkinaSDHY2wwd/lKc+ueldWX0WoXufKY9RqzfNozQkkZg4OcHC5J6Ad6imw5BJ7ED3+tevCnFp20PNck0lLdEDMWCkk5DYGe+PX61XkBVWBySG3AHtSVRJxgnqxNJJqUdCncMW25HDZAz2pkj7kG4AAEAA/zrdxs7BTqzdr7PQ+E/2oM7on8xgNo4HfFan7UNuzW1tLwQFbqOgBNenCMHRSZxZTSqSxM7Sty7n56tIA+58kZyAe3tTnjKsWxkM+cmvCnTadkfU0a8K8eTe3UsRAFTgY3Ng5p9p82CSQoJ69s1y0buVktC1VanapL0Kt3Eqp8udyjIA7g1auYlKg5wc8e9dtOo03JoqdF2svg/rUZorbr63XuZVAA7nNS6fEY7iN1JBWUHPc1Em2uaLLyxU4zTqO9mfr38E7YJ4Q0x48KWhBwO3rTPgbeLN4Q03DfchXIHf3rzsFNKTXcwz6v77i9u57tE3OBzwGOaVWVSCSSC2SfXNeypJRU466nhTqNJ0oosqw+UgjBYkZ96YWJUnjBII+mKyqwT96+g1XknapHVnh/wATPiJP4QuVQJmNwDuHUZrxH9o3U43nihEnzIpA9Tg120qMYUeZ7s58vw0a9SUf5eppxftHMDHm3OQep/QGvisTuw++eDnGa8adRJWsevPKoQaalp1PtoftItlzHGxbJ4NfFazEZw5DcEZpSxMbJJGlTh+nJtKb1sfbsf7SmxBiB9rcHOOPbvXxQlxgbSDwSSSTzWUqjcnpdmtHJqcI2ctD798J/Hptd1m00zyiFmkUce9fMHwbt/tfjHTMA5WcEk/wgdamribQSijanksVJ1E7eR+rtjcLcWyMM4dQee9Z2mS7LOJlOSqAAN3479a0pNySS3PAq0nTlzt6N7HmHxvbPg25GQFOAoPbjk1T+NbF/BtyFJKjAGf4TXsZZFrmaWxjPl9rTs9D8udUtibyXacZlI+lTXUqtPMvJYyEceteRjKjcmmte59LUoXtYxRYpu+YE5OCT3rQJGQQ2WG78K5XNvc7IQjFRc1ZoiEEUaqEwGzgZ7UGTaC2eTwc+tVBJe82aOo5zU3tqNKJw24ZPHP6VE7ArtyMKc8dqIXk7IyqckJqo3e+lj6k/ZpZV1y6yPYj1rgPgT4oh0vxdHBNMViuU25HbB5xWGJpNSXKaY2vGGHcpq7P06J8vbgEqeAR29KwIdR+0RRyq/BUEH+Ve5g5XioyPkZQUveg9VqalxOQjjd9w4z6+uK5e61JRExaTCRJnI613RpN2TehzwxFGTc2r6HyV+1Lq7Jo1tZiQnzd2VPfk15N+0n4lt9R1RbOKXPkPggd8HmvbSVGhzPVs48viqmIdSb06LtY+SdOlkNyD03MDj0qxbwkzq6gjcCRmvj6lRTfNY++54uPL1XT1O2gYuu3dkkE5H8hRaBiFY4GzB4/lXnuzvJM6dXZJab3/QuMoaLcewwQR1xUgYsChzluR+A5q6N1NI82slOrzxIEj3eUACVZuSO3pV6FPlx1yAOKttKTTVzpUZScVLofop+zLCF8MRM5PmGRgR/Wrn7OCqPC0TjIYSAgDsD2NcEPidzozSkpKKkumh9QseBn7vQ+oH+elQneVb5jkAcj36EV69GLUUz53ExjCCcVq+h+fX7SaeZ4jmJ5WFQAT3POaf8AtCgnxBOgwQuBn+X517mYVV7KMULJKPOnKWj1Pj6VXb75zyTgd62J7PG1udiHBI9TXzcanKm0e5HBOUbSZkRxBo1xw2SQTWisezYFxtHas/atSui6VKNODe5GsbFQhwo5Jx15qwcshzweDkd6lRTlZG93UptNbkluu6RQDyCCM9qLfhoSpwRKFB9M9KHZOyMYQlCUbS9T9SfhKAnhDSgRljbKD7kUfCRS3g3SCc7hboAPTgZqMG5NrlR42eUoOT5nZM9aB2g5yAOgHf2qMHGRk5xkD0r2ZXd9Tz6WLg4KTj8P4lLUj5lpOAcFYWJxUGonbZz7sgMHBYfw+v5V00Jclk9UcdVyqKUorR30PyV+KhLeKdSY4IaduT9eM0fE3/kZNTYNgC8cD3FdOZyeiW3Q9zJ5KGHi3pboeQOvDKSSoOME1PKhYDJGSTwP0rwHVfPdnoV3KUFOL13/AOAV5Fwn3wAOgHemlnwgIU4YH6cVDclJpMbrpU1JvV6WCMIdhOcAg89s0pQkoRgb2GQOwo92Td2ZKDgk2em/ClgvjbRsYZDdLx7/AOetT/CqNW8Z6KhAws4+YduawxdL3FFHXhnGcLPfU/VewcrZQ785ZAcHtUlkubW3Gc7IwARXpYWolG58xiFFz9it+5+ef7UER/txXbOfLUqfXPeuw/ai0gtcW1ywIMkagEdsdMV9HXmpYdJIjKJ1ad4WvZ79z4PibbLjJYlsD2q8loVLYbB3cn1rwp8vLqz6J17T5nv/AFoTAZXoAwJOKtQxBlViD8zDIPauOm02ovQ6MTVnFe0SuUJFRht3kEgjHrmtIwHA2AAgEcnrn1rNO0lysycpqCqxWr6GNaxO7xEcKjjOfQGuhtLUo8eQWEb5x606tRNuy3NcLKcppz3P1d+Eap/wh+kMM7fsUfHuQM4qv8G7hJfBumbWB2Wyrz1HA4/CubLpKVkt2ePnCvWc3ol1PXiolXAI4x1707ax5APoCK+gpwilozyKctbKOif4mRJGwLdizEk+vStaSLcAxz2GMV1Ku3ZRWpFaTUW2tWePeLPGOleGZI01CURqefmHfNeH/tNWZIsTGzCVoznHfmuqnOKjztioYSdROMXsen2fxa8KzRr/AKYobeeRj/P1r89LWzYOoDk+WwwTnnivBqY6Lk2loemsmmpRtL3vQ/TC1+KHhrAdb9DhuCO+O496/P6wLKq7mY7s4IJwD61zSxLVm0bPh+bldT0ufo5afFrwzGxX7UCSwIyw49a/PrMyAkyNg45B54pVMY5tNrU1p5VKndwld2Z+i8Xxc8PTTW8FvdK0stxtAGMewr4F8MXFxJr2mBZGJkvUA64Ws3iGo2a1DCZXKcW4y1P1Mg1ET2yS+ZhSCQM9a5CyfGmwxh87YlGB2Fd2CqKSSa3PFruClJQfvLoWtQ1eFRhpcMOSK/PT4hfF3xRp+tXVrbTERpMwXk8jNelGi6b956GNKjVr0eRR07/12P0DTWbQbcS5DEYII5r8yYfjJ4tdo83L+UM8Z6ZriqyjJc3NqdUMFOnDkW2mp+oqajbEKWmB8wevWvzjtfi94okRc3WHDA4xwP1/OuT6zZ2k9DrWX1VBy0dj9H0vLVhkyKT1ySOK/OuL4t+Jm4a7Y7TkHJ6elb1K0YtJmSo1akG2umh+i6W1pert2qy7vmJxXz38FPHN9r8V4l/NmZJlKnPQVz/XE5WRrWw9WnBNLoeneI/hZoWtwsrQKsjZOVFeoCQYQ4BbbnI7VcJu9luTh8wqOinUetz4J8cfAS7tFludPHmRDJVccmvt+6hWVXDDKtnr39q61R5kouWp6dPNvZx56kbp7dz8eNd8K3elzPFLAw2OQc9sV9//ABb+H+n3+k3ep20arcWqZIA69yapUbuzdzdZhTqLmhufmHfWkZjdNoJZSCPTNdDrUK208qMAVDsK5MVTcJ2NoUuZvmXmeFav4bguXPmRggZAH867ueAO4xggsTn0q6eK5bpvY5JwTjBz11f4nkTeFYjgRJtQtgjHWvabLTY5DvYA5I2kdBWixfuJrY5p4NuopxfdHk2laW+gahpmpwHbLaXasD6c16ff2KqQNmVZwcVj7WTbbNa2Wwastbn6JeELo6joNi85y01ohJ9cjrWf8KI3ufBmk3TKeLbBPoR2FdWClGclGWrufJ4yhUoS9i9i7otq1nrFyJmIDPhQfSvE/FnxdTQdZnt54CJLaUggfxe2eK76tBrV9Dqq1p0oqEIa2ProyAouMEbs8+lfDL/tR2sMvlPCxKgYAB4z/hXXHD2jvoeLUrKpOMmttz7iaWLaUfglSQR6V8C3n7VtjBmRw2F6YPLVtGjOa5l0M61Z0pqMlpI+5rmG0ugUlVWGScHsK+B/+GuNIO0PlHDDO7oMjoK1+r1GrR18yIZhGmryVkmfTXi34T+G/EkTqLRFd8gMMZyaxvhj8TrPx9Z/bLNzsVypBPTp/kVjzxTabszuo5nL2qdPbR2Pk74h/s03VuXn01C8YYkhOoAr9FWhiuY1DIDuQE57104e8W0jpzDiGomrq5+E/if4d6zossgltHAjJByOnvX7KeLPhfoHiW0kS4tFM8mcOAOK6qM4JODVyqVWnWpKN2pLU/BO+DxMY5VKkZX/ACa+y/jh8Cbnw0HubeIm0dX2tisqdGlN8t9V1PU5qsqDj0016nwi8ZXOASFIxjvWjqFq1pJJE6sBEwXI7VvVg4Runc5sLFubpX1tv0OeZSpyHIZeMntz+NWZIlYkghQEAAqqFdpe93PKqJe1UYxuySGTagywIbbhsdTUYxkKchSSuB29MVjyqdRzfQ6XCq5Ri56+nY+mPgD40l0bxRZ2zzkW11IqlSeBz0rx/wAGXBstb0yeM4K3KkH15rz8RSjFuotjSeDnVcbLXufu34fvBcWFu4JIZV6+9cj8N7x7zQNMnbkPAuT6cc1FNya5rni1cLs72sz07KjaQ2CO/r7Uxg37s9BuOa9OhTU37zIfPBqVua+g5SSxLE8jOaeAowTg/Lj606vK0ktzKcJxm3Lp2JxIkShVyd2eap4IOOcE5/8A11lG/K+bY7sRFuK5n00JpZlwGIP3hVVnJUHgAg5A7+lVSlJt32OelCpy8yWi2PUU5AyeuMj1pkZ3KCB1yT7V8HTaWt7M+mryi2k1dPT7y5FgZIJ5fHFJC7KTufKnnA7V11Zt2T2OehCm1JQW7sy0C3yfMSA2TjvUQJwWVwRyPpWFOopNpGmGw/LJQ38y2CDgjIxwRVdZGIPzY+bH1qozcdGU5zV4sthiSCcfKAMn9TTYz8uOSzZ5Haopztp1Na1NWT7dCyrFAST8qnJJpo+4B65JJ7jtVOlyzcr6ly9+KUUWpCNhYc5GcVVZtqkPydpxjtU0kk7pnLVlJrkWzPj39oK6AyuSCCc47Vz37QVyXmdUODjBJr3JWp4dRZ5uT4SM8TKaeqPkS4ZQWwSSC3Pr71WmlYqCc/KSCR3r5OMk3ZaH6A4OHvJXX5CqzEEKSDwcH9agDdPmJbJOe4z2oirK63NXWg3ZaMsO2Cyqw2rjIHaq7OwAG45JIJPeoUr6NHMuWM1PZMvRdQoySWBOffuKjtmJKAAcNjH8615YpXRtScZwTerPtf8AZuhZrhnyNzMPw4FbH7NcYNvvxlmk6+grzakv3qij08XNPCqD3Pt+JsxnJPYjHaliUKuBkgHAFe1TVkl3Ph50rvnqbLoTRNvPQhTgAntUsLZYKxPJ4+tb2cJLXUU68XeSXuocY/LUHBJJPIrR8oyR98KOD6U5VlNPndkCm+W8FqzCL7cuQ2Mk89sVLPCVfaAQAQQT3rpgoydmctetJRUXp3OF8c3KroN2+SMxEYNVPiGjR+G7nAJEisc/hXXl8IxrXT0PHzKnGpCM5vV/kfnjeRLJq1ySc7pWJB70+c+XqMjFz/rOMeua8HNardWV9T9Dy6caVCNOXbQnjsCHUliAMZx3zW3ZOjgb+QgIHtXlSk9Ez0otNc0WT29oNgViQwAII71uxqrBAOCSQcd6d1KzIoQUW7Pcq2ttngDC7iDnvW/FDHtBBxwMk9vWolq1Y6pRi1o9T69+Adky2IZT/GSD611nwGtBHpEcrKcbmCg+2OawpRaqttmOeyTpwSZ7zcqBBhhxHgkevTOan1d0hsZnHG2FiuO/Fe1Q0lyrdnxde6jKU9LH5o/GC5z4lu0GcrMwB9MmsX4pT/avEV8wBIE7A13Zm0lGL3OrIKKhTUk9LnnQZguAwLbiCD0aq4IXaQxLDrjtXicjSsmfVOtGLSSvckNw2CDwUYjNZkl2wYA4wckgdqajy2SOWFD3nFvRjppDsyGByTgjtWdJcE7wAMYGD6Ve70NHQppWk9T0H4bJ5nizThk7TODlvpVz4RKsvii0B52tkVhiJ+6ondh4RUHJs/SHTEAsYT3KgYqTTkb7LGuQApzwOvFevhbxj5M+Gx8HOq5NbNEU6tlQc4A5YdhmrMi7w3Azx0712KHM1dak4jnkm46ozZRuVu/JB/DpT50IGcH5Tkn2703Qaa5WZRSjSajq2ZM0ZGAwJxgjHarTIXAPICuPxp0WktdzlnB1EorofKf7SGltd+GzcqhBjXDEduOa9p+I3h7+3/DOp2oUMyQuyg98CvRwdSDjyPbocSc4VU0rXep+MdxGwlcBjhSwwelbnimwl0jVJ7WSPPkysMDtjtXHisEoy1Wh9nThaPNu/I5+LKqAuACAc+tPYg4YHAwDj0rynHnSdrO53zpqnJSS6alrflI2CqckYzWZPchUQIDgHIPpVUYycm3sjz6taKhFJ7s0opY1fJchg6kAjpiuPl1NoXZTnlsZHevRjSbVu6NsQtVK/wALP0g/Zy+Jljb2C6FfXQVvMG0semO1fnJZeJbzS50uLK5aOeNwwYE8elcNDK7Pmb0OTOK/tIqMFqz96o9ctXh85J1KscjnrX486P8AHrxjBDGn25m5UFiT+Y+ldkMK3G7eiPm/aV5NU1HXvfsfrTrnjjT9It5ZnutoWJsZPtX5I6p8WfE2vb4b67ch1I3Bj/n6VvJU4xtNao1oYOtWqNRlY9b+KXjM+IdamZX3DeQDnoK8FS/knJ3klgSSfX6Vy47FxlDlS0Posnyt0Ip819dTe+1sSFCgEYzyOPestZPlyBgDB575ryrR3Wp2TpqUeW9nqbJuHzuI55/GspJyVyQSzNjHp9KdNqCs1qXUpTsnB6m1HcOyjBO4kE5/hqPTbeTULmCGP77zBcAdfalG9uZszw0GptvVn1r+znorXOrvqTKdkQCqT0PrXvHwP8KNoOhWkkyYmlUOxHTtkiuSNL2tRR6I6c1xqo0OVbs+mYn2oi9MEcDp7Vn+YeoY5D/mMV6yg4p2PjlJVKl07NI89+LNt9o8HaooJDLGw6V0Xiq3Gp6He2gAYz2zAA9z2xXp4GtaaUjhxEIU6sWnqfkLqMxtbyWMgliwGfeo/HdtPpfiC7tZMgi4bJPYZrkzPDyT5rH11KMI2U3q/wBRouMAFiQGbH1rmDeN5e5XOAMcduK8iMeaVj0NYpRWp0ckny8kEcg/0rlpruZQuCSOjBu/0ohSbnyocpxnTcb26G7JOCMqSDtxj09a52O/foVLAtxmrVFpnPh4r4UttDWtNWu9Jv7fULTIlt5lYDPWqccbzN5hzt4OD3FbOcZK8mdEaMHG0lufbfhD9ojS30u3i1OYRXCRhWLHqa+LFsI5lCuoO1yQSK6IYiEXax8/jMnnUuoTsfaviH462N1aSrpcoZ5FIDDHJNfI1lYpE6jOSXzx39K66OawjZRicb4elTblUlf5GX4gjv8AXdZfULqRjvlZgB06966+K0aUn5PkBAJFc+LzOdWFmrI9/LsEoJSSszjV0vacbjjqDjt6V2P2Qlt3IO0AA964XNtWT0O2dVpqbVuxynkSRL8rZz0I7V1LWX3gx+71xQpxbvFClVdSLjJ+TOehiZiNxPzHPHtXRR6eRk8keZkChuLXMnZmtGMElBapFeKE9VBPTI9eK6qwsXldRsJV2/OsIzSdmbxprm8z7x/Z1glXwrASfmdyST2rtP2f7B/+ESsjtHybjnuc4rnwtRSqNvZPY8/N7ucZPoe1+WSoX+LaRn1roVsVKhSwAZuTjgZ717EaraPEVJuPN01Pzh+P0Jk8ST7eocHHqM8f/Wrq/jnaK/ia4LY8wjBB6HHSvQzSSVKOuhrkOHnJOSl3PkSWzbBQpkKcgDsO9dPcxJGwOCTvwT6GvBTu7RPpKk7WTV2ziZrHZz1OBjjpXUzxwENg/wAQIFZwbbRjXtThdnCfZSI367d2GNdDdNGsbbcblBOB3qk2mmtzGVSKhzx0/wCCczCFWWI8lVcDmkdsyxqeRvGR6iqnJczVjXDtxUXKx+pvwnLDwlpHygD7KpBPc8ZH4UnwoJHhHSQwJc2iMSfoK0yyCer6HgZxiVKu4JaPoepHIU5Y+ox2IpDkqNpIwB17V6atdNHHCFRRevu9ijqYH2G6JxuaByT2HHU1LqKFrK74ABtmY57gDODW2Hk1NRetzhxlOLXOtD8iPiXF5niXU8ZVjdOQOwBNW/iIqyeJ7zk7hM5we3PSt80urXPpcNVi6Cja6Z5MYyT87ElsgDsK6P7MGZVABLEj6+9fOx5eXmtqj1YyaXItEc49ozZ2nLBeSe9dfHpxKj5sHb8oFa+3hy2sZrByUuZPRnLWlmxOw8nJBPtXTrbCBwwztGSQO1YuOvMkaVaEGlFu1vxO1+F+nlPGekYOQtypBHXIrpvhVbpL4w0cAZc3Ayw7Z7msMVdKKbOmhWi1KSWq0P0ssLbNrFswWWIAEdBW1psOy0gyT91QR6nFejhotRt0PjcXOHtI1EtT5X/aU0D7VoNjdqhItA24+oJ6V7d8TtCGueFtQtNoZxGWA55wOBXt0aqs4vW5lgsRONVKDsmfjvNYmOVlGNocjjqa7nXdNawvrmCVB5sUjAj1561wV3yOzWp9VWlKLv00OHW0YMw5ICDaDW6VCg7sFmI4549q8uTUrJFt2UZvYxWiygzwwyQB3p91KEdAFOWJOR6etJVtEmjarSjOzYyPCY3Z3FjjHY1X81WKqrHecMM/yFJPTVGEMRyNQTuz78/Z28WW82kHSJXxNBJsUNjJGOo/Gvj3wp4o1Dw3ex31jOQ6fe9H9jWUItuyPMxmHlKSl0vqfrzFPEygIww5yfSviTSf2h2SGNbmE71UAle3vXq4ao5Ru2eDVqOKtFO1z7XmmSNSWk2gg8n+Gvh/Xfj9c39vJBZBh5ikAjuK63FKSmS/aWUYXK3xy12HWNba3t5NyWvyjHb1xXjk1/NqdybqdiWOSSecVy4nHpw9nDY+gweUWl7Wq9dDHXT/ACwDzweoropl3RkDjGCSfbvXkvU9mUeZ83QyIISigkEHeMe9O/eqF8vJKk4B/WjVk1YtRUVtoaTGLYvzfMMDjvWNJMzAKpwScUoRUWmjnkpTbhFWTVrnpXw60/7d4o06BEJCThgR0OK9I/Z48O3F1q8mqTg+XGhVC3Y+orOpJ86ijetT9nRdu1j66gsClt5QYgPGCfpXYXFovk4AyRk8d/8A9Ve7gG+XQ+LhBwvVSufkl8adLew8VagdhEf2hiD6g85r3j9pDwXILlNajBKTJhjjoQea9nFYeNRKSfqe9gcVF0ou2p8VW8zYBJIOQOaZMTbHCDBViTXzmKpNNLZHdF8797qdZbXBSMb2xkZB/DpWBbXzbQrkEjpjtXG273Z0yglHla0N6SaQAOrnAYAe9VN+4Ek5zjOewq372pk6CT1f9I92+C3i7+xPEEUVzMUguwFHsexrweG7ntpoJInIdH3Ak/dPY1lGLUrx3OfGS9p+7W5+xWmanHdQwsJAQ6KQR+Ffn54Q+PN9o8UFpqRZ0hUBWJJHtXdSvKKikfLVMKqVW8l03P0RmmQqBxypOOwNfFt7+0fZRQMY2zsBP+79K76aTtK+o1UqKmoOPke9/EvXbPTPDGpvcOoZ4Sqgn7xNfnZ8QvjLqnizdb+YyWpY4UHqPau+OJjTXNN6nPDAVKkk4aJfied+I75Lm/uAjZUO2Ce+a4m4vG2iRnJ3vgg9TXkYitzzXKfV4SlUV2nuE82JBgnBGSR2xWa9wQWJ44HB74rL2fItNUaUajqJqS1R0NnfLHE/zscEED19a5cXB3FNxGSDx6etbx5ZyTfzM6DdOCbjuzpZb9JWjBPSQck9OeazPDunzarrFlZQEtJczqoAHTnqfpU1ZOEHbYcaarVk09d/uP03+ENoyeC9PQjGbcED0zXdeBdI/s7w9ZW0gAZYAG9uBxWOXQakpW1PGzBylWcrn51fGrSHi8SallcYlwSe/PWvcf2jPCsv25tUiUmGcc8dPWvqMS5S95Hq5fThKmpSPz5k09MkEgtkgMetdDNb+XMxkP3ZCoB71jXnOKTjuzN4SlOytqr6+p5frPh/dCZkjBK5OR655r15rW3ktTG2PmB49eKwWYuM7Nepi8NTcrP7Oz8z421SB0nKMc4YgA/wmvcNc8DQXV2PJ5VmLcDr6ivYwmZUvZ2WzPKjlrlWSm7t6nvH7InidIJrvSJZQpMocE9+BxXmHgyC68GarZ3tnlXWZQwHdc8ivLxkqaba0ROPyyCqKrT0kj9e7WZZ0VxncQAcdDjpXjPgv4k6ZqFpbNJcqkjLhlJ6HHeqoYiSg1HY+WjFqcarjsz3rcBtGcs4Iyf0rgpfGmjRmOSS+jWJCPmyOB612vml77WqOqbg6dr21epznxt0mw1LwRqk86gGGIMpxz9BXivxm+LdjeaVJoulzBy4Icr0NehhYSi+eWh1Zbjpc6oQ1T6n5QeN7PydVuQoBEcjDK+ma9B8U6SLh5LnaC8jEkAV1zx0WrdT6OpgKnPGUHax4D5eMbiANpLL6mu6g8NSSFy8fV8AEdK4/bqTbb1PN+qyhPlpLS5wwXDKuwbQQARXdDwjdFwVUlN+QT2odenZOO5vV+sNKMrRsY2iKRqFioOW+0qwK9ueK9L8L+BryfW9OiiTl7pcHHXnpXFiMdSS5pMvC4Ocvc6M/WL4RI//AAielKRj/RFfB7nArtPAehz6f4e0y3KFfLtUGPWuLD1E2pSPBxFFQm7J2X4HS5OF3Et8x4FW3tmBUckgEkjtXuUmknJPQ8qDca0XHchUYYYb5QRx6UrA7FbAIBJIreVpuxp78JNyelxu5QFJyTnJI70hUsE2nHOa5dZO8kdDqupGNKK2ICFBBOepGB39KesRIG5iQMYHp9K6eSMkpc1rnJOpUUvZrRXtY9SjGCuCCdpJ9ueKap2oCe56jvX5xQptppbH1sqsVJOW63JQdpxk4JyDTwpJQgEHIII7Yrrp21izmcW17SLs73AbW9ME4HuR1pCpIyrAfMMEd61pRtoupTxjl7iJ4xxggjc5wfwq3bdSjcncB9c1z19FqzWlUVV8sl5f8EmgjBx82M8DPatCKEjbzlsZOPappQTSUeg6koUpLn1v+Q0xErnIG0EHNX4kLgtxjGQKmMm5Wl1O/wBlKa5m1ymRcWzkE44KEA1tTxbbdskgBCCP606dWSlyI8jMqKacovRH5x/H12fUZRuOzduJPrmm/HdfO1e5RSAI2JAPavYxs5KCb2I4dwkJJySdz5SkO6RDg7QeRV6W3OT/AHhgjHb2r5dJ3sj7mEk6aTeq1M9SQu4DDHIx61a8kyKQdwbdnPrRZxlZipQUn7SKuZ+3kZyduc5q08TpkgHuAD296q7askaOVPmceq/Ukt3O0SLk88gd8dhTbXc0qCJiPnBx2NVTpty97Y1niuRxhbVn6G/s2WhTShLj922Cp9OOn0rqv2d7UroEPGC6j6CvPw65sRYfElZqiktGj6hiUgAnkPjOO1WokUqo3dgQK+nq04p3Z8Jh8QpVFG5JAF4OSCx6evpUqBFZFIxxnB7ZqHFNOTeh1Tgr8jeppQp8nyH5sE7fWmwSKCnzZCHJ9/Ws5paSeyMHjU5eztZvQhurdWGQcjBP6VqMFk6dmUH2qpVXL3UrHVUoRUkpu6PFvilIYPDcynhQpyPXIGap/GmTyvD0qjILEkD1GK9XARc4tLc+YxijTxUINXTZ+el+QLyV1OD5rFQO+DVt7a6muZAIGKFx8xB55r5jExkpu5+n0HHkTStYktpyskY6k8gema2rLRLxwCIGBLAAY5+tck43+E7U1flZqWs3CnJA4I9q07TQNUXBFtIyu2AQDxUVKblG1jSnGy5V06F61kzIAchfU1u6d4X1h5IlFrIyl1ywB5rRRSiXQpVOdNK591fBGAr4ftmIJXAIB7HjOa3/AITac9n4ftIpgVkVNuPqK5MA5Su3tc5OI051VFdNTtfFGV0qchjkIcEdqm8R28k+k3MMPMphYZHc4r38vj+8TR8Lm2JcKLUlds/KTx9c58QXirypuGJHpXofij4V+ItQ1e4mjtXCmd2GfY9e9VmTTm0nc+iyjBy9jB3srbHz08m1sA8ljyPQ9K9fX4OeJmKiS1YEMcdeR2ry+W7vc9Wd4xV43PC7iQxqM84BOT2r3Kf4K+JXX93alm3EYx14rSKTlYic5+zv/SPnt5TjAB4YDJr3N/gj4mwX+ysHwM+/r+VCi7mvsVK97Mj+B0Jk8TQZIOwHJ9zXqXwl+Hur+H9fM1/AVjTaAe7HHP8A9auWvGXMktgpVY08PONj7JtTst4RjqoAx64qxbptjTIIOAOP617FKfLBM+Sp0Yyndy1Gcj5OOGGSO9EqHoCQW6H0/wD1V0zrN6tGGF53FuT07dypLgkjJ+UgH/P/ANelLKGUP/e/OtVJSVzmUWlztW30KsgC56DOce9SModcOSMEkYrGFFppSN8K3UTqJGfNGtxE0ZU7WyMN+tWFUEnDZwwBz2xWvs03e5EKfMlBvROx+e/7QnwenS8l17SYS0MzF3VR901993ulWWqW7W95EHR1KkEcHI616FbEqUFF6l4GpOEnFPTY/CW/sZ7UuDHzGemPzr9Hfih+zfa3jz3/AId+VsFih7k+grGOHglvoepKtOrFRjK3Q/MKTeOC5AOeK9W8YfCnxLpMz+fp8gjicguoJBPpRTouatfRl4mEqdJQgtup4Ndu3DOQV5AHrW7daHeKzRzQOGXOdw6fWu5UUkoz2OSVSSXs09VqYNraiQrISOWHHYAeldFY6e0cwL8YwAD6VzuTiklseh7Sm24yWpoWdkEVZQCxxjH1rcjUHCcAMuSB0NebiJzqQ5nodOH5eXnatY5112yDBwxYcf3fSt8WLSnfsG3cACBTjdRtLVnJThCpWUne47T1YHezEhQFrcs9IuJCI4oiV3AjA61x1YNtO+h6E24uTj06EaqWX7wJ3DGK9C8P/D/W9YkhEFo7AuMEA05whTldsdCUnSU7anF2UE1yzQopMjHCn1zX3V8NfgGkUkN7qkY+QhgCOtcv1hP3kjonRgrxlKzZxHwW+E1zfXMGq6hEdsZDKGHHHevv3RdCs9Gtoo7eJVWPGAo60RozlK0nZHDi81jSiqdJXb6jtMsYtPt7eFcAINuPQ46VupCpAOOAD17g16NLDwjFNbniTzFTT517xWjQFsnOTggVpxwrwoI+U5wO1a2vG72MVhozlzrexSMO4BDyhc5U/wAVayQgkydtwxSjNqKaNFSp1KjjUW1j82/2iPhrNZ6rPq9rAfs053Mw7E1+hXiLwhZeJ9PNjfRKYnyMkZK57iumVeMrc5WCrToT5XG8T8RV01oxtIz8wJx2r7Y+IH7P+o6XdT3OmW5ktgRtVR93IrzJSUGm2fRUqMKkVpZI+LJNLE69wQAc+tesX/hC806Qxy2zrIrEEMOtYuSaTRx1aDcuWT637njiaWIjuKYG7GCfyNd82mTNlSpy0hAz+lOdSTaSeh6MEoLlprocYYBHgLjgE5NdeNHlfJZScEKSB0xWb5Yz0dyaU7RSb8jlYifNTqBnJJ7V3Wl+D9Z1C4jSGydlY7QQOtXieSyaNaVOUWoPVMraZYTXhWKIFsuMBfWvsT4T/BS4imtr3VoyAMHyyOQa4ZSstEaQowU7zlZdjgvD/wAK71vC93rN7ERsTKgjvjjNffPiXw5BH4MubCxiHmMNhVRzx0x+ddWGpyqSvJ2POxeYum1ToRvqflneaZ5LlGUFozgZH8q97uvhprc9yzCyc5JIIHUntUVYwS91nZToVG0pbnzd/Z4MqqVOCRgHvX0G/wAKdajf/jwYFSCCFPPFZ8y6I1WHdlB7HitvYopRCoIc4HtXt8fw11xcOLFwS2SGHSo3VmaUKEp3d0uh5/p2lxxGLdyu5Sa9ch+H2vJ5RNk5bPBA6fWplFNWY3LkaXU+ufgjaeX4WtFRcBeQMfSui+EtjNpvhuytrpCs0KZYH8OP8iubAQuzmze7ajDU9ClBKkDIJU8Htx2rRl2MCw5wM49K9l2lJLZHhV6TUFJvU/Or47nb4luApbAK4+p9a7L4x+EdV1bxDcSWlq7I0hw2OAQP8iu7MJr2ai9UduTybp8z6v7j4uvxIpL+YQRycd/SvRbz4e+JGIRLBzluuOK8VxaWp6VGjKMm2zxhmmLgcjuQe9etR/C7xOzbmsX25OXx0HaqUU1e5tOLVm0eS3TrCignJYHcDXpd/wDCvxNji0cEsQAR1+lXGmpLRnLytTc3t+Z4coL3CgthTKASe2TXqcfwx8TLOGawkVlcEEDkEdDVz5W9CIwbqRlJaL8D9A/hchPhTS8Ngx2qHJ/i45rQ+H9nNY+HtMimUq626qR9BRgIJLla1PEzKco1HUesdjvQCi7wwb5Tx602Q4AJyCpwoHbNexpOTb6HmU8Qre6roraqR/Zt2W7QMT7ccVDqTq9lcISfmRiD2z2z7V00XeakebXXtL02j8kfiRMo8Rajg4b7ZICfQ5rU8feGdUuPEmouLSQmS4YglTzzU5vFzndPQ+pybC2owUlqjzCK8A8sMSWBIJ9fStBfDWqI6brZgFIGSDxj1rxHh21qz2KkHNuLV1+TLkV6iOmcneD+FVG0q9QhjbPtDADI9KzjSbi0FNKDtfZGo8iOY3TBjwCCetQRWF2QqGCUooLHA6e1OlSi4tNkzVWVm1oes/CuUweLdIIIAMwYrUXw2tpW8WaPmNgqygsccD61w1otRTZtNOVOUJdj9PbK6xawnORsB4rJtwI7BA+d5UjPcDHSvYw1FSjyvqfEOvJQtLp95sTSRThkZQUkBBB+veqMJfjPDZJGe4rZ0JRWr1RvzKtC8Vt+J8LfHT4fy6bqMmpWkTNaTNvBUdMnkH2r7P8AEuhWviOwktLtA0bKQf8AEdK2bU1ZrU7cLmicVGorpH5FSRBCwJIJcEj0r6K+IHwY1HR5riextnaBnJBA6DHeuGdCSkuVnvUq1OouSD0PlK4bE+eMAlcg8cVs6poF5aOUmRgyscgqazcW2k0XUpxgrva33HOQxkuN7EhXI57VpwW7Rs6HPBBOe1KtFp36E0moxT38yWAOFyANuRwO496tQxkbQQSC5JxXM4JK6Z1xm3o1oSIVIU5I4JAPb6VYSNjhdw+Z8Y9KbjrZrQ5G4p7kkDP8rD5sEAVbgjx8oAwOD7UTvC8WLmhUlzX0XTsbVjKW2g/eD5+lNgQJsYL1AUDuaicVy3NFQbd+h1a7XjYAbjwTjvVe0WZiqKGJDgfWoimlYcIpu7WrGeQu7b/dwQfxr0Xwr4F1nxBcxxR2j+VIwBcjj6VUZNamypXScdGclonhi917Ura2tYSwkmAbjpX6DfDr4Yaf4bgSSaJTdHDMx7A9qmN5K6WhhVxFOjUabvJlr4feB4fCmiW0KoBOUAc+vr61606qoCBsKpxkemK68NSVOSbWrPAzPGVKkvIziCVfcxOCCSe9RTFVkUhuMHPuK9bWVuVWR5SpR52lLU888c+FoPEmj3VhMFJkQ7Sw6Gu2uXQgnjO4kinTrWd10Omni3Tkly6H46fEnwHqXhvUp4XiYJFIyqPWv0p+IHw80vxlZyLNCouW3YkI5B7mumo+dptHpYLGqVnN2fQ/HeG5kSURvkMGwMV7v8QPgvrmg3Es0EDPAr4V1zx9a4K+E95NL/gnoSowi+d6t/hc8whuN0QwxLLnAHeqMdhf2xMU8LKyMB/vY7muGeF5ZcrZGJm1KLitUWlmYMc+w47e1VmV0clgRjHBrN0k4JilUvNtR1WpbeX5QRkAsAD6ZrM3ny2XcQ3IOfpSjKUWkzWlJVKbk9GyO6mfyT8+B3PrVO5J8td+Syqcgd63moxlz9URTUklBrf9DHklYnjouevUfSqsgYpvUENJwQPStHac+a2xqpShDfcpSSjI6/K2SPQ0x4WchFJILYAA71vGC+JnHinKSSS1Mu4uGUohGQWJDHr1rdtPDmr6nOkdvZu7ZAGRVx0hzSRtUoP2aUFqc9bTtNMqB89Cff2r62+F/wCzrqOqXdtfa5blLYMDsb+LpWKrwheUURClU5bTlp2Nn9nX4ZT6jqMXiO+gKwRjMauOfUkV97+GvD1p4dsrextIQsce1QABxiuWVKdWSlLRHHic0pUU401qzdtbMQwhAw6A8d6tgiUkjgZ4x2r1KNHlS5TxaeLVSEqiPPPiF4NXxV4eurYRhpkDMpxyTjpXp8SkrxkFdrZHX2NekpqNnJaGNPHujKyWjPxg8eeFLvRL+eOSFg8LMNuO9fol8X/hDaeJYZ7+wULfAMSAPvc1rKrDZbM9mk416icXZf5H5QoJpjtBJ2Nke1eseIPAOq6DfSRy27qI2bAI4PNc8oxXvUzqoyqynyVFZXOS0zRZZEjlkOCGPHcV3Wm4t4THKhDY5PY187KU4z5kdDhSSlC1n3OAv9O8t846OCSO5rtLu1E+3anC549D3rZOSk+YuCjGneSu7dex56y30cZa2neMknG0ng+vauyhsVU7XXOD37etdlTEezk4Lc4vqcZwSlZLc8uvL/xPPtjm1KfYpwMH9K7+5toxK6iMhSxP0q8NjKjerJr4WjKLlGKdzz2Gxnlz58rPIckE13SwKgI+UYU5B6GuSvmM5NX2O3L6EYNK2qR5/Po0U6EsgYryQe4ruJLQAM64OxcBT3qoYh25o7jnVUqlpR26njt3pcFu5AAyOSBXSajajzXJB5OMjtXdCvf3rHHOs6kXDqtvmc/ZWURDYAGTnB78V6T4G8D6j4n1CC0sEZ45ZgC2Ogzz61yTl7OK52c+EoVJSlCFraanp3wG+H7654jt76S1LWtnKrjI6kV+hHwr+G1p4Q0K3t1iXz9isx7k1ySqOtJRtZBi8XGjeMHq+p1VjpMMdnGm3AiQhRjpXXfZGG0fxHPGO2K9qFOKikj59Rnflvuec3ei7Qz8jfzge1drdRLtCtkbgQMV6kMRJK0jGOEcZ2i9PyPG5YCitESchjhvWt++tiHGST97Ga6nWTldbnHKhKK5U92cz5P3GcnIKj61pAcqWyR1IPairFv3uo6KUGoS189tCmkZVWHBxkg+laQiGC6g7UycelZSk4u73O2nOMWpQjodaiYCjJO1hyffrU6ruXfs5AIBGa+IoX503sezUi6NJOD338iUL0253AkD6d6njQADOTnke1bzmlJJdTlm1OmnLTXcjCEttyQM8H0q9s8xMDgk9fSt1dNprUy5ZU4RV9O5HERER8xJ3cH0qRRyM552ipUZSibxr8sk4I0YpldeuCG2knvVEFlZTwfnU8d629koyTXVHLTm60nFvZnRwkdPfIHrisyGZ0KnkjIJB71hUptpK1jevDlqd3p6G5cQieFoycMwwPfPSmLKzEAnA/zxTjQipJpnFVV7wmrpv7j5R8f/AAV1PxFqUs8ZLRyucelfXMYV1BIyQSSD3xXTi5yqwST2PYyvHRwlL2aj1PgBf2bL5uThDHyeOtfoE0Y4JUFSMYNeZHBSbumetLPox+Jbn5/J+zFdudzTHbu4x1PtX34EyT3JAwCO/rR9UlB6szp8RyUGlDT+vI+CU/Zgkzkytkk9e3vX3rtGQVAIycg1csG0k07mMM5jO9lZ7nwza/swxqwZpAXBBxjg19yBAGyxGMYyf0p1sHaKfMZUeIqkq6hyanmHw98IN4TsEsVXEcWFUjtzXqceAAMDPt0rKngFCScjfFYyWJi4z0RIrZA25GMDI704B0KjjAw2PX616UabSu3c+ZrznFciXlceCd4PBJOMntT8H7yjOTyDWcJuSsjulSTj7rXS/mTQsR3z0wD/AA0IAowCcnjjvW03K3LLVCoUote67F8SblXDFWAIwfr1FV16AE4K5Oaxgo8zdiIXUm6z10t6HPa94etPENp9lvlDqXDYYdx0roon2FTnBcAHFbqrLkag7DdaXPz21WxwGm/CHw1EBIbUEgnqOn/6q9VtrrCtyQFGRjtXk1sHaopTe579PNKrp2ctTnbH4a+HIhhbNSAxyCBgZ7iu+tpGON3RsD61KwytzN6GLzWove6lGx8B6CgAWyjG0gAADGB6V21k2UTI5Vske1YKm27ImjmE4q99GVLXwfokarss0AK5AIHH0rqY5hs28bicjP8AKiOHblZG1HM6i5uV6qxWtNOt7RRHEoVVJAxWhvG3jJJBBP8AdrZUVFpRexnXxMpXl1ZRmjGxemG3Ae9QXEgXBBO0sFJrps1F2OKm7azVmzBudPtmJbaMFskAdTVq4ZQEwDn5jk+45FRypas5Iupypxe+xhPp9uVB8sZznB7VZaTcQMkEYBHpWzUX8S0OuFaV7N6mebWJcbUwWPHtUsjkFQchRnPvxShSi1ytHQqsXC8Xr1M+WxgbaxjB2kjpVp3KRqOrljn2FOFoydkcak4x5+bVmatlAh3eWOGJB9AKnY91Jwx6enrVVErpJF05c8JQXXURRgleM5wQKavOBtORyc96mpFx0S0Rz4OlTm7vR9Rkg2pgnJUjJpzgB2fGGZgDnvjpV0oJtIdSmvacsDPIDsuMH58AHtT9uAAQM7scdveumtLlaS2LVdOKjJXavp2EZdyEA43dKnWPcCVYnqACKxSk43XQdKk4pOOzMhYf35+cncQSPWtgoI9sikkJ39aUaspJNmrpSpxaXUpKmzJyeBg++ac8g2kjI7gHvW0aiSt3OGdGCnaOskivMyIjocYbIOc81RuCrKAcs2Sef4a6FzN26jxUZOF4rRI5/UfD2lap5iXFsrxNwoZRkfWtqzXeOck7gSDUyTdmzChOcYqUG7rc8L134DeDtWkMr6ciyM2SVA5Ne8yoySBVJ2YBBPeuxU4ON1uGFx1aNR82zVz5Juv2YfDcyv5LFc5Ukj1r7Ajt1kbOSTkYPYVxz5ZWSeqPRoZjiJy5ZLQ+K4P2XdJRBsfG05IP8Xp/nNfbgs8bsZBfAP8AtAetctWknJq9j0oY+UIPTX/M+PLD9mbQ48F3YHcAAR94E8/5xX2THb7Qp5K7gDWPskk22EM7lCOiTPnrR/gP4b085aAM4IAzivoohUYYXO2QA+1RPAxvypm0cyqypqbsmzitH8E6JpKKIrVAygAEAc12xVSMgkbVAJ9fSrjhoN8z3PPr4ipNqLldIijhWPCRgBFAChR2q1jOAMjKnHvxWqSitFcjnqyjeS0voMT5t4GRzgY7VMkYK7hgBhgn0puaqNdzhlSTTkpaCqNmAcHLAADtVyOPkDgnI4PehzslKSKw6jKLjKW4yPBYA+pHPerKxYwOcsDwO9RGSS5Ny5e5Lmi9GTIpG0qSSmSAfXHNTAY2t1x8o/Go5G5csQlU5IJvqWozuK9cNjPt70yLcjpznDE81agouzehrFvn5lroTT21tcjy5lDcDI+tKx2oQcbQDgjtjpWVlOVkFOu1B8uiOA1f4ceG9VDtcWKM7A5yB+ddwGOSTkMcAn19KMRSi7RXQ1wePnH3Ypps8Bu/gJ4Ynl3RxgAHKgdiete+u654zuB4A71MMMpL3j0I5jU9oop6Hz7afAfwzGys0PGADnv619DqCRwcYI49frWSo01qzTEYyvPWnpY8x0j4b6FpQTyLVfMjbI4HFepqq4JIABOcetaulTTtuckcZXdLmqSMuGxgto41gTCYHI7GtNwHTKk5AOD6ZoUOSVmx1X7inB77j4YgwCuCVOS2e9SRNggnvgEmnVSslfUxw9VKpGZYjsrONcCBDznkDIp6yE5fPCYOP503SVrpamssU03JO/6DvsdnIuDAhJySSBwPShXPyjqdxI/oKyWHjLR6GUMxqTjaG9y3HpWmuuZIELbgCMdfYUqTbTuPXJNRUik1y7Dso1LTeqs2Sf2VYgHZEoBwOR0+nv6U8zsnHqARnv8A5+lHsW2rDpYj2rko7DFWGDEcMe0ZJOO3qajB5POWOc47e1ONHkafUyjWlUfKti75mD949s57ntVHf8rckkNgj0rT2CT1ehCxbppwkr69ytfW9tIGMsatucDB+tRSz7m2nIyevr61ToycU2tjshiKcXzp7/gc1c6dYdfITfuyARwPQVanLMgYDuTj8alRT922pz+9K8oytYom1swMiFQRwuB+lSA7mBbBIOQTVxoqNrD+tScHGTKElpa4VDbqV4wD2q9w5bkZBAAPrW9ZxStJanHVrOUVCMmktW+5lmwsyFP2dAqt0A4rRVQCoycbgSPWs54eMZJWudUcW6itGVkvxK6QRxRkIAFSRQMd89fyqXO7hf4nPSo5VBJoxnGUppSdv8yoysmRkEHofWpNrLnJOecCvQdVuNlsjCSgp3k9XvYpsiuhyOHzuH8qmUZ6nuM57Vk4STsth0mlJp7nIXXhPQ7mTfPZRlmJJYjpXUuCxcscqMDBqfYKyUmelDFuEXGne/c8/uPh94ZmI3adGckA5Awa73Ix04ABHvUKMLqKQ6GOqzT5nZI8wk+F3heQnNmhHJxjj8K9Q4QEEjG84P8APFZyoRuk9zGGYVVJyTumeWj4TeFyyhrRQFfJwoznvXqKhjyWI7ZHatXhrr3VqXicyqQanN28jzmx+GPh7TruK9tIAJoZOGAH4cV6dGhA4GMY/Dng1zywyi0p7lTx0q0WpP5FBYSFEYc5wM571oKiRvyQWIGPfNdCgnZJ6Hn8kI1LSellr2KaKvOM9Mc/rVoqA/c7skAd8U6bvpYtKMPdi7ootwAgyCByTVkxgEA43ZraDTk3EpawWljKlsYrlCk6BlkyDu71rLtJZc4O0dO3WoqppXRwRrKK9pB2af3njniL4TeH9adi1uqSMQVKAcetexSoCyYBBySSO4FaRpR5V2OulmdSMnUbvfofFmsfs4b5pGsHDDeTg98/59a+2EQbj8pI5P0rGdBSV0enSzqopJzjofndd/AHXrYYjhYqwAwOw9q/RhY4mKsygrk5B7Y9K5p0WldM7VmsZ2k1+J+aH/ClPEiOMWTMoYHI7H0r9LzbQsVAQHCk8d/X86cqLUbN6s5qGaKUlUSurn5u2vwU8RucNGy5IAJ9PUe9fpStnbZHyKCehHbjpXLKnJK6Z0yzRwnacbX/ABPhjRPgBqsjRtcMyYYEgjNffEMfAHHyMAM0PBScU76MzWbtSclE+dPDPwJ02wMct6m85BIPfpX0tGoBUAZDMQT6VUcHpds5KubSlJq1rmHovhrTdHRY7eJcR4zjt6VvgDfjact1PrjpXVHCqKTt6kSxc6l4OX3j3ZYWwFxkAbh3qOVgw5528HNNQ5rNs4nTjC8krszbm7bdsTAIBJPtTJUUEFgMM3Ge1a0Yxa5o9DllNT+NtMx7mWTeN2exH41Jdru3MBjaQAPX3q8PWU1d7mkMPKinKGtzPkuMkEMRnIGKzmSTqSQOQAar6vFddRKT5mprfYfqF3/o7EA7sALjvVaVWKfewQoJNaUpNz5WiHB1ZJ32Ofewt9SjkS7t1YyZBDDpWjGUGFP3d2cj61NRO6XQ0eIUGmpWZ5Jqvwe8KarO7tbiOWUk4VRgntn/APVXrsrfNGckHPUd/al9U5m0nod1POK0ZRS1ufKesfs42szb7KYYdjkHsfavq8L1B9c4NEsFFNa6nVHNajqOc/hR8I337N2o7QIZMSbvlOOtfdxQZBfLZUk+o/yazeFalpK5zf25CcUpR69z8/T+zdrcu3eVwGABAPX36V+g8cSiPAz82AR6n1rOGGTdrndHN1N3jHbrc+BYf2XrpmQXFyoPYj+HP58196suScAAgj8veoeElFXUtRUs5Sd5RVj480f9mLRbeSN7uQsTjJIP619gHay/MMYOST2q6eFTXNJlV85m2lFHkOgfCfwtogQ2unx7kZTuYc8V67GqZ6A4IJ+tXDDwilZXPGli8RKTlGV0trGbbWNvbBPJUBOc47elaoCMAcHuOO1dMaMY6v5HHQxs1J1Ob5FYxsQOg5x9anORz/CzYJFbVKbtypGFKrJT55O1vxKm3YCeQMjkdKnJ2n58hNpOKJNtqLQ4Vpq8ltf8ySLlRyT0wfWhWBXKkAEj680pwcm00a1HFS9rF6eY1ykgcOMjuvrTcFmBGM5Jx647U5Qbersi5RXLFp3ZxPib4e6H4hgb7TaL5hYnIHXNehKN2M8jdzntWPuxlfc6JY2u43irpnx1r/7PN0xabSnBiUABT049K+3bYDZGrjKqxIBrn9kk3KG1zfB5lVdLlqK76M/MXVvhD4k0+V8WMmyM4yF61+nkmn2twMSwqQ2Mk9Pas6kVe7OyjmtN0lJxtfQ/IrUPAGtQsA1rIHySTg4FfrFN4V0Sdf3lnG3zEkkdfasYqd22dFHMqdROSi10PyHHgbUpSFa1YhgAQwOCK/WZfAvh0uALGMAZPIGRSlCane3oarMaSqRpqJ+Tdx4G1MMMWrkNwpCnmv1pHgXw+20jT0JOQcgYWr96Ss1YVXHU41NI6H5Hp8OdeunRYrJyGySCD1PT/Oa/WKTwvptquVtUBToABx6VVPDylKzKr5lCzSXmfmroX7N2qaw8cl/lITyyjqQTX6PR2kcUmUTaUYZA+tdSwckk0zy6+Zybb5NH1PH/AAB8KdF8IQwmzt0W4ixhgBkete0xQ7QoTu/Jp/Uo83NJ6nNh8Y40+a99diNUjiQKBt+UngdOKbeBtiKjZfkN7CuhQSsorQ87EVIyi5w0dyhNqEQbCgY3HkfzrAmjkC5DEEscE/yrenhla3U5atdqXOlpsTTTq5YrzwDWcuSSC+VwKJOK0TOmm4Qi01qzBvFO75uTuJNX7mMks+cMc81rQh7vM2Y0a6oNQh1ZzogVSoBzk4Jq7INu9mOBtJFbT529Hqc1RKo+R73KoiC5bJ+UkketWouSpZc+YcAelRKUmldHqwoJRu3o9kdHE277vTOcGoUfaE4xuYDA9a+WhTcpqUehrTqzqK0loy4vJ+9xnnNRjjof4wT747V1woylZW0M1KMptzXw7FhT/dJJLrmkUuMqMDdxkdqzrSlJ3k9DNRcLRbv1LIbbnPJwMDuaci7eucKDW8eVWaNKVSUYOU1rqKqKxTdkhWH481YVONwJPBIx2rSabvfc4UlGSlbQdEcLuIORk4FWVU4DHncMgVnduV5Hq1YKNON/kPi35xnHRgT3z60kStnOTjkc05yXI7/I5oSk04x3L8b7SFLH5mwPrUUZ28cgbwQf8K5uV8ybLdOdlFW/U02dXUncSC6qT6Z9Kzy7lflBB8wDj+ddvskpJtmFf3o86jqXGyCCSOOAajTkbGOQOAT3rNyik76mrgpRjFvQATlsHAPHFPHAyoBAzj3rPWUHdaIxhTTqcyY1SSTuJJHQHtUihflfjcMn6ClZJJW1Ot2UrSd9BYV3KB0wSQO9CLjgtlskjPenHnk7yepKqxgnTfwu3yLGeAPTAH1qP+8OmAMn+dXBK12YVZxjSUorRP7y1Fll4OMsRhu9JGMHljjIxjvWVaNlaLHRwk6ytezWpZUbZFIwRuGfQ80o+XI3HkAgmqWtovZmdGkotzabYwlSMgZ2s2akHICjPTkjvT5EkrbHRNx5OV6t9CEk8cDOTg1YWI78bs/NjPpmtYSitkTDCSqVLuWmmg63Yru4/iGKlghIUAPnHX3qK0FJqS6M6fZyneNldGzZyMAm4sDuyfb1FOtUY4BJHQH3rCtdaW0MaVCTknLW51Nq5ymxj1wSarQkpEU6g5yfWuKN42itmb08OpXnfRNnRpIQmzJB4yTWXvIGdxJcDIFbRSbXK9Eb1qaatfU1jPhCCx5J6dqxWulPJJPofSsoq/xFQbad3r2LU0u8YLHOcisj7UMnBJ2MevfFaODSUonFPGQk/ZvUfLKPukglTyD1FZrSqWLHIJP5Vpytxv1CcYyeu3QndgQOTzySO1Z5cgKSxAYk59a0cWm0znjKV4pq5Kzg5+YkAnANUi4Ibk5yMj0pTguaMFsa+3UY2nHqK0hfacn7oK575qkclcb/AL2B9Patqagp2Ma+Jkqb5YaaEwlBGBnggDP15pi5OBk5UE5Pf2p1K0YqzVzoppxhq7eZOsm8OcHGcH+tJEGRSuckZIJ/SlJKUrdDH2fLCM763LOQc5wW75/pSKoIByduD+NctXoo9Tto4i0mpdSLyi3TjcSW9sdqkClW6nduwCO2a1VNWS6nPySc3J9NhiKAu0k7eeR2x2qdl37dvYAN74rp9q0n2MZz5ZRlJ6vQoTzwhduSOMjPaob7T5XH7vJbBwPrTpxjN8yZ0VJyi7OPu/1qZTyM+Dkg9wau22kzjCsxBDAnNaylTg+RHPUwrbjK9mzEhjeR1Xk72IB9fQV6PpmhIpiSQEHdzjtzWdTE63S6no4TCznJe0kcxY6dNGm5wRk8k969PutPMdqhCH5eM+oPUVz+2jOSv8zadppqC2POZrEODkEMGwR61tPDncBnBzihScZLlZxVqMZRbexkw2zxquBnIAXPsK1cDKp0O0Ag+narXPs0VGEfaRkneS6dyJINsbEjqpNXk+YFeQQBz6VhXrJNJlzs/dmuv3ma8AUEhsndjgdPU1qJBn5cnkAZNNxvNObOqNRKmko2V9DnmUY28HGc+9ajW3GByRx9BXRFRlK8luc9SLnBStotzJCA4HO3aAQe/vWmqDO0k/KefasqiUXdLQnDynZpaJbFEx4+UEh+2KurFzlM4OSRU09Ypxdia9ePN726GwoNgwfvsDgfyq7DHtVAcYJJyO2an2qbujV4iSmm3ZyFVDxyT2/wq4seNo4IY5FN3uovYxai1zyVm9BgAwnPVQBjtTwmwHepJUg4Hek4p6NiqULOKWthFjG1QSSSxyT6irZUAKOQcggjtWdO7d5dDupw5Zp230K20gkchlAJBqaQ5IBGMcn+lUr2un8iXiEqipQjZa+hGAxTI5IY4B70owqkc8Ngn1rNJuVkc0YKE+WbuRhc5BYnacAntUygHkcbsZ9sVvGzldrRHRGipO7duxAEGQm05LYB9Kulscq+NxAHtUqTbcktTChhls5FdIyDkjJ5GD7d6vJt3fOSSwIGO3FYpNx5XubRSnJpq1tEVkVnBzw+4E/Srm3zBhcr0Jz3pxeqjBGcaMqaam7plJQSSp4Ug8e4qy4IycDBY4I7e1dFWcmr9TKg+RNrVdhgUDOCThuaehUFRkkbgSR3HpWdTmduU7IYWSl7RWsNQ5Ug8gtnn0/+vTwCUO7BJyQPxocbNOxnOL+BO6/rQlSUjYQSDuGR64ORUG1yQTjGQSfxrSpT5rtMmreCUbehY3BQOTzkAZ9e9Rb25wDwdoHpWKipRsJJTkm3r2LSy5VQc8EDntVLdznJwFI/GpneLTRpKrTlC0lZlwycNyR0yR2qoZG5UkYBzn1reDta4QhNQk4k7y5C/MRlhkDuT61SLtt44PYUVaK51ZmFBRnHmkthXm3YXBA3dB3qr8wXBOSzYx6VMZNztDc2q4VSd56oY7YywORkYpmD0YjAPPvWqpJq7OdxnCXL+I1tpU9Rgg5prtkHA46j2rOcZRXLYcMXKCcpxK5YBgeuWGaqupZg/wA2ASK1nJtcrM6GJfs3KK0LZUHPYFsj/wCvVaR8qrZYA4FKlGSjr0N6dVOKc9mShgocnJIJP0z3qqzEZXknZ1HtWVTVRurmkYxUuZDs7hweSSQT247VVJYfdY5J6DtWispcqOaGHV5K92tSRmB27SBsPOP0qvvbaVJIy46960dJx91apm0atOtBSekl1I8sehBUrx7A0ff2HJPzdu+K0nS5mmzKMlTbSd0C7wVJ6gYIPsaseXyCWJOQfpWEpc8eW+prGMV77+4jXGTkk4BIHp60oYggZO8nvXTSg20kcmMppScdtrj9nykk9y2akTAyN2Bx8vpUOVrNmSi1JQTJlkC5XnDEnHrVcD5sbs8Z4/nXPVpNrV6m86nLJpPQYXLN8ozyOTT2xtAJ5JPNdNO6ioroTScZrnigA3tGrZO0k5p0KkHgkc5zSqTtFROvDpu9RLT9RjgfuwxPDk/h6U6YhQoO7dubn1B7CinTUVc5MbXtFSe3YrxAjHbLNxzSQuynknJJ5H8JHSprWbSfUWBw7cLzZKsm4quCSp6n0qVImVxwCRgjNKUofEi5xdKahJFiMAbeuH5I9KUqRjuOmB2rH20lGzNPZQm25dboexUhQvBA6fjVdT8p4ON3GKr3pPmRyT1SoJfMsqfvNg54AFLGxYELncRgH0qqqTab6FUKPu+7p/wC0ucgH++B9KahJGcnAYnHrQ3a6XU0nVUnyMtjeHHOMY59KbGQQSOTuyPxrOmrtKSNU6jaSdi2GX5iOTgE1HzgBSVOwggdRSpUYpcqfmJ4hKS53cd5gHl8/e6EdxUUpAGSCN2Mgdvaj3ZXi9y4tOcai22F80gjOByfxqszFi2ByjA5P6/lW8oXikdGJaV4xW3UJmLKwZTtXOD6juT9KjchsZYk7gMVK5oe7HY4a6fKnvczpArcMQDg5B6nFPkXceW4UHgdz2FNvmai2JUY0opPYxpUw64GPl6nt7Ve8pyTkgDcPwreo4K3dm6mnKzW1vmY0sYZQRgcZI9RWg0XGGPTIzV2ak4paC5IxV09XqznjGQflHHRSK05AFQgZBCgA+maLWai1sRKcIxcpbMytgzwTkgcHsKsLFubIyC3H1q685J2SMaFWLfOndoh2AuVXhgAAPU051CA7DyADx2qqCaVlqZSp399y36Dxk/K2AQCxA7UsQYFic8YIxWde8EodR1qfM3NIZETtdQSMgEEd/pUhUqBt4yQTn+VTKKspNGdCyjaL0IipGSSTyBmkB3Da+d3XJ7kAYrT2d0mbzxCjJ04bsrgZ3ZwTkDB7VOyjgnA3AZ9j71go3d2K8qMFJ63II1ChhjJJGT6elSJgqAc5J6d62vypE0MR7Kolbe/4j1XIzvOM4x7UYUKpCnAPWootN8reo6ycoObSsLtGMAZ2oSCe9LnJAbIAIxjoBVQqyupMiFK8Xy77IhYggqCQcAjHao3BUnJIB4IHatbub5ovUmE3yKMdPUgJAYKMgsvNVwxPqRkgD0raVFuNnvcpOEZpVHe6/Et27LuUsQVXkAd6rYA3tnGSvA781jeMdJFSpNVFKDNQyhQccDByR296yGlfbwCctjn2qZ8z0gtTnlCUWpyfu3OkivBHHjkkYOf6Vz0b5DLzxgVvZPVsij7Rpxe99DebUgdvJwfT2rKhQMjbwCuCDn071zPDqLVjWUnNpSZ0kN8siKWbgtj3NUYIxEuCM5K4xWE6LhNNnRHmqTXLol0NrzMMNpxkAD2qkrkhQezcg9/aqmuZcsi8LUk5czVktDYjlCq3yjLMoBPcDtWYkvzNkgk4H4gUuVRs7GkcVKFNwir6sW8QDJOSX4J9BQ8qsCy9UOTn3randR5V1MadRxp+8upz7wKiu7kkFcn296tXK/IRzySSB3rShFKOo6spOLitzGTHC98jAqQAxbVIIyBg/0qqkJXs9TzFBq8uW2g2RI5IwxJyrgY9u9IzCEY5IJH86KdKy12OiFJSjFS0t+Pmc/eW5SQf3QckVq3QVsMoz0zjvV0n7jaHiXyLlbTS6nISW4YdCAdwyO3pWtLCyOTglWyQT2xUrWSe5pCckr8tm+pgS2wYiIsQ3HIrSZOVB4PIIHf0rXaV4I4uWbSdV63OaubbIxuOQxIz3rZki4LMAAMkn0xVNuylcucIzbjJ6HPJEdqAgja3GO/vWk6ZJToAf501J2bR00aym+WW6EhkJyO3qarptCYDEAZyK+VpxSleLOuUZQd5Py+ZoR8PtJyASR7GoYicKQchmJIr17vkstGjzqklGomn6I0UxwxJGSMZ7U9DuUHAxjOfTiuWm1dpHU7Plm9dSzEpwoJ9Rz3qWNQFXjB2YB9eK0pKLtfceLanZSepZjXcvsCOPUdqfEeFIJ+cg49KblJTTRp7JuFpO6RJtKkc4GSBmhl3ZOcEYJB9KyqaSSbM6lR8iaV12HbgpVQMjdjI70AFOWGeOnpW6pJS0ephOabUWtWSg/dJIDdMdj7005bAyccnNXCEm7vZmNTDQVpRbut/MkUhSDnkuc+1QRgjCsD8zCiME7oKOISkrO3cvRHc3zHOGB4pkZA5JBxwTUOm4WSZ6Di5OzaaZYXgk4ztYDn6dqQA4IU5JbqO2aqtTvGxhzqDslexLGGBbnOefpTkIG8E5YEjPrjvWdGd03JBSqpyetrjl5I3YwG5x1H0pWyTGoOASM+1XGo5SaSNMRKFOUVbXuOAGSDzvbDA04bWPTHXOO9RThdqUjPFYmLskvhZKvB+R+EY5HoMcUxdwweNmePfjmlVppQ5Q+tpqM2i4HDKGPAL8D1qLeoIDDAViSPSsqEG3eJ6NVxnC3clb5cKXxvBUH0+lIzCTknBGQT6VtQi2uW5xVqailzK62T8yVTsK7skhhkjvTFQM2c8K2QfWlUSbs3YSk0o2V7MvxMR3yGIHHao4lY55ICMSPxoULu9zSpFSilKPWxp28rJubHygEH8KjRsDG7sOtc9OlGWrLfNFqCWxvwzKVbJzkAnHfisUSlQnXDYyR2p1MO2007WIp16kY+91NsXJIXDY+YgE1jeeMqc/MGJHp+NN0U5JtDjjE4JSWr0NRptuMkAAE4HeqgkB24Gd2TmnQT5XKWiCvdyj72pIZcNkZAGf1qvISOM4Py496lpVUolWSvNq/5jXlzgjPzHGD3qqXKlSThdpNdVROnblVzkqt1ZezlutibeCApBGUPIqkZJOhbk8AD+dRShK7a3Fh2403GRJISyjaSM56d6jYhlUbsbcZI71l7W87Lc3veLd9BUZNvXOSQD61AZRGQTkAseB703F83Mkbzm4x5JPTT5l+I7jtJ4cgn2qrFKVIx65yPeiV3G6RkqcYNOL3/AANEAAlsHdgAE1XSQtkg/MAcZ75NZwjeSZrLlcWm9FbUvoRgBs9ACT3qqScvy2TgDHalBSSZWKjB6x3aLaDdIqDJVnAye9EP3Rx0wT7805wbVr6k4eUpRSaskWoo0f13EkZ9akhOCAcYBypocm9FuVhcL7WDlIsRw529huGCatQlWUMCSWxkduOc1MqqSTe5p7JyTjFXsReT5fzc5Ug5HbmppZVCs745IA96hXjJNPQmMuaLhUVti7p19GHVZPvBiC3bHbFY5mWMgng7unYVM48ystjsp1eWTjJHol2ySWcbKxyrZBHt3rHtr1DaAHPA5pUJpO0UbSptR9pN2RzNzCAS+SAMEfjV2dg4bBy3Y+n1rpbTkk+hxV6HPSTT1MgRHKNk5AwR681YY4BxwEzuB7Y6irp8/RnPUjy8tRLUEQbtxJB2gnHapURt45JG7gD0rBTUoNTfU2k37VdrDkAjTAJ+8T9KmEZJwOVJxz6e9ZWafM3obqScFBK7KLqWBIwSwwCKubd0nH8WAT2GK6ak7RUjmjT5oqEt4vUzWiAI2ggdf/11olAOrDIIAB7+9ZQnLlcTarOEleKsZKR4cNjJ38kfzrYSHGc42l1A/rST5ZOMjmkuSMZIoZCgA5G0ggirhh6qD3OCe9a0Yxk7siimpJX1G2+HUE8bHHSpUUqFK5GMZA7H1rKtNwlyR2HhadOSvLWWpITtVtoJ6YFRMWBUgkcHg1q5Xhd9CqdDlk4y2evpYkL7sYGSRkZ7+tVtzrgA/NuzgGuWVRRV31Oihipyi+yJWUHaD3ByKiEhJG7Jxk5PeumnZR3MZ4uUpcq+EcwDABgGDDBB6GoNzbiCPTAPaqqJqz3OOOJipNtWHqzHA3Y+YDPpzzUAY598kgDoaUtY2e52XU4prRFxVYsxBIDMCAe3tUSPuYEPjbyR60lFyi0bUnTlaFr2NGPAK7jwcdP1qIMoGSxAAOKUZtxSSsXyuLU3sWgNqM+7BPJFVlcsFySEQgZzWroKLvfU4pVk5t73JlkBU4X5mJOD2IGKgWRQCoBJ6HNKUVdS7nSnFRaT1RLGAdo6FcnIqFXIK8A9QT6+vrVOo7uUdzNyjCKhJ2X6lxkOMBhnB69qiLhiuCSrDGT1P1qHKSs7m9FKdS0VsMywRck79qlsdAR1qVPmUFicbgCPUVlV0d2tSFGTbcdLkJ3FSGySXHPpzVqNFwVcYLZwR/OrdOEppJBCrOlFtorosh+VlBLSZOe9Xo1IKk4yOT7itKs4pLuEaSnBwWz1M7ZuUjafTHpWt5Rd93GB0x3qPbpRUpbHJLDzT5FKxkmIttwxAAOR/KtJlBY8Abj19cUpOLjzQ18jpp0pQlzt6GA0TKQxwWI4J7e9ajRFmXgZBI/Oq5NOaW46lWdV8qVmupiSjIbkkbQATWo9uCmQcnBz9aL8rSY6mnxK/mY4GQeTlf1xV5oA64yMkEEjtTknNprYiMINXijJOHA56kkn19Kvm0wgYEEjoKOZKXKty6kZJK2t7aGU8fyjodu4AntirDoVYhiCOmPWtaELO72OOtyRl7JaMoEtgcEgAZHrinsCpAJOCwIFaVYuT5orQc5RSit35fmQMSpGCSW7gfzpxbnK9GOSRXJFpxVu5dT+Mk+i3K7fNg9FGAQO9ShABjnOODXWqkW9EaeylUik1qMRMLnB+Z8A/QVPk7RyTyQ3tWco+9oYQp8rSvZJ2GOo3K2cKBkgdqkLZATJ7sc98Uc8L2aOl1XNcj6dvzISMlDzgknBqwF+QseC2QB2WrhNwi4owdeLnFS2vuVgcMM5+ZSAO9T7ejHkhSBiqU7xT8xSUI1rvYAE2FuQWGMn2pD8xHOMAgg+tNxUmpodVwinTSECbgr9OcHPaow+0gknk8gdKxlFqXL03M6dCFrvQm7BVGMgZ9+KaGGTuJBYgEj+GtXKCXMtyo1fdUYrQJXYqOAckYHpQx5A6kcE1KneSdhxglFtrXcgSLyypPIbGfw6VMGztJJwGNXOlZmfsY1EpRbVtSRXViACSAwOTVRTgg5IVSRtH6VjKEErLc0pOVSpdMvbgsiAAgMTketMT76tu43EgfTnn61KSUbMqdNKag9Giwij75ONzAgDtikJwF29MgmsuSMPdY22kpp6/wBaEyBSpwQVIBGKiHyhFBJA6Y7VagmkyJzcW2upaUAlVyQRgkeuaRTnJLfNkYHr0q/ZuPuvcdCvNNya0Rch+Yg4yFIyKYrYViScknFLn5pPl2Kxa5uVSfvFxcbwNpIBHPrz1quZQyqyk9V4NTBuSbWglGyutUR3GF4yTnHAqvLIpHdlbcP/ANdaezjGPKzKpVlB3a1Y0ndHtJBBBznvVWR/nXJ4HHHapjTes29DoUpqmot7j84+UngDqT0+tV2ddoIUgkjHvTjJyScmYyl7N3toiVmHzKOCGwCe/HWq7Px1HQZx2pualJNehnDENpre9riOwVzknhgcgdarM5ZQfyNH1eMI8tzetjIttLsMA6gtjDZyf5VC779qDHQ5Nazi3BJbCpRjBXkrpoifawU47k59QOmarFjuXnJVQSPXmtItNOKMHF1nGaVkraDtoGFz8+/jH9aRsDawJzuJA/nQ6s3K1tSFGNKXNJaSEfgZ4A747fWmAg7RkkFiGz3rVL2cmnq0arEU3BRStfZk+ORgYCnNQkkMQxI4wSfSsYwsm+4nKUpcyWmiHvgjAPGQQahkc54OBxwK0lTjJXT1M/bTb5Z9PyKxG4naSNoDZHen7Nq5yCcniqcWmop2M1UkpKtutrFYxkjljnrmpGOz5CDgMAKxpxv5WNZNSd9UxcKcMc7hwD9anx8iZOcgkE9x/jSVSKTiVLC8vvJ3f5FdMhSGblSWIFSKg2kjIHXHrxxW6Tg1Jbo4bTlK8XcUcDdnOBnPrS/LnC8HgkjvTTu3danVWnKMvaLZqxCELkFSQUwdo7+lTDcZFw5O4lmz2JPH4YreNNKN47nLhqznPmm/d6FIQFQcn5hzj1rQZckNyeOg701OyXNozRRUpKF9DIkTG1R1IwcVoypswRz8vQd6542mkn0MasnBq8dTLiiZc5PG4YJ71fVWwXxk7cgHt6ihzi7M6HSS1kikygbMk4Vic1JJFjI5+bGc+laKTck3sY1cRFU+VPbT7y5a7mx0KquOe9EZMZGDjbgfWprxeyZrToRjJTbvoX1lBLAjo2B7VVVzkP03dBWU4Nr3djthBKHNJav8CYzKBgZGcDI7elVSdu0DBByTirULqz2RWHqc0FGK1LIlLPkOck9R2qkrMDtR8FRkk96OblVmzHV1HCS1/AuvOMhcAKeD71nO+cv/AD7e9Y0aUra6M0lUtTXL0evmWS3OT1Iz9KqicdAMEsAPat6smlruc8qUb86eoOA7DsSNw9qid1BbGSpJ61pzcySRnTpv2qc9EyCeRQByckkYqjNI5O3PB7jvSg0lpszpqUIyTu9eg8Sbhlc43EEHtioYsKGBYnIyfc+9FGLV/M41OMZODSewyZsDt7H1omIZc5xv3Ae1OEk5Js1SqQl7nf8AMzCrO2DwWwOO9WXOPLIPC8sBWrrOMrJahDCSg/aKSd9yptwuACcEcHvT3Y5OATvGABWc6jtyxWpFD2Um+fe5lNCS46ZJJwanJUFhkgjnI7+tdHK7WRErRlzOO3U5pFeUoA2DnGR3q5GUUhQoOTnjtXy6lJvVbHVUqqTTjsy5AgGGYEgZ4Hep4gV+XcMbg2P5Vq1J2S1HUrxUnGK2LMIZFztyN4JNWYcIg/u9Rit5X5rIzw9OMk7NrqWowvzcHpuz6UkOMkckKMH3PaqlBtJjp1lUTgyzEoyVDEZI/AU+MBwVyRncMDqfcUSvf3lYIVVyKK21RLwGU9BjB96jUkMMklhkgntW/JaLktiaVbkST+4lDAMny5OQcevtTdyliACWGSSO1ZQldXS12OOClNt30IP72XPOVyO1SNnrkdSc+uK6W7JKXQUsRJNRhu2SqwjUdeoBJ7c1EV+Z+fvEAA9iK4+RKad9zpqc0Gla5aO3C54+Y4FAT5ctgkEAEU4z5Hq9TplKcrSpq6dtCQNwoBON2T9KjA+ZCT8uece9VGys0ctWMoylF6FncARzyRgEUwDcMZOd4yw7elauN1ZoXLBwjK+rLkchxxnIxg+9MVdoduTwOOwx1rmqK7uup3Rhdq/QlVgeNwBJyBSAnCgjBJyK1jGLV30PNnWUqzVrDgcAAkg7SRQOWLEklSSDUSklK63ZUKr5VBau48EFVBB5yAfXNIcAqMkHO6tFBu7O2GHknZy2Hq7SbVHXcc59KQbwVIU/eGR6VpSgou8DjpVWmoyWt73LsTYBVc+x9RQmGVQeO4PtWNRRlK76HVThzR5lsXod+FzkBsAj1PrSxnKjOSDzWfM52v0ZvRi6SaXUtKg+YdAz45746U+MkkYyBxnNRKmm2r2ORxU3FRevX0GyJgDJOMngd8imSMSpJY5xjFVRhyy5WayrU5N21HxhSCc8BxxTYYyFXLZIYHnv7/WumvUfNaJgqbjKUl1LCuOT/tAZ/GnYxzgbmwCfpXLUi3GzdzohhbL3tBS7EqCMfeBPr6U1shQcE5BP0rGjDng0lqdaqclTlSumE0JZcqOFyQfSmGQtwCRyQB61tGbsmt0ccsI3OTityu0RUnJOHwPpT3Z8oT93Jye9UrW5mFGcpr2aWqKhAXBGeWz9amKOVBI+Xkj3NTCKvaO50zo3XLPQpso2xlTxuPXv7U4xuAAx4VhjHbPrTsrtmVOVTRvVbCBiuGJwFX9c1EykMMk4HJ96pJtK6sSqUE1JrVlqJ2YM3XPPSoEkLkHHc8emKnmbtKKNatN8/I9n+BpiTEYDEkngEVUMmW2EHAJJPrU1ovlbZcaijFJrTZGjuBA2jBJBINVBKN7fMSWwSDUqm4yUt0c82pRXK7GzHKoydxGQBg9sVieft+UsRyeaxlQ53dPQ9PDV4xXJJe8iY62sF79kJPzgEeprxr4gSatp99pmpabnyY5/3h9M+1OspKCmlsPCYRV5+zqOz3PfGuPMhBPCK24H+Wa5fS9QF3oyzsxEggDEHtwPesqEud+6vkcmNrwpRkrbdS3c61aISslygYjkEjk+lfnZ8VPHmt6drt5Db3jBI5nwQTwewHtW2KjGjK0tyMshWxNB1In6N2/iuxijI+0KSSwySO1fjqPix4t81guoOV6gZOf6/wA6w9vBO7OyGWVJRUktUfsevii2yW8xeWyST14+tfklZfFrxZKqBr1hg8Eknp1rJV47nWsBWqQbfU/XeXXLI7GMqjdnkEcfWvyrt/ih4s2jOoMS2eSTxW9LERScbnPPLa3KnE/We01K3l2YmXrkYI59BX5w+APiV4putc0+1nvGPmXKgLk4PNcc8TCMbydjZZLXkuXfzP09jHmLuBxuwAe1N0B3n0uB3zuMYIz2OBW1HEpxSWzMqeCdBWTu0NlUxsUydwbFX5YtyoxyDtY49QK6qTUo88+hiqsrtRWpmNH90kDjJx6Yp29MKpbALAE/U9ahOaqcqWhjOTs5MI2AU4HbJx2qoZsMMZABAI+taVYprUVOjNr2kXfyL69GcAgqxBJp0bA/xEggZPpUU6ilaVy4x9nC8ne41cFXAxliO3t2qwqqOpDDcT9Kick5XfQ6MPGNNcj3MiVGbHA3IpBJ757VrmNX+c5GRwRWspJxujFSUYpyd3cxHGFByS5ZgR9MVckQcqTwMYIrJRcVZrQ0dWNSScd2ZhJJUA4IIJqdhtXIPzZyMU1UdrRV7mXJakm+7MTXNYtNFtjdXkoSENgse3NeY/G2YR+EZinBBPA7g104bDKfNd2sRKftnCla1y2/xV8NR5VtQX72Ov51+X17qVz9okHnsArHBU8gCuOpiVrFo9H+x5TavM/UuP4reGSwY6gpByAD0/CvyvXVbpwQtw5DED5iTXJHESS1O2ll8U5OL1P1dT4oeG3AB1JMjoCen0r8s01W9ATN3Jngkg9SOlbPEKTs1oczyqVOLfNe2trH6oD4m+F12r/aCkmQ/iP/AK1flkdYvmYr9skwSCPmPB9azqVWpXizTC4KU4LmlZ+mx+s+j+NtG1yUw6fdB2UE/KOlfGn7Od5dTa3dtLOzJ5S5JPcHj/PtWc8YozUUtxRy10aXM3d3+8+9jJuAG3hSM/0qIZCp6kHoepr0sPJN8zR48qPPFwfcseYu1mZiACDuzWbfttsp2UlSIWO70JBwKablK0TRL2bVS/lYrv4p0iJmjN8iumcqT905x+dfnZ4x8Sarba7fRxXrKouGxioxFqb13O2nQq1oucbJf1c/RlfFejHc/wBujHQcn/8AXX5hDxdrR5+3udxGck81wvF3lzs2WV1ZNR6Pqfp+/jHREiU/bo2JIAAPQE1+XT+LdZyANQk654Pb3rSFaCfMjCtlNZQtB7dT9SIvF+ksT/xMIwH6MT0+tflmPGGtIw/06Tggtgn5s9M1TxEWrJXNVldbnUk9ev8AmfqnH4n0qVwBfIWDAAZ+9X5seEPF+sz69psD3rlRdRkqx4PPSs/rLitDqo5bNrlqSP1LgMcgLjpJgj2rK0OcyadaSPnDQqfxPWurCXlBrqeVjIRjVtLbY1JEBGeBjilZ96BhkdRz3rR1E04o6vq1oqT37HP6nq1lYbRdTorKSCDjJFfLH7Qes3thqESW07IvlgnaevHU1tClBQbk9DzsLKVV8kXaSZ9HnxTo7KFF4gJOeSOPevzAn8Z61Gv7u8cAjAGT+P515ntbyTZ6lfLqnI1LfTU/S+fXtPLSE3sYZsEDI5NfmKfHOvqnzahIfU55rZ4tKya2OaOU13Dok/vP0nbxHpz8C6QvuICkjr6V+Y03jnxFsbZfyA7Qc56c1dPFxScWTXyqtCPtE/kfpuNYsmGVuFJBwQCK/LtPiR4piYouoMAhAzk/MfWtliYq9zn/ALOxSglFan6s29zFKrGNiRkD8u1eH/A/W77WfClndXzlrhw24+mcUsJWVRpJ6hUw86cXKSs9D3MnK/KSM8kdhmokI46gFsD3rvqxcNY7GcJwqpQnvsOhYqSoyfmA57VZRVI7kbgeKynaSu0c7oOnWTTuiVY9+4MSM9KsRKu4NyWzwPpTbstzF0nUhyva5CIWMed2Gd2PHYDpV5wCo6cgE4/Wj4pxTLd6S5nG/YyZFUYJ5jYgEHucVbkxzxlQCTjtWqk4JsxhWnUi3JW7IzioDY2kq2Dgdqlni+VMOS27I9sVlTS5k5dTZxdSNlo1uV1deSucEnk+lB5dVGVdlIH40nKUnZdGVCE1Vi29NCQc5+fjOCcdaZvCEjOQcnI7VLnKKtFHpNKVTmk9CNmJyNo5HB9KrSsQ3JOGUEAfrmuumpJXjqedXbXut2b2GuxHl8ndk5I/So0YhlAJLbgd3pWbpXk2jWhSUo8st0aUJyFVjncc81BGxfy8kAyBTk9B65pqo+blQsRglO027I0Ectt5OzIPTgikU4VsE7VUdew9a5/aJRu9xexW8ndEq4V2OQQcYPp61IXx2ycE8d8VpRba1JxrcOWMXoSh9vHbJPPbNNHGCVyCMsD0I7g0oRa1auwhj7NNvTYnVmAXOSxYYz71Tkd4xznBYHPoKqpFrRDpOLfM1bX8iYyAFAGzzyfWqo2nCuuSMMD6VC2tJmuIxSbTirMsO2SBk5OcAdvrVNmABGTkjII7+5ojGTVkc1SpJRaYkrHOSSTuBBNVpGDhCGP3j0/rV00nNwkzWPM4xbFdzhV3EFePrUG8cgZGGBX2qadk7dxzlJtvaxZVl2DGQWfH15qmshBIOdocHJ789K0lCSVpIKapuPs0/n6jpGTJUD5lAPHvVdnBU5U7SdpB/Q1EoJQUmaSg6clFPR6Dd52sFHI4AppBKH+HazYA9qU2ppJ7HPGi3Lmk9n+BEwDEY3YODTvlKhMkELk4PUV1Um6cbbpFzoqUueL5UQFgTnJ4UZx35oI3YK5DEkkD0rTRK70OWjhW5c7d1ZhGQUDEksMk+xpvK5AJIXBJPf2que9pyE6MlBUnux+4EKx4YkjHtUcZD85wMgAj9axqLVW2R0Uq0YxjBK7HvgEDaflbAPpnrUEkhGFYA4IJB7e9DaSsYtRhFuXVjieCFzy+SfSohIoJ2jA3DNTVi2uZbnXTpe5y30ZMrI2wnOdwwCOlQxO28MxyA5KkVcIKV5s56knCryxfa5pYA4GOByKro4Gcsd2eSe9ZStBqyvcqMIOLlJ66jiBg7eMkZP1NQiRf4iTlsgDvW8oONmtTjw8HVnGD91dwZvnCHOFbg+vrUO4NJs3AhSSB6etc9eTjadtDulQg6tua5YR1AZc4A5yO3pUTEHG0YGSCR3+ldUJKd5Lc8+vLkTgo6fkT7923LYxggjtVNGJK44U4H09K2vZJW17k0XGaSk7lgPuPQlSc4Pb/APXUCyEYJIycg+1Y1qblHkNKGIVOSbf9eRN8zcNgg9M9vrTcqcHHqD7Zq03FpJ6HR7OLlr6jF5GWJwuRg96M4wVOCpBIHb0rRxhFNy2OWrH3W4apDnK545Gcc9qryy4aPBPJyR6c9Kzo02k22LFV+dxlHcsPlsANgLwPc5qDJPI4UAnnvisFLmTa3O2sqsIJNaCSPllPJIyCO1R7w2MuflcZI7+gpwhZctyXzQacHq/wFOeApwMHr2qIuScDJOQST6VUaaVkkKnUnUblU0YzzMbe7FSCD3xUDMM5AzkYz6Vsqairszg5uXs0tixuUBQOCOSDVYyZ29Cen1FKEIp6B9cmqKhNXdwdmbHPQjIP60gcK2DjGeCe9Nys009zkVOVr1HZr8iFlUEEk5Hf0z3qFpSzAkZO7gjtWHLKUXY7Z4tNNRVmrWfcYAWyvOGGT70j5U98EknHYVvUbsmjHDwUW1PdfqNyQwLYJGSDUTHBGGPGfx9qp1FJJLc0ipQbvqtyOWUK2QT8xPIqNskfP97d27VdOLT5ZHNiLSiqsVqVi2CBzksCCPXvTGYlxgYIxinGFndK9jPWUFZWT3F2/vACc84570I/HzZ3cgE1L0ndvRHpxi3RUIamFFjKyKMNgjn+IdqfAezZABAFfO80aiu11MEnJ3e6NSIbtrc5ycn8O9OiVgVcZAGCP/r0+X3bRZbnBN05Ru99y0m4gY6Bx+PtT1G3ByMjAA9+1ddN86sY4mpUaTsW0wCTnAA5qRB05GN+cD+Rq403CNkU68nPlhGzZLb7QQRk5UZz3oXJAwcFSTmoqJ1FyoPaRhTfJv1HlsZOSSWzipwh655GOfStaDcbRe5NaUalNRe7GldytgYJPbtTjGeOQQQBn/Gs6rmpJDdJRXvOwwDJxxgYJz/SpVUfLyQMkDHpW1m2jB0FCXO+2gxM7ScEdwPQ1dEQZEUAgKMEjtTqTVSbWyQ4wcnFJ6sqoCMAkncBn3q00fzDBJGSDjtmoi3KPNFbHoqb53TW6IvL3hsk8Y59CKnVW2jBJJxwKwpuXNZ6WM8woqokragFDAEHpjOfWpdpDK3bp/LNaJRd1FnMqvMuWputhyqWRTkgnIweppFYoRuyDuyD689PxrCSa1ijVzjCVpS001JQoAG3Ixzx3pQOFJyQCB9ea2qaR5mGKlFKKbsKm0lhjByaCx3Agc7hgjtz1pNyaTWwqSSdoLV6/cP4JTJ4wB+XSlAwB2+bgCkrp2TIkpKPNPZskjztXdjI5JHemKfLUbmJwcKfXmtKkEndGyqtSjSitFr/AMAtIBuUDIxyCO9MBxtw+FByB6/WrVJqN73IlUSaqWsjRjlCKQ2Dhs5Paqiz5AXrkAk1Xs4rVIdapKv78XY0RdIm0MflwcE9vWsdyQu4574B7ZrlhTUmmT7Zwhzp+RfaaPOzJ5zz6Vk7i2ELYLcD2rrp0HNNomriKcZRckbNtMNypuJ+bJJ+nFQ20WCmMAbhk+lc9Sgm+ZPY7YSVR3g9bmzySMDK7ckmlj6McngDg9qwnJxSTW5s5VLKy0BUdlGcjLAilLkGMAtywBP92q5mnaLMcRQUrNP1IjFhsKcbiOnb6VcQsx+8B3B9Kzk+b3WTTxUIJqD0uZuw5AJBJTBHpz1rUeAMytxjcCc960ilFcstzpp0005Rlv8AgU48nI5IyeTV1EXkKSCDgg9RXPBKGkmZ005rlm9FcyJQwcDJBwRn1+tW5IyWVmUnBGCO5rsjXjZtozjTnZeyeiKD22Y84JJGSB2zWsE3fIx+V1w3vXPOLk1rob/W7JOUdTmigjBI5BcEZrWuYcBkBPL9R2rWaTSbIpKdOXM9v8zEMhcEHO4nODUwizwVG/BPNONlJJkuLdJqGt9/kRBjgcknkH3/AP1VbFsQPTGSfqe1XKMo7PQxo0LTXN6lUsXKY49RViS3KAP2IIHtXNG0dbnXQdSUkpPfuY+oQxXMPkyLlAeAafOCyg9WySQO3vW9Km+mxOIc1Uck7WMbzTZafIgyECnI9h2qvrO1NKvcAjEBOT29Kww0LVEkh5hNTpN1Nu5+XHxY1SSXxFfoZGwbljk+hPFcv8R2M/iXUkY5XzCDg9eTWmb07zSPYyCi/qihB6nEi5G9SpJwcEim21m8jYAIZnGR7V40pacrPWpVFGNmtTrNCLPLhiTtYHFdf4Y8OZRZejcKSe+K43UtLlsdUU3JST0OsstPW4iQjAPmA5NdPZNDZxNHtBOcLntUxquzaWhdSDslLU7D4eaYv/CSaUMYlW5UgjtjrWz8L7uKfxRpe1SH81Rg/wAI71hXbk7NHbhoOUXOL0SP058OO66fbRSEkKgAz27fyqXSFxp8GWHylQQO9d9GyST1Pk8RSbnKps3+RpTr+75xwDgntTHmRlVWbOABmuyknz2e7MJNyhzfgcvMG3EDI5wDVm5Q7C4JIGcD1r0qkvesldo8qtSckk3ozMLbUODlgCCfTiml/m55znIPauKdFxTn3N44mVSSha3QnWT7pVyBwAB0JPeq4YHKngjnI6VvGjFKxVdzTUuxoLcSKeJCACOneqaSERqeqshJOOSaxg+WNmrsum4zTqNao6KOfegPJJYc+lZ9rcIiYLHGAAPpU+12dtCqs4KnaTsW7kDCBWJJLEAds0rSq205BAx/k1rB2d+oqsG4xb2fUy5c45zznOegOae5Xb8xwAOSe9aRTa1WgT5ormk7pngfx5Yr4MYkkM07AY/ixj/Iqr+0BKY/CZVGIPnDcfQ+34V3YWCVJqKPNptSxdm+x+Z146meRsY+Zj+tRXjEyTKAfmc/hmvm68LSsfdc7bSf/DFbfgKAQQckmnw23ALdQcg+tTe17l0GpQaRIJ3jUBRkg5Ge9XUteMkY3AAA9qV7qxNPDqKU07MrpIZD0I3DkGrTQeVnofr2p3NE313Pqb9mkFtWvM5J+QgHtzzmrP7MyFr/AFCQZ5CoPoRzXJJXrJnPmTUaFoo+6I2JAbdj5hjPUCoyoC5X+EDp3Fe1T5YpJbnx8a3KubdEWpT7tPvPmA2W7sce3NUtUYjSr47jkWzg4713UuWFRJa6nNKbqJxkz8yPG9y51+9bnJuGBHpim+L4/M1u8kZjkTvkD2NcGYx/eXPs8DGVOlCL2OO+0sjgEnrg+1TGJcMxXB7Z7157irWaOyUXzc403oBXOehJH0qlNGMAjII64ocYtEUlOLSexa+0fMu5sFgMn/GsUyPuCsCTkgkd6UrrVI1V4yUZanpfgecP4q0cLIBuulGD3x1qj8PQ0vijSSufkvEOD3HescS5cloux1UIKU232P1k0W4xYW2zO1YkBH4c1V0aPbYWm05DRKT/AJ9a9PB3S5d2fF4pJzckzovOZ8ndjaORnrVNgyBucAnjHQ/Wu2EuTRq9zjlSnJ+9ofFP7SN3jWI1WTKGNRgd/Wud/aXuGGtqm0jbEhJPfNd2NSdBS6nTw/Ca5pS22PmSS7UlcZYZOcd65qSSRDgMcBwSB39q+bdpO6Z9FCq6do206m3NcqgLE4HJIPauXlunKsCSQSQM9qap9OpVKpLldS3oaUl3vYktwVIAHbNc60hUlmJycAj1qHFp2NqkE5Jx+ZrO6scBdwJGB3NZFpdt5mDk4bJHcHtWzgoq8jOOIgp8jVm9mfpd+z8pbwbYGPJUhs5/CrP7PjK3gyyYNn5Q307Gs8Ckp3jozz84xbjJU5K6PfEU/J13cEg/rVhdrZC5BySP/rV7FlFNS7nzqUqlRSS0X4kkJVcYyV6EU0E4xgjJGMelKpJ3u9jGEUvead7lsDaMgnBJ+aosHABJw3THb61TSdlcutXdFpSW5JgjAEnO4A47+xpchUyn8LHI9cUS00ZpyyUfaJfIUYyMjCnOAO/NITyuSduBg+tdVNy36I5aMXJWk7b6FeUkAFmwdpOR/WluFXs2ODjHYkVEI8z5k9jphLlkktUZjgkK4BGNxOe9Wy3UDgAKCaylJXu1oEpVG41L2tcz+Nyjdj5h0phARsdSTwa6aaXJdPcFjVGUYT2ZDJhgMnL8EkdCfSkIIfhQBuwD6U1om0yp0nNJSexCOSQemQAD3pVwdwDAMrAsR2FS7KKTR0JKFowd2WItxIOSQpII9f8AP0pIn5BGR8wYg96ubipWMm6kk5QWheR8MoySBgE+ntUG4EDOTh65U0pa7s4qEGlzt7dDRjf2BO4cGqqkjcD8oAAB9aupTkmk3Y3w9eE02nfdl5ZVBx1K5OB3qiSGyxyCDgg98VnO01ZMUYqk0pLzJZXJChnG4uSMdcDHWqrMGBOSFIzz7VdGjJyvchVVZyeqJPNIIC9Qc59aqsWbbnIOxWwP4a3pRT1bFWqOMlK2hNuG0e7Dp2HeoWk2tH1HXIHvTjzSvJLQzm4Rny2vcJMJg7sDqSe3rTJVzGTnIIIOO9Q209Xq+h1OTTSitF1IZHGMsSeuCKaxGQcjC4wPStknGTcjGHK05SerIi+OCc5IwRSsfV8Ix5x3+lYzqXqJvYKHK6VmrSELn5RggdT71XLYI5O1T371rLllFpbCi5N8snsTAs2wZwWY5x3qNcsfvcZBBPf2/KsE2kooUZ3crLYeCCqlDkpnr3pqt8uMgAEAkV0VKbcmnsa0q9PkUra2Iy2eRnGSAR3prrhjgnhieO9KcU1a5hRrOErPVjm2shZSCVIx7mq5I2kEcFgQR6jpWcLJ8iZ1Kt7SVmrP1/rcmbZwMkYIKgd/WoCeDvJzkEA9sd66ZxaTbe550/ZqolD4u3Yilfa3bd0JPpUDMzMQSclcg1xSagud6nqywzqR5YMsK42oCAdpAJPqelQK207OSXYHPpxWiswqTaiqK27lqE8BDyVAJJ701ASfmYArjHvW3LZ3TOGTm5NTXulhmHytjk5BqHcQ2/kDJJHrxXJJSUrJlxpxelReQjSISoJxuyAO4NBAKnIP3uD6V0qaS5eplioKUk09EG7aScdDnHc1CH+6WBHUDPfirpczj7yIr1YxlGPUmZwCCp+6wOPSoCylA3OSpIPpV3Snys1oOTtUht1RKrjAbGD0z61WVy3c4HBFRRjZWZtLEwba5NybptIYlSwGR35qLc27cpOAcFabqvlba3MatJxsntt6EynODnKqwJA7YqrG4G3ORgkH3rSpP3XdnBGMacVNak8shySCSQxGf8ahDHB+U8sSarSTSR1VJVZQvHbqM38Z3HJIwR61ExVmYK4O1gSB2ok0kop6slVFKyXToSmQjqSRzxUBB2H5ifmGPapqKzs0GBnGbclokStISvHTJqrK21QScAE5Pp71NOquZRW6OvE1EqV+jJS7EBuTkkA+nrVZTzzk7XyM9hW91dTe7OOdNzVr7D2b14DKMe/tUL8soDEKcEUQpKUuZvVCw8pRdp7khbccqSMgA0xiT3yQwOPSmkkuSQVZzpvnjuvxEdxucnO0ECoiQwJAIXkgelP2Cg+WTuT7R14Xj1QhlEjBRyeAT6GmYOflyPm7dqfIopRM8IpVJy12HHO3cPU5HpUBbA4JPrSdGUfeirnV7WnKUe99RjZyj8lOn0PrURGN2OikEAd6ab3ZMq8FUbt735ilw4C8/KxGfWjKryWGVUk4/nVTgrWOSWJTlzR0bZA6kbmBx5hBJ9eaUNv2kkldwJH94d6rl5YqLep0/XU4uDV0Q7eAW6Y6jvSOxO07uDnNZU+e/KwfJGmot2sVII1+6CcgZ/Op7ZWABGSS/JPevmeVrSO7O1TUpczjbldy3EAcHkHO0D09c05FJZRnHGTjt716UIc9NJGNOSblJLVllFxIvcjBPt6VLDtYbtpBzjNRSfLJxZMIVZavZD4srnA6EAn0qTIZyBwCRwK3cItRkc9eo+ZxgKrBt+Tg5H4UjsE7Z4xjHU0oybVkdXLCKaerZPkbeMjcNw9qcm13jOSRuHPoKxpyjy8y0sY0qXI4pu7vqToAxVXHyuwGMevrUsCHBbPJ/WtIOPLZ7ms6NpuaWha+z/dDDK849qsxFmC8kLnBzWM5WSsbRnGWjYsMSjjORgHA7DtTgWVPmA3ZGMdCe1azi17sTgqTi3zsa8fJUDGQeafK/wB0sTtVuMdvUVEG4pya1No11GPM3ZEbLtQhec4BI9qEcsCWxgNkAf1p4aKjJuW5cpOpFSg7L+vzISwCAH7xPX27VXuNxIJJA6gCuyjhkpXZy4tWhaD17k+5DhTjIbGaqIfvZJ6YzWfJZqSOTDpxjbdl0OHCgsdpODmoUzgZyRySfSp9lFNKTO2UPaONRfiWUbaAefvEAiiA7TtYnliQfesa1Xla5loelh6LlG8NfMlRvmUZ6DJHrzSKwXBKnkgEitlFXunqc1LEprlmu6JCw2rxjkmiTlccc5ArmhDmlzXHXxl4xUVd3GoVyHGPmC8+vpSxgjbvHoR7GujVRcmTiGnKMJrQdt6Y/hJyR3NObhdp3HccDH61pCsoxcmOTUqijBDl9ck8ggn+lVAzKRwcbmBHvVVqyWiW5jTg5e89VtYmeJfMRlIJwcCtfS7Fd++RjtDDg0qlSVOKs7lwwyc1ZpWLNlA7x/OOoIxXR7reKPbGwDDBxjrXBNtu6Ox0JRi5X3Mg5T5CSQoGSO9QXLl3YrnB64qopyikyJ1/Zpxb2X5jNxRk2kZLEkH09aQOoAY8DjNZUpNttvQqnzLl5Fqy7Cy5AUYBJHFQ+ft2fLkBif8AHFTVs4qS6FSlNrnskrtM0g6vtyTwDgH9aoRTB25OAOx7U0rpOa0Io1OapeK1NFAq/wAeepye9ZrStj5Wycdf7tN0U3Zs3VVpcyV2jQZo3ALdOM4/pWb5vB3Njk4/pUUZXk2jncHGlLm3ZYDAOxJ9gPTHSqe9iQCSec5Fb8qaaWxlRTcuaT6aE0rb0XnPzZJFVZXIC9WIU4HrzShSbmlFnRGU1BNqyK20KwJJGXAPpUixZBJBwxwQe9bT35ZGcJy5lKOyL8CqFGeDvwBxTkhdvLI+9gA4/pWEZ2dnsPE1VLZa9AuYshU6Lxlh39a01jwgDjPGM+lc1KUW721R0xi5RSlvujiZIyMY5xkH3966f7GXc56MSefpW0LN8rOeKaqppannWu2x/sq6fIAMTcEe3Suh8V2ywaFqZUHm3cY9K1w071knsTj6yUOSUbO5+PnxIs411u6mUhiZWJx0HNX/AB2XTVr0sMhpnPPoTXPmFS03Fn1WWRfsEo9DznSZ0En7zgl+Aahjj8twVYhWbJ9q8qs1KV1ojupSkoczd2ewaZdfZ4owhwGZcEd6w9GkDKi7iExgZ7msm09WjVRlKCaep09zqDsxdCygvgr6UyaJQg8sgBieD6mlurI0q0nJ3uemfBm5a48ZWC7iWVskHtUHwRtJx44ticgCM/h/+us66TaQsDWqKlKMla3Q/VGwvClvbqXG0xAj3x1rDtXkEMYP3gnQ+vb1r1KNFSfKz5L2snJvz2OhlvGcNtbCjIJ9c1moh+YN0YjAFejBxSTa0OOph58zldtdjQF6xyjYwSACO9Z3IA3DknkiuV0km7G7qqpBLrrccxXmXGB0IP6moJHJRgmSwOcVcantGlbQ54UuRNt2bHvKM5OdpHOO4qozbVUFumM57iqdJp2DD1JpufN/SLyOMFsjBYYz9eap+cEMZBBUMOfXisp8z0gduFrRkrzia0coySxyFYnA71QilVXGCACwyPQUSbilYnD03KTk1aK1RqLKy7Q/PGCB79KzftAP3iSc4z6VSs1qbe0bjoafmZ35AGCcD19KoeaHAwcHIBPrWLvGSfU58VTVSm3vtp2PIPjXoV9r+hC205Sz5OQOucc4/pXqlw0UqASYOSRk9q71iZQpuMlqziw96dX6xJXjHY/MO4+D3i4yPi0O0MM8dc1+lgt7Ubtsa7nz1A4OOK850PeTbPqKGY0pR9qo2Z+bUHwd8W+Xl7Ill4A7Y9a/SlILMgKIkAyQSOpz6+9R9Wbd+g6mcRg0oxv8z83B8JPFYZQ9k4RSOQODn37V+mCW1m4bKLt6EEcGrlh4xi7u5MMxbmpuN12PzWX4PeK3R3e0IIwoJzggdPSv0vjtbPdnYC/mA84qJUG2rlyzROLlKOiPlv4FeAtV8Mz3J1CJozKQVAHHGP8AP419ZxwojBo0AJJJNZrBc0ue5lVzWnXpqmlZDVtz8uD14JA6VfhweR1yOtdkKfLq18z56pOOs1stLGJqen/8Sq+BbK+QSfTmr+uSsmjX7DAUWrkfWilUnKonE0xFOM8PGLe5+Xni6yxq92y5y0zHPqc9q0PE7+ZqN4q5+WZtpPbmsMZOXtHc+uwkG6MV5HnE8QCqGOTsw3uR1qa+Cq5BY/NwMVwKL1udcYSSTZz877WBAwckcVHKRtU5Jbk89qrpYynO1pJadRieW2XBOW4IqiGbeoDkEsScd6OV2SQpuNRc8e56Z8OCP+Eo0gDqbsAn19Kd8N1P/CWaMeuLpTg+1cmJqqyR20ubVpdD9VNJG2xtyMApGM4HIJ/wqDTZF+xxsMlVjABr2MJNxV7HxFZL2rU33NGUo0cig7eSR7DHNU2lIcMG+6rAD0NdFOq4vl6miotpyUtD4U/aUUDW1TPDQqwA7Z/wqL9oosdejLnkRAgDtx3+tduYTboRa3NOHsO4Qk76XZ8hSoSNoBwzfNjvVsgctgBskkHvXz6aWqPoauF9tDlm7IxHjIB4P8RAPQirEqk4+Y4ycn0p8zbTZlP93TatdbGHMMDOflOAB6VLMhUblYkjLE/Xoa3hJOXM2bwquEHGS93oUotxeN8kfOM7e1Rxbg6LjIDgECpTcbroc+IUpNd3+B+n37PUgHgnTWUEblJwf4eag/Z7U/8ACF6cNx+4uB2OTU4ZNzSZ4mb15t+8tIn0kJSWBU4wSCfUelVgj4VBnYuM47fWvWVFWabPOjUdNRcF8RfV/m5yc4OB6VADsC9QWYAknpW8YWVkbVIqTtezNBcj5jkLgZz2qssgYjdn5cYx0NZzim7vRmfs4t3bLWcI23nBB6dKqmR1bg8Z/wD1Vbdpq+4OCcHKOjZY83GMsTgkY9P8/Sqe/DYLdeme1Zc7jLXZnNUhJRUL6lsZfaMjPGfeqhnRF+8cHPI7+1OpUv7vczpUbw5oy0RPKwUYyDweT3HrVc3COVOSFwcE/wBaqMlF8z1RUcQpRVN79yqUUrl8ZDH5h2pzMpOzOSQDkVMqj5vdZ1OhJP2k1exSK7iPmIUnketWgq+nXAx64rRVkkk1qKpRlN+0Stf8CqpAO09XHX1qwYowQcnPJJ9M4rbVtSktTiwc4wUnzaroQYLFVBJ5yPapEyhICjHalNqKu9WzpeKdWCV9ESpECMhiQygn24qXgoNucggHnmpdSTsr7GmDlGUpRa13GMAFAZs4BJHYjvUcmGxt4woAz+tK6cr9Cacm4Sio2v1GrK2WZgTwxz9OhFQAEFsZG4gED+LPFOrTjOKS6ahUqOLTvsIGw+4MQWXHsBTW67c45H4e1VyptI5JRm37y2F3HHmHnLYwew9aY2Dz0+YBfyqKKsnFkSqRXK4vRE5cE8ZI25BPaqitvwBn5gSDT1pJRTvc6qKjUu5aD2mwoU++SOnFVyCMndkbuR6nuTXQoprmktTmu4ys3ePbqPOWZAvRsKcnuaiZuY/mIAP+cVnyNXRUoxbXNpfYduAVUyTkkA+hqKR9uSQDjnb6A04QutHqay5KcErXbYgweTj5yQCelVX4ABYlVyRjsapxSV09jSjByTc1qTqVAADkrnIJ7VAXVhkE5KjaPX1qIxTXMyXCcp8q0V/vLIZcqQOrEAHvVYO2VBPHAArXVRaQlhoRd76oncjcMsRjBIHaqUpbAUMQu7OR7+tYU4qSV9xLEOKcl8LB2UsdvKtknHYimbgcKoJ+7kD3PFdMZPlcVucFLkvdu6ZL5nyBumcYBquVy2csVOASO1V7rTbfyNqdJ06nPa/mNZifnXkg5IPf2qQwsWA6LtPFYUnFRvIzqRbkoRWgyIYJO45z1H0pgznbnJDEZ9qHTblzlzvJqEv6/wCGLaAZGeBgAknpSQgkY6HcB+FVUu46vUabptJXdtB5BAbOcZxn0pcEDeWICnoKzanNprc1f7uV29OxH5pXjn5jkZqJn+YA5wykg1ooxSu9yaE+ao09gyrZ284zx/KmCQEDIHysRkdsVtzSvZLQIYaNW04uzuOdgBjGVBGQO3rUZIIyp4YnrWU4u+r3N6tB01zU1fyFAYkndgM2ST2pse/YBycYNavlhaUjlU52dkPZhkKDgjgk96jVGyzFifUHoPpVTjy2TZEJJyvLqIpKrlujOSPamsxxySQeQD2q6jUm4rc0nGKjFRexIzk5XkggDJ7VULDLDJIzgirp0nF3ZlQxcKl4JaD/ADFAYg8fNk+pqrLKcrwclxz65q/ZNq0SpXjNxls+pM0gCBeRk9R2FUPMyDtJ54xU+ybtJvRHLUTUeSKs3sW32ttDnIJPXv7VVJIAXJYlieO9SrczSHglJJOS2LZPynJIJPX1qoFYKSXJBYAfjQrJprY19pJxm+3Qn3ZCnoWAGT296jOFCjod3ApScU720JxONahGmo3/AMhwfcMZ5BOD/jUagMVAOORnPeiPLfmYqd5RXLuMZiqMOTkkZ7mpJAm5cHk8nHTjpW1OspSbl0OyOGXIoLZjM7DkZPmDv2xTSCSobALAYHqe9TKk/ibIp2UrRej0Izhc7jjr+HtT2XOSTkFuR6VEpXST0LqzjTi6UdxiYGGxkZPHbmmEn5fm54wB2pyk5XTM40nGCcneRXkOAdw5J5z6UMm47SeuK0U+ZK6tY5cK6avGotNxoc5GwghUI/3s0p4PGNvH/wBaoeqXkVHERS5G7Nsa6jaBnI+6cdjSuCUUA8Kwye5waKTnKXOmb4mlFU3GWqGwKAEABLcAH1zTomJRezquR718vGDT12OxpxfKlq9Sym9SiqC25sHHehXyykHjkY9feuhylFXe5hTi72i7ak4c5ALEoSTgdB6mmJ98knIXqBXTGMVDlexCqzqTTSsy10zgknOT7U1TjcOQW5x61VJO1kzlr1HGTcdkyYDc27qOOvf0pVwMEZ5Bzgc1FGSab+R1SozTVSDJQyqRnJOcZHekCeaVIJC5xW0qafut6kLGOUl7mi3LttyCecZAA9KnjXaF2YDDjJ6dK5pTTbstUFOFpc0X7paiOSNhJViCDSIzKdvHcH1P0qJ1lKScuh0zpxtZa3JWIZcZOckkY6Co5GXYXUkE8/Wu1NJ6GFGhFRvP4V0EbOEJ5GQxA6cVGXbb0yoY59ay5XGV0yfaQSajol0HsQw3ED1GO1BQEFduNuAoHQVdOrFy1RlUdRuMloinIdxyxI4xk0/yi52kDZzyf5V003LVt7BXotUrQV7kUYU4ByQOBnvU6oqtyMYPOO3pSqJ2tcyw8faxi1GzRNHhI8gkjnOO/tTtnyqeQwJwPWspxV9DqrQcpKDezECn5SAQMnOKkADAkZGMZz0FZRneVmVXwzhaTdl5ABuXIOCJBx6dOalTJUAkkAdcVVRKLc2KLm0ubUUMyhM5HJGTUiqdgyBkZAFZQqpy5UjreGUo3fu27kQG4Atk8kc96nUOFC9+SM9quVRyi0lsZYinGUE5PUGyceoP5UYb153AAjt9ailLll770YJxUY2Vx4XoTgguPwpBxIqgDaMEH1PtW8YO7cXsRGM7qElpcvrOoCCNiBv6H8Kqj76KCOZF2fgORWPPJRtsafUozftE/eLi3DE5Dk84IPeqnAyACM5Pb8amDV9GaJzcHCa3Lskgfa5JBGcn0xjmmjlNnXGck9/XNFPD6M54qPK6cdX1bIsnJHOAcgD9aZLlMkZOQaj2yU0orW5pWwTVNMcHYbSzEheearDJH3iQMDJ7mqddJ2aDC+4kofNF9J920A4VgSW9BVRcEYHI6Coc217NFzhCVproXTOMEAnIYEiqG9MncSQeCPWqclCSTV0XVqVHLmhomaSOo43klycE1QVtwBCkhQSPes5UU7TTNYTjVhaS1RoAiQDjuMZ7VErj5SQTjHA/rSpQTTlaxhThFTSe9ycIWJJOdhyPqaYrnkA4LAkGtOeaV2iqtVTjKFOWq3J/lwqn+8CQe1OC5IJOSTgVhGLvzNipU3G1SKuy5E4ABLEsq4x601cKwOThDwaKUE3zNmjcJvmmtWafmr0zwaqo2SmBwwBB9s81E4NXk9zaFWLcWtkaUfzbS3QMQR6U2FkMf3juJwf8P8iirJJJLS5pShKpO76bHIeOcp4e1BgcYt2JB71S+JEwg8MaiwPW3wMdvauvAUr1E4s8fMEqklCqtWz8ovG8Mc+pXYBIYSsefrWN4tvnbUrsHIZZVBPrkZ49q8vGxtUZ91hKUo0k4Ky6fI4x7NmPyYBRjnHer1tc/JjZ8+4gH1rhmnF8yO2dRRpyc1puS2khtkSEN8wIIx29aWONpp1YjGWGQe1VKTS5jkp1IuSt8L2N1b5nVQDg5zk9qZHZCMM5bKjAxWcKiej3N5NU0uVbs+h/gL/pHi2LKk7Ij07+ua0v2dbMt4oLPkgRjA9K56s1zxSetzqnNLDzbWh+hVuS0MI2gqqf0rTtowkA3YIGcD1Fe5hJuCutWz4CtBp8l/MqI7Yzt2kDJz2pssgSYKR8ropUnvg81cqrUVJo7MLOKklJ3I5ZlTbuPHViegx61518R/F9p4a0eY+cRcyRtwD93nitY05Ti1smefiFGFVOLOS8Z/GDSfClw1vJ+8cKQSp+6R3r88fGXiK51vVJZZpiY3lbB96zr1Y00lF3PVoZRKv705WufXtz+0rpO3eiqAMKwJP518EyIXQ7n+UMQfw9a5liUmm0b4fIFGTg3p3PuRv2mdPbCogJ34AJ6+4r4LkZo1DMxPYH0zUwxDhLTVGlTJqclGKlsfeZ/aaslKkoAMnGK+BoA00oiRmJwOD0IqfatK6IrZQ5SUVLVn6A2f7SK6hNDb2lvvkmkChO7Z6VxPwP+FbvLFrOowEsCGXd3Has54lq9jseTQpwUqktOx9peGNbudVsILu6UrK4GQewxxV60t0s4EhhACKoAx610Uqc5NN9Tx6zg5NQ6HmvxM8eyeDrZJ4VLbyCCex9K8p/aUnMWl2vzZLADHYHtXrxpwdLVXOXCTnOu6M9EcbL+0zNE2BGdynliOgr4xnbc6Fm5LEAH3rx5VpJ2Z70srp06Vr3R9mp+0/IjDYgOGDA46H2/pXxKwKjYRjYMgelKeKnJK/Qxp5RSjJO7V+h92237TbOAfKAzyQf0xXwWryI4KMflIGO31rOdS7Tsaf2c2lrqtz9Bbf9pGZyC0QK5Gcdc18QafdM6GNsh9wwfWtfrtkos56mU8qcov0P1j+FXxFfxxFLclQAkgUj1wK8d/Zck26dcPtw3nEAn+Ljk1wOvKVVxa0sel9QdGlGUnqz7XRVGdvRnOD3pkMhBGGORJ/D6+tenGTiuR7Hz7wfLW95mR4oJ/sHUyMhRasCR0BPP8qr+MWb/hHNUfOALcliO57V34JOU49BY6fMlG3Wx+Zmuuv9q3I8wkF8DPt6Vja3d7tVumYY/fuQD25rysy0qNXPrcHFxpJtW8jI1CE7V2sRgHr3pWuY5Ixzzzgnt7Vyxl3NqUpTSaOSnikXYpODkbiO/wBK15hGzAKxLFyP/rVManM7odT3dHuc/sKupycjDEDtU7bg644LEgE1pK7VkTQnJRTktT0n4ZDf4u0ZwwLC6XOe3pR8KQD4u0mPJyblCMd+elebiW6aUYdWVLm5bvofqFp4zYW8RY/LGAMd+KfYoBZwjcMlVJx+or6LByTV09D4+vByu5tWJiq8ZJxwSaWVhGGPUlflHvW/PaNolzw0YJSet0fA37SErDX8lTxEBg9setZv7R0pPiCU7ySEViB3BPFdeKbVBKRtk0nOTUXornyzdXAVlcngnIUd6p3DjI+XKg9+3pXgQjrZHt1XyxtGWqJfN5cZBUocE9qoliVA3DuSfSs4xsrDiuX3m7+Qydt4dORwMse/pVe4kyh2tnoeOhFWo66m0W5Xf2SgfM85SuVVyMDP8qcrHOSR8nTPY+9N2Ssa03Gya3P05/Z+JHgrTMjOyMYI79OtWP2fgP8AhDdOcZ+eJcZ75qMEk3ofP5zd1VHufQUcpC7GyBkZz61EXHC4IYnkemK+kU01aKPB5HFJpK68x7ybVCMCV8w4z24qlcXCQRM0jAISMse1Dg2ku5jPGpXjPdFwzbUxuA3HJIr5k+JnxssdA82z025/0oqQSOi9qtUlzc8tjCeJk3Gio3a6nvuoeKdK0tC13dxqeCBn9BX5V+KfibrmuySb71hFuOAD27Vzyqxk+WPQ7qOEnG8nqj741z47eHNMdo47gO6MQQDwPTNfmE2pyzMJJnYgnoT1PbNY1K8Vo1e51f2PUqR9opWS6H3lqH7TttHITCu9UOABjAr4AluC+AGIwxJJ7VhDFXV0tEejHI4uNpPc+2pP2n33KyxEqWAJ9a+HNz84YDoSB3NOWNnP3UtzmnltDqtUffumftNRu48yPkLjOOF9vwr4atLtf9U+ADnJ9ayp4yUVZo7KmU0pw54yfN+Z+j2m/tE6FceUk7BTK3BHcgV+ezTARqocn5iRz0pfWeXZHOsuVa0VJpo/VrSPib4Z1URrbX4BfA2kjNflDb67e6ZMrQXciEE42np9K0+tu3MXTyWKjZNNn7LRX9tcKHhlBBAIAxzX5u+CfjxrWjPDDqEpksjhST94frTp4tKVlscssHOFKTkvu6H6WCQ7eSAB1I715r4K+IOmeKrOGe0nUyeWu5SRxW8MVGerR5dKtGCtF6s9IILAkcfMcj1qNSXQbWG0Nu4/WurlSa5CpJzjzJ+QuduGBydwP0NNUOxHy4TI3Z9M9q2hWi5WS1NqMJRjyx17jCSSw9gMH3pzHBwRkjOAO3sKSvFppaGcKTleFR72ISMcAgBFPHY0SYLlM4AQEEfrSSTlyLYboJvmbWg1iQhc8Dyxj8KYrfKQeQ3HHanVab5XsZcloppXYkpQBc5IYcg9/rUYwBwSck4z3qeVq19mbUYQUm3uQ5Iy38JzkCl7t2JHArenJwbcmcUoyb91bELyZ4Y4zyDx+FOChyCwK85INKNZQldo6ZYaVSCqXK+5uo+6xwPwqRkO4scYIGF/u4o9vBtq2pz4ZTc23sxoYYbP98AY7UjBvlOSAwwMeveoUHfmXQ6FOpBPS7ZXJbcDvIxwCOozSYGQFGckEn19a6FdtKL1M6leKhyyWq/UBvYFeeg4pQchjzkgDjvXMrpruTSq04t6XTHxqQUIzuG0kDtitKxgVmLHqoDDPendtOR0zw6nUSSSsENoVUAHGXyB61sgY24IBwAcdqtOFrsnEVJRVoL1M94No2hsdcGrsnzZTjIOCR9axVmlZ6Co1JuXso+tzGFpuIDgnnGfT3rUYDCkE4VjjPeqnzVJJpmsYqnKUZPVamfFa4Izjg5FaQKKdhyCxJBFOVZS0iYc/tJvm2VmUJIAo5I+bOPY1cm+bbg/dYDJ70udJWtqjrnh1WTg3Zb3MOeIA7FGCQSMemeauSqGcHYT8pwP7uemKhXbukRBKMVFmQifKDuAO8jHp6GtdYFdFGAOWBz3zXTJpPmT1NqFNuCUXrqYjA5XK4AcEE96tviPIOQWyB7Vo24S11PKtKzktr6lVSVx16k4+vagbsnbkcAL7Y9auata60Oegm05xevmLucgAHnPHt9ahLjg5I+fBz7U1BS95rQ6JVqkbUk/6YyRnb5cgDg5FRmVMnGCAMbv6VXsXdSS0MG7SVNvXsRSHyxnGeMk96SQtIH2DBA4B7eldNOF/i6mVaE4rlprYpMC7HLY5BIPtUgibGSTwDndVzmqcW7mVGpGo+WS0IkZeoA6gHP86kjhYAYJAxjFSklH3GTWxcHJOUdhMZ2MCSPmH09KcCd21Rzgmo53slodVFOTTj9of0HDEjAbPrTWKlATnOSMegrN03JqIVKvsqjklp3HEBsbs7ck5qEsen+0QCO9P2aV0yHRkkpJ7ljaFYbeDuAye/vTlI2gnORkCrVNJc0kdNWipqMHsiBlwQFzgDJx6U7JVHGcEkkE1Dbi+VGU6UXHTZDVIYIQxPce9GVGAecEDA6CqqTbfOYYS10padiN8YBA53gEGjO5gR26+1KCsnJnbKjCUbp3uRSKCMMSOQF9jUyjOQWOQeCacaUVo2c1VpLmhuVmQkgEkEk49hUmXXntyMjqOOaUabUbSY403KSa0uVtr7l7qeR7VLksRyF5BBPQCtOZRTS2MJygpJpXIG5OT3J5HepPlwCVGGOQD2qYSUUrndKLlFyewyNAOdxJJGD6VNHzlj1Gfxr5WgpRjZm1eg3NQb0Q+MLkZXH8Q98GpQxwq9exrohBvdbGSm5zs0IoICEZ5xkDvVjgKFJ56/Sqo12lbc7K8UkpR36ina4wD0xn6d6aBuJBGA3B966ITikknq9zgrttOSjp0LIUccnGcAipFwCgIwNwANZ1JcsbxZ2XbUU1a5PE20dCCpxk96CmPmX7uSCPSpnJSimyZpwTUdlp95OGVcBSQS4P1qCFGGCzknadpqKrSfKnqZYSjKpBtuyLgcs6nkfMeT2pVHAbBBHJA701RSd2tVsa16ijJJLbck+8AozljjJ7UoGMknlmxWq5bW6mNOnKaST0uwQEcc5JH4U9BubdyT0A9azlP3feNPYKnNtO6Q5Axxk8BuR/WgMR0UlnwAB7EVrGTukjmpwTjK+qYqgbBxnL5GO9CAhsc45zTad7JmtKCnFU/wCkIAobDKMnoT2qYoCykAbdo69qcJqUbMqEpQkqUXcQdsEfLkkHvU8cAZgRnAYHNVGcbtMqMpyS5VdJjFHAOT+8JA/Cr4tiGUAkZyRjtWc4QcVqRCc4zba0RnEbCVJ5LgAjtV5omU4ZeAxwTVy0SUiOWbnz9ytGMbsknkAU4ZGAcjqQR2qedPSP3nTZKVp6r+tSRG+bA5G0YJ9qUbsE9TgkD09qwcZyfKzWXIn7nYQMByMgZzx7VKqM49MnOanEe/NNLQnCYSN2pPVCQwh+DgsSSCKsKHiKMcDABIFOdWajd6I6oRUa15K6IZ7cxODtzz19PerEszSr82AeQPY1canO9WeTXjyzc13KScckEnjGO/NSb+cscxqCSD29amm9UonRVanJ+VhQrDYuSeck+vt3p6upKYyc5HP86yhUc1Ip4VJpQ6a+oxiMMSeCOB61I5CnDegJNa2Vk1uOGIlJcjVu5XEbY3FstnBJ747U8nhiAB1IB70oVHFpNajjh6cpXT0BFyuBkYJyf5UqkKpYcBnyQfpzRGmnO8dxKTjJpfC+pG0fzkkdMEn1qyZAOOcZxzTVWUZcr2OmvSi4pJFRuABn5ZPlIHQ5pTwq45G88/XpXO7OWhzuMU21uuhMoyByRjg1AMrn5iFUk4HfFaqDvozmmozkudW6lxX58sHB+XBFVRgliDjORn09KcKXJG3U6KNRJpNe7rd9y+j4GA55Yg4qtGxH1AJOO9U4yafNujqS5LKL0Zp5IQc8kAAHpx3NVFfeAeRtfiorJ8y5TndSUZPlWxpJKE27cnDE4PbPaqPmqmwZyWJGKzqUlKSR2QxLkoycdTXFxhMZIOBz6ZrHE2ejZTJGfT6UklFcr1RdHFSm5KJxnxVuvK8J6iuSMoF478VzPxlvVh8IXEgJycgg966MDHmbUeh5+KlKNeMYPdn5j+JJFmvrvj78x6/pWJqNx5tzOSxOZ2P515WKupWR94+ZxSlv1IIvldUJOB19896hVwPlUnacEMe9crk3qx+9pbobFtKFlYEnAAJ9/pVRZcEc4ZeKLpR5UT7JS+JnWQXG5TjJC85PU1h210GZMFhgkketZO8lZGvJFxu1qfXv7OgVvEErgkny1Of7uDwKi/ZrUnVrucFixKAnPp/+uuFU+WpG2x04nmeFtFa6n6GxyExJ1LAnp0PpWWbqO3t2d3CrGpPPQ17NKVnbqfJRcHJSloluYviXV4tFtprueQBEQlQe1fI/xi+JhvLmbSrOYiMIQAD94+9eor043qLRHkYa+IqylSPMfid46udfvrlVmbyg5UKDwBXj99OzFyxO6RiTjvXnV8a5NxWiPqcNl9KEVJrVHPXUQL7zjjBBJ6moJ5cgxkk8nPtXG7t6I9CjOLV+5TEgw4Oecg1TZ2Eir0DtyKc9FcHzNtdDPuAXdowcruAGO+a9T+HvgPUPFmswfuWNosoLNjoM0/aKKbZrhsvc/fWiOw+DHwvufEF9DqF7CRaIwYAiv0C8G+FLPw9plpbQxbSMAkd/TPvUyU6zuzhrY+nQdor5m7ouj2+mWVvawKF2xBcD1rdQhRk5BAyo9/U16dDDRUbt6ng1cV7W7ivdexXwSp5IGOCKkOcEDPIJ49q6k7O6WpwVJ2ahI+R/2mHxZWKqQAASR65qn+025WGzUn5/KGMdgc4NdLvDDuXmdOWRisQ6aW6+4+FpCpwuTnsT1BprthgNwyFJzXz8oJas+kWGm48sXoR/Ky4KkMwxx3xT42AUOVAJHBHalUUVZoUW3G0uhUKbBsyTgjB/xq4FzgjIwwAxUVZJNM6acndyRHE0m+MxjAAAyehxUikK+GIOVHTvQopq62FCslJKT3P0N/Zd3/2LcOcgm4wAPwx+dP8A2XmC+H2fccNcEEHueOPpXLgoJVWtznz3GSjTiobH2fE2E5zuKA59aoLL8qj+Lkda+l6JpnyGHUpSblp1MjxtcBfDeqpn/WW2QPcCsPx/cmPwpqTEncsP5+ta4Km1K63Rz5k3dJvdn5feILkLqdycn77YArm/EF7u1O7I+757g+xzXkYpyU2pH3GDoqNJJbk0d6WPc85INcoLwKW2uSCTyf6VzWT1NtedOPzOvFxnBUnau5gDXMJf7CCXJBUDHcUlq7I1bTaaOgMocAMQHOGwe1YJuNx4JBIGM9qNU7ic5OXLeyPZvhPLnxrpK5BX7QPmPbjrWT8I5Q3jbSN2QRIWH4VxY2m5xUU7O4RaUXKWx+rVmwa2h2nP7sZ96o2Eu63jU8N5QJPqccV7WEo3pWT1Pl61WLq3kloXpijDAk+VR36j+dVC/B3ZIyefX2ru5JJcq6nNCDqNuK0Pz1/aTm8vxLOAWBLDA9qy/wBpS53+KrjzM5GNpPq2M1146LjSjz9jr4eUoRbXw3Z8wtNktuJ2huc+lZk04UkZz0BrwJzd7I9hYbmk5t3TLk8nlRqFPHAx/Ssdp3UDcSVANRFpSu9TpnNp2itO5JLds2I3POMYHYVml1+ZycZwB7VTak22KM5Rik0aUNyPNiwTt3DIHes2AjcqqCfmOCO1aOmkmiIqpUlaKtsfq1+z/K3/AAhOkbiNu0EY98ZpnwEYf8IPpTsQD9nQKoHSsMGop3aPMzfFeym1KPNynv0sgjXKknJJHvWXe3sdpbzTPkKkRbB74HSvoIU3JKMT53ESi6KrONrvY8I+NnxGHhrS3tLSYC7kBHX7vFfEnxl8Wz674huiZGdUndcZ7Zrvr1VRjfqdGAy14hc0tI9zz3V9futXunuriZmaRiRk1ySsxOScKM4x2rxJ42U5KbPo6eDUYulfTe5fkuCxGeFDEAg9eOM1AZMnZkHfzz7VzqUFqy4Qm4Sg9L9Q3yMVyCOmD60okKhS2SAeCO47iolUb1S0M5pQUYN38yCaRWBwTuLjkdsV1vhXwfqPi69WysYS5dtrNzhR/jVxqpWUmbVqbnFygrHGJIxDEE8MfvV9taL+y9FLZRve3Tl3wSD3OPTpUuk5JKO5E6NOMnV5tz4zVmY7x0xya+x9f/ZmurK1ln0mTdIiEgEHnH6Vp9WmmlLcqnTpxTmpHyF9obCoxPzLjI7Vqa7ol1ot7JY3MTK0TAEMOtckqMk7NGlas4JWRj3MoIHIOCAGHbHpWbNKu1eoBPAHanCMr6bmHOq0VKWj7E63ZAPznjBwO/8A9es5XBJOMkEZPrVuMuezVjL2MIpTXmex/Dr4gal4V1W1dLlhBJIodSeAPT8e9eQxSyBgQThGGDWVSlKKui/ZQcItxTv1P2h8EeKbXxPo9pfQS53oCVH0HBr4x/Zl8bTpcyaFc3BKMAUDHoOMgVth67TSkzxMbgvZRtFfEfoSjEcA8bsgDpz1qlHKWj3ZIXggCvXjFRXunluu+ZQb26lnfxuBBwwGKrI3DDnjvVRbTu3cftVJc19eo3AfaCTk5z7j0obIwwf5Vzkeorq9mqj5o6Bhamjg9mJhUwufvHqO9NJXB5ztbH046VlGmpNuT1NsNKcG5LoPOCMA4z2PaoBgldxPGcH0zVqu9kjKUZympSWg75VQqckPxkdsdqgLj5tueSMA9DzU+ySkm3qzau9FdWSJAV5GCPlGCf5CoQWwy7ucHFZewT1TMp1Wkkug9yWUAZUHv9KaXXlic7QOPSrpxtq0aU6ilFyhuREtsYjIAwCT79KckvmHC8gOOCa3dmk2jPCpv3ZP3epBIrNsOT8pwBVmNC78EliCcH69qKNVrRmM6kZNwhHRbFcKwAzkrk4Nbf2cLFtxkg9++aipJNpMdN3d0t+hBZkAqOQFU4x796khTy+XyCeQDROLcjshKKTko7I0yFJByDnnB/pVBpmLbsE4B2j1Nc9aUkrJGPsXWfMl+JK2cqc4O7gjtVWSQpvbrvIzjt2qeWUrNLc1pUU/dXxLUlkcFGBJJXge/r/9aqB6jJ+U4OPSt7qEl3RyKU6qlGpoWYpGyoznMhyT2FOtVDsQxyBz9aJyjz6rc2jRlKHKnsXQvmYBwDkYJrQSHOCxB2nHFc918OzOilTqqLUVexQNrwH564z6VotIMKMZGMAelXDmd7bBOUXJQ2aM1bfCnvwSMdqvDAXIz34FOTUJXe50e15o2asYNxbKH4B6kDPY961ZSAOT8qtjNUnJavVHCqjnNK1lfc5iS3KFmyRgEfnVi8kG1l5xuIOO1dKw6qJXezM/bxpXlJdTElDEAPgHtjt7U9921WODuB4PauulBLVnNiK8W1yrR7mbKAgJBI5Gc01h+8AL/Iw5967XBL3pM56FaV1zIYsm3jccg5P9ahfAbAbgsMAd6inFzle4pVJQpyXVsmZwcYJAfgCq6vtA3sSC2eRyM1rNRXw6nmKlUcVJ6pdC6XDKB0AGDmqbP0bJ278gf0rCVGTd0j06TTS0JyyqqgZOc4J78VV8xypXdkFs4Has40OZptmdeSpx5YKzJ5H4yGJwATjuKiCkDHAByAa6oxlGSZ1ONoJPUiLBdrcbVbPFMlbPQHDDnPrVSfNFwWzOWokpKSl1RZjnBI688gf41VQMOCxG7qKzlRahdHZWjKMm5PcuuwICkn72c1SBLLhs7WBAB757Gp5HHVo4o1opKaWvQmMvmEsThG7Gq6q4CZJxnP8A9euhxjGCi3oE6spVHJKz7FxHJUbicqSM+lUyXAAyeGwPpXO6TasjZ15ShzxWl1oS7wBgnOMH6VE7HcuMkspGD2ooxU2ltYwxjcIuUHqSlnBHXackHjj0pkYeQj5uRkY9aTox5eVs35uZRSVn/mOLZKZwVLYx2FIFZTggfeBFKtaMdNi6WJhCPspL3mRL/CWJz1we9OZCrDbyAxBz6UpScoqNzOm4dFsOjBA4OVfjntSRM6gAgHkEY6ivmKLbaR6vsee/O7N6f8Etou0BiMhBkgU7zCAFxglSRjvROV00kcdOcKc3rtoTBVIJ3feJUg+maRW3sOMbsYI7V0TvyR5WdOHlrccAGK4wSkgIBoVSrMAR83PPatKtRN3jsZRbbdOS0WpeBA2kjOTyR3pYmDJswRuI/GoumryOadJyV0yTcwB2/wATEAetMOFC9TjnHp7U6dFRdjR15RSt9rf9C3Hx5eDxGRx64pkR+bplSpOT39qTSj7z2Ot1ZQfJHdfjcuwjeMjAUEn60qsAPlzy3IPbjpWbrpysjmcpQSdRb72HoVLZwRhuMfzqRuCOoJ6AVFWpzvR2Z00q0VNtpctyMsSwK5HPU9gakB3hVGQQwJrojFJWlqctSE6j9x2uOCkKCrbtqEYPfNAXJOOvPA780lH+Z7G0XKpTajuTRqNy9RyuD71Yt9hZQe5JFZcrau9yKVm7SetySOPJYZILcjParbhcL82GycYrJwk0nE3qU1G+l2JDEIyuThd4JxQSxGCxBwDz3q5Jt3mc6dSEkov1NIsjqdnOMnB71XjlBjUFiMjgn6VLtB23OrFRnUglFjphHJt6gnjA96VUDmPccDIBH1rZ4hJ3aN6dNOCUpXsZjQEOwJyTySa1LmAAliSCeMela4a133OSvi5SpuNPoZabIkVTksADz15q6sYYJ2PBye1Z1sRzJtuzHRS5Yzi/UQICoKnHOTVhUONq8DeMH196hVGnotDeVKMklT+8gkjJVDk8AkY7k45qxtYlcg5DY47/AFrBRcryRWHlUpwcZaozpARjAGOMk1amiB27c8kMfStPaR+JF2ilabuvxM3yiQWHCOOcdjVlYpEXGSV3YI9MmhNxd+5GEp3XM+l9O5UUZ4UnkHkdqueWE4xnbnJHehy6QWqOd1YOquZ+7YrLxsVsk8BaC67hxzzgiqlqtXqi/dcNFvsPRCQpIAJJH1pykt904BOOPfvUyXtFfoa1XJyjTUbWtdjArHAfI+Y5x3qx8wUDqd3U0RTspMqlyRTbfXcqHO1RkAZJFPkTCqQ2dzMQQPWuhO8PdIm4wd77lXd1ByCxUkelQzdBg4+YjI/WsHT5pJLc5oP3G1tew5mzx0wBgevNMBI3YJxgkE989qUqcYu7Mq97KEtV+hYU4Ejn7q4P0GKgR9xZehHBz2Fbus+bVHU8LBQVKD8yWNwuQDyr4J9aiDKMMT/EQM/xUpVFNXjozOkpRkov7y6HXB4JKngHqR61TDbiCDjaQAB3qI0pKN5GmLrKLUO/QuoScEjIBJBPf0qIllHOTtYj6Vm3OUOVaIm8Kc4ySuhskx/hYBtxH0z61TmcDDZ69SK0oUk7supUUZaaNnivx4vDB4QmXOPNLADscf59K5r9oS58rwnPufl2HT+Hiu7AQbTbPKUva4iNJPWJ+b1zesJ5lJGd7E471zVzIxmdgzEeYODXz+JinUaXQ/Q8ApOKaeh0Md2uFTJJIJ47cVgwSAu0gY54AI7e1cr0dmdEFGKSR1CXbM+dw2g81ixOxIJOMnIzS5dLm6caicZKzOms7rdIuSQSeBWKkxRkYnAJIwO1Unoc06S9olB/I+9f2ZJv3t25wck5J7eleV/B7x1Z+F9G1GWSULczttQZ5bPWvPlS5q6sbZljFDDRa3ufX3xd+JMGk6fJptrOBNIgyc9D6V8CeMPGNzrmoTyNMTEzE5JPJ74r3q1VUnaOrPlY5XKcYzrPQt6jrRv7mSeVyzuxIxXnT3xiVlVsDJGPSvNlKT3PqKUYxpxhHQ6S9vhnAfAZh9fwripbxpAoznZ1J7U+VWswqVk2ot6nQS3Cnljlj1IrL0izvNWu4LO1V3kllUZHb60rcqtI0o0HXqKC6nW+F/D9x4m1OGzt4mOWUbh2z3r7i+Dfwxg0Oyt7u8iH2pwrFiOR7CnFc7SiFVwoKUb35T0H4X+Abbw1pduqw4nEYJY/xV69CvlLgkkEAknqfWuiNBRld6nztfHyrWntZ7FkBfljwfLZSGXvg0B8jIyB0Jr01FyaUTz6NVOo5Tj8WnoIGO0BjnOckdsdKBk4YtgjHTvTbSV3ogVJxlpt+QwNgHGSGIIP160xEZsEk85wP61CSbd3qiITgo8y1R8W/tPSZ+ybTg+SQMdjVT9qDC3MAzzHEwCjvWyg1QVtjPh7GKdeSW6/qx8TbmcMBkhmJJqM/eJLFeRXhdbH23tZRi4vYtx4dDtycnIB70yNkj5LAs5AY+1Qk09COaNR2luhwY7VJYjacEClyI49rc8nB7jNTNt6GlNpxvFfIjQrvAGdwOeaijB3K4IPzZUmtI+6rI5YTSl7x+j/AOzLlfCqtwV80sPYZpf2b2x4TtyhG55SSD2rLCUn7VsM8oJ8sL6aM+pzM2U5Pykc+tZ+4kZyeTge1exGm2lFbnytZOPuw2OM+Jd4yeENUcOMtA2Mdv8A9dYvxQYr4O1RWwf3R3H1HYGvWwKUZtnkVqs5VIJPboflZrl2x1GZiTtaY7gO5zzWPrUrnULkY+UzMRjtXh4+/tHzKx99hpv2SaRC93k9OGyRnvWT5m5lwcYBOR39K4I6aWOqzbuy99scPgMS+cj2rId8RKxY/eGCO3pWmqOaMOZLketzpor4KVI5PJOK52GQ4CjI+YDjvSau9TsnLkkl0eh9CfBiQzeO9IbcSPMYg9h0qn8CXK+ONLGQVSQP+R7Vy4lpWRtCm1CaR+r2ns3kxg/eVAPrimWx/cxSZPCgYHpxXuYa0oK+58NW56VR6XiXWmwnPJ4AHr7VWZmZQdp7kZ7V0OqpWaHRpON5RejR+cP7STIfFlztYlN5Ab1x0qH9pMFvFdxyQFJJz1+tdeaSlKlGUlodmR3dN2el7fcfKdw+clM7t2CPWrCwNuUKMs3TFeDyvpqke4sQqlNq2pWKOw5JBY4xWvIoVANvzYOazhe9om3uqDctjAzhlDHqSCD2p10TgMnuTjvWjhFOyYuSPNGdxkORIo5BD5UDvjpUAZ90QBwSxJJ70nSdm7mk03KNRLW5+r3wJyPBOmGQ5fylyB2JqD4Fc+C9JJYkm1Rs+tTgbRlY8fMeaU3K+qPQPiBetZ+FNWuFB8xLViCOwrK+JYkk8I6vs+99lbA7GvrMuclO7R8xiYqpKKe9z8n/ABBevPrF20jk7pmJJ75rI1sn+0rhScMs5yf8a8bMXOTc5M+shhfZxWt0UlmU4CnoxHHeqakFumByQfT1rh9mlF2d7nRhqinFSa0NJXJ5GRkAH296jicHGXIUngntSc+Vci3Kik5KbWi0NCHcxU5yOSCaaZWjxhgSVBGKSlFxaWhHu00r66n33+zDoFiNJn1FowZpJy+R/DjFcD+zb8Q7TS5JNDu5QqvIChbpk1zxiua8kVmtebpckO33H6FIieXhMcN0NUbW9SeOOVGyhTII/Ovfp2avHqfL0qjlC1tLGiYw6AOoKHJYHoRSJKCMZPzAkZractbLYaqXik1sfAH7TPhSLT9Th1C1iCCdCWA6E17f8fvC+o+KNNhFhCXmgxgAdeOn+TXa6MZUuaX9eR0ZVjOevKN9EtEfmCyKSOSCOAPxr1d/hL4xEhUaQ2WbORXzVZNttK1j6CjQSgm9H3PH3jHmFUBG3GCe9evL8I/Gjg40h8jGA36n6VopSTSsazpXtyv+up5Mi/LlcAHIBr2O3+DfjKRdn9lNiRyCSOFrklpZvYjB0nTTg1oUfgvq76d430gqTsluACR3xXa+EvhB4w0nxLo13PYskFveAscHp6VliYvWUdyaiU24vY/TOxuPMs4G5IMa8n6VT01JIrK3jJG6NABn2r1cuUmmm7I+VxdGLlFN6o0RITgEgHPT/GmlCTtJPJJr02opcr1RwqnKUbrTVjjJ8uQTwCRnvTSTgAZG3AAHeopSb0RpDlabTs7W9RA2V3gkhsHA7e9MA2grwMgLz0H0rWUOaVn0OlSlGikrXHckAcknoD69qic88HueB0Fc0qST509EY0aVSUY82om8hVyP4s4PamqRyOp3EEenHWtna12tGRRxaquz0cXb1DfnnB4YHI703D/Kec7uAO9NNXSsZurJSbjuOwuMMNzE4571LGrOwAJxuOc96KT15lsXWpQUFCo79X5CRxuzKV+75nIrVijUMAMD5ga2lVunGaNKcVypw6/iEMKiTec85AA9u9X4UTcBkkBDz6VxwUIRsthVKDt2JlxtDHnOcD1xUrLiPO04bGMdRXLKKWiVjSc506aad0zPmwABwGznjpViRFfYDnGD07fWu2neVrsKrnTjdPoVkA2gnOcnBParqW0io+OdpXtwM+nvRUk4XcSaNp8s2/Uy7qHIO44zgA+ua2HgWRCA2ec806lVtpLchRcVKSfzMSOxckq7kfOOPT0FbyLyp7tgkntj1rGUnJKPU1w9Nv34q/NuV7W08oqSTywwK0nIBVs5wQCKmclJKM2SozjB8r1Y9UQcdC3IPrUO75eCAQMVE4t/CdccVyLke9tQZFVST1zkEVHLJhcBucYBPc1pGi2kluYfWHC7jG6KsrsqhxkMAAfakwdrKxIwck1ouWT5Gc9KtJz53oynKpAT5ssjHOf4h60kr5jDZzlMg+tdMabuo3MKrTfNNNdjnLuQh5BzkDHPqat3aBtrHJLHBBHX0ojzO0XsiqusXbd6GQ3Cqm45yTg08oD8/POCB6VcpLm5uphRoW0jt3MaUneOScMc+lTXKjK84DKenevSpzk4nFiJOT5X01KP7txkgggAgenHFJgBh8xJbOK2SSs0cqrqS5mthCcFvlJPHPrUgiY8NgZQEEdjVuWikzSrh3ZJS87FcBWG5eV35GalUELGy4K8kEd/ahN01dbGdGEXNQSs97kaqSUbJzkEk96t4OGJBJCkcd6iVWK0S3PWq0HOndPVdBjIVBOQVAJwe1WjGTtOSAEKkemahYp810tTloRi4NSlb5GaFEoyBwpIIPetH7P1IwdxzgUVKt0nshypJU9dbmdgEDC4GQBn1q4UYKVwOnX1p+1tFW2ZVLDucVczTlB8oJYAnHarZUuSOSemT2rWc21eRlUi1CyeiKRYsQm4DnINWGi2sjD74HA9QKzi7x03JmnGcYrbqIpDHBXIJzn1quSwPDfKMEY7Vt7BtKzscdPFp1XJq/KS8Eq2/AXGB60g3MnAwVwPrWKSbsz16rcqamlZDkOcSFjjcSQRyaUErnJICAGk6UZRepnTTjLmTHE/N6AcgfzqIkBl3c7sKc9s1knJrXZERpQT9pFWkyQsQr4OW5OewojcZx0Xccg96xm3fnR6dPDKonTvZ6CRqHxn5eoA9PpWo1uRCOCQeQR296+bdRKXJHcVRSjJSavd/cUQCfl5GMAVIRgr3IbA9vSupQu+ZM46sYzlqSxrzG/8UbEj2I7imrwcKDywXjt706bknaSOyM1CnemtWSliRkHHYfWrIjJxnjOCcdsVnSqRvZ7FucpNOa94Iicj+9gEZqxEu4DcQMtjPpWlRqzi1oZ03Z3jp1JFzkEMQCMcVbjX5QWGT6Cs7pS5Yg6SlK7sQKjLtyMbSxG3PNXFHfJBwoPtWknKSbY5WjJcq0tqMH7vkHLOTnPc1IwwoDEFgck1NGLk+WaM61Rpc0F2AEkcgkrknP8AOkRgMqRkc4z3q5RSaaRpGrCVRweklYepwQBxuHBP1pzgJs+UkDkE9qOdTi7LS4lSjTnz3uiUEFgEb7oIGe/1qMScHoByScdKwlNSiolKc21NPTt5E6thlCknackj2pkQ3q0igEhQRnv9acpqEuVsxouU5XS0WpY+0MAQ2ctjBNRkE7t5OODk1pBpK0t2dqg5O8UPaYqpYnCjGCTUe3epAOAAcgd6zipXujmpYNymnU+RMk0ipjeWBY498dzVck5Q8jaSRnvWs4SlKyWh1NR5LR26fqbtpcMSuchlK4PrWWk7xsHwQSwJI781w0qbcbSXkJuEJ8j6r1OrKkxttyHyDk989agiu1ljVQMMD+ddEabcUmrHNTjFxtHVXEjtXaYIqMQxJ47YFdPpvltKrkgYPI9R2rknjGlZrU9H2LsoxZn/AGFyoKjBA5Dd67crANrfp6fWnCo3HmS1LcnBa/CmcdFpshUf73Oe4ruUMWF24ySBj0rk9pK7HOTk+dKyPPrqw2j5jnAIOB1rpr2FWJ6A5Jz6AV00pKWt/UmalJuLXocRIFCEYG7JxnvWhLYhecfNkkg/pW8uVz905XUnyO+76drHNynKcZBJ4NTzptYhl7gD6mt6NoRaSIi3VfJNWRkMjkod3POD2PFSyDa4xg5yMn+lFSfOnJIzjV9hJ04O67j0wV2jlm5APrUG5tw4AUYII7VksOkrs2q4iysldlsEDJLE5JIHpVcXAXcDkZ4Pt603ZpNdC6eFkrX2tckmYDhOdqgE9qqMQwJ3EB1IAPalz8krProRGXtNWrIrlssDj8R0p7OC4H0AreSU1aITpSUbvcgdWVAwJOG5A709mU4GflBzj1rGN1NJ6o350opp6sqpIS/HO5QS3rilfaFU9F4B9q2xMIyaXUmlVlGSqtXtoTxtuwPRup7VVDbMgtkAEkgda54SlyXhoHLJ1ueL2LaOAdpyMOwyO3pVVXAJIzyBiumdeLjYxmoqo2viSLiyk5zyDnA9aqGTaApzluM+lc8oXaszfDSapSk+vT0EkcndnO8YIHbmoZH4OTjIOT6VcKi2sYSc3FN9T5h/aTnH/CLxqvAkBOP7x5rD/acu1i0GBNxBUZA9a9XDP905I5acY/XoSey3R+cMs5kckOSuBgjv71nTSHcX55JGR254r5qdO92tNdT72viFGHPHyNmKWPIcsQMlQB/F7VnQsTjk+3v71y3WxVOSVqm6Z0KTCXaAMAE5FZcUoDDEpAXIz6mlytI6XUaaVtzoFkDHB4O44FUI5jvV+cnBOPak72MJ0faWTdn3OkgvXRBDG7L3IPesZJcgHcQFJJHrU6p3SG7QheRsNM5O0sT3Ofes9mLeXtdthPA9KIXtqdDalFNaNl1rgMxwQcHBBqkHG4RsuOMg/wCNaNW1RySqpScW7sswBppkjUn53A57571DDKUlDR5+RgST1FKpJKPurUvDRi7KWx93/Av4YRrDBq98gaWUqUH4V6B+zv4vg13QLezkKrcWi7CDjnHSssOoylep9xOb4qdKPJTXu9z6b0+1SGCONcAlRg/1rTtEICbmGWA4New2oJNbHyWDlLmcpvcVo2DNyAgC8nt1zWlJFgKOhbkn09KtSlNq2jNJUlaM5O0fzM0DZwOcuMAe9ShiOORg81U8M7Nt6I3jiGmnHQapG4biBubJ/wAajLDK/MQelRh6WlpOxtLGuF+ZXe5YjYbTgYGRjPeoPMUq68/Kc8/0qqlNKSUjipYqM4O0dPyPhj9p+XfqEYDYaOJgpPvWZ+05c7dWzv5WEKpPbjg124hJUFy6kZBCUas0+9z40uSC2C3OSOKqzSDdtOSVO4+1fNap3R9bVTmnFvcesoA7hlYqCPSs152ypPbJx604LXUKtaNOCstL2NgTEgLuBYkHBPWslZlbDcFhgknqMUlJ812tAdONm5as3YWDPtAwGYdOxzVS3ZiyuP7wIPrQ7MKUHF81tJH6bfs4IF8H2rrklmIOe+cc1Y/Z12r4MsX5JkyTjt06Vhg580ml3Ms4xDhJKe9lqfQzDIKqcnORjvRgA4/AH69q+hlpJOLPkZSk4ttatnlnxdPl+CdTOcFoWJP93HQ0nxhyPBWpY5HlgHPf2P1rqyuUnJyl2MswpKNSnZ211PyY1l0N3cN0/euc+nPFV9WUyXtxk43OxOO/NeLi23VbZ9xSk4wSSMsquVA4AxgnvTdhYkcFQQQDWFkki3NT1S2JJVX5QCdvfA6UhydgPHIBIpqcm79SaU4zfKtEiskeB8rkHdk+1TGIodwJJdsH3qXtuR7sKiaejPbfgK27xxYEHJiUgk9+RTfgAN/juzbO1lUjA6N7f4VjiIJONztk24SlFaI/V6xmY20YUdAOT2ptkyCCNGGCihcn1GK9GhUSkmkfGqpKUbvds0F+bcXJAzyfTio925hsILbgQPU16fskmpHPOvGMZU4vTX7z81/2jJT/AMJbOeSHHyg9+eai/aBnWbxhdRs2R5xKZ6j1FdGazfIlJHbkE70U3pufPIjOAUAUqCQfSp1OxSBnCsDivnIqTV1ufTqVOMbx0Rnt5j7i787uCfSkug3IJKjaDj1qp0WrWDmUmuhmsCCxB4Y8A1TkcocZJ2sfwpKLvynPpP3pKz1BUUyhmAKh8sPX1pI51aZGBGAygkeveibSjzRKw2KlBJtX1sfqt8EgV8E6SwPW3UgH+GnfBJlk8GaMFyf9GRS39/jg/jUZe+dpz2PFzfExVdxitXoejeIrX7dpOoWh5Mto4X61uvD5iMjE53d+1e5ganJJX2ueRi6Vopx37n4yeOdLfTPEGoQSqVEd22D6ivpT9pH4ftaaq+s2sB+zXIB4H3DnmrxuElNqUdmfUYOrGVDlbu1ufGrScqQMKMginyo6ysmTgkA57V5VKlZNsIxfMuV6IcsyqM8YyCAO9UpEHARjgAnnufappOKfNJlYtc1pQRfS6LZJc/IRx6YrOjlCqctgk5JFDWqt6GThNJz6G5ZaveWNyk1rO8bbgAVOCp9a50TMrY3EsBkk96cqTcUlujooTjKHtJaH2p8Pf2i77S1t7PWpWeJWUKzHOBXxkt6QuQxDHhSe3vWEOde6jzcRhqMoucFq+x+yvhX4o+HfEEUDW+oIJZsgoTyDjj/Oa/JDRvE+paRcie0u5A6nIGeBnqa66Vdtaoyw+B5J3jK+h+2sD290FLsjhXAIPbHevzk8BftB6vpKxQavcNLCuACc5Hpmul41N8rOWrh6kZttbH6MfYraVs+UAIyQCO+T0ry/wZ8WPDviaNFiulWeUKdjkf8A1v5Vc8RC/vLRnnxxU1VtHY9ft9Ns8DMIwrkjI6U+yuYpFYrIGHAwKFFSa102H7WUk5JdS3Fp9lFg+SpAYnGOtOkl44IDbScHtntTeF1tJjoczlzp3sN/s+yJx5a8tgDHQ1TNwVOCTgkkkelbSo3SjE2p4lKUpN6voXp7RcN5Yxs4x60RXAbhnJHyke/HNTBuKSaHTkprkatYzmSYkAgjkcHvWnLLGI/Q8D611qHNGyWjOaviJ0tZK7toYxDjGSNwPGe9JM2XOAAeeD3rOdJRlZHNhqftIKtLoBHyIN+XbJJxUKuSAckgEYI9+9buk2k09TevR5qftErDyCnzMxIUnj2PamszED6jI9Kl0m1aRy0qkbNR3QMUVwzDIXOAep9KTJxg5PqT3FQk7ckzWNJzjzwFZxn7p4A6duagblmAJHPOP0rVtWtbUrklFXezLJnCPlc9ySegNMjj3YbngjOe9YVopWTOmnGDej0fQtwXQGA3zYYD8e1MijwHIUjAyQO9UpKUW0tSJVYUbRSv2NiGdt33chulRxRPhU4IJJNYyg1HltoRh6rpVW1rff5mqrDk5+Udfb1pUQoBvzggnPr7VjFzbudMa0NYSWiHoVG1dvOMZ9afGctkjA/hB71c5uKSHRqKDu9WybAKY3FW4I9j2qAEhA7EbRyfxpezbdupo6vJBuKW5Iy87lJBznB6ioiwZQxwDyR7cUOM4pwT0MJ1Yu0pLUkDFlBAHzYyR2xURkyoxkEOcgduO9Q5OKtEKXNBRUt+nlcc8gJ3Ln5TyPWqjkEtyRggEA+lauDdubY2rRlCPM92TF8EHk4B6/xelVg24FQ3BIx6qKh4eMpO+xz1ardpXu+xKxDnBwVLAkHuagLfMGUEDBwKIU5KPMXUqwUuRaf1sLKwA284PJNQu+c5JGSPxrSgo7BToNpyT3I3VdmdxIIOP61A0hBIIxtJGKIxldtvzIrSUkoNaoqzfMqgMdqkknv+FJMygMWJBbpjtXVQilZRMZwd+Vu7/IyjuPA5GcfSlYsqsVPQHn1rolBJ2tqYqommpLRfiZE4V8ZB2qTSXTM+PM3MCRnnk561tQlJSTjsczpxdObktVqUCQwADYzyB/OkUsuF7tkEGu+NNpJtnHGu2o05qxYjyQBnHIFNEqYUDgseCO1KNm7LY9GVSElHl1exbURYC5B5I6cVRLbWHOAxzinNpxumYTq2nyqJcyIyACeSPw9TVTeSA3BIPOPShwldXWxyzrSjvsy4su05YnDnGPUVUUM2Ar8HOT6HtWPIldIVOpKdROn1/AvNPGcbeQeM/WqyZBGSPlGDWcoRilc6/wB45cs0TCRV+dmJAABP16UoVdmMYK4OB2qkouKi3qOpiXTkorVMZtGPvHJfr3yKsogUKSQTnjNRGTvq9D0XCMoRcVqik0eUDcjPUd+elaahQrE85wQKidZwdktzmjScqKlF6q9zBdNp2bBtHX2rd8mNgflJAwSf5VsqyXuyJo0ZRTnHyMfJXHXby30xVjUJI7KLfIwHQE/Wo52tApW5W5orN86uD1CgADt9KZayQXUcboTsLAgj61nWrxia4Z+2jyPZFeTIH3sjcSQe3vS3CjdnoGIB/OumnVUlpozzKkJTp3k9LkCsA2Ax3GQ8mkOGKkMSRgg11VKbkk3oZRklo2dWXxGF6AKAB6Y6VU2FhjJPz9fWvhZJc6k9j2lHlkm2IFBKnblt2QRVlY8ABOWyevf2rok4tXWhjCUnKz7kKxtyOSd2Sa1oYxwOh4znvThVutTodD3eRL3n/X4kSQHAOTnsP8a1RtA2nqFyfes5ScppRXzLgoxalezKscYVWGASWGQO1XSAMMOhQdOpNdNOEZNybuPGOcHot9mR45yFPYH0xUgUK+SxxxV03yNS6nHq0lJ6dWQiOTDDggA4z39Km+VSIwxLE4z/AHq0d5JSXUuHLKTlrp+gzywVXa38ZBB68Cpz0K9WAJye9ZczSTZpU51JVIrQjSPcA3QbgAPT1q2i/N8pO3cCCe1LVyu9F2Kw7lNTVte5C0ZGATkbCCPSrcqq4Awd+4kUlNRauacyVJOSv0MtlZUHJJGASfrWn5IY4znHOAPzFL2jU9FoYVElF2Vl+JmLKwGAORyPer/2bGMAD5jg+vrWM4xbcWtC6NJJKUHqt0V33FohzgghfQ/T8asbHPvjAqqcWotWJliHfmj1/AgSCTarHG0DB9T71egVcgbieSSPTpgVSs03J6G1ZuNOLitSPyiVwMgh8ZFXxGUB25wRj6e9KcOVqzuU6cYNTa+XqZrxuoUggBTg+oq9FalwNpyMkkjvn/PrWsrrVM5aPLCXLFWb6jLSQKFByAoyT60427RkEt+XasKlGUpWTNLTUbJ6G3bXpj2/OQAQD7mqcCfKd5AxySe1cdSjaS5jrjV5YKbevY6yO/WWMEyEsSckH3rnUZoR8pyCpJA70pQamnHYqdRzlGUtFY2F1p4psKxO3Ab2z6VleTvTdnHOSfQe1bVaMPhb1M8NzSqLqjqZdVgnRN5wxHB9fauRKygKSeAwwD9Of/rVjCjyvl6lYnmjLnWi7mpJOTnBJCnGD3xUUUeExnuBk9/rW85XsorYzoQnKLlJ6XM+4dWBA4DA8DtRdW7LnGeV4xWnO5Oy0HTlzp21t0Mcxj727IOSB6U+aMoqAEjAbI9MGt5Jziknqcnu0q7i9rbFby+c85ySRmpF+YDk7sYwOn1rCcJuOj2OxzhKako6P9CqwJXnIb19KvvFn5sYKqMgVNCpFtyLnNtWtaxkklwuCQCTwe+KsFGTL4+9kMD2xVxpbpmcq7502igWO7Lk8LnH+FOwflYEh0OQfTHcVu6bguVvc54V5Tk5PbsRAdDuyeTj1pYEyDkE5Yg571FWMkrpk0lzJRj8hQD8w5HPFWioIx0LLkYqFJN8z32NG/ZySfUoeWF7nBBzz0NWiuCQckbSfyreTcoqL2NoJKLdPcphck4OHPAAp7MoPGAuOtRUi0kuhzPm0kluMGR8zkE9M+ntUMzkkLuwDgA1T1aS0N+dwi47yGSMvLbu3X1qsznYucnqeO9Zzk4ysiaMZ1VzLS/6Hxt+1PLs0u3TjATOPTmsT9qq4xBbRMpA8oqQOp5616sFy0dTmymCqYup7TSyPz9875yoBxknNZ0kjlsDIXqSO3NfLVpczUmtD7alTipPkWiSNq3beQxPy8YPoaz45idgBPAOR9O9YJNtWOvEVuSDna9jaR0jaMDIG4nGKpLMPkG7KggZFJxVtDD643ytLdamzA5YFhnGeAe1UFk2bdrEbR0HQUm7sui/dcm9PyNmG5kLbSMCMtnHeq8EmUIc5kJPI70mlYKeHc17STNkTAMBtPUAn1FZ3nAgbiTtycUO1i6bcHZrQ0POZS7E8lgB7CqaXEZKjnaSBg/5NLlVrM2nZTUorU0oGYkscFlYceuKqIzxuoBPXJB/Sq2WhwQpTldT69D6S+BnjMeGvEtsksxW1vJFQg9AexrwTTbuS0nSeJyHiIOfesasEnzLc7bKS9nJaH7maVfR3VpbzxHO5VbPqD3rwj4FeN4/Efhq1Dz/AOlW4QMCe4ruwmJ11Wp8ji8vdOrKz90+knnZgqljkABiOh9DVaFt2FzlmB6V3Rai9SKlGMlFSVkTso/vZwccd6eo4KliNxFOnByaa3HVlHllZaFMqpXfnHzEgeg9KsshI3BjsLkY9cUVab2b3Hh5Oa96NraGaQ370jDDkgHuf8KusigqeQuQfpisadaS0SKpcvO01pY/OT9p6bfr4iQ85LHJ7elZv7T0kZ8SXDKSXUIpAr2McmsPG24uHXCo5Rh0bufJcsp+RQfnJIOP61SlkXeeORyMdq+Wkkz6lVXTbixuHaRG4PBGTTPOwR3OCCD39KG2lZF0qCdRTn1JQNrjqADkD1pjNgKefkxxThd6IycE52a2N+3mQNHhiFTBJ9PrVe1dF2BxyWHJ/hrO97pGkoNyi5bI/Ur9nsbPBOnkdDkjPYf/AF6s/ARSvgjTEfr5QOfXIFGWNud2ceewjUi1FavY99DHBBAGG/KkVSxHJ2sCR7V7vsHJcyPmNb+zk9rHkHxmbb4J1AqGLKwABPsag+OGU8D37gkuMZUdT6CvSy5O7uzkrr2tWLkran5TalvkvJiOczEE+uKNR8xbic9CznJHYnrXzuKsqjS2Pt40UkuV2sU9gwQTkjn6U0SZYrghefxNc9r7jcVTs29LiLFkAnIOCwAqyMfLgncWI5olJPRbGsYxitCGLy3VlYkFM5Jq1EFBPAJYgEHpinCSjJMynSUlKLPaf2f4wvjm1Zgd7KwyOhGRj+fFdH8AbFX8aRyB+BEuQO3PWuXEzTkkzpSjKk5Lfofoxa5eJdoI4Bz/AJ/WtaKBY4wOg4BA7DFfQ4Wm5JRifFYibUk6jsUzmMEqeRkgD1qSZdoCrjDAAE9s1006CdpHJjKb3b1PzL+P7IPGFw4x98kse/PNZP7QBP8AwmF+hYgQyMMnv9K6M6g5RjZ6HrcLSUKMqfVHlayqYyxOc8ADvxXMrcukaYYE7u/avlrNOx9DShJyu5aIv3MquWDHgNjj9axJ58ljzs4JP+FXCV1ZsmcoRk3NbhctECSc46gCsmeVnV3LH5STyelFNu1kaRw0It+9oxqtmaFFyFE4JA781Xs5ds0TsTlWJGfaqlyxTitxup7NwVup+u/wOUJ4K0dscrbIR7YAqz8EFb/hCdHBO7/RUBY/xccGpy+lKT0R4GeSjGslH4v60PYeq43Hqc47etWREpAPvtIr3NHFJ9Dgpx9nT1fvM4Txv4QtPFej3FjdICzK20gc16BtAO0/xAYP4c0RxElG8VoZ0pOnU546tn46fEX4dah4P1WeKW2bynldkcjgjNfqX42+Huj+LrB4LyBfM2EqxHtxVYmjTnJNaHsYTHNy/eaI/FqWLYAxHIJAI78819D/ABP+C2t+Fbt5bazd7GRmKuB0/wA/SuF4Np36HtuajT5o62PmOfbtB38jIJPart9b+TJtKgFAyk9/pWMLxlzXujFVYyglMxHD+UyliCScZq4Y1TbuJOPmIH9aFieafNYPq6hB3epDEwAVT12jn0oQgAbucn86ynGUW3IxoVE5KnFady1HKVA4z1yT6VFFjHJ4JwPais1fTS5dHa0XfU3re5CeUDkFyASO1c7JdFfusThiMCrVCKW5vKUua8Wehad4lutNmS4trx1eE5BB6V5+JnkEID7Tldwz3PSlKmrNrY4qtODSutHc+6Php+0Zd2T29lrEpa2bCEsevuK+JVkaLyirEMCenf0rKCcnyxZDy+k6bdSOrP220DxfpPiSzW5sblXjOMbT9054zX5Y/Dj4p6l4SvoQ0zmzeQb1Gfl6f0row+Ku1Gex5eY5bKnTUoRufrlJygOTy/X1rivBXi6z8VaNbX9rcB/NUFgTyp4616GDxUW7ROOpS5oJvQ7L7QVYBiSc8AVUk3A4XJcnAz2ru5VKKcdzGNRwlZGr5zSKELZ3ZwPX2rMV5B93knGD6Z6/jQoSS916mtfEx5U57M1mQS8KfmIyD9KfagnqMFcEe9XdRtdanNh7VG4S2exWFuyjcQfvEE+lbqBdjbs5BzWc61prmWwnh2qaXTuYCrtwATgsc571akK+ZgKRnHStZ01JqTJi7N0mrrTXuVmU8Ag4Bxx2q9LCVjWQtjaTk+gom42s1saypuLcYvQz0AyQAM+pqyiN3GcsDmnVikrdTmlipVKkZSXuoSEZ25Of3mMjuTUyJyecjcAAfWuPmjKPM9zopxdRNU3Y0IUWRQCQdp4AHTNRQMxGFIBBAJ9KxlFyjZHfhZQTtJfD1NEbdpxnGR1pqbwDnluTkd6uElB+98jKUqk0nH7i3uZxGACAM8HtSISFIySwySf60lVSm0kKrTcoc0t/yE54z1HGajeQdSSNxxx2NTNt6NCwlduHIvi7CsZCRnjkEA9qYTkZIJOMZNSpxeiWoUYTdRRewok3EsWBwxJ96bGCVJOQcgGtJtyaRtUnGUXCUbr9BDIq9zhSfxqCQKQCpw4LEg9PatVRd7xPPo13CUnO1k9BpJlZQuTuyuCeuegqAKPuq23cwYjucd656lo+7LY9BRlVppx31Jy+UHUMSQSO3rVYON7EfdOCB/OmqUm9NjKFKDppvclGBwSRyAAfpURJVQQeEYsfatOaSbJq05KKb2/rUaW/2yNvGPX61BI3cAnBwPatFDmtHuY1bK1nt0I3fCNnuSQagPzFiGJ3Ljn2rWS0siKdPmagtGtxsp34BJxwST25qBhuKEc4JzjtRTi2m1odLwycnK92rIhkY4O0kYbI9qeIsr1OM1VOcU9OphiFKUkp/CtjFmVyVxwAxIHr7GtKSIjcrAE7jjPeu6jO6UorQ8zG0E0pSeiMBt+M5IbgDPb3q/IoA2AEkkEmtozUmlbQV3JKL1108jOCsoGSdwYDPrmrAKsSMEYfv0966ZycY2fUxlhlTqqUUVVkUYB5Iwxz2B70pXOASSOQc+lOtGL0Z0RxM4pcqVnv5CkKdm0kDOcjvTsAKoHBBHT0FRGEnVtfTuc65ZJzgiWNgjBgTkc89sd6r7ueWI9Qaxr0ryvfUrDVuWKjHX/MtKgHG7nJOfWq8lzGgxv7jJ9KhTdRW5TeklTneUjQiYYILgFCCSe+azF1K3jUOCMbsEDtipq05OpaJpTi3C8naNzoI1X7vcHj3rHGqs4DQQO2XKk/5xWE6llqtR1alqaVPVNm6AEOTg5GcAVxl7rmqhzb2lqTNyQo/hrns4rlOyjKUqatv1O7L29urbpAFYg9emBziuEgg/tWUi/ncytktGPujPbtWCV17z6mCST5I6oh8T6hHd2m6GMlPMIL9jisLxDYPpRS1idvs7gOoPauttuOmx14ZTcbVNTrvDlvv063bcCSGb6DvVzwftbS4QzZfzGBz0615tPFSu4MmVHml7uxHdx7WxjqePat66twyNtxnkgGvVhXi4JdTmdCabTV4nINH5Y2DIO7Jx0I7VcuIyCRwBgda7KcW/ekYUq0fZ8sN13N+LDFcqQOMkd+aSBkyADwAc+1fGRopx5Wz26c+VNTV73L0aLGM7yVGSfeliZMLnJGQQT2rSTbSj0PPw+EcZe7tcmj+YgnOA+frjtRGwCEgEsTkVvUSTSSKjTSm5rVFpMfKeeHyQe4z/KolI2gswOwkH+eKuUpKNmtio0oSqOK0Ut/Itk9wMDI61VQjbxnBcYBqNItXRvUpRjDlctEycjcCuQehxRt5OO/X8BWnM+a72OepWXK0vmgUHKLt9ce1KqlSW5+8APbipdpQ90uhGcnaWiJY0w2CCd2ck9qWNmJ285YEH3BFTUqSSV2aUpqEmupMPl9Qe/oTUif6zls8jI9M1jTqyavJGkZupUUYbCITyOcgjkds1OEA5BwDjHFdl09UyeROMotW9B8ILgdAe4qTaRtIOCSMe9ZJyTstjmhRi2oyfQfsX5A2Mg4BPbNNYEkHtjBB7+tOtNqSfQqjGCqO2/crSruXAIBJI+tXGUBYyR1IIPephJXbRpCbvyp3X5FOCDGzkgljle2P8+1atoFYAcEjPFRKSiuaK3G3G1qmupJHEm0ZBOOo9faraJn5MnAxx3NKrHlir7o05E05Re5FGqoAvfGR/hRIDhDGDgE5BrOMW1q9TlqzSS5N2MnCuFA42nJx3pyAnPOc4wT70UnJLmT1KqSaVmhiqAyp0G0EEd6kIYjIyNpIAFawlypye5c5xnaC2HGFOSWJ5AJPfPeqzu4HfAzxWMqMndP1Lw1aDhZLYuIyrsHGQx/DNUs7sEcDIwfSib5W5SFSneSg9jZ2xEFhnJYcDvWUjOGUq5KMQCQe2ecVnUgovnbKVRyTpNadzaKJkMOM8YPU1gtdSK2CSc4IraNoxjZaHZzLk9x6mpKiZQemFHsOwrOe5b5ST0J3e9TTlOceVmULtykyO4VTgcfNnC+h7/nVUszlMkkrnBNXhoaWvqc7xdpJQjt1HRwfMrdFUjj1qeKUYODgkgfSrrKTai3Y6qEk4tt2FZMFUHIKscVLvDqz7ccdPQVNOlFTutzy5YmUY2l8LdjLeNGJO4kBiAB2q3+73BdpAI4rWrUd2mGIk1FKPQxJYQhY5JXIJHrWlIFO0EDe2QQKxp1pNpS2RdSjGPvJ/EZXlAhQCRgEE9uasMmCDuyysuSfaulTSfLui44NNJxdu67FF2IZiM7ccgdqe6qckHHzE49aKcIt2l0Dmkk4x3vsVZmPlkK2NwwRn1oc4VMrx3rWN72W45SjCF2rIzmBwMAgqpOPWrDBSxAOdwzk9qyliOeyaM4V+W0Vq+iKO07lLc5IJ+tJkgsW+hNawik7JmMbwla/wAxhTCgk8sxJqNnG0HBO0nA9fWud0ru8TaEpKLj3PgP9rC4AlgXJwkZXIP51iftX3S/b44t2SiDAHoexr1MVU5aCvsYZBh1GtOSd29z4dDkHCcEbhk98d6iLgAcDK5wR3r5J2Tt0Ptq1NybS3sXUbB5UlsZJ9aoGcqM5IyRyO1OT5ndG2XyfI5WuuxuRSDanYk5OO2Kyoblh8uSFUhuO9TVjyySWoqsVJWpqzNxGDDByCHwM981TjcMRtJGXxgmtL6pWtYHDmheDOw8O6NqGu3iWVlGzuzkcDpn1r7k/Zy+Hlm2lW+uTx73uFBUMOnSuOVZ86gkdWIpRoQtUfTY+LfEXh2/8NXv2G/UrICM5HB+lfZ37T3gBGtotbtocArl9oxjFeusvUoOrHpueFleaOpU5Hstj4UScSEKoB2sMnuaqDMR28jLknH9a4Zxs7HtN87ae6dzSWTdwGP3iQR7VQQ7CCzZHcjoaSi2vQVSpFx54q7/AMjZSckELwGwCPTnrVGOTJUckZzT9m0m2Y/Wk5JW3Pq39nbxw2h+I00+aUizuyBhugbNfOOiarLpd/DexSFXgcPn0INZTtH3ludMpOqlCS0XU/dawukmiikUgk4IIrxj4M+NE8UeGdPn87NyIArqOo45zXZh66lGyPHrUIqThNWPfYJAFO5j97OT3qhG6kKoPyhAMH+KvQ5LK7PGwtNRk4J6P9DULg5wx+Y5+lUxL2ydoz+NS58i590c7qU3XSS6ak8joseASdwJx71RllB3be2QPaqU246E1VCacoOzR+aP7TDk+KpiHwULA+xI/wAaxf2krkSeLL2IklkkBB7ck9fyrqzKtKVJQvodHDNPRqUdb39T5efmQA8hyAT7+tJJnJPcEHBr512tZH19LCJPnktyvuDphc5TJ+tTCMnLEgYHQ1PU1SjGHLchXcyoTkO7EDHarYKBVy2SASMVrGOjkzilNqVob2Rft2IePPIZlyfSoLNlecKxIyPy+lRZ2uzqo11US5Vdn62/Af5PBGkgtuLQNx3HA/nU/wADE/4orSCwIb7IhUn6f0qcri7KUjzM4lOVRRWjPdY142tnkkg+lODhWQsSWOSM9691ScVfqeIqHK9XZN2PDvjvhPBd2Oue59T0Bqp8f59ngi4ReSbgHJ7HHFehg23B8mxwuTeKjTS2/Q/LHUQou5SCeWwxPtVPUJGNwxDfOsjA+ma+drQmn727Pu5UnUfPcifKNySTkEH3xUSyOrABsHIzmslC3xLQdBvlcEXVkDMGDEEEcevrVPcygSBj8ucgd/8A9VRKNnZEUZtKzRrQOu9QWBZ3AwO1ZsbSZCg4wTz6U5XSsxS9xpJf8OfZH7O2npc+IrZ4yTIVAIHWsX9mbVZ4/FqwIx3CMAZ7Eng15teMlUjK+h04maeFlJ6s/SpreQKu48FRn15604XUsiDezFtg698ivq6XP7OLjo/0PhZwppuU9UVLhMDsMDDE9OnepJ1baWOSMAlfX6UU1Lndnoya9o048q0Z+VXx+YP4uv8AjLb85P1qH4+uT4uv2DYbzyCv49q7s2klCMep7HD1F+zSlqmeAiFcFFbP8WfTNR+aBuz8ocADHtXzEk079T3pUHbljt2Ip4AEDbgO5B61EJyxKOSQST7Ck7rWQ4tStFaNGNLGWO0ZYYwPzq9IiEdx1Bx3rSNSSTYmouyl1KdmGEgdEBZACB2JHQVftYX81NhIDgDH9a2qxafMuxy0k4zjTjtc/XX4KHHgfR8DpboAP7vyipvgohXwXpLfwtbRkjv0rDL2o6ng50mq7pwdm+vY9jjYn7xxliKTeoAWQ4UkqM9vSvWxVpR952DDvmSUtwJIZTkkbwPpVZrhF3bmHA4waqN1aL2ZzuSjU5Yu1i2Hx8zOQpbknsPas97mIhPmzyN2aVOUXK0URUhKEXeV22U9X0ey1WJ4byFXWRSOR0qy10jRtufBzxk9hW/tHG0VsxwpqK5k9fzPjX4mfs26XqguNQ0RfLvXJbaB8rHtX160yyBgzAttB+hHpWs6kZS95aG+Hx9Zb6rQ/GjxR8OfEvha4kS909zGrgBlU4NfrfrfhXSdfhaC9t0ZWBOcdSa43h4yjZ6I9WeYR5k5x94/ExoQpTchJJILHsc1+h3xC/Zns79JbvQ5TFOzElQBg+lYywDi7Rd7mrxtOsuaK0PzmLMATjAVieO+K9F8VfDXxD4VllivrRxDGSRIOjf/AF6FhuR3l2NKNNyhptc82IR3UfxE/p3qV4thO9iCDgE/w8c1xtzUeV6M1k4wak9U/wACNIwpO0Z2YZQf60qkMxYsdq9D6/WqpfvFyN2ZNSkk/aU7NfkT5c4VSS/U4/hqPzNpVycZxkeuO9TZRldbhSlJLne1zRjbBSMSEO3JI6GqMMu2RGbHzMDx2PtT0lHnluaPGOVRU0vdfU+yP2cvHtxpesQaLdzk2904Vdx9fWvnDwlq50zXNMug5VUu0yR/Dg9a55RaXMjnq0ISfJbTp6n7VRlJUjcYPOc1geEL/wDtLQ9Pu2JzNEpOO/Fe3gsY2rvQ+SnhpKbUd07nUKg3lGAHlqCcdzSuxDLycMCM/WuyEpyenQyxckrQnrfr2LUDKmCC2Mc+9NRCAO4C4z6Vu+jYlKdD3JO7SL5ZWVeQOSCeeaoxSsrsDnBOOe2ayqNRs1szdTk6b5t1+JJHF+93P9wE9OpzTSxJHXnABNWq79nynFThJyjGS03L6sD2O0A5HaoQ/CRq2BnOay5Y8qS3PQhUk6luxYMYxnIHXp3qq8yZXn5eQMevfNXyySTb6mjrty91EMqrFjYcgk5HrUQO4Ft2Tvyc9qbpNvVnLyqEuR7PXQbHIUKqxJJyAR71VklAfcemTjHbFKNNXvcI4jlnyxV11NxJxtHzEjGCR3rJttzFRk5BPHp71dTDRewUsROcbyVnsdBHL5mckggED3+tVI9/yqTjP61xSoq6lb1N6deTlJPYuBwctnOVwM9se1IMYPbBGPfpUxack0XSly2alcTLNgjlMkEetKxG7PPOBgdDz0reckrvqZVqDik4N2uP3EfKOmMnFVWLBcR5wWJ+oopQXKmn1FiKV6jvHdCy4P8ACcsDjPc03c2M5xjP1FVVlyxblqTGlOLTvb9SA/eHOeCCO9WWRmk2ZIJABI71yU7yXNI6KUXCVm9GV0QkFicnIAq8sQLBASNoBrWFmrt6iSjTvCL1/wAzOILDuOxHrV9kUN1GQCeO1Q9U3HVktSdO89EZWQBwCCCAB61JNPbRK2+YY3DAB6+taxkmlczo1HyqTWhX2EZGQFyAB61nyataRuoDliSMADrW8r2i2RGVH3nJaP8AAtmLaQSBnJwfSsxtQupjtt4CUJHJ7Cplq+aQoR53eK0L7JxknoDWXKNXkA2bVQEDg9PX0qYvm1ejNZzfKrL3V0JrqYO24seARz2rHm0y85D3TBiTkgDn2ruhKz8jg5ZWahsRyXEQ5eTg+vbP+FU4tHQNulLMxY4Y9q0hOMPeerMaqnKKhsluKLyBM5lHQYx2q1HptrErOsYyMgAdqdetJyV0VQoWi+V6mTJfgKoiiZtwAGO9bQhiOBtA7HFCcknFbEKolaS1Zy/nanIfliC72IAY8njvXQsuPYkkg1288kkkrmMGuZc2/RGBHa3bgie4IywIx6e9ajAs+5mODg49Km3tI3kVUi6STjuzPawjf77s2WyRk81oEjHUjkEE960jhoRXumtSrUdJQ3bY1LaGNDsXkMOtP8wfLycZH41FNJSU+xlWnKonBbMuQzbdoBIG7t6elVVIGAAfvZI9adSlGSTSMkpxk4vYisyseq3DOw3sylfYf/rp01sZnTEhEoOQ3p9a5MRRclFrdHoU6sYNqT1JNRCJfWU1vxM0qhgP4hnv+FTWdgqS/aZpGaSMkgnt64rjrxajyQVjpUlUhd7PQpeLYBc2MVyQA0GVb3yKv+IABpU/zAAEEAdTVUKKhHlj1NKdWU1yNf0ir4MkdtORXx8srDB6gVW8ISf6CCQeZWH1rz6lOSm7bFNSSUup3Mm3ld3ykAgnvxVS5lYLkNhQSSD2x1raMrwTk9jas2lzNabmZcqGJwOgAz60x5fMXPIIBGD2r06N0+V7HBiKykkktS/AuRuIHykZx39qVcbgASvzZGO9fHwi5avY7aVKcYpS+yy5GfvehODntSRIzAuc5ODg9sVrFt2XUxxVSN3TS91lnacADoFAx6U5VLAEnBOMj19a7LRvyz2IqRvCE4aW3HxneAACM4DY6j61IuUIxwWbkDvgUptqN0zpoQiptt2TD7uOTjdkkdvanBTuUqec4GfequrJyGpRqtdkTD7xIJIJBHtSrg7R3YkA9xXP7NxV1sbYN06kpSkOLLlc5BbCn3peQxIxnpn1pwT5bt7mlRqTbtsKuNuRnCqDk09I/lIJyXGCPXFW1rvojkjV5aTlbVgmWI5O4nORUypjgnJBBBFXOaSuznwteak5LR6FyEcYb7vQg1NA2cEE45AB/WsalRykrnZVbSdno+pOIwzLlskfNnHSmKwUKWyNqkjPcCiNoxXcSpU5SVVrYe0eSc8qcDn09aeu04bkbcAD+QqIVbqy0LpyaVpq6bFmi3KobJAweO+KezDjax4bBHpWcU3JJ7mdShC/PF6q+g21GJNwJO9x+J9as2/3j8o4wcHtnrW9WcOa7OajCU6aS2W5oiIBlIBIUnJHenRgh1cc+ornqqTjruzuj7iuhphySduCAAcepq4rAp/wLHPaqb0UWjlWFlGXPzehSW33DJOBwR+dSvIoIQMfmOce9RByjq9y8Y5KKp7+ZVbYvCnOfSoZXy4zzhhyfSqak1zMypRdN+zeqZWdVwFJOWPB9M+tJlepOeSQTWsZNvm6ipxXO4pa9yBmzs2MRtc5HrSOcvjOR0z6ehHvTSTnzHTSi5Lki9R8bHOGP8IGKrySbSwAIAIAI7evpUzldKVrEUKSpycJO7/zHEbScYGCMY9ajDAbsE5OAQPf1rSMnJJPYj6vyRagJuYsx6AjioQwKqSSW6kVVRRlHlS1Rng5uKc++wokcbWZiSF289u1V9+3jJP3j9RXNKL5vU6cLJSptydmWA+0jnA6iqHmKDg54bqe1aezaTizpq1Kbikt/Mv+ewUck8gZ9RWS8hYblyMZBH8q2jSbe+x4bkoNOXUvyXDh1wcZOQT2rK8/JG9iQDjJ9qTptR5JbHTVqxjNPq0aqucE56c4PbNZyTMTHliQWHTv9axc0mo9j0ML71O7Xf5Ftz5hVuQdxVuecCot5zwwKgnOO1XCTbvE5o4ectG73IztYgHAEbYGe3pSyOCcDAG1gfeqppPVm8/3S53uQPyAST1IxTd5CjI6n861U7WUTFSdVJVNmU3TBODjeMYFMeQqhHJJBOB3PfFKompK+xhTp3qOKRTbAJUkk4IA9DUbHPzrg4ODn/PetZcvNpuVHFqnTbeq2K00gQKGHy4IOO+KguBxkk8tya1p2qPmZxVqsuVTXX+kfmn+1Zdbtfl2hslCT7msn9qm5c+JZsZ2qwJA611ZrC+HUUdXDlCTcnNbs+PnkYMBv3EDJBqsJP3gOTxhfcV8nOFkm9z7TD86fK1ZM0UwcZYk8scfyqGBzyS5AZgAD2pctmuXqdk6UXFJO1i8hZsOGJycnPb2qZCuUZiNvII9TSjZu5hJOLkkWrNd8qb3JGRnPc+1EC5uY3BJy6j2I4pNNq1x4aclOKtdbH6//s9xZ8EaWd+H8jJz0GcVP8BwYfBmljaRGYBke+OlcuAoqMm1rcx4khHnu1a2n3no3xC8OQ+I/DGo2Eoywgdk9c44ArvSisiBsH5gSOx9q+pwkoUpKb6ny+Jv7NSS0R+IHjHSJdG1i7spUK+VMw5+vFfSn7Tfgk6VrkmqImIrn5iQOnesMfly5lUhsz2svzlSp8rWqPjvc6dwR1A9KWXglduCB0+teSotvle563tFZN9rjkuXGCzEHdgEjgVTj3Kx5Jy2OadSmlZSepjCcE3JLY1jckyAK33xjms6EsUXJOd5xWXK9UapqSTb+R9l/sy/EP8AsjXToU1xthuxiMHpk9RXyj4d1i60PVbTULVsPbXSsSc889Kzl7tnEyr4eGIfJN6rsfvFaXQmihYH5WUEH/GvKvhX4ri8TeGbC6SUsxgUN65xXoUMb7ZOMWfLTy2VCXvK57KHGcFuRwAKo5UnJbLDBAHaux1Faz3FKpKMVFpP+upcnk/d7iC28HI9azrmVvLI3HGCcdh61VJPmtYwq05xXOnqflr+0XdZ8YXoyAokPHoe+azfj/KsnjC+GSUFycE+vvXTmlklF7nrZDUjOj8z59WTed7sfu4BHaqrSZLqmTkcivnuZO1kfQVJNNJrfqaUcrBDk5wxBPc+1VUHAyT7n1qFG8kkVVUmkkjQWRThSQeBgeoqgNoKdASpwB3q6lrKxnUqKMeaWx0NmgM0B4IaVVOe2etV7BnSeAnjEqnPpz1qLtK/QcHepHldkj9f/guHXwTpT7uPKVQB2wBin/CNgvhHSlU8rboQvrx/OjJ2uW7PFzxznU5V01+R6+ThEOTnBJFVGk3A7Sd3TntXttuOj2ZxQV4KbV7Hg/7QjsfBsvy4UyHIPqBx+VVf2iJdvgnHJJmIw3Q//qr1cGr0nJbnnK6xMYvT0Py4uuLqYbjgv19KiunAuZCckFhx6V8xXTvzM+09hNU7xfm/MiiYM4BJ+8SM96QS/KiYxkkE+ma5lJy2KpcsYqT0X+ZYO0428LyTjtmq5l5+UE+WCeOhxVpaaMJTfJzPbsaCZ3Ko+6OMn1qqLraA20jdkg+lZpNo2co8lpbM+n/2bWdvGYUZP7o5B/h5/wAKT9mJlfxjM5Y7Wt8gntjrWdRpSSZm4RjQcL6n6hQhfLRQ546Gq8FwrJEScMduS1evhk4xTTPk5VlOo4yT8vMsmQIjE5zHyCe9ULiQtG68biGwTXoKilJNbs5lJwckndLWx+U3x+ulPi69GRvVmAI7c1g/Hq4z4z1Qhgc3DZB6jnn866M3p2aUtj3OH68ZU+VbvU8LmmGWLP34x2+lZxJZAwAIDEAjt714EKNnZ7Hr+0k24S6l7zkaRWVmDDAJ7H61SWbj5gQA/wCdY8rSaktClSi6iUXqjeUebGy8fNwD6Gp9IhE7qAS3zEgCs1JRdyqtSKfJYLdCrxsCQVcc/TFdiNKDugXA3OQAfX0NOtVjJ6mtCjVU1N/Cz9Rfg2MeDdHJGAbOPP8AtYArS+EdsY/B2kxnJAt0wT9BxWuXQtBxR4Gb0pQr+0kcx8cfE+oeFtCiutOlMbuWG4d8AZFYv7SVhLP4MMu45jlYKOw719PBp0mrao8WhUjUrpTV0z4yk/aL8YROy/aTtGQoJ4r5wvhslfOQFY9e/NeR7W/vJ7n0FfLaUbSlG59GSftN+LAAPtbH7oAz+g+navlKSYoduBncc5qo4ucJR5Dg/s2nWm5uLs9PQ+pl/aj8VJLgkEgjLDv+FfJuA8gK5BTJJPfms6mKc6bU1YTymFKo2rv/ACPs3T/2nvEk01ussSbpJVBLHjrz/nFfHsNwsTwuoO8OCPqDWdOu4waTPRhg6CUZcp+43hPVG1nSLS+d8ebbqxI/2sV5l8B/EsWteCtJ/eAzRxqsgzyCOgrOjVU002efWpyhVaTuuh7pMqHGF3DgAHoDUjEsw+X5Rx7ivSo4a65kzzpylFuKW/Q4rxH4L0rxDbvBfWsbrIhB3AflXa7gpGedzZ+uOxrVOUpPQzlQnSiqiemh+Unx1+E//CFX4urJCLK4JYZ5Cc96+pv2pxajwxEz7RPJIAM9hnBrohgfbQcnuexQzOMpKg9ep+Xhl/eEFhu5+hJ9Kp3D/vmKDJ8wgZ+teJOioWS3PWwtJxTbVlfTzFd2JAyQ44JPeoDIvmcsSd2eT1oU4tXkty3RlyNSfU0oiRt+bLBiSP7tVoZDtyMA7gSBU0ou7b2IhOKhGaVrHQWU4juYCW2hZASfSs212STQuVDKsi7lHfnpWM03HU6lioKSS1bP2g+Ek73Pg3RJZH/efZEUj8OoqD4QItv4N0WF8hxaoSPQ4GBTyqFo8reh85nFGE63NDc9hADKoYggsQAe1QKQB1IIYEEdq9qnSfNe9mzyalrONr/5l0NtAUthsAYPb3rMMm45JJIycf4VtCje829CFXbtTi/eW3zLYk+YnksWJPvVISlVZmbAXcee3rWsqKaSW5gquvLUei/r8TQ37WQNklmBHtWd5/C44bnkdhUUqTmrNbHTHFOWr26GnI5BBDHH8qyXumO0c9Tn3ropUZKfK9jjxcoRV4eVySWZlJTJCEfmT/hWVNIGPzOScggntWqpLntLcqdepGPNvFfeapn2j5WxuwfpWO93FFHgMCMEjHb1rGjTV3FkOs2lJ6MvRuM/O2ctwBWH/acW9CjbiMkhec11yhdanNGTdW71/I7OzZTJgOMDGR9a5y31OTgxwsecAY6Z/Kud4blSbZvh6Mo1U09H07HehgCrE8bhgCuQOoam+1I4goYjO4/d965KtC6smehSfI7Nats7HzAF+Y4y3SuTjj1G4+aW6KA87VrP2fI7PU0pwjKdpaHSy3IAPzjqec9KwBpTu2JJ3bkkrn7wqpe5ZIucOZ8kn8zSXULQld8y7lxkA1Bb6RZwhQqZHJOR05rmkm00wU25KLY3+2YVO1UZyMkADqT61tR2sMYwqAAjJz2/+vTqydk1sial7pMyW1G+f5LXTzubALscZP61tsSGzuPXjFWr1Gl0I54Sg0nqYhXX5AoeSNd2fu9q6ESAhQ/U8g+lZxhd8zRVWMYRSezOcj0m9m5ub9yu7AVePzroc4LEHg5Fb6NppkVIckbtadDnxodoNjSKWdcgZ7GtpmIQnrg8k9qUWoyvJms4OSTprYofYbZFz5K7c4q1vUoq5J57+tKS3/lQp0p393ff/MpmJIhkDAVckAdaXc3rnAAA/wAaXM000t+hLk4U3F6kJ25TfxuJwKY5Oc9cEEexFb1aLvbv+Bz0IxST3RWlj8wbc9WIIHY5pshcsAGBU5Ix2renFW5o7ESkpTSiuuhQ24bbkBV6+9WHIKgsBu3YGO/SiLTVtmbzhz3m9EymY/lUK+CAdw9+OatgAsrEkkHGPWtJVJJuT1OLC0ZSShfQypo5NvGQpGKvEKHwWOwFd3t611RrWjzNFQw/L776/hYxdrBdp5LKSM9RitPC54JBOfwrSGIera1MqUY1GkmYjDawUgkjPNX5E2qFGSfftVVKkXHQwnT5VaPfUzChYY3Hgjk1Yc8MoU5Az7CiFRtWuVCioaRdn+hV8ot5eScDnJ/z61MvzEZyBngetVCMm047EVvZJqNtboVY8r8xOU+bPbJ64p6OF2cnDHGB2qqlScfejsjow7glzWs+nyLKR5KAMCzKBk9sVLAVDpx0OQfSsHJRjdl87UlFrd6gqyL5a9iT07Vp5G5W55yPpXC6iUW5LVnfCny1eaLtoc7rw/4l0vdguQKn15E/su6IOAImyT2HrW9JtLkRzQlOLatqznfCMgEU6kH5Z+c/Sq3hUlVlAcgeZ09a8+pQtJXZ0YjFOyilrY7SaVnHP3SDgU2RlYDGfmAJHpzVUVFu0jmnXnJNN6WKUr7TnkHI4FEqbt2P73GP1rso8vMotaDlGco+67Jm2qY2t/d5+ma0YoiR164yMda+YhFOd76Ho1OXl5FrJXIETbgjO1QSQO9a0UO4JtwcuCMd61p4hNtM5q1BKEU3dMrRqA20Ak9QT1FaSwZODkEdCO9FWV5WZ0t8lFQlp2KaIxyqgtjGD71pxQEuzF+QccVTvGKaRx4dTcmov1KCJgr1AByc/wAhXQG23HPPzDJI7VkqibtLc7bWnzR2OfkzuQBfuuCD6VtC256EgsQM+1dLqJJRa1RxUaFSU5cu3QywMBeDwCfpWm9rtUYwSMZz60oTcFaK3OipSUqf94oxg5zux0IBqQcHBU4yORUzhZJtGcq8lpHa1iRCSAVwDTlKsXHVi2AR2xU0pJOy1K9qrJNeVx6McAdB1x60gIDE5Ppj+ddEk2+YyoU5QXsGtO48ScENyeBx3qPcN+3BGSOR2qXaNktzoVHnXJJ/Mto5O7BJDNz61VDMrJzgs3JHel7LWz3OR4mNOPIrqz1NGP8AhOSMnnHeolkXGWJwrZJHU05WaSZo4xnHne2pcViDnJ2k9R29qjjYGPPOCe3esWuVWZzTrqMFbY14pQnUnGQPxrPQnKYBwWBFc0oNpyR6GHxineTVnsavmLkEEhip4HQiqBbcQefkZsZ7UUneLc1oaRqO3JBXbLjyEZOcngDPaqG4lTkkbck1q5xlZNCr0lyqK3ehWdmJI55HXv8AWoXJ3IpBzjcST19hWlSKmtOhxy5qcVBq4pcFcbsHk5HeqkjFeckjnArKVK8uaL+Q+eSadR3HPMuQuc+hH0qgzEsCCNpx0610cicddwpRmpJvTy7loTRnOAcupCn0NU0kYSL1yv3ge/vWdTmUb3uzehUg5NPYtGVQSvOQBn3qmZA5DjORgGtYxXJrueepNT5o6pE28Mp5OVByfWqRk5O5jzgADvUrf2lj03S9vTUmrNFrcowc89CPSqBdlwQch8rnuK0q3TckcVaMJS5UtU7hvUhjjk5I/CoGb5s5OSO/61nHVKSFdNtVdh5bG5QM5Ix7VBICQeRyOR610R5XFNrqYU1KnJcr0YhBUpuYYzmgsGAwBkE4HrUVErtpHZUpJVIqbJY3IJVVI2AHn2pqE56Zbdgf/WolTi2pLc2nNwSjFeha3j5RtPzjkjtUBdSuRk4PU+9RThZc3W4pwqq0dkPEmQEbk55B7c8VDI3Kkc/MSR6+1FRqSdnuPD0Z0m4PVCSnovoSSfU1XZ9zMVzgjnnr61UI3iovVszoOk2lJ69hrtuwRzlu1V5WbaQpyMYIHan7JXtcVP8Ad1FNrToMDqQQRycjFQF8bQeCSST6gda35YqSkyHiZ8ji46NkVwyKqg5PYkdaguNzJI2QNy4AHQY71NOLjPTZmWLn7Wi4SVrbeZ+Uv7UUu7xVcB2B2sASe+TWf+0vIJ/Fl3vckCZgQf4s9DXTnEY04Jt9Du4OqOrSdo2eup8rNIFd3RiTkHjvTNpU+WpJXd1NfKT5U7J6H18XPkTvqTLcEEAEbt/IFCKq7Q2Qwzj39KFC7aRNZKqk4rU17SbdtLgkkn8KzFYwop3k45JHcVSoty5Uxqpypzau9jtdORZbu13EEecgAHbmqWhyM95BuIIaRS34n/CsZpdAwMOaoop6r9T9nfgvbeT4N0iPB2m1UEfh6+tafwkKr4R0pcYIgTPvxRlNNctnqeVxCpym0noj1sI6IiqxO8gEemKjL7TuJB4Bwe9evToNK6fyPM9rGEYwnpdNHiPx18IjxL4SuHjiBls1dlJHXI5Few30EV9a3NrMu6OeBlYfUYr0qWISShLY8+nh50JqpHXax+GGrWclpeSwyAgiUggjpjpXrHx28Ky+GvFd+BEVt5Z2ce/rXHmOCnCV47M+vwOLg4OUN1ueIAjJ+Y5GQAegqHfvw38LAYHpXz7s9JbnX7RKXKloTRyAklm/1ZAOO3vVcuykkMSBnJrZpJJLY51yualbU2E2kRhWBY4JP9axxduuHiYgKpG31olFpXNYp3dVx1dkfef7L3jz+z7qTw9d3J2SndGG/LH0r488GeKrnQtbsdSjkIMM6s4XuB1FcNlC7ijSpFYiPspfF3/Q/c6OUNtdSSXAJBrzz4eeJ4vE/h6wvkkDM8AOQeeMcV7lLENpJo+NlhlTl7P7Wv3HoEzlEc5J3A4A9aZPny3Ygc9j3+td1BPnUbClCMYupN6WPya+O02PGOpMGJj80gZrM+Ok4bxjqeCDuuCQoPQ5Oa6c7UWrI6MgTUPaKOn4HivmZcbHIG/nFUxMQ3fA4B96+ahUbjZn1Naq21dXRro+7c6sS3JI9KzoZF2Bgckvgkd/rWUnbU1pTaaj0ZrxAAruJ9BkdKoCU7FbeR83JPet1G7uzPEKUUndHU2MZNzEpJG+dBke57VBpdwZZ4WBJG8E/WstlrsOhTTmpxeh+xHwoXHhHTAW6WqkY75Aq38Lk2+E9H3KFBskAI7cDrWmWUvdufO5rUi6rTXX8j0dACxJOARyfWpliyNuBgHqK9ipO8UmrHO+Vz9qvuPm39o4geEVUMSWlJwO2Mc/jUf7TMjJ4QhTgBJHC4/iJxmu/DRXspJPc8zLqsp45OcdLH5dXSt5zHcRh+p7801stI+4EndkkfWvnq8mmoo+6+s03U5ZrUZvZiPLIJTg1Gqg4SNiDvBz61hFtaPYWLoxn7q0ZOkpDAkElj3qzHGCN+SWXnjvUGlGlKMVfzK/YEjGGPFPkiKoWwVxyAaqNm7MqlGKSiz6a/ZhJbxe+8/KsYHToCRnNS/sr24m8VzNvGAgzntzWdamlJKTCvUbpSaifpejgInJyOoPanxwZTzGYkkgZPevcopJWvufIK9RNxezVv1Kk5ZoWVCcsCAB3H6VPKvloWyQwBYEdsd/wrehNJqx59bBXjzN2vf7j8iPjuv/ABWmo4yR9oYnHTrVr44sD4w1Bj1M7EEe9b5rPmVm7WPcyTCKGHU0uZHgEsiRKQM8sBSTjdgyHI+7mvmnJJWR7tKXNVTXa1isHBb5gducH3qXYD5aD72Sw9xVxqyT03NIUYwk5SOq8PSraXKMBkuRzWXpVwsNxEzE/fBGe1RWvUT5jDC8qjKSdz3WIJ5AmwC20nHvVKymFwIlDZXAOB7Vy+zSVz1YObUYQfU/VT4WxKvg/S/lJ/0UY/2uBT/hgGj8IaUW6fZEwT647VplSbSbPls4xMo1JWVncofFTQP7d8H6paqgaVYC6j/GvQr1Y5op4iC0coIII6ivq6acJcyejPCqTUXGaWq1Pwp8Uaa+nahcWkiYeKZ1Oe1fSH7RvgGbQNbutSjixZ3WSCo6ZNYY6hr7SG7Prctx7rR1VrHxlJDlizDG04HrU92h27gSHXOfavMmmpWT1NcTUcWqj2KRQKVKsN4HU98dqjZ8KvOQTg57k1m3N6M1m4yj7VjCQrKFbOGJJNV3YHnOCQVA9aSso2W7ZjzSjNSW1tEz6b+BXxf/AOENv47S+lJ0+VypyeF9xXyolx5MnySYUHOP5YqHBKTcehy4nDOsrT0bvsfuhonxH8Na1ZQ3Vvq0Tb+oZgCM9K/E618baxphX7LqLopAUAH7voRW9KpKzktkcEculKMeZ2136n7Z6v8AEPw1pMEktzqce6PJAVh0OP1r8P8AVfiTqNyojvdcLK2QSzdf1r06NenCN5PQ56mVTdX2cZbn0/8AH/4vxeMLySysXLWcYwmDwa+JbzxnpasHkvQ7YJYKenHX61vVzBKPLBWR00cv+q3qLWWx00k7fIAAFbn6157/AMJpaSZEFvcSfOQg2Hn6V5iXMk5rc9XlnBJxerPQY5QSCSR1AzXno17Urlf9G0xwsoYAucH3rNNzTiuhvKtyT5k9z0gyDPlJxlsk15uJPF93JhGiiQ4Ic5JxWEk4q03qyasVOXItUnc908F6bLq/iLSbGMAie7TJHfB717J+yn8KNe1fX4PE+p6jI1vZuDEMcEkg5HvXLOopSdOGrDE1FCkqs42tsfqF4Utk03QrC3GAYIUyeOOBW1aaJBFDFG8rMYwOD0FevgsPFRcXufL1avtHdKz7mh/aFsvzNKpXr249qiGl26MrLGCQc4x+teo4qUbPoc9KCu5J7EB1S33uFLEbgAR9O1X1jSBQUA+RgwJHQ0k27Qe5z16EZP2k2ZLapIW+S2YgEEZ7mtQIuw7cDgjNdVObaSktRfUIpusm3B9P1Mdp79yPLjA3cEHqPWtZwAQOPvDp61pKD9pdPQmvNumlJeS8jFEN9IQZJ8MTyB2FaTFhxkgsTya6KdGTV+p46i5Tu/mZCWDbsyXDE7xxk9K11I4ycDbg/hVVadmmz1FOMKbs9X+Bm/YLYFPMHzcEkdRz/WrpC7jk/KoAHvmumnRindnmzx03JwaT03GRQRowSNQFGDj1qVcgHggbgKiKjJJW1KVX2c0lI0onjDxjGCCOlVlYqVJGe4PpWEqSTaWrR6dSpJpRbVvQ2Dt+Qj1wRWes+4L1B3YOe+fSs1CSjaxmq8YpxZqRZ2qCcgE8+ppIIywTHGcA1lUV5X6kUm6cEk/ddmXVyvl7SSAQCR3qcIwwoJAXJBHb6V51PmkrX2PalRatJLcmjwOBkAdu2aQMVIwxAU4z/ez60OF2ylFNJy08h7MzDPPIPHrSNjcMdOcioire8lsZWUp8rehErEckjHUj0pg3EfLgbjgg+9aKE3FJvQuEoqF0tL/eOabg/wB5gCAe9Uz8pOCQAcZ9+1VZJpt6GXNZOmlfValvzsEKW4Unkd81QMgAyc4JPXv6VM6aTTNI1pwk4SWvQnkuPmQ8kEkYPasxpCGAyxUtg+taugmtDgvOzb0V9fMvtKD0JBRc/SqRPGdxGTk471jvHke1ztozW8ncnErZ3kkKOR7VWkmCgE5GMYx2xWtNqUbJaE4is4QUJPQlkYAIyglWBOPSqqtlkU8nPHtXRFX1ZrSlKnTV9hz9ACD1yKu4WSMKBgq+Cfw61hRbc7JHn4i0KdorV/gZQ8wbT97gZPYetX3t2AwAQeeOzV088ZO0kdMME+RVYvUrA42kEYbafpUqwEq2DkY5NKaXLaLOSgpOf6FaVSVOeO4xT2jPTLHGc571NCE9GbVo8ybbv/wDKMoUrwSpwwPrUMgIlLYI5x9OK9J0m43keRhXz+69CMSttAZgck5P8qdBA0rq20lNxHsD2p4nDwTU7mkak17tPd9SsyK7gDO4knPpW5a6SzsmOpODgVTlCEWk7G3sakpJyW+5hEbM5YHkbffFdzP4dEkYUcDABOOeeuKzhiktGrgsHeouSWpxS/vDuOeHzg9/Wu/Tw3HmLBJIwfpjsax+sQbsnsdCwlanVVrNO79GcHuC4wDkE49zXa3Ph6KMZAIYE5x2z1qlWV72Kq0Kk5Jw26nIw3W5QW7ZIx2HerLWEkEyoM5DNgL39BROFNtSSJUpqCpzdinqy7tMue58okDH3vajUVK2dxGRyYsD2wKzpwbkmnoOdaMpqDWqOH8LSL5s43AkNk56D2pvhhds1yAp4dQCa461G8kmdbqyai5fEtDvSpcKV9DkHtzUseVADkHrnHejlTd0ZSpJy55P5FVkxktxz271ZZd4GfvHAwOg/lVU3GSt2MZ4uMKib0TOyitFXpnHv2qysoEeBnDqevavnKMpTdktD1KmH5ZOpJ3aEQCMbiOFIxjvVKeUhQGYgEkcV3qk4x5Tz1VjKSvoXWmQNuwQDkkeuOtYuZixwxI3Z+nFOEE42eiMq1X3eZO7vsb8NxED90jDZNYcTvnOCOMkHvVTopWincmlKVRqcV6nYecpBKtyQAM9sCsoO0YXc2Q7D8PrXHOChLl6mlSCqTv0f6GvFMBtL/xkgEdqyEk+ZQTkgggelVKCl717M71UjTlZ/DoaVzIpGFzhmz9eOtZshJUoWO48Z9K3owk5XkclTHLldlpchlkUkYySrYqHJ3E4wDwT61qr8uppSgpXc3ZkwcFlGSBuGTVdQQvBJw3JPb6Uvebs3uVGSj7i2sXWIPzAkkMc+9Vkc+/y4AFTRvCKTV2Z/W6tSL5VaxOduNu7IJ6Cq4PQ9cMQQf51vThJ2T3OeWIg1Ll0S/UslvmVeu/kD0xVfzDkKSMjnIrOcLNuK1OnDwc4Oqle25ejk+bnqDkg9/8AIpkLs27kBeMZ6jnmueN7xcio1OeUlDZ2Lscm75ACCGzn1FRINu0sTlckj1rWdr80dbHNJSceSX4mkuDgZOV49jmoUnUn5M5AHFYRk7aLU7MS3JWpvRWLRcAHYf4iSfSqjSMpPPLsD7GokmotSOOjjJRajs+5aZ/x3ADIqrjjOcKBgAetXGKhF2N/rcpzSZJIysuBkjeQAe2fSqrkFlJ+9uIAHarpK2nYupVbUoNWT6ibcjGc7W6HvUTuWBweSCa3XNzc0tGctSvGC5UtF+RSkjG9cdOQcVKoc7FPC7sk/WocnCbT2OnC0oVqfOviRSLsV9dzZBHapm4IBAPzE8d6ceRNSkecqtSUXGTs7lQ8Zx6kCnsR0zhumfSrbbabR2xjKMLUkQfdwpJySeabKqkEdSG4x/Oj2KfUmGIlyKS6MQEHIJycDr25qDDAgEkEkLn09Kvli43RTrJ2jJaN7jWyThckqp60YyeOpJyTWdKa5EmrNMzxEGpc1vdBpCuTkFQCTnvQRkLwRuJ4olByWprBXlFJ2IS68KwHUHnt6Ukqq2OnbOe/StKMVJXSNatH2c+dO7ZLGzMA2c5wRjoKrBs4wSAvNRUg4qyOWE5U06ktVsXw+7CEEcg8d/SqayOSrqwGMqPb61MqslHke5NHEuc27bFp5NpAK5IIHP8ASqjuSMknIGAa0jHmj7y1Or6xFWV9HuRswOSOCMnPpUTcFFPAO7NWktpPQ5Y1o07O2vQiLMWH4AkdsUuNvVs5zyO1ZRquUWorQmU4RV2m3crGUggMTgYBPrmnOu8LtGWIJANdFKlG129xc8nHkb8ynK+Mls4RWPPfA6fjU7xFx5ZUENkE+lOnUbinLSxhiIVeZ31XQ/IP9oaTzfGF6ck5lYHHt0r7G8ffsz6d4w1GfUpLkr5kjOQO/SnmlWM7RhsfRcOVo0aF60rX6H5RlTlcjJAJ+uK/Qqf9je3kfdBqbqz+33cdhXgVKN43S1PfeIpU4qKktT87ycYIBIKjJB6V9+N+xs4PGqMCG6EHBPrWE4dUtC4YilBJKWh8ChmaKMLkhCcg9ga+95P2N7x8KmpsNpLMQOvtWlK/PzrYiShUvNNP18j4p8NyN/aVhjkvMoweN2CBX27p/wCyJfWN7aTDUi3kzBjgdcGsakHJcy6muHrU6ddVuZWR9w/DBDF4Z0zcx5t1JHYDAxWz4T0uXSdLs7OT/WQRhGz6AcVvgaUowTaPn8XXc8RJv4GdtEzMp3AnkkE/pUYc7SQSXDZUDt9K9VKT0R5sKrU3NK6Q5WG0HawG3nHt3py4JCjP3gMCjmak2tblyVqMU3712fH37T/gkarorazbxbrmFMMccivqTxRoEXiHR7rTbpQVuIWUkjpmu3DVlUhyPQ58Jinh6qk1e+/Q/ByYSwyFG3AqxVj/AHTX35rP7JFzdXk8tvqAEE0rMqr/AA814eIpJ1Nj69cs4pp6XufAaNKRtViVAH4H1r7vh/Y/usYOosdwIUemK5XDlaa3Oqc4VKfJc+FHTcFf5g2ST7+tfecX7IlzEyA6mxxkEY6f/Xog5O8rXuc08PTcYxU9Fr6nwoEaMIVyd3TFffsf7IrBsm+KqDwRSjBydktTbnhCKtJWH/sq/EArFL4avZD50UgMQJ+8D0Ndf4M/Zt1DwrrdjrNnqbiS1mDMAOHXuK5YUJQqe0T+RpiacK0OVWbWzPsCaXdbzEsQHiZlPZfSrcFjI1qIpPvNHtbHbI5xXuYefMlJHxmMvRpulLVv9T8evjSRL4t1RgxG26Y89q+1vF37MNt4m1e41Ka+YNLIzBQOnOea2zapGT54nZw9GcaCpzl6H5bF33BM5VSM57Z71+iv/DH+m8H+0HwM5z15NeLytO8T25Ok4qlN6Pc/O2BNp3p9wvkntX6RW37IeiqPnu5d24Ag96qq5WTaNqXsIPl5tj870jIVQ3GWJ+tfpLD+yH4eTaftkpBIYKM4HuKORxaurmNTEUXLlcz8+tEUrqNkChJFwhKr9a/Re0/ZR0W2mimW4kDI6sDnng85pyhKUbJFQrUIVFUbtFH0Z8MFVPC+lKeQlsgP1xXWeGtJTRdNtLFc/wCj4AJ78DrWmAi4x1R4mOqOVXmp69jbX5UJzg+oqdkRVzuwASSfWvQq07yu9TljeUVGSs935Hyl+1BI0fhJV4JUOUB/vV658Q/AVp47sFsb5mVIyxUqeVyO1dqqRjCyOTAxdTFObdoo/GJmZ5CjEqQxxnsDX6LN+yl4c3xu07AbuAM4X/8AXXhVqTc2fZqtTjaSa8z86DI27jIyOp9+1fo8f2UfCyjDzSMxIwB1HPXrWEad1c1liKLd2z87oZSirhTnPGK/Q4fspeHIj+7uJGVM5HcfrVexbWhFDFU4+65H55yEBQpBJY5GO3rX6IN+yt4adAy3TjooB7+vepUNVFrUyWITdk7I8X/ZVUN4pviAPljjwPXJr6n+HHwVsPh/qDajZzlnkADA9sHis6+Fm6ia6Dx9amsO0pXfY+jtoKxgZI6g/wCNRidFUKzDgdz+tejT9okpNbHytN052UXZkMyhUcdRzgntjmoZ72DysGUHnGc9fp9a9LDxUZJIjGuUqTd7n5BfG5v+Kw1Ta/3piQB1Xnv9a+rPiB8AbXxLq93qQ1MAzyMSoz8pPr/+utsxm6nuxeh62RVaVLD87+JLY/OK5yQrEfxEHFfYd9+zM4UraX0rFcHG3qPSvnnRk5Wtc9iOKi6bVJ6nxl5ypw2doXHHavqK8/Ze8UzDNozEs54IGB9elOGHbVpGdaXNaSmrPQ+XY7hWC5HKnOR/SvoeT9k34mys7R3dqg2gDIOR9eapYZt3ud0qEJQUeZXjscF4Z1uBGSGWYqDgEn+HPQ/5Nd/bfsifE3fD5viSJUWQMVRMHH1J7/SorYeKTSeqFg1OM7zknF/mfqB8MroS+E9LIf8Adi3Q57DgZrC8BeFrrR/Den6fe3sjTQIqMQcZGBgcUsDB203Pmc8jJ1VNvqepy38I2r5o4YgAH161zg0WzhJKs7bAVy5JIz69K9iLWyOCknz+0k9zjPiN4d0DxjpFzp12wZ2UlSMZU9jXfR6bZqABAudpJPuehpQqSi+VK9zqhVcZSsfhz8WvD974B1O5tpNNupISzeW0aMQ/tn6V+y/iz4f+HvFthJYahYo4ZSASBlc+hrpqUKU3dLU6MPm1SNPln3P58rnxTrJGy18PzESYAZ8cV+kPxH/Zav7OS4vPDa+ZGSSYyOcegxXDUw0r8tvme3CVKsrt79D8xTceObspixit13ceYSePXj/GvorXfh/4m0KR477S5VCsQDtPrx/9esPq003EyxV5TSbVlsj5suNN8VS/JLq6xjgs0a/e9q9TudMuI1czQFDnAB6g1lOjKLTT1OOlJxnyOGm9zx1vCdxNj7VrlywLZIViM16FPbyx5DxkMWxzXRVi4xUY63N6dFTXtWrdv8zhY/CGmLOjXAaV1UAGRic11nlkEs5GAQQe59cVyzhypM7IVE480bGJFpGmwOqQ2iF84JC9K3FillkxDG2TzhQcmtLppRSOGMpSTlJa3GQJbR8RxgDk4wOK7HRPBHiHWnT7FpMzs5wrBTgn0NKa2jNanpxvpJvTscysQlO0knB5z719lfDf9lrWdVnt7vxIpigXaWjA5J689P5VhKpzLlSMuaFJuVzxb4ZfDTV/Gur2cEFq5sBIoeUDgAV+ungb4daJ4N063tLC0RRGFLFR14oo0pVFyI4Xm9Om3Upq7HfDrwXY+C9Bt7C1iACIpJAGWOOa9CyVVgclQQB7V6lLK3FKS1bPmq2dTry53p0JgWx8w5wMAVB5hXJPHIGP8K7qdNpqcdjH2inU9m2T+YG2EE4HGcflVVZDu2gkEMcZ6Y9adSCb5YuxKpqm7PWz/MnZ9xMePcZ6UxQSygtg5zz3pxkk0+xvCDqpprTsK2AFVevCgemDzTl27sDqCBkd6mU+WN0iIxk1ySeiIpFJxkkMWGPbPrUuRgMSSTjH4V00pqmk5GNehZKM3fm/AqlTyWwQG49vensdoQejgn3rqpzc3ZGOIhCC5V1G9CQRkMMfX6/1pq+Y8hRQACqhSe5rog3dSlsYTTikpO+ghTBU91fORWjBEWAOCCXGQPeprVkpJjeAU7Tb91alGNN3HJHBwO9dCkAjUFQOSefSk59EzOjVg3eK97sYX2eRsEZy+QoH1rp44QgXjuMY7Gs4YiNveKcpXUbWuc5FavuCtksWyCe2a6iFI2cOw9yT3xU1MU4pPqejh8NCUHF76hY20ickZBUdexxW9DDujjKAZDMSPbjH5/pXmyxHtE4yVjrwUYJxSTaM/wAkqVyDx0A71uJACu5hkq2TntRG0YWbOirRaadrXOcaPy2A55Y5ArbnhUngHJIPHQGs3LnXNJGMuZu0Xoc+Nu8ncRuIyKuGHD44JDAn6E0TmnDlSNKVC83Ny1KZIIJzhlyR/SpZowMAHngk/wAq0bbsk9CKcmnySa11Rmydc5wWcHB74qfy3YIRglPXv70OCbatsZpTtdK5nyscADIIGee9OlU8kk8HA9qumpJpo54waXMuhTZmO0lc4bIp75XYeQ28k+hFEE+Zya6Dxbail1IwxYkMSB0wO1RsZCdxJDbgQB3qpNtXa3MsNKMGpLce37vhiD8oI/CopBIx+XqM59zUwi5XimdOLpzkud2sW449wyQA2ctjucd6lsnIwGByDjI7Zq5xnFWexHs1VpLlfUu2ancVZfmLMeO4q6qKGVj94Y4Haonok09jWGG9lFVJO7fQueSjRhj/ABAYB7Um7btxkgEDFYuU3OyWh6McQlBQjv8A5mYLXYWUDCsSSD3rTZeoOQcg5HsRTl775kck4SdG7ZkmBSSR2Xj/AArQcghvmAK54H0rohVb9wwcIxaV7tlCO0gkI8xcR7gGI7e4q6qnCqckcHP17Vl7eaaUXoEk3SVlYqw2cK7sLhT2Hb0rQiUKCzghcHOOtdFSrqpSZnz83uyXzH2ipExDdeMEfXmrVvEGZAcDkZFcOJcWlI7KE5tuM1oaYhcjcoJTggHtXS2cAa3ROny4B9M1zzqpS5Wi6dNxjzQWlzBhiKkMRncRgetdGLVcxt6MQBWFSolNxZ1xgo2cFq9zCvLcTIUCkE/r710720bxxITnGASPaqo4hqNkzWjQhdN92ecy6SoT5jkhCAa7K6iGGAAByAfbiumNZySkjzfqcoVG31Z43rdhugnC5DKCDkdeK6/WLdRBKSdpkjbacdOOM16mErXmrIyr4dTXK3Z3Pnnw/wAXtzHk8nBx2yf6VP4bXdq9yhGSxJx684qMbPlqpJepnGhKELtnZbcLk4IDKSD+lbD2D+UCFIRsgkfw8Vmq8IvQfsVKF0tTGidSynJVgQRnvUrwMpOV44ya2UILRs56lkttTqk2sFKkldoAHrWTFd+UhHPUEexr59Rmoqx0e0ik5T6mvMilAzZIzwayP7QTADFgWJwa9HCYaaacjhr1aM7VIL+kbMaAjPBJOAfSs+K9VhheCQcn+77is8QnF3S0OylWg4rl3ZqxIoI6Y3AkmqUczfu1zgby2R3pxpSUbXIo04zd4bI1yiEscjdx078VSjuVzuckckmojh248zZFXEtVVTe6LCxABmHLHHJ68VUku1JyH44wB3pLD3abeiBY+Kq2Ue3yLLMoILds9O9Zn2tNvXDGt3hXCSTfmRPGc0Go6X0Jju2gZIZgSQveod64ViQNpzn0qp0mo3W4ueM2qclZrqWNxIU5zng59qiMu45wSzPyB0Brnm4yd7anfKm2kktFqGXGOOjD8qiZ1LAbgTknHrW803aLOWNWLlzRTTJQzcK3AbnI7VCkm4YUEuyAr756VUE0rszdGMacl319C3gtzuwQeMdxTFfkdcrggHvTqSlFJx3Zph+Vw12LkbAKSpIxITj19qhReFIOfmP4etHIm7pkaQSlH7jQVuM5OCAAPSoYgBtGSSVLDFYVrRV+h00pvl95XRaDENlTnBII7D61CTllJbrgH3qoJWTZz+1lzWg7XLqZfAJIYHr61XS4OR6YGB/jXPNym20aurF/u2XTkgAL1OP8KgWcBW3j94OmP0rV0k5J9SKdSSfP8gmVyVY/cyD9KdFNktjII2ggdBzxWtam4q1jWcmqqqS/4cr43LuPBBIJHerXynbn7wOMCs5NN8yKjKM48klrfQp9NjKxP7zHHY1KPm2Nz8hJx75qFdz12OOqoqTUtLFF12KcdsgE96uSJkqWxyM4Pt+VWrNWmhTjTk04amQxXG05UtkAjvVhox908fNnntVxgnG+5s5Ta956IzSD0A5yDk96fIMcY4BJBPet4wc04XsziqRnJqUHo+hXLlgMDjoc9/elck8LxjviuZ05Xbeh14Sko2g3f8CvuYYyxI3YyPWlIOWBGCckn0rSVnZnQq84P2QF1OA5+70J7Z7VGxQ7SOgPJPUgURgm20Yzk7tLVjJApO4k4PB9qYzHuCPmP0NdEINbaoxhCKbinYCF2gc4LqSPSpowXIIz94k59KxlJp3kjoxFDm5bu6Qq4EY6jBwD60SOFVRknaSQRUJOcrpaMmnamnGb2K8uQ3HTBGKCzN8x5HAA9BW1S7ST3M7RbU09CMKDgsTg8Y7c0vGQU4zwfesJxbd4nTTpuDva6KzH5QAScYGTVjYduF4K46dvStI6JNEVKTc3GLK68gHJAZsZqVAdoAGSSR9KFS91pCvaSlNajQMKGGAdwIJ746gVK67l++QSCcjt9KhQurJle1tJuGwzYBx0G7JFTkAA4yWzjJP51ilKCVtQqztDVFIr0AUBicrU5GWX5uTk89vc10uSd2yadNQim9mR7BjLLknPX1qcgA7QOCwJB7GlTiovXYznKNSnZ7plYIOOBu9fSrGwhRyNzA7Sex7UqtWEnypaHQ4ShT5luipFEvcHl8kjtV1VwWI5VR+eRWdWEeVQXU48JUnObktkVzzwpJywyTS/MDycjHJFaOKjFOO51zSSsttLiq+0qg6lxgjtSZ6OCAeTg96x63W76GFfnTi53USdJQJMcfMQDntUEa8q/c5wT2HeonFSjyPTqbQcY1OaPkX2kEoABwVYZI9KpiUljkkDJJI71th+ZRbaM6sIVFzN2aLrKrKCOADznuKYkn3wWHy7SKUebRrZms4xlBJtosRqBhMDK9D6UxHGV3H5i4Az2z6VE1dtJaouPuuMpPmX+RMEBVjgk8g04zR+XJ84AJ+XPfHSk5qUoqOxlXl7Nvm3Hg5UDj5iOR3ponTATeucgAZHFHMoSv1LwjjKFnqX1GAvHIAOKoC/tYiA8wDL0J7kdawqUnOVk9Tq9vJNqDtbc1zgOTzjcTj8BWc+q2uEcMSDwPfPStoxcIqLRxRk+dze/wDkXTEDkqcZ4yO1ZLasArBIXLfw8dRSqXk22Wq0oxdRr5GoAGUZBBTJHHWss6jcABo7RzzkD0+tXWSbXMT7WKjaKsbK7VBAHDICc9Se5rIE+pzASCAJgcqT92s6ijJ2R01YuavLVNG4BhVJI4YAY7VjkapIQd4UbgOPSlGKgrxJqtwjpG6Rvso2jPBBJJ9K517C9ckm8fZvAwP4cVsoKK5V1OOlVdaTckb5kAAL4Cj1rBj0t3z5t05JYnBPH0qnG8bQ16Gkbqdlp1ubbXECqCZRnfyCen1rJj0e2BLSbmcYJLE85qK03GKlFHfh1Ocby2kWJdTsky3nrleDgiol0y1B3eQpeMHBx19KTqc2trdThq1YxXs4sqnWLWRvKjDszEAYB69q1fs8aBTsAYPwcdK0p81+ZI1lOns+hiyarcAHybNizckEjP4VtJGgUsBkdcmonWfMm9yKteMYcqRhLe6nIuPIVNx6nvW0UHGVHyjmtGnFXktgoUXKMeV7mOP7RYsHlVVyTwOlaWC275jy/J9KJtyVo6GlSvKM+VbmeLK7kUGS5YfNkEVqKxKsTklnwT61ThK7afkKlyypxU90zNi04Y2yyuxfBO48j2rQLNwQcbXAGO/tVxouTv1OfESS5lFaf5EEek2g2Ax7lB4DVc848YJAPHFc9XDdEysDi5RjytaXKr6dbx/diUNuJH/16nLemchsCtIQi0o3NcXOdnOCs2UTbQ7h+5XAyTxV1Qd6kkkL1J7+9Zxj7vNHRr8RfW5KdpLRq2hSMUa+WpGewJ71dER+TkkFwGI966KdJt36kKpeKUFZJkAtImwwAy3A/wAashDgHJGMjPrU8snds758kmpxWv5lRbeP7xA3ds96ubSQOCQM4Pv3qJQvGz3MpV2n7235ESDZjJATJwB9OaZJIAo35AV8k+lXyu3KtBzpqUWk9F1BZADyfTINRkdWzkHoD2rNTcrI1m7UoxgtiwHGCw5wCRilixhQACrNyT2rJQt7zdzilBzTa07ixgEspJz1Ge+aWPPy4bkPkZ7Vrdt2YU68YRairlWWGOZcMMnPB9fWrHA6HvkAfrXRGaTUWZYeLTTnszldT8I6JqsWy8sInDcksoyfxrp3w+N5wSxIHtWNm3ZnVKq4ybgrts8A1n4AeBdUZ5ZNIj8zn5lA+b0r30nlMDhAAQehqK8b6JbHRRxVSlUV2z5Cvf2WPAc3ItXXdk+uDjnHvX1pInsN2SRj0q4KKVmzWpmM4O616s+Mo/2T/AcbgyQF0iYlQ2Tk+1fXM0ag9cBSefWh0UlyxJlmVVw5pI+edK/Z58B6c0brpKMTgtuAyK+guPlOc4OCw9KdHCRklJnNUx1VxVpaHGaT4F8OaQVW002FBkgAKOK7QKJAGU52sAcVdTCRUbNaiWNnKSl2KqRJGmF9gCfbpVtotpQ9Tuyc+tOdKm02uh57qyqK7WozIxEDkksSB657Gp1ikZd7qecYNOEuV3QOMqkeR7aakR5XBwBnJz2Hehgw4AOO5PfNdVLmautzoqQi2lHRIZKVCseBkAADuaYSehwNuTxWMIy3kjOFC0rJ6sSI5blgMHkHt7UigLsZeoYMD75qa3MpXj3MnRjFNN62JcqAXJJ2sPw46UwOFwuTls4Hp70qTXNysxhzNLkdnt6k277rLwC5IxTVKtvJ/gC4PqauK97ll2O1VVBtpaiYOcjgjjBqdiOD3GDVzlJtKxzwXOnUb0K4OWywBORgGpMsGByCMEgelUk2lZ2MZRbburp7Eka9TnOQSCe3tUUTjB38MOoHb6VtOu4R5mtCqMZSas0ka1uxiTfnnaSQO1VkfnGMFkAP4Vz1JSm1oatUqb51qdAjpLh8/LkZz3xVC1YbVx03nPvx3qpcik4o3hUk5xcVq/yNRfmY4yMHP1Ap8WNq4GDluD2qLKFklc6mue8mxyQkO3BK7lOP8Kkjl3DcM8Z696wrpNb2RlToxbs1c1InYFWBIJ4IPf6VSSXCDc+cNjHepqKUJXWphOiopWeuxtiUFf8AZ6g+vrWYJxlMMNvPAHWuSpJNtJHo80pwim7pfeXZVRkXHXYRn0GOlUjNxjJJbnJ/WtlJX5LEw5bXi7ajWYIwyOTzn1qJ3zzxgDAx1q3yuCijls3UaS1/QgnIkyR0U9fXioSd/wB5htbGD6UotwSUnoia0YOUfZ6shD7g5HGemO1RygnegyFAGD9a6Z022nFmtRNU3IqumQFJzg4BNBQqCGzwBk+nvU+0blZnnwn7SKmtEmVCDvUc8uc5qbyy2SMgcgEfzpOEpe8jrqxjaLfvIhRVK55xuOR6VYWMIMjoOfzrdzUlyvYI05U0lGXXUqFACh3AZYgj1qzEAVBIyucgntSSunFLQI4eMo2i3e+5LbxqoBAAIUkY6HHalilAKBRgqMDHapUZNW7CioU2oNXv+BfPATnPJOPWqzP8wBJJ6D2rDWL1Rq4OKbjt1LqyKOgzhiMD9KpF2wrDqDke9VGq3F33JqVJRSnJaM1HlbhhgEYGTWS7u8m0EhTg8/SueEVUi0nY7o49wlGnBXRcDD7pYEZIDGqKSqdu7JQsCQa7IxajexnWoqTVSL11NRQw2gkHkAH19afZ4lPzYIzj/HFc6ainKRjCnrGKd337EzdQyrjruJ9K6MRWwt16B+c89fT/AOvWHtE5Xa0NvqqUrt6/mZ1ih3I3IIbkGp5LuOL5F5bpz7YrfnTjeMSY1JRi/L7zqbadW/dqxBGCcd653TbxTL8zEEkAZ74rlmnz26nTB3pOpT0tudp5TbMb8Fhjjr9arx3KFVJPJ6n09KwlCUHqrnTh6tLlinp19S0EJULglj0x3pon+VAp5LZ4+nSsoqUZJX0OmVRO83HUyroGNip+Zyw5Puat3RV1Dc7iQOO9bxlFSTWhze0c1yNXd9zidThZ0lycERuRkdeOlalyN+0ISHIcDPc+n4npXdS1koy01OTEpRftIs+a/DEQ/wCEnvIycFFGB6DJxWZBqI0fxPcXDqSmWBI78967Mwpzc04s5sRUhGmpN3PoZ4E+zLz/AAk4Hc9q43RPFK6xI0CAqItoIPvXnQjKNSzRaqNJQhuzTvLQHIHBbAOPYc1PdzhVHB3EHBHp2rajBOTUdTedJqmordnGycoB64JBqnHKGVSzE4xj3q6VJwfvnjYhOquaOxAHPzEk464NNn5+6ehPA7+1e1RnGSXKfK4ucqcXKGjvuWUl2kDJKsCCPWq0e7CdmHP0p1qSs0zWjXdSKnJmkl65YAg9utUA/AkORtNZujGK0Wp10ce5WSdo/iXnvZM7eSRzgVnbmI3E5JIIx3FVGEUrNaslV5Tqc8H7qLouWb5txA3YIHaqQkyCqYOSCfpWlSjHlUY7mUcS4O0lo3cvrIem4nknB/lVUvt+6x3Due2KiNPmVmtUbVcS1eaRpC5xhc8AAA+tZu8EcnocY+tZqgoq8iPbSqJNqz3NWK7Y8FsbiBxWXyVXrnPUVk8KnLlR6GAzB1Yc0jUNwAAwJPzkZrLDHBQMSwGD71r7C0mkc88UpS5m9Eb32jIVgxLY49vasZXbCLuI55qXhYud+hp9ak4KEup0UEowCWOCwHPasSGVxwDhR096mdCTaaRSxihDlX3HWQEADcSepzWOk7xou48ckgVzSw8pPlRrRx3uKMt7myJyhUAkYyCR6d6yGuQSeo3d/pWNSg5aodWpUUbr3Xc094U7dx2jpisxH3uApIzggehrSFCSVmzSFSTvTXzZtLcLgZyFyc+1UYJs7e6tjHvSVFU5Wtpcyw1VuTXN0NqGTKgkgMXPB71Ui5OcggYIB71y1KMnO6dj0XU5Eklds2IcMRk8Meh7VXjlGAcjO4DH41U25ayRNG10/M0VVCAD/ETxUPnD5PmHUk57iueFVRkubdFY3ni1KL3ZPHCEKkAEZ4Hajzo1BCtkckE9/wCdKpVctIvcl05W55/cQywq+4NyOgH94Y5zSSTxlS24ALwM962jKaVuoUq8mrqNrfiY0vzD5icngk9/aoXnBLMZABuJGT0NW5JWaRzpOd438ypMchSCdpLA+1VpL2HJVpANuR1612KVpNtamFBStaK69ewFgo+Y5LcgD0rMm1G3Qb3kBRm4wfTrUxi5NXeqOitJOLlLbuW/MGDzuODwf69ayhqNqpDeYCdu7I7D0FTUpqOliaT55X5rGsp5Q7eAw6dxWb/atsDhWx8hUZ6gmhVG04xQ8K4Rk5VGXSu4oODlyARWS2qQlvl3AE4GBUtO9m7sqHIpOKenU2MLtUclugJrD/tYPsMcTEDjGOp7mtZRbdnuOMFHlkn7qNvqwOCS7AAevtWINTnPEcD5ToR2NY4aWiUDTE4lxk1NXvY2pCCiAcFskAdqxVu7zORbjGckk9azl7srJjxUopRjFXa3NJciRVJI9M1ltLqmM+Sg3Yyck4x+VKU4tqKROHxE2+dxaj/WhsjIKZ4DEAgdwKxj/azkkFAVYEKM8j3qVUUVyMuk5OqpX0NZ2YE45XJwB3rAEeoyHDTkAHoB1JrSnK7vLcwxGHqu86bukb28AHkl8gH3rEe2u/47ll3EEY7VKaTSSNlUUItvfb0NYyKMkuC2ec/pWMdOd9pe5dieM565q1Vg5JNanPQw/Om0/dNXegICsAxJBJ7ZHFU49KjI3yOx4GQScdKm6lFc25FODpzu9dS493AZFLNjYVOCarx6faJgBBjdkE9yaUoJLmvsa06c5VVzac3Yke/tl2MJCXBPH8qQWUAYBEAy2OP5VrC6V2JU1KVorXZkR1O2B3KxJOBwOoFSmKM7QEBGRkihtWt1NKlKF/dRROqBWXZbuRjkY61dYJuUKD2JIrKb5kmlsPEY6pGEWrmZJqNyV/c2zAEEkH+EnvWt5ahcZySSM+tPDOLqcpNWs7KbWlv6Zn/bb2UYEIVDgA56fX/9dX2+QKOzYBx2olSSlZM5qdeS91K3MZ2NQdlVJFGHYHI6jPGOe9a3yMDt5IQc0Ti1a2iNpuEYc7VylHBeHO6cEkgnjrWttMgRhypbJOeeMU5avfc3hBSpttWXYqLZTuB5lwxYDtV/cV3kkkAg5PesKaurxYUm6aUGtCutgoHzys23JbPYVcViDu3EbiMY71EaKjNPqaVXTnDX5DItItc9MqAQAe1XI5WAQHOSfyqp2lJK2iFKUaUEnr+hJFp9sBjYM5AzVgNgAHluQSO9Uoxm+aJNPlgueerkWFtYlHyIoyDyfXFP3ELjcRgAAjvmspNwhZM6J4i01OOwGKJRjbkqR0pC3zkg5wRxRTmk7y0M60ZSTfNoKACTx8qk1GsjZAZsjJxjtWlTVNx2MlVg523didZEBUDPzAZIqEspwMAE55FZRoNq7HHHOMU0tvxLayrjBJ5I59D3qiJMsqEYXcuCe9aqg4p6nQq0qkHG9kywrr0br6jvUfmKCFJyNp5PY09FNTZw05yUnSt7yJjLjaoAyCATVcyKcEZOCQDTlT5VortmspwqP947F3zEyMNzkZA9KqL1+XIDZOfSs7WSk9TupRcY+zTs2WQeDt56DA9TUGVH8WGK/p3rRO9u5wKK5ZST2LTNgAZJHQ5qk8hK8c8ggemaui3F8s1qRi2pQVSk99ycggLt7sRz0PrUAkHy7j6jnv8A/rrKo23d9D0J6UrtfL12JM7eW5XB5HeozkRfeON3T0+lXCDlJQlv3MIYiyTaskIW3cKRxzmoiQRwT15x2pxupJPdGcqqalJR3Hq21jyAAe44pvmDauOVwck/yrJzd7tG/sIyjFyeo888norEjHemICoDPIQC2MntitVLm1Rm6y5mmtBcFht5IDEg9h6mpUK9eec8etTV57qy1ZU6FOnFtq63sOVSVXGCxYAEd6Qv8q8Yxg4Haibk5OLNKc3UgktENIAbG4buox2qMZ35VvnABz3PNVRlJ/DuZRqqLcZrRW1JYlJBZs43Ec9/SpRtJ5YYLgk+lCm/ikio0m3JqWhKoXCoxIG4njtnvVbzmyGI5zke2PWqjSS0SLo15ypNzew5iq4xJjDjAPQGoS2QApz82TWijz6yMJVeWPLTWr6kbJgbmbO7OR6UrynBCZDYwCff0qIQlfmnsYQqRnJU3fUcgGFBGMrwPT3qAv8AKM5EnOD6Vk1zOyZ0zsk3a6Q59v3Ax3BhVdG43Nzznjua3pwt8e5hGo3FODsupOG2oC2Sck8fpVdmykYBIIwBjtWLldtNHVhq6lNJaK25ZdsodrEcgED074qgJcuy5J24J9q0o03DWTOiPJKTmnexeLAcngdj6VTRmBCMcoxPJ/rRUhb3mOcHJNpaloMxAJODkZB9KrkkHryVIPt6Vs2pQSRy/W5pJ9h+7dvy2F6A+nrVcMwYjg5wcelEMKo6pnJHGOo1KotdStJGQx4yOAfbnNWmZOFIOC2QKh860izelKMm25XfVEMcG8Bi4xwauoEAwvOGI470ryVpSIpVpNqE1ZECxJ80QXO8HqOvqKsg7GUMcYIwT2+taTldXZnDmdRSUdH1GLAvynJyzbiPXFWTjK/3sn8KbXbYcuZy5mJhVUHrtPSm53BgAQGBBP1PasnFpKT2NYYjVUpPXdFW42lV7AsQc+1TH7rbsEMehp0qns5d0yLpx5pS0MSTKu4BB2cEenvUsyHzDjockn1xXSoynZmfLNJJO6KhkDdyCSAOKXYVA3cqcDnv65oXK1dalq8JJr4RGXIY4wByCO1Bkyu3kDJOPSqjZvlZz4ikpSU2TBvlCjIOQDjoarMXDI6OMLnIPfNYKDUrrY7nVdSlGEVf/gFlnwFwpyGOc1WaXKLhTvOM57A1ryOLavdnnV5qNL2aVl3LAye4Pzn8agGVKjpnOamrBct2Km2pKKZMxXj+Z96jxlgTll7D0NXRk4q99DSqk5KMVqX45P3WQc4YgYqJZNyld3AGAcdPelVpuU0tka816fK1qaEM7bkXBCknOfaqyNlkUE5UjBHvXQ4Jpp9Dmr13TcZp6G/HKSoGRwctjtWWrEJkEjL4NZyjFXikZyxdaaTjsaplzj5uC2cfSqyoHUNn5Rj8azlTgleWx6MX7iinr3NKCXkZTGNxwOmar7vLjVud7OeO1OShOnZHLSoyhO1R76lrzGJBYgE549azkvBuAweTjBrGrQSXNFbHThrOV72/U2EkZTGGIBBByeg9azA7hT8+QMYPp61lGEpOyWp187hHlhqmaO/YrAH5gwB96pK+RuP3iQTmm4xm1zdDjcakoON7O+5Z3AD5SclsD3qmXY+WckjcG496mVKMn73Q6YzjKEdNe5Mdp2kk53AACoA7Apg4fPHtVqmt0znk5qSVRbaXJcAK6578t6VFIST7tzx3pSg3JSTO+ThGPKldPcG5yP4cA4PembyOhJBbGD2q7KKUpdzJU1CMow2IH3KpySAXyc04KWbOSVwSc9iOlaQio6IyouMvdk9SHIUgEkfOSPf0FRPkAnnA3Hip1eq3JlGcYrnloO85BkoMEk5IqFP3hCngHIIPrT9i73aCTclaDsy7vJKOW3AgjA781CilckEkjOB7isJxbirPQdOi4tye/YeJSCIyTjcOPapltx8rN1wfwrRODdmjOvharklU27ELShmDLkDkHNIVUuDwcOVz6U3CEdUbwoVVNNvXoPZypVcnnjP1qMgg5Y5ZSAAO/pRSsoWRGIm41Ep7mxaTLEVOCWPy4HbHespZCXO7IO/A9qwdFP3u5q6U1L3XodDJqPmHy1JBUnIHYmseN28yN842tkHuMd6TpKCb6jqy5pRXYvvKzfMDnLDr2qtG5DkHIGeG7CtFzK04v5BiIqTSl95pFiACGIKsCCKijYkgdSSM57ClaTd3uawUuVU4Wszbt72VsZJJ4xjsKrWjIxRWbGcAEelZcjim2XUgkoxt8zoIb+RVXDkDcBx2qKJIl2ruzyCM9T/OplOMrKKO/BznJN326F8XJCDLHJbAqlMCmAM4JxjsfeseRt6aszo1lBuKjoNmk+7tXjOcH1rFuLox5PJxkgnt7V38uiOWdRpcrVmfL3iBlj1y8GTgTsBjsat6rYrf+JLmC5JCyTMAQeh//XXqVYwTi5HkQoVKjcGvd01Ok8Cyl57oKeU2nI7nvXSeGNGttMgUxAiU48wnvjsa+flec3HZI7KVKM2ot6nS3DM8TYzhBgAfyFTSvnIUnae47V14aK5tTeu+VqDd2jyqG/jYKqzAHg9enrVCLTrfbkICMgEAfpXb7JuXNbc+PpVeZb6RNP7bB8h85S2QQM8de9NTT7Y/8s1ChAoHpXoU6SSd0cdKU6nvpky3kSDPm5BIAJ6Cmixt0CbUXOSM+lZtJT95GtGE5Q9pLS/Qd9sgbJMgO4DcCe1SJa2qhYygJwcj1rR1XblsTUhTck+nUi+2wPuAfAUgEemamMUCMfkHGM471N2rXRvSUX7qZX+2QRg/NggjI9Kk2QbPuAv0yf0rWVZuVraHNWUYxSjLW4xdQt/cgsM+xqYqFwFUdck0XbfunROulNRqKyI5NQjBxyyEDcOw9anEaBgMD5lAYVClJ6NG8ZRatJehGmqREhQjZDHPHAp7BBs2IflJ4Pv0rSVFSb79zhw+NkpcjRD/AGmpbAR9oJGCO9X1Cq+UA3gAjHY1M52lFWOj2Sd5zVvIz/7S5QeVIA6kEHqPrWtEsSgbQMnOM9qzlU5ItxRMqDgleV5fkV47xyqlLd8kYGa14wjhWIO4Pke1Q6spO1jvwuAhCC5pb/qVVv5SikWrEgDBPvWogBO3dhVGCB3rnlNxdmXGspQbittPMx3vbtmUraHbnnJ59x/k1rsQxXC4GSDj196nDzkocr6kVpxlFzS1Whkx3N8xQLAAGIOSetbiqMHBIyRg+lU5yclHuZwglBSWqe5lLPqJJUhUycBgemelapUnd6HH41pyya5WLD0+Wy2SG26ak/HmrsLEnINXkl+7gkAdMd646tGTSm3qd+FqQUnzajktr6M7luwoK8KRVreHGG7pnjt7VhKm5RszVSjKpeMbKxV+yXjIrNdvzzkY5FW1ny4BJxuAPt9awipKd0U4xp2vq9BBYSsMm+c4wcE8HjpUpnzwAAVPPvRWptW1N6OIXI5uNtfvGf2SB927kYcHDHv3pyznB253YBPt/wDXpuMr3T0JhVW89jLutMt1ZTvY4yQDnGatXEqtkHO4g4Pet4QjazRxUa0U3yK67mDJa2qrkoSpY5x0q8yBgGIH3iMevrVToptJmcXVjUc09XsYX2G2XjYACOfwrQmjByg53DII7A16FKME1JaHFSrVailG12ijHaW+c+XnAH44qaNnLPvHAOQK3qYOLSlfccakp1LTlotLCCOBWB8sAn17U0qGcg8ggYPpXPCEIxSZ2e0qOVoJMkhEY3nYCr4HPbPpT1QDvxgjB7GoqwjJ2WxjOtUpQvJbvYV44yvAPpgfpUgJUHcSegB9axlhU2pI1jKVRXcbEceMg84z6dcUnBABYk8cmsJpxtGKPSo63tLboOGBySM+gqFyNwyDlRnPrinGCkm2TGMoSim73/AtqwwQ3ViOB2qhJKACxyF4GR1GaxnTcFozbmc5pydunqWBOqsRggBsEGs8MHIfdhcAc0Kk0kmtUcs8Qoy5X3LnmoeCTkklcVVwEK45G8kj0HtVUVHmd9y+Sc9HsWTjOd5xk8H3xULsMHaM/MAcdzTpVG0mgm1Ti1JakgZf3YzjLHg980wEDluPmHIPJ+tE6cedtnRhm5ULSViTeSWxwuASDUR4baM4JBI7CqhFTWqMniHGWpKJMCNeT8wHFRru4wcMHyfah0YxbS6GtOcpe6nbsyTIDCQ5I3gjHbFR7lxt5JOeKzlCyimedKrWlJ1YPb8SYABSwOQ2CAarhhuIDE7SMU4wcnq9CZPmSU1ZjyMbcEnL4Ge2aYpzndwVfjHYe9OcPsdjoo1HH3nu9Bu9w/B+VmAxQBu25GQGYHHYVLvBWZzyxUpyvFaroPGXC9BjOalAUFQeV2kkepqZtyi7I66dGFRxlN2BQAgyeuckU0qCjLklDwSKUIuU1HoTe0XTtoWVA3cEgZwPbPrSROB97J4yCe3tVYiChFJo0hyym23e244NnrnPQ5qJeRhjjBGD6e9XCklYiWKUoe2b07EygMNuT83IJ9qbuGeDj5sAe2eahx1be5hh60XO8o6PQuI7R7FGeQRn0IqBXwyhzkEjI70uZcjlLY6XNc8YrbWxrCQbAS2CTyB25qlkLkAk4yT71ypKXux0Ou7VPmlrYvPJ8yMGwV5BPtVRJOyElsZJ9KqEFa0kZVXKcouLs9i0jBjkFgMcE+/+fWoTKVK55UZ4PrUuKk7XJdWpCUU1p1LYcJu6kliAPSq6uDtHbOR7VbjzWdrI1nTcHdPRvbuWSchQeBkn61GHBC5zgtzmnd1Htaxz0cVCnTs43epK7ZAJHykHj1FOTYBk/eySKyScY3j1N6fLVd3o0Q7sOV/utlfbNOlG0JgkYP5/WuxRk4pIyulN1HHUAcoSxwDnGO3vULup4yRkkD3qXeLTfQzxt5u70Zc3Y24z+Pp3qk0hLEjHHOBTajNXkrHZWnKFPnburE5fJBCg7ux9qpvLggI2Qx4A7VUoNxtbQ86dZRheW72/4JY3AjqSdxwT2qqZAAAScnOPbFTTdlqauMmoyt/TLnmBQUYep4qoJlyAAAQSee/HNKclFpLqXPEaSp2LQYnaC3THSoVk3bQCdrNgD0qOe9n2JjJQfIle/UnztAyoDE8kd6YzY2kONvOfb6Vo6nNH3Tpp8zimlqt/NDCcRsRkAEAY7Gk3hXALYXzQST39qVJNy12RhWnGN4vceJCNoLE9vY1WDIRjJ+V+T6+oqmoympPQuEE3ZaLqXll+Xlfm3gA+n0qmh2hupORgHuO1KtUip36mMvacvK4+6XiSMAnGFyc9T61AZMoq7juPQ+tUuZu0UbTryjSUlp0J+ch89Bgf/XqpvOVUMQQ3IpSilG+wsNh4yjdPXUviTPboeo7VUEmOpJJxgen1qYSad0jGDVVpW2LAOdwLZLNwR2qsjklQBznn2FXKVno9hQoWbcno+hOSqj7xOQMD0qmXIIGcdCT/AIVjKi5O6eh2x96FqehLI0jENk5XI/OqrSNuGSSCAcDvXRyJLmk9DGNRt8qWpYYnKjJA3Ak+tVScsWHBAAwf0p+x5oNLQydd02ra3JWO0nyzgFhn+tQO7EY3cggg9ql2i1fdGytZSW3YkLqxOCSwfHHeqvnbHA5HOAfWqUU9biatXcluy0pw2dhAJGT61B525VJbjdkY96zdN6OTEoO1nsrkpkTPykkA5J9KhQqh3ZJ5I+lOdpRTRSdSTamtSXcSwzkg9Se9QORuyp6ChQlBXTK9pFzvNdC4XBYDGOnSqkTnjrg8AenrVwUYq3VluCjLmT8y4A2CRyA5yfQVGrkA9SOAT60TjafKtzz/AG8FLmkSrIqqMgjknNR7wxBbIAIIqKqVk5aG9SvUjKMIDjIwcqmTuIwPQ4qEkAMwzkEEe1ays7QZbpzi1O9rl3cFKg5+8ce9UEnwo3MTt5HtSjCS92xzylFNSmy75pLYJ9SSKomXcxYsc7+c1XK2uW+xg60VK0ouzLLS5I5+4MkHtVcsdyksCvJOe9OKi43ijajBtRjJ26Emdztg/KcMB3poO1Qe4xU3c42judVNShJRWseo6aPeFG4EnA+maYsmOCctwAT69hU4eLi7ozq8sk1ayRQMPzkq2Tx/9erRbaAoUlmHJ9PY11O7dlujOrKmoqT7GaQ25uvUEA9vWrsihm7g5Oc96KdRct4I5qvOpqCluUjuC4VcvzgVZxtXB6jA+pHeounPma1ZriMNKlT5ou9iHaQAxI4wBntTl3ALvOMEEk96uU23ZHPRlCd5VFfsx6HeMj7obGPpUp+UfLjJbAraNJXUooHWTi1FiK21mHJycEjvTxAcmUtxwCPTFauhFtczOSV4Tbgrq34j4WxKrNwVcAH09CKTjhQpywAPvUui7WZ2YCUpS55I0+MEZIHXIrPSRs5GWUtjn+EetVClJO71O5Y2nKLbVmaEVyRGckfMcY9eKyVkBVuMAEEA9sVWNwcbpy2OHBY2Si5QXW5pzzEhArkcZye9Uj8ygvnrxim6MEvdK9pOs1zdBEnIZCzZLkcHqaYiNhmJyfm2n0zVuCTbktzClFyklGWiNSKTeyKSQGyCR2qkpb5ckg5HSuWom/eiehTq8slFs2ULFB0D7jnNQb9qqwJI7iuCdWMm2logvBNON7osoyjG8kDIBPpVfzCADxtjIBJ/SnT0u0jtws4zapzfW5YJOFIAOMYPoareYfljXPJY/TmsqSfwo0xlZyi0++xO0nyqOC+/Az0OKqh9wQg5BJ/HPSt6dBSbTfocznOMXJ7diwxAwwPB5qEkFVx0zk/WojzN2vubOTcotlpUD4GSDgkY7UyOUMQx4VdoyKJObVpmNKbnVcFpruNMQO5+dvBGO47mnbt3PAxgAjvVww7gkrjnZu711IfJ5UnI2tnHrUnmAkd8sAKw5p8ruaTqQ0klZJiF88BcMeOO1IZFYNjgEg57k96HaLTepFL97dx3ZZ3YVBgklRkjtiq6SbhtyeG2k+lbRTl7vct1XFt2uxGQEZLHBfj3qzGuVQdSvANTWtF6LRG9KnKUlZ6sjeNQvBIJwBjvVvhhk5K5GAO//wCqlCUW7NEYn2iu3utihsyEPO4cc96mb5pEPBxkHP6VNPms7HPHEqolGT1s2RLhVK5IJBA9s96E25BHILZIPbHarnTcrN62M4znTiuR+6yxG3CjgEjB9OafCFZQcFsEk4HI+lcrqrmtFHoYeUlZMt8KPTdn8KXysqTyAGII/wAK2otzi3I2rxba9ktiynyBec9DnuKgMbLnJIyCBjtWVROLVzOniVNcslqi9FOxMbAkEscEVUjfauC5yM04U022tjF4hxTg0aou2faJG5LED2rJMqNtbJOQefUVlCmlUunoXTcprllr2LF0VIJX7ygnA7VUmuFEZxyegz/WumjBxlaRhVpJ3Sl72mp4Xduo8XZbJUzFtv1o1H5PF8ZB+dpg5Hpjp+FduNSilbcyhNSTptadz0u2Zkh5zk4OR9aWN1WIluPlP5Vwt3krvcmhVVSi1DeOhZR2Dl2IKoQSD0IqIurKyt9xgcj1rolFys1pobKuozU1rY8+gk2/KmBkj8D61EpAbPIOQSK9CUuaV2tj5Og5xjyrRv5mkHDLnIJwOtV8Z3dRlRj2Nb0qad2mS4ShFKff+mWBuDH5uuePSmx4xgEjAySe9azV0lJHHSU6fM4NuzJlIVuMngg471AuQM7gORwO1T7JRlZvQ6KUoOHO9mTZDbSwz3GO1MiYDcc55wD7itpTirJ/8MTUwcXDmUr2f4CcHJJJbIxntmk6KVAIyME/hSlUslFE1MM5JTer6C7gwySQOQM1Gd3zHglRgisFSvZrYupOSm1LUn3MQASeMEE1DHzGGbI+UkE9veuinLkupIv6rJxSk9CbcMqxz24FIxwPmPzZBJFYxjK/LFm2JpcvLNNXX4oeMqm7OVBySe1IzAbUz9/AxVtyeknocc6yTSlrcsI+wHcc4GKjycMFI3dOe9TUptySN6FaLjzLXoX4mXaqd3yAfeq6Nyo3fxAkj1HSorJOXM9zRqcYqnDVNmhHnOM9ScE9qrwluASeOlZYuLbVjTCVkqqpyWpfzvAfJCKcnHeoQ7DaRkjHOK4oQnCN4o9Gq9ot31LSyABYyx+XK59fSqqtsY5yCeARW0qTi076nO685tpqyLfmAbVPJ3ZJ7fSq6FRtZW435IHeicuaXMYyq1WlFaRRoxliQMYxJg+1QmX5lxz8oyT7GsacpJXZ6kKFOnH3dnqXg+Sc8qBg571WJ4QBju3ZAFYVKbejZUXyPmi9SwjYBJycAEg1WDb9rBiAazqwcrWexvh4wjJRe7/C5YyGIZiQSwAx2qsHwVVc5yCAe1KF4ycpao5moQbTeu3qWXbYygOQeTgdDVWRsqNxyd/INZ05NvmSsdeHanJQmrp7vtYGmDNHuJDEk+3vVRjuLKD0YkHuK6adRKNnsZ1q1puajpsTlwwU4wNxwD9arhtqggDO/P0x0rbmdRctzipVpQla3Ue5JODkhVyCPekU5BA+8xGPc0XhGST6F1ITm7Q3bIJA5Ugt8wzk+lSEOdoxgFiDjv70VJKCuzndJQcYxerepAq7WbngsBgd6ldCCq5GG7jpzWdOLnK7fQ7J1PZv3ldfkV1+X5CxAckA1K2MKCuGUsDjtWiStaO5z4Wd05y1Ww0ysqpvGcgDjtTZGXKgZ3MRg/WueF+W6RpPEOaajo9hm5doOSCvc9xUP8TMM7eRg/rW9OSdmupzyiqT5Xvpr6jjLkuedhORjv6VEHUbnyDH/Fn071FVRjG6R0UKMpzcOnX9BjEv90kbk4B7UpIPKMM5Oc/yrSKbSaQKChKXM7rTQkVNxAJz82TjtTYyRli2CEJPtThzRbhHYzjKNVqTjZpkyMRhskY4IHbP/wBakwqrgHnJIP1PFKNJSdrm+NlNPma27DZHAxjqpOcd6hLH5NoI5OCO3vRSoWbsefilNQU1pclRg7D+9tzg9/rTI924tzwMA+lZTptJO9jswsW2oz1l3LBfLDkjCAkjtmnhTkLwTgcnvWLUVFJb3O5zlGbjJbIiyoIjPOSCD6GhmwYwBkqScjtg1pJOUeZdznlWTiqbV/MZn5eACys3J/SmpyDubAOOlQ0212O2lCLptQ0ZKhOFPPI/OmNwqNuz8xx9KG7NuJl7rpqUn12HE4BIOc8c0jHPXHIwaOaU5Jx2OWolP3E7CiRkGwk5BI+nrUPAy+SeMH2pys3zS37DeDVNJxdloShstjecZBIFRkAjaXJ54PrkD6Vm5Rk7oKMeWck+o9JSgIbO5Wzn2pgDbdu4kgggntVqKk+RG1CF4urUettEXM5UHJIJBA9PemRNx6Pgg+1Dg1Kxy4nDySXJ16lgsPlYsTt5BqAEFgOox371lFOLSR1U6cJQXPuSKUwuTgk5H9KXliQRjGcA0Ruk2zNYdN2j0JOexAbHJHrVckAuBnJx+OO1TFu1rbm7jGyS2RoK27G1yQ3OD3qjG5Yx/MQDIASew9QP/r10KEpR9AUoqlZOzNBJFQnk5Zjk+wqqG3KylgTxj2rJ6JQ7mVNxcfaN6/mWlIkY7s8ZPPao0ITk5OMDHr61hKLlJRg9S6Kbi6sloi5jO4bTtIPP1quJj3bC5wfp7U/ZOVpPoc+FvJNW66Fgv8gGc7W5qASI6jGe2T71nCKUuaO56sJc0EvUv+YeG5OMc/0rLkuCDgE5LHPvW1CLUk3qjkaivfbtLY0TKDkknBPftWV5hDdSDuB+tUqreyLcYu2vqXWfJRcksXzj0qqjkFSeRnI9qhRbbaIrY1OSqoucggYwGYgZqHzPmQ852tz9aU5NLUijUlzpW1exMIlAwWypJJA71CXcqFBGDu5H8XTit/aSm0m9DplGEFyJXlfX5hIdpZxnaEOQe1QlgCGLHk4xUypJq8NUY4rGuK95bDzJuCj+LeMk9qgYAscHALCimktbnNTm/Zuajr2LocA4565BPeqRYZAEhwMj9KrnT1kFWpGEUujLgkBIPcAj/wDVVBJApA4+o7CqdWL0SsjfDNuMVe9vwLu9mYYf3JPoKpCZdjYH3QSD6VlJNRUIrcypzU5yjJ6lt5hGoLAkFgc+3vVESsx3ZOOAAaJNt8suhVOpFNciuzRjlBKncRnGQf4vQVSST1JwoBGe9aU27KTRs6zhFQa8zU8wJwPvMowT/Ss5pAD1LNkZz2q1FtanPVlFNx6MuebjO45zwSO1U92MDJIBA+tVKcZO8kTOi4RilKxeEysN+CQWxiqSSnnnC7hnPeuRJwqabG85SjDmW6/Etedg5GcNwSKrhwBjIAIBIHatk49ehrGMo+892PMvMY77jn3qsxDhssQeM47VErxklHqYVKcaqVRuyX4kyy/NuLHh8Y9ag34yCCVGRz29qVa17M6cNUUU2tkWRKCSGyHGDnsc1QeTJUKT1Aye/PNdPKnCyPObTnzLZlsOoxuAzvAOD37Zqk7lQCGO0nJA71zzpKMbN7nRCUo1LPVIsOSGYFsjAAHpVJpG+Xg7iSAB2rejCTfJFaBN2vNMvBym3POADg1XZ8qq5AYk8+uPSphpdM7ZS5oxlF6osSMB16HGBWc7FT1JxtBJ7c1cFJK6ZUuWVPlSs2Ww7YHzZIwFz3HfNUzKpIUHAVhis5wd+YzotuKpPfU0UYv8+SFGRj1/lUCyhRGC3Xp71tCTb93Y5MPTjBuUtzSaVfl6dM49KzN4x9SCPYURw6lJu+rOeLXPdLRdC3uK5ZnyGXgD2qnI5ysgbADAke/tTjFyTTex1QnBLnZa807iAQBgHk9apb9gOTnC9T2AqEue0jXHT5Y33RcVwSQWICZIB7+9RqThRnOMD605xsr8xyUkqk7xXQmTkdfugde9RFgCAuCDwSf4feiSTny21KrVvZU01v8AiWC4Ck43YJAB7YFU8uBgsSdwIPpzxTdCKlZvU3p1HOk6iRakkGFZWIywGD3x1qovIQg564Hr61cHFaPYfM/Zxknqyw7EbWPGOST2quJDwpzhjg+wpyly6yM8VFOKUNGWEO7GWOWJFR7mRlIORuwMdR71om3G6ehxwgpyty/Mnb5SMN1kxz2pu8cgjsfxq4ySjZM6cVBOKhBWa6isB8xBDHIxz0xRCF3AdCwBx6c9amLild7HJKE401Svdb3BQCSMd8c9q1LK1FzLHuYBSxzjt9aTdOElJBShKVLknG67lSGBmZAFJ3MeMV69pWj2YiVWTLLgqT24rBZipO7Vjso5PFbM8x+wTSFFCliSDx2r1+aztIChSMcE5GPyxWUMcnrbUupl0oRXJ6/ceRSabPEFXB+8evpXo11bPIxcA4AIAHfIq6ePV/eVxYqgpzs1ZtHl32WXO1BllJBBHJr0C008h97oCFY5OK6a+aRgk0tyI4JNuD6WOGj0S8Rg7oSpBODXoU8kigoyj5cAg9gO9CzGUoqNtEYUMFGMZSluecPF5atkEFR+ddYtpFd+YCuAoOM96mrWgpK5MVFNz5dTiGchcjjowz+tXtQsJLWUptypzz6V3QcaiSTIlenCUpLTqZqOUJySSR19MVWZ2DbcnDEkg9q71QcUpN3R5zg6jXLouhppIo2LzgkA4qjagblO4ZySCe9eZWw8Lvud+Fxk7cslo9PM10bjG07CQcjvS27+ZgA5TGQR/KuTlT1eh1uc3OMY7IUHJwzAFVAx/LFSNAruArEMoBX0PtURinJOL2OqnzRiop3bIpGA2HqpbBHpTJWKnPAYH5lqFBNcyYq1KXNyS08xPNxGBu5YkE1XGfM6naWyB6Vo6fJecjllSaap/iXVkcYAyRnqe1VgxDKCcR/zNcqTk9EdLkk4wfQttJsHJwOTj0qmcMEDNkNkkmtVGSWrN54d3slo9h28qwOTwecd6hLEMQCT8gOR39qcE5JKS1bOeinTbd72/Qf5jbyCTjJII7Coj8zfeI2cH2zWt4uPKbQu4pRVmzRhkLDOcg881WjkA4JJA4PtSlNy91CgoytJmuCFwQxII4rNEzqFGTwQfyrlp0ZyvGbNq1Vxb9m7rQ1GkBO5SQQCM1mmU7CGbIAzn0+taTptO0WY/W1ODTWuhPM277uchuvpVIylWUEg5PHvQ721ZpT5LpNWsWkyQCTncwJPoBTouqgglgSc55x/hVUZNR5TKvQpzXPF6X2L0GMrychhye9OjIHzEkhjk+2K5pVIq0HqdNnCftIrRmpDKRySQcg/Q1EHXA9Dkcd6cVzJW6D+sNK1txlw27PJ4HX0qGZyM9sDJP0705QkndEKk3eklb9SuT85w3Y1AW6N05zgU6FSSi09zohRkk409X3HAkFepwpz780xmG0KnBU7iPWr5oybtuTy1YRinpfQYzuMDAKqSTn+lQ7w2OSApwT6/StHJPfQVWm4z80eVa26Q+JVkJOftCZI7A9AKi8RR79cijDlfMcBSexrSvTjKF2zmnjJKDhOOl9z0qB0aMO5O4g4x05PArnrW7u7F44b3BiKgiUdPxrjhNwehVKjDkUmzplAGQxPUMfpVFdSs2Bk81QFxjJH5V01K3MkkhRoRhGSi9zikkPBJ4Pp3qK3YH73G0gZ9j1r0pylC0GfKQxEXL2lNepoxuQSXzuPAPt2qOF8op3HBJBxXXGEVG6Wp5kcRKWIUn1v6F0HjPbnOPSqomGQC3IHB9aU7wV3udVWq6jTtqSsylVYA4zjmq7MqIMjIB6DtThBSu1sTXUXKMZ6NWDdtbcSQinAA/XNMLEOMHhhk/hVqouVt6idGnJOUNy0JF28E7mOMmq2QCAeC2Onfms1yttI7I1eeClJWZMGYEHAIcgn2quxxtCkgHjjtQlzRbsRGPJUUk9d36FyOTHPUc9aqZ3E4BHUEetdKSlG8loT7dJNpXfYvth1PynG3r6VCkg2MFJB5BNcK92SitivaRqxlUS961iYA7V5Bx0I60gkBGDyOtb6tpI45YVLSb1Jt7BfvZJDDPpxUfmJtAI5ckAGlCCU0rbHViuaEIygWYySu0Md2CCT61X3kAE53gjGKdWk5S5UyaWNcYWcdPxLqM5C4OPmxn1qOHccsTgbsgA9KKsUo3juOOJlUjdKzWlvItZdQAWIIYnA71E0uAeepHNTFSjKzQqUYufO38i+HUbSAcCqUc67QrMT6n6+tef7Lkldnpqr7VOKVv1LShgeM45J/wAahedVw3IYMDWtKb2S0PPqRs4qLsi/5g46k7gD74rOSUMRtJJyM+9c6pSSakevKsqsVCNrI2E3P1I3ZHI7etUoJig5BXY3Ud6xjSlB2j1HUcE0m9kXnbCHapyMDA6j1xUUL7UJPJyTmpqRcGm9WYUm5JJuzJVyQPcZwe1PLrgO2SQxIA/QVk5OS5WrM9JwjOcZJ3QBcAHnLAnPpUq/dTLHJIOPWoguaVrEVKijaLdkykEJIcn5uRkVclACEjrxwfr1q3VSbp9DP6soxjUk9imBhOOSScYpv33XaxwCcj1pNJ1Gl2LhCXMop33dxU5C4yQSR9DSq20EBsbmIJx1z1qJ62cSqGFTTlJ67AcDLDI39QfambS5HzEKWAP0raV5e83oTRfs02ld/wBbBhshkI2gkEHvSO21SY8g5yB6VMmmko7mUZc65mrN7/IjkOQARwO4qrI4GxQTuJINaQgpKy3LcvZpJ69R5yQrl8Nzkdh71R3k4c5A4BPrirhSak03v0OOnXhCSutFrclbGVbcSpI6fzqPd8pGSc4x7VEbRfdHVWjOq7p6DXHUoTg8rmnZXcVIBPBIH0roTUouUtuhjWpWtBP3nuRhMMSDgHAwalPIwD/y0JJrOnNpct7sHQqTcqsXptYcMFc9ME5A704ADYTxzggdzWsZ+9drU05pxp2tbYQ/e24IJXk+tWWjKuoGTuXH1pUoOUbmM9J80/kU9jEgEHaAQCO1XsjKqByzYx6+lTTr3k1JBUheF4yuk/zKq4VcdN7bT7VYIXqvJCjAqKkodNzonRcuW70K6sTxkAFSSP5U3dsGSSdzjAHWhRVrJ6sFKpFcyeiD+7knO7GPXNRlj8qjHzOc1jKmm9XoOrjJunypa/mPV175yWHTt7VBnng4AJGPU1copJJPRGtG7gruyf8AVids7hyT7DtTTj5ScgqefelTlKzS3OOnTjKbUl8uwOMep3EAfhTWY4U5/jOalxjay3OyhTjz8/T8gJKkc8nIwO1RAv8AKxbnjIHelTWjaOGcYRaV736kinP8WGwBk9/SnInQHlskjPf0rWpbk5nudXtnF2lt+QqMw4JJPAOffvTxyFAz8xOajkbbSNpqmo+03b0t+pMCdwdT8oJAHoe9RCTIwDja3PvXLGM0+V7DlCM2pp2HiQcfNjnOBVYMAC3PLEDHeulcsnFvcitOSdnsi2SDIME5x0qorAFd3GwAtk9jUV07cy7kU60lVUX1RZJYjIJyWAJ9Kqu2NqZPJIGK0XIneLH7tm3uW492VDnA3A59Oe1MiZRuDEkkDA9KmtNpq+zOaVLnTlDQttwS27JJH41Td93AyAACT61nGnK+mx1VlF0+V7otNLuTLZBySfbHSq43bVJODuJA96KSjFqxFbDzUeZ7Mtq4+VR1LZB9aplmB69cDiipCUlzJmuCrprlt3LpkO4FSRk4Ge3uapqzA7mz8w49qp0oxV1uXgqkpSemj6ehd+9hs8rkkHvVNpCFjxz83JPpQ04ycUbKrKpTUovd/cT7sDkE57+lVRNn7p4A/rUKjpeOxjjsQ3BW+4tb0XByQDyR61WeT+HHTH4VcaUZyvc5sVVjCOqv/maCuxAZc8djWf5uOVyB0xUTpwj7o4VYxpqU1qi484QjcTuycYqj54cDJIJOB70Kk4RUZM3WI9o4zjsPabO08nuPbNV95Kn5u+ciqp00nc3xabSUWrmjuK7XJOBjPtWespbrkqzAkHvik3NSUbHEpJSuuujZOHO5MD5Q3Q9TVUMVJIxyCBntW03LmuluZ0qMaUXd3Vy3vyQRgY4yaqbg2AMgZ4J7dKhR5loatxSUkvmWQ6lvlJAOSR6VUeRQAvG45APrWcqCTtc0nVXNdvX8y0h2jHPAOB6VWL8KoOMggk1q/eWpdO1OOu8vwLSS4GHOeOPfNVvMLD5uCH4I71rKqk7MihzSi5PdMu+Zhj6LiqyNhQOQwA49QRwazq/yoyrc/MpSe5cWUMdwOdqcZ/rUIcEAAkcANjvWCglou501qsnZpaJFhWIIOPl4OD3pFCkHIPLZIPeumcVGKluzlqwlWacXoug5ZEJkODk569xVaTC4xnjIJ9amnByV47CeMcE4VFqTCQbXJBGcVCJFUFW5zjA9aizk00dFLEuVNxnurfgPdjg7j1yTj0qsXOehBUdT71uqLb5UtiqWJhG873W/3Ey/Ng8jBJA9aj38Kg528kCnZp8z2JddNJvRvUV88BieJMgZ64qF5PMABJySRxXLClJy5nswhXtF03u9mS7yCDz8wJOe1Rb8qjBuFYHit1KysKVOLp+9LoTNkYKEBt/Ge9ICMdSSp5x2qORSm4sdLEOEUkiNiS3ruPelckbW5yT+VbUKL5U7dTONWam4vVkY+ZsgAYzyexp0cXC5JyG796iUVzWiPDxq05tVVfVWJtu3y89s8n3pH4K5PVwBiolvbqEpQU3KT02BnOGXktsOM9jR5YJ3A5YGtFFRs09TV1Ul7SK+/wDMEJkReflyQfwNC4zuzjcTwe9Yz+JOOhrGCnJqWz/ABycg5HIPtQ4ITGRySBn+tRGm3otjOpTcXypioW4BI+UjJPepCSUDLkkZPPcitaNTmjZKzMpw1unZRHKQ2ME9CW96ijXG1eTtIwSe9VVhK/OmXgZuUk6iurE27eNu4jBIye1ChTgEdFGPb2rOEuW3MaYanUrRaWmpGuGG7oMkAVPn26cCrSbk1bYOT2UnZdCuCVz3HJJ9BU+xjtCn/lpjB71tH3m01qcXLCUlKUtOwwOeDg43EYNXls3KAryoJXPpUTcZO6O2POkpp+6vxKasOqk8PgVaNhKoQYIGckVMYppWZzUajjFztrd/IjXO6MDOVwc+ta1tAvyOQQA2D+FZ3k3yzfU2lOc2vZxsmrfebGjxASIcYwSSBW9pscRQsrAEcms61VTSsaQw6UXBa8u53FpIot4SF2kAE47mqemXCzSBeVIPAPevJxL5JJWPZy+dPEUrNcqRuNumYSFchsZz2J61sQyxKgBUHDAgGsfaNTcUdEYqMU29OhlrapIrrj5lJB96sSyK27YxHIIJ6n2NdWikm3ucdWUlFya0Zz0/+jnggEt1qle3qRyyb8YGOD2+lbU4pLm3OWaTX7zr+BDPGZ/lG3BGCT1HvWFJrG5skHIwcirqKTScSqdoxlHexYMIiXAJwcgkVKblZYg4xndg5rZ1ea11qcNPDzlFyS1Ma42v5jMAMAKc9iPSkknBYjccDI+lVBuM0zqco1IXcbOO5xt3YlDlAMIp+Y9B7V0MrRsrDBIIwQa9ajim4ts8bE4GMmpSdmjj1TbIACNq5JI71dntzGQw4BYkV2KcZwskeRToOM1N7XLEEwTowAyBz6elZyOchuh34yOwFZfV3P3T05NwfO9jd81cBQQWJGPes1ZTtVsEZOCR/WuWdD3k9jWhmEeRzgTTAsucjIwCfQdqFkwuM/LuOR/SuarOS1OmjaSSSs3YhDDAHJGCKhaVSW6gbsD2q1GSVrnViOSoot6scMEkBsgNnn0qFiAAcnJ4yeue9dPsZL3U9TnnKELSto3ZExOE6EtwQPSm7iXQLgOy5JPSsKlVtqTQq0HTSgpXSGs2Buc4OccGlAViGAA2uST6GqleUrLRGXO2kkrt7inO8AZ/iBB7GoxlWOTg7sKfT1rmlKUWlvc7vZQkubm8rErSbWIGeuCB2qBSHJDckyA/Xmuip0i1uctOU4yd/l8iyhJyDkJt7d6h5wAzEgk5BqqiXLoYKlOT53pqWlPDFjwq4IPQVVMjlcHJyoyR3rO02kkdk/Zxlyw3RMWyVz/Djp3qKOUODjOQxx7VpGkno+pFS7TikakLqFJAxwM4+lVoXO0/KQMgc96wjh1Ti0tSqOKi4WijTSUkDPQ5J9qzTcZBXaCCSOO1Zezk1zRWhtTrRlpb1NYXihkjbjGCQeh+lZJkHAxn5+DWtGCjDszOrWm6kUtka0k7OhAJBCg5NZImVcB2yQOp7VEYuKv0OurUlKp7OLt1LrXOFPcgAgntWe7MQ7K+0gHnPTHerjT93mTJoSqSk5PW+liw0q7cDI24yPxrFu7nyLZ5sYKAHB68Vo2k+VdTOV4pRta/4Gm8qop3HJLkgeleEah4u1O5nlRJCiDO3HespYZxVmRWxUklH7K1N/xHdQxavDcK2RFsZgOwrglluLnZ5jsXkfALetdNWcWuRdiqc+aHNLbo+53N547kEQjtrYc7gS4zj86xovDRaESzTBvlU4UH5a54VIp3SMHh0oOafqYMl/PO5YyHIwRg9KkbTm8940fHzdPX0rPl5k7aBCcrpQuztI7qIHYed0hJz2rwkePIhw0+MggDPWvrZ4JqK5dT4Si3OnzR2Teh78LuNCACdquR9TXz7/wnsWzabgZAwMnpiumGBmtWYU5q0pv4VuvU+hRex8gvhiBgmvnM/ENN3+vBCjGTWUsHNpN6G0MWo/Aj6I+3xg/eB3EEAnrXzn/wsJSeZwW3DJPcVdLA3XMuhSmnJVLb7n0c1+g+YOflwK+b2+IMYYgXJOVzwehqYYKad+jKp4mc5ulCN33Pol9SjPLOMnAJHf6V82v8QUPW4JBJAOa2hhHbm6GXJOMnTjvtc+j/AO1YAvMowuBjvXzI/wAQkztWYYZuTUf2Y6jvLY6Fj1TioXTaf3n00NUhwcOPl5HtXzA/xDUME+0HOASRRHAzT5oo2pYmKi4W1/I+p01WM7fnHY8fyr5fX4hgEETkqeTz0pSwCSuisJXm5Wt7up9RLqsIVlaXkk4J7V8ut8QUbLi4PU7ee9Cy9ys29SI41qbpyWj2Pp86xDg7HB+YAH1Hevlf/hY6soQTAZ6Y/rWzy+SklFCVKShKdX4bWPqb+3IVBDSjqCK+UB8Q8oR52Q+ADnoRVLKknZvY5qVWpGGmqZ9ZHxBCisBKAducDvXyI3xFVvl+0+gUntS/sxpqXU1hjOaPKl6n1s/iK3OR5pAwOhr5B/4WKdrD7QehOT2IraGBvGyZhUpuMrzuvL16n1z/AMJNCAFWYD5yfr6V8dJ8QSxjzc5+cZGe3esa+VaJtanqYO8qMnHofZI8RwyBSJju3YI9K+TtP8dPJNgTEh3ByO2axeA5I86enY54xVZqktGnqz7MsdVjd8q4yuCMnrXjPhnXvtPljzNzsw4z0ry8RSSfI3qe7zxo041Fq72/r1PoqGcOqEOcsD+NYWl3JdEwcqCB/wDXrz3GUZJop+zqNSd1c6oPt24xt3EVDGxODuJAPX09q5JQjF3SNK8U4qMncts3KHIxkdKrFmwBwAcHjtUYelZXTHQlTm7qJdWQcsXJwCAB2rPEuG2jJLsAKHQmrS6DdeDk4S6GwjBwR0ycE/yqmjg/XOc+tYzScve3NJ16ai423LTRgKdnJzwDULzEYUc470oWm1YuNOKjyvYbGo3AOxOGBIHUeopkbjzWcsMhQAB/OrjFRXMYU5JKzd0iZiqgbieoIPpSZGF5Gc9B29Ca2hDSyHiq1oxkn8yu7DJbOTwc98imTNsYbiQMcn1pxu1oiPZpz5pPQryts2gZJbPPpUbbWLHk89fXHQVKilZ3vchzcpWUbJERGQrEcE4471JnaeWJA6Ed62U0rNno1nBQb8tUQbcbH3Atggg0hdenGBk5rJJxd3sebVq05QstwPGRjIYbc+tVTIeApPCnr39qbqpvXYydeS5Zpb6FtJM8dt3T1rPV2JjxkFXA47VpK0dYrU0xOFnJxS2NhnUbQpwcnIrNZgVZSTzkc96zpTSXMwq13XSppcq/qxsW0khYA8qCPw5qKA7G37vlIBOemK0qyfs7o1VF+09nN3a/UdKvlspDZJycetLcOrNuDAkHv29qzoTXJ7yOOGHi5OUXonqRgEYz/ESBjsO9MUbG3b8qRwD29qc0optHfGvCCjFaO46UncuRgdcjtUJZmJTd15IFTTjZptajlNTnemxCM4AJG5gKcu7OADnOBirvGLu9yYxUHdvV/gMzgjcTuUZ+lTbdxBIG8ZAP1pwrcy03IrVJVP3ctexCxJIG4gbAQO3vQUBOMkkcAe1Xh4WVmWnUirxfqJgAD5wBuHJNRZ+YrnI4Ab1rN07SSb0YpThJODX/AARRtDEjPZiB2+tLHkBSzfNwCB/F7GsJJQS5TmwtGpTjZ7N/cWQeI8ff3YAHXmo8/NnnjHI7VMeZRcnt2PSqQhTnFx6jxKq8jAAOT9KMcsh5LD8quFONlYxVSU4vl0Y8sMDgAnGQKrc8Nz8pII9KSw6UuS5hRlCceaktepJGFCnOTzx71G2VU5OTkA47VdWE+a0TpeIi6TUo7b/MUr8xbGQzgce1IVKqOCSpyPetOVRSSMKsVy2lG+xGMsV2nhM5B9T6U8Ej1HB6/wBKyVKUFaJuqFKnaU2IrYZRvJH86QZ75JVzx6ZpzhdJXMHRSmpJ+7J6kqsBg5yeeT2+tMySWH8OG61lNNWsaypN3jf09CZByMknLbsH+VMZmBTDYO7OfSpVSctGjqjRjGChFjlYKw/iVmAOe9RSO3yhRhjuXd/dPbFXU5VCyObC4Rqs0no9y2c4ABJDEDHp6mqnmfMgJODhfpk1pTk3G7R0zUISi4PRJ/f1HmQqGJyPShnwoBHG8Y96xWstEcyThTUk9WJvwgB5fpx3qBnDdcjIOD6GtvZa819SVXXJGMoq1yT5t8YViTuA4/So8hCByTgHmnOopWSZtHlUuRbsk3Dbtzgs4G49qgZvmAznkk47Vz+7bmW4VcN/y7UtyaMk7QSSSTnNMDDKtvznGB3p16lkm0bUsPTptOer8vIkcjp905OMd6hYEkHJB5wD61cKUnFSuZYyk1KyWm+hZ3ZGG+8R8voKreY3ykKeTgH0pVKN723Mf7QlSShayfUnLDeQQfmxgUwbXKkgFeDk/wAxRRbUFfcupdyaktGOLhSoOTg9fWmBl4YnA6j3qlaPvNanNgqK5+Vy91gABzgEc/XOKY78M5yAzcGizlpH1PRpwhFtT1SdkIrcqzY+927VGfnPLYLIyjHbjrVSScUupyuo4pSe99C2uHUEe+SetV+SfLDEfOM+/rVVOWcWnsEKyhNcq97e3oWi2QQeSMAY/pTSSTnghamhJRSktx1Jyk/e/wCGJ0O0dMse5qMH3wTyPzpVqT0b1Q8PiPd5E9HcmEmFHJyGH41GQGGzcSGyMilCg1Kz2Mqk05WJGkU7SyEE5P1qE8BSSSwPy+2KG1GdkdNuaDaWqHBiAhbqSOnaoGckoDkZGcDsa1c5Tu2jmjh1GKhHWTLOc98cHj1qoTjHJ+Zj0qdXA0hVhRmopbEe9lK7c7jwSf0pm4cAsSWJIrWTV1oZ1U27yevQcHUl2LMTwMHoMelN5I6Ed8VneLbknZdjFUJxjaD1HqV7g9OBmmIQpCHOeSDRJxkk2ialSUafspbl9XOMjjAIx6VW3KARuPPPFZ1km7W0PRgpyp3T6FuMgFWbJcZx7Cq4YKVPJ3HhqaTlFqJhFQdJRWrLqum5SoOAeAe3PWqocBiWJ+8AB6VTpLkUm9TVzl7TTR/5Fi4yQVRyG5ww7e9V95L56jd0Per5m1eJca0HJ0597+pZTIAJJPbnvTEZWwv8XrUV48zUu4UlK7k1eKLG1SC2CCD0/lUZLYC9ckZx39arm5lY54Y2MZ+0S1vaxOE3Fd8mCBxToyGb3JIx7e9ZyhaV0zRuLbutGKIgVBDH5nyfrV5EDKjMPuvgYpOsouyex2UMHGVNNlFVIBH8W8Ej1962rSKLLBnIEjEZ9M9qqasrJ6HFGs5WUVvcyREwTnrnJ966/wDs5XMaxqSd2B7e9cd4pqTex6fJKDi5rc5uOzd2DL0YLgeld9baaIQ6sQGBLAf40SxqT5U9zL2VSS57aL8Tk4tPJVXPOcDPpXUiPYdmQAuAPf6VanK7k3oYunBRi1GzM6K1URhQpOM8nuK1uCNqHA+6T9axc3ZW27nVON5Lm6lTyFlUBMB1GT7VImVBdWJYYxn0zTTUoqKepEpJYiy2t9xQex2YLthQwyT296nnnd+HU4IIz6VtGcpJKW5tJQjJyWq7GtaaTvjDxyFVJG7H8XrVa31FoIhGST8gHNc755SS3JbUW5W1Oj0xfsx3ysCY2GcfoK5SXVHRlG84JIIrKrhW7O5pRxkYJuSu2/uPRhqEW5RuyG3YI7YFebDUWO0gnBIOT3qaVC7cVsKNZVIOKVrs9EmulIJQ9UAwK4saoQuw53cZz2z0ohQ53zPYunKNFOk0UtWvRv2lyT0Pt9axtRmjkZnAJG8ke/tXpKCa9mvU8uhinS1Wuo5W3N5pIwCBj0qjC6qMEHDMcGprWaS6mijOcp0ovlRuQzFUYbyc7SPcHrWYJOCFz8i4HvWns4ppSRjzVaaSb1XYnkk3ZZTzkgk1QlJCAZxnn8ayVGL91M7OV1KblUWu78yZJdgZjkKeBmsmWdhtwxIYAg+ld/1aUrcux5NTGU4NSa959DQndPLdSMlWAHtWMXldRmT5t7bh2xgYrqw2HlGKbehzTxPtFKKWxG7LwFJGWJI9cdfzpF2rt65JBP09K6ZJxbd9DkxM04xTWo8NIuxTkIwOQKcWA3A5LZGB6e1Q6iaTtuehhqcElG9mugqyEgvuJ2rnA749aiBAQxo2CrdR39aweEV7xJ+tuLcuo3K4fdkAqT9KfyFALdQMZ962lQ5lZmdOyn7Te/4McQDtPTnIqIkqQuSMZA9+a44QcL1LnfLEuSUZrRdSUllAJPzZByO9RI/fcTyB/jRGCdN36mcnGpOKTsShwD1OV4K+tIxBKlRnJwTUU7XUlsdTXJDlbHkhtgDYCkDnvVcjIwDjJAOaVlBvl6kTdKUE5rREnHy7SR85ORUKueRuPQYP41VOnJTcmKUKTUUnoTb8bs5OD09KduOwLwCSc5/SsJT5ZqDOmKcqMktLP8BivjpkHnHpUL57HlSfxrZq6Sex58J3qWTJkYAc9WJ6d6iicbd7A8ckHtRUilNqQ51qsrW1T0NBX3YBOOAQD71WV+VcHLHkZrF83KnHQ9ClTlq0kWkwTywPOSfWqzSkHPoTmqqRcmuXQVOnGEXJ6kzPsAJJOcjAqvI/mKNpwc4p01FyaZNa8ZR5uoxmd3VlOMdcd6jz5eSpJJYZHtmurlV7R2ZzOnBt1JbonMuCuRgscEmqrMHZMnIJIHqKiUHKLXY3UnCN5dTM12Zl0u4wSpKEEn9KyPFVy6aU6hwGlGAT2I6VOGp+9zPoYwnJ1E46p7+R57oNol1cTSyncVJAB/SqGnat/Z8bBUDSsxxWeJm+flWxPt5ycnJ6Lc3NY2xXUJCqoDDp7GsG51KW7BeQYzjAPtVuMeZI44OUoXg7JnfC+Atv3koC7MjnrnqDXmX2qeVcNKxU4OPWsHyqolHU9CM1OCUvmdEsqC6YrIGXfkEdq56KVQ5k3ZCIVx9aULyerCpiXSjJRXxHwF/wmUrEkSn5XGP85rjG0xlQMFZcqASv1r9BVSmtEjw8ZhZt3dlbX/gHWf8ACX3LSAeaSSDkk1xosZQpHLAHIrd1YtLscccres113O4HiS5lQO7kr1wp6Vy8MErx+XtIbgg+nrXFPFuU0ktD2cFlMZRu3sbp8SXQICuwI5xzzWM1m5IYg89Ae1Wsa4p2HPJ4c6d9Nrm9H4juZON5XGAST0rmxAR97JPOSe/1rCGNcZ3sd9bLYU1GK+9HSnWLhuFnb3J71zCmQbfnzySD/jUxxtRSTRlVyakpOpJ3v950Tatccks3DZwCeSelY8TbuGOOowO3pVVcfKnJyYYHKIOHPJdbG7/ad0QhMhG/nntWapxHg43LkAj9K5YZjOLstmbVMkg23JWehqHV7kBQZScgAEVj7wch+digZ9/WvRWJs7vc0oZXaCTd0aP9s3bKx3sDGD361U+QqFKn5jjNZLGtStGJkslinKpKV7bK3csjWpdrN5jjCnI9RVYRAkkDPPAFR/abck0jtq5U1FRvrYnGqXLAKrE4XIBp0UEaocnJPBPrW9XMpJ3ktDzcLkcFTvbVfiym+o3KENktnkD0qeWFZOQvXG3H61cMdf3mjprYblp6PXsV01Kdow7MQrkjjv8A5+tTGxRwM53YO09jmrnjW5abXsc9HIoNuo37yV/UhOoS7lIcnHJB7+1QG2X5epZmyMdhUzxLjLlZhiMBD2cZJ6PojrdDvpY5UAJ+ZwSR3pmgwnep6DeCMUq2Lt7rehrQp04pQjHVn1R4CuWk8hskMMcmk8AoVCdfmxn6V49ZRbbRpFSgndao+qNEl3RRLycKAfan6FGPIjPI4Ukt3zXjOKjq9znrvmei1R1KbgNueCQaI+eOcAY5pTnFPlkjkcZN2vuO3gEjncARTtg3Edcqce1ZxUW7mlDCunpu+gRsoCBgcD17etCDDZJwBkkeuKitFtpImlGTjyPo9yRZGHOe4AJ71CCeCwAAKkH+dZPDq12joi27tq8idmchSD8xyCKiODwCcljye1KVKyTlsZwpxqNSb16h54zxyoBA96rYGCvZWyAe9XCKjFJs3pVG6l3HRfmX4psM3UggAk9sVUV9oXqdxzj/ABpS95XRVS9+VpJXuy3KQ37vrzk4qASDlnBDFiKXO4vVbmTTnKM1snoDJ8o3AgJwMUyRiVxgk7cjPr70kk5prY3rU3Km5y9CAtt6k4OTimudpHcA8Y78U21KV+hz0OeFJpu9iB2QuVZgVfgg+nvUTgMFOcHPT6VrKjFLfYinUbldq6tp/kQMGJBVj2OP8aGO0pg8s3Of5VpGpZcrWgsNTTkppWfYWJyH2c56n2pIhhg3XPGfWoqOEYJo0wleU6rU9FuXGG5gRjOMGhWLnPbPJ9ax5ko6lVoQnJN7JlkZVDgfxAZ7fWmhjjgnGR9amM25+RcpxaUYvXXUUtkRlmODjn6mkLYRQVztHTua2jNttNGFSmlFNu3kGRnYoOA3X2pnlnaoyTjrXMoKpdXOmdKKcW9xw4KHJO58U+MEnBJG7OPatEk1eQ6UZSumtOv6jQxxgNgKSCB29DVjaOBgehB70lOzbexnifdi5x/pEEcpOcZ4k5J7/Sp/L+ZPmIG4k+3tVJxtdmcIQqJKk9fyY0PncDnIUA+9I2zcwUn7rDPpmpoQSim2ac0rtx6b+ZBjKqzH5ATk96nZQUOM4QDn1x3qXUknboDm5y5mrNfjYq4ZXUZILHA96l2MwGTg5IOfpTV9UmaRrRmrzQwNtYLzheQfWlUsQq/7RBx6jvVPDOSJr1uZLlVth4becEnC5/Go9vIwxznBx3qXRXwdNxTxMlBSjrLYm4XBPOCCR6etRZI3KeQCD/jVRg476nNgas5NyY4FcHDE4zkUAANliBhsgnv9alXUm2epUnKMFIc2SExxgj8aRJAhbcDySTmnCpJJTa1uc8GqjcG7W/G/+QwA8fMSRkAnvSljwOgZgDn69a2lKSXvFUsLTgrpbdxpDnrknkkinYRyWVjtyVA9K5ZVIr3uxksK5T5I6Pf7xNpLFhkDcQc9x7Um77xzwB0NXUmlDRCWE9nLlb1EzhCc/M3PPfHSo3yd5HqAMds+tRb94rMdLE3SbjYkkf5ApU7lzyPfFQgsM7DlwpIB6HPrSUW5O2xpLHRinpqx5yqgk4PUj0pzMQqjGWLEEelaRqWduhFWlTlG32vyIw5YJjI+bqe/qadg7uemBxWcGm72NJx5YK0rfIa+SyngDJB/GmNxgIxGc4x39fyrXSScEYQSi1zu6ZI56EnqeD6n0qvKSUQYydwwPXNRC6koHRPERU+ZK48nlSScHBJHfI4qAP8AIrA8Pk+wxWEp3bgtzaVCDTSejJdwONhAG7njpzSDlkBztKkgD9f/AK1dF7RvciK9nb2erfcm+8Qd5ByePWmg4bIbG0ggUczaSMW6iqOUo6EqtkFscAHINRKxzyQNzbcmqs4q1jorYpU0m4k275SoORyCaq7j90ZOMg+/NJqMXa5i6rqLmW/YkXgsGJOACPb/APXQpBJC5GMZHrzQqibTSHVpxilF77jS+4BVyfmOT6U07cscAYPX1punJzck9Co4mCoJQWuomWUcclmJwPamLtD5yB1wPWj2kYJOWo6sppJFhWD7WJAGe3cdzTMqCM5I4AH9ah0uZWWxi1KnJc27J0yd3zkcdP51EWbOScfORx3rOTa1XQvEXcoRUbsmWT5iOoGAKhVwPlODj1q6s+WKbVzoaTqqMnv09ScN9wgEgt0PciooypAy+ORnA61pCqp3i1qTKnJySi7NaEzHcw+YjJAFNYAjJ/hXKj19Kl1HJ3RNalOE4pO992RSFmYDkHIIP0NBALElic8fSuiLcI2erZp7Jxr+0ktEhiE5YlQJOScdcev4UgYE7FcbgTn6HtU0rNXWnkY1KUYxcYu99fkGd3UkYIOfXmosA5TklTg++a3pRsk2cMqiqpJrVfkSJ8p2D/loSOP4aco24Jzk56Vx1JXaTWh2wu5JRf8AwwowDkkkDB5pwGAB3Kk5NXP95JQvZEyXLd2vIUGMKVPDDJz70jlVUnvwCT3racm5cq+854uEVyxW4DBxliBt498UzLb1HPAOamVOTV4mFKolPkirpFgZ3Env/nNQ5yi4BO04yO31pRl7SPK+h6axcWueaJYshlIbrgCkQ9FDHnIFXiYNxSWxlSrQtytalhZNoXGSuTz60xMEkZ5XDAHtWVS0bKRWHlJwdNssqTlfmPUj6elICdytu6tzjtSUk3poZyvS5VDVfmWoldfmBJy4BzUkR3lQG2qTjPYVvZQaizTDVlUTlbQmV2QkAkh2yB6Ub/uqox8wIP8AOpUI3T7DnOCbV9+hbs0M8ibGJOcjJ4qzpYCurDAUHH1rz8RJJvl2KwUpTVtrWPTNMsozHFuI3JySfXFVLS8dY1+fB3YAFebUpucbxPa9skrS1Ro3MiqSzkDaCSTXK6vq4i+UHLspwD+RrfD0nyqLOT2kqkGovRFW6uGFxnzMLvyQe/FcbLdyse+5WPPOK9H6um+Xqck6jikorTp0Os+1MHBDkKck+1cot3IoUFyS2CM/qKzp0lGXKlodMVzW961jq0uPnzvJOMmuZ+0sXG3Kq2CPerWHu7M82eIkq/NF3OxiuFL/AD8qVIJFcq1w/XeQOM4PSsPqakrRdtTshiY05K6vc6iVQApQ5AXOR2rBTUcJtJ67v5VVKU0+Tow5ISkmWJMsTubBUFifSq3m7lLBjkDt3rrSel+hFJQUvZw3ZqRBzGhLFjwPp7VDa3B8wA8qVBI9amnTUrtqwLFThJRWyLbuEYFwTtIJxQ3zhcnPIP1GeRXPToRg+Vs35qnKpraTKckgm+9gc4IHQ02a2HPzgbiOB25q4qK1RvRoTlZPQoKBlWXPlqCAB254qzxE2HIPQAjuKcOVrmerMFrNyb0HLkAjoXORn6dqj8xiwHBC9fxrOcbrmmTh8Rao1HZkkjjZtX7uCcjv6CqEsrcbSdpcjjviuihhWpc7OStjJpqKKchbAVv7wBz29qexUsq8kscg+9e3GcVG6R5OKpSjUT59RqDO7aM4yBn6U3DhgScKcEgdTzzWbpJPmvoCm3FJ331EBbJOz5jtGPQdxSngKck7iQR6VfLCUeVMvEJQnGotUPOWIyASTyagDnzMAE5IB9vpUToKGw6VSEpe9o2OJCksQS3AIHao8krnJBJzn1ra/vJS2ZyytJNokIG5mJ69M9qGU45PIYk+1cl2nyrYudSSSkloyJlQsCGO04/ClwQA5JIdhjPauuNNpcrOlV6a96132I9oDcMVUdSffqDUrJgkDJzWDhGK1epzxjJys0OkyOpJXdkgfzqLcxXLcHk8fyrGOHSTkz0JynFpR0btYVmJwFJIAJJ+tNOFYDB2nOKzglbQ1rpVI2lq9PvA4JU8j5uD607iPBBJB5FZU/7rOiUopxcokjEE7gcNuBz6VCWxhjnDenvVUqT5U09Sq1a9WzVkxrOeAAD1JJ/lURYggnHLEnPailS5UmjzK3KoylF6DlZSpPXJIzUSkBOh3eYTz29KucLpNmOHanTco6JFkSHgLwFUkmog7bVXPTIx6VzOLlKLtoeneUYNt6aD9xKlejHge1Rs4DAEZx1ranJuFlsRCmpS50+w7zNjABhzkAdqrhjwcn58AGqVm9B+zkpJpXuyyWDNuLEBV+YDvUSuBvLHDMwxjr0/xou4QsmY1ZRqTbaskOZWQAk4baCQPUioJZDlSckEgY9KdOLmtSa9aEZQUXqcT41djaxxZPYgVQ8Xzb7i3Tn92OQfrmtUrUnKO500b3SlbU4MIFddxJbJJx2qSUhyNoOeSK82nJJXkdVek4ztF69fRjWPmBduTgsRmnI4BPTBOQSOBWjlfVbM4o4Z05rlehV4zxwPT0+lKVz8xJ4YZA9KFBxVlqzWpactrITKxhhjIJGB61YjTe4BzhsEe1EWrczYVVKCTgtD4RaxXCH/AG+vrVA6ujDaJDwSoI7191Gk0tT5eGPqc0YJ3S3LQsIsMN3z5JwO+ahGpopJBznAA9DXLTpybuz6FYyMWoK3L3NK202Ihi/AZcAH0IrLGtEDcCCFODXViKMpRTtZ3PLljEm3J6r9TUltIowuSCU6n0rl7jXV2yYY5JGAaFgJTXZG9HMLRi393ew+7CIxGCdpyQPQ1zlxqiy8hifkyD/SieEbfNLbYzeack4xTtd6miDGWyOQME+1c8uojsSRx+HrXBUw01Llij6SGZU4LmevY1hjdu5UMwBxWR9vCFXJ4L4Oe/uK0eHlFWevU5p46NRqdrJPub8TqqqFbp1z2zXPPffvcLJhOvPU+lYuhOTvFEyx8eXnerul6WOk8xDycHnJB7/SuaF0xALMQBnJrWlg5qTUjohmVKpKDi7NHTiUZ2jgDnPce1c0L1y8J3Hk4x6/WumWBbjzNbHFUxlNVOaLaudfFL8obAGeG9q5sagSv3jyxABrBYapOSi1od1PEUHH923ddDpo5N0bANgrk5+npXNrfYEYzgA5IFVWw81Ky6GGAxNOacE7XOja42tDgjaGBwK5J70kk+YSRyCO1aUcDOdyKmKgp8revc6/7R0bdkZA4689R+Fc1FeYVW3HvyfTFXDByjLUKWNoypXjK8l+J0KOdysTjJO4juKxI7g7lG/g5PPfiqnTcm0jOdfmSctmekaGRLJEgIBLDGO1UPDzq7wurHPmDgdq850oqV3udlHFrkULH1z4BiX90GIzxk+oqPwCTuiJzygGD2ryasZvVM3jFODSd7dT6n0mNfIiVTyUHTvim6M58qMEYHABHeuZRaSi0ePiqU6sue+qsdVGoA+bnqcDtUeGO0nJyCuBXO0+az3M/buKUVG6fUvIVKc4xnAAHSq6q3XcccA47Uc93bYHCU+o4xp8yYxwQMdqZ5snVyTjgAdhWnM7XaMYxd24fCMESEAFsg5AI708HuFG3tmtU29e5lztaW2F8oBAQcjqAO1KpznLkfMCPapbaSjJkUMXJRcoq7ZVdV+6c5JBB9alYnl3YcOSaitBtWZ2UavuOe6KrgglW5IGeKa7YO5WzgEc/pWFOTSvYqclOaittB5dCAOo4OD3qiXYnaT87KcYpudndo3UYyWmqX4FqOTG3kDLZBbtVF3XaVyQ0mcH0p1JKy5UOjzzTlGWxMWDE7eQp5HpmqwfaBlicnGT1NJxinZvVHHCu6keSMbO45iOME55Iz3qTrxggFhnNZxinHmTNXUnGpGmiu3OCTjdgY9D608ouVYcbJARjtV1Ia3TOn2jbfL6ECkLjJAyelTjBXcRgAkc+tVdX11FTjGyct2SB9u1Bk72Bwe3rTVyNj9SGGc96mlS5bxTu+gsTblbT0e/yLONwVueG6evvUSzADnI6gEdvWs6r6NE0cK3BSb/AK6E7/eAzwxAqAkohUt0OM1rCnbTqbVOWXKprQtRsG+VhnHBz2qOM7FUjJzySawlGLba3BwcLLdIn3EDnOWPPtTRgsNxPUVcbNczdhKlUk7RWjRaI3BcNg9AfSmgoNq7gGU5wO/pVSmr2fUcqLkou2uwv8J/ebgMnjvmlY42Z6lgOOnNVeTkc1SEaacGiBo1jQ44G05Hp7mnyMANvIPOD6ipVVtm/wBXg3GK00Ilct8wIwuRg96hVTjnIG7IPqKfskpJLYyWJvHle62Za6sASQOpFIqllySSytjHpWaoO7s9Cq804+0avLsMZeMpnJLA475qaSP5VAyGAPSnRqtSS6nE6KdT2jVpPsVJA2/HGGHA96cC54VOjck9qHW5W4ov2adR+11TFPClVbJwME9qftBVgD1HA9KismpK7Lgk4NLRfqRqR8pIOQQefalQFlBOSQxJA7fSqu4vTYnC89Sne91F63GMeQd38QwT/FSqcjJzngj2odR6RaNoPnfMtiByZGXkht3BNSBiy47EsRntxUyk5PlJp8tSLkpbdCMMcoDz845NBGCqtkgd6hxfNZMqpWtTvCPvIZhvlZckA9ak3lQcc/NyB79K0jC7ae5pGUlTc4rViLgDA5APNDARrkMRuJ59KzaTtFPUmnBpe1i7vsRBWLlj14HHf0qTeCM84AwBWkE0kth01Oa5pLYRieoPLNxTMk/xYA5wOwqUknZHZOnG3PLruTDBYcnqM+1V2bGMZPOM1EYyu3HcxddzilJWQNhzwuNjHpSHBXHXPBFawcVZRM44ZRk6s9EvxGsMhQeiknAp4ULwW+cjnHQ4pUknJy6F4iTpJT+yyLdhVXGMkkkUqK5XIwGEmVB7CrcFFuT1ZManPGMoR0JVKkFtwBBPJ7fSmkZ9COhxWNJLnNqk3JXvqMcFmAOOeCR1P1pVwWLgH5Tgg/SumLUVdLVnF7SSkoN6JjjtGxjycgZHfFRY3bhuIGCT7fSs1SkneRGKk6sk4rceuQMtknjBPc1Fu+4MkAgnH1PeqVRpcwUcKlFK15XJdwQ+5BAA701vmZFIOG5yO1Ckprml0NamGk24J6y6jnY/N6ECqrSFQxLZVeTn2601o+V7EVqVo32drE7NkDoe2DTNpHygg8HJJ/LFZxmldJaHRRptU05bokTYFUnJG7IB7VFkqVAzktncO1VTg5yunodtWmp00p69SVm3kbuxxgVHv6NkcEH606lJpq70OWo3H3lsTk7SCPTJqu5zjJI+8eKilCUHZ9x1Y05pVE9SXzApT5cliDj/ABqpvaRQVODgg5/XFbwheW+5565ISST16ltXLEMSSuQAD2qAvnChhvUA4HpWUZX0cdEd2IhH2cVTluTNIV5IJHBGKhC8qdx+YdD2NTCCmnKWhPN7NxcnfQWNsknacN0I9MU/7hVueWII9a6alS8E0tTlpYr2UrVNU2PVF5bncWJB9KbuKlEwD8w696qKk1a2hp7aCm7PV7FrBKdckkj6CmBsEHdlRk4HesKMZL3nsdEqClo9xyqxOeQAenrTldsqAeg5z39qesknH7xU8Cowk23qSKqyZ3DJBH6UhcupC8MCSCD6VvQglK6Odx5FzN6roMYHcByBwTjvVvAK4A4YAg+lc1k7JD9pUb52tCjs2rgE8EEYq2U6YOc4yB3rZPmkosmUoRlzPrYrhiy+45471aMTADAOFx0oTSTkti8bCUnFtWtsM2/KrdPmIwPTtVgLwpPQ5OPpUOnG7fQ1pS99R+0RorIoyfm6jPfJp+8HBIIwxGamytdo2dRzqXTtYlifauwnA3kgH9aYVByGIxkEZ9RWtSrFSUnuLD+0Smov3WXAy7guMjIx75qBZCoAyCR6VzTV486WpzwqOMrtaGvA4jkUAkKBkVlecQihTkg5JrLld7SWx1e15o3StdbHb2Woxg/vT8qEkg9s1xSzsSCSQSMEjuPSiFBNt7GUKijFNM37+VLx0ZATtY59+elUI5kUBgTvOM47jtV05O1kzOtUnOSurdDRg05DESW+Y8g4qOK86AEhcAkDv60X5o2O9w5rNPVFKazwckkk4GB2rQdRJglsqAAB3q2ly3bNuWUJKEldsy1iyu09VPBHatBbYM+4YJGAT6UTrRivaN6nkYinCLjTcdbmfKMjb1HBPvjpW4bNSMDkjIz6VOHnFK8nuXWc4tuK0OdHHzDkHsO1ar2ioFAP3/mJPet6lSCtGKNMJZwVVr/gFWAPgEtwTg1KECnaGyy9SKyn7t7s3oxhzKsttR2ZEcFX428enNWSo+XJxtI5qI1OZWYVKVOSjKLtcljumQDqSBjPpTwqHaDz1PPeueSu+ZrRHZRlFxUU7MZJN5mWOQMZqWSBShIckKpLD1GK3g1fRaHMrx95yvYpnJZQV9z+NOZCCOTk5UAdKqM4xXvBKipwacrX3RCSvIDnGSvHXimZwWK9VZQM9+avEyatFs5YYpytClHRE3l7ghOSS5zn6U1pRlQQO2Se1RRrycnKWxdShBNPruNa3VQzBQMc5H86d5vGz0Ynn37V3wqRVopbmdXCU5Rbb1WpSkX5gynC5wB61PzIcBhuLnHoadCumnCWxx1KCT54PVlHdghQx+9jJ7UjgjeVByFDAjoPWuyFRct0cfuylyTe40vkEjGBnJPamt8uV75yMe9Z+1ipuL3FTwTclJdAXG0KwzyTk9qYGUYDZJxz+JraSaXP3JpTi26bVmnuSiQ8dD0H1pu3MZOOeSB61h7Vct2tQjhnGokndBuy3l4+6w2+4xzTJCARngDv+FRWxEl7zR6NCjGUuRq0kJvkDMpJBDAcd6YZFYMocAkHB9M9KhVpONpLcinh1GfPfQCeuXwxJx9O1N4Lgc4Cnj1qvaSjBJMzxFNKq5oTJBweSeA3pSYwxxgjPP8ASkpK1gwmBjdyT31FaTcR129vf61HgkgdgSTWStGyXU9GUtG09dtSbdt2kSZK8gjqKr5KY6nAxn1560oxXw3MXGXw20tf5knykqCcrz0pEbKtt6jIzWlSXLJJdSa2EhVgoyXQRmJAXJ+U8YqBnPBwc5Iz6Uo0lFtSeplCShBQXw2HKzfLjjqSabjC5ycbQR7mtXaTSRMaUlBNu6/Mc7F3X58DOCfaoXbarBOBxgDvRK6aikaYOSk3zDjKynAOepx60xQpIGSGBOAe1YQUY/Ejtw+JqQbdu5KHDfMCOGAIPaoSSM4x8xA570+ZpKHc1U41/eas0PeQk5wMdCKriTZneQVU4I9Bnn/61SoqKsjkum7TWiuebeJ592ovkZ8tVAHrWbrMxkvpnzjEpyPUVU20/Zs76mHj7KHKZbMFZTg4BIAHeoULMFOcqGOT6Vz1aDkrSZzQxtqiil/wxPEB353djTIGBXdkH5jWai6S5VqRiJOpUTtazGkhWfd1Izg96idwTu4wGJOe1OUpNKL0Lp1FFabX1J4WBIHO7qAf5UQqwKspIIwTik6bckuppCD5Lzff8T8wDdtJsKBgxUkjvVxNPKgY4yBye9fqrwkYOyep8QsdTrpOK5b3+ZWS+lTcpYgHqT1GKuzacuVIOGbBOa2VGNk4nmqSp1FCo76uxmzXLYIVmzt5+lSSWhEhXOSFBye9YU6c/iZ63NRjHkl8UtkZ7yyMvGM8ZzWwtg7qqhRhyRk9uKbnLntJFUoRpxipvTVejOcZ8sGXsD+FdUmkGVRwNycgAda2lUi/dkZ1IKjFVviscesUj7SnG0FuO+a9Jt9GBEYK4AJIPqfeuTFYqKWi2Zvg6cZzjGMt/wA2ec+RIAiFSRkEEnpXp50OHJBA5JPPejDYym37S2rPVxOFnGfs5NWPNvKZlztI4BGf0r0U6KrgOiY2OAQRW9Orz3jLQ8OSVGNqfvSueeojtlXXO4gFexr0D+xUy44wuTinGMWk5OzLnKbfMtUt0cVFAwwig4UAkD+Vd1/ZyRqrKDucEYx0rpoWqXjFGWOx9PDxUXHTc4oWrL+8bOMZI9K7eXTxnO3kqFyPesZpJpN6BSm2nUW8uhwggk2o6j5S+WB7+34V3Z0zhMDIHJ962hCLvoXJ+wlHl1bX3HCpA5wBnJYcetej2+h7mTAOMjOBXNOKhJyWoYLFwqS9m3vY4m3sp5z5QjIK4Ne56P4YhiBmZQW55/lmuLEZjGELHeuH6kq/PGVkjxI6VdRyFpMg4IAPf3r2HVdMXey8bdpJOOmO9csczc0rqyPTpYFOpdu7OR8MxSGdEQnG8HA9a7/wroUiTm4OMj7oA+lc2JzKnJp7s76ODk4tx0sfSHw/s38uAsSBxn2Na3g2VkaEdApUECvn61a8m+h1UabUHHqfROj2/wC7QknGBgHsaTSZ/kGSRyQB6k1x1Jzuoy2PGqXUm0/+AdMkagIwzkNyPrT45dqDc5AzxjvWLqcz5UXhqHs4xnN3d9xWfaF3HI3AEe2ecVXncME5H3jUJNSaOrms01p3IXJy21sEHIx7U0bSWOMkjmqU5tJTOKDUYvlWn+YB2VgVJIyST6cdqXcAmOT8xyD2qJTcbKOptTowmnODt5ETPjOMjLDqeuaidguMnBbHH411J+6tdTz6UZTqpJadSOQt8mScs4JpzfN0JBOQPapp6T0KvKi26asrjE+bdkY449KXDHsRh+p7VjWj7ydjanZwab1uRqql1YE7QcEGngYJ6YHT2rapVXKl3M8PJKLUtXcqEE7QQCx6HtmrKR5zlsYBJHpRJ8jtc1oKcnaUbIokbAobkgkE+hqdowq5boCSc/zrLkvJ3eprXqwp0rJWZGXHBx93tSBQ4GASUz+NTCFpXWqOKVec4pbJACeAxyDk0w5XgEkjB3Gto6xWmoQcI3cXvZMcwYbApLbgQM9s0bNuOo4yAO9YU5uL5m9Udbg1FJPQjbec7XIBYAUHLMCCdoIyP51cG4y5nuOhHnlZLTqPYnkEgtxyKQHlMZzxz681S5rqTIVLli6a2/IkDCTaAQcEAk+tRgANlMAhgTnvS9m3Zt6joNp8svhfQuNwFXIIBwR6VXHJKjPzYJ96hR5EpNamtTDu7cXoWW7gHGCASKjj3Fsg5O4AZ6ViqraStqa0uT2aTdtS4OBtY43ZIPccVF5hIz2HFTGMlGyKrVIwqqqpdi0JN2xeO+B61GDtQBWPZsn1NbUqbScb7nNiJtpVodbg5LPtB55HHbFR+ePvqCCuRj04ommlyC5FJLm3/IkXG1NxycggjvTQw8vcTgKSc+mBzXPyJSaQezUuXXVE4bGG3c7cY9ahI37QMg7gRnvW0UlJRexXtYOPuvVFnd8m7PXI5qDOFA3YXI59fU0lFe1utjZ1nGlqtW9RSGJynAY8Z7etSRscYPQED8Kei1auYaqspp6kAiw5IPNWSqynAyDnp61Uqt3Zjlh5RTqbWISjH7uArHqPSpfugY5wSB6CsFSlGT6myqOpC7SsyswIORk7jgg9qcwO5QDhWIJP8zWyjZcz1ORVZOfI1r/ViFm4X5Rgk7j3HSk3nOwZ5JyR6dqKdJJXaIjXbi5Napke4sxXnOAfy7U5kYAsGwccAdquLio8sdztoVFNqVRWT09SNsJgDu/enOpbBfJbnk96h8qd2KeMUm4JaDdxBRg2MnGPSnoFQk7jufIAPbArGU03ypHNBqnK3TuQtlSgHJyeR2qXgjeDk46HvQqiS0V2dNWmpK6duyKbZGCzHO8dO/oKsbDjgkMSABnr61rRmre8jnjVk5cktyIsDtGcBc4xTlTjC8ZOeKVaTcm1sbpycFTfUTd8p7M3b196cVwhHcEHArJzU7cxEKcYpU2hhJYHglkAIx34pQrE5yBgHj1zWyxHLFXWhr9WSTle72EyzbF5DFMEjsacpC7WyQBkHNTTioxbSJqOWlNaJjipyvfPGKVzyFIypX8uK3hTtokJ0eVczegjY+UFjgE8DvQHyenO7nPelGLW71OfmjOST2f4epJ5allO7AJAI9KFICr/AHd4GTRCavr1PV+oLm0nYf8AZQ54OGAODViKXadw7nH0qoUm07o4KlVuXs5P0ZTNoynLZJJGfYVpPcmUbR/dGDWUWpNxasi5QqStOD2MN4Gdxu6g5wP0rZRgSC2MZAJFElFK6NazimpvRoyNrBvL3HgZGK6AW+SuFzvJOaycW0mvmc1Wq5t1I7o5zYzbATjucdq25bLLfKDg5GK6IpJaaHZhJxp6xd3YxcIwVcZGQADWjJaFSoCgIAQBWdOyd76LoKpFtKUuv4mVyykYBGQOavKhjO4k55IBrZtNqUTGhQbbm3ZFFk252gEkHAPep/KIkDNkA5GPTNSm07N6scsNBNTSuuhUIwyDcQQQT/gaubcjewyCuAfX0qnGzUnuc6pqLbjsVUYg85LE/nT0iYlsE84KgU6/Klc7qOkeZfMYrMN3Urt4JPSrXkDcCowW5OO9aTknFJaHn+ybu+hGsbfxH5jk89uavRxqzcjIyOtKHLGNkzedOCXO1roQfOuOAM9SO1XvKd8EgAFsADrikoKS5WtSamI9m04dSkA23dkDk1bERXI6kngn+VZxppytHYrFKThyxe+pVXJcbTyR1NWlRVU8EEgn6n3quZJqEXexFGnyr2m7sOXdtBLfMAc+1Ko8shvMIKvuOO+KJRvK3RmvxRUpPW9rDtx3AMcY5wOhpCcKcdDgA9xWKT5/c3Zph2lT5U7+ZMgwcZJ3N0NQIx2gOTuznI7+lL3otrdG6qRaUm9SYYIVFzhjjP8AjUSS4Kg5ClsYHbNaTknaTRzxrqMrbvsIFJOck7iSCe1S78AdcEYx/KpjVlNJp6IhuMpNbN/gRsW2fKuDnAz1NNIJAOT97jPetPaJSv0MKKj7KTtoMyScjOQ+GJ71PCu5QzY6g47VoqnK03uFLDucEm7LclVdoOMHGBkU/HzHk45P0rmnUU4q+x3TryjHlauMWM4YBiASOTTwSDjfjI4HvjvXRFONkcVOto09gUSFlUZHOcCnK3oSOBg9zUSjZOMQqVIxhzta9iyhMYGQScg5HeoBKVL9cjAB9TWXLF6ye5cMRdpNW6l9d+fk4GQSBRAVBQHPJBJPaok5Rjdao9Ck0mpSdi5CzspkGQc4A+lOV1Ri3LDoAax5ZcvNFF06MJzc9ncsxzbSPMJI7mqXmRs/zEjaetE2optmkMXduL1ZZuQWK88NyP8AZqm85+Zt3IwBjtUKi0k29TGNRwi4r4d/mNDsX2jBzhif7v8An6VEDlfkIB3YIPeux000oRWh5sZTS56mi2+ZctyXwOeDRbEpu3ZGQCB/OsJU0rOKPTTjJqL0at8ycxNlUGTnuKnilLMMLgjByf1racnFKyGpxScZFhVfCjaDwRkd+K27VY26dB82fSuZ1FGLbJ2k6a2ZgtAwXr06kdq6R7USZPAyGJA6msqmIirRfUqjgeRObdzh5AQzA9q6W500JKXAB+UHnvXSpU+VXWpz0ak3VaWz6HGSkxqd+QRzk9q0dUt/3fyc5yOe/tW9OFpcxOJrKnFpIyFl3HIOCT27GqyMN2e+QAPTjtXR7G8bdThq1+WaqfZL/mjcgGRluvYDPP6VSE20jJxngk9ua1hSklfqaV+WaUosss4l2qAMYByOoOeQah3cEKCGKkAiinS5YqMnqcjjTbcZrUTJIIHOen/1qRwFG8k5wDj6dMVajbVbo0wypRbjPdjDu+9yAOR707djGDkng+1dP1qcbNI4KeEUnyxlot/MTcfLyM59fT1pTuIyB0ySKptOomzalCNOKUtHfQhuCzR8EBMEZ9T6VHLIQSuCQCSB71jyJN6XuEoSqTU07WZGyDKZbPUE+n1p3K85yWPNNSas0d6bk2k9hNzIck55A+tKVV+cDLYH1rKWHi/jZjHM5RtGEbt9SPJGfmJyAcUFiOnXdgiilQco6m2HnCKs3qMMpJXtweT3oKLG3T5gQeKaiuXmS1M41W26LluPBK/N7k0zf0JHcYP86l3jJt9isJiIxp2E8xTH0ILDA/GoyARzkjjGfrVygnJNDhJUk5N6MaJW2bM/OCVx6+9HlglX6hWJJ9KyjSvJSl0FVc4wSauv0HLuJAbIwOPwprtyDnGOuO9aRV5We71Mqii1CyGtnHykHDEknvSGUbVc4GGwSPes4zi5uOzNfYzkk763+4YdxZWJIPGacWDDoAwyeO9WkknBPVndCi0rqVyJizHBIA4wfWoWI4z1UgfiKHTtBRa2ObC1f3klHToR3LGNZXb+5niqt/LttJ3JI2IQCe+aISbaXQ2qYVzT5u1vvPK7uQvNI3Ysxz356VXuWBkLZABzzWFSneTmaYOk5aRey/IibCrkeuOKrifdgnGBkEVz1YSTTbOKWLqVJOUY7FuJtpAU5HUA98darQyMG5BC85I7VnOMk77nTUs4Rqp2XX5j5DjOOM5IHY1WK75AuSPmwPQ10e1TSci6lanytU91a5oRSBkUZIZjjI702PAdGI4VunrWM5395oIVm4tye5+dsTBFAZh1Jz61z8epRlCzEFiwCj+dfsXs17SKS6H5bQr1Ix9m9XfTyOnJRygU53KQB6etYkV8AQckbASuP5VlzuOl7mt+Wq21ZpXOjt7VHwWAyQBk+1YyanyCWwobBOelXVi2uZaNGuArSmlGdmpdTqks0QNsIJXGfasCLVQ27a5AkAANDhzJSM8RKmqnIru2pvwqocnIwvQ+3eudOqCMSBWIwTgilUcKiikjTAUpwjOafnY7CKRCVywHzAgiuKXUtqghickgEVFWjBtSXzObB5jUjWcVGzezPQRJFKNwIBJxk9TXHQag5wAxO7Bweo9qyeEgumh6CrzjUXtHqdhIUCeYMHaSSM+lcw+pqiAMSGOSQPf2rWHImml8iZ813Sgut7m48sfOz73J4/lXJSamVZT5gHBJIqKkYxV7HVRcW/eVn3OgeZYyGDE5U8A/zrj/ALewcNuJ3EHAPJHtVKyi7bnDVm51eaSdjslmX/aCqc//AKq5mPUeVVWPzMMbu1TUSbSludUaD9k4RXX8z0G0hMwXaCUkIJ/2azNP1YRQ5C5CEAheorya+NlGTUT2MJgV7NN6tbnq2k6dbCNVlA4Aya5mw1suBgkYyCDXh1MZVT5b6nvxwUXSvy6Hf3DQwRMiYwM4I965OS8aVT8x7g49Kj67aKbR3UMC5UefqrFea4VZBv5DcHPasO4ZCcsxLKCQB0/z+FZvEKTvsdc8M4tNvRL8T03wvqNkjrbuoDFzyD1rhfDyE3UTMcFZeD6V5uIoJrmud1DEVIRVtrH1p4bEZmhMPC7iQe49Kh8DDzo4AWJORye9RKUfgb1POVROUprY970xU8pVU5YBSSfenWEXlog3fKcA47YFcqkk9GfPVORJxqdTZLOEwpJXaSD6GoUPTBJByMGtuaMJJhVlNxi4q6/RE+4sFJJxwDntUe9QMsxGWGQKm95W2NZzk4rne4F2dwDkZcEn1qElwc7umMEdqudKyvcKVRKag1fcmc/KWB6c59eeap7iVyCcHg/hUxhHmSQ5yapNvVkzNuAyctjP1quJCGTg9gMd645VHC807q+xUsPGoouWj/yJg/TrnjkdqprITg7/AJXJBz/KuinKV+ZoxjeUlbVFoSheNxOeTnvVYuwHJID8Ejv6VrNtpSTtqbStFypyW9ncmzv3EMMkAYFVnkDBwFO7BGB34rOFFtpvYqthko36kpJGME/Njp3qqz5xg8Yyc9s9KtSfLzvZEVJSqxdKMtifzj3B2ZAx9arBiAW3Zxgn1NROq4pSa1ZjSippU5dC+pCq2Mc8H2NVBLk5BwCpJ9zXRCSdm3psKrOUarpwV7Fryy2QMbsHHvimRy/UjjJrOTTfKZSlC/vPceI3cbgpVhng9qlWYrjGeFyT6/SsuW70Wmx1/V4xcWnchMQHBOc55HY08Hox/iOQPWtKiileHQdNNpSlo72XmRMDk9SGIH0qwhQhST90jg/oBRCqknFrUJKpOXKtCHy1OWBw+ePepzzjHAG4cetEJzkrPYxadJ3Tu7kfk7XUhiOxxWiisUBGCQBgHtzWc4yTshwqynJST0M6NMYXAKg59qv+SpAIGMscGilh1dJbmsnGcd7pFXbtILEH5jk/SrxiUBM4POMHsaJ3g3GWqNLQcouL1/IphWZmUP3JyanVOi7eSQCx9qcsQlH3UcMKf7xqT0voVWU4wWAXI5+lWtiqWyMcjFVPmuo33N6fI1eUdejKqjauevOcDvU+JDkkEKCeR2rmpaytLY1pVJRabeokYxtkGc4Jye5PapYz8gXn73X0olOSlyLVE14Rk/au2ozy+NpxhMDH9KmVGG/JJA5ye3rUqUpT5UWsGopVU9VsIoyu7t1AHapU3HoBlACCO9aU4OK5ZIxr1VOLb3GgbAGJPJAx6YqF8jAUnI5IpUk3OzKdaNKFm9P8xduQPf5iD2pCMHIyfTPelzSkk9jnqYeCXNJ6P8BSFYFVYhVz1/iNR5bGTjaM5B7+lbpNapnVh+W/LFWVh0YRe+eOaaqtuwWIGSSfrWVRtPmZGHg4v2bjp0Hsquy8k5IIPcAelPV8457ippx9/Q66ycorm2I3jB2liBkYwe1SAYHLZJOAfSmsKlpJ6HBSxEpJyn0ehAYQeQc4HA9at7Qpz36AUpKV1bY9CnTUlyyepWW3UFAWIVWyWH8GO9akEasuOPmJPI9KzvGMr31OStTUl7JR1T3M0wY2Ag7mPHtWw0ZBUkggZ247U4JQsjbmrUk3HW1jCkgcbcA7hzj+la4CnlmJYEEAd60nUk04xWp59WSkvaTZjNEcjJBG4dK23hGeAOo/CtYyvTUZbmlPHNSUoo5x4mGTjGATgd63TDvAxwcnIptcrSN5TqW9qlZdUjBMcjbQCQxA6D+ddDDAAuMY2sDuHtSbSfLIw+syqT9o91+Bz8kbFQBnbg/hW4I1B2gffBI9vaj2cua6NqrSXe+pgDJHIOdrAH0raMJXaOWYkYz2PpTlTvpHc5VShH9435mMEdjt6jII/CthbbZtUAfeJB9ambkpJtXOylVhUVm9TPQDaCOobp61oJboVG8EMGbn69K0SSk2yp+9F01o0UlT+6ME5BrSMRGBgDk59qxd9OZHPKqozai9WJYxbh5bZ/e5AJ71fs7ZJmQhiGxtH9awrOSi1LQ6OSE5wlbmj1N630kSoGXptJHtW3paPDtjZsrkDntXnPGTi9D6D2VHlSgrHLS2Lxkbgcg4AHau2vYVlyCAXZiSfWtKWI552fU8D6m6dS7ev5nm0tuDxuxtIPHeuiurXkDGWBJ/E13wqRT13OytdOMUrWOTa0TCsQAzVsXEMieWSu4MDjHb61UZttxi9TmcYQd27r/MwJbbKj5j1znHTFaywyKAJOflGSO9Eaii+ZPUqGG5oRVtNTm5Ld2IABxkEf4V0hjjXPHcggVtGs4xtJanNCnC90tDnPs+wg9c4PHatho1BGCTkjArWXvxSQSTiny7mWiooy3UggAVYmiBIUYYkE5HQ81LlFtNm1Oq+RxbV/zK+VULg5JOCR3p6x8EYwq5wB2qZzcdZI5aEZTkouXwiJIXADDGcAAenrSpGSrHJAD459Kj2qclbTQqcG6q5I3uKdm5QOSBnJ7087cqUXBwSD9KlSS1RtVjVV5J2tt+pXbHQY+YAAD260kityEwCQcEdqWqs1sFLDSqy9o/dWw0v85BwFZR+HqaglGWRsZ3MVB9cDmuiEnytPRnJUozVZN6xZJuJbapwMDOe9NCsmF69cE96KjStKJ2RhFtqJMgDLuYnBAIB7U0HaOOcAggd6VRc1mh4VNSvy6gCMAd93OO1PXb14CjoB2IqYwcp3bOarR54Oz1uPUbjkknGB71IFxh84wevr7Vc6cox5YnVTpx5YqW4CNl+fg49e1K8vBzk56ZpWaSjLUxlBWkrgcAoxJGcgY6UwE4BJ46EDsaqpCMVd7GEqVR2U1sTAnY2WJ3ZwPQ+9Cq2ARjaWB5/nXNV3TR11ouTi7av8BgHHJxu6H0xTWK4Jx3PB6GtqcruMmcTqShGSS/4I9FO0kuSdxwaVAduwtnIGParak5K+x0KpGUNdZEmBlSGILMACe/pmmA4255yAB7Vi4uXuy2JcHCXtI6p9CcSbXAbnkZqqflyM/OykgnoMHvXQ0uVW1TMcTVhKNppq3TuaSzlWOScgZz6VmiRgAHYjIJHuK5ZU5K0UzqwVZ8sYxdi/5oJIJPfJPfNUldmw2e4LD1+lbzd4pT0OinKXNZrR31LabmJxJgMABj1yarq+wqTkYbII/nRze6klsclbEKSamvdWhchkXgO4DLnAH8VQIckMAB8wwD2rJQvJTubUHOCUYq67mv5y7VG7nIJxVPy2YAZIDEDPrVvltzLdnQuWMrvS/4mlBKrnI529c9qyd6xMoVyMHk+tYQipRaibubkl7TfyO0srlBnLALkkD09K4yS4IC7GyVJ4HbvWKwyklz7FVJRlLlXSx6bFewx/OWHUEbu1ebrqMrIy7zjgg+tYVsFaNpbBSbjVVtjvbm9jZWIcDGSSO1efi6JWPfKfm6AmrhQVtdQlLlmo7X6mvezRyEA8k5I/CsGS7DtzwoAAx39a6IykrNrVGEqEYybTvEiuFRevUHkj9KT5sjPOcjJ7V6NOSfup7GM8RCcFDl21IGKrleSRwMdqGTzGyAQSSDjt71tTxKh7zPNrYByVobdBokbftXPAHP171EULONrEAkE471bxEUnUSujFQipqMviLo5TazBmLEDHf2qkkgUgEkgEjnvThUjHVbGTouTUn1/QvHJYBeAGAye9MX5hySCVIB9K2ryind7io0dUr6gwbbhQcA5wKMsFGT17Dp71g207XLWHmlZaoic4BLMSx5J7HPT8qkbDrgDkkDmpjFSkm2bVJVI0pKHxDQTg5IxnIz2pmQMjueMVfuuKa3MsFSmpScn6jchApByAc5FIN2GDHjOM1m6ilotTqo4aKvJLzRXkYg7lJGGBNN2sGbkhMA4NXGqkk09AeLjdNQ94jMjNjHUEEk+9JkbSSMZbOT3ptpw5UKNRqqqjW+mo9ieRjIGME9/WozMVGzgktgVyuPv+6aVG1GUoLQnQqM7mBAJGfTFUS4yNwIywLH611SpQlLmm7HnU5V3FQpxvFlxJdzbckAAhge+e1VhiM/eBAbIB7elNwaTcXc6Kd+VKpsDjhWLZDEn6460zzdzqpOUDAkDvzWSbinJo6eb2q5IPf8AQidhjBPy5G4HouO/0qLLE/L2bDCh0+aKmtGYU5xUVFb/ANak2cFiWyCcYHY+tUN43cKc5BJ9fQGnKPLHXcUJRsm37tyyzNjG3gkZqMMT0A4YAZ9BWSjJPmRpRxdNy5EjF16fZpr8ZMhCgntms/xVMUto045OMfSu2hFRjJvc6I1HKcW9Ip/iebs4ZickhSRgd6qs3ygqCCGyAO+K56klJ8jJoRs3OL0uO8xVXAHzNuGahDZXIwNpO7PpkZrnqNTlzrdDXMrxqLS/5kn2hiw+Yg9CB3qArjcoUBuoxUNpRXcdCmpVHzrQtLKSQVUkqR1702H/AFgB7t+VYV7JczNaNVU5OD26mtDEz+ozg5FWoty7D1wMjHaphXc042OivCMUpJ3v0PyhiikRQYz8zY4PbNdbb2AfBUcuwH19K/YJVHJc3Y/M54iKjJQV3/WxhLEyA4ckr1x0HFdadNVSm1uWYEk+tTCUU+bqEJuT02scerSFUKbtpJJx6V1jaaylSQfu5GO3tWzbkm1sdNWSkoRjokcrIZRs2E7cD8K6o6dgjeuNwBx/Q1rT9xNM8/M5qcUrWS6nMbpGwi8bjwR2xXUrpiqyjjG7I9zXPF8ydtGL20VypLeyfkjmokeQois33ifrXVRaarsJW4KtwBV+z5I80n7x0+1TkpW0RlQW8irkucYbBOa6SO2BPlbScgEH0pe8mpN+6jgq4q6bitfUwJTKEjwTgHG71rpE06OUtHuxtAIBqKk7S95nbhUpwco/Fv69zjGgaQbtpHOMDv616CukIqYAIxyDXPGvHmSex6M6T9jKWib6HAiNgHcAhMYAxyK7t9KWMlTjfjJJrsU+Vpp3OaGJk4OlUjq0efeW0TRyMxJA7dTW3e2iR+aOMhQRnoRTqKLVphh8wcEqbV3EbY3mSqqTjg89xVG1hJnjI5LMACM8CvAq4ZSu4n0eX5tGUeWa0/U9N0mNpo1MhJOQAR39K6fwrpjXCRjkuCMAV4c6ElNOTPo3j4um4w6DpbOdEyHIO0n6122oWIjt2D8gcEU/qsklKWhlDOYuDpxd1ueWuwSX94QRGQOKyNVn8idiSQC5znp7VniMK0lFbmuGxEJS52rpdT0nQFiklQJ13gnNcv4V1P8AfxjzTkyZI9K8yrSdFKN9D1abVVRb33PsrwNEAYSnPQn26VS8DXCmKHbncuAT6152IV3ypbGSm25OK0Z9E2ygpGQAeASPrVWwlVo1Yg5YAY9eKzVNOKaetzw8RNySjJWRqspPOeFySfSlaTardcYGQO9a87ilFK6MaNKMJ35tCtIc+WScgZx70jHcQue2APSmknJvuEozuoxehCxZupwwVSc9z/8ArpOCHG4cHjPaqqQUbJ7GuGnF3TfvIj3jaASOWYDHbFRbSNi8ltxJI7UpUeZ3iYzrSVJwWmoCQA9Sc5xntTlQ5LHABHJFUqKerMqLi4KMegwuCvYLzkjtTxAdyjaDu5zjpVwi09GKNOmnaDuyJWLMFBP3gAB/SrHkOhQ+jAg05SjytpBKLdrtshde6vjOOKnEeT945LYx7VnTg00m9TWtTulfa+xS2NhMk8FnwOx4q190BeSS2T9auU0nyRG0kmpbvQpxr82QSRyT71cTBVV5wCx/PtRNppJk0Lwm5Je71Io0crzkDJ/Gr8aDOMnBAOaFhORKTehyRcG2o6vsVI4iBgEjcQTV4D5QPQ4J9faiq0rKW5WDumpJa9UVAByrZI24IzyeKusgUHGA5OAe6isG483Inqzvo1kpe0lHQrJucruACK/BPerOCckgkow/GuilTbi2zeeJi6sZct0ug2NW3kuD9/Iz2q3GrfK5UkOMf/rrnlOyaeiOXE1YtuVNavYh2FcsORnt2zWxFCjgKAD8wJHt3qoVm3ZrQqdBuiub4irCxK8cBWBBPatAwqiFQBkYIwaihWUZcqHCTilKSKm3G1AODnj0q0sedw5yACCO/tXW6yTTMalCMoyitG9iuEzlQeg/L3qy0q7gvTjBx3qYSc5XSJnBRgud3K5XoBjI5x2JpXzuQdSDtB9PSrqczV0eaq1OU0473G+TvK+WwG8qAMdachIdQecOTkdvSuWpQbfM9z1I1IqbUl6BDb7ywxj5icnt7VPGSu0ZAJZgP8a5q8JJ+6d1L94rrbQBaqVJBGVJBz3qwpPG7OD1HbihcySj95OOoQlTu9nsVxEqnGQVZsHHarAQnA4BViTjvWuqSUTnp1Yq0Y6WI1j3BeQWUE49easKu1iQM4ABJ9O1EFyO0mb80ai5ZaNdTNuIBGRkcZzn0+la+1ZFAOTxkE9qn2z5eaWzZzypKNRRnqc2YtwA3Ywc5PtW4LdQz4PGcEH1NKtUcUnHc6sPKDk1J2100MMxEHg8sTyB1rfNqCeGztBIBrNxdrsdVK94q/4HPKjFQvJY8DH866VLPAUYxg96d1H3WRZqCjAwEgIXBAI3cGuje1DjKngnAx7da2upWaeo4026ajPzMCOHGQxwXIHI6VteQp47IMVlUg78z2IpYaKXItXuZO1TnBJ45IrRKhdxwBwBj19a6I2jaL1IdSTjJv3VbchjRVUFGOzGcetPXO7K5xu4BrWOF5UpWOWjiOeTdtt2I68gk42g4yOmev51YHO3PrkD1xXE6Chqtz0qWKlPpoZckZRwRkA4Jx3rUKKNykZygODVKUm7tE16UJNQktGUkOBwpA3kY9aniRccEgqSAR39atU7u0tzP2cUlJPRPbuN2DeWHViM+/FSAqNoX+DHB7ehqqUlGPs2tDknCFSs5xumRbNvyrx8+SB2z1qT5iCFB3beldUYKLTTuceJotyTatzaESKFQNx949e1OGWUrzwQB7/WlGq1P3jSnanFRWw1jwc4y3Q+tNwwJRmJBIwT2o9hKUVJDo6Sk0tWMwo3/LwnJx3qUKVUsuAqMc471tGa2WwqlX3+ecbNWGABs8kYCgj0qc4GGZc/OSMdge1ZU+V6Pc3qzlTd1syoQF2uTnGcgD3q0UySApATNaJN7smnhZTXNHpuMhkEciuuflODmnxoTgkkZwRnvXPUpJ+49mEcQ04wh0OmtL/EYOCTjAzWXZI0hG3JHmAYryMTh483LfY9bDT/AHalDc6YXLNsU5zuGSazUkCFMk8HGR+lYOCk7Jm1Cs+S89WaTRJtZu+7gHsKoNddMcLuHAqZpRkuV38jow1SPM1J2styZok2gHJUkkZ96qm4Lct17DPSrotNc3c2nyaxvoU5Yl2t2JXAP900yZ+DuOQXK49MmulJuSSdzyJVXNWeyMwkO7KQANwFSSDc/OSM4Ge1bxre0ST0KdOKV09XoSJZ+YvzdcEEe3erS3cYRU5DHAAHvWMIurq3azNKfIlyWu9jPaxKBW42HIye9bOwvC/AGMjBqpYi7VN6o6qeH5tUtjj5tqlh0A4yO1XrmEYQlSDknFdEJJJOXQ8jGwrNSUNLmV8pwuckAkk9jTyuRsGRtByaqq42ujTC8yUXvLaxEz4GTkbRk8daV43C9SR/LiqjNtJRWg5ySbg5aER5LHOOCT70o3E7OQQBjHf3NVO7SbRNBTi5KMr2GRrwApyASSD2qRQIwcDOM5PrR8K06mNCMlK8tiEkIVz1YkkVK6jjBGSccetKGjcWzvlRlFpRWqV/kMC5OenJBI7A96cvBG/o3XHYipjGS1WpGE5ZtJaX/ATZwhTAGB+Gacz8Z69QMdvelTpyUnOXUirGEZKit2NZNuwOxOWB/KnbcsuSegIHpWqpyTujOU4zSg9LOw3YW6kHnAA7CpxGWlSRTjC8j19K0inKPMnt0MqVKSk4tXXcYqFGyc9B071bjULnPLdATUSbsu52TpSlNtPRr/hhgUAopJG4jI9KRgWOAx/CspyUZWsY0XJtRT1S1KrPlwnUEDgU/YI23MScDAHpWzUVFRS1FSpqTlOb+QqsVRmJwVOTntUBkTgBQQAMfhWSTTtJ6siVSHtIqKsr6jwx+UEg4cnP9KaCT82DjIIA7H1rXli35mtaTjJ8u1/yJVYfK4GQQCSe+aWPdkFsHaoJPqahQkle3U0hONW6fYYOoDHjhQBUm7AAI65PHYUVGo+8jkw1NSfLDXTciKuAxByu4Ee1PwclVwCBgn19KHyuSsdGHxLSbfUGOdvPUEn29qhLbiy8fMSoNc8KbTbvY1rctuWa0JhIyEZJI5HH1quDgqp5Y5Bx24xmuuPLy8qephQwrnHmT0NKK6aPBb7pYDms9GMgyOAOQD2x1qVTWilpYmrW5Y3nqWnbzMLuG5hgZPv3qErtQZYDAPXtURm73kOjQbg1T67jQ5LQgDCjII+lDlAoGcN6/SrpuDVtjJV5qKkndL9BuSdpOSSSMjgUwOWMZyBhgQT356VtK0t9zelUc1eWz/qw5lYLyxGcY9qXeCoBckHjP41lGk3LmkTKUZ8sW7JEQBX+I5LAc96kyG2rzuGAR64NU5pvkeh2Tw7UXV3X5l60LMpB5CnP4U23baNuwlWzyK5Z0Xz8y2FRmnSUW0myw4XcVBx0BA71L8pw5+6mck1MpcySsTOVn7r0RWMYVQB3bj+tSCN26NhSTjPfNdEpp2jexxYR8qVVq7v1IVgDbWXne+SfSrikrhWGOCQB2xUNOMmmz0qtRVHzpapEIt2Uqpzjkhh3qaecEAAHBJ6dq0pV3JW6HmV0qbTjG/8AmZrEp5ZYk7nIOKex7ZPJP61o612o9zelHmjdrVMjLAt+Q+mKYEVRlnIOSOO9ZxjySUVsy8RNzg1U+JjTIMBt38YAB6kjrTJCF4yflPX1rem4rWPQ5Y8lOXLJCTSAg4+8QcfQ1WmBYZD8Hg01B8ynex6EqloNEYZip3HlmIGe9IcKUJ5GOR6mlW5U+ZI82lSioe0k9dxGLbhkfLk/hSeYT8xzzIc1rCKi79zSvFqKctiMYyQc45A9QajkyhJXKgsCff3rNwSuo9TSGIu00tF+I4kcI5wxI5FRFuFByxEmQD26VlpzOKV2aUVUcI8r0b2HO25gV4wRketQDO7zOu7O3Pf/APVW0IyUWovc8+FRxm4TWtyUKf8AWc7gQMegNMEmRx94YOPWkqklFR3NKVNqDi9Hcc5VAp3HnIye9RPMzBQxyPT0rdqTibQdOUlKXp6g7K4GCQOpI71AHzzuOAQM+tOkk1zSeplXqck20tB5ypXJ5IHXvTCXO1TnPUA1DnzJp6GcKcacXN63OM8WsGWNSCCuWI9ao+J3Y3iqCcBe9b024U0khqMWlCWqexxjuu1V+Yg4BI6jNDHYxUdQeT9a44wimpI2k4KDjHRkLgY2NySuc+lMHDggEDb39a0bjzX2ZjTi07tXug8zI2rksCCcdwPWowQpBVsg8E+tYqlGSU09j0reza5nq9vIuwYdlcNjOATUloC3lrngEA/T0rCcU04vocNSlKaVRr4rmyhEYQZzzk57+tR3BbEZXvniudXs5LudlBONOMYu6PzsguI/lywx8qnHb0rjRqJQbQ2WznjoK/W1TXMowPzqrVlV9+1tT0DzwDGRgqWOTXCpqpI3FmJV+QK2imm4yMIw/cqSd2mz0eOaLHzHkgYrhU1UFBhiCAfxFQnaLhJGtWDqpK9jtppom2gEbsg57iuJbUmfblicHOe9U2oHDTpVKslHdPr6HXxSxqQGxnJBI7fWuLTVWjkJ5O89q0q1lKmpW1HhacqdRqo9dl6Ha/aI1Y7jnHUnH4V5V4m1LVDps76cCt2g3Bu1bwhzRXLoxYyrCcrNP1PVReQgqXkIVSSADwa/PvUviT4sgvXt726eOSNiCCcZA9KzcJJcs9EejHBylh06cf67n6I2l3blgysMqACB+dfI3w++KEt1dR2V5cAq20l2PQ9hXLXrU1q9jtwWXV6cUnHRfqfaZvoFVCBjALEDvmvL31gPs5+Xggg9fQ1zUsRTUbJHRjcp5Ki53oz0Vr2Fgd/B4Oa89/tYEud5POck1z1a0pP3dmdlPDQguaOjWzNnVCsgITA4YkDq1cvPfkYdnOCQCa56leo4ps7MNgKU3eW9rm9pUO6aIDJXcQfequiXQaVRkgt0HpWc68raI76eCjGPtlG/l28z6O8IgKkbbiGGDgdvpR4LZPJRnBGFzk965atTVLcVWcpwdRqyOm10hLU7T8v3sVH4gwICdx+ZeSe9elhZKSTkj5KvGNOo5RejPnLxAwa7ZN/QkgHt7VB4icicqW3DcxIA6HivUdJWsLB4uSm0tE+na3U1/Cqj7RFhyPmAKjtT/B5UXEOzoWyRj8q+fxdG8Uon1VLE3k3N6r8T7G8BM4WA7sEY696s+ABvS3JOGIBHtivna+Hla89Dpr5o501Ck7H0Jp0hSMc8MT+HFSWaKY1wwzk4A7/SuOWGdrRPMp4qpGyn1L+/B5JOCSQO3oaUR/xbsk54Pes1hVKPIwxuaKUueEdNLDfNBJcZJJ59s96VI8NzyRgmtKmFcUra9C4YtOXNLTyIyWJDEgZOMeoNTbSCnJBXI46dsUuS9mtzojyWdS2pAqeZlBkFmAJHpWkqLgdAVJPNZRqSSaRpVoSlacnfa6KqQ9gDyRjPerqhd4KZzuJI9u1Ep3jyRWpl7Lkquz000IwhVQON3APtVhlGSSSc44HYiuZVnFq/Q6Vh43vHdlYZB+Y5KNye1SgEBg3OcD65rZzbaTVrnHTmndQfvLuQtEpCkk5wfxqUoMKeSFbI9zUyUk3YIzi6ak90/vKZUMkZVQMHJA7U9+dyYwTk8VVOztJq1yFjI1HeGkkVmQFjnorZ471IyMOF65yT6+9dFGN9W+o6sozp67jVHzZxgfzqTGNinGVJwPrSV7Nh7WDlGnPRIkQbkUZxg5XimYYEBTyWBAB6Ypwmpz5VuhzpQUXOO/QtqmBuxkkDg1GoKnacnGOfUGpk1a6QqUrJWd2yyqg5xgDOeKZv2mMYIDMQSe9dNKk2m0zGOK5nabs2WBj5WUkhSCc/yqONw46H5mwB6VnWo2fM9yeZ8tou6LsbqoCpgElsZ7mqi8jLHDDOB60PC2V31NamPjWh7ujRbMoVkBJHQ5Hb1qqh45yVD8571hPCJS5UzGhiWrX3LSzYXPOTk/l0qArlUwcZYnI/kaqNJy95LyNPrbcko6jy7bm7FGB+tIhHKkD58gZrphaLuY4uqotKTtroDORg8ghhyO1TKqkhecEc5rKc1FqLR1+zcIurfQiUMWyCRk9qcfvhc+uPb3roUmoPQ8/EWlVhOTJA4+UMOWwMehpUAJRsco5BYVEqfLGyNouV3cnVycdskDnvzTHO0KAx5cAZqPZtysuwTxcnON9mWFcMRtxkZyD3qBCeuMHPfvXNyuVnHc2rxhG0rk+5SsmWO7cQD3WmAIu1jzuzkDtVVad1eW6O6N1FOGtx6yKCME5BGfx9ajc524xgsR16VnToupFxSMZ4hRak9C2sqZ2HADYyfTmqK7i33jwCQfXNKOB5YrmerFicwvNqC0X5s04sHkdSSD/Sq8TuhwrYO3k+uetR7JwaijooSag5SfYvncuGJJ5JA+lV9wKRknk5JP8AOueLndqR0qUYL2lPW/4F1SuxF6gHIqlHJlgmMcH8Ktwk3724UW3Sai9Oo9xliEYgAgnHf2FITjJXlc8n1pQ5uVxtoc3sYxlaW/qQumMKzZGcj3p6FWA6n5iTn9DWv1lpWkiKGElNvmd0V2j4Dltu3P41K54KnqcgH+lb0qs7WetzmrQpRXKnqiGPpsJBKNjB704LsPHPHI70V5RUlyLQVGo0+WTukDHGAM4OQR6YpERjyRzngDv70qcNORBRp3lzKV3f+kKrAqw5GxzkkdeKUgjBBIOT17VK5XJSR1OolJp7DJFyQoJAUgkDv7U7sucHGB16k9aqE3F3S0ObEUad1aWo1PlI5AYE4I7VKIxlepJyCPStFJzV1uXFxhdLWxC25XUpklXUgDsfWrAVstnqM5x2p1KrUrtas5PZRSck7JIrhCMYbPfPpz0qUYycjIJGPY+1ONRqCv1LpJNKa3YBAVUMcYPI9akI6A8ng/Wpi29Fudcrqraavp8hjLwUGMg9frSsu0vye4I9OKE3G1tWZ4yrGKtLoOKsQSOAQOTU4cbVHG5cHJ/SufEOTkuU6MGoSptS0v8AoCJgFWyCF6+tJ5rLjrktgg9qwqRmnzN3Na0qbailZdAjYxEkOWAboKQmMAsDkrkY9DUXVVpvRnVFSirpFgkk4DZ5xz2qo0u0Bl4O7ufyq5Q1utzSChON3r09CcOSQuSAeg9apwksRljngEHqa56tLlaS3Yk48vKtkaChsZzktgnH1qWIhQPmHsR60U6qatbRMKNKNR80VrYqyjAIY5YtnI7UkuGbyxk8gZ9KqFFxkm2cyvNXS1M+RmLKx6rwAO3rUknyjcMEAtxj0rppysrpaGlamoxUn1/ArPIS0fHPII9KgUiQhWOVRhjPbmqtFOzW5yz9o2tdF1NuC6DxsCSMdff3rLV9pZhnaT37e1YfVopppHoU8Q6kOS933RPOWOWTnOQQe+KqiQBsdieaqEXFKwp4P2lRyb0REVVCMnO7A+lDrkKFbOGJ9zXRTalJto5Kykko09LjXZdhZTyuBz39aazALg4xkdO1KEk53Zz1MOqdBq/X5lPzAh8xwRhjjNOEisEwMgk4I71rU5ZKyWhVChNRUovXdjWPQAH5wWJHb2prAyqpVsMD0B4NQk0uVPY2pVZSan0f4EJOWQYJO4nHeowXM20Egrg59OeMVtG8U3IyqtTkpW07i+YSwOQVBwSe2aftVtozwSMe1RzL2dupVSClUtB7LQeuCBtyAuRikVSpwDlSpA9jjrTTlF6bERpuoly9NyT5gRlunXHekB7D+Jjkntiqcnbltcd4yjaO/YsxXGCrA8hgCf51Q2lWXJO1uOK0cly+69TmlVnGVpR0saYZXkXHTOSPUVnxswLcADJBz/SsqlJqLl3OuhKSmnJWiWiTuG0kDJIqLcGXd0bdhSO9VyuTSZnWkopu/VAVO8jeTyME00NhvmzxyB3OKxqOTjdfI5KsrTcVourEMQ25GDgZP9KkByGcE7ccAUJuTUpbnoYaMYNOKumiIYXAzkZB496kEe0sSSQVAJ9K1lOKd5MjEqMqkZR0tuPUjsMAnvQpC4wSVUAcd6wUlPRrQ6HiX7VNLTuh+AGBxg5BwP50rZ2jJ53EfSq291BGnGTUvVET4PqcdhSybTtB5AIPNapxS0PPlGakoNaFZuCG5AGcgd896ezLg4U/eIJ9KzcnyKD2O2vFyqLn0SIGbZgZJyAeKRmzt2rgZzk1U6PKkZ+3aahHbqRLOedvJGScd6R/ujb1bOM9z2zWfsFJ3nsZRim+ZysvQtiUbRnndk59KpIxQfM2AWwfQ10KjCLVzqpupFtJ+60y25HygZJbLE+gqqCw3EMdvv245qqlOL3Zx0qy5XCKt1JfvYO7uDiogfl+U5PJrJxSkovZlwqSjT546llcuFAIALYAPeobd88845AJ7GtnTkm7PQqE42WmpcRMkkgnBIA9M9cUxpJC4IJ2jIIHepp023ebNXWnFy5dXoXVIULkgEnt39f/AK1MUg43E53A8dhXTTUYxdnoeRicw95RlDVdSQvuJUkgZz+Paon3dS2XbO3HauZUY2u3odNDHuTclpHaxYE23YCST0I9KpHdjHJ4J4rj9i9pPdnQsXGacILaxcMoO1iSfmI57etZxkZcBsEE8Y7V0xouKS6o76c4uCknvoT+eS+PXJIPfPpULMApP9zA57miTi2o31OSOJTd5EhYqAM9eTjviqbOWAySDya0aTajJfMujL3OZPrqiZmwccFDgkt3GOc1V3FtxJy3Ckj2rnalazBpOSdh/m7txxgFgee2BVF2wNqgjaSQD39ap0na5GEhyVFTl6+pI8mVKvxucAY71FhuhJzg49qceaOjNqtJTvGMdfUV2Dk/NnaQcD61UZipyCCckEetdUrxinDVnHXmorml00JJJQRtbOA/T3qnIxPOTvZvy9KUIptvqEYP3FHWL3Lc0m2NOmCygk/WqTEsFznrjioowjGfNJ6nZKq/ZOlFJIl3b1LcnDdD2wagV8qOCM5IHrV81/iRxYVxhC6epK0hwSXYMuSfeqsj7GU9dzAAema1obWRWJp8z556Wf3k/nDjnJAJ4/WqW08EMe5HpVRlFtxXQ4akpRbb1vaxakbp8+D/AHfWoM7lUdWBJJ9TWMajhJdj0as4uPMn2HKx5G489RUHmglnwcbhj2reKjNrojNLkj7q1d9S1kDB3k+XkYNUJJiiF+w3Ag+1Q053SVi8JSjGfPKWnpscPr1wst7J12cbcdaw9SuDLcyMzEl3JBPbmitTaScjoqNybSjZPr3KjjPzdRgEA9qrsSTySM+/SuVSbaZyxdNtKb2Fcs44znIBHr9ajEoUbdpLMduampUjzppamuFrShBxT06CKAXVR9zoQKep3EAEjawBx0HvWkff+DYiqlGCdTf/ADNOyAEsaEZ5BJH1pLaUiePsuQQa469FyhbqPB1GrRUtOxvBI3bBTBViQT3xUgPQoOcAMK5X1kjow0oQScnd30Px+8w7QQ+Tu61zA12z2At5ikAjO081+1Uabk05dD8+xuLcYuNJanXLcBmLqCMEcHv61zY121I2nzN4ZQBtOD6mktEklocUKVOMOaOkr/idQ1yd0igk/ISuOgrnV1q0/d7mddzADg81zVqfLG6PSdWU4pNaPdHRJcEqCGOM4bPYDvXNDXYEJYpKQQMHafyrVxm/3iRNGjFuMWvdWp1SOpC5YgHOAO9ctFrjSFfItpWRiRgLyMflVunJK5hTlecpcuq/U60fMEzKxVVwQejZ9awE1GXGVsmzIRgN2qFU5LRuehTouSVRLRL8yLU/B/h/WHWTULGN2JGGAGR9ar3Wp6ntjENsvmhyByec+v8A+utJ0Lu0mceGbw8m9lLW/Yz9R8FeHf7Pa0s4BFJFESGUYOfqMU1otbnEzXV0VU87U9vWso4dU0lHW56FfNKs4OrKXKo2t5+Z5npvjbxVp93NoEUAuZYHKxSMRgAdCazfDCh/GtyrOW2MSVPajMKEMPNOCvc7crhOvh3iay228yHV/ib4v0S6aG7t/KIYFQRw2fT6V75q3hXRddjC6hZq42gEnsMcCsqjgpqo1c4quIqVKSpRhyvujxfw98U9Y1K/ht7qRWjklCBQv6ivS9C+Hnh/Rrzzbe2DSeZuTf8AwnPauWulZKK17nqYarRjHnlL3r2t3PaPDDG4Nu+9gflYg9h6VoeHI1jdAgO04yB/IVwTinC0fiO3DU54eMnU6u6PpDwiqrBb5Y7cYAHrT/CYCxRktkIRwfwxWEKSpO7erPLzXEVa8U9kvxRreJGK2pGSQgOQe/FUvFDSNbOVOR8wGa78KubTufO4iajJNvXU+dNbmInlABIL547+lQ6wStywxkhiD716NSCskuxtl1WTTfzOt8HODKHAOAwyP8Kd4PJEsZHC8HFeDXk6i5UtEfW0cSlTTqLXv6n2d4BZykDocRqBT/AS4ht1U9wefWvEcnKThExr0mpe+tGj6F0/BSNQR97HHal08q0CKoJJGMj6c0qdNJWR585Qho3ddDZXhCACG3EkevpUY3HDD7uen880SppvmZkqy5uSOn6gPm+bjaSBz29akjKq4wvqQBUy0hzLcujBOXLUeghO1gTnA5z604kHAXjGAM/WsoxTXs5LzuZUFB1WoPXt+oE/ONuccEgUz+I7jnP3ge9TO0aajY6KFebqNRdkt/OxYHIdlY4JBH+FRKclgWYsT+fpXPJSaVjvq1JJrS7LGDuJXALLgZ6D3pI8vn0AIIPaqjSilyrc46tadSXPF+6unmhzr8wbvkHA70gkI2jkKRgAe1Ryp25kepXxSVope9bcjJ2ooY5Gc/U0hYEdPukk++a0a5ZpNHl8suVyTvZ2IyuNrNjJP505gHH3sEDgjvVpKUbpWQRpxUlFP5ldlySc4GQQR3FGwOWDEkKuAOx9abpRgmkWpOMo8r16kjMS+MEKrKSOw9aArYDIOmc57msXFxje5Vamqkm5iA5OMYqQZOeBkEkEUQgmlFbm1eSpRUm7dBFJaUcnBGAB3560gZhGspOT5mAfeqUZR92xiqSio8z0f9XJdmXG7JD7cY7cUwS42YPIHA+gpUKjWkTSu6cEm1dq5d2gcAEBcEZ7U1cLkHJLKCT/ACrR3dovYxnUUaaS01uN3bU+XJJJyfSgFQR8xO3Ax6ZoqNuOmtjVxc1drUmUArlWJIAJHpTQSCoU8GTBArKE0pKVjZ4VqPLJapbixnpnOVAbnvmhnYuMHCgHIPf0xWnJGKvHRmWFTptKTv1JWGQhzjJ7d6aJP4sEMOoHehwvK6dzrnVuvf2uTopGSx5bIJPYdqRGO913E4AGT3qKjb8jmdRU05xfNfoKMKSW+8AfxpPm2shbJbH4YrWMnGKtqefiJNN1LaCnJCAZ5OSfXNMCEgBjweOe1beycHzHDSqzneUl7pOgb5sMSBjOe9Io2kDJy5ySO9YQxElLmi9T1a9aKqQhL4SaMBkY5OePw9qYm9zt3Yx0P+NZVJK/PeyOiDj8LV09hxVVIkXABABPcjPemMr+XtbqM4A70Ummmr6DqxVNJQ3Y6Nsg4J6457570qgp8meCOG71naKunsKhByp8lR+9e1/IVAzFRyMEkEdqchEZ2FiSVAz3p1LStI0hVqL3JbRGhsMNjk5IB9j6VJ644ywJxVKnGUbtbGkqkqUotat3+4lLlgqKo+8cn0FNViDuJOBzg965nRTd2dNOu2nTjt/VxAcDg5YNjA70mQeB6kk+tb1qcbtrcxUpSsm/ImViF25zuGR7U2PcUXqApHI7+tYzSTbluXCnKyi3e243kY5IIODih2aRVKEEE8471nCspXi1qKMFBJU3ruSMyMMFc5cg+1I6q2OTjj8aKb5Wmma00m5KS1EXe2AORuwc9qdu2tGnKtxnHeqliHOLclsc1HCOMoxbvcCHUqNxOCSPerO47csuNpYYFRCq4tuS3IxeHUYxlSWqZTJBG3J5OCT2phQZKgkDJJPpXXTpxTUkwq1LJJK6e45iOgwCuBTGB38cruHPrW1ClCL0dzDEVFJqDWhNC7OSS2FABI9aWJggKNySTk+lRWfK07HTGnTjJpPtYk37+QDtDZwD3pg+XG5+eg+meKynJtczWqM6uBlOSbdluIWGxup2knH0p6jf8w5xgEjvmqlUd1LqVKnFtJrR7Bvy7ZAyCMj61Y+wzcOq4STgn096csRFpNFVqFWlVbkn5FbksX7gAr71oRadNIQoYdDyT0rOeIglcmhRc5OTZmBsgAAgLjhu1bE+kyRxgiUGTaCwHas4VoTfK9jTGKSh7RrVIxZG2oRvxuzknt61ZW1nLhAhLMQORWzipNTtsZYDEJpJIpmXCqGI8scDjritaPR7qXJf5dpAzxx9KHOEYpo7XRrTd+iZkJJyepBGSW/pXST6MtvbtI0gbgHHb6V5kqkZS0OueHnBJyOXBAKvk/IMAdzUMhaPHBBWQ5rodJuKilrucLpRVR1JbWN1GUW4JYgngk9qyI7n5EQcjIPPbNcapyhNtvQ9CNanNRUFY11IYkEDnBH1rMWcjHPqx9sCos3K973NuRQipImlILHOSVAOfU5qo8rMuVzhTg4rr5ZRg6a3JdSk2nLe19RrY3ZDAFeMeuTxVEygnaxOeQAa3krwSlucHtZ+05o7FgyHdyeN3OO1UBLkZbIySCD2rR0m3dk0qyp6rV3LPm44BPLqST7elQNIdpCYPykjPc9qmMtbPY7sdh0oKrDd9CfewwV4DAgiqjSMzJyQM4OaXs7tz2szhp4tp80Xq1t6EkzcEjpwPrUWS2PmyCAcHsaamkm2zCpVtSVRLcjB6kE4JGM9qaykL0J5BGO+a0Ti1oXSrODTe7/UduC44zgjGO9QMcHGSCOQCetYKyaudDotwUdldkjqwwS2AScZ71EzjB6nClh+FbUpKLafUmpJO0Y9Nx4JVsEkfKOR3pqMOBnAAAyexAp86XxLRDpxhJ2huix8oVVRsEjI/oKjZgCo7jB571nGnzO8WaPERUG4K7HIQAT0yTioDICFySPnOc981rVpyWrZhSqxbSl03JWcEKBzycEdDUIZR2zswcetRTqx5mkhSi3WU09Nl8yVpIwdw5YYCgdqjIAdWB6cYHaqUW4plf8AL32cnr3LLqV2duSP5VJ5gEah2yXJAA78VzynOE+Xc0pSpzbbWv8AkV2fc23oSWBB6qKljOX64Y4z711xcYRUWZ4vD8y5oPcmjUk7cEhX5Na8KjyxwAeoI7Vx15yvbqdWGotw5uq3MsgkkZ5YEZNaEtsVYNjGW6CnSa5FzepzVKf72MpbGSPmJjAwxPJ9BWoLZV+baCQxJI/QU51opKVM1w8JNyU9rlQP0BU/eAB9aSVhHtw3BXBPpz1rJtN3R03goJ8vcrO4XcMEgdcUjONjADOCckd666U1F+9sZ1qHPTSfUriUD5eeTjPpUDRliWOcMcLmj3ZWs7ESptRtN3JfNwpYMeOM+tUww2sjdDyaKcEparTcwpVlCm3HR/fcnMsRUZyQR1PvVFmXc8bjtk0SpptTZvKS5VNehI5DKuHyp5OajDKF2kHgkiuu99d0cFOpG3LN2TuSoRjBbjP51QebGccDHJHb0xU1MO3FST1uaUsRGKcFqrdS40rbJDHgZBwfQ1RLs+FwSEwMjuabgoSTkcUnzxcXorGnFMdgJYDOMCsty6AA8kEZ21rCEebczowqRinG6t+J0EJOAQTyQeO1V9PvApAOcZAGe1OtJx1Wx2ww8pSTgacLmQsmPn2gDPfFGdspdc7uDgdx7VyKsnaUXZmrqTlTUUrskkgYECQAsDkE96madTGPMGXzgE0/axSaauJ0pSWitczXYoAi5OGAyT0okGSHBIQkcGuiHvNSex51aHJFtbiOcsHkc55znv71HIBtAJIIwQT/ABc1sopO7ehy1pckUnFsG+dNrDg53e+e1IFyo2jDcYHqa5rQi1dbndDFScItrVMRxnf1BkQD646U/nrzzkD29q6IaNLqaVpprmkvdZCg+UDngAE1JzsyScnGM9qnFU4xbinqOnVThGolp0IpB84OOVBU+nuad12AsQdwGamNBqGu/YUsanP2c3ZX3KrI2zCsdyM2M9//ANdWpFXOM9M4z3rmbXKlJHX7aCnyxleRlBSeeQ2Qc1dKAhccEHJA710NSbvFWaKrYunF2nquqM84IG1csMAk1aaNc7hkk8/WlJSS5luYwxMIpxhsZu08hiTg5JrR2EBj0OMAjtUzblJPoXCHNqZ4jLbhu9CR6VY2PJvKkKzAgE9WNEaLbQVqC5/de2pQKguhwR1/Dmr+3DEliDgj6VUIy5OZ9DH6w/acr1RSERBXklS3BrRQCMgYJPI596It8raWpo4QcYuL0uZzW5HzYG0kcelaDAkLggBicA1TqtySkZ05x5W7Xa2MrySNpwSU6+9X1HmOQPvDAyaXsW1v6Gax0bxilru0Y9zERDM2f4CPp61oXUZME21TkIcZ712QouU+W46ePlGLfQ8LuWCyzE5PJ61NqcFwjyNNEQQcYI681lWoWd0yvbzkkpLRMzy67E4JJxz6Vft9Lv50QRWxKycAn0ry3UTbk9jtnUk/eS2/FmSzFQAxIycgj2xWzc+HdVjj3SRBY40JJ/z6VtQtJ2Z5s8TBQTTtKRmxThiP9w/jUKQGEJycgkEipqNJOMdWd9KCcPaN6mpHKFmiHTBHFVoXBmQ8khwCK5vZu3M9i38MXHVnYJhEDPncQOB29KroSVXLHCZPHfiuV0m2pX+Rm1zScLXZ+OMbRNlTFkbht9vrVaI7SjAAqCMZ7V+uVKSbvFnyf1xxklJW1NcQI44ABdSCfYVHCWK7S3y7jgY7Vnyyi9XoaVP3ick9x/lQgbmjBCEtlugyKZLcRRgBmwSCAB/Fj0rpp8y1toYKTd5Qf/DljajjgjbtABP8XtWaJpptptkxtxnPGTU1bOye50UalZv2kVp+RoG5t4UO9sbMYCjnjtVe3tcsssxLEsBg9qzVRpqTWqMvaOScpO1+pOss16FKZRE4BI5q8rD5ducBznPc1vRqO/Mkc7qezbp7pL8yLallGGIz1yfanXkZltZFXO4AgAd63pxhz2lu9jixmKVOCrpXjbVM5e98Q20huNswAEZG0kcY9K+T/iLrd1FfTWEbhWV2AdOpz61eJi42cnomZ0069K8VpL8D0/wSxm8a3rnlixYE9D6CuW+Csk0upn7RIzuCOW9CeledmuO9tUimrI+py6g8Plri3eTe3l0Pr2IsxySdpbp6VHGUUrGRxk4HpXVG6V47HFg5TdK1ZaXLccana4zljk47U+KVVVsKQoGAD2qKik2mzDDxilKL1ffsdt4fOZYs5Z93U9TSeHsiZOerA1x1YxSUmdmCnWnpUWif9M+kfCuVgQupyD271c8MBfs0S44KYOfevGq4lynotDrqKpCLcpX8vUp+JJGW2O2QncD+PP8ASpfE/ELKVA2ZII7CvYo8tuc8GXNWbprTTY+cNUB+1/PyUJOal1RQJTL94gnP9a0rSk5Oz1O/LIRpRtDbRfNnW+D0DTRFem8AE/1qbwahEkRbIXepx6815lpSlZdD2/rSqUJRkrNH2b4EU7YNo+UAc1e8CbfIgCqSMgn3zgV4NWTvaRkp3p3lse52LBIo9pwSF4/z61NYooiU9NuOT29qxlHlmk9jgr4hU6Sk9i8r9Mk/Mdw/OpjGB82fujgCnKUXHXQ5Zz5mlHW4vPOeCcFQPrUAJHy7jy5APcVMlFpKJ3Yec1UdOfbsOO0MCSd2SeO1MAP8K55HPp60Ob5rR2OSnUpQknNakitkuw6jJ57mhUBYEMR1H0rCfKo2Z10k2m5fImTnkY5IyfWhI5QyHBI5IFTUjK91sdTxkWlZe8iULgZHXdkj1xViOyuMF0DMu0MCe2aTrq6ZjTpScrSWt9Co0gzkr2zj0pTGVzkEuMYB9q0dJNJxDEYmfNfZ3/Ij3MTwuRuAI/rUbF90bJnbvYEHv6VlKNm5WJnUUpJxeg9+gK5LbiQDUfuSSCw4PfFawlNp2ZMqsJKMeXUaDypQ53Nxn680qPlj+Y9sUU8S1Zdiopyny9WWMgHnOR0A700uJB8uchskjt9KUJufqdFaMlHli72F5cHBxxn/AOtQrYXkDPQ0pJX0MKzfIp1VeRGwLDIY7hg5z0xTmchgAwAbk4710ULQV0YLEqrHllsL5eTyRj1pFbzI8HG/nPoPSuZXjLXqa4jDudP92tv1JsALy2QM4PrQzjYCc5GMAd6IV00kkKrl0akFSlLVD42DbFJzuIOahRtrfIThgAQO9bbu4qENWpS91dCxxwjHDbSSB3pgcbgTnJBwKyUG3puLEV4wkpy2GAsWHzc7toFEbHeuTnDNnPauiq20la7LjVpu0r/8AsAhQO5w2falVcfcOQzA59fYVypNNStcdWrTqJ0YLWOt+6HJkBcZzggk1H82Q+cEMMD+ZrSpGU1ZsrnpQsn1LJIYLtyMZ5/mKpRksyjdjBBx65rVxik7vQylUlU5eZWSZa5B4YkNgj2FNUYcfNgJxz3rJuOlmaSm5+7FaE29CFbB+UHPsOxNRgYKrk4LEkH09KipFJadCKvtJSjBx17k+4qu7eQRknHekVODgkMex6GsJypynqz0aNJqnLTVCh22jzGwcce9Em0gA4LgEjPpSjytuSR10cPOVKLm9EKxyAWbBBxn+90qMON6h89ARnt6VEJSSZE6aavDW5NHIwb7pJwMfh1zTopF2fM3OM47gVzQr39xdwoUkotJW7IeSOApHyjv+lEarJtZRhepJ7810SmkrxZGKgpQ9lPR2vck3ZXC5IY4H+zSJCxdSDjac8/rWka0VFqRlRw05xSQobBAC8IQSD61OI8sFPJLYJ9KwjWSTberBRqSTlFWSEORGxYnB7Dufar0dtxuycLgEHt705VFZRZ3UNY86W5lsGjCqAWycgelbO2JT6jGCTWUq7k+axpQoSVTmj2MoNuZCVx8pJwehFXVCtkAfMAQD/SmnGMuZrUuaU4v3vKxWLKWjxk4emt8p5GGDdu1ZxjomjCX7ialLrsSKzSdckA5INMWQqAB1Zjn3FVWpKLSih8yk2nuKU+8BgFiMAduO9XURHyQSAzKBn+Ksni0nFx6G+GpRg3F6oq+WBlcZ2kHjufStJrfIX5sc8jvTeIk7cxlVoRS5YbbmSV3K6knklR7EdavC3jQ5JyxBCk9fetoYpqTl1Mf7O+sQ0drFLaGcZyWbGPwqZ1AYbQASowR29cVftmlruH1WULSvtuRJLtdmBx0GPp1qu2QemSDkA965OaUGl3O+olKMWt1r8ju9Puba8geOdwHIwue/SuRtJ3V1IOGySQO+fSuapFtprY7KdRyTgjdNv8AZ5GeIk4xjGeRRFcnbznaDknuaU+bm5UcdRQjrJFeKUq6tM7AKSM+lP3B1JYY5OM0RqxbsaxTUOZfCdjZDSbiMmGZfNVTgMOvA6V560ktq6EEhSRj3rmq4WTauzbBVacKvMom9fm4jc+W527u1ZouzdEKzHa+SB9a7KVFJXfQ6Z42VN8kFe7Io7mcF1lJKOMEE1onT/PQOGHyhicdqz54r3W9TSpKbkpTWjOavIkwXCjIU4Fak9qhjKs2GGBzW7rrnV3qeRLLVGTnJ6dEcc27KEtgk4A9KkniZXk+YiNSFwPcDBrvcE1zLc5JuKku7LCMMLyS3IHuarPKV2Y4IwQRWFGlK17WNfauLcWwlc45yACASKpPNsAG4nc2CK7qPLFOyuzgxGGk4qTYhbdzjBLDOfSqzv8AOFdshsdO9KfvKy6mf1majzqV0PdugDY3EjBqu0mT1OMgj3qdW+ZaWNnN8qg1rInEiphe4HNUi+XB3Ahxgj+VTCCacpFUIVItJ7I0A+VBA4XJI9aoxvuBGAQc5HrWdWpKMUkdsKCbkkrrf7y6JQ3sofAHrxWY0r5PJOTwPSt4YeO/VnHJySSa66Gn5pKKCcHuB+tUDMV8sMTkMwBHeiFFtXiyJRcE+bo/vLp2lSuDkjqarhywQ5I+bb9KzUmpKT3R1YafO3LZNin58BThgQSD6YpTgjhiHU5zjpWlaOqstGVSgoxaj31Gqw5yvKoQAOnNN+5s3ZLE5ArZWa5Yo5ocsZ3UdyXdkAsM7ckEetIGB6nDA5+lS0tU9EY0m5tpb9xGI6qRhTjj1pXj2AYPJJyB3pU4pPmb2KqUVKag2ORSQMkHHQ+/pUQJLZBwSx5P86zcLSbeiOmrh4qUe3+RdVFO3BBG/kiowwycYwVz9PesauId03qjp5Y1KijHRomaDCjeQS2TkdqiklLKoGQRyCffrWsaalJO+h5dSyV4x6kkRVMd+h5qg02xim4Z2ZB+tEotyvLY9GNeEKK5t2bsV2oZsMQeBg9vrXNfaMNlDztOSe/0rnqQjN2TszaliPZNSez0Ose93YHJJx+Fc2s5UDLfeOceo9qpUFBcydzSnKE5cmx0qXgb5m5U4UDvWBHMQu45EeRgenrWSotxb2NliUpcj1RozNG0hwSMZzWVJchS/BJB5A71vdJKaMK1CnUa7PoasbJGmNwKnk1iC6BGHyT0J7CorPmXmRBOL5WtDWuCpWMLjJ5BPpWJJdJ0Zm+ZuMdqum+XR6mdaMZwSbtbWwsrFQSi7iCSQO/0qm06cbWzyScV0U5y579DjlThHlqN312GyyNkAEk8nmq0jrncVB3HIJ7/AFq5RTjd9DOU5KtzW91kpmPK4BC8Ajt61V3rggZ4PbvW1OmormW5NSSjLlT0JGJyoz1yT71B8wU5YnJJyOtJVly6Gsqfskne5MXY4YEg8AkfpTBk7OcZABJ9vWtXa3N2JjJ6qS1ZZjDFWxk5znPao45jGM5ydwJ96zqU4t3RnCXIuWa0NO2A/iUEqxwB2qGK4UMNygZJwPWob5IXT8jRwldKGydzoA5j2kAHBGSO3GajS7jnhHGD7/pXHu7taji2rSi7ptkckjOdxzjsfemK6OMKxChiDmtKUoxTSNq0JuSjN6khuACpOCARnNVJIj5bAHG1uD607yUbXO3DUE5c7W34l97qLYqLgY4I9K5qTcpfDEBlIJ9PeumlFpcyep5snJ1rPRG40nygocKWAFQW7lcHkjb09OOtVQundq5jiUnJpLbQskNgcemPald8BSTncoGfx60c6eqXUzxEVGUacmRg5ABBOTkj1pxKv0IHQ8d8GrrzXNqrM5YYVu6g+ZdfmMQ8gYP3uB6VKibjtAIJU/8A16axEUnK2pp9UTUYw6ETAZBJwQQQfXNX47dGC72PBzkdqJ4qC90mrgZp+1irWsUuFYYyRnOSOv1rdW1gcADAPWuX66k7SPTp4Wo3eBzyjcM44459a6OPT4skE/eGMGnXx0JP3ehlSwFZQstGczIg2rknC5JIro/sCqcucqGAJqPrijG/Q6Pq0rJSepypT7ncHJGe9dp9htAFbADk5x7VksbFx5kXWy2rFqKdji0gLkAAl3bAx2z2ruY4rRQmDzuJBFU82UanIkZPJnVp87fvI5ePTrg/dUndyDjrXcI4jZI4lJwB8xrjp5m000dscoUaWjsccNFuXClhg5AIPQV2HmfvCHJ7k47+9OWPk3fowqZRCnZrVr9TCtdDjgIymWKjJPeujFxGSoOWC4OT1Gf8+tc1TGy5bs9OlltOL9o+pzF3o0Z+WM4JzkHtXW4t3IPQ8gMew71VHGSWnU48bh4xipyV+mh89eM9IkjsmlWHcUYMSf4fr/8Aqr3DUbC0mBS4ClHByCOG44r0P7TVkpI5Z5ZKSinazPn3SNbsPs8MTSASIoUA9j7V2+p/DvSrtgYl2O7kgp2z1ranWjBJ30OHH5XOMlC90+vYwb2WN9Ouirhv3ZwPftWXqvgHVtMhlksNSeS3RSWVuwH+FdFPG0pOy3MaWCqxcUtrnlc8g84gDgsTgVXJaOQLIQeTyK5K8/eulqjv/hR3sm/vJUbbMCufnYEmooz5cqtkkZBOe9ZOcoKzZyQftJprQ6tGKqAG4ODx16VHbkPGe2WwfaudtXSe53Kg5z9nF26n45GRECAS4O4DaB1+tWLeFEOVBypwM1+muVnd6Hx9bB88fZ82noR77ucsIoygxncf1rU8iV4hKhJOSCB/F61rTrxi1FEVsLKFLngvnsUba0QMGmkZnU55HStFVJKlsk8Lg9TVTxSqvlSsRQwtSlKM09bEybS33s9Af8KWMMjE7c4bkD9DV1uWKundm6xEn+7itbomjTo6EgqxOf61fs4txjTYScszZ/h5rz62LkptpXOmlkyrU1FSs07mcoKkdSMnI9a0ri1WEMxJyQwANdca/tIXRhWwboT54LS+rM+7IFvIcHd5RPPb60l1nyHHWPBAPrxWsWoyTWx5OPjLERcJ9drdD5C1zw1Lqmt6jdMAYYGY5P6CvSvEXh+8t7K71KwvChdWLowyG9q9Ws415xSehvTc8LglCMff8zjvg7CYdYvIlOSjkZHb/wDVVr4PKx1W7kJy5lIYn9a8PHOKrKK0R79H2ssClJK76s+n1zJhlJG4YJ9KWORNu1TghxketdGGm4y5II8jE5fKrFRqS7bdLFqIlXgGeGfaQf51BE53DlhuOAR2q6s3FNRKpe40oy62PRPDRJuQ3ZWA+pzSeGWKSxHDD5+g6H0rz68eaPKj0cLTqQrc0p35tz6g8NqBBECxwVBA/wAaoaDdNFZGYZGxeffjpXmqd3eWhwYzFuPNGPwph4p5jAZgQSRxXmHi/wCINvCskM0LgDHQHJ+lerGTg+Vo8mSU2qq0dvvOG1NgZ9jqSA5wB7Hg1inV7TVpY3t5MEk/Keo9a1q14zvFOzPTo0nRlTb1vqz1jwaA08KEk7yCCTwKueDbCbzbZUUkrjg+9eBVxKi+ZM+so4aVnGWl9T7D8Cf6i3wDtAGQe3NbPgTT3W2jLkgrjHvx/jXlVcVGbu3qefjcvnGCrS1R7HZMAqp1Py4z3qO2JwmTj5sfX3rOM0oK6PPxPNKTkvuNYSIVJBOFHUdqnjtQyM27BUYOO9YyrwepGEw9bkcpK1ipkuUGQAeme1Wba3aaRcnkNyOwrOpiIUkmzqpUp4hOa22I1XJAOckEAV0M+nD5kRQOSAR2+lYVMxjJqR14TK2qU4tXa/EwAAMAjKliFP8AOteLSp8puOdp5B6c1UsTDV3OXD0+dqCi7I6DRdPjlXzGI3FcFiOvtWnYoLdF5J5AH4V4NbM5p2Z9TQyqk4pR3LckCrGERRjjJH6VbXG3BOWC5PvXNKvKMXrudqhTlOKk7tI52506MguyjcGOB6VrMAG9QcDiumGMkknBnivDKVW8lpe9/wBDg5NMYMNmT3Of1r0I2iBSzchc59q2WbNTbeoqGWU1epGNlc8rksJkIOCAvP1rtbnyyWC8d+e/tW1HM23quphDL4OfK91f8TzwqykqcqQAAfStS9iCyZGAhxgV6qxDtdo8zE4SMLuDM+PIjxnBBGSaA3CqeckgZrZVG5KMupnSwnNSUlp+o9lUDf1YqFyPamknaoByd4JHrzUJuUnG/ma05OC9pJf0g8s71PVcEn2oDFSQegJJI6CiFW6stjN1FztPf9B6qSHA/hIOaI3UnaT94BQT+ldKaVp9hunNQbT3HKrDA5IxjNSqTjBGDyBjtWaqO9ktzjjTpWi1/wAORrjcuP07UgYITu4Bwc+tKpS5m3FnZSxNo8so6/mSsqjGcgEkAio9x2qGOSWOTTnNKSTRywqODTpoUYIAGMOTknrmpEO8AKCFAOWPanKz943puLXM426seHwIyR1Uke/tTlBVUxzhskCsXNK6e5rUpRlJWd+YiOHZccDuKccD5ueMYJ/WslWi/eT8jZU25KDj1JAgBwSSFUnnvT1O4qMcg5BPbNYO1uWW7O2onF8yVl2HooZcgHLkZz2prZXOCSJGxn0Nbc0ZLmiznhTmm4taDtq8Z5OckelKI8nce2MD/Gl7RNcr3OZ8yfNPbYepJwCfmyCfamLuGTnOT+dZSTaUWtb3N8PB04c17p6WEPJwAQcjr3qwudufTJ+mamM5JuMtma+w5pRcdv8ALoV1TLEc985q7DGWckcYXg+lS2owUb63OiF515W0shiW7beHIOeCO3tWvFsCDt6Z74qalV007as6lhVL949irDGQoyMtkjn61qR+WxkK4Vidwx3rhnW5mro0hh24Sa0SM8owIbcSxyMHtWt5MbMBtJYYOPSrWITi29Hcc6UlyQjvv/wChbKC2CM5IxmtkRhfm2gk8ADufT61hUr68qRtHDyV7PRmVMZFIIjPykAj8f6VtkAqcjLKSCf5U54ltK6KlgoU0nGWuyOceeQEjaQDggDvmteaJSVAOBkkn0z/AIVdKspKz3HWw6jT529TIf7oIyr4wMGiTfnB6ZIHvWlLXRnlSqKatC9kNkQTKoLkkEEg9RVQyiMlSeQQD7+lNKUHozvquNSMVKPvEpjC43PkL0FZtw0mfvEbScY7Gt7zvzM5X7NSUmtTSFwsTKQSRG3AFYBkkDAEkbWwPaqhhm46lSxChaK67nRvf4O4LgFSAR2rAeduADj0J7VlRoK9pHNPGzvyw37nRC8BRVYcDjjtXKLM4Hysfmxtz/WqdFRd90awrSqNRkuVv8TpDcxk9SDziudNw24BsgsR17Vq6bvd7GqrKFNNa3ZvM7O7EA7SQM/zqSxhFzD/AKwDDAgVz1qlmopDwtR1ZKaWqGp1yHB5GPaoJ4zaHD5yxODS5pStyjq2jepPTU2oZipHJOSAT7+tZ39owrGFijCgEZx3NRCDneTQ/bxVpRX/AATfR1JUMTjBOaoWN7DMxEoxuwormjBv3ktT0qE0p36W/EsXEKmNixyCvGO2a0LhEaP92xPOAB2+ldCqpxTT0OarhrxvAo2MKRDDncTnP4+lN3mMptBIyCR6+tc1WnKTvJm2FrpVbNbfqbkTBAPLP7thwB0561kx3a4O44GQWA7cdqmdFN3ktRyxKi+VO6JdSG5SwJBbIzWXd3OSoLErkcnvzV0aCU7NmDryjeS6mFdjYCpctk5we/qKq3Kl33biVBJHtXrKKUr9DxXU91uKtqVWO7B5JxnmrwhjERBkJYEZIrnU4zfKup1U8POatKVrHP3T7QcE8k7Qe9T3g+6wYgKxwRXXh4xuosWIajrukUl5dRt+ZiMH3pgcORyQM4OO5rbVJw7nPz00uf8AAi3Y6nK8AUjkFSu84JGPanHluoszqU1GCqN3a6DE2g7RxtY5z15xUWT05A3Z+madSo0tdyYSklaS9PmWjKFVF2/dIPPeocuVBxgdj6Vn7Nyk7vQ6KdRU4Rk9xHkYx4PB3AE+ufSoGPy/MME5HHrWtCi3JzM8Vi4tKEVZstBzuRC3GcYFUzIduOhjwCR36VElBuyeprhIttWd0tDXjlVQU9RwfSsdZQCAoOAwIB71Lm200XFPmcWrdbmyZFYFlbgkHnv7Vmxyk4AIw4Jwe9Em4xTRhVpxqzTi7Lr5lszrksSSAw5FZznAGCOcZA7UoTjzJRCVapJezjHbqaBuB90k7jzzWeWICk454HsK1ndryLi7x8+hpiYEEF9y4B/PrWZub7wyAD0HfmudUGmk2dEU+Vpf15l5ZVJYLlVTBBHXms9HORjIzknNbTSlFXOOlQaUlN3kayzgZ6neQCPSs9SUGAxy2c+1c7pxjJWOynOrTptSWhfMvCgE4B5PrWcSV3DJPTB9a0cm1dLUz+tQSTehLK5PzCQlSuQfSqZkJyOgXBHvW9PRJM4q2IVRpSeutifLnbye1Mh3OwOSM4z747UOkk7M6edSUbvRE5Zx5YwTgYYitKGId+xwc1g7pN9DppV6TXNLczvnIRVzhgcj1xWg1sQVdSMc8DtVUnaLkefOhG6k3uzMAkcliecnFX4do3HsODnvilOsopRS3OyGHqTThUfoZEiybMAnIzz6VvhFdRk47n3qoyXMpNEU04pXlfc59WlLAbRgcZNb8VmVYFiB0BI7+lONaN7JbHNNTleTe5gNEwLEfe+X9K6w2aEcdSSS3rWVKvFq8WdLUpR9lNXVmcayMCTkgk5IHet6W1C7jjBAIx6mumvXcUuVEUaVOVpTbTMAgMw3n7qgY9KuyW7ZO0ZPf/GpUmktTWrQXPzW00M8udyHGN7A4FXvsUj7GAwAABjsKqHLNq2uuxy1Y1L2j95SQOpQlzjPK+ta0enyN8zEgHgE1TqwUve+ReFhNtuPz8zLSIht56K2R9a3BZBASDwWwSO1VLERkkmCw8pSbWlzKhBBG5RjcTnuK1hbxrwMZIP/AOun7ZNGUaM5JOKK6uBkoQNpHUcU7aMYyCdw/AVz1Xaab6HVRjFxcV8vmVkuJMgA9X5J71P5SEkYzkKCD2FV7Zy1Mo4Nwld6ve5cV3YgqC2CSAP4qEdY14ONpAGO+aibstdTqnC8opaDblVfG3O3OTnr9KrvdnfhhnkcDv8AWtI0JRu1sc867ny3Wo+1lGQhzwQOe+ai3qxUKuGLHOO3pRNtrltqbUazUeee5p7w6EHvnAHaoIfMOzBPGM47ip5WnzPc46s/b1bT2/InEgRcrnB4wOw96V0UMvcBxuHrWU43XOtWejOCpxUoqyXUcs7LjauQeDnsKr/NuJzgsCBn1PeqklKNmtTnq1/apNu177GiJQULcj5s5+lUBKwUA5yhxn1rnirz5EbwXLRstjSS82Zfr0A9/rWWZ+RvwADk4/pV1KTVkkY4fGypU3OG500M3mqSTlkPGO/HSucS4IdNjEF2PPrXHKglaUX8jbC45TqJtXsdBLeMp5xkZzj17VjlxIdxYeoHqappSStoj0pziveerNYSLIMjJGSSfT/69ZMLbV2scHBGfQ9qVXDpSST0M6OM53ySVmjYU4I244zz6VTEjbRgdVYkUTqWkkjR1nCErI6C1cHIycknBHvVOzkKhUycKcEjqKynSjT95bnQsdF0lGS0RpOCzffAKjketQ79xDKCBvwSO1RKCb13FRhZrm9RwwyOobBcDDDsfWmKQHCgfKeSfWqaSV5bhGck04vTUtxqVxg5APJNIJ1CKnJyMgHvUV1d6nZTmor3VqNlUSgq3XB/GqyykOO67jn2qI3grrZHK8NGo4xbIHiddoV8BTxnvT5ZNwy2SCCcelapvl5nuVOjOUVTjLVMytdkB0y7UAArCSx9OKq6qd9pcoGJMkLKP6VvguX2yZ5uJlOLcrX6HybdqhuSinLbiNx7VHfbVu5igJxIQAO3Ne04rW25yYuKlaMtU3oQFiZlQMRliBjvTADuQnAbJGB2rlhZRbe5x42HLJJrQ6uBi0S7cg5INRRBhs2uQeCRWFWnBpSb1OuL5ZXWux+Wf9nruUbPlBBP9RXYokT4MZBGQCK/QZwhrfdnyWDx1ajJ02rxezOfgs+EVQRyDj19q6uIRbvmQBEU4I7elefVotK7PeSjU5UpWtujmotJkJd2XAdyBkdM13sU1sI41fhQFB9hWqrciSkc2JjKviEoPXZHByaOEX5CTgg49K+wfCvwVtfFFhBfi5ZI3Tkdm9c14OI4rwsZXkz1aPC2JS9hJXS6nyPb6a2cDIwOSR+lfdafs6W0Gc3r7QwByOT+v9azXFuFb5ZPQ6MPw7iqUXKHQ+CtRtJY03fNliSM9q+7739mu1ucFr5lVicYxya0p8XYWDunYqWQYicoqav3+Z+cN+pisnVnKsxIOOxr7v1P9lWynjbOrSAMDk46fr2rSHGuDqTu5aES4SrOdo6XPy38Ta9FBpE+nOCXm3KG9K9P/aX+C934AsYryNzJaqmW29eD/Wvo8ozajXXtKDu0fKZnllR4p4evJ8uljwD4VD7PqdyrkkS5wR1BPel+EciahM88a4VG2sD3PfNOeKhOqoyXvM9jE4RwwTUH7qe/mfRUc27eSclWGc0+NFw/UbcgEd69CpiFGyjseHgcJOm26j5myzHkHYXwCQRiooxuc7Qcg8D0pQk7pmFWNOi1Np6HpHhzBmj3A7WYcjtXCv4hudJWEW2A7uPmIzjniuOph2tnqelgKrm3KK0ts/M+0fDciG2CMpY+WeB3FeMeGvF+tyWisZ1ClSCQvJz1FeZJtyV1qXVptqyWtj0nxVpmnPEXe1QsQ2SVGenavGPGXjbXIIJAsy7VRuo6ZxyP/wBdelGEpLmPK9hShNKTVjF1mxsIjLJt2GJThk4K47j3r5/1j4h+IppJbZzE0Uinc2Du5PX/ACamcJpqSWh6FKcU0oK70Z7z4F+NLaXqg06SzaaKBwvJ+b8DXifgXSTc3y3hclmYEj8eteHjsLByUWz6PCV5Rp+2lG6f4H7L/DLxja61pVtepA6+ccFT/DwK8R+E+sX+j6dBboqeWFwFPf3rwJ0ZKbXRHXjsRTVKKi9LH2xb3sJ3OzEBXGW7AV5va+Kb9oo90MeCmDj3Hp7VrU53CyPn6kY+xdSW72PZrHW9PkHlLdxn95gnPX/69eAGOaSczrIVAYNge/WuSph7Tsnc1wOJXJGo1r2PqS38qQxzI6kEgfWuJ8NXUj6dEpckhQCW7A1xx5m20e1DERp2Ts29T023uBIqgZHzEAGucs7mRZFHIIYkHsKdXDtSumbUKsFFya1Z6HbQCRVOR7k1SsL1VVC5A3MR7g+v0ryqtOS2e45YmMUnGN+/kassHlqcDoSRSm4yCcjgYwaxUOWSczN2hTcYbMyWuQz7SGHIBNZtw+JDJn+I8elbwpNQutTWhzTlbl0OggkB2kZG0jAPfFYEV1jLAEkEcentWLg4v8h1YKKSTOiu5crgdGzk1z9zqKRoTK+I1ILMaaouTTNYVfZxWt0yG6lUNksS2SSTXN/2ra3efIuVfZIR8p6V0QrwUvfZKwkpPnppu4+5nWVwXBCjIA/lVFzG5HznAfOT39K6FjqSXK3qeWstryupRaQh2K/yHPGcj0pqIMB84IbOPWmsygmmmaUsnqTTU1pbYgaIq6hRgEZz6mpXcKGIcHDkbR2x613Uszg2k2cVLKqkG5TTSV9xgiZiWDZ3IePWrETOig9+CB6cV0VcS0uWGxhTjFNV3v8A5DIraQsQM4IIBq/bSBWaPkYBBPofelWxM1FJ6GsMDCpLmn138iW3sZpecd1BPrXUWkhdF24AJAyO1c1fMJud0go5dSjDmTvZnN3WmyW8e7IYHnmuxezS7XBfIUGinmkk7yZMsEqskoKyPO/kHXIBOAK6W90yOMMVBzkAA1s8WuVNanAsHNVmktF+Zh20IJG5iGGCBV23tmkmCA4Y5x6e1DxbcLvudH1GrGacwCquccgMPxNWp7cwAk4JHAFcsZNT913N5YTmam9EjLeMMC27OOox1pxLKCxzwe3eupVZJWW50znFxU1pccsYK7TjORgjtTomZiDuGRgEUlKTV2TUtFKEWJycZAyjg8dqtRoHk8zkgKRj0rG7TUnuaUFKrDlno0RxcjgckkVbWPB4XPzYIFTKTUvdWtglDlpuU9m9vQq+XtQBcluhJ+laJgZFLNxg7jjtS51e0mVhGnpHV/oZ4jLEgfw4JJ/lU7KcjaSM5OR3B6URm5u6CrK65FokRpIFbdklgAOPenjll4IGScH2NNqXI+Yr6q7XhLVWJ45C5Ge5C4Pb3qvlQ/y5+UkZ9qwjJtKyOmlaEWpPVl8MqgfMTwCappKSuADkMMn1pOm1a5jTqppRg9zYSYHbjJxn8elZ0QLOAGxzz7Uo04cnM3rc1rTcUqaXU6OF84BIyAWGO9Vo/kX1xg89gBWPs+RXub08RFycI7oklkYN1PBAI9aoySMzEgkgsMj0rRQco6Iy5YJcyerFebcVYkjqCTUDAsqjkY6+3pQpJtpo5684qKkndsjPvnhgAT3FQyv0yTySB7e9VRqNy5ktzoxPL7NQ303GPGu5TnAD5B7j0NVnmAPDZOTnNbck72uRGaaTmrj3jjZecbt2SB3qLd8wPQkAEDtU0ZJLmvsZY2UWvc+ZUa32HaASwkJOf5VeDgEO5yeV+ua6ZVm7NmFKk4TST03Kn2RioyeBnj+daBl2leRjccf1rBTbu10ZpUjGyktP+CYrwAEDng8e1XrgrICQCNpIB9eetCqqbVxYinOMkpbPRGVtK7igLHGdvr7VdACYzjuK2p4i7UWip0VSTi3v1HWktxGmFbBJ6jtVyIpuQHAJz+HpWN23zRWg8DQinzJ3aEuSs0QDgmQggNnpn1rRPlKvb5gM+1XSqvm5nozLH1KjTpyVzkzKY2ByTgjI+lac1pCWZlByTwPUiuhtpOS6nLTjGSi9ncqwSkscZKryD604hEAQMT0Bb+lYJqT5Wes+eCSWtzpbO+UwqJGJAIwT6VziSSRnHJGcHFYvCWV09DBYhKah11OqeTzYwIWPQ4Jrl/tjYX5zkqQcdjWcaEoy5Xudf1mKpuRuTSJGmQ2MZ5rCkneXaucq3BNdsaTi03sZe2Uo8i0v+BZeTc6FtwK4AHYiqiSfKpbkjgD8aqc2o6omnh6fK2hXYEBv9oMR61XfsysSCSBWdCvGL5Ujjd5e+nonoSecN3lnIZ/85qsTuOcncxAPsKp2bbWhrN3V3q3uxJY2IYkkq3Q+laEULSL1GA3IPb3pNtR5mYzwsWowT0Zh/Zl2nk7duAK2jGfMIAyjA5z2FVDE297udP1aMJeyaurbnPSWoZlyTuVhgitiRBkEAjnBJ70e0fJyy6k04xp1HorGF9kcNuxxkkj1rWwwXpyWy1FJRSdhxmk1z6amWbVyuTnjjA71qk5IUBsFhk1tSk788TCrBtuS13ME2jLy/Jcg59K2pEGVbJ2tgEe9aQxj5uWNgdJ3SW9jm5IGAaNQSARuA9q3kt9xdw2QOPr9KEoprXUwo15xlKKXT7znDAy4BGTg4zXVx2kZAyQWyTk9/aoq1YxlYzp4OpUXtIv3WcxHHKuACducknvXSC3VHz2yDx2pVa7layN1g3CChB6v8DnjbyMGO0kE4FdG8OVOCBn0rTC1Wo2tqZzoKFSydzm2RxjOT5ZY/wC9xV+WNiCdn+zkd/WrjNxjYqrTVSV0tdzK2bsgtyCCPetERlE37cDJBB/nUe2bjZmt4q1/tbFEKQMk5IzkeuatGNWByoADBuO9VSrWg9B+ykrKP3lYqxwoGCCCc/yqRtrNhhkcYA7VnCMktCMbWVSoueWq/IZgFecgcH8acNxPy5OcgD1olOXTdmtWjGSSewwIX6HABBPv6VYjHADA/M2D6HHahO8kkilUirpS6IYiAnbyNpBz61NtJbBUggfMfT0oqNJpsdarFxUHoiRJNjLkZII6dqiEbkKAQfQmknFybbChjEoqLWhpG5XdggfNkVlshZ42GdyqRk/hmnSjGOqZyc1OpK1To7k0kypJvAzzkD1x0FVlt58JkADcQRnp710Tpxum3c55YydV3pqzWhYS4AKYyBt5z3zUfkMZB7EE1nKlF3tomehCg0k5rY20ljmQMDgpnIPf0rMgG1NrOWDgn61k4NO3ULSUbqzT2NkyALtyR82Rjt9aoNKQgOQCrcj1rKMXaxtP942k9R85wy475NVXlAOCSeMY9KqnSbT5tWZVJKUlzK3kATrkknI59aj8wZXOTkgA1cU5bqyOmMox0te5fhxjaeNzbc+lRKxJKhztdiSfTPb8KXMoTcYrQ3anT9yRM0mYhGOSCVPXmqm5WI5PDAcd6zcoVHzpanLVnUhFQgtWTPsHIOGZznHQ/SqUrhW+Yk5YE/jW8GpLnZ5vtUpOD6boerFjjJGOKos53A7jhckg966PZybVtxwaWl3YstGQuccN1J7VFG+9VG/IJwAe1ZTqNNtboFQipJu/KyHzMOoyQXyCB0GMVJKuwkFvlYZBpqTlG9rM9BRcHZe9f+rEXnA7uCAQuAOgx1qrISI8DqOlN025KL7nEsTOcZTktlaw8ORIoOQcAY7/AI1UDbnwxORgc+uK7Pei7NmdKSUeWOyNLfskVgQQOtZDu2R8/XpjtXI4KLs3dG1GM5LlbtqdHHdJtBzgliAa54OSUXJA3YPv9aqVJzblHodEZSprlStf9DpPtgeQ8kE4GCelYkbkBDjIOVBPauecZUrJbow+tKVK7W+5s+ersAGO4HPPr6GsqOQKoOSCuQR6Y6VpOVo8r3Zlia1XnjKTuuhupNEwO/liSMkdPauc+1t8o3gjOAfSlPDSsn0Or2zpw5Hq2aEz5kIUk5Q8egrMjnUuzOxIkIAz24q40tIqL3ZzctouV7lwXTIVUMfmbIIqBgRzkHPc1tOjFRbSuzzsPVftNVobMVwuPLJ5PA9qyVkwAdxHIAzXJRgm9XqerQrwjGUoxuuhsNN93kccnNZKPu/iLZbAI70qkLttF0KlKcrPRo3Yptzg7jgNge1c9d6zaaZCJLmQImcAnv7VE4XjZCjek2v5mds7hVHlscZGffmvLX+IujoYwWclsZ4+XPrV+wfIlLc2vD2nMno9/U9ktZCyZ5AJAxXkC/FHTbf5ViZsknj+lcjwrb0VzroYmUG7q76HtAmVSpYADOCD29a8Nn+Lds43R2bE5BOc8570PBSS5nuTDGK1l3PcjIoYLuwGYHI7V89yfFKVh8loN3BGT09KVLD1HG6QVc2oxku70Pf3dCQATn2r51f4p6gHOyBBkA5B6GtFhGoNpFvFRjJRZ9IKAYkI6HIIPfHrXzcnxZ1pUKqseATgnkH+VcNXDTUk0dNKvGNS0lrZWZ7tqcGLeYFzkwH5fTPSvmy4+Jut3KybnCb8/Lxk+mK9bDYaalGTPKqY2UeaMnqc/foI72fAyFmY/TmsiXUDcyvMxw7ZPtzXVXqKTSSOOhGNO04fiSM7mQY5OQMCs9rllMZzghiAfWpqU3vFGdGca3uyO2tX+QLkB5D1Pf0zXDtfzbcrI3cAe9c0sPOUrvY7qNflXs2rt/gfBaSqFdQDuI42/wAOaqRyhgCCAXODjsa97697ybWpx/2XFxVGnpJl0TyKjESkMuSSe9VC/mbm34GcfWu145pc1ReSCOCUY8j1t18y/pz3moatZWCx7mlkAJB6D2+vevQPhBo/9teLbaQrkW7An3Ar4ni3iNYfDOml7zPv+BuHqdWvLFVZXUNtOp+hXw3tJNO0GyidSAsSHH4Cu40u2jgtLeMLg7VB+tfgtStKU3N7M/RMZUjUk7/8MXhLuzyflGBn9akwvODnacYprFN2kjkpuTg4yexED8o2MD1OR3z3NCouN3QK3UVcsXOMveeppDCXTSIbrHkSMRjPIPp7027J8tgjHLEnHpW1Os2uV6eZzVMOtOV+p+en7bmnN/whEko++VIB9eO1eiftd2yX/wAML0uQxiYgY6rkda/V/DPMVGq4N6H5JxtgZUsVGqnu7f8ABPx7+CjLB9u+U5eU546H3p/wmeW3jvFRAwF26knvg9TX6tGEZYjmS13M8ZR9phY0Xte/qfRi3EG0NyCx5Fc/9rbaAIySSANp6e9drpzc7xex4rqRimnozq7d4JHABIy3Ud65izvhFKVKsFJHJHv2rOUXFKXUww8VNOK2vrfzNDW0VbqyUNwDkY781S1G5EmpWWDxEAGHpk8Vs3OdLnfcxwlsJWlGmrp6f8E9k0EypYxiMhSFyCe1M0yOR9PiEYJUAHAPX1zXkVaaa51uVjW4Pk6P9Tz3xvrM1v58TkFgpYEH0rI8cq6287fYyhYEZOMmvdwdBOMYtanzrxr5X0S/U+dNX1uUsL07Soc7tvQ1iaolwzfZ4osBn5JHTPpWUrNtte6fRNVZcjk0pRWvofQXwm1ZtQnj8tD5Oep7+lZ3wigms5BEyAFQMEdz614mOacrxWp9Kp01Bta7adz9GfAd9gQwAEkkHPoO4rO+HsV0LeKZ0IG4Egda8mtFpJo5sQlKXs5abH0bp93MWWNkzjkY7UzTFlaQZX5SAuRXNiJJpW1OSNRJuDVl/kdPkiJsjGQScd6kZSEySWOec9qmTvZpann4fCz57xejZ7N4WQf2dEX4zGMj3qp4dnCabbgkg9yfSvHpxcptvTU+irz5ZpO10rHYBMSBuATwPYZ5NVUucuo6gYJI6DBq6sbxV0a0qjTlCL2/M3IJnjMeSeF5I/SslJQqZ7AkgelRVpJx5bHPhZzk+ZLXqddDdlty5POCT/WuZS92cK5XoB71jHCJtNHpyqrm1/4B07KjKrLkuCD9D2rES82FsMSMDj045okpSbmyPbXiqcWT3BMeCH4KnJHb6Vk3V0pH3hg5AI7U6UYyV72McZTlTa5NUcz4t1J4tE1Fkkb5IWAP071zfjS5CeHdTOefsrgk+3pXo4SlFVVDqfPZi6vIpN9UeH/B7XtQvLrVPPuHZFvXAUk8AY6VznwNmMj6i5cHzL9yQeozzivyDi/EJYqSXQ/oTKYpZfTUtGz6z+2s/l/Kc4OSe1ZjSfe25OMgGvlqWIm9U9TetqlDp3NqK8IBKnJ7AdBWIruuMg8MM7f51dGvUTab8zOrGP8ACluzZeYnaSMnfnI71lhiGVWY/LIAcd69vLMTKdRWPIzJKNJxidLHdZ+XnGAB+PpWdC/YHuMD2r9cwcGqSbPyWvzRk2/hZ0CMpBzJktnJHc1mpICoA7Dp6128sd5nn1a7g1GCv+h1On3DqoCsRg8Y/pWPaS4ILMThwcenvXG04ttdTqc4zjddDt4pWwMnAwNoHYAd6yI51XaA5GTgk9q4nSiotRO6M51HHm20LF/ej5Qx64wR1965vUbkgKeMkEn2rrgo/Ct0clkpqL0JBfmOQsGIcAkHtXOvcHHygjJ5J/WuxUFUVpfMFmHKm7Xa2O1gu1uy28E7sjA/nWBpl0Yz5bNksxPT9K8+qlGSUdh4dPldSSudFj5dhyCwPSmLPGSWJJJI49MVTrvmujaooJJW7D4bJziRlxxnH9KuwTIqruJAVga2UuZp2LcFGLTerKyo8SqCDjeCffmia9t5SNj/ACq2SB3rB3k25bGVKn7O3MtiwpDOuwgFssc9vas5Lkbh82BuJwe9U4ytdbHXXnGKVtLlySacjGAAuFFLFeQ3RHlOGCtwAen1qlTSumcuGnTTUkrK4hR2jwGI2g5J78cCudg8QiXVbuzmZVjtWXBP8XsK35FFpyJqSc05QfXTzNxYXKqHYAjHNZP9uWst5dWzgqsRBLEjBz1pWXNztmtHnVO8v6sbCR9XLHJIIB7ccVxbeMrKO7S0LEoGA3nt6UqkZxi2Z0uSq1KO/X9DtEUL8zAjcT8vpUcc6uEdfu4UAe3GKKM+b3kE8JKnJx7GnHgE455AOO1LbYYYLZyTnPvXJPeyfmdV1FXkrlhVLBuTwu0gd6mDMoQAE7hyRWsuaT5l0FRpxcLt6sYobcqHG08dOlW4jlQ2MjOawjFxjq9Cp1lPW239Iz5EO1WzyWwQO+K0xHuHLZK5OD2pyq3Vmc1OhF1LNbbnLTgsVOCF5P0rXuLTL4AIGCAR06VtSrJO61CpFyko2scywGCWHOCc1caPnaxyFYL9PSumWJTfMmRHAtS5JLR9TJB34UORgdaVvv8Ay/xZyT+mK3pQ926Jly1Jc0to6DvMyFyxPJ6d6qtMquoLDjgDuazVlJJ9TkxNKUnzRduxN9pEH715MCNt2T2ri/Gt08fhzVpI5NrJaO24dsVrh8FGrNRTsLH4mWHhzyWrtc66DU7O4yIrhHP+wQcV8h/s861d6nFrL3V077NRkChieee/4V8FxHxIsFiHh1H3kfpOXcKurRp1ak9Ja7bH2AbhG3BZOrEEHtWEJBgs7ZxzgfSvIhxhOLUlHV+f/AOmXCdOd4xex0Szqo3ByN2Rj8Kwo5mIHJw5z9K1nxZJOKS/EUeE4NOz903vtmVKliAWAUH6VkbiSoJyuelb4bil1JqEVrc48dw1FUW4yvY3IZWZFIJJDYJNVosJEoGcKSDjvX28KznFOx+e001NRYwkjcByCQcnsaQwO+/BwJFIyO1d8Uo6nSqc1NOGxF5mCXBPOcj0+lRTIUEeTlsZB9PWicItO2pU48k3zPfZkJbbhgScMCRUDPy4yQWAOfT3rWhyyjrv1PPqzjCerbXQek7RvncSCT+FV2Ys+c4Axn3pTwznG0djTB1nF2k+5pLKXO/PzoRg1ViZXUMDwSAc/wBa5rSTSeqL9vBrnhoti/GwYr0PzED2pPKZCrsCBuI/Xmq92SulZs2aTUovRLUOQ455xnnvUkY3kMeNrAk+tQ5pWg9yaGKcbqGq0PMfH/xL/wCEDuNGieESjUpkQk9E3HGfwryD9oeMDV/Bqs4EY1KIfX5j1rmzqfscG6sT6DhbDQxOYezr/DY+rdP1D+0LOG6HAmQED1rD0KRl0PTAABmDAP8AjX47RzurOTlKVkfqE8opwfJBG9JKBtG4jIPSstgzNhwThc57HNdFXPatlZ7kU+H6V1CSL5kDoSCMAEiqqgRgfMDuzU0uIq8Z8t9O4T4foJOLXyF+bewGSOgz/OhQSS65POQDX3nDmYzqxtNn55nmBjGu4wVlYRpCAQSSM4NAVlIBAO9sEHsK+v5UpcyR87R5opxb2FRiMgHATqPrSbSEXeQCkhIx15pezTlyWu2ZSquK5ntcupIroDwCSMgVXQNtGMHHP1rnm7LQ9CnKPKktEO34DfMeTyarvvXJyM5Jx6U/ZOSjbY4qOPpwcoRXUlLhsZJyGJFVosEg+pwD611xvs2c0K3PWUOWxMDvQNghn5I9CavRqqqrJ1bHy+1cTknUu9zohiuVOKWhQnG5lwMEnGPWp3IbnoxyoJ7Y6100ZJPliQ2p3nHcyWj8sNkZfqCO/oK05MOGGOWwOe+K0q1nolsVSUlFuG3UxfLOcseA4Jq7cQmMFeccniueSUtYseJoytHnd7/gZjN5YYAkujDk+9RSNJtUY69MdvrXXTaT98wm4tezp6skEm4cggZ4z6+tU2ZkIHOQeT/hTjRuubsc86sY1FSmaatwu1+dx5/oaoq7AgdSxyfYVWsbNal1ainN02aCs3QkgFxgevpmqySZGCTwOc9qwjK2kla461JOXtKb2STRo8Ahuck4PvVPziduM4JFa08OrWkdMK11dkxO0ruz94YFR+aGyc9Sck9qUW2uVlT5aLUlsyfeMBYxkbgMnvmqJdlAOSMN17muZUuWVm7sVLEXdpde/QtmRSVA4wMn8fSqXmIzEkHbkZ9q7Gnyc7MqkWkot3XkTSSFVABBJJBz2waq+aNwyCVzx7VlTqcj9otbCnZ8sNmWPOx+7x97Gc1QFx8rgkjbkfStVVlza79DKE6dWTqW23/rzLzSbcjIyn6+9UUnUEHHJxkVajZOV9Rczik6b3/A0km+XPJCggj04rL88LIN3IA9ePpXPToSeqZcsbzOME720+8143Dd8kHJ9qyo7lE3AklSoyPStal+a6LwtGK0cvv6F2eTIHY9ye+aoPcx7Qp6HDCn7RJrTRsxpUJQnJpXHSyn5eevB9qqK5Z2MgzliQaU6KUr3NYvmg1FfMvQOicsSQmeneoFZRgZOSAR7Zq5Wi047PcdO06d3utEXrq68/YEwPkyQe3pWQ7btu0kfOcY/rWkJRSbXQublKPM9H+ZO3zD5SfmwCKhRmV8DgnJOO9FOd1zM5aNJtummOZHQBsg8kHP9KryXIZmjMgO3sPenUrJNMMFR5XyzdkNJUkcA4IJz3rFm1e0hbCykhDh8dqcYOorJ6o44xcKtkt+xuIxDEg5YKMVxM/irawaJCYwxGVH3ie9TCMnF8u25rUqqNVRSujuGmdEUL0brnt6V5x/wmEiuvmKSFUkA+1cta6XNM75TTSUFoz0JpxyWOCxxkdK4A+MIZwwaFlZscnHJrojBzd3siKabjz3O3lkAyV4HJwO1ZFpcCeKOUE4kAIB7AiqiuWN2zhoy56jkumhoySqGUq5Ic4AHWo0ty43HJ5xn0rWNRRXI3c0d5RvFWLX2rYjO5JUcj2xVS8idIJM5KlGJPpx1q6cueSijCcPZpzlsYukePtC1m+u9PsLkvcWMhSRf7pxXyh8IJpv+Fg+LIS7HF+y5PbJ6V8VxZmc8NWUaaP0rh7IqVbCqaeh9ZeJPEs2kwI1uhZnbg/5xXI+N5/3drbhsjGfpXyFXi2uqbktj28Dwjh5VeZx1Zz+q+LrzVQsdygCowyfWuPmbDD5wCM4z2xXj0+OMSouT0PUlwlhm+RRsXXvyxQkkfNwD3xWcxU8EHCkHjvXVheMq86ijLY4sVwlQeHbfQ6BJhkEkktgkHsKpRkkkdwFJzX6zl+K5qacj8jx3NCryQV0i2sgVQoZgvTnt7VAskjryuMZwTXrTglJtPc5qWLaiotaXRdTewLDA2n5ce/eogQwC9FZlNcymk7LS5m8PCouVPe+pHI+1l6lmYDHr70spDDqQW4BFbwnJK1hVcPZKFKXw7iR5Me48Dd0H86aC5X5cld2SPWlXp2nzHThcVeGnp/wSCbdIucHPOPansxLbWjITPOPSpjKTaSReKVJQvJ6odHH+6XcepJPvTwCFC+pPSniKbcrvYjDUYVpKL2IM9CCfkYH8af0QjnAzyavkndN9DN8sJuNNXS1K+8oflUHHJ9qcIzkEnOWByPanUlzR1FhaadW8V8XQ+HH0prZhhsru4J6k10E91H5YVW4Axz39K6qFL3eW+ltDt+tydT2jVkmYXlBA2B8gYsR61ZkKyhRwXZlAA+tdk6Kg+aeyRzUaksX+6o7yf4H0r+zloWbia/Yffl2k/lXtHwP0P8As7w9ayOAZJIwxwOpxX87cVZm8Vi5Rjsj+h8swywOXwoLfqfQyINoGflBAA+lNVcAL1yQSR2zXzFpJcr1OJ0W7yb1ZHNMlupkdyFVic+tcp4wvF03Rb24Mh+WMsD/AIVtgMNKtNKOhx47GKjaDV9kdNa30d7GxjORxgivMvhjqranp4dpNy+YQTnpzxVYmmqdZxktj1vZunSTk/eaPUnXKqPwPvmrAAAOf9YCc57YrmxFOzVtznw1VN8yR8vftKaNDffD7Vo1jBc28hAHfcOa7n4zwLdeFNQgK58y2YfXivouE8dKhik1ufH8Z5VCrQkpPZXPws8B2EtpPqa7iAL1jgdueK7ux042Wq6xCFwPt7EZ7AGv6Qy3GOrPmXY+DxtKnDC0ot3e/wCBsKziNd2Scnp6VK/yryccnk9D9a9mlVanfdM+foqLUE5apskihLFCAQcZ57Zqa3liDq/JJ4yOxrNVZSm01qiJ4fmqXjOyfSxQugF1G1LgEFgM+vpUVzMv9rW24kKXGAa2q1JuHLsjowOBhSlOc5ava5734fk/0XrgtGMH8KboUf8AoKZyAAOT3rzKFNaSZw4yurTVr22OF+ILxraSBuWb5gD/AJ71xnxV1a505C8YycEqGGa9jBUpt87Pn+eFScYP5nhl2wF8mTwWyQexz0ryi98ZakL5g9vud3yGAOPrRmFPldk92fR5dRVSN5aW2R9h+Abq3huIDM+H3BgfUVwHw61W41B7QyRAAyKCxH3s4zXz+YQntF3aPfwybkqs0tNF5n6l/D2SKW1gKENwBj/CuN+F1zJCtqgz1HBrwazvyyl9xrXwrquUoS33PrGyQKiHg5OcHtUVgzNEr5IyBgf3annXL7pz8ic3T303NofPhQTt6EVENq7SWP3jk+lee8XTg2pS1NsPlNaUkkvQ9S0OOVrOLBxlQCfUGtjSTGum25T7oQAEd6+fnxFQiuVM+h/1Yq1ZqpLf9Q8tyyjcSgI6d/rVgSHG9iSVGQKh8TUNYp7meF4SrVJ3l2YiswIOSdrZx/SmLMCo2rzjJHr7VdHibDyXK3qya/C+JhVUqbuuwryPwxJyueR3qu0zE7MctkjHau/C5zRaundHBXyPEyjZqzRM1yyAHJHcE9qrF+Blj97j2rqpzhOV4mVTDzhFJ7jHuJZAc9Bk/WpFiVjvOMcgH611qML8q0MISqS97Y868e3Ei+GtVABIFsTz2HrUnxEmiTwvqhGQGtmHP866MPGLmnJank1sTVjJUnLQ+cvgJKZLe6kwQftkjA+vNbnwHS3/ALMllJAVrlyCeh5/rX4HxjUU8dKMVsf0fgFKWCpJPSx9DpcMMAA9TkGpo7iyUriZDhxyT09a8CM5U4pbmzouMlGfUsLK7eWp/i6e9UPEWpQW9iJbCVRKWBJU9c1dCrKcW5KzM8TQippLboWpJsE5zgkHNcZ4e1ye9uWS7mXbkYDYHfrXtZLiaf1hRR5uf5e44ZTT16o9EidhtK5IIP60qXlkdqidASzAZI6V+0YKp+55ZbH4/iKUbtxV7FyKQ9ATkAAj0NQfbNP3FTcJlDluR8uPWtp46EVdvU56WUV+ZRprQ145XRVxkkt+ZqCK4tpF3b8rkHI/SuF5lRk/e3OqrkuJXuJaGh9sYnBJBwCQO3tVQSKW3HgZOQe9WsRSkkjCtgp023JNhcSvIUzk7WyST0qeF1LkMQcckDt6V10qqgrtXMqkJu0Yb/kZUokwfmwAMADvXRGKKRMjGFJ4Pf2renjGm5LodEMvailJ2u7nPQSTRndydzDI9BWxcmGC1eUsFYEn6VhLFxkuWKtqZqCvzWuPjmK8s5xnJqshtbq2VvOUO65UE8k1nGzfLezM3KahzJaGmmoqR5bMAHbaCTXkmpTX00stgXZUiLEE/wAQ75rp9mouzepFLmdPmkdfc6m+nXd07ENaswYMp7gYrx+WaSJHja5cZ425POKxlVhF2m15HSsNXnDlW7PYbzxHElibuFiwOMEdsjj8q8Vh1Jki8lnJiYnCnpTp5lRpqzkb/wBj4iq0pLXqdnpnjK/spLlYSGil3FgRyvuP/wBVcAk5Vn2MQWyK56uPoztLZkf2fWg3TSfLHbTfyOxm1M3Lm6eQrcyy8kZ4x0NcetwzBCCQCckVrLF05bS3MqWBq0W5qNrndf2pJcXkf73H2jYkjeoHr7CuLjuWDjBIZGJJHalCq5rljuZ1F7KSlNb3OpvZrW1vbcq+5QwwT35rkfO3bNxJw2D7V3tPaaODDVITiop2erPdtO8Z2YMFsybY25Vh0HtXiUcrnALnAGRWNSlGDXL0OjDVKlSTUtmfVNtqcFyqSW0ylQ2cqeteB6P4il00y8kxnOF7Z7V59Si5NK2/4HfUxaoxU462/E+j49Q2LhyT9e/HBr50i8U6kNwMzbTKG5/lW1PCpRvJ6kvEOTVlrLqfSjX4SE7WPCjH19fxrwuTxzLC9ogyV2qTnue4NYwpwVpJhedV8sXqj2xdRlUlweQcADv6CvKtJ8Xpf3ckTAKnGDnrWcoQi+ZnYpzaUoR73Z69FqTSIzOMdQVP864/7S2S6MeP1FV7CDkpdX0K9tWcFKS22Nq6uRIGAyGBOcdq58ztJIWTI8wnI+tdkaTi1Kx5866jJT1TGy3cwcjnaMbT6D0/OmSxglWOQm0ZBrqjXinZsxq0J1GoqO5SMhLYORk9fahomQllYhhggjqatYiM0rE0sNKim5PbY5HxvLs8K6yc5P2NySe9ReO0kPhTWSqkt9kbGR3FdeErqM7JanBi6bqySXkz5o/ZmmD2equDy2pTHPrk4o/Zts7mGw1MyIQzalKxOPU1+GcaVKbzCSluz+h8DGUsDRjHtofXIlVWxgnaOcVCIJF3NkgknOK+bVZSio/iaexlFO6+RpRzqFCsR8xJ+h71nqjEDAIViAcVjKotJdUa4WClBJPqzRecrswDhTgf1rMeF8R4JPPQnp717OXRcqifW55+cVY+y5WjqbS6RlVXyTkNk+1Y0Ucmza3cAACv17DU04xaZ+NOsoTcVG61OlkvYQSA2CGyAO1c40UoJABI3k5PevRhTbSTd2XOvZWiuW5bvLtDgjGMkA+/tWa1vIAmSTlz170UKCaak9Eeaqrq3t5kpnJw7MFJJIxTTbzOyqF+6wB9q3jOMYXSK5JJpRWvcHICrye5x70yRCRgnG04Oe9bUW7JTYlFtPlRLaSTNLlD8jcgDv6VYsniiYBiCRtGew5qMTBO/kTFTjO6ej6WOugIlhUTDD45NZCXqO8caSgE5AyevvXixjJu60R60aM5pKW5prDCinHAOQcdqpNOgWMFySWO4jvW0pOM7vdGCpxpxVL+mfJ37SUMv9reEBEpYyahbqNvfLcn8B/Krf7QN3FFrHhDL4/06Dn0y1cmf12sundas+r4Ji55jzR0UUfQPhqOV9Isg2SoQAZ78dRVvw5dRPpFjhwN0CkEHpX4LSlKCSSvqfrFbm9t7R6LsaRiC5LYB5H5VXmuV45O1jjPpTxNJykpN6mFObUm9k+hMqROcZHU49qoR3cZDFVJO7BJ/lVU6U01boFdqcrIvAxx/d4AyPrWSbnLurEjBBAPcd8V+l8JRvFs/OeL6vK0o9SxLqVjA7LLcKrE4IY9MdK8V8UTF9TlwWI35IzX6JKjaKlc+JVdTbjPS+h7hCy3QUxSjaxHI7j2rH8E39vPZW8RmBmjXAU9SfSuNYmyd9weAUpR5m2n+h2KWxjQKAMsQOf0rRaaPy2AGSQCD61zxxTuoPVnqVacab5vwOYmTbLkg9enrT7iXDOxHOOPbNerCXPT5U9TwaVCm68pJW0KmWiHOF+YDI7Z6VXklySwJ2KRgHvRytNNm0JxguTz1L29hjaxI6/SsprhiVC5w+44Pp7fjVKknG0jOFXmnz9i5Lc7d7Z6449KzGkY8EjAx17VpKlZWaBUYyg5KVmXRcj72T82Cp9vasrDsrANhi3BHb6VEacV7vUc3WjHmesTba7XYA/JIOKxhuJ2sc7hgj0rNJRXZmtKrpeWrLrvGx6jCuQcd6pNHKSXzj5jknv70W54uLZrHkg1JLV7EUjRl0HIODnHajY6PsbDADAPrW0J2jyJ6HFRi51LVFZoEGCOpwwOR/FxTs7VVQCx4A/xpTqvlukdGHpQT5Xt08x65K7Od23OT0yegozjnkbsAAe1EJRb5Uc86TTT3JACWjUcsBgD1NRAnq2QyEED19jVOcpQbR2/VrOOun5BJGxbAJHJAHp71OGJBLZHGcU3WV1C2plDBxk3Nu5CVYhMn2Ge+KjdjzgnbwRnoM04UdE1qOT3itktSIqWC9Rhs5PfNWNy+WMkcfMT+FZTxF20tjz/AGnKrpXIFidiMAjnOBUwcRKxYkA5yadWolHkjub4XlrSut2QS20oUnIGCM+9WY7uGXYqSbjycjtV0K7WrRtiqUJxVGOjvuZ5tpACwPEgwMfw+taL3KKAvXGSD6VzquvaWiJYKELOT17mLJbSEFSSQVzx39K0RcZXnJ7j3rolKMWpI56spJJU1oZ6wylNrZByDkd6uCYAAEEZOSKipiGmpR2Ihgo1E4VnqygkLtzyASavCVd645CnJPrW1aLilJGkZ3fsr6bDCnkBXIwytx7f5NY2oeILe2kEMuchiWB6gHuPrVYeUmry2LjQkko0yS41WCGIH7rhsZPYA85ryrWNUe4lcxPlBKR/vCpmk5XT2M6DWsJLdnXXPiiKNZpYJsyhgEU/SvLfMy5BY7GIJ/2fWtG7NPe5ddXSg38PY9B/4TRw8blMrjDqO4HX8a85JJIU9Bk1lTs077CcryUXpsrnWnV7u5kuZo3LCUggZOQPX/CsbTrmKFzJIARjAU9/rR7e+klojoqRj7K8ddeh0NlawyMJruUGEghs981z95qTzQsg+VBuKkfpmn7WVkmzzFNxSm1pL9DVlu4oI5LTTl3RcnHHHPFYllfRwbMoWG75sdqhYzlfuo9N4LngpRem42Q3Esilk+XgA/zrpIL/AE+8urfzEKo2UCr1B9TTnOKdn1OL3JyShLXe3oUrXSg8G+MEuXBIA616xZWEMUQ+UEkYUkcgVjG7laT0ZrGyi2kYmlXO0wW32c/dHJ6D2NSXet2+kXHkeSWIxk9xWlkumh5aoSSvFaJps6mO3J4c4TGWFeZ3fi+cXAlhYm3YcAeop05ySV3sd8qSSbe76HpVxYGS3mgikO6QFRn3HSsjS9dhudPWe5nClUDMT2qsNiZKomkbVrKjaav1sfJPwu0l4PiZ4pCOAonZgo75PWrfw41CGX4m+KlWUjZdpnHTBPUV8Bx9XcKi6tn63w1TccHBNabnpHjV8ag20nEQAYHtx2rK8RXLXepXbMxYGUgEV+T4yu24o+zwvJFczenQ5nG0jcSQAT9RQiZYnB64NeTz3bgh+404yleT3JEVWwDnkZHt6UqN5YAZcKoyM9668HWaqcltWzzsZh1GhKzvZG2gXAJzgNyBUccgkCYPHUV/ReT1EqKj2PxHH0ZOvzR3JoYM7iCTtYEg1YhZkY9wQCPevcS5kpN2seLSrJTfOvRCpbkfdOdpBBq0pOxnIwGOTjt6VeqdnqzWnSnZu1ovoU3iU5CkbcDOKnkmRPvnODgYraEYLVGPvU249FYYsJDIpwTxgjtkU8TowX5sO6YHt71k4pxbvY2qOPuuNr7kbW4XI6sOpHepRMgAy+NzkKT1+hqqSbV5Mxn+9vKGyauVvKJI2jaNwB9/WrxmTao5OeM1hFpRcEzlxVGLSlYpmAN8uOFHfvVpplVwh5BxmlBuzbeh6MMPzRhJaozWtgM4YhSe1XZLhNwKgbc5A9cVak5WTMuZRTUVq+vY/NhtdLJtBJyxPHtXnK3RWQDeSEOSB619NGLhJNkrCuopSWrtr5HtvhXOta5YWycl5VHHfNb37Pemtqfiu2nYFktyDk9+ea+A46zxYeg6cep+h8AZHF1IYyaty/cfqP4H0cWehWUOQpWJQPbgYrf0uZLa0giBztQAY9q/C4WTc29T9HxeIqqq5LYu+U6jIGSeKcLtW6ZAJIxVTqxaTsc8ZPmcpLXoeJfG69fTvCkqISPMjZBjtnrXnH7R/iEW+ki1yA+G6nrX2PCuBdVe0XXY+D4jxDhXilq002aH7OWqm60IBmJZJmB/Dpg+/wBK479mK8M2nTxqePtBBx26Z/WvlM8pOnjJJn6jiIOphKTa3SPsgyMmwDOeCM04QOwDDIOcD3xXnurG2r16HnSwaUbNHmvxGjE+kSQEEKyMD/tZq342RxaqhbIKYz6e9dmFxLg1bQ8nF4aNRyha9kfkd4n0oWGv6ngkBrliB+PSvTvivows9TlujGMyOenbNfvXCGOjUpKV9j8i4hpNyVLqjwe5uFt0eWUYjXBLAdeOaZq6hdOuSQQTEQPyr9Fw84VJRi1ofPcs4Qmk7NLY4v8A4TFbid4NJspppEcgkL8v1zV7wTvW0IWIbGlZgT1z6VjXrKnV5EtUd2GymUIRnTlra5HZXWpzaxD/AGhAqDflVBz+ddY3h7VbvVIbyzQtggEZxtJPWul8k6KlezPIw1KccS3J3vrqe4aNIBYxsoO3yccjrxU+iaJrq2Mcb2Z7EAEenFcOGpqNT3jHMU61NtvS9jx34h7JkdWUMCRgMOlXPHuheIpEkWDT2Y5Ygg8D/PevbpUFZJbHk89alNN6rQ+SrmC2N4R5ajbNyMe9Wtc03W9KkN3qGnlLcsMuO/vWVeF3ZK7R7cJW5ajS1dtz23wDaS3EttDCiLEkgII659Kq/C7xFBPPaoFJJZR9PSvCrw9m+Z7o+rpYiVVpSj7r/Cx+hfgJItKtI7m5IVY0JJPevPbOTxDrupaT4f02ykeCVleZkPKgc/kK+SzXGRw9N1ar0O7LcrljcUqVK/L1fY+rtD1a41ZvMiUrbKQV9W9a67wx4W1LTtPgQ6exIjVWb04r8gzXjGrWnyUo2SP0nAcI0cLCUVLm87GhEpwgfnc4OT2x0raTStRLCNLVhzgMa+YrZjUrLnm9D6DL8DCjKNt7np2juxsLdQSCqg49MdDS2cBtbGPeWOxAGA7EV5mFpqTSe/Q6cXOMW29yw4ZTjJ2jnHqa8o8TfE7+wGlzoNzJHE/zSbTtx6168cDVlZKJ89ha8FJ1JPXY9TDtnGOvGT2rybwj8WvDvjOX7PYXG26hch4W++p9x/8AWrKrTcElUVj1JTcGrK7Z62GCl/MbI5OT2qgXbLZYg7wDnvXN7WVorqbunGEXGe71LZ2EAKMdvr7VQklIOdxC4ySDXp4fNKtGTcXc8+rllOq71EaCyfIRnkHA9/esKS9ETKysdryAY9a+9yLiJza5lqj83znIXQqyVJ7u5wPxUuxD4W1QtkfuMAepxxXJ/GzUUi8JahKXIUxsPYcda++y5uceeLPj8VSUq0IzV9V+Z5h8KJyPDEfluSvnykH1zjNc98GrpZPCkZ3E77hsZr8C4lxFsVOy6n9GQUJ06SWjSX4HswvZ1wu9htHUGqyuBhsfMTjA7Yr5mtiU5aIuCqODm9r6Gil0xwJ2JCDcoPbNU2mXa43ZHAwepyKzo3c+dysh+zbgpRe7Oe8R60dKjSdFdpWYhVQdTnircyQzhDKoOxs8+letg8zjSqKcVqePj8HLEz5OiG6Bqep3MPn3LsPOYHaeo9qv29xBbrsQ/ICDgV6suLMRK3Ns+hlRyChBNRNEXMyEknAm6+/1qFZQwCjGAD8x6CvMrYqdW8ru/wCR6MIulFKKPTvDWuxra+VeOFdMHLHrXmIutrguSE4APoa5IYuUJcyYV3zRi4rudZrHiO8a4MSXDGJckMveuIeYgltxJBJB9BWqzWXtL02xrARlGN4+p3SeLtQiVJBckN8o6dfrXCM6mMDksrE5NfZ5ZxLUpVFSqu8e58pxDkVOopSoaM9z8N+JJpQYbl8l2BUg9TXnPha/htbkyzy/uwnftiv0yliY1IKotz8/qJuLoyfw6ep2/i7V7sXAj3OkRUngVwPjbxdBDaz3ZmC20QLHceletCiuS8FufO80uZTl9nYsa941t9NFn5dywbaAqg8se9fLPg7VLzxp4ivNduGY6fBM0cCNngA8mvlc74loYJcr1kffZVwpicbBV6nuQf8AX4n1Fa+Kb2/tVklGwsCCT1Nc1Fu8sbeMADB7+9fA4ji2vVStoj7KjwvhaDVloa8jNO4/eYIJJFZqTY6nlCM575rwK2ZVazakz3sHh6VKScPQsunltjGNwOSPXtUbSeYQXkxhuAK5XUUY++22ehVhdc8bWRKq/KSzfORkkd/aovNUclhkHgf41Eas4rllqcT5KrunZliOPdn5gNxGPwqHdjEjEbTkjHah1XJq0rM2qxjShzTSNNLGbCMj5LckDvVeG9dDEAxwEAA9Md69TB5ziaTcVK7PLqZZQrw5nFF0W7ksigEngj1qu1+4xJkg5zx39K+4yviZtpT3Ph814YSk1T0iaS2UjFPnJJfj3z2rNi1JztdSSQ2fpX3NKpKa9onqfB16CirL5s534hard+G/DmpapZkG5s03KrdDjrXnXx91yWy+HviCZQDtgJUD075+tethoOTTlscNKrJ1IU5aK+z67HQfCXxbq/jjQYdWvlHmSEYC9BivKf2XtenuPANlKrEpvYD36Zr8Hz3NqqxEoqT0Z/R0cooU4U5JK7R9YtaykjLHIIIz3rOXU5GbMbE/MDz2rzHmtblau/vOaOVUqbUlFamna29xFKsschDJIOB3rLOr3MCsFJ4JyDThmFeS5nJkfUqMZ81OO35nqKeLIbOHdeuFVEyST04r5q1aTW9W1uBZCF01FAx/e56Gvrssz6NGmpVndnyGYZJLE11UjaPc+o9O8XRXgVoojs3gKf73vXPeDLRpLJDLGFjGFDHq3TNcuN4wqTTjBfie7S4VoU4qf2kd7LrSsgLAHOcA9/Y1Vks4FUkHjBGewrycPm2IlK838jteCpR1S0PGPid8XZvAqadJHEHNzOiYY+px+fpXkf7SlrbPD4fU4ydQQZHbnj8a/ScHNxwLq9T87wlB4jNlSavFn01pPiaDxFotvcTRlluYwWB75xwayPA1pCnhzTFOCTapkfQV+exzqu5OVz9AxeV0acnCEdTc0y103Skb+z7NYopHyVQda2RFEAGCk4G4Dpn2r57GVZ1ZqUnc9KjCUKN3v27EX9qgtuKkL1we1SGGByPlwOpPpVOyglETTS13uKdTPCLjb1Pv6inR2tuMA4Pzk/Wqovl0bsayV5akT6oWQBQMnptpz28Ctheig5x3pyr3anDe4Tw1OUeVrcjXWrgMoUkAnoKX7PC0eDGM4I+o9K9CnmeKjH2cpbHJUy/DRb5Y3Q6LxBcK5zkgsASeprgNc1yWxuHtLa2G0AAH+7719pw9Vq1qlpSPgeJZU1B8kdD0KTWpUbOcDcCCe+K8WfWryRRukO/BwfSv0KCkkovU+BTpppN2R7NLr8w24P3mIJ9K8WfWL7CgyEs2R9f8/StKNCcotM6cVi1FJNa20O+1XxFOigGYkO+c+leXz3zS/KXOc4I/vV0qChFc+541OhWUuZyOlbxHqCyB45zt3AAH9TXHb2QgZOCW5NZuHtZ3lodVGo4K7eiO4h8R3iTifzCSNuOTzXIW7fvAXyAsgx71liKCU4u5nh8Q41Lp3u/uPV7Txbqd5KkUKDDsoAOeAOua4m21VtLMhiQM2VOT1A9qzqx5oKMUd1ZxlVsvkcP+0VMG1XwQpYqZbyBmA7YbJryX9oDx/BN4q8B2Unyyvcx8t3O7gCuDPoS/sxysfS8B4l1MznCOkoqzR94eGmUaNYu4yfIVRn2HNc74Zvs6JYneT+4XGfpX4A1Fy5ZI/YIRk6lpu53D3cTBlZTzwM1gSzA5JLAkgcd60WDTlzmmrbSXqbazAJsQ4IXJz3rE88qhIY4UYA7GuinNOXvLUweHnGygRXuuwWjqsrHzC4CqO/4VgPpkFzqEWpNktHgAHt619hlWaQw8bRV2fJ5hw8sTVVSb0OW13UC13MYwNrlTk9z603XxtndigAJAU9+lcWY8Q4itonY9HD8NYejTTirlnwddXA1y1zMQofcRk8mqHh5ymqwOMjOcEdq+dr5piJyi3I9TB5ZSi3GSV0fRr3pACoxwQBx1Ga5Nrr92uSc7gc+telgswrr3VLU5sRgaCle2jNhronG8nB4571hNMc/O2MEkAV9JhM8q0rXdz5zG5BSqSbho1r6mq83IO4ltxGPSseObflSxySQv5V91lea068OV7nw2aZY6EuaW7uaTT7SPQcHPbNVBKfNVOhZxj2zXsVIqUU3HQ8GWGs1CL1/yOQh+Ifh2412bwyLof2rDgPH/AHR618d6Xc5/aD1ZAMRvbhip6sSx5P0/nXhcVYyWAinDqfYcIZDTxlB1aj+R96tdLt3Kf3e7AI7Vgxy4RRnIYA/pX53/AK0V4PmTuj7V5Hh/dilqdCt6FAwmfnJBx1xWEsucYY/KMgDvSpcS1py0RFTIKLl7rtc6NtSUqEOCGbBz3riNb1X+zLSe8AJWNAcDufau7AcR1a1SMXscWa8OU6UU47XOvkvbdPlkkALNgAV5PoVzqOrSHUNQyFJGxGH3RX1VbiCnRV3qfO4DherJ+87J3PWBcIy4XOQeCew9qwUnbIBJC7MADv618vX4rq1WmlofVwyCjSioyV0tTY+1M0oBPy4DAislZSlwjckbQpB7+hr0slzKrXnaWx42eZfQw8Y1Fszp4irDO4jPIJrImvUgRmaTAjXkkj8q+8owSimtj4ytVs076G8JIWQqWPOcH0rxi38XS+IdUktdMYiytXKvIOjHuB+NcuY42lh6fNOWp6eWYOriG7Rsu/Q9kYxlQMhvmBwK5u3kZYo1kYkr8pz3r4zEcVuD9xXTPqMHwnGMvaVJG1JPuCmJcLyOKzhc4zkDHb1FeOuIq1nJLQ9WGQUI2c46kk6tPC8bOQGUrx2qubkBGAPAbPFebLPK7nyX0PTjleHpRuo6s5/SLdrP7SnnsxSQLgnpVa0uG/tG9V2yqzYGPpUQx2IjJuUgrZdRlFcysuhum4ldgSCcn8qgS8i3bBKC4IHPf2rqWb1Yte9qzjrZPQdvd1Ln2ojG8AIGxkmsLXrgLYyGMc5BAHrXo4TiKvBJ2ujjqcOU+Zcu7NmS9t40eR5h8oANeOnU5pVMUjlleVNwHoD3r38s4vp1G4z0Plcz4Sq06jqU9WepX2qxWdpHcgjbKTgDqB615frF3NJtiDnyioKke1faYfGxklJapnylTD8k+Vxs0x+sas2ozF2IDAkCue3MWyeSCCMd62cmtX1JpKMG4wY6UjcpySDgEDtnvXCeMfFtr4YtULyF7u4dRFGvVj24rnvCnB3dkdtDBzrNSg/e/M7UMgxG0gyznJ9RXn/h+bUrqJLzUJDumw21f4QfSvjc04so05NU3do+ty7gurKDnV0f+Z3M1wiN0y2MZHtWaxyM8kZA57mvjMRx3WlU5Kat8z6ajwlSjBOT5uiLDXz+WypxuJBz3+lVZMKu3GGyCT6V5FbiPFTblCR6+EyPCwbajb+tR/2iaRR85GBjFVGcxsmBnLD8D3rmqcQYuTSctOptLJ6MZc7joy5Hctt2sQr7iAR3FVywIGAM5Iz6Vy0OIMQ225aDWS4dx5UtT0Dw9eaTbiO4vHzcq2MHoBXn6N/tZBUZA6CumlxPiW733OOHCeDUee1n6Hv8PjLS5v3EcxEinAPavAIrhopiyPliwXA9692lx3WpSVonJW4PpVndHpOt6s1xdIzIBMrAEevNeetqE0s+d+STtJbtXu5X4hwqS5Jxsm/66HzGbcG1KUbU3c6eS5+0um/AVSQMDr/n6ViJdgKq8gA4z65r9AwOOVZJRZ8PXws6STktb6mlc3UsdrMFkbYFJIB61Sco8UowSiQFyB345Fd2F0qpvqcuMTnTai9T5a+CPie7uvij8Q7a8lAitJcRgfwgivHvhJrMth+0P4xt0P8Aoc7P5kZ7gn+dfn3iRy0cQpS6n65wlgatXAQmnezs/wAD71mkaQtJvOc5JPetC+jsR5U2nSZEgLFG/hGfWvx6vJyXMkfZU6VOE7LVdigiMY93fcOfTirHmxKgU5IyCSKjmg2lazNbuN5WKU67BGRg9Rz2ouJoism0EAZyD9K6sJGVKUU9W2cuKSlScupZhjdlG7PGCcd6v2iF1RUwQqrjHf3r98ympaipdT8Mzem4V24O6ZbtUwd7ycBTwe9cF8QfEx8P6ULWxkLatqLCKFR1y3f8K+gkk4c8mkkefhcLUxM404R1Z29lrmmX089ra3CvJA2GVT932NcD4A8ONpGlxNMxN9cHzJ5COXY18JmvGEac3TorTufomVcIWXJiJa6HZXE6ANgg4Y4B71VuFQOvAPJ4rw63GFeLfL0PXxHCeHacZbj47oLtcgnaMDHaqG8nbtY+Xvx/9avP/wBeMS1aUfxOSnwNhm09uXU0DepjgHd/L3rPtEbdvkUAZOAK+pyXN8ZikptWR4eeZbg8NBqErtmzHc58v5icgcfWqLgoQOfvA59f/wBVfoWEsocr3PhK+HjGClJ3eyNF2B2gEE981Bk+UGJPBA4odRNuKWhng4zpxVRq1hMneVJJxnJqDewBUk5OSMdq1rUnK0UbRk6uqXz9T8kI5i5Dno4GAOp9K5/wtPNqLWsQYsrsgU9/avdrYxU4Xm9EbZZgJVpKmla+5+k37K+gSG1N9NEVeWX5T3IIHWvcvgHoSaV4Y00jh3QOT6ZxX808TZxHFYqTi9Ef0JDALC4KGGb0W59CjfGo2g/LtAx3qznaUz2YHPpjpXzrnyxu3dnBSox5/dehXeVoo5GJJIB4B6VnaxMtvZTyZIYITn6U6NJzqRcnZGWMxS5Xfc/P/wDaa8S79Sks1lJRAOh/OvE/jpqzX/iO52knbKQc/Wv6C4SytRoJxPxbFZhGWLc0tFc9/wD2UNczJNCckCRic+v615n+yxqDRa9NAz7QHAIXvX5b4gYJwxC03P3fh6sq+V+2W60P1Vtr0cZJGGyM96wIZc4Zclhg5P8AOvhJ2TUUtDNU6tSnGKdkYXjS4DlEBOOuD7Vj+KpQblfMycYAB/h9ajGV1TprlepOEUlWcLXZ8nfGqzCWcF1swr5BY9sV1nxrsJJfCa3IGVVWLHsa/U/DXGqsnDr3PzrjSmsNiVOaun8j4M8S3SDSLna+CYSMj+LjiuR8UzsLC4hJP7vK896/fcmoyqVk49D8xzHGUYQUILd7DfBl3/xL4clid2F9iDWV4KwmnQOeT5vOe2adamlXlJ63PYhVlUhC/Q+l/B0onkRnAbLgk46e1V/BbsZogcBSwwR3rkrpxSTKptS5rWbR9Maagaz4xujjJP0qTSnVrRSDkDAB9c1NLlc+ZfcfP5q/sxei7HmvjCOPyvmUqqgkgd6PGeCsi+YQcEGvWhXTkmtjz8NhHJc/NeR8Z/FuDbpTbWJG/IFN+L0i/wBnvyB84AA6k11YeUuZyibQwMnKMZSvrexyfwtQxTxShjuyCPqO9Hw1ysoPlknjr2rw8RNtuT0PqXBwTpLd2Z+nX7OTz6nrxuZW3CNFUe2OtUP2YNXht9Zltnch2YYB6D6V/PviHiZyqKmlpc/c+E8IqeA9qldn6UQO/kKuwBCyggdz2NZMetQNuiQ/Mq5B7Hnv9K/OaeIk5xitD0J6U22/kbJlMaBmXpkHFccPFkIVgyjcHIAHQfWpji4uTT0sJ0ZRjGfc7N7oJs25w5GPrXEXHiO1uGgigmBkZhwvavWyjEUY1YyqdNjxs5w9ad1S0b3OluoLW8jeCeNGWQEEMAQc1QF7DIwiyd64JIr9owWMw9Wmordn5Di8HXoyak3Z7nxL4n0uPwN8VrC80oiKDULgLIF6NzXrPxX+HWq+K761v9FnWO8tcNGWHQjv2o4ryynjcGo0laaPpOBuIVg5So4iV6b2v3PedO1GK7s7d2bcwjBBPc4618u2Vl8ZtPhis0vLVniwpIBG8dvWvyGnw5jFNpqx+h085wiipJ38z6bmnwdof5SSR7Zr5kuZfjWnmBxaGRQd3XA9Mf1rreQYpxacdzzY5vRlVVSUkl6n0LfyoUhZX+ZcnivNPCx8V38IbxP5S3O8ACLOD9elTlmSYuFTmtaw82zKhOi43TvfU5349TI3gC9IJHmxHJ9OOn1rI+OUuPBGoRbiUILMh/iAHNftmR4iUIOM1rY/F8Xl8Z4unVpzvqjzP4IZXwfZ/PuX5iCD1J71P8Gyi+CLBlwA7vhR/DgCv504jbqYubm9mf03KlBQpRguiPXlkYH5mIHp61UEgJHXBxkmvlIV4ylc0r03GShBasvh87uDjAA+tVvM/dBgchsjPceldftrOyWgVIJU3KW6K9xKAV5IwSQB7+tZ88xchFJLM5Gf6V35dgp4mpGnfU8jMcV9Wg6stb2PHfiP4r+I+h28t74V0KK6ghG5gzEOQOpxg17iluJoJInXKspUg9wRyPxr9ey3gihKKdV6n5jmPG+IinOlHTsz5n+Cf7RR8f3914e16wNnrtmcPC/p6jpxXz+LBPD37SMxtV2wX0YDqo7Buo/pXzPGXCiy+Ma1OV4yPueCeIKOb4OTlT5akfO/6I/S2S4V8HghsY+lZFvcCS3gKqf9WDz16V+evEKdpNbHuwowdqMXd/maLkFgQ20Dgg96zBKxO0jBLDn2rGGL191FywzjNQTNJpBkqCfkAOD796y2diGxwzAnJ7/Wt8PiHSlGL7k4mklSairs27C4Iw2CUyQc981lWzHZgEjjPHev3fheu5UYo/Eczm41ZRS1V2eH/tDeKnstGtNGsZyl3rNwkK88gE4Jrxb4tahLr/xj8O+Hw5ZdPxM4PfPQ/oa+r4gzKGXYB129XscXA2XQzPM3KtG0aevq+h9UfDDRE03QLJNo3eUGJ9ema6zQ4TBp1rGowPLXgduK/mXFY2pUrOc92f0W5e2kqeyR0YZRHhQfnJA9qrg+WMMScEAE9h3rnWIcXGUdQq4dUo2bu7lkRhs4YjIAJHb3qDei524AyCAO9dcZJtXe7POq1eSXtF1T0OO8YnxK9kB4YukivACQ7gnH8q6+28reTKCVduAtfo3DnD8cQvaVD84zbiadOry09kfnxdfH/wCJ/wANfHlr4d+I+mRHStRnVI7uInZgng/5Ndj+2L4Zt7vwhBrSri60q8R1cdQAc4zX2WacEUauHdSk7SSPL4U42lPHPC4mOknuj7M0HWI9X020v4HHl3UasuDxyBXkfwG1VtS8B6JM8pbNlGCT24HWvwN1XGXLLoz9uxOFUXytaHuxYkqycnOMikidW3DgjOcentW8ZxWiOTCyUYObWnQc7uIQOO+TS5BXK+4Ip0sQk7N6nJTXMuaorLoipE7Q71fJPt6UcLLjBK1+p8H5rKrFKerR+W8V5W1PmpaPseC/tHTkfDPXTuPNm68fSqv7S8+34X60BwxgYk+mB2r9XwMlJyi1bQ/PacnLGUYykrp/5GJ+yqCPh3pDHO3ygCR3NS/suKE+HOkLznyQcenv+Nfy3nNWTxlSPdn9RZhg7U4Sl2R9SR/ISxbgHj3xVf5jgZIXPHvXDFtRvJnJGlGUFbS1y5u80nzHI4Oc96rFWIGT8m4A+/Nb/WGno9h1YuMUujNbTdMeZ94jOzJDMT0qol5cwwtBFKVR3ySf1NYRqc0nJ7djOeDUW1Hd63PXdP12wsoBbuyh0UAgd/p9a+YvEXxG0vw7LHDO00sxJDGNSQh9TXo4aFRQso6FRnSk0py1Pq/T9VOpLKFjKqrHG7v9a8a+G/xi8KeJ5V0XT2k/tOFQZVfqoPSvRwtKuppPocOKVPlknL3Tz79pTT9Sng0GazspZlt71XcRjJAzX1gbS0u0VbuFJApAw4zge1fsOTuUsK6Ml8R+PVcQsJmHt4O7Wx81eG/jToWi6LZW+o2F7HJb26By0TYGBySeMV6p8TdD0dPBetOljFkWjnO0fhXh0uDYym0pb67Hr/67JyjGUd33L3hPxtpHjKwGoaSWNq4IU+teM/s3RonhghGwoncr7c9q/M86oPDYh04PRH6pQkpU4Sjs+59KJuIb5iAAfxonnjtLeS4mOUjUkj1rlU1dJGqrpT5vQePM+QlcoxAI9PWuQ/4S+yIkRyVbaSAepqo1Iu8U9TTFVPeTcdO5r63q8Gg6fPql5n7JbLlynJGPavLNb8SXWrRtYyEi3mJQqBwa6cslCdVUp6a2PCzvGThR5lG1tjzm4/a3+Hv20abZvcm6M3lgPGwyc4H/ANap/wDhCtBkYOdLh3qwIfaMn3r9CpcIxklKEtvI+LpcYReko3WvU7ZvE76zbCdEBiuIw24jkZ71mw28NrEsUSYWPGFFe/kmTuguZa6ngZpmEcVdpWQ4EArxjk5Pqe9JJkgYJOCBgds9a+kjJRnZHyWJpxlyuK/4cmjLEIpOQuSSf51Cr7QxOQCMcdvpWlNSlK+x0zqNRUZK7CaNWZVXI2MCR60jMWcMpO/Cg+jY6V2qMZaS3MZV6kXpst0R4b5UbOQADnt71IGViGOSTwQO1ZRuo3juKtFO0G9HqIpKhMvlicAnvUc6LgHccnBx6YrLkUm2ZSgoycokkszFfL3H5MAkd8UxLcS7zuIIbOfXipgm2lLc3VSNOlzPc+D/ANqZbi48cfDWK2fD/wBrwEse2TyKg/az1CWy8Z/DeO1IVl1iEsQOWya5+L+anlM3LY+p8K6sVmsnS1Vnf9T9Mvh+kkXh7TvtU7PJ9kTex78cmvNfBniS7j0PTRvIX7LGCG6ngV/MmExatzPc/apQtWlNaLqe/SzwQwtJcNhCCCDjivILvW7u8ZUklAhOMD0zXc80hrJLQzUJxi2z2W1nt50VoZcowyPeuX8NyLHbBAyjauck9cd6yo4lSbminBvlZ04aONS7cRq5Bz71j6jLYaoDpjXRUTIQShOR/KvpcswjxUmoK1jxs0ziVDlctfM4DX9Z006jcQm+iMucKgcZJH418DftT/B/xR4TF38QPh/4mvo7rTZDJJA0jFGA55BJr6jHcDV5UlOk7+R4+S8U4WvWVKU7O/5n6CaAjG+tJHRwHYEMRwQeleVfss/Eyf4ifDbQNT1Uj+1Y7YJMPRh1/WvzuVGSnyVFZp7H21am6dd04vdXv5H1XkttH8IIyPQ1Ck/yMRyc4+lds6soJKO7ODD297n2JJfmZQCDhTmqzynCHOCDzjvWcKkkmtmKnJyfM9R6uEdevJAyKi3jIA4AIxnvXv5HmfJVVzw+IcvdaEm3dotSurEru4GRketVm+dQrE8sQCO2RX7ZgsStE3q9T8PxOGq0Yy7Hwhp5C/tF6ugJysBBA75aodLwf2jNVVXYg2gDg+7cY+vevmPE9KNKDfU/VPC+ang5Qjokz7ot3xGo5OQOahtX2ohLE/IST+FfjF0tnofoUOVXk+pd27iSOCF61CJuGYHoDwO9EK6kt9jilS5JOcVp1I7y3juYfLkG5ZFI2nv9aVptoZRkttz+ddMMRJX5FoxuarRvJaldEFuAijCcAADpzQ0oALO2CBgkmpnL2jUWzRwSSgl0LG5jgcksxBHr6VmR6xp6HBvYvMDAEFhk1ai4+7IzeJ57RubSAlw28kk9v61XguEZi6uGDLgbTwcV9fwxiG6vkfIcT0IOKk3qjy34xeKZND0aPTrNiL/VZ44YwOo3Hr+VeNfFHVW1v4u+GdDEhMFgplZT0J6Aj6Cv1DNMb9UwLqX957HyHDWTRxuJlWn8MPxPfvh7o6abo1oWYmWRNzserE811OmbY7WCEjAEYH4e1fg2MzSdSo+be5+y4anSp2kna6VkbqnO5AScKMe9Z01yIkwhxngE0lUvaKQvYSXMum5oebGXzkYUkZ9q4+e8ZY/vlSW5PpURrOMeVGroKokmrFrxF4gOlWTzW9o08pyBGnU1kG4Bj3sSSDwPWvsssyZYhKpJnw2Z5zDCzdJ6nzFqP7Tf/CI+ILu18WeGLmztfOXbPIPkxjrmu1+L/grS/G3hfWdNu7ZXleyYpJgbkOOMV9K+D6VZq0rX8v8AgnnUuNvYctOpC6vvf/gHXeGPH+ieMYYtZ0K8EtpdKWQqc9K/Nn9kDxJqWi+IPFXgu5u3aHRtWlEStnKgnkfT0r8t4jwlTAVuSa0R+l4b2WIpwr03dM/U+710zIBLGQpyGI7H1rhp7xnGcnDdQK8f+03KWmxpTUW20rdCU3AYlkbI3E5rNUgZBz84IGPbvWE8TokdEoSUrrZGtHdtMoicnIbIz3rJSVUdTyB0HvX3vC+eTUvYN6bpfofnHF+Spz5o723NaaZYQSW2hQQx/uj1rhfHWqPpXhXWtTWXb9mspDuP04NfsGAi67Ubn5m6VWlHRXlsfM+l63L8RfizqEzSb9K8PMsSjsr55I/CuY/ZVJ1GLxBrLtuF7rErbvx7fjX5hx7n6dRYeLtGP4n7HwrkSw2FVV6zktfI+2Ix5aKiLkDHA9+woVlRgA+WznB6ivyeFVSab3PpsPGpfni/UlBLMRuIVTgD1qPfGSxV+B1FZVKzTba/4B10pJ632/EduKqWHzDaSc96ibbIVXqoIyD2rbDfvZezW/QMdVVGl7Wep5n4v+K3hzwduXUYLl3ABPkxlvyxmvTLrQ9I1BGS7sY5NwwS6g5r9HwHAylTTnPX0/4J+fY/jxQapxjp5P8A4B4F4S/aO+G3i6+fTNN1URagrgCGbhj6jmvlf9rv4TaT4Pk0j4heDbdbTVbfUFMhi4DHIyTiqzTw8qU6LrUHdb2senkvFlHEzVKd1NfP5n6NwTJcqrowKSLlSvcYry34Sa3cav4J0O8uyWuHskZie3Ar8jnjGvdatY+wb9m1dXXc9Z2D5GV8ZwcHv6VAHd1wSdygde1c6xCmlBG7qc07p2SJWb5lZiQMjA9T61ExACqScnJ+tdrrQkrLYVOnUi7xVy3byN53zfMpwB6Cq8IxINrnkDBPfNffcHZvJVPYw2Pg+L8upxpe0ktXc6BZxHFNGT96NgW98YFUt6xRHcxKkYbPcdCK/a8DFupGUT8kx+A5cPzxlqfnh4MVYv2ivFMsbYdn+YDtz1xWd4OkEf7S/iWPDEtGVB9iwyK+J8W5tKM29D9a4Fg/qSaex+isDvJCHPpkj6AZqezt2WH55Bh0JAHb/wCvX4XTcptNdT7rmUlZvUAr7ATghAQARz9aQSAAJuyQSSR9a2qVrSs+hlKi07SenYE3Z+YA8g5Pb60yOQcndkbsfTFbYbEqNVOXyJxelByeiNqe+tdHsJtQu5AkMMRJJ7/SvE/Gutt4p1iz8G6a5NlGVe8lXpgfwj3r90oY6lh8Mq1eWnRH488ir4uq3DRLdlfw5bXfjTxC3i2/VjaRyNHZRt0VeMsQfWvYtC0u306xgt4UAEKADHfivgs74yniZcsVaPRH6Fk2S0qFLlhH/gm9bjyYACV+UEAelNRw2/HGOpbvXyHO5z5pH0CwvJBNdTFuSTKeoUPwPWpWV5JdqcE4AB7V6dKMqr9lTV7mGIrRoR9rJ62sUIoyzqFJ2eZk1vx2ke0JnMhIDAdT7195kXCNqntq2p+ZZ7xVLldGm7eZlblB4BC8qCO1dKdDd49xmKknoR0xX6VhsHGKUYqx+fVuWUr1JNttHPnDYOScE4B7ZqSaIwOUL4wTkiu2NGSTRvUcZS529FsRtMoQJkkp1HpVJv3gOOOSAaccNKEkm9TCWKVOLmldkm444bHcGq7k7BjIOSST3oSTd29iZyco8kd2fkL8ALWXxBqOjQGMkRzocZ5r1P8AYx8NT3mtQ3Ui/uoFXhh0z0NfD8d8QOjSdKO7P2XhHIY1U8XVVrH7E+B7NLDRrSJBjy4Vz6V0GmR+XbQRgKAIgpAr8N9tKOsup9JiqblJq5sh3C4JBG5smolck45KkdadaooS0RFbDqMYpOyOM8d6j/ZuiXcu8DZGxO7vkc1h/EXR7/xBo1xp1mwWa4UgEnp9a+g4flGVZSqOyPleLZVZUOWEbp6H5L/ETUPtuuXkiyk4kfBHeve9e/Zp8W3Ms9wZFHUnA44PUV+85bn2GpRUVI+Bw2Q1XqodDyn4B+J10HxeqNljMoCr6561p+HPg14w0HxlaahKVFnbuASvVvevzrxLzWh7KNSm7y7H6zwBCU4VadT3V08z9T/Des2+oW8TqwDBVJX1rxHQ7q9soogs7iRVIJB61+K1MxqSbb2PrVh6Ulywdv8AM9N8WXCSXRCyAhW5IrjXuJLhszOSzHqe9YzzFTXItVY58JhvZxlUb1T2PLvjt4gubX4f3sVrCDNCu5Wbof8AP0pnxTs/7R8K6rA5ztgYgenFfa+H2aujilF9Wfn3G9BVaftZrRH5PN4pvtY0/Uzqs6GfzHG1D90Z6GvnLxpf3vh/xHq1rFM4imuGXb6c1/XmWYmKkpw2sfilaq3FSitbn2L4EljbTrX96Ad2Rk9a+Qfh5rWuT+IbGCK+laJnUGPJ24B9KrEPlhKaZ2YROrVjJrRpn6seC4DLJEOqowIPpxVL4fPIVtS8hBdVB9uK5Kspum5rRnZhJxgnGXvWfofU2lqgsvLGAcDJqnp8u23bB/hCkHvWNKbm1Jo8PFKE247I8z8ZvsZ9wO09CO9N8YS71dCvDKRz+tehCceXlS3OaOXKnV5pT7WPiX4xTslqvHy+aMZ7+1UfjNIPLt4iCWMpAAr18K+Sna5k6DWIvDdfqO+E6ma5t48naWGP9nJqx8HOb624wqSKAT6Z718xjZurK76H22X0PZwcuW6XU+orbxYnws8T6Re3UxjtdQlVGbkLkn+la/xi8E3HjjwSsOmKov7aAtGwA+XA6/Wvgs+4fhjsK3F2mj3eF+NPqOMeFxOtOXXsfdvh7xemr6dDqFpICk0O4EHp/wDrr82f2bvjvcadO/w48cSCDWrGUxIzkjzAuORnFfzjm1Gvha7p1otSP3OCpVqca9H3oO2q/U/SRLlpN7vIQJZOR61jw3cd3GksUgaHqCvQ8dR9a8KU2rSZ0RwEJwuu50Fo3lT+ckhOzuc81no3AZSeMge1bSxCcVNIU8M4UrR3PRdBv2vLmTcScAcelcvpOpxWSE5Id+CRWkMfOCi4u1jxsRhFZKS3PXvMEZDDJXgkHtiud02+e6tWcklVbAz196+mwfE9eLVpbdDxavD1FwalHuN1O/jt5BMAWXdk49RWDcXauzx+U2CSSSPevr8L4i8kkqkLpdb/APAPmq3BkqfvUZaPyL41cXgJK/fyCT2rh1vUtXKHcIS2QfT1r6vL+McNiXaOjPk8fwnWhJOT072Oie+eAqmTgsRkdgOtZLOl0RIsmQq7lPp/+uvsadWlNXifM1aNaEnJ6I8q+O10YvBGoSsSc4X8D3rG+Ps1vB4AvDKTiWUqSO2RgV3UIJRk30RwYGbljKUObdnH/BZ2bwxa28cpZCwKA9ge9QfBnTbmHwtZshYwpGDuNfyJxVWccfO+zZ/XHuxp031SR7u2l3SRRyK4YNwADzVe3vrmFfKD5VjyDXhUpqKc5Pc4qmIlBpWuugea0JaPbkMSR6UxyCAzjDFgT9K6cJVVnFDq0HUaclqUyC0oYHHOcDtTo5F89SvI3Akd8V97wdiE66jY+Q4thFYbllLV7muVMURL5GGJYjuMVK9wstuUkiB4yMd/av3/AA8IuEYy0PxbGxbi3T1Wh+c2vSyyftHQlePLiyCPr6VDeOp/aUmLMS6RRkewzzXxvjE1HBUlFn6P4K4apHC4mpUd7tpeR9+2ZItYcNz5S4Pvio7VkFtFkYHl5Pvmv51VZpJM/VKbgoKKRdXcmWP1Ge9EW3aGLk4IPPehK3wP1FLEpSu9lsTKfu5YldpyBSyMAFXPVScmu+FVOcb7GEoRqwlUm9kOh+WGV0fBw2QOx9KgDKlo5GcEMSP71f0NwfGMqMIx2P574rxtSEpQgrHwzZ51n9oe+eVcx2VuMKPXd0z9KzfhncvffHbxRJI5JjlCj8+K8jxYlyclHofp/g9gVTymeIa1kz9D7JfLt4hkYEYGPSo7dgIlB6huo71+JS5aSva+p9dXk4SUm9X0L7sHPUnAABPeoUPO0gYyAMVnRxEVNR7HQqjqK7WnYkblWUEg7QcjqDSu6rGQzEFSDgdTXoqfLNOLvqeTU9pyynBWSRHahwV2gkuxBJ96linUSKw5+YDHav6A4anfDxTWtj8SzarFYl8rPm/9qePzvhlqwOMqykk984H6Vc/ahkWT4a6m752AHIHYCvucLT5qcpdkz5/C4qDx1KMV7zktfmU/2bGx8PNHTcTiAZx/n8qf+zcoi8AaSg5V4xgnvX8mZyrYudN7Nn9V4/Eyp1Ipq7sfR0ZOQ3TcwGR7U0MFIAzhTkj19a8+MLR51LYmhG0LSW97FuOVv4lJ2kkk9qqeaeFXJUdT61vKTlG6PPUp3bluhHb96A2Sy5JIqpIwEyLyTgsAvfnpX2XBWIk6t4s+J4silGTb1PAv2nZ2i+F+rMhAIHG7/P51nftTTMPhXqCscbmLEdzjqDX9EZYnySu+lz8epYhPH0IxXVXLP7MT7fh1onGf3JJB7ZAxVn9mxUHw80fbnP2RSffgV/KGZV74ybir+8z+q8bOUakVJdEj6RJOzK8MqgEnt71GMtgknaXwT61zVKt5crV2zhcFFcz6FnJwjlsEkBh600EAbmByABkd8VPtFz8z3MoTcpezhqrXHzynOw5wWAGPSotxdl2cfxAmvouHsuhiKyTeiPn+J8yeEp80XdMgl0mxuijy2yFiTkkD9atHKRoTknP51+64DLKcIqFrn4pisxnUk6kno3ZG74T0Hw1pV39uFvFFeSY+dVGT6DispLhIk+8SUwQT3rSphlKabWi28zfA1pRV5Ssme6xTCUKynGSB9M1483ia/kZDbuVSIAAf3sdc13NyivcdvI81YRTqXfw33Oh+K90LXwJr9xK4EUVs24nsMfy9a8w+K3io3Hw28TLfuqiPTXO0D7x7V6OUVbyUJvVnl5rVjTqxny35WvzR5V+yr4rl1e0mRJC1qLhwCvTrXm/7GWqR23h0PDGUhkupCwHru5r+aeOarWYzitkz+sMLSjLBUp9bJo/QnxEsz2YCTgFiflb+L8f/AK1V9Tjh1nT1NvchWTLEk/nXhqSlTUr6Hk4OpFYrmmrXPKZVdWw+BIG6fXpVm4tJkdsSB06Ej9K8ypNxk3J3Pcp1koOMX7pSCxny9zHIkyBUcrBJYlIIIJBB7+9ezw9JyxCmnsz57iHEr2XIuxpgkfKOSdowPemIy7fmbHIwa/o3BTUqab3SPwWNV3m49wRwynHscHtk1EXGNvJxxx3r0Y3jO97o1pU4qg3bUQZzkHHzHj1qN3ByMEFRgf40QrO/NsVDDppOK26EpO8FBghcbiO2KjVwoPYsQePWsI1FBqwqtN1rxeiIznCL0YEkEf1qTduU8EcYIH612wkpO72ZFRwVqKfvdxv3dnP3gPwoZsjYQRgg0pYdfEnoYVqajOMZT/AeF6AnOWHFObCqq4IGenrSU0mopnS1zS9o37vT1ANtD4zjaRx2Paoi4TywM9eR/epuCabuc2IpKpTs9D88v2uSW8afDhZGIB1WEZHfk4zR+11IzeOvhwgXI/tWMH25OK5uLKTeSTa3R9R4VYmEM2fKtLOx9o+E5I10XThlirWqYJ6njvVbwv8AJoenJklhAo57cdK/larUbldrY/dKkpSm5bp/gd4oQhcHDZyT61XtJI3+8xBHOfr2rzo4qSfI1uU1KMFJbI2oYZmeMCdk80gKVJGT2/zipLFZHliJYhY2yCO30r0aMeSHM/uM44ipdytodNpekKJZLiWQssRBAJPB9q6HT/IjUsuDuYEZr9i4F5J01Jxsfi3GdWftHSvvrc8b+JlkmseHPEFjcqGFxZSjae/HGK2PG80TJqaRnObdkweMEjnNfrWHvGcWtUfAvCRlHnTtbVM+V/2N7iTT4df0nhY7LVGVcds45NcH+zH4iez8c+OLJmyq35IA7dua/FOP4KjjrxVro/oXKJPEZTSne76v7j9QhKpAIIwQMY7V55Br8i73LEoAAM/w18DUrqLS3Z2JcyipbO56GxKjOTtAyMdq5Oy1kT4UyHO4DJPTNU68KjaudMqUlFQe3Q6gu7ID06EfSsC91u2iQqrnzFQEEevvXo5ZXUZxgzzc0oRhTbb1OmVwo2DJ5Jx6ZrhrTxKmW8xwTtJUHue/5V+55TX91XV2fh2aYdTqNJ8t+h8h6ZL5P7R2qOzEkQEhT3APNcFD4m3ftFajEj7t9qVIbv8AN+nNeZ4qVkqVO/Q+88OMNUeBm0tLn6N2sg8tOR85yAOlclpmvW8dqkTkiRkAXPY1+FrGRk1JdT7+OHlFJLZHYeafM4zjJBx/DWXZXwvJGEecL1960jiE4JQ1Zu6KTs9UaMk6r67gMf4VSumVkPzfNk8ntXRCu20pKzOepGNNqcNtjN1a2/ta2e1S4aNSBllPP0zxWf8AaWjTduJy4BAr9O4ayGlOCnNan5zxDnlZTag9O55ZqHwR0vUpHuhrl9HeSPndHKw2/TmvXbe7C7DvP3sE9wK+s+oUZe7KN7HztPOMRGLm57o1vDuljQ9Ot7NrmSZoIwgkl6n3NX2uYntGG4k449TjrXTQy2ipJQVjhzLMa6pqUpXTPii5v1vv2gb9eSlnakID2Jbk/pXC6Bftc/tGeJF3hhChHPfJ4r53xMq+zpwitj73w/gquDdR/FfY++4L7yoo9xJyMZ9a5h5JNke0kBCOK/FlW5puF9D76rQVozaOo+1x3KsjYwvQj1zWLp6MGLtKSpIwDSnj1JqDN1OnBXi9WXHbcdsgIUDgn271Yu1WdCFBV40AyO9dEZNK6YqtGMpJSKqOojfkGTcSSO3FcvLctbvJE7Etk4Ir63AcXRw8FGpHbqfGYzhGpXrNwlovIg1WRfKnWRuRGefT61gXlz5i/MSfMXr656V7tPxHpRSahe3n/wAA8b/UGtOTip77abfifnr8FfD+pad8bvHV5JZPHayXjbWZcBxnnFfc9tpOnwXJuIbdUncEOwHLfWvieL+KlmVRSjGyR9/kmXvB4eNCb5mmb0RDRLuBIwRmm7dqj5yVxwB396+RtJt00evShGjNOfUjLEkkHoRkHtmkwDgqflBGQe9Qvdd477CpuXO3J312IDI3mruzuEpGc8H/APVTpXwUBXAJJB+or6PhubWKi73ex4nFVo4dpaNnOeONGm8S+GdW0S3cpJf2rIrdsmujR0YKckBcAn19K/oLK686EVNbn4fTjOpXU2tF08z4E8FfBj47fDOOaz8OeJrVdPmlZwHQlhuPfnFffUsmc/KSvJrzsw4fw+IqOpUWrPTp8VYunBqNm0fJa6b+0oTGja7ZNtONxU8k+nNfVZljIjDg5QNjP615a4JwqlzKJ6MOO8XKjaKV92fKv9l/tJEgNrenkk4BVTkke1fV0IGGPIPQE96cuEsJTk2+qIwnFuJk/eWq1scB4Di8ZxWQHjK6STUFYfNF0b3rv5Hj2gEAtkEZ/pXmQyjLsNPmb1O/Msbj8TBShGyZeDMNg5JGOnes43UhGEyqDoM9a2r8b4HDLlWticNwVjK1m3Zb7HhXxy8I3HxBh0nwzCoFq+oJJcOR91VNe1mFWKued7ZJPevncx8UOehKhRjZyVm7n1eRcGww2K+sSfM1sc14S0KPQNGtNNjGEt4QPpgYrqmAIwmVZcjI7+1fjNXEyqyba6n6BGKn7kduxBydvzE5wGI7/wD6qkjRkAGe4ABHSuZxlCScTonFXUWtdgG9htBw27g+1OCMG4BJ6cd62ippKDfzNIUORNrcfGxEkJYE/NnHvU7I4WOU527gMetfZ8H64lNI+E4pko4f3n3LW4yI4XGMtgHsTVJ7opE/yHBVh9OK/ofCRbUYo/CsRVcqjSejPzs8MEL+014gV2+UxZDDvzz+VV9KZ/8Ahp3WDHG4Q26jjoeeTXxfi5SUqdOT3R+v8ETj9V5FvofobazkxRAM2dxOPX61BZpJsTKE8DA9K/n+bcXY/RaNNSbk3e6NL7p6k7iQKhkhkIjdEfr3zxXFGUuZcvQzjQ5nzSe/6CfvWzsHIYFR6mp7eG4DxNtOA4BB7c124es171tncMVQpum1HZ7mT4b8H2uhNczg7p7y4aR3bqxJru0jPOWGQwwPWvQqZjUrRTkzl9jSpSi/skkWIwFGcKQQfX2pydfmU8kDHpXPHmklrojpoU1Juben6CxvtG4jqcYpmNkhYE/IOAa93LIKtWUXKyPJzDGSpwc6a0Q2BNs0jlgQmARUGZDNuJ+TkgV+4ZHktOlBKG/c/Fs1zqvVqupJ2XYvQTFJ8knapyTUah1IkwADjINfXyiox5TxHTVWrzvqdIuqRzRNC8hDDADgdK5tnZcuBknIHt9Kqm5KKkncVZxU+R6IpXAxK3zFuM5PapCyny8gGQEcevNdDbm7R6HJHno3m0ndFANhSAcn1HvWiCm08qCQM47etOtF1HFN2M3WUoc8nqjGZsFQcnJwR6VaupIITgqp4AI9axnRUVYzp4qTnGm1dP8AA+bP2PPDUVtpseoCPaSwAJHXpXu/wK0RdH8IaekahZHtV6dzgV/NnEuZvF4mUm9Fsf1LOnHCYeOHp9lc+k/tcNtGvmOMDABOOtecX1rrFwxjHMQIJya+eeId0ktUcHI2mpM72TxDp8cakyjILZ/2uK8ams7lX2O2MZGD2rllXqTjaas2bPDxdNWZ2uoeM1WXbboGU4zntj868/a1mAxgFm457+tE8RUbtewlhoOKU3dG1eeIbq+HDlRknGeuawpLKc4G3A5GRjn0rkljsRyqTeiOjD4Ok2+V2vpYjkAMm4kFmAJ/+tSiC4BwQeRgY7VzOc5NNvc3p0FFuVrxQijaASTtyM461KIJjhcEqMEk1yuN4qJ1QpRkvapWXQnhVvKTPBcHBH86kQFVC8lBk/lV04uWm1iJ1Y0lyxV2cp4ltjd6beQEA+bGVOa2r2MSJKzKTuUkZ716+VYvklGqt7nk53hlWwzjJ9z+fT496O+meN9RRs7WuWIB7c16t+1voUtj42urgKyrIxIA79ea/sLhHGSrYaMl6H824+UIylQtqjwj4TmVfEdo6Mu8SD5nwAfrXA6Rd3cFwgi3g8YK5yK+qxNKUk47Jk5XiFTj7y1sfsd4ACTC1+YCQ7SAMYJzXyd8H/GOt29xYwC9ZolZMI+T+dcmLoShFcjudWX2nFpNRb0P1IsYlNkrHlh0NZvhm9Go6PFLJ8rtGCSfpzXJRqN6Nnk5pgHTntd/ccD40zh2VwGLEAD3FR+NJlBcDhtzEE9xXqJOKbbujiVKEXCaXvJnwr8aJS3k7T84yQO7HNZ/xikzdQdmckD2Fe7QtCgm2clJzr4qUn1Oj+ELgTWzHIJxj3o+D5UTWyn7+Rz+PWvkMbZVOZaI/QKSnToeydm+5+jPhGUXljBHIowQAx7mpPBW4W9vlTgFe1eZV5Vs7HkSrtw5pRuzyP4ufs26b4znXX/Dpa08S27b0li4JbtnGPxr6+sWbd82djHn29a87MKVDFU1SrJS7XNMsxOY4GrGvgptRd7rofDHgn4yeKvhVeW/hT4pWUogEgjivVB2v2Gc+1fYfi/wfoni2xktNVsY54mjK4kUZA9jya/NMw8PMJWk50Z8r+9fmfouF8T8VTapYmjzX3s7W87WNLw14w8PeK9Ph1DRtXjmiuACFVgSvNfF+tfA/wAT+Ar6TWfhnrVxDDlmNkWOwg9QBk18fj/DvEU1enJSXkfb5bxthKsruTT7P/M+797I3Dk4Yk+/PFfBGgftO3nhXVYdA+I9hcW1w5CCdgdp+pwB+tfCZhkGIw0rzg0fRYDFUsRL3XzN9D9M9A1aRYo7fqdwAPr71wPwu8U6N4rhivdMvlmhkCkEds/nXnYSrKnJJo68VhFKKlLZf1Y9ZuJREzmVD8wJOO4NN125nhhWWIAoudyn0Feg6kopOe1zyowi7xb0OK1S5tpGYxjhiRkdjXN384kZmQ4J7Dvx2rDEYpwaUHdbm2Coyk3z/iLFqPkOI2kJDZGKxbmXy9jhhwxIPvX3/B3FcoTVOe1z4LibIY1o6ep5h+0Tqsdt4Ac3G4W5ukLH0wRXk/7UmqM/gU26ykh2UYHcnr/9ev6Dy6u54apNLSx+NYNQec0YWs29D6R/Z2ls7vwPYTytiKSMlA3cADAFea/Ai8mTwLpA8wgC0RjnoDgV/ImZYuP12o5a63P65zLDNxjGEtbJH03qmnPJI8kdsq+awKlemBWNF4huAsYfLbHxgdBXl/WfbRTjocv1RRleLu0ZtzvV/LbA65xVy/lhuszRLtcnLH1NdHNGmlrc5/aycHOW5gBilyqE/KoH459arStsuI1bGW5OeufavveB+aVbma0Pz7i/Eyg+aS2X4HQCT926jtxnsM1nS3CLCyscKcgHuK/fqV2lZH5NjK8XCUktH0Pz6aZbr9o66L87LcMx9DnArP0Zxc/tFa0zNk+WuAvpu618D4xyhTo04tn6f4JuTwFVNWd/wP0Hhm3xR8YXapGf0osoS8MRByoUD6V/PtTWMXvqfqFOScrxXzNKNhkKecgde1KIjuUEZ2kjPoa56FF+1ckzaE4wpyb1LU2CoKkkgEnND/6vJ4wDgDvivcw+Gm5pI+fxdSVOjeOmpTcqtlJKc5RGPHriqsz+XbSh2JVkYc96/onhGMnTg4/M/BuL68FJxnv2PhD4MtE3xo8WyMuXa6YNnvzVH4O3Cw/HTxjESfMSUMB6ZJzXyXjHd14NH7B4WU4yyNVI6O5+kse3y094wcmoIXDwhhzkLgf1r8a9vyyV9z7GtTjJJvVoso+VUYxg5x9KjBHQEZySD61PtVJt7IxUJKKk9GTSbzEcpliCMGmyzMsbbs4CnI9DxXpYFz9pGMnoYY6jTpU5J9VdjbYEBQQAS4z7n1FZsd0AuATkMa/pLIOb2CbP55zzDqNZ1WvdPCP2n3m/4Vpq0RwoYgEnqc9MVgftTX6D4d6hCGOZ5VGPXPHFfV4f3KM526M8jATVbNKEG0tdNDrv2c4hH8PdDPJcwAsD24FT/s/EJ4A0U4O77LGCT347f1r+RsyjF4yck+p/VmYQ9nNQn5Hu25kcKTnc3A9KciluDzhsZHevLpVYSvCRniLWi0tv1EJOMsecgkjvUJJycMMBu/arlJuKXZnQoqNNzX/BGlk85GUnO0E+1UJpgsyjcQCDkfyr9L4NpJ1OaL0Py3i+UlFSWj0/E+eP2rZsfC/UgpxuYnnuRWH+1feY+G9ztc5WccD6jP8AnFfvGW01LD1HN7Jn5Fl15ZpRco3947v9m4A/DjRN+CTZoWK9uKk/Z2UD4eaKSwGbQdfpX8m5hUi8XJxdlc/rXMWpSlFvVWPoiNlCkZ4GTzUIyVG0gkHk5rL43zxeqPMlRU5RlHUsq3XHPOQD7VAWxt4Oemawq4mTkuU6YYWkrtu7Y/zY2mVcncF6etZN1cLG6Ek55AI781+icERUq7g2fmXHdLloOb2NuRn2Ej2PPesIaiGVVLEN1z2Fft9OjyS0PyWdSE6cXeyW/wDmWZGfyyC53MBgnt9apG+RUGMD5jkGumDTfM1qjllSUVam7pmlBKhK4YkEg5HasSS9KMpGApBbjtRDDxlFtbmmIc4wTg97fgc18abtbPwBr87gGM2TLg9Dn1rz74+6u4+GeukOTm2O4H3r0Mnwl25PSyPJx9STnCMndXXzOH/ZKmi/4Q9ZSMK11IxA7Emsr9j6QP4AtGIYjzGY/wCFfyRxxVTzCq5Pqf2FRw0nhqSekeVfkfb8WrTRK0ZdjE3AArFY7Wyo+QgbQe1fNUKzSujCphI+zUk9jSMhOAkpBc9BnAz0NVY8lQxb5uwrqgnBNy3OedWNrQVub9Bk7ZKHJOXOTjknvVK/m8uNGDFSGwfXmvoOGJKeLjFadWeBxQpRw6uawmUqnOFzkZ7VyUWoqwARwAhI5Nf0dglL2akl6H4diMY41JJxumdUbn+EE8YIA71yjagAUIfkMRn1r1VFxSnFamKupq+2h0nm/vA5k53D8PrXJnUvnbknJIINX9XnKN2tjnqY6UK3KtUup1QuMg4b5nYnjtXJm9ICqGKlQDVvCyUbM5qtaE71JrV7HYC9jHXJAUDnt9K4tNQBAG4j5jyetYVaThaT1uZ4Zqbc4q7R14vD8wVjuOMH0rkUvWJC7iMkgc8mt2kop28zslGU4qTjaSOve6dVjIY4wR+tckt6QBuclQwxURpuMbp6HVDEe0hr8zrhdjaoOT8xBJ71xw1IgBGGFd+T6CtvYyUVGe5y4mk5U7xd0z4q/asmSXx/8OAshydUiBAGQMk4FVf2gZItQ+Jnw7hcgRw3qOV79ePzrxeMJyWTzVvQ+t8IYJZjUpzetn/wD7j8NqP7H08AkH7MoBHfA/rWjo0MUenWnlnMSxKCPTHTFfyT7GVNNLVn79Fw5OT1NSJSMIi5QkEk9q17Jrdo8uSNrZJP8qmlG7dRrXYftoqEYp3WxYsJ1iUeYSCvIHr71nXkgDHY3GCMetdkZ8lRJu6MqlOc4tw3SOns9YluFnHCvHJlMn73rmvKZNRlgnzG5LBs81+7cDtzw6jJH4hxTXlOtzvS97nQeIrt5ra8aQ7ZBbyHI7ECuR1e/MtnfSyNgLbscjscda/UMFTbnHlW/wCB8Bi6XLBxTul+J8b/ALONys3xT8cAqNv9o7G9CQelRfszpb3Hj7x3LDgXbarlwD1Hb8etfini5CU8WovSy1P6F4Iqe0yilCLtfb8D9I7ZbHais/LKM56VzRPyjYxJxgj0r8utCEVFo+gwVGVRuTesTs0t7Ao0YmABYEgHriuLEzqBlsFVJyT61hPGOaaitDdU5QV09UdqbC1kjd2lB4xnPWuKubuQRMPMYbQeRXZgK0p1IqJ5uZZdN03KctNzS1BoLf5YXJ3YxntXAz6oz+Z5jHYq4BP0r+mMmgpUoX0P54ztOnUclq0fEei3cUn7UWsRuxCPEW5P3ctzXJ6BKJv2o9UkJxG1qCcdzu5x/WvmPF+m/YU0mfrnhvi08vqXXVPQ/Uy3tbeVArOQdgIYHr+NczbyzeSpEhUBQeD09K/nqhzQk21qz7ylXjOpZvQ9F08/2coZHG12IOTXENdTnbiZiu04GehqFiJX5mhOhCfuN/M9ClvPNX5n6DABNebS3U/lMxc5RWyM9fevap13KVurMakIOHI3c7HzYjtUvhtx4B614p/wkNzHN80rZTkAdv8AJr+iOGUvYxm9z8N4gpyVTkiuup7ZG0OVHmEEPkY7Y6V5JFrs5QsJmDccCvpnTT0b1Pn6qUUrq57O+oLGn3ztbAJHUe9eKy63d4XbOwyeo/hrSlSTkmncyx9ZOEqSj0Pm3wNcrL+0X4oB4EilSD1U7uc14t8N9fvZP2l/FMMlwxBiyvvz1/GvzfxfnKKhJPU/YfDqpUqZcoRiuXQ/WKGUNGu7AUc/U1xlteXJii3SHlMtmvwxVOSKUkfYSw6lK17Xt8jvUlj2EAAFfTtXCi4nIUCQjkkkd6VOS5m3uW8K05OL/pHeSTNJtCNtfb8xBPpXBS31wUfbKQ2Dgn6cVrTxF0uVbs0dR0UpVFfS5vz2UUpYSSgygnAJr418W+DPHOralcXOnfEa9s7d3ZhFGchc/XNfb4XgyvXgpx2Pmv8AXDDxqcjfK3ufXL6XbBVDvkKhC89a+Dz8O/io4Zn+LGotkgAZHy8VT4BxMWm3ucz42wk/glrc+7/7KtThN+JDgAZ/+vXwQ3gD4qRfKPixqIRR8zMQQQfw7VL8PMVKbaR1Q42wVKN5yPvRdLtX5Eh2qSQAf0NfAcngn4uRq3l/Fm/CkYwp6+taPgLGSa5Va5lDi7Cwqc85XW5+gH9l2ijJcYY569fpX5xt4a+LUMqgfFm+2jO5QBx9KUeBMUqei0OirxZhqjUOfX9D9D7vTrNUjCyAgyEAE9a+T/BN34n0ywSDW9dlvLhWBMkhOTXr5FwJiKVVVpbrofP53xJhVaClc+oFgswQWbDFhnNeQvrsyJ50lwQkYJ3E9MetfruGwLjStJ67n5JVr1HiW6d+V30PWJfsESqXlVQCSdxHHpXyPaeLr/x34kn0ywun/sjTpAsrg/6wjsK8riDN8PgaT9uz6LIcjxGMSa91XPrWyGnXT+Ym0qnAJ9fWuIsAbWCOKNiCiABR0JFfjmc+Kc6i9nSjZX3ufpWC8PaMJKvzXkrHprW9mdqOy4OAP/r1wTTyHhJD1BwM8V8bX4kr1nectD6vAZRSptQS111O6aHT8qARgFSOn41wbzvErM8hbgnB7V4jxspytLY7Jcicot3S3+fU7vyrI8blwQTg9vevENb1zUFXytPkxISQXJ+76nvXsYLKMTipJ04aHl1c2wtKF5zta57U1xpFvs+0XUSrwTuIAHvX5gftM33inRfC8WrWXiK5S6N6i4QkIAT35r7jD+HOIlRnVlokrnhYXirDutGlTd5Nn6ixS6bMhlSaN1UlgVI4HrXzd8GL+e/8C6FcXk7vJJYIXZifnyOc1+YYm1Oo1JH2VecnUUabuj6cX+zzyHUjoenpXA+aQqsr4yemevtWUKyumlrex6FGrKb9m9dD0DNierLlOcjHNcIJ2+XDHB45NW6ynKyWxy1ZVHZxfkdVqF9YWsUeXUJ1JFea+Jpf9ByrHjBIBr7Hg+rF4pNK3Q+Q4r9o6XK9dDqV17SpMqZ1DFiMfX0rwhNR4Y5YqM5HrX9K4KmmoyW5+IVakZRaSsl18zwrS9X0hf2ktThR1Mr2xYgd+e1eOaJcSSftPXZLEK9gTtHYZ5r4rxfqOGGpu2tj9M8OIReGnp1P1etNTsDbQMhGeOP61xFoV+zQgbiGUDAr+Z/rjTvOJ+oUcv5ZtQe56G2rWa8CTJJJJx0rhRIy7VIJXGCT3qIYhpSjIn2F6t0dt/bFmMbVY4JJB71xfm9eCd7dPQVnHGSSutzonBQSjbQ7b+3LXP3WPqT3+lcXJcW6eWpAVpD8oY/eNb0cRPZ7BKlCTUovRdDtf7et2wWBAwTz3rlU5KgxkjAJPrXTHGK3LFESkmuZrc6N9aiZkKxbgVJx9a54GQY/0Y4LHByKWHzCUJ3T0M8SoSgpN77jrvxV5EpjMRwB0XtXNa1AzL5xjJZTgAdsdzX7JwhxdzuNCtv3PynibIoxUsRSenY2h4vyNuMAN0PUZrzaGR/O2tyo44r9rwyp1IqSep+Y08ZUpylC290juJfGsoyF2k7gMHt6Vwd8wRFZc5ZsDj0rsoxgpto8qGLlK0amh0h8b3iNhNpXO45H8q80muR55iBIcE4Hp61t7C6sz0aNSM4pxdnf+rnpsPi+7kJJYDnHNcVbzq0aYX+IEiolOLkoJbHNRdSFOU5PS71O4n1y5uNpEmFPX1Nco0qqpKsdmNoA7GulNtJpBWxlpqEex7j4Hv7iw0ewiZP3QiUEHqOB0q3pyKlpCir8oX5Qf4a/iihJTTk+p/VuMqL2smtkdgPEDkKGiO0scEHsa5qSTA+Y/dYYx3qsPGVR2jokcVSpBNTl1Lt7eW8yvNtZQMkkdq5fWb6Kx0m4nmYBURiSO31p4WM8RNU1oZ5hj4UKDqQWp89+NP2mvCfgrUJ9O1C3uGkikIBVT1r4g+KvjXw/ceJbp3PmHziORnoa/b8n8KI1qSqc+62t/wAE/KF4rqg3GrSuk+9v0PqsftsfDuJR9ot7ldqgklTk56A1+YHi3U9MvQDYgnn5iR/Kvbn4GwlHndXTtbb8SZ+LNObSlTs/Xp9x+pemftn/AAz1G6gs0uJkmlcBQR0Jr8arCRodTsrlSQVu1JHryMV81nPhSsPTdSFS7Xl/wT7bhbjmnj8RDDyhyqTte/8AwD+kTw3r9nrthBqNrNmC4VWXPfNeUfAN49R8DaNM8pLfZEJHqSK/BZUpKd+qZ+m4ulCjOVK2iPcJHyQRzjNQsAnyhy2TxnrUYqs1NRe543sote4tepI5DRKucdcg05bASIjCYgZwR65rWjXcbqKHiLyg4zVz8uv2yNBn+1JfYUoQAScV7H+2B4Xjm8Ntf+aT5CEknqOK/orwszrngqctD+f+LMG6Fb2kfhe6PyStrO684skaFgwyvpXY6Ja+YFkSVd6Nkg96/e4U21dM+Tp4mN3KcND2H4brdJLCRbhVTBDHGT710ngSzlM0ZVwcEZxWNeTUeVWb7m+X4iEouajaP46n1bo3iHWLOw/0edhxgLzgg+tRafbSNZIz4YbTgjtXDTnGSUqkTLF1VGbqQd7/AKHk3j/x94mTeBISvKnOMj0xXLfEkTRw3RbAHIJHtXq0HF2SR5UqirVGqi1S0R8weJPE+raxfKdQkyY5OD657Vy1+8n2tVb5lZgQzeh7/WqxOKi3Z6W/E2wuDm4OLjd9z3Xw74quPDWmpqNsu6SEggHtjHWucsNPv7/w1dLaAMwiJwR0wK8DGp1ItS3sfT4PFLD1KNKUdL6+Z+uHwH8Wf8JZ4R06+urcCd4xuKjpXj/7HXiG+vvCsOnTRkTWUjRsp7DsBX8mcS57iqWMnTvbof0dmGT4SFKnKEF7yufcANtGAFiwPMCkD36U1Gmb78JCgjPtXjT4gxLSjKWpw0sjocjSWjIJGwcgnaMgA1ZNqoCOZj82CQf4fpWUs9xDShztsuOX0Oa3Kk0cJc3D+fsbJUYAHoK0dW0piUlt5SMsSwI461+n8HcQqpL2VXfvc/OeJMnUKllHVPoeUeNvBPhXxnplxaaxpccxZGCuyjcvHGDXey2kjx8KdpzyBX6/h5UKi5ZNNWPzKSrxqynC6aZ8IfBvX9V+E3xXn8HRXszaNcDdDExyIgT0HtX074Y+Eraj4/m8VavagKrKsJI5wO5r8V8TMvwDinhl+86n9C+HOY4qpg5LH7P4T6mXxA97BEJpmaOQDKnoM9aqXNlBaBYYkyVAAPY1+NUJVY2U3oe/UoQlK6XXQz57ZJ/mglxzwD2prqqbdrH5uOO9TO03rsPDOUUrrqYOpRS20JYnKoRkjvmk16fyrZFZyTI2Oele1w1g5VcWorY8zifERhh3bdHxb+0/qx/4RWCHjP2pT9CSOtcj+1FIX0K3j5KSXijJ784Nf1lg8LGnl05OWtj+d+G6tTE57TUo6J3Pp/4JKf8AhCtITJBNqgIPbim/BpvL8HaPwRiyjIz34HWv4pzGrBV5zXxXZ/V2PqSc1rpZ6ntJyuDG5BHJA7+9Z4lLSANnBPUd64qc5RXOlucVGKhJST3NaKRwv7yXjeSSO2KZCwKbASN0n59OK6+dVOWb6nNUhUjFyhq7ozr+5MM8bLw55B9KwdflmhuIyvICEgjvnpX634dYePtXJI/MuPJTT95k1zqB8mRmJJVGKk/pXKXN032WQN1ETcmv6MpUowtI/GK1dSpTc3c+MvBkgu/2gdbIIBaJDj0+Y1W+Gsyz/HvxA/3nxgk+meK/HfG6XNCEUj+gfByjNZRP2ism/wDhj9J7TCW6kMQSAcDofamWhLwIeyIOD3r+e42jpPex9/RlBzbT8rGrDPuwvI5GfaqkaN94yHntXXTiuZNGEsPFczW3UuTzL5bMeNqk1UuvltZvmIbYRXtZfd1eVPc8nMZwVFt6I4q81bykdmbI5JH0rgNQutk80fmMTzx9a/pvhOkqdCKex/P/ABBQhVqyS36Hyb8O9TW0/aJ12Akg3ZBUnq3Pf6d64jWr6Twv+0Fot/JlYtRcx7j/ABEn+lfMeLmURq0oYiHQ/TfBfNva4KphKis77H63WhL20ZVsDYDk1l6Dei40y0lUg+ZGvJ+nWv53pzTTm9T9Lpwk52S0R0CkgpwPkJUg/oRTFJBDAn5hj863oSjFpxRy1H7N8zle+w28f924DHJ/SiRVI5PJQgk1vRnGNRTTM8XNSi421e5x7XWwlVPQnJPeqF5BKlyyYOxnJBFf0hwbi41aEZN9NT8C4p541uTlur6HzP8AtSXslz4Rjt4nObi5RAfTnin/ABd0bUfGPiDQPD1lGzLBdJLOyg4Cg19fnmb0sBl9SUtXI87hDI62KzuFeOkaaV/ke+/Be0e08GaTG6EKtomAfp1ruPC+mnStGsbIZDRRKMEdMCv46xNBVpym3q2f01jcReai1vY6mEYyQx2jBA9KakgKblPIYA571n7RwSjuxVFd3aH7SNxHcnINMJChi2QGzuyevFds2uS7IqVYyjpschrV2YLhl3EgxhSB3xWTqjiW5lAYtvbAzX7PwBlVoKcmfjHGeLhVk6dLY+UP2qtXJ8APEHJbz0wO3UcfjV79pzTrGDwFJLLh5TOm1T3Jr9jlCnDDVFHezPjeGJVKmaUIfZT6nt37PJ2fDzQgc7fsgAB6jGOK0vgVaqvgLQ0iGF+yJgDtkDmv4+zBp4qUGtLn9P5xVg63u+h7isi7euOcVGIpA4XgpkYIrhVSzbk9EcSp8uqHj5tvzZ3MOfSlWGXIO0YGACe9ZzrOcbW1Gm1BtdDm9XlMLoBkYHODVPxEsiyxkkhSwxn071+meH9NyqNrWx+d8XzmqXK30Mh79nVQHOA5IPr7ViF2GA6gZYAY96/oOnH2bUW9z8QcfbUZVKj26dzZkvXQrlhwRWEXAwWkIKggg/zqoycVzPcMO7pNadTae8aQHc+M4Az+tc2t1nasjksPWqjGcW1cdbFKVo1N+nzPNvjxdBfhzrql8xm2YsCeoxyKxvjs7P8AD3WdhyVt2bH0FdeXU3GUm30NIpvEUoT6yRD+yG+34d2LqWBYnP0zxVX9jy5874e2cQ5Kk5A6Dpmv4x4xknmNRvoz+v5OKo04y2srfcfbsYEqou8KTjINZ6jO3aSSXxxXzkZSgkovU86LlN3krImy0GQHL/NgY7U6dAqqGwDnIK9sV6NOTceZrUqcZTp+7pZnP+IJ8WhdM/KSRjtUmqQtc27LGuO+PWve4aqxp4qE56anj8S4ecsPyN9PuOChuidpOQMgsTVNIpFkaNgwwSMkda/qLBVITop3P57lCpTqtxjd6o3DNwdrk8gAHvms0MVcbzjGR+VddFqEb9gxDU0ozly3Lcl0S6kMQMfMPXms3zASw46AGvVowik0nozxajqQlFwV2jQFy4J5O0sSBWR5/VckAYxn3rOUbSSWx1V04w5mrp627Gokw2MRklQckd/asp7lAqhHPBBx2OK0cIzaT2PBiqso8kXr/mbkVyV4YncSOnfFYYuGYZLYzk5/rXNVhFat6H0tGrdcj3VkbBu0IwWJJYgA9sVlecoOGOSCGOew7V0x5V70VoYYinKNPkejLc1wwCBWJ+Yg4PX3rIa5yxGT8pByO9So80ro5YSlCClB3SPi74/3VwvxN8AxxNjdfRg4+vWqnx9ljf4p/DyPcwMmqxAAdCff8K8HxBp8uTyUT7zwmbebznLV2enqfpH4ULtodgpcnMK5J74FTeHrcxaNp58zLLboeO/FfyBUmqd5Lofv1eLlPnno+h0sDMAQCSN2CKh88gLnpuA/GuWlNVE5SWhX1Rayv/SHyvgNg8nt6VEGTC7c7gevrmtZVIxin3ZUaco1VzvocLqsvl3Y5Iw4wPWpvESPkSInRiM+hBr9n8O8yhKSpzdj8c4yy+VOTqJHPatd+Xpl0dwUrbPz2Xjg1wfjTVTZeHNXnkc7vsjgD+8cdq/oHLaalJSg9Ln5Hifh5Wve8/U+dv2U97+O/Htwhwr6w65PfGPeu7/ZU8KTWFlquu3cBWbV9QlnXPUg1/Mnirm1OtmLjTfwn9TcL0pUMrpUW03u/wAD7dR93l5XPHIPc1BDlthBwAxNfnLk03OTPQhGSSinZFqRWYhNwJYAYPb0pGYKVzkvjgnvisKsEp3T1ZU7pxjFWf5la8YrA5bjKkA+lUdTmY2jAthcE/nXq5PGXtYxi99zzs2m40JOWt9Dh5ronemcgEghunNYl3IMttc5bcBnsa/q3IKClQirn80Z63CpOMtWfEXhN9/7T2pnnLWykD23VV8GEyftP6sUI/48gpPrg84r4XxoUpUYOPQ/X/CelVjls4yd0fqDbuREpzkMoY+g6U2KR/JjGQAyqDmv50+sKMVJrY/SY2gkktyyJvuhVO3cQSfaokJCopY7Q4IB9TUS91uaeo5zikkyS5kPkyEAEBCcHvmmXD5jlGflxgY7eorswlXmqQRhmNpQ5l2PG7q5ZLyYBSMPnn+L6VialcsL6QYBwxxzyOa/qvhOnagpI/n/AIkxtqvLFXbOwt753iBUAEZGK5W3u/KXJcnDcAV9UqL5rx2Pm3jJQUfaPRaOx15uHZSzICFUkj19q5mXVwQ43jPXA7VuqLg7I5ZV1dy1sz4w8DyPZ/tP6+r4BuLY/KOv3jjFc9Jf/wBlftS2FwCAt/Cqhj33dvzFfm3jDhorDwrRP3HwpxF8vqU7Ws/vP1htpGaFDIQPlGR68VlWl2r2kLqSPlUZ/rX84YetdqNvmfpVCKnCXM9H0N7zi20MwG3BIHes1bgFRkn7w49aiVZqo4y37kS5HTUV0Ls7sVYjgAYHvVGW4Z4m545HXqKzwteSqRU9rmWJoqVFq++iOGvJcS/eJ3OelZOrXDRXDqf4eoHb0r+puDMRB4ZKOqP544owNT60uXQnubmOC2eSWTbFGpJbHI9a43xBqATSbkNwjW5Yk9q+0hQ9pUs1o/wPAco042m0nsa3h/xJoPimae10vU45pbSQq6oRkfWvkf8AZQs72bxL441EyMbefWXAB6DB6ivy3j7jCWWYhYeir26n6tw1wLCvhI4uTvfpb/gn3I3hyR0Y+YQxBIPt2FdfG4aJIyxHJGMda+Ep+KeL6L8T6b/iH2FjD3tnY84bwbLK25mPzKMY7GvSjheADv27s1T8S8ZLRrd9zKlwTg1Ust/Q8h1Dw8+lRiYuTuYZB7emK6HxteLbaeVYnJYgE9/pX0OQ8a4rE1o05xujwOKuF6NKn7Sm9T54+LnixfDXgrUr2ObZKyFEJ6kn0r52/aY1x4/D2m2Xm4S51GMsexOR/jX7X7ZYfCyxLV9D8wyXBPH42FGo+Xkd/U+nv2e9EMPg+x1CQE3N7iWV26sW55ruvhAif8IToe0AKbGPAB64Hev4z4izWWKxUlV2Z/TVHBKCjC+x6mFj+QEkEEk4/SnlQ5jYH5gGBHpXyy5pXjLpsd9GHuyk1ZKwNjK7WJHA46tTkX7u/G4MMAds1tKnOEdXrc19rKUEl0Of1u7MUCxqxzwcetZ3ipGjRXBIUkcjsfSv03gLJaOIxH77dH5Vx1ja1Kk1C+qOdFxv6rnk5BrHguVEn38jIJB96/pjCYCnRppwR+NTqSnUg5Jt9fI+bv2sTu8Dqo4UX0Yx2BJGfyrT+PkTa8fDPh6JS01/q0RAxwMHNb5njYU8vm57WPc4NwUo5qpJXV18j6M+B0Uy+AtBSRSMWKEEduK9M8HaNZ6P4W0+0tpSXitkDqRjafQetfxTmdNVKspR0V9D+kKcIOpLlWpsKhOAACBnr2qRDtYKWJJOMnv7V5NODhJtPR9TrhOCautWSoMlAVAViAc+9CRlNvZA3B+lbKlFX5XqZuilUklu+pzPillh01iX55JGOvtTvGcW7R5GBxg5JPcCvteC6kXiYxl0e58/xPCbouMOiPGY7tIiGcjZvbK98VzUTgTPvkAGTyf0zX9UZfD3U07XP5uxzfPK2q6nzPolxt/abYJkCSxPBA5Of61n6TMR+04qB8SfZF2kHIyCec/WvgPGKm5YaLsfrXhu4rCOSex+nVoxaCLK/LsXOO3oaWx+S1iy2CUAB/nX8vVKkoVXzLfY/UY1VOkpR3RYDEKcg4I7UEknPGOAB6VNSgptNM6edQaUt7CK4Uhs/KuQBjr6U1ydgx0BAJHf1oVNOpy20sclbEKnG6Wnc+Pf2iPG3ifwlr/hnWLeUroUV6okCA8e5rvvjX4cg8U+GdTtSAbmFS8XHcCv6J4Z4ToYrLVF6SsfmVLi6WHxEozj7reh7v8AD/xPbeKNC07UopQy3NsjEjoCRXxn+yZ47mCX3grVbk/atJu2WME8sueCBX4/xDkEsDU5JH6RgMcp0lN636n6BAhWIfJIJ5NU1l3HIz8zLgmvOpQUWtdC3a15dDM1JUkLBshSuSR2ovic5OAjdAe1TGq6MtX6HNXwqnFJbSPOJpv7NvVnbkAtgH0qXxHbeZbtMmSI88DqSK/ZeCeMk5KhWPzHibhWdnUgUbzxVbqjglSeMZAyQeuPpXz5resvbXBUkhlbABPT1r95o4qFSPPHU/MMNl8k1OWj1udtqGqLLdCaBgSxA4ryZtdR54gshLZDED+tdKqXXIzkxMrtyvqz3q0uDIVBI2hRwe9cHYawRHG+8bTtBHr61ywpcyvfU2eKV1Tmuh6vHMrLjzAMKAB2riYNbjIZg+dhOM961quSXNsznw9CnWk3UvppY+wIJGjVCEJLYJI7gV8X2v7aXw02q39puYzwQB/Ov4kjl9aMHZPc/rHFYWLgpJH2fdTDkBSCeOPavjv/AIbA+FMwLvqxAcYy4xj1xXcqVXSMYs4qGFTinze7fY9t+K+s/wBm+D79mIVjEQoHU18b/GT9pLwd4l8NyW/h/UVkcgYIPTj0r7XgnKJyxUZtHxfGuKdSCow26/I+D/F+oSXWt3crKxIuGJxnnJrm77xZPdSzSFYyzsQCV7Zr+p8ByQpKMmfimJyOupN0Vpe5nXV4m5opGAYZGD29MVhz3Iu5xcSDB5JVv5V2KvGMfcV+5v8A2XVr2lN8tv0LT3Kr9lYg/LKuSe2D1qzJ4jitYAHso2wgByK8jN+SpRkk7XPo+GqNSjmFOpbXT5WP2/8A2YNQSX4f6OFcHMCgkdq+Zv2af2hvAml+EbbTda1SC2uoVAIY8rwPUiv4y4gy2ccTOEVZXP6Yz3nnKFdSvddD9JZJgXJBwGPB9K8Fg/aG+FUq5Hiy3LsQMlhgH86+dxWGqppJa7HPQqqKSv8AM+hYpy0YHmYYgDHpzXjcX7QfwmUBG8S2Zl2nneMjGOvNVhqNWSu46nLUk5SdKa07nMftJaV/aPgm8AJIEZPPfA4rE+JXxT+HniPw3f2tr4ktpGktm2oGHP61+icFY6pSxUYqJ+fcY5YlT9pN3S0PyIS2EV7LCkpEqTEHPY5qrqOq6ZaeIr9NjNA1yxVkPUZr+tsFjYqkpNH4vhMDUlUc1Jf8MfR/w+jkWa3YzcZBbHes/wCG2p6JLJEAkoZiAAGODV4hqUVLoa4V1ITajG+ur9T68sLmX7COflVRjHf2qPT5NGNk6CWZDtUgNyD9elc6pxnJOb0PJxdd03JOOiPnv4pXAMU/Ub9wwO/1q78QrLRb4PGupEM7HAJ7172HjTUdHqc9HHuTVo6WfzPjrUQWvIQACAwI9uea2tf01bC/igSUsrsMn0+lcVWklJRlud2WY51INKPKnovKx758LLOO6s5IOSzxsoX0zXQfBS0805ExQlgQB3A/xrxcVFxmke/iZS9klfXudl8EfGV38N/iJJoeqOUsdSuTsz0HsK9C+InweuPFmnRanod8YtbtCskciryCPyzX5hxjwJHNE6uGdqnbufc8G+IEMJh3gMyXux2fVXP0UsdVhv7CKeN9yThW47+9fn58IvjR4g8ImHwf8RZhE9tIIo7iTID+4r+fM2yXFYZqlUi0117n6th506r56M1KNtPmfoMTCSBvyS2cVzOka9pes2kd5pt5HKjgNlWFeA8PKLcpbjq8yiuffodFMoZWWPADHoapRX4diFxx1z3+lZ0q04y54PYWKpqUYuavcma3hQqSo+bHFVZp5C4ZFDdcH0r1I5rWgtJOzMaWDpJ+5FXZv6e0aPlv4SAMdqp2M4jw0mFJQ5A9e1cKrudW7baNqseRNvbsO1aQj1A5JPc1h6rq1jGxae4C4PAJFdlKnKcXNLVGWHxUIVYychJLhFUSEdAc+wrznxD4nt5A8FrKMKoGR3r1sp4VxOLVoxsn5Hk5lntGE23LXyK+u659puFiQkosmAQfzriIHaWTeZSGZ8k+oNfuHDPBv1JKU/iZ+R55xM8TUlGGluvc+Y/2pbjZY6dGuDvuIyoHc5HSn/tKaVdajb6GLQhtl0oKjv6Cvvs093LKjSs0eTwBB/6w0nJb217H1X8Ix/xR2kHoxtEAI7ECtr4X6HfR+E9LUptZYEBHHJwMiv4dxFN+1k2r6s/qfNKyp1ZNao7qNScHJJYBgP8ACtWPS7vaCIwCD0B59qzpYWUklJWdzx5VbSS3uMhwq8thzkKO5pXikt3UTDBblc9q76NGVN6o0eJTm5yVrfocP4klK3KDnO05A9hTfEUc8kqvGhYgHG3uK/YfDeTjJxS6n494g4mM37WK17HIXcyraXJIJLRsCPXjmqGpW9+LaQGJtzQuwA7ccYr+hqEU2pPR3PxzMK9qXJGOvVnyF8G18343+KSWJUTLgjqPXH9a3vgP4a1qT4t+I764smWN5OHOOD2H+NfivjZUXtIRSu0f0l4S6ZK0pbs/RC3A8uPqdw61pw6ZfeWuLZztGCPT1r8BnGUUk1r3PtqajJ897x2I42Tb6sSMgVoR6RexlRJbMQ/ANXGLkkpdCJVnD95HYz79gbaUnGRGTj0qfVdOulsbgiEhVVgGHYCvay+hKNSL8zzs2xSqUGkfNOqtuvnVWP3yM/U02/tbwXDMts5QykEAfma/qLhmdqCUVqfgufe9adR2V9D4/wD2k/D88H9leKrIN9o0ydGZxnjB4r6U8XeEz4l0K80i5tWYXcTqCeo44x9PrX0WKwdLGYV4Wton1PPy7Nq2V42GPw7vHqu56X8A/HVh4z8FaRdQz75Psyq4zypAHWvgP4V+JfFfwF8bt4c8Q2kw8LXlyRFMQdqZPH5V/L/EvBOJwFRwWsHs7H9JZdxDhs0ofWMNJXe8ex+vCvgIEfpnn19K5zwzrdp4lsoL/T5fNidByn86+Mlh5xleOxSwqVO8nqdRncAScnOfrTltLkSRgxtslYHJHSueu29VsdFCDi1F/cQ+RHIQZEDZJwB2rrrbQnZBIZCTuyB6V6OBzCvBJ020cOZYSkqq5lvucZFoemQXX2uO2UTlQNwHOK66TR5QSNwCjAPHQV14rNK+Ih7OvJt9Aw2Co0pS9krIxyqnOM4VTWtbaRdXQyoAAwuR3x+VeZRlOaUUuux6MYu8Wt1+JkgqNqsuCQSQK35dCuLeLz5pVCbiQSR2ropYSTahFanNicVCN03v+ByGrXKWtrIxY8AYHrXn3i67uBMI1nXyt5C4P3q/ReGuCquIl7WppE+A4h4zhhqSpQV2zKkvleYbecyEk/Sua+zXO5JcYRiScnp71+8YPLaeHpJUz8clj61SrKc1Y8L/AGqLoHwRbjcWxqEYwT1yRXHftRaiv/CJW0RbKjU4sj8RmuqrBRwtWT7HscN4mVXN8Omup9yfBFRH8P8AQ2BJB09CpPXBApfgx8ngHQnPIexTH5V/G9XFt1JJbpn9G5iorFvm+49WVzwcnKuDj1qGNinLjawOQPQdqwqO1oPcqpXaTUI7l4Oyquc4D5Oe/NV3lLAbycEZH/162p2UuV6ROelUc3qtepw/jCdkdPm7YGKwPHuo/Z/LDEBnwQfT2r9a8OIv27knofmHHtROn7KC1Mj7WGJ3McJjrXmL+I3PmsrjjGQT/wDrr98pRjC0kfk9OUqkVSUbcu51uo6lHE+RJ3ycHtXktzrJu7tYISS2eVPenXcVLmWxtRw7rJ8myPTodQR+53MeDXGWdnqrGInAJY5Cnp6D8auVWLjyrYzqYVKpzS6JEPxYH2vwNrcZz81q546jirev6bqN7o97ZuAUuIyrAnPB64rfL8TCM+XucOaYSpKMHFap3X4Hnf7EuswTeGr3TTJiSxvJI2B9jXgHwC1fWfhp8W9W0HUoCmjavdsYpCeFLev/AOuv5V8S+H54bHSrRWjP6r4ZzqlmGAptP3oqzXofr9GV+8Dzn5TUWn2N/c21vchcwyRqVKkfNX5hUTaUmtD2PdhNST8yW43yRA7sYyeaWVJY3WKQENkgg11up7NK+zFaVSDqKNkiGzTepXBIHGTVmJBBHg55JOa5oYmUpWjrYmtyRg3J7lG40mzchvLXfwCR3pWuWUybcgcD/wDVXt4DiPF004xbPE/sjCyVpI828SslldLGABGCCQv61zvxFv2t7sbeFCYz/e4r9r4AzSrWpp13dn5nxpl9NVFGKtb8ShLqIXLKeWxjHavK5dadRIFkI2j5gT044r9mTi7M/PK1Oc1yxep6C2rqrgFjnvnpXjV54h2su1yRjBP0rRqDjaW6MuaqnZPTZnrMmuKHx5gGAeD2rws+Iw0yES5YuAQT+VS0m79RUoOL9nKGnc+hYNVEmG3YG3p6V4lD4pKsF83AypPPf1rGrODSc9kdFCHPJqGr2PcH1NGDFDyMZz3rxb/hLYWLbZgcHseprVzjGCaZwVIzV4rVs9gfUl3byxCDGT26d68cfxGsny+dleM4PHSlBttJ7GFWjKnFRmjxP40Txz/Fb4fb3GV1FNp9BXH/ABCv21X4veAILTMhGox7B6+v5V854lY6MclknvsfqHhThlSzG7ldOLP1n8NzhtHsQuTmFdpPp71J4etJ7fR7IyqRtgUZHfiv489rzU00rH7bWrqMnTgrtmsNzBVwxBbH50z7S4XCsQcYPvWNaLinNPQajJTjBbvqKplU5CkkHGD2qCe8uI4Z5Uc/JGWAPfAp0Ze0knFWSDEucmnJfMW5ga4Ro5EY7kOBj9K4Lwr8Q7DxLc3VtbXaG4s7hkdNw3Ljrmu+jiKlKaa0sOGVwqRu9UaOreDdN1G0a0vIC8DsNyv/AFrr/Mco25icsASa96hxhjkuVS07Hz9fh3DQmpON2tbmXoWjW+iwJBZQBIYwANo4+n41tx+aowjfLuBIPevl6lV4ibc97n0Tw692SeltSdFcKhCEZAOP6mmtLMNnzYHI4PT0rtpw1bk9F0OXEUFKEWpWu9PkTLFK2wMCGJIGfeqZuZFVCz4OSDg9KK0Zcz5UdFCLqQcm9EZviEPFYOVAPDEg+ua8j+JnjhLFRaxXZEhyGwf0r7HgnJ51qsZ9j4nimpGCcKbu2tTPnunywkAXJzgHpXh0vjJRgfajuySAT1+tf01l1qUFyn4fLAU6rcZLU8p8C208n7TWoyqhAktQoB785OP61yHwf1Sa7/aP1V/PZy1vk89Bu5NfnHjTjFOjBSR+0+HOUToYKdOm9ND9a1WSKKIMpyQMgUzzXECFmJOF4H0r+b4Vbw1WqP0CEIxilMtRgynCtnkEH0NVrZ1dgV3A4P50qdSztIzhh4UV7Rvct3FvK0EpYDBUkDjPvRc7jbSc4+RiT6cV10JzVX3TnxXJKna+h8za3KYdRkXeAN55JH615v4y1M22t3qeZnEjA5PvX9V8It+wU5rc/AM8yiKqOcdt/uO5e+Mcca+aqls4IPH41462sFiieadxbDAE8V9e8U5Xsj5qWAhCKqruelrey5UicEkk9fSvL0vlEjuk4ZgQBz6Vc8ZKMUkbf2TGPvTlePax4D8cvM8N/EXwZ4wjmUCC+TzST1BOP5Vv/Gvw8ni3whKI5Q93aI0iA/eGOwrx+J8GsxwUsPJapH1fAc1gqspOXuyd7dj9MfBV9DrOgabdw3CMstrG4ZehyK+Iv2OfjNb6zoY8E6rdrHreinyysjcyoCACP61/ImPy2phcQ6NVW6XP6CpckoqdN3VtH+h+h32ZtgxOFfdkn1xSxAMgk3grIoK4NeVySi79hOcHHm2ZDJDswdy7Bkk08cNyxPIyD0zWSrOK99ajVNN3vZnIaz4cN4/m28+1yhLEV1yKuWGRk8k9q+qyTi6vhIWp6o8TM+EcNXSlUep4drvgXWNV02SwtboI1whUsR0HtXvaiLZsLchcZHYGvtY+KuLd5QjZev8AwD5ulwNhac7yd3ddDx34a/Dex8B6ebG2w007F5ZMcsx7166VBDKpwQMZHbFfE4vH1MTU56iu2fX0qKpuMY6p6eg6GCLy2LSHduAxino6RAgN8zMMH09a8nFQWkpLTyO90ItOFte/oMaCPj94SFwcDsayNc1Ww0iynvLq4WNUjJwe59K3o0nUajTjqcMq9OnBSqs8e+K2q2sESW/nneQTgV8wfEDx/Fq+rzutyfKUsqgdsGv23gLhv6rarUdm9bH5nxFmUMYlTS62+R8+/tISR3fhe3uhMxawvFkBB44PIPv6VT+I7R6/4XvLFss2xmX8K/XMVFVcPOi0fL5F7PDYxJq7ufoZ+zzrFprfw58O3dtMGBsUDY/hPevjL9h34uW0MWoeANTuit3p858tHPVe2K/jfibJ54HFNNddD+hIYinOlGonoz9UEt0JDFsZXofrUMNws8QkXJ3gDHp7187TqSaslqJxco8qehNH5Ktt67icH3HagBMA5BXGBiuqjU5I3erudlOUOTlpoq6jYwX1uYnX73TjnParmQCo3EgvjPrXfDH1aT9rCVmmeZXwNKvFxqq6Z5fP4NmVyI5VCNktx69MV6i4Q4PIGec9/pX1+C8SMdShq7pHzeK4Kwkp8kXa+54/Z/DGxfXrPWtQfzp7ND5QfomT2969eeRAgOCBuBFeXnXGmMx0OSb0PSwGTYbBwUaS1b3LESpHCiKmPkIAHasa31rT7ySa2tLpJJoG2sEOdpr5VRUZK60Z7VOi6e71LyKd4OTuHBz2+lMjdlYk5wMED04qK09uxpQm5RdNo01bABfOc4+tJHKhywB3kAEHpxWkXJtRRE6Mow5TkPHTsmg3Mu7BVTgelSeN/wDSfD+oRgEZiJBXHUV9TwpiIU8VCMn1PBz1zdJKC17nxnNrCLPKplIKucEnr6ivJPEGqvaXtyikqwkc89q/qHLZNwUk9z8QxMJOo6ajpqziPCt2Zf2kLW4TkS2+0EdATVz4KT2118c7OWdAxlQKpPf6V8L4uSdbBwaex994d1I0ac4Ti7XP1Tsldre3OCVaMEexxzXZxQ24+yKqjHGcdDiv5xqYabavpc/QaeIg+adJXOb8s5w3AzkV6RHZ2bAF4hwB+FdFPDtq09DOrilNN/eebSREDaCTjJ47V6TJaWgiLrGA20k5A4pUoqDutWjGtj00luuh8YeLtXCXd1bOxyXbIP8AEDXnfxcvhaeIb9Ecr5cxAFf1LwRKX1aMkz8S4ooRnUcZLTU+Xr3WG+G/xgsPENqwTT9UnVJcDg5P19azPipbHW9DeSIE3NsFcFevvXXxllMMyw9mrSR0cJcRToR9hUVj9aPCeuQ63plneQSBo5Y1YEdxXx9+yB8UF8R+GI9EvZCdS06VoiCeQBgA1/L+a5dPC1HSmtT9no1qc6UZwdj7buldnxjjjkVLI6vEWLkcMQD3rzoRk9JPqdlWrCMlSeun5nNXVvHJG0R6OrZz2zWmVV2jG75t3Huazli5RrRcdGjCeFU4uM9j4a+LNjNo2pO0e7y2GVI757V9N/FvwR/begzSQWwNxbIzDHU8etfuHBfHibVCpvsflue8O8suZH5+wa0Y2BkJJXBAz1rC1tk029liuV2ujlQD1Br9qw+IVWKm2fBV5VHFcsdro9VtPEIS3jVmO5uh9a8bPiOOGNc7uoAPat3Xaqc0HqaU8sUqXKrep7fH4q4PznAOeO9eEx+Il+XLEq7AHHarninypHlVMNJRba01Pk6C2uNhbgBlHXGDXOJeXYYKZSqB+M+nau5YKi3flRrLNMTBczm7tmzPFdPJsAGxWAUA+vWqlvJeyvE9sxIJPJ70U8FQUWkkazx2ITU3Uu30LZtNQZtvzFc5J9xWpHBrAR8FlO/IHet8JhKW0VZI8+vmdSErz1kzGuUntjGspKqQQM+uOTXRT6TqF3GxmBLBQMt/FXSsOpSsjjxGbuKUlqm0vmc2rA7Cq5OSBnucVqNps9sUIySpBIHbpUcjTZ6ccc4NKV7lK6heQhRATnaAfp1q2+pXURZZlILZAU9s+lKGEXJq7oeIzlVJ8jjaz0MZbdIVG4lHbPA6gUklzJI7fLlRjk9QfSuCpk9Cacmlf0PToZ7iab5LvlfmXl/eBI1djjBC89exqsssisHJOI1z9PSudZFhmlJxVw/trERqc3M7LoSyzzRyxwhypLjIBOT7darTak0siMUAkjIAPpn0reGTYS2kV9x2U+IcfGNnL3WasF5e24YJcuvmPjBY8EVnCd5W3scEg9e1Z0cnoU581NK4sRmVfEUm6snY29P33Myuzl5XcjJpfDNwIrtG4PqB39a9aULe6zxFQpypupBan058OLOaO4iPlnGM5xwMdDXSeANUQ+QWjzvUDI6is6tNySS2RwutONJxSvJ6n0LbyubBHRWDqBnHXirNpfqmnbSnJyOO1SqrjLlR5VaUpUlOcvevt5Hzx40lzd43YYOQf/rVR+IVykEry5wFLEjHWvaj71O8S8urxdTlVvuPJPE0i/2hbpkn7pye9YNxqg1K8Bzh0YKM9OKxq1L8qb1Enyxk0rrX/hz7G+BBXejKARtHB7VyXwq8QJowjLEkllBAHHbFfNZlzKr7R6n0uHrQnR9hb5n6MafqVtBZqshUfKCMmvmiX4hwSCFmdtkeCQe9bcsYx5up41LEOVSzWi3bPX/FHg7w14yQvrFqjdQhAGRXlf8AwtKyCBPNKleCK8nEyhVVpr5GsnVpNeybSb3RRu/BPibwcJW8CeJbmFFLmONiSAMdOv8AI1Be/EVJYgkLsSWz9Md6+azDhvB13aUVsfXYXiDMqUEpyvFbXLXhrxz+0BYSGG+ns7mzR89SGPueDWXpvjWCDe80nzAZBU/er5arwBg3pDToexgOOcVKKdSNmnc9etvi78TUYQPpFvjdksXOTnqTxXlU3jeFoZZN5LFSFz9OlaR8PsIkoX1e5yYzj7FUXzwimup61c/E/wAe3zrYi7hgmkyAYl5Vf0rwKHx1YWk/2ma4CyyYwDnIFb1uAsFCPK1fuejh+KauIipbdUfR9lqM2Fn1K+ea7cYZnPAP0r5zHxS0kMPMvQAG4x3+nNfQ4ThfCUVzKJ4mLzXF1Kri2rWPpWbVrYOAEGOQR3JNfN0XxH0yZyz6gFTcMMc4Ne3QrU4x5YI8OpgW5OKlva59HW+tQm4ERh4LjBOOK8Bj8faSJUuBfgFc5UnqO9TVb5UosiWBhBuDblLoeleO9FsPFois5b4wGCQOjr2PrXmM/jDTbiXzV1IKr44J7etbym5w9lU2ZrlmGnTre3p3VTp8jvtJtvGOkQpb2Pj+XyI8LGr9Fx0/CvO5vE+n+Xsj1Rd3BVifXvXyP+quDnVacNT6etxDjIxfPLXqemT618QI93/Fcy7u5XvivKR4ntiNv9oxkqu0gGs48M4KMkuTVHPh+IsbOk4p+h02s+J/igLu28jxnK0UTDIbjPr3rynVvFMiM4M6GIZIZTyfrUf6pYJxUJQ36nS+KsZTjzN67PsfX/hfxjeXWmLJf3JedQAzZ68etfMPhnxvbRQYe6Cl0PDHr0ruy7JaOGaVGNkcGYUalaulWle66eZ9X3HiT7VHLFuAd0KqQema+fbLxVZIS/2tS8nXJ619HHGOm7pXsePUyb2ml0tfuLFpp/izwvr91reh60sa3MmWRhx161j674oi+zr5FyC7vg4PSvMzjL8Pj5c9ZantZXmuIwdJUaUvdTPUbH4n/GqecRW2vQJZxnjCnc3PXrXm+j+IoII4/NuFVwAScjivnq/CGEUFGK0Pa/1qxCgnBrS79T3K2+JXxajdSdWheQdCwOB615Uniy3Tc/2pcKjMuSO341NTgzBNL3Tmw/GVeUrWWp7db/GLxuySWGtTo7zIQgQ4z7kV812niVZ52vZLgEvIAAT0FdsOE8LRkpwWxz4zN61e8WuVvY+l7fW5HbdcTli4+7nr614TL4tSDAM4GCSQDz+NfRYeKjDlSsfN1sCpPmbu+q7nu9z4gsrT/SJpCuFwAOi18w6h4vF5LBarcHYWJbH8q61UjyuT1LhhmpctrI9L8Z6Ho/xFtJbfVAUiDEI6nDH0Oa4IeKoYYRGkoEa4Iyfu4pSrqpFRktDmVD6vO9N280M8HT/ED4L3EieHNRkvdEDkG2mckhSf4etLJ40g8p2MwGzBAB6ntXyWO4KwlefOo2fkfaYXjLG0aSpytNfj959A6P8Ati6Wl3Dpmv8Ah+7iv0wPMCkonrnGa+cNKv8AT583l2iNJcuSC2MjNfJYnw3oyuozs/Q9WhxnOcuadPp0f/AP0B039pz4cXMCNcao8buASpTBHqK+GHXSXKnylICgk8VFPw2goq09PT/gkYrj6Ps+ZQd15/8AAPt/U/2lvhnshtbfVJGlfIYKDub1BxX5o6j4gtbLUpZbSBC28gDjt61cPDCnSqJKd7+X/BOSlx1GtFSUWfpQP2g9JeGNNItHKAjDPx+OK/NtfiVexqirEgPAJUcCu3BcA0YyacvwN58V1qtOLpq0tba9j731b4u6lqikSShY+QVBr4Ak+JOqeSVIADnBYdvQV9XgOF8NRnote587mmb4qVRKo9HbbofVK+LH1S/kneQ+TbsVAJ6+pFfKMHjrU7SA7LVim8MSP4s9a+hptctobHHiFGNO0n1tfqfYU/inZACZWzg5B7elfH6/ELVruWON7dgrtghugroj7sXzaI4YqMk1AtfHa41TxDoUdtp8Xmzx3YfaenXJ9ay9U1gvbxu2Q3mEZrzqzlVoypSW5phMRPCYynVi9Y6nsHgj9p7XfC/hrT9IufBM0slpbLGCrY6DrXjR1hvs5I2guq5PrX5x/wAQ4w6fPFn3D44r4mUpunZvz/4B9HH9sq6fan/CF3Q6bgB09cV8zJqCnaYyeW5I71dDwyw381/kdsOOajo+/Cz236L5H1Gn7ZscsybvBV55YALkH7or5T/tSLJITBZzgDv61yy8NaSkouV/kZQ4+STk4e76/wDAPrrxL8XLTxlDbXFpujHlglT1XPY18jW+sTICoyCXI+XvX0+U8NQy9Jwd0fOYnMnjnyxXme1r4jYmdTKcBhgDvXksOsNnBZt2TnPQ+9fVKTlZrY8aChTbcX7z2XY9RtfELLrlsSxG5TyfXtmvG59ceyvopwSVjO5QT1qpTTgrdzooU4NOMlrZn2JB4gMawlpSWbaFC9jXyiPiVcsFJTbIDkDPA57V0xqKMNVucEaEouSS5na9/wBD6X1rxfL/AKPYQuRJKx3Few96+VpPHd2919rKEkDI9cD/ADxUwrN3ktzGWBlKSXTT+vkexeMPDEGuQRXdrIIdStl3JKnXI6eleYw/FIuhWS2YyJyAO+K5sRThXp8k1dM9HAwqYaTr05Wku35nvXw3/aR8XfD0W+ieL7Oa706AKEnAOQB3I5/SvnSf4gJeM0c9vuQ4C56jPb/Jr88zDgPC1ajnTbR9jg+LMRGKVWF7ve//AAD9ELL9qb4UeIGYDxAkV1zlJOMEHpzjpX5bNZaDfSSNcadH508uQ4XnPrXzGZeGClUUoVPw/wCCfRYbjWlGi4yi7+v/AAD9dofjb8N54Qy+K7YjgEhhjp0r8qoNGsLWGNLWDKdQCOhPWvPoeF81K7qaen/BNKvFsGnFrX9D9Ob39oT4ZWBFtFriSyOduF//AF1+Wdx5UbrsjOxc5yOp9a66XhYpp1HU2fb/AIJz43juNOMYU6ektD7d8b/EbTPFV4X0u7IhVQQT3r5K8KX9w8s+5iYwgUY7V+gcO8PLBNKLuj4vN82li1e1r6HrU+rSMcSTsSxGT6+1cFcXxD53HLMRk9q+0c03zroeRzKCUU7tHaS3CSRmLzmBDAZ/rXDfblUtuZiCQcD2rrpTjJKUWRj5OKTT3OneGJczC6YvxkHv71zJvnkA8tjhDzj0rCVScXbdI5a1ODfNLZ7mnPqsFq4ie4Y7sZ9a4vULWe4uBJvAWTBBJ5NbTSjHm6DwzjK6irNfibs2seRcBY5GKvz9a4qcuJQMlmUAg+lZVarSUXsdGEw6nNSjo0/+GPQU11zCuWJYsBgVwiuwwPMPLEAnsa5XiubV7HXRwUXOSe6MttVW0+KXhbW78ONP02cPIw52+uK7bT9R0i2iP2y0WS42gbyBx/OvJ4jwazCgsPeyOzh/FQyybqKN+bfyR+g037S3wus9Cs2m19U2RqGDDpx/Ovzs1a90HULRok04DHQkDH4V+df8Qrg1yzqfh/wT6vD8fwvaMLr1PuVv2qfg9yv/AAk6GTrgZz/n8a/NOPSdFWR3lsIxhxgEDvXJPwkTah7T8P8Agmq8QacmuSLVn3/4B+m9n+0Z8NdcEttpuvRvNLEwKE8jjjmvzSsbKwtJPPs7ZI5CSDsAGBSw/haoS5JT0T7f8E0x3iBSWHblHXbcl8UfEbxj8JPipeeMvDkslx4fvbotcRqeGyeSOvatYLbahF5F9CrxynDKwzj619hieBcJXpKlJWkup4OUcZ43Ctyk1Knul5H6GfB/9pj4ffErRoZYtZig1aTarW8pAKt+P+Fflfqfw10sXJ1DQrmWwnDh1MDEYP4Yr4XMPCeqpN0ql16W/U+kXHGGaSqRcVv33P3Yt9Xspog8NwjB+AQw49+v5V+J+i6l8SNHSOCDx9fPBkgBmJz7V4cfDvGxV42PSXFGDdO7lo9j9qrrWrK0iV57yNU65Zhzj8a/H1PE3i24SIal4iup1U5wWODj1966MH4a4pzblLfyOOXGWGilbpufo746+Meh6JazRWV4r3BVgrKwOSR0r80pL+eV2SSV2HLZYk4x1r7DKvDGnStVrT5muljyMw4xVXD+yoaNs9G8R+OtR1y6kuJZ2ALEjceleYzOwiwibnbqB0PFfpWX4GjSXJTifF4ivWTjKpK9/wADoJ9cmYMfNKjBOVP51y6GYqQ2AxB6dq9DCyVNKNtzixWKhUd42uupn/BLxdovh3433Wpa9qH2eC4iAMsnQnPA+n41DceHNLvHWS4tEaZWJLYGT9K+N4y4WWbNJStbyPsOHOLHg6boyi2mt7n6yL8dvhSkIc+MbYqQACWHP15r8om8K6F5QU2YK4GVP6gV+fR8LHZc0/w/4J9Lh+NqNNXqJtrU/WSx+O/wrlmjVvGFnhuhDjj61+R9r4I0aK5EnkYjIym3qB3FFbwmaipup+H/AASJcdxqP2ai+5+yi/Fj4aXG+G28V20spjyyhxuwegHNfkJa6PaabOtzp6lJywyxJyfSuvBeGDa5nPX0/wCCcdbi6lOm4rdaH1J451HTrnWru5gvi8TTMQV6Hnivnxr2eZV3zsNvUV+u5NgZYeHs5PQ+BzvGRny1WtddD1GO/gYFhKwIwAT3+teZpeyxgqHJIwSB3+ldNObvo9Oh5jnKpFql01PTLW7tkHlvLhOTkd+ea84N0GwTI2COT3AFa4uU5tQk/UnDRkpKT+Lt38j0e+ubBrOWN5Qy7SDz+leVXFxmLajsRKSWHc1hVqOUlK9rHdPAKDU7atPQ8Z8SaBrPhLxEPHHgm7Md/bSbpFjP3lHUcfrXp32Z5U8knI8zJz6HtXlZtlGGzCdqy0senlefV8tpJ09btaH0h8FP25fDepLaeH/iHG2n6vCFRpZD8rn1ycV8ea74E0XWdz3Fku+OQlXA5Oa/Ocb4W0km6NTfXVf8E+1occqov3sdb7Jn7a6L488Ja+iXOkazb3ELjKskgO7I9M1+Fln4T8QaDIk3hrxdf2aoQFSNztH05r5iv4ZYmMmotNeh6VHjChFpVJaH9AKzW0mxkIJwOhHOK/EjSvH3x30zMMHjyZ1QqilwSePx715s+AMWo8yWh3/60Ya11Lc/bkSoM4YkA847egr8bE+KnxydSk3jNlY5BKry2OxOamnwFjpTUUtDepxdgoRabV1Y/YqfULK3LvNOiIFzkkf41+NV54u8faiwfV/FN1KdoBVXYZ+uDXp0PD7Gc2srHlVOL8P7NSS1bP1L8TfFrwhoMZabVI5J4sgRowyD9a/Jb7VdTn95MzszMSWYljjvzX1WC8MHJL2k9PQ8fGcZRTfs9ZH1D8SvjdJ4nElrbvstskHaffpXyncRyyKV3srqScjsTX2WV8I0MNrT6HyOYZ3VrLlmt/M15dSDXJ3Oeck5Oc1yk0EyAKWLOwOWHUelfaVKTcVFdDxKThSvZHSTXdtK2zzCUbKnP8XqPwrnkt3+U7sFsYQ9zWcZSpxsnrsawxFO6qxV1t+h5brunX3gvxJb+NvB8kkdzaTiR1TPzYPOa9ZubHfGUnIK9wR1rwMyyLD5hTvWR35RxRWwc3GKvHpqfZXwG/a+8H+NNNttM8SXosfEVuEjdJjgS+4PFfnjqvwv0e/uTdxM0F4AGV4cgg1+YZh4WRUvaYefyt/wT7yjxpGtNU5qz/A/eKy13TbyKN7S7jmimwQVYHr+NfhlosvxP8MsqaP48vYrfgbC5JAHbnNfHV/C/GKTcXdnsUeMsLycqejep+8sl5bxqCWXYcgEEc5r8XYfHvxakTy73xvduhUkhTgr2GOetZU/DjGuCjJ6nQ+LMOryifsNqPjDw9pkRe91KJPLYnaWGT9K/G/+0NevRv1LVrmZhk5kc8/rXsYLwjxKipVJ2XoeXU8QKcbOMdXofd3xT/aIsLKxvLbwzPm4SFwJVPftivg5rd5laN2YliRz3r9Ayjw6wuHkuZ3Z8tmPFVSUZNM9W/ZO+NT3ni/xZZeKdbEcs960itO+AxyM45r5suPhxpctxJeJ5kc5kDFoyRk9e2K83iTw+eLmp0JKK9P+CexgOMoxpwjVV2tj9vl8deFBsJ161LMAzASL26d6/Er/AIQ1FBT+0bli/IzK/wDjXyS8JqtuTn1Z6z49o8t0j9xE8beFGjDDxBabSwJJkXIz+NfiXH4VLBQ+qXe5BhCJX44571dPwuqX5ef8Dh/16oOSblqftJe+K/DF5bz28et2rebGVXEinOeOOa/HDS9GvtIvFuLXVbkP1BMrYI9xmnT8NMTTnGSqfgaf6z0JrkmnzHsvxKRbTxFqUMUoaJJSQQcgjPSvNLj7deEGeRmfJLMf4q/Ycsoyo0Y06nQ+TqVoTqpRWrvr3t0GfBjxDZWXxu0w392kaFiPnIAAyBnmuL1L4faZq9wdQk8xLzbtDxkgkV5vFuRVMfTVODt1OvLc5pYaPs5rVuy8vU/ce28ceFGFkB4htTyACJF4/Wvw4j8G3cQEcer3ijGPlmfp6da/N6/htidG5LQ97B8TYVUpRm9WfvmPG3hcAEa/aEDgkSLx6Zr8FV8L3wZEGtX23J6zPyD+NVT8M66XtHPQP9bcNTaa1sfvSvjTww8boniC1J548xfm/Wvwq0nSNT02+juo9Xu96SAgNKxAHfPNdS8NK7XO5K/p/wAE4HxthajsnZn2L8XLtZvFF8YZ1kUzM24HIOK8ktzd3dtC0zsxbAJz0xX6pkmWyw9NQm9UfE4vM6WJqN0un4mLcRC4ilV/mVl2kdj7GtaSzdBt/vkYNfTTxNOycFojijhXKLdd2f8AVjxT4S+NJfhT8YIjNceXo+rXIVlPQEnvXSeIfAul61dK91ExljJIdeq59K+D4n4WpY+PNTdpH12QcQvDRjGor9Ez9YbHx34au7OOVtctg0sYYbpF4yPrX446j4GmtPLS21a8UIBgCV8HHtmvzip4aV4yV56+h9jLjnDQTqNXP2Rh8X+H/PiZ9atwivnd5i4wPxr8UP8AhFtSfZjW70Ro+GxK+P51zT8MMXLmtJa9SKHFOG0qS+F9D90brxZ4WubKSE65aussZGPMXkY+tfiJbeFdRtnjmh1W9+TDZMz8Y6d6KPhziaUk4s4cTxPhJNrXl/I+ivj1pllZ+ILi402ZJIJW3gp3zXkEr6jc26xXN1JJjCnfkk1+rZDh69CPJUdz5PG46k4udLZmVGjPbq7bvvAMD2rsLTTXFn/qzkpwPQ19TSqNzcdz5PBU6qfNJ212OA/eKcR7iz5yB2rsl00xogc4BcnGOSPSsJ1XKVrHdJTjK1R6Jnxl/HsyTwQQevNbEmlyxy71gweCcd6+1rUop2PjaM6jSVRPX8DY8Ox8rwQN4Az2pdMgvI50dkKIGGAfr0qI0+WXNI9WcZPljDdfie26DoS3pjRRlsnJbtiuk8DX0YMRmJ7KR6V2LFbKKPDxWVpXUp6ya/pHUv4CRbIN5e53xgete1adJDdQRJkE8Zz396IYyXPeS0OTE5VCNLkei/rU+Utc8G+VG7vCwiGSQB1INfU2teHIryEBVB2tgD19q39rTqXbRTjOjCLoptvr2aPz61jRLhD5hBCqDjI6V9MeI/B0pQlYgevGOgraph4pckNzmwGYVYL2lZaL8z46axYM2ScKCc+vpXr2qeEJYt/7vgscY7Vw16ElK6dkexgc79vK0ou76HjMgSOPIcAnAye/tXR3+hGA5II3NnGOlZzprS+52QruEpRe/wCRxUkqs64YLtYD61pzWsMS8ryQcH1rBKpZKWiLoxgnzR1uVVcRgSZxnGPpVMgq23azAuAM+vtWMnyKy37nvRUZQS/A6DR59t2rxlhhsAen0qnpTu1zGuANsgGR2rT6wopNq5M6ElNQT1Prf4eeYxi3OcZGPb2NVvh0yxyQsXJXCnj+LpWVbGOcLo8qOUxjCSlOzvofUERP2WMbjkoMg98UKh+wH5ju24yKWFnGcry2PDzPKalKUKkHddfmfN3xJlffJkHekhJPanfEFgC+58q2Vye2a96VdKKjFHn0qcvbOLd4yPBLRjLf4GAVlGR2IJptu6rdqokKkOSB/exXmYid1aJ9Jgr0oOdRr0PoTwZOIIkQIN5IJHYVkeGncpGFJ2sq5B/SvOxVGyTfUqnjVCcVM9MutYSCE71xtblTXKXpwrE5JPAB71x4jma5UdtONGTcUx8OrRPefNgIGyffFcyY5BJhQd/J3HtivHqVOZauyR31cTGEVCMdNLHUtr4MnlIgVAxUEVxEXmeYoLH5WJAHeuaEr6Lc7akopR7S/A9O0zVIyXEiDI4Unt9K5XT1lKB24IJKk9jWVm3poy3FpNS95Pb0O/n1OERvuQN0wR3rhnad0kLFgmcrjrz1rRxcWpJasiFGE4unK3KVdZ1GKQRxxKVYyYyO1Yd/aMGVwzHLBiAK6q1dyjdLYyyugpzbT0Seg26e1WIs0ZGSASKzL0XUrpAqEJkZz3NZJqmubmMpqcvcS/pCDUIpJNvnMVCKAD0rLTTrouYxn5ic46j3rOVWUbNLdm2Ac6km5OyWy72O0ttR0+Qpbjd5gAHPTp2/rWDY6bOt0jnJCPkH0rphUVON9ycdHmrc0Xq9X8jorq8iicLvJzgKp7+lZVxFN57ZG5AQBjtms4R5oJWIp4jmg4Re7H/2nK8pjJO1uxPU55xVSG0ZmyylsvjA7HsafJJ6dhvE01TanG99C819JuzubIbgk9T71E9nIdhKnCkZ9TV3Sim0ZuHsaV3Jv8PkWFuZHjx5jMN+GJP3qWG0kZkzkbiQVp04px9o2dGJpSThGPa5A0zhVeNjsRiSPWtCGyUeYnrgYA7+tUpO1m73Kw+Iq1Iqo1ZlSC/uVdcXDhcjHJ4NWYbOQTjAJxjIb1om+SN+p4denVU3Vk2k2Wjfz52id2XA+8Tx7VM+nkJGy5+ZiCT2q6bVk0z0IYVwjGvJ3uSrcXI2kTtlVO3PbNX105m2bmIUMC2e9YwqtvyNaqc21Hr+pSluLvaSZn3LjJJ61rHTJWY4HysV61s5xS5pM4I16kF7GL0ZjrNfM0eydwsWG4PJrchsCZDHtPDDn+9UU53p3b0Z14ijOnKM1qzFvbi9KM5vXZ9xJJJ4/Gti40p3kYkEgspA9MVpQpqLi5MMTOrGCqNJtnHPdX5kUPO7M2AGBPHtXUPpH79GcHcR1qIzjNJ22OiblRlqrpr7jnvM1AxqondgvUEnk13NvpKGI5BAUAgNQ4qL16nOo1qkPa32ezOPaHVUjjl+0tt4DAnr9a7+TS5BZfMCQ2Bn05rTDuTbUtSo1El7y944kz6rHGjR3kgRc4AJwPQV2R0tmhij2ldo4yOvoaUZWlyM58dXqRjGUY9e5zUOsawGUm9cbSeATj61vHR9pIDfMMZHp6VVWMJJLZGM27vS7OXeeeeYs8hMm44Na8WlOt4VZjhSMY7+tKVoyUUdFGbqQ5oaIpeVK8QIAZXbnPaur+wM0YUnaAwAAH61nGq1PlktDpwNODTnB2epx5gnCOd2QDnI+vFddNZSLGEZCctnI7VvOrK97aHPClFVVKUtHoY0esXMcIi+zKVZSCx7+lXptMlVNwO4bACPr3rGpRbi+XRnFVmqVTlqaorW2uTIIrdbJCrMQzH+H0xV2DTJHliHKgsOPWubX4r6HturdxT1RBqe4W8JyTukOR6Y6Zrp77SyYI+M7nBB9KpXs5S2M6eLpOqlazelzkohvWPLDa2Dg9D6VtTWjQvGgQsSMDA+7TcFytx0bJoY5x0numUo7c5TCAopGMdvWthI5QmHj53cEdBSoynzOKejMcbWpVYptXa2/wAjEjs4NshccqSRjufWtn7EXkbJOJG5A7CtsXFcyd9DGjiYTw6ptdepjm3hVkSNyFzkse2K2m0MEAxSYAYkgdqzhT5W4pneswcYO0en4djFMACt8wPBbA/irattGPnhdxJGQGPvU1q04tNmdGtSnT53Gz6f8OcJfozvEMAHg8dh6V3V3pDNKpZMY4zWkppPbQhzhOacpWaVzzxrX92CBjDHaGr0P+yo3UlFyysDz2qMO1N3d7HY8bKNNzl+BwiaeyooOQxIBzXfyaZvQBsoc9u/StoSbimmedGtCc0oRa1t9554NOwpby9wMZBx3r0JdO3hFyQkjqOPTNPn5opNFYdzlKXs+m55y2mLu87BJYAY/lXpqaWVGxeSSSAR09qUpRsot6FuSnVSiv8ALQ4LStMlM4kYkrHICRjp6GvY7DQEt7cbsBpTkg9zXJisQ5Wilex30oOEuWG7OKDhRgglgQcetd+dIs4sFwd3GSPSuZ+7HlSO2MHB6vVnm8kEMqyb4xkg5I7V3s9hYvkRIPlyM/411wrzkrPRHmVqkFNqMbtHD6BaIs108YKqV+YepFdvoulotxOU5EiA4PtRQs5ptjrS5qXItG9Tibi3IZiCQ+QQDXop0cEtzkg8cda6qdW109hSlFSjGG7seYizlOGZsbgMkd69DGlYxxlgeAfQ1kk7tsqtiIw5Ipczd9DgEtJEAZHIG5QQe9eixaQSwQkY5OPSlOXM+R6ox9tTjVTpK0n0Z5++n3DmErkIGBJNeiHSyNvQ4PJI6fStYxUZ8snoaRkptySWmh5NeWEgu+VIPXGOleg3VkI5+VydxPPerrSc0kkaUK7U5Kb2Whwbaa3kLIRjBDAeteiLZJJCgkUbAQAfXNcMuVz5HsZYyNSNBVG/i3PKprMKc5IBByPQ13d1YDLDjk4P0HeuyKUrRirMieLjGEVUdlp8/wDI4AWGIGK4JVgQB3Jrt/7KHk7h1L4BHetqHKnqcrxSjU5ox/4Y81m0yZpMHAC4Jx39q9HGnZY4UlgCuT2FFKurNvY6a8aaSkndrVnno01x5TLwMncB7V6WNNAjBYEFQQcd6yhJRnyy1ucjxrpvmgvd00OKtNJkmQsBhgG5Nen6TpijaGXkk4Hp9a58TfdbHTgEouVRPV7fqeYNp0ohwSC3I57V6hdaWkbnABGep71pTqxclLddjmr01UptpWS1/wAzymPTGj8vCsFbg+3vXpz2BEQUIB0I/OtpTTdnsc1Os2uWKv1fkjzh9M+YgrtDPwT29zXfC2XaQybssMj0JrKNRKPI92enSqRjFypqy/rU88GlLuATg4xn0A616NbaLNdzGG0jZnY4Ax0Fb02oycIvTc82M4waqpXa2XkckNKJt92BlV4Ydq9OuPCmpWdpHJPCA5IBVe1ZUsNN1Pddj0q+bU+Ru2rPHpNEVHLA+hBPf1r1yLw9P5JleEhFBJz70owlflerMac4TTurRe55dF4f3rHvOEOc4rv7u2YfMsWQnBI6DFcsqSb03ueliIU4qLUtLHn82iyRRhVOSnTHauzEJfpnJGMHtXUqrhaUTzalaLUb/NHCRWO4oDkbHIyO3vXaJZpvwgyxyAT2rRxU/dh16mrzCSiqklblf4HLDTwcBgAAQSR39K7EWTfLxk46j29a5qkFZt9DtqYiEKXPBX5vwfdnESaV0BBV0BJFdsYkTIbnkDFdcU4pTi7p9D550PaTbl8Vrp37b/ecSlj90qmWGcH0rthZxKuEyOc81eGqRk7xVzonTdowk+VW+bucc+n7UVs7WzkH0HeuzNvHGxVhnaDgDoK5+eXtOZLV6HXha8ox5F9l/ecRJpOwrt5ZjuGB0Fdw0Srt2gE5FFPmUeaSuaVK0G+VPWVzhl0sR4zyS5yO4/8A112/2eNzuKDGVHNVUgnOzRxxxMqk+VtN9PI4j+zM8DBBZiW9PeuyFqCyjGIyBx2PtWbu3Z9D1VSULqL1/wAzhk0XcQQ4AyMDHJruGgwUUDBOQGx0NW05ax2PJpYh0abg3dnI2+mJGeAc5xg9q7W3tcg5wSoBOe/NaVovlSkb4F3+J36nHNpOc7ujMcgV3KWwJKKwLHOc96WFjHWNjy69Z1J8lPa+pwC6HKWIYEIvUj+H3r0CW1QBd/VSCKvlVuSJ3SbjFvm93oedroe1VK8h8jpy1ehJbKAoIDbM5A75/KtKsZSTUWecqsvifX+rnmp0jrG3zYHPHFd1PBCzIobAJJJHU+9YQalN3RtQVWUUm9Lr+vmecyaQSGOQCrE5x0ruHt+SFyF4GD3HrWqk42fyOuMPelBO3X/gHCQ6Sm1VJz82ST/SuzFsoLZJ46HHaplN2ST3Y5RlSh+8W5yr6UhxlMtk4J7eorsvsv7tOckgcnqPesqNJylysjRRUkcgukhpMnAEanaCPSu3WGNQCM8A5J9u9TTqqOiFjcW41Yt6rZeRwY0gD5j96QEADuDxzXczwAAFVAU9COq1au5WWqMMNJqTdTRy2ODfRRghiVLABce3Wu2liDOmxsgIScd/SnRs5N22Z6NebpwldrTt5nExacu1TxnoVPc11jwqiKTnryR29ap1XKpboebT5pQUlpc5mPTNoyxAUnkdxmujRMj5hlRgDHXHrTVSUndbGkLxtBq5zX9nKoyykgqAAP4q6RohJsxg7mwc9KiqlLW+xVGTirJXscqLBiFygGASue2e1dC0MSoqqD8hOcdqOVc1ntuZVcRSnL3d0Y0WnMRgYycda2VBG3LAgAkMe3pWEKrveOhtPBqpF1o6MzP7PQJmRcZAwBWxtUBctlgSST29Kfsk3eO1zpwkpUmova3xGRb2Ak4yDjoMetb9r8iuzKTg8EdamvBqSSR2QzOpdyT0Sf8AVjPFhHHGFIHfI9DWhEobt8zk5J7e1b+yUUmupx06tStT99GM9om9XEWO2PSugCqcjJO4jjuKzlDlklN7hSnFq6W19PQ5+PTUYmUfKxXnI6ZroWAWIKCDkEEn+tKEVUkoLYzUVCk51HvsjEjsmUKFQFiw59c1qrLzHtBC7zgn+KtnTcZpvZHk4XGKdJwgru+j9Dp7PTgYo8gKFGSK2LGRGhhXy/mIUgno1Z048ycnoenTrSw8lF66X+ZkXFkp2hlxgEgjvXQuqMwKABmwAPTFbRcJNuSLcqsqfu7M42XTwJY5OCwBwQOlas5CzMN+DkEg9/auXklGPuvc6cPS15nrbv5HH6lYoSrSqASxBz/FVzUDlgxwVLdQeh7cV10qUpNJuzRmsRGSV13/ABOGNhtkxglRJxx2zWzKUYoWkPGRn0pqo2m49Clh7uMIvdl02EDWryR4BQEEeucU0gMqjd8hUk5qrxgkpPQ41TaqOnF3buYhtEUA56uAPU1qpHhcggMXGAfTNYVIxUlZXKr4aXKm5aI1bKwBtctyzHt24rSsyfIY5OG+UgfzrKnFxalLc0oYfRrmutLGD9kj2himCMkkd8dK2FJbAZed2BRWgoS5b9biTlKfM1do+RPM0iaTzP7PZBHJggfw5rmh4rkYAgRZ83kMOCPavsKlWMmlF6ehdKLjG7i1LZ+ZpajLDanELkpKpKj0OK5LUtVW7YysRnhRj+GtXi7RUUiI4GV3zO1tvmeh+HPECwPGvmZzjr2NeTRXfksCHI3Dgjt7Vz067bbehr9Xlz6xTaPs7QfG48tQJQFXBIz1r5d03XpYSiiYjGMEegpxqRbuVLKnUcpNaNI++dL8WW92qh5AA7DJPavkvQ/GTRbXaYhdwOTWajF3lF6nJhsBONN0pO9z7Xb7FdLtZgwbnGOmeleDaJ423+SPPB3kggnoKzlTq3Ur7Hk1cnhTdm7fqejax4Vt5VMkKgs+cjHWrumeIob7y03Bhxgjv6mumhjXytvoP6lKk+aHxP8ADzPC9d8Glt2YzuBIz6V9C3enW9+oVgM7iQB3J713/WadRx9o7HyCnWjN+zjzSbPhfVvCTQNlISRuY8/wmvqfWPCAnU7Ax3HJJrOrCNWVoOx9Pg5TwsbVle9mfDF9p0kO7cMFBgnHWvfvEPg3YG+Qhc4JPrVRwLls9EKeatxbW72PnGxjMczLypyCD6V6MvheSKfcIznzOh/rXnYmnOm+Vs68qnHEtVJNxauj174bni3DEkK2Mnoa0PAunTWxj3KTyM4rlxKcHyRer3PWwtWm6dpx2bs/1Poya68izO1iF2gkntxWc6t9jyxYYTIwfu57V05dG0ffPls5xEp1vZUXd3Pn74hy53vuAGTgDvkVR8cEHzUcAgMWwepr23QUKTTdzlwdSrJ2itVq/PyPErSdmuvlwC7Ak+nPSpLPylulXgKrEEHvXlTu5crR7tBWpSqJau2nY998JRtOkR5G4ZGO/pUngo4jRkc9sZrGtzQdug60oxSk1vZ/NHoE1gZIoWbqoJ571uzMBHiXaFZQRnrXk1Wm+ZFuTaty69X6nAS2BTG4nBJzgV0ExdnVDyjsrFgeteZiKDmrt2O/BVYp+yUddjlLfT0WUADq27PrXVfZwAGHGCRgd815cou9uvc9p1XScVDVLoRw2kYRQQODnPrVtZo9giXOcgGuluKcbas5K+IlWjJSVrEsOlLccSA7QpORXQ2fl43Z4CkE+uazqzny2bIhVTiqLV77s5HU9IKxI6IdqZOSPSuxvGTySGO3A49xVJtJc0tToeGi6n7uNlynlE9ou9XCjzBgc9811Rs0eTnB5+U+maKcor3kee41nNQb905+y0pbmQPJguMnIGM11VlbM7lFkChQelaTi2uaT0OrBqEIOKeqd7Ef9kRRqgSMHoc+tazRSxou64w244PrWlKUYq6RwuaqNTW+px02lw+aQFxuxtrakicSKS4LZAAB61vOpFK7DDrmTcFa5z1tpkZkI2jnuB0xXQLbyhS+OXJHXoe9YSi5LmTOmdeMKsLq6RzZswXDMu5F5IH8q6BoD8wUEBQck98VbprlstiIOoqrSd1v95lJYxGIkDBUDI9c1qxo5D5Uq7MuQfbpilGSdkyp11R5k43voZzW9tDGrsTjAyfTFaUlsZThgCCAOa5+a6aZ1PDxmkoT1tr5FSytbeW4GSQhwCB3HrU7W7BmVVwqx8kdh6VVKLm+ZvQqGL9lJJJtJW9S+9jAJY1jAEYPfv05psJlC7trZXIA/ujtShDmknJ6HkuaTnFLf7jaisrQ4JUqcjA9agiuH2bDyVPUd6rE03ZJdzaVSpTim9bGkbS2XaAQfmOQO+euKpQzMV3SA/M/B+lKpFpJPVmkIua9onoie1s7cyIZuBuJAHr2qDznCHYvzdRnt71tyK3LLQp1uanzSRq3VjA6iRQAONx9ayBdS7cuTgnBU0KitrmEJtQTi9bj4rNHlCHqrZBPf2psc5OyRgRhsHFKq5LSJ3UanNVs1q/wN19ORLY7cFtpJ+tZr3z+WqbiBkEgd/c1phaqb1RyZjz04puV+/3l+WJTaqki8Rt8p9fesa4vHYLHg5DHGO9LDyjFNpajxWIfPGstXtp0NIPGygIgwvGTWMt46fuixLHkA9hVTcItQewsW5VJRknqaLbcgbQDgZY1CtxsAJALMck44p0qrqQ0MJ4d0qri/e0HJZkSg7cpjoTViKbe6/NtAYEk1U3JRbktTSgoNXTstkMFpsXbuypbGR254q8Z0DjqSXLAnvWUK7Wsuhs6kY0udKzGrbv5OCMKFAye9XFk+UfOfnJOPSlKpFStt1MJ0pKCnU3fQzvs27ywc/MoJP8Ad9RVySTaxwMnBOfeorPmp3hogpUak6ijLdK5Sgs/LnQg5IYYX0q/aSK08YAYbZSSfU1zziowSkdlJNzdWLtfRs2L6APawqqkMHXPvWjdsDFGByrOAT6VEKanJ2djllN0oqEY8zZyl1ahHVjyZMA47Y6Vo3vEqFCRGMDnv711xalDR6GNOCpzcZayII4MgqQAWQDA7cVbsb6DEiNhmDHBB6jtWTqunVj3OnEUpxgobLqUns0zgIVIXI9z61dmuQr+Y5IUgA/hXS6ikrSWpMcNSheV/iKC2xTIUkBjhgO9XI7yB4RjJcMcD1rjdWN1GT1RtgoSpxk29H3Q2G1CSDaFAKnBPYf41a3QkBg5J3EgntXTBttJu7Mq+FcYOVV6XRnyoBOo4+UAHPbiq19ckzAITluPY+9bSim2728hVMBTjTcea97WZI8EYQtvAwScEc8daz7eVZlwNzDeRz29a0rWprmk7kSoP2d4yva2hrm1hdYwsigMnJHY/wD16hg06+u9i29uzMSMjsfeuPVvfqedGCT53dAbVBgo6ttbJUdfrXWWHgfVZEWSedVBJ+Ue1azgm20erGEYr2kfQx7GxSSeFi+SHGQe30rtbrR7LTII5PMY3IG0kng1xUmleC3Ot01Gzn8JlzhYkDqBhAME9/asbWL9fLx5uYwCcE+lVCOnLfc7sHGMm6zjv59jHu7gyFiOQMkD1+lZL3UUZ3ZLA8HHv6UQinJRTuZTpTjUdRPUvW8gQ/OowxXpWXHcrI3m5O1SMg/xYqZYVJaM541qk5cvR7P9Dv8AQY43nlIGFAwc1S0HVIIll8w4PJBPejVTcGikrRbkv66m9IibnEHCoCQD29ayDqsEjHy2A3sxA/lXo8qjBRl1PMhCbqcy2RqJbxAD5st157Vki/SJg0jEbeR7VU6lk20aVcNUpV4yb0f4GuIeeoAzkZ7+1Y66lFL1nAQtgDPNc1aLuvyMZ15SnaLb1Wpp7sAhAMOAMnt61j3l+qEhZACQST29hSjJSSkz2KlBU4qKd0OubZJJd3mANniuaOpxiRBIcOSdpJ5I74rOVa700KhTpqSrQjq/6ub8UAX923GWBweh9K5o64gZVIP3icmsm5RbnLRHYuWMLVNVI3f7O8yNiCOXPXqc1mDV1dYxHJjHJA75qZYmVm3oef8A2fSmoyvr/WhdkszAqlnG1l6CsqTVmkkKyODjIBz1966va+6pPucMKUYOUUrOxaUop2opD7jkjtWN9rUODkhlIyfXNU6iScYo9DEUG4Rk9jome32ReXkjqxPb1rKgu97DbxhgR71nOSUXJ7ip4KMoqondX2O6tRbJbwsqEvtwSO9YcN08GHL/AHjyF7e1ZqiuazdzKrhYpcyVl0Jbtg0mAuAZCAT2pskok8w4OY+o7DNdmGcY03BL0PLrSq0q3tFquq/UjZVES4YcsAcetMMmQqkYIZmOKmDcG4takyUW3VTs9PuKklrKrR7OeMHA611mlzQLHG8iA5ckg9veso1ZRaTR7FDAyqv2lO2mx2Hg/SUtbNricDz35Ge47VrWn+nW8XlzFfKJGF7/AFrpw8Ept8xhUg6jbkrNfj6FuSeG8kNu6nOcgnsfeoZbTyAXW5Yys3zMewHTNelyuUbpnIsXGceVq7Qy8s4BayQlcMckEe1Z95eEJh3IbYST6/ShV1H3krJ6Hlz5p1IpLbU83utOlZpFSNsrkEk9Tnit2W+VWZ2YkBwCR+lcywcbNLe50VXOtJNqyWnqcsdKuYojM6gouRn+tbWpamn2N1Zyy7SMZ6e1bU8M6iSk7WHUlCF1F6u3yOTEJIjwMEnt2HrVG0v4vtCF2ARiBmuPlUJNR3PQr0ZSpxUvh3+ZspGEwNwJOetVLm+j3N5YJVSACO/pXLWi3dSidOFwdqas9ZIjZFM2FwB2BrNm1GIbC0mMfeI7VSrXhyxRxwy5QaTls/vN2CxfzlaYHymYHC9/WoxfmK2SSBndpTwR/D71ye2d+SB31FzxU5rW4aosabRCpCvx83YCsSXUneZBMCU3Zx611zlJRvHojKUrvke5biSaRtscJLgAkr3qml9FDceeCxjQjAz71E68+XnRnXy5yqJNMt+XMd0SKd8fY9j70z+1opNQZhKBG6kEVM67iozjt1O94OM6MqUVaSLyWlyhCSp87AgKO59qVtXjK2zgkSQzEMSecetbQc2nOSOCMVTcWt0hy2s/nJbiMhiec0Sa5C8qzNJhkBCkkZPpWUpuUHKC1YUYwjUUamqZE0bxMYiSGLAZPvVS41eOS6gmaQFAQGGaI1mlzNbHbhcJTpp3epoTW8tvJG7sRt6YqpeatazWxU3WJEGUA789K2hUSTT66HLKpF1OSat1HXJeCRBJysnKk9/euI1XxBuWJWO50Xbx2FdOFi2rdTDFuKkowenXTodvZSeex2uM5wS1cBY6skpZY5mzuyCO9LE811Z2Z2YbDJ0Gnqr6Hd3lu8BRnQBWY4I6VmtqkC2AhlnPmFyxweg7YNYYeaU7SZMHB1FyvbSwmD1IzuUHPpWIms2bOf3vygHb7VpKjJyTix1PZVKkoJdOn5m0iqDhmJPoe9Y0ur2Xy7ZAfm6Ht6VMVd+9ua0W4rVaW+83WKqQASdxB+nsa586vbLtYygMCBjs3tVyhUcXF9TlU6UanInb/gnRsQgzuJ3gkY71y7atZsIw1y2Dnn61z0oqUrLcmq5KLinqdORCSDlgxxkj+tcq2t22z5bhQS2Bk9AK2k2m7I0p0qbivavVLY6OUqvGcZOM+tcg2twMfmuQMYAz3qJwkrNas1wsoSlyyVkzpGlT5vlwpXj29a42bXLcoqi4Jboc9jToU5yd3vcVShCFRuLumrfM6w3EKBV3MTuCgjtXDya3BGqkXGCV6A96mSSba3ZjQotpzctEvvOvluUCDkhVyD78V5+NdiZcGYHrkCqpJWtPqctO0pPlV79DszdINrYygBAz3xXm7+IoUbAmyMkDnpW/sbR5ZLRnNCU3V5U7RWnkenLLFIm8SAByAAen4V53F4hiEakSgjj8PSpptpqS1Wx6tGtSlFwtd9z0SW5SNUTAAY9scV5jeeJImO1ZcYPJJrWEoxjy2ONVJc9krLsemi5OCxcgDGQD1rzSLxJE6k+YflJPBom46aGiw0vatJ6HqUN0OQSMggEDvn0rzeLxDEH3eby8gGM0ckb2b+Q6WHanKrJWWiPTo76HG0sMhjkCvNl8QQSo4Mm1lY4bPb0pzjFSuzOs5TXItVfoejTTQhS5ZgNp5HfFedya7FhV+0fIuSQe9YUOeTbb1HiMMoqK5dGmd19rBEW05LSYB9jjFecnX4FdGNyBlvmA7Ct6z5LuSudDwvs4R9lona59DabdqLSJeo4AI615fp/iaJLVVjkyNvJBHQ1xwhKaSi+pz04uqmpR2/E9ZNyobII35wcHrXlzeJo1cESgKOpHaumuoqN10MZ4eLlFU9/1O0u5k85jnPIIx2PpXmV14ngEoQTAHk7h3qFJtXZ1qrOTjG15RWp1upTl2TbgANk5PSvLtV8Ukso3Ebc5A6mipCSSjF2ucc5c0nNre1jppLpY2VHbAPJAFeO3Pi2Pzni8w4D4BJro5nCSd9z0IUby5Iq/Kj2yKRnjJLgJnOM/yrx+PxLMyROJiqdSprmqQbSfU5aVRQj7SUfevoewbnYb9+WJ+UD615E3iSVWUrcYycFc9Kzp15K0ovQ9GhTVWbhNeZ77pt+sdvslkB2tyc14bb+JnKqDOQvmEgD+tTVcXZ31POoxlQlKmo3TZ73DOGYk5ADA4HevGYvFMwI2Tn5sAA9jQ4KbUl0OmONm0o8ttG/uPi+S7fZhXPynk+hNUMcs/PLZOa95zcmpRIq1GouL6mmsjIoBkLEMGIPesZ5mLBsn73GO475q6ddp7HLPnjNOT16G5FdbWILZAPQ9vpWKso3oApy7jCmt5RV00OMqsp6vc6pbpo4t6SZ64Y/yrNiJzsZ8gqOR61jUqRb5ke3ChVcFGo7L8zftdWniC5kJUnBx29KxyCBuDEDggD+tT05iZOSaUkei6V4gliYFpmz1571waThdp8wB1K8nv9Kv2knKydhVaEpS9q97fcfTfhzxq4ZNspwmBj1z3r57sNVlgYHzfmVyDg1uuRK0tbniVcNJTupeW3c+9tC8YI4hEspLvgAGvkzRvF0kbqXkYCNQck+9XOCnH3djzlh1TTcvi/qx95Q6lFOmNwPIOPWvm7QfG4Lx7bslSRkHt7itGlGnZLU3o4apOqrytFdD6LvNDtL+FtygnOQRXNaB4qt5fKWaYbcnODnGR1rndWpG0onJWy+nKSV+/wAjKn8FRNKJFiBVm5X1x3FemWN9aXL7S+4nlWP8qutiG7JrQ4MIoqTjJ7M5jRPDJtWLKDncMjHT+Ver2cabEOMjIBX19jXNG17WOmfNupWRyd9Z+VbMeoAOVHXmt7X0j8mQdAU6emK6aTckmjy60o03zR18z498f4j83ofvZI7UnxDkKtNjAXLDBr1ZycVyvU4sNUc25R0vseGQt/phXqUZWBPb1qnbyt9rV8nlyCB3rypy5Umu59jg8Sk1J6O1mfR/g6Y+UjDOAF4PU1j+F7toreDLH5cHPpUVKkpJSXQ5qMKVS9JX959T2qW8UoiseY2JHFecX2tKoyJCNqgnJry6zbTdtz0pVJNunF+7E61b6DeWZwWBJAryeXxHF5nlpLnkEsDXhVnF2Tdj28PUbSk3ZrXzseyG7iCq2/HzAlRXk6eIVdkAc5VQeT0rk5Unp1OmMIu8IO3W/fyPRLm8US/JnB5B7CvO5tfjEZ/eck4Bz09a0oNRkoSetyMS+eMasto3+Z6lY6opkCpLkAAAevua8htfE8X2lIopMc4OO9XUrv4rehzUPZuSqRj/AF3PepbgvGu5wTtBBNeYx+JcxkBgX2kE54xWUJu+quzm9vKnK023FnbfakL7ucAlcV5nN4xWDf2ckYz3NaLDqSfLp3PQoY50488o6PY9NS6MMZkAI2gnJ7V5JP4zllQK7gB1HA7Cto04Ti09ypqScrK90j1C51cP+7MpDNkDnr9K8nPiq0VosnMoHGaqEkkorc8qjTl7T2afuvf5Hpn213KoCd+4DcD0ry4+NgJcEhQzA4/rV0Zt++36k4+zrckVZaWPaYNSCWwjkIDcgE14unjISAiVsqMgZ71FeUb3g/iOvC0ozqcrSTiepS6gyFgsxZQwJAPSvLH8XLlxGFCgAnPQ4op1E4qN9AxNOpGpKLSb7nrA1QtFE+cSA8lvQ15IfFIdN0jchycDoRRUtFKTW5zObpwbk/ePYTqXzqofcG+8F6n2ryH/AITCNIAAQs2OSOoHpSoSco8i3OiFTSNVRvF/gz2A3bk7gGwBgqepryK18eOkmTOBhgQWwa0Uot2fR6nVGq44i0Huj2A6hMu35iG4Bz79BXk1z8R4ZMBwmclSV/Sop4hxXvqxy4i3OoLXfQ9ch1PbtYsMNyCO30rxNvG8U3CMM8EEdvWprSjNWkzalhp0U2o3bt/wx7aurMVVd2fmOPx6145b+NLeKRS2CzAghucVlOo3LmW3Y3+pRa9mrK57N/bkcaMDIQ5HI9K8Tn8YWRO8oWOdpKdq7sPh4KTmn5nmyjWVH2NtL/M9lj1lmbeXyXACgc45/wAK8eg8Y2sMQTftVgMDB4NZQlGTUnsmd2JozSgqcb6HtsepTBVO4FUwc+p968afx0jIUWQbQCCR1NE6kJtRelx0strUYqbd0vzPXZNay3yyDcTgA9ya8L/4SkPlvOyQQcnua0oVoKKjc4sRSbV3HQ9yfWQ7LyN6r831rwkeKomXMkpVl5yvXrWvsVFXTOSVWcYuS2R7tBqay/Mr8H5SxryS18RhkEQkA+bIIPWuV2bs1dHo4XDtR9tJ7Lbqe0xar8xQsDlgDmvKYNckQrIj5OR97oMV01Ic8bx01IqYyMUoPV/5ntCarENu5QVBxkdRXkieJmV9g4w5BbH3s+tTF2ajLU5J0pzhKnDRp79j1G/8YaXo80H25wscsyoDjJ56V8w/EHXZbmbS4gx5vo8kHggGubG4hUcM6i3PW4eyuOLzOGFqS9zRN+Z+rXhX4Uaf4i0Wz1NbkBbyNHJHUA+leo/BhgPA+iZyf9Aj6d+BX80Zl4kYyU3Tp6Wfc/aMZwZQoyalstNjj5fgZay4ZbvDLgAEdfrX0Wz7mBIIAIAPrXLHxFx0EpSd0+hzLhelUjp08j5xi+BMAMYW62/NwQOlfTcJUsjYyVbn2HatP+InY6UrWt8yMNwph7Wa16nwt8UfCB8EQ2oe6LoXBDHHIPTNaX7XWtQ2FnYhXAPJIHfvX6nwPn2IzCLlW0Z+dcTYNYaoqVNbapHznea4CoXzQW3YBPQ/zrwOfxSGCbbjjeCDX6bTUYNQ6s+ao05Tm5zdlt8z3Ox1RI5N2f3fGQf1rwpPFzMw23HyrkbSepradFyS52tDCrVlTi0ve/Q97udbSVxHuI3ckDv7VxnhRZb5k1K5IKRklUJ4ODWbspuUd30OadCpUjesvdVrfI9Q0nT7q/jFwQEB4Ut3/rVZvEBgMYVj5WBhR/Cfar+rScea/XY78LWUpSg1ZJL5nYQaTbGNYxfY5OQvbivPotekS+xuYLK4BH8xTVBwXtjab5n7Nrqep21joMLqJkLsoIO/ufU15jda55Nwkm/cG64PWlKgmlJ7M2xFHmhZbxPdNIj0J7630+JY1uLxwAWxgE9xXgOg6vcXXj3w0BKR/pqEgHjGea87O8a8Ng3Xtc9Dg/h6lXrOm5a/gffVp8ItUaOI25QB85dcc+mK+qPDKJ/ZFgSc4hU5I65Ar8Qq+JGJT0j+J+gT4NpRi1LVo+Ym+E+uqrHzWOAfxr64nQJE7McsCcH0rKfifiW7cv4nNT4NpTi1PRHwP4h+E3ieUlY2XYCME8/nX11f7GySoJ5OBXnV/FDFc3MorTzPRwvBWHhR5ZPbU/KHx/pOpeEbr7NqTgEk4A6Gt79ru+ay1WNlOAwwMdR6V+k8KcVVMdR5qsbM+EzLL/ZVk6fwp7HhkniAb2XzABgEH096+eX8RXG4uJSVOCffFfoKxSik47nnTy51pRcHtv6H0IuvhQzLJwGBJzXz+PEM4VcORuAP1FbXTTbNK1KlSakkfRyeJVACCQDcSSc9K+aW8RzsSWdggbgc8VnSeii3q9hNKTTho2fUEXi20hcbnG7qCe9fMEfiW6dFVWJIbJJ/yazqWta+p0Uq8Pei1d2sfSN143R/uSgFmI57e9fMM2uSn7+QBzx9elVhPd91PY82o+TSKtf5n0Wvi9UYnzTtQEg5r5sk1+dZFCOxY4AB7VrLEWSUV8zKrFxtBrc+m/8AhMY5GUGf5Occ9DXzgmpzpEZHJ4Oee/vUSTe7OyclZN9D6NbxUiSK6EMBJjB9K+bU8RXBDRhiWTBye2KmNaKaT6nHGdSrGUoR0PpW48QWM6rJHMEmwQFP8VfNzeIJiqMWYZ4Ge1RGvBv2dtSquHtFNbHvf/CT+Qyhm+Y4xz0r56n1md8OXZs8kmnOUb2KjCVOEZVEfQK+LhNy0gADgcHkV83Jqt0WwxO0YBA71VSd2ubYdGMoQuo3k7n1Da+IprqURwOpl4BUnrXh2hX959tt2WQnkBgc5PrUqaunE2p12qSlP3b6JdrH1bpc1yNnmrhsAjJ4/CvOLHxDcwLlyxYAYJ/hroeGbVpasVKFOmvaR+F3s/M9R+3XUDTedE6opBUkHn3NcXaeLr2VzG5JjJHDDr9a0WAnFKUnY5aFWE3ZO+v3HayeIYliKlyGJAIPVhXGanPaahGxcmO4ZgE2960hhkla92i8bBTpONPbudSvii3I2mZVGQA3p+tfNGt6jqmk3jxS5ETElGB4IrCu42UkwyyMpU3TqL0PqjTPFdrudGnBUMQPfNfH1j4ru4Loq8xCHIB7kjpXLXxMVDmvoduFy+EpqUnZrofoP4T8WWjxzgSZAkxgn9a+M/DnjC/t7nyfMdhMrYA6AnrWn1qEq3LbQ5J0YwjzJ6/5n3BqXi212DypcEHpnrXyBf6/dyxSq8jEgMCAemRX0VOMYxs2eUsPzQ5oR0k9z6G1DxrbMgzcBygIBU8V8jw6tf7HXgYkwck5x2xXLdW5YvQ5sXRVKtHmV0uvY+hbvxlnJEwDZxj1r5tlvdWLsGYGE4GF7+taSrxb5EtELD4dtOUXdbnt2oeMU8p03HOCSR64r54vrnUoonAlOQDjPvUX5I+pGETc7y2Wp6mvjSIOCCfvgCvAov7QdguG5JzjPUd682dZcyZ7UqtGF09Hvc+kF8ZA7VM5JBJUE/pXgMf25nT5WB8w5HdfTms1Wd7vY25fbyi09D2mXxf84Bk+ViBjt+NeMTW98XCKWG1s4z1PvWc8WqiulY7KuWRhDnvsnp3PpK28XRLbqROFDtgAHrgcd68NsYbsxKXcnbzgZ79q6qdWM1otkeX9dnGKjJab38ux7bdeJLYYk88EquSB0FeB3cF6Q/kl1Ltxz19a5lNRklLRM6fryqTSirrQ9Qn8a9/PAViMKK8Ul07VDGCSxfqAK1VZRly20FXozlT9rSl8j1S48VsZExcZ6lcnqa8mjgu/LAIJcNkE9vaicpO7aKw+FdSUm5Weh60/jmd4WDT9VAJJ6/SvHRp18VBZWP7zPOflqPbKMk0tTSpg0k4vTTc9ZfxrKVLrcfvCvy5PT0ryf+z751jAjYsz4PXjHej2snJSjsbUaUIT55PVo9KTxnNxun+YEd+v0rzP+zb1xw7EBuoH6Vo6zk01ocU8stJyqPe1j0yfxozBQs7YGCRnkf8A1q8w/svUCyJh8s2cnt9aVHENXcj0MZg4VE5NK1kdpeeNGZV3SElmOP8AGuCuNG1COKNipI8zk4PeooYh2cUjzpVdEktD0Cx8YzROu2ZWEqcgn7o9f8K88t9H1HcWjUkqhYLz82DWVRWag99zbAz5Z2qK6PVR4wm+VjcMFQ/1rzmPRdSkKqEfO4EgfzrdVnF2vp1CvhFVlKbS8vkd2PFhRm/enJkJGD61xLaLfugUROcMSWx0+tZ+2ktW9iIVKcHzU1fVL/gnVS+MJS6ruP8Arex6/WuJl8P37Fdyt98BgRW9LFyd+VHXFwknJ+7H82dtL4zkXC+adoxz6Yrjl8K3+HXy3O9jgnqMVyxrSfQ5Ks43tTZ1Z8WyFQVuDk5xg9RmuQfwtqA2lIWHBGMdK2hLmVoiq0JU05yetjoj4tnZkBkIPmFSD3HtXLf8I7qQYCWJtuRnGe/pWbqTk213PUoez5VUeqSSOlfxcyum6Q85OR3rmj4cvg6bIXIXIBI6etZuq5O7ZlhoLk97o7o1n8VlQCZCXLkg/wAqop4T1B9jmFjjJBx1qqFZKd77nHNubmmrNLQl/wCEolJADbWOCMk80n/CH3xK4iYbgckjpjtTq87TsrIWAnR9j7N/FYqjxPcluHJTJzj9avJ4K1CSVNsTBQxBIHXNL6zzJNBHBwjK97qxzUviWQOy7iSCSMnqa07jwFemU4iIy4BIHJrWnObd5HFKjCLly7vchtPE8rx+UJiCWBwPWtG18A30UZPlEPv4IHaiE3fmhux01TSi5df0Mk+IJ9xlaQlWOee2K2v+EC1DAbysfMcZHHFTXrTTWhosDGpDlg+VGVD4ilAJ3kKckgd62IvAl+GLeWRnBOBW7k5WtuWlRpU1FbmV/wAJJOzphm2ggZ789K30+H+oEHEZADAnFU4yjJRS9TnSjOCTlZmD/wAJBcJsAmYgtkjuc12lv8Pb392Ps7Fc5JP8PFdEeZtWWxzRnCnZp6X1OPHiG6cnfKwDEjnvXoUHw0uJOWhJYAEA5wRiuepzQjzSRrFKrUUaclr1PNJNbvCMKzH5iee9ekS/DO7O0pETucAjnisak5Rj76ujshjE5eykrcuvrYzNM1q6S1V5HYxFPmI/hxXqulfDi5azgja3zEMgkdTn1rGhNpOXmXKtCtyuC1OCl1ySVIwhOzbxz1r0BPhpe2+UEZ8tmPGOR9K663PH3mro8+lKDbm1Z6qx5BNq915xGSMqSMdq9WPwxuWl3pEwIwAeck+9RWlJtSRvl1KE6ipLQ8M1LU7jhy7FsE49a9uufhPczbN0RDMRk46YrNqpzWS2OrGckYqElr3R8rX+o3RZhk/fGM9/Wver34QXIuiFiYMzgDA61o8LPn5k+hnHExlTTe62R5Xpl7dy20TFSU4HPX2xXv2kfCm6FvGGiYOCRuPelSo1ErLS5E8RFVOSe7WnzPDzcXDs52NkkcjvX0c/wqlhGTEc5JyBUvBzSs5Gn1mFKXsJP4j5tN9dR4UMwO/rnivY7/4dmyWVnib5lJB9D3pTw7g077k886kXG3wnlFvqMzyL87YGB9T71t3GjfYph0GW+Y46VkoTcWm9iqT5qyjJW8z5silZmzg/MQMev1roYNJixnByrYDeoHavo4tN2TOWFSKjJpfNnNtkZbJD4A4rqP7CiCswkO4nIz2rojSlLVmEJqmrNanMRukbq0hLdACOxrbfRFwQZCcAsw9RS5ZpWkZKt7SVm7MpJfRqwZIzyep9ulTf2QQ3+twN5wccfjTjRlonszapiZUvep9LISLVIRzsIdWOQKcdIZC2ZBgKT9ac4pRvYujjZRWq1IGv0dA5LdRwR+VV3sXYsS5G7GPb6VE4yT5rBTxTsot6K5fhvdxClsqxAOe9UUt2TO8HIKheevvUxqNrlexVStCDutX3Ohj1MqFZckDHB6H0rAZmQoM/MOQO1aTumpXMsLOKi5NX5j0HTPEEkTBdwGfmAHce9cHFcOrZViAxOc9q2deTaRm+XmlGe3Q+i9C8Z+UFBc7nwpwa8EtdVeLpkMAAD2+tazr3ab1OOeEbaaWqPujw343RhHvuCSMZx29K+WvD3iCZWGJTtIGQKmvJOSi3ozKjgHJcyj7yezP0m8O+IlvIY2Vsgtkc8n2rwn4f63M3kKXYphQB6Z71nWoqLvHVkuMG2qitbX/gH0hq1wZLMtnKlSeeo9qzJA0lnuUkgqSB6cVvh6nLa/U8nEclSnyyVkz5R+Ikpzcb2wVyT/jXV+K/CWv6zLLFpmnSTSS/MAFOBz616GOzCjFczaT9RZNltfljFK8Vd7a2Pk62bF0uzO1pBuz/AEr3fTPgD8R7uYT/ANhOqyEHntXy+KzzDRbTkj67B5VVmk3B2/zMfTbkRWqOGP7sYwO+BXq0HwM8ew248zRpAkYIwvbPQmuChnuHbu5pIMRk2Ibb5Hp2PAtf1+VGcBgFyCAe9dj4m+D/AIygL+bo8nlpjDAHnPUVzYvN6U17kk7HdgcJVg/a1I2T+/Q8In19wSBKQS2cg9BWzdfD/VUkJns5EbIyrA5znpXl1JymuZPU9mhiMM1rEoReJnRolaUlnUKOelXYPBF+eZICFJPIHeslKfKotalwhRnonoivN4lkaJkEvR8nnr9Kvt4FvlChYiSdzHI+9xV3TbaWpzVYQhyxT0voZWl6xJLe/K7AHIznpW3Y+CtRWSM+SQFYHKjrn1qasZSSex1TpUZS9k1qzo/7U3RYZhtyMgfzrrIPBl6YIswk7gOD3FNwV79DgjhpU5tN3l/meV6prEySHBJ6kA9RXeXngK9mZCLcEFsE4rqpufLyrbqZSoNJVb6HmH9sXL9WI9DnpXpUXw4vGOBAxJUZBH8qSjPmbS0HTxNKcbxje2x5qdVu9yuzkkHAI/i9q9ng+EGqTqhj0+RmBJA2nnPrXO6iTtNkRoRqzc6a16HiLX8tw6h3fnofTmvoQ/BLX4wSNKlEY24O08Hv61k8ZTkkr6s7ngJN3mr9z55jvb0yhVLbQCCSegr6KX4K66oDS6e6/NzweR2rVYhN8qkYTwUYR50rtdPU+fxf3RJUM3qQO/tX0TN8Ir6IDdaMu4A4xyT7VrhZSnHli9RYvCQjT5m7frc+enu7ogqSw4Azmvof/hU88YDPEcNg5x3raDm48rV0cvNTTUJLV9T5smu7rnJYkADI7n3r6aj+ENxIpf7Ofl4BI+8a0dOT0WjOOjjZUJunCNz5df7UwG0sOgAHevqqP4OXHyfuSdrZXA6elJ86acpGtH2c5ybVnp5nyi7XSRxsQ3mKQAPT619e2/wZlkkBe0YgE5Izx/nvSrQlH3n1NKeYwm/YpWS1bPj+K61NGCocrknBByK+yJPgyQ6LHaspzjAHSohhZRs7m1XEJR5EtJHyVFPdsWHzEuoBJz8vFfW6fBmVc/uWyzKM44FYuHv+zQ4UfaUm5uz6M+U0+3Ki4LGMMCT2A9a+vovg/KrkSQNtAyMCt5QkkpNmXPF0fYy1fc+P5X1DZlQ5xyDzz7V9oRfBjfgfZcqpBIYU4tL3o7GlF1Iy5HKyWv8AwD4zt47+Qs6oegBJzxX2uvwazn9wSCMEgdPWsrOpLmW44Y6c6Xs3tc+Mltb5W3IzE4zg5wfavtJfgu8iqpgO0HKnHSuibaVmZ1Kyak5PRHx1a2V2zmR24JBGO2K+wh8IJoiW+zEByTyOhrR0W0tdNzHB4+EpSdtdlc+XrOzuGx5hIJbkHuPevoXUPActnlipUqGzx1PpU1JLVJG9FaKpUd2/wPJrSCV4yisBhsEE9K6x7L7AvkmMlickntW9OEuSykOrVjFOMo77M5qO1ufnGSccA/3vWtofaLiNsrhgSAR35omlFrrI5f3ig1Td4fmzyjxZYypd6MzTLzqsRAHbBqz41gdbzRcZ2nVIuB1PzDNeTxDTksHNvXRndwXKEc1p0Vpqn95+3/whIi8EaLhuRYREg9sgZFS/CWHHgvRgFP8Ax4wk57cCv4mquTqNvuf0pmlS1eSk20j1EOrZVWIJA49KCoAIUYboM98Vi5tS5l6HFUw7clKO2gRSsjl2Y7QQAP61CY8hiCQVAH0PalGm3q92ayc+flpvRfifnN+2xqbQRWYLttKkk+ua579ut5MWSJ/zzBwOhzX794WWVN2Z+LcXTcMYoz3/AMz84JNeviD5cpKKcqD3+lc6EkclDlSCCR68V+0qo46bnzbox5+VbnZeH7291DUoLbeSryDOfXium8AaUX1WybHLTrkjt71g6kppRvp3Kh7Np2Wx9T+GILm1sIoHRj0GR34r6B8FeEI9QgtwRkhQee54zXdRrKKWhx16fNNxTPKpNPvJUV0hJXAyD2r7FtPhdGyAiMksoJHpXsU8Utoni1pOlNWvc+LJ9EvDhkVmLNuyK+2h8L1BEckDBhtAOK5IzfNzPfY9COKgp26SR8Sz6ReSRI4jIKuSQO1faz/DFRuCwg9wCOg9qaldWk9S6mKjUqxTVrJ7HxZ4Xsprf4ieGPMGf9KXt717P4i8Mf2F8TfCDeWQHukAz/npXy/G0Jwy+VR7H6B4fzjWxDhezit+5+p3h7J0qyQYAFunI+lRaDII9KtAcqUiUH8q/ladZxk7H6W8K4y5U731L2q3BS3/ANornjvWFql35jgK33cDjt9K8rF4pNOmtDqw+FaXtXqlqYdzIXbCjOARz1NMmYq6/MDubAHcV5dCvJ6xWtzujHnptS66n5sfta6DPqGrwmLLARAcDgZNfS/xI8JQ+Ir8yvHkqDjPtX9D+G0m8Nyy3PxbiaSp1nOT16H4+P4FunztjYgMSc+tfptD8H45TtjtgeNucV+yRh7ybR8r/aDhTtzeZ+aK+ArzClomDEAjNfqbafA+2Z1Z4gFAwRjrW0cMnZvYwWaQd03e+5+Ylr8LtSu4lfBAZhkkH5q/VpfhLbxRKsduMLg5YenpTw+DjFNv5HPiM2lTjGMV7p+Ur/DPU7Zigt2PJwcfrX6pSfCqzB/1APzZ5HT2orYWUmmlsc8cfCmnUT1f3n5WD4X325SYSWZvzr9Sm+FsKRswtRxwOB+lE8ule1yq+d0koqXVH5Y3Hw0uoVM/2ZgQQcKOuK/UOf4TQToHMAKkgYx0ojhIptMqtnElCM6SvY/Mg/D67mgLLAQNoPfg1+kcfwytI0MSwAkuQeK6quFTioxexlgswppyc1dy/A/Mhfh3emQx+QQr4+Yd6/TEfCm28xT5AOXAAArgeHcXaW521s0k1CFJ2jqrn5oN8Nr5VISJ+eRgenpX6er8L7feitagdsYoo0HCTc1oc8cyUrU6jsz8zYfhndYGYmwoPAHSv02PwvtY1JS3AO880o4GTk4p9C3mkIxcWru+zPzYj+Fs2Plidmbnce9fpnD8M7UgARAZYDBHQ0lhZqaTexE84pwkmr2dvkfnR4f+Gd99ujXymJVzn2Br9SdM+F9rEgK2yh2xkjHaumGFc52T2LxObqU4unG+u58Av8O7pFVEhYg8HrxX6Lf8K5t+Q0IDknHArspxcH77u7nFiM2U5ulax+d9r8OruJCwRiyA8NnA96/RT/hXVtHBIDEMyDPI9Oxrbn5mqbd7mGHzT2UJqET86pPA14kiNKrNIrALgcAHrX6GL8OrVTGTAN+zP1NEnaTb2PTo47lpJq2mvzPzt1T4ZzarYsj25LxLuBI5OK/Rj/hX1msRYxDcEJH4VzSpSnJOOxFLOHSpubS7fefku3wlnCYMLfIxAJB4r9M7nwFb+cw+zAkuScDrXLUpOM7JXE81lVgqjVrbf8E/ObSfhtdJdWTNEQY2PIHSv0ctPh7aptcwqM4wce/WsK9JJWW48JmUpu09/wBD4mT4X3gJYwlkkIOSDz619423g9dyqikMegOMe4rtdVuCutjOVRNtxlpZ6Hwo/wAKYpI/+Pc4dQSAO/evvs+BLXlivzbicemetdUZqGsd+55s4xq0eZPsrf8ABPz+b4QLsDRwOCp4Cjk19/P4It9w+QgZG0j0ohBTd5MjHZpKmkoRu1ZI/Py4+DQaJmeNi4TJBB5r9C08GwqAjqM4Jx61pLEOGiJg1ir8/Q/Nix+Ec/2lP3JKhjkEV+lEHgmzR1ZYwMHmsKknNXitzsw+IjBRU9eU/PpPhC8U/wDqztIyMjrX6KN4Os3fHkjG3A9jXLTo8mj1Vzvp4uXP7ZaI/Olfg+xZsQHLYB45NfomvhC1VmBXAJwMDtRUspKTCOZqVZqOt2fAGnfCForeQ+U2WOCSOTgV+g8XhS08r5IgcsDkjpVKLbu3ruTisxqSnzQirbW7H54TfCN2dkeFgOCCB1zX6GSeEbbehEakkgAjHat1Wap86Wt7nLUg/aRpxfun57f8KcbagEDYIHUdB3zX6GDwpa85jxhSCT2NYQvL94l1BVXGdm9Nz85V+C5IbdbMpJwVx19DX6Kr4ZsTglFOGGMDufWumq3ZLubYaulJzk730PzzT4O+Wu37IctISSR1r9Ej4UtAq4QH5gea4FRTumdazPmvFP7z890+DKbYn8ggK5wAOvfmv0Mj8MWq4zGuQSSB0NS272Wwp5k3GLStb8T89R8GBs3fZskyHIAr9DV8K2eM+WCFfJU10xdkoy2Od49VHKTV2fn2Pg1tWLFuQEDEED+dfoEvhq1KoduNrEA1kqKs6aXzKlnE5pLtrY/P9/gyhVUW3zuUhlIr7/Ph61wCsSjgg+9dcMPazT0ObE45zilJWT/A+AofgwI12tbgZPHHX1r76/sC1ZvnQfKdoA71nPDJLnt1KoY6rSqRjSen5nwWnwaji2hbcKd2CSOtfeR8P27DHljrwfQ1jOEpavY2xOcuhSV43bZ8JxfCEBmX7MqjdgkDqPU193Dw9ZgKdoLbjuB7YqKsJRbptXZy1MfGajU5bW3PhiL4NRyFcWwO1wSMV91Q6HaKCY1Ay3AHrXRKq6bUfkNVZT5Yp3W58QD4PQlxm2AbcABjpmvuY6LZgbggPzEcjpVRlFaR3PPqVko3rR1u9T4Sb4Pxg72tifLfA46190nQrY4bYOTkZ7/Sp5kleex6FfHWpKcep8Gy/B2I7D9nxucnp0zX3TJotoWU4UhiRjHT3rSPLNOxzvG3aUn0uvkfEA+DEYCE2+Uz2HSvuL+zLeNY1KAjkYPfNZNTtZHThMZKpDmWif4HxLD8IIwxbyMgMCRivtgaTaqAdoABIOO+KmUedJtGjzCSvTUr9j4zX4OW7Yxb7SxHbp719nRaXCrKQoB3AkEdK2lTaioxZyrEykpOb2tofGafCSGIKPshJ3licV9qf2Rb/KVUH5xkY4x2qakYykuZDhmE21KDsz4ob4Q2u/cLf5sggY4r7PfSLbc2Y1yCRgdq6VCKja5wrFynOTqxu7M+QIPg7E0HmG3GFwcY796+0dP0qFopMqOScZ7VjCMoyUTpp5q6clUpxuktD4u/4VLagf8AHsuASeR0xX2RPpkKMVCAAEg46mmtryKnmE3TjUkrXbuj42i+E1rkgW2WyTuA64r69j02FAzbQAxBINOnQvVsuxhPHOVNqPw3ufJ8HwmhUIRbg5zxjrX1wNOt0YsAAMEgjtmpna6bZU6kmlK2mlz5htvhVbQoX+zjlSMEDnPWvqVrODgYBPAGPeto0UleT1JVSdSzp7nzAvwytY2CC2B5BGB1r6e+xRDklRjGCO1E6alH39TOtjnJ2glzI+Yn+GVswAktxkkHGOvtX041rE+PlB2sAWPf6VnGKirrXyOv63NtSqbs8Q0r4Z262sYWADlgAa+j9PtYREMEAcZJ7fWpw9P945WPNlWai4ptN6feeCr8NrdigNucqD2GK+jjbxq4YY3KRn3Fb1LzlodUqShCMm9tD5nb4a2qOQLfLFOuBX0ZNBGsgBHy8cDtS5JRXO1rsLEUk5RjzWS1Pnab4b248o+SvUAHHX617/cRRK0GAMM2QT+lXRinotjfGSVGKu7t9O/zPmef4ZWSyAvADk8dK9+uo0abZxzk5A6VanGUeZKyMo03LW92eIWfw0sHRCkACht2f7pr3+xhTyyCB1xgVkp2dktGKvSck5J+8eHXHw7tI08x4gQvOMcivcdQQGJgq4ypBNdUY80PZp2QnGHNFSd5HwZ8QvCEMEEgjAznt2r0z4lIGif5sncQcjpTjSV9tjuhi1GPK+ux+cfiew8m5c7zwTjjsK3fGahLx8ANmU5z2FcsqXLJ3R9HRkpU4tK9j5MjcsfLByMkknse1UIgTkDhmwTn6VoqzTXKeViIKVNezeptAEbgXIC4Jz3qvEGIHUjjcD3FddOo+VXZw1lzzs7XHSFmTcj5UZGCP5UwBkKnadgbjNaOMrNpbGdCNONS8pWbIZYyxUbyMYHHc96mCnLu2eSowO1KKikm3Y0UKsJc61j3M6S2mGGEhLFiMdj6VpogZw25vlBOB0z70nKUY3aPSbVVJJGQttMSzsx5UgitRowHwCxIbcR6g1MpymmnsZui1PkTMcwmQlnAUIDgd6vXETruZFIGCdpPA9q0dmrI5JxnTk1PZHKXTBJCDncMc+tMuUZpcrwcAkHoK53KTXMy6EYPrqVyzDaCw5OPoPekQMSpIB3ODj0xWibadztq1k3GMehIMHYu4+YpAAH8qdCjgkFiWLEgjt7VKmlrbUMVQqSajHqddoEh3Rc5IkII9AD3qLR3Mc+5hjA3An+VaKLT5ww+I95xno7bn178NZQZYPMJ25Ref6V3P7MHg6bxZq8dxcITp1lMpx6sPT/9VfMcUcY4XL6fv6yfS57HDXCOIxj9q3aCejtufbHw68BR6nZw3Oo2paJ8EBxxjtX0zo+mpYWUUEXAQAEfTrX8/wCe+JuMrSapR5V6n6nh+FcNSVmrt9TFsvCWjacqeXZRqVYDIUc118iMdo5PGc+lfn+M4hxFeXNObuerhcuoqShSS0MhtNtlBWOJFHso4FaTRlVVmJ45PvivFr1armuZ6np1sI1JQ0MkaXbP8rIBnOAP4fetUHOGJ4ZQSPUe1Ko601dS1HXp0lJU3uc9N4c0y6jcTWyNlQDuUfnXTBPm9NwUkEdBWtDEVIyT5mclTLotO61R4V4p+DPhfW49yWEccwyVcf1r3B1yD8uNxA59K+lwvFmNw8VGLPIxnD1CTUqa16nwVqnwRi06eVRAGVWJDAfe+lfa2raXFcQOWYGRFBHrX3/DniXOrJU68ba9z47PeDq0G6lKXu27Hwb/AMKogUf8e+BnsORX1NdR28JVCAGBJbI61+5YerSxCU6eq7n5dLFOlL2Mk+bY+ZYPhTbLIv7j90cdR/Kvos39qiIuRtjOAeODXXUwrcrS2OuGKnGKa3PHP+FaWscAygARcKBjivTNV12zigSKJwbhnwFHvXFiKkIpt7LVjw1OtVqKEfivZHmtn8ObC5njgCKXOCFx0r6E8HaMkccd3MMyTncWavy3O/EGjhb0qUbv1P0bKuCq02niJ69rGJoPwf8AD1tGj3dokjjnLAcH2+le08qFRM46DHevy/NfETGV42g+U+3wnDlKlq1dnN2Hg/RbVAItOiG1cKSo4rrlDFTkndgZx/OvkcRn2JrTVTnZ6iy2jCFox2/ExB4e05UYLaRjK5JwOtdKoKj1rgp5nXm01LUX9m0m22tGcsfC+kyKEuLNGGTgbRiuryrEdPnAAx2r0aWYYmFT2nPZ9jmeV0qkbuPl6nn938PdAuPv2ajByCBXfM2SoLMVwRXdhOIsbQd6ctDmq5BRm1GpbmueEan8NbKNgUhHlk5GQK9rkiWZPnBx0+lfdZZ4l4mlUXtVzJnzOa8DRceeErO/Y8F/4QC03IqQDjHBxzXswxA4RwCMgEiv2Hhzi3D4uK6SPzbNuH6+HnZSvbdnlUPgC2O4tGoHQHHSvYI1iLE5BHBC+lfa0YpWl0PmI0m5csb3e54J4mk8I+AoLe412MiG4lCZXHOemK4H9rFtujaEqZVpNRiDY68sMflXNiZxeHqVnujbhig8TnFPC/Zelz3XSPCXh3WrOK/s4wI7hVdCwHAPStT4ZE/8Irpa5JC2iHPrx0r+b8b4gY2bcqaskf0ZPgrC0cR7OWq7sbH8PdIV8eUAxOSCBya9HUnOSp2kDr2ry/8AiI2Ok7LRIzqcLYSDU0tbnAHwDpY2kRg5YDBA5+leh7WIBB+82AaT8R8wUkkrChwnhnGU7aHlcvgyxSZYlgHGRx1r0VgPtIyxO0jGe9fo3CXEeIxk06r8z4XifJ4YaKjS0sedxeDLFAWaEc5IHr7V3906RwyO2SFUkDuK/YVTVo23PyipjKqhJz0ijx/SJ/BeoajPosN6janAw3Rgfdr5u+HEzv8AHHxOpclFnUKMdMk5xXxHiLxDPKXGNNXv8rH6TwHwlSzDAvH1Oultz7Hk8CWEygKi7GUYIHevQLKVRGisDu3KBn9K/G14k41q2lj7L/U3COqo01tqfPut/BFNSJKXIAYEBMda+kIxhiCpLZ3EmtpeIONUeZHdHgzCyS5no+h8Kav+zJMsM9wNTyIo2cg9+M4Br7U8RBI9Jv2UfL5DEitsF4hY2vWjTtZXPOzfhnC06TUFqkfjrrWiHRb2ayyCYpSAR3rZ8d3X/FSagqMwH2kg/nX75lc5VYqc2fk9TlpRVGD11PAvHMC/b/DmTlpNViXjv8wpPHUhbVvDSqCT/aUYJ9eRmseJKcnl06ilrqj6Xw7w6lm0FFaq2p+3XwmiJ8G6Mc8/Y4yfXGBVj4WDHg7RxzlbCPIH0FfxvWoNyu3onuf0DjJKFWaerPQ2i3vnIyB+VIMAE5Jznr0xWVakrOD69TiSaSad2yvIuwEMwIAJ4qZyh5OO351nHDRnNWewoVJU06s1qfmJ+27ESbRtwO5AAPTFSftslDcW7LyUiJOO/pX754d0ZQptrbsfjHEFCFTFOUm0z8wIYS1ygJySwyfWr1sv71XVsgyEAntX626dlotDwlhJU2+Z+j/Q9p+G9oP7Us1LZXeCR3OD2rpfg9pdzrfifTNJskLTTyLhh/Dz3rzMZiKdOPNJ2SOrKlKtWlSpxdnb7+p+lfwi0q5v3h8hC1vkZPZSO1fWPww8EWvhbQra38vEroGcnqT39a+IzTxAhCKjh4X6b/8AAPpqfCFnKNSV3a+h02l6Dbw20e4AuSDj04711q2pXLK2CAMgV4FTxGxSSXJ+J6FPgrDzp81R2ehzs+kWzMGEfzZwcV0WDkMMBtygj1561lLxExbtyrzOmrwbQnFtr8Dh/wCyoAD+7xwc12E8KEFV6oc5r1cH4l1ZVE5x09f+AfPY3guj7Hkpzs9tu58EfGe1it/iZ4MK8bLpOB2Hc17F8Tvhvf654p0DxBZ/csr2MspHGB1r3+IeNaGNyyVJqzOngTh+WX4qSqSve+6Pc7CR49Es2By3lKaTb9n061h3YdIEBDd+Oa/nbGxvFzT0/M/TIU3eTnv0MWeVyxyx4JLY70pRmcsMAbsA187iaTlZrc9FU5QUal9/0M95PunJ4BIJ6ipivQkAbtwJNdWBw94pLqzjxVaUUpNaGJ9jS5uCpXLMwHNdBpMImujkYCkkEd6/oHwxk4rln3PxDj6vKMlVjHd7GjaaBbwJECuGbBz6VvOdvlruPyN0Pev3OnUbg3HfofnXI68k6isnozIFigHlsij5iPc1baUkFlz94nJ/hNdcYSlq1qzmrUo0k4xd0Z8tnGQEwOG6nufSrZA2hTzggjPvWTiptJbIKdZW5ZPfQyo9NiO/5RjJOfXjk1ojcDu5CnAwe3rSr0G487ZpQa51SavZ6GK+mwKfujOThR0HpWpKgByBzgfjVwppx5ovUc3HWM9jG+yRCNhtAIx17VoMwGAMbyRxUyqJyujPB1f3fJN7nK3OiRoxljTIYgketdFIGEZ3MeQcZ6DFNucpWbB4eg2lC/M/0OWSzQspwAAcEY6Vk61rdto00ccsm5pfuoOpPbisZJQpuTejPSp4dSqRTTbNlraEPgKD0b3PrVG0vZZoY5GUjdgj/aHvXweb8eYTCxvN8z8j77L+D8RiYqCVupZNqh2ebgL5gGB2piMxZgXPUZzXxOJ8YIKXNSpfj/wD1cL4bqpJuvPReX/BNSw0+3dt7DKBxkgdM1taYii3UqASMjjvXA/FbEVE5U4W+f8AwDqqeHOFUklJten/AASdYrdAFAIAxjA5NWo0VzkjgYyB3rb/AIihiorlUF9//AOel4fYdyTUmuxE6QsC4HcnHc0kq/vRGMDGcntiu6l4pV4tJ07/AD/4AS8O6FROpGXK1o9BZ/KMaAE4zgiqssQLghjgYJx0NepgfFDDyqctWFnfv/wDyn4f1FTtCenp/wAEFjX7zY4J59KgR/nwCQnIAPev0jKuIsNilywep8ZmuV16M3F7d/Ql8tJCc5AI4xU0Q25zgk5I9q95TnZKL3PkpR5uact00cTeW4Fwd3QcgnvU96P9JZM5DE4Hp6UUrRi0evimqcYtLfcrwwAEcYXPQ1lz65b28osoyz3RwrKpHH1rmxGMpUot1WkTg8vrVaidJXXY6Wzt4zMhH30fGT2qKzd32nkfLk47Zr4DMOOsJRiuR3+Z9xguCMTUgqLdlvsaUnlK5UsMDgZ6k1XZCAW6ndyT3r5LHeKV5WjT/H/gH1cfDCnKko+0/D/glfdEWXJJAIBA707aN6k8Hg4HbPSvEr+K9eD5XT38/wDgEUfD/CqMVObfL5Em6BVRihAJIBNRLl9o3ABDnB71zVfFjEOVp019/wDwD0KXA9BJyi/wJYnjGRtJI4ye1KibQQfvEkAjt710YXxdrt+9T09f+AKHh1ScVeWr8tgEoVGUgjJ6+tV1CPKUbq3BJ7V7K8XouSU6enr/AMA8ep4S1KkHGnVsvT/gkRndcMvO4EAH+KpZYCSNrggIfl/wr6DBeJGCrSUZq1/M+bx/AGKoU3FO9vkRxTY5PUNyKqmQRqTkfO+CPTFffYfGUq1nTdz5WODeF/d1VdsuLMhOQoALgY9q+Xv2hPiV4o+GGh6dr+g7Gja7CzLIDhVJGT+VdtWjKMHUT2RrkkYV6yoxet/w7H1I27gAcliPrmvNfh14uPi/w3pustIGe8t1c+xxX5XivFbD0Jum6Tb23/4B+jz8M6k586qemn/BO/MLLsCZABLZ/wAKmEkTrnABxjjqK4qXi5QcbTp3fr/wDHHeG03KMefS/YaiSYDcnDdT3q3GN5Bz856E9qdXxcw1N39np6/8ApeGs5pJztZ9v+CM8thk4BbnA9TTzJtYEkk7sZHc19Fw5xtTx8+WEbHzHEPClTCNPmurlYq/mR4zk5JB7VamZSzEEndkHHUV95GS9nZLU+Wp0JTq819NV8zOBlIAOdpJOf6V86eLvizrOlfFTSfBFhsazuoTJMT94ew/z1rmzzH08DReJrbM9fJciq49qjResXq+x9DFJcl34DtwfTHWoo5jcwxPkjIHDds1+XYrxewySSh17/8AAPvsL4YVKcHCVRN+n/BJh8xKFiMJkZ71XRlU7SCWIGMdaheL+HqWag737/8AAOfE+GuIilaenp/wS7DHNuyRwOBjuamUqxUJuBySDWcPFjDzkmo6+pjPw4mkuad/kQrEd2CMtkbie9SW7sS5IJGT1PSv0LJuIVj6SnBW9T4/NMueEq+ylq+6KnlyLIFXBGR9KszXEcKFy21QCW9B719Cnf3LXZ5tGcKiV9Olut/MqSFhgBsgMCSe1V7PVLa5Enk5bJIz2JHavLxuc4XDNOo9TsocN4jETVLlZa2TMVyM5PI9eKeJ5SFBz3yK+IzHxMwdCVoq/bU+4w/AdepFRnKyXkQCFipPAIbBz2GKmDOedvYbj6etfO43xljzPkp/j/wDry/wrhFrmqa9NOn3lXy8BeuNxHNTvubarRk4JIA7D1ryn4wVYyvCl+P/AAD0ZeGlJqUYz0ZWVQ4ZTNk7hkGlZJA64XOFB471VXxjqdaW3n/wDOl4VU4p8tTX0/4Iq2+F3bwSH3A9x7UN5hf7hXocnvXqYTxcpVH+8p2+f/APNxvhyrqUZX/r1JI4zhBz8jYwO1NiM0bKuwiPIJI7exr6/LuPsJinzRdvU+brcD18OnZ3jv6CXX7p1BJORziqV3LKXyf4s43V97g1CrFOEj5SrF0Kqil73YuwTlI2wxG3ge1Z8BZioCjAUAkd66PZptyT2/EmvWjUSUVqi7JJ8zMxPmZAA/xqOPGDkdGAyeuKmUrNNvdEYbDVeRp99BFi3KxySSeSe4pxDIgZgRk5Ge9VGDb916ETSt7Nq8mJEys+1iCQAQB2FVomd3JQ429AO2auNPkV4vcwqTptKD1a39TXJiUA7STuHXsKiVZF8sHJYdz3rOErpu2mxrRhCL1W+vp5EpkhIyFJAOSfU+lVhFcO6x4CqXOT/dHr9a0pxlGKT2RrSqRnLmS17dyeNlUcRAjGcnt6io2hnVOcgbskA9KhJSlytHHGKU007bpo2bIiVS2AASAwHf1qnZyrHiPIO3AB9ale69djvThBKKf9dDaYgHaFy23Iz3poKAM6sMHAAPY0U4ySsu5vOShZS2KE8ihwTn5FwR6VXumVpiPVACD0Ga6d4cq0VzzU06iUld9CC5fcoOeBkZ/u0xypVQv3QQSB3qKSXMlHZnU8POWjfu/eZ8xO9WZvu8ZPfnimzMoGBjvk+lbUXFJqxFNTnLmva2ho2Umdy9m4BFVtPkSQOEXDbsH2z1xXFGlGMrJ6m1VxnJvmu7Fm/Qm3Yqw5yTz0FPuXj8kK4AxnB9a6qFRp69TkxOCbh7RT8vvPmL4jwkxTDkjaST/WtP4kxhoZjk5UMSfbsK7+RuPK/vO3AUXTkoQ1eh+dnjNCtzMm3jzicnv61f8AHjeVNKQpJbJAx0xXn4ui5RcUz38Ri6tKDio7HyzB4ckLNuVlG8AEfrmvoeLQIVVFMY2L9OSK7p4OPKmmfPYXMqlR3nH5HgP9iuqtnn5yAR3+te63Xh9IwZRGBuBA9/eurC0El5nFjM0l7RRnC2vc8NOmEDy+BkjAIr1uXSLdCfNUkDDAgdKiMEm4rc6pZtGNNxcb6O3keR/2OAMBQSSCSOxr1aLToGxj74JAI9Kr2cVK0dzOEa06MX28jypNGd3AB4BIwP1r2KDTYI8KApJyST2+tS4RS5JM2o46cFzTVrrRHjx0Vgw2g8Ek8dea9o/s21IcFAS5BUDpiuikqbdm9OpdbGS5Lta6Wf8AmeG3ehytA2Ac7hgmva73SoPJ2oQD2x71PJSlLlTOetmE6Vk1e/8AWx8zLocziRWiHmDIXHevfhosCkSlQSOgPeuadJRipPU2w+ZzVSVOMT58OgyKcGLPO0EV7p/ZUPmZIAAYHjt710ww6bt1OTF5xFQSmtH2PD7fw7MrAhCGJBJIr3xNLhH8IION30oxGHildal4DPrOy3R4sNHntiu3G99qgY65r1+HTEvfEejWQXK3F0gIA7A189nuPWDwrqtn2HCOBq5pjFTasr773P0+/ZW8EReHPB2mXEqDz7mMSMR6kA17t8NNMjsfDOl26pgLbIPpwMCv40zfMquMxLrVHuf0di6tOK+qRXuwVj01JGAwMdQR71WBCbDyHOcEdq+drySi2kSqMeRQW6/UuiTB69uc1n7gI2fJOQePXHesaWH50mxcihByl0sed/Ev4l2PgfTDc7PMuTkrGT97618b/tEa3Jca4bVpSUg3KuPc81+ucG8CxxS9tVfpofnmbcWyhVaS91DbH9taWHXo7DXfDogspbgqkobqM96+EfHb20lm033XhcYI7nt/9evr848LKCpupRm4u3b/AIJy5Bx86uIWHr09G976/kfvH4X8TWfirSLXVLSTdHNFuCjsOwr5h/ZH1641P4faak8pLQx7ASc4A6V+F4vDToVXQnut2fsuPwdOk421i1dH187ADOSeFIB756VE043EMMsACMd65YySSTPGqzaqRjLVMaWD7gVGCMH8qhkkWJdzHJ4JJHOM9KxcE2uUvFqcklFXPn34j3smj3O5GIWTkE1zX7Q2oNaaOLlCSRnBFftvh1m9SUvZSeh+O8RZNThXdWa1Z4/f+OxFI6tKQA3y89a+Nde8a3A89vOIRWPXtX7tPEKcVLsfI1IRg5Qhuz7g+Hl6fF/iCNzKXhtnxkdPcVT/AGUoBe6Yl++T58u4HH0r8G434mk5PD03r1P2jhzhuGGpQrS1k9T7o0q0ENvGgztCbSD2rWtkxjJ4cHA9Pevw7EXk1VlufX4nFSUlFIcY1GAGPykED1qy8QODkjAwCK1inUptLocrnKpNKb8gM8MYEkzgIM59q4fx3q/9l6FdXKsFKqwB9eK3yjJpVp+z6s4s2xyoRvHXXY4fx3+0F4Y8DT+Tf2s8sUbgM8KkgDPfrXxt4k8S2er/AGiO62uj7lYEDmv3PI/Cym6XtJT19P8Agn5fjuPpwqtKnzej2/A+7vh98XvCfxHhFxoF4PlXLRsRu96/MX9nrXH8M/GCXSbOUpYX8jNsHTJ9Pwr4PjXg+WWzUnrF9T9X4XzWGZ4NypvllHo9fxP2VG141IBO2Q8VVtpg9vBIrEsygkn6d6+NglTfM1r2OyvhYWU2x0inYVHGeATTJpmJZs/Nxwe3NcM5Sk7pjnBNXWuhk3SZQOhyVyWJ61cnVWTccj5SD717OVZpKhWVt0zyM2y2OIoJPRdTPsp1K5YgbCMk9yPSvKbrxClne3EEkjEeYVA9B2r+quHszjiMNFT3Z/PeZZXUo1m4O8b/AHHkP7Uz/b7bRbZXw8t9GAR255NcB+0VrxuH8OpFIAX1GIHHTGR/k17+dUFDK6km/X0Ofw6VR8SQp21fX07n258OIVtvC2lq2CRbr+PA4qt8PWd/C2lEMTugTOfpX8W4qUnVagz+pcylGVWUm7STPSYnUjdjq2OKpRMyjLEBiOg7+tctSzSaepy+zgkpQ+ZbnZEZQBghevr6VXlIeReSCeQPQVVBNqyHUouLUkzImk2zglMbhkD0xVK7uCtxwwPHT1r9a8M4ScnGTPynjmrKDcmrmneSxG2kOM/Ick9CD61j3lwospQDhvKYgfyzX75gYTc4pI/Ic0xUYwlXnG+lreZ8PfCvbcfHLxS5kI3zqCoHoeoqP4KqZfjV4ty24q5IA7HPOPwr8k8bpt4iEX2P3nwpqqfD7aWt9j9H7RVEabEAYAHJ7Uy1AAU7mwUI56H6V+DU4RWqZ9xRnpFPRo044o+A5JB5B96jaTpjOOCT71muZys9ux0VIuWiVn3MzxAkcWm3aHGDauM+hIqn4iLf2LqDkk/6O5IHevocqjy1o2dtTws4Tlh2n95+S/xMhgh8T3ckeOJiSPXB6VhfESbf4g1FS7F/PbJPfmv6hyZKGHS6H4xON6rs9Ujxnxk9qdY8LvGoEx1eAY7feHB9jXM+IJJG8TeGIpN2P7XiBB6EbhXDxbUlHLai8nqe1wBhIf2pCcXr1P37+GEMA8IaQSwDGxjJHfoKq/DXa3hHR2PB+woMHtwOlfydCk5ST3fU/bMfalJy7s9KSO3PcHr9Kph1ClOeSeKMRXUWm1c48OnKOrsmTLHbKxGCBxk+1VWkyrYBHzgg+o4p0JKdRKK2NqPs+WSW76n5rftqJa/a7ZXC7UhIyegrI/bYdzfxAMT+6G0HsR1r9/8AD2nBUVKS1PxriKLlXlTevofnRbC1S9IKfuBztPQUtzGYrNpRg7YiSR61+mwk46dDwatKTSjJb6XPvj9hHwqNf8aanrdxGDb2rBIi3QEck/5Fe5/8E9NDNv4R/tGTBe8mdt3cc1/PfH+dVK2L9hF2S/E/bMoyiGEwCcY3ckrs/Ta0jWJEjPKoBz61ovEGTOSOAT7Gvj4OSuluaqLmvefoNXoSCQA3IPemj5FBB3LjI/xrXDRk1zrV7GEvcjZbdhSDk7sk5OD7VHJOQPMkzhl59a3eHu+W+p2xqKNJTT0W5A8YXcykYIwfrXgfxD+LmreDDJcW/hia4somBeVMHA7nFelS4fxM5+7DTyOCWOoVmoRaT6HtpYBsyqCQcjd614P8Pfjj4Z+I0JSxZo72BgssEh+ZG9+n8q8nE4GrTTU1ax1wjUi2qi07nrd/MJioGMDIYisuWUPICpJJyMDpn1r57EvnXMtD06UIRjq9SORgq7ASOAMCqkzFuRx8pBzXDToyvyyFRnaCu9ew59u0bmJKHH1qGOMM2S24ZwCa6nzU53huiKlaSk00bGlQ7FD9CxBGKtWvybUdeevHpX754aUvaUrz0TZ+Kcc4mLxaiuhfd9wYliCOCfSow6FSWYna4Jz3PFft0bUop9D87h+9bktGr69xC24YcZTbjJ70xlZWUscdeneqgnJ82xyzm/aKNTZrQjQ8FsYAYA+1NZwsYUZ+bOSO1KpTlOeuh0e2cab7rqEhBHy9yAAe9UN+4sNxAxxjtV+ycEm3oYUMQ3NQd32+ZM8mDtPHU4P61V3sCQeRwMnt61DaumkXi6LTdRbt2IyTuUlcMD17Ypjt93DE8nk9q6JSk46GTw0ac4w3638zK1jVYNI0u6vbmQLDaoWZm714D+0X4gn07w/Z6VaORNqt6sR2nkAkdKwlGKoyrtWSR6GWZdUxOKjhYvd6vshnhE3vjHUrzxJf5+xvcEWyE8KgPBH1r1PwVpMVj4X0yGFNoW2AyB3Ir+W+N+L8RiqrhT0gn3P6GynJaWEoqlBarqaGxodoUDCkYJ9K1HUMQFGSOeO2K/MKkpSWvQ+ooNzVo7lW35dSygEkDI9B2NXo0CKWfnnINaU7pKT2OKvBwe+hoLq9lYQZurlI0BILMeFriNV8Pab4hzBqcbSQMQNoJHJr9ByDgrEYqm5Rdos+Lzfi+lTrJTT6bHa2XjDwvc3BtrXWbeScsMqGHNfFPxm+CS+ENKfxj4Dv7i1vbHMjxxsfmx9Sa+0/4hTiIw9rTlzNdLHLgOPMDXqKhVvF3VmfdplimJdJARyAR2r50/Z68eXfjjwfYS30gbUIl2S47FcZ/OvyzMqcsNUdGS1T2P0GdGSs4fC9T6FQtIcgEJkqR6iryQhUwOi8DHUVwwoym1KKMpS96yKkyRojIowwGeO1XvKWQhmwdvOT3r0cvlUw8/aQdpHBWwMKtOVKWxmxOSobGRyPpTHfy5wikkckgd6/ojg3iOWJpqM1rsfh/E2TyoVLp2ieX/EzxPb+C9CutUcgzuCsa9yTwK+e/j34ibUPiR4P8GRsWgDrPKp6Hk4r9DzvMYYHCvFVldLZeZ5HCGQPM8Q1KXLFb6dEeu/DaxvJ7BNV1MFr+9YuxPYMOBXeaNGlrYWkUa/6tFAA78Cv5K4l4rq4utJzenTsf0Pl2X0qFFQoL3UbUBKSNkkIMEY6jHampuJ5PLPyK+Lq1ZNK0T1aFKMm5LoXmwTzkMWByehpkjFVBOTtyee9b0tXroEqqVJQkMkO5mK4ztxgf0rj/EcOq31v5Gk3n2a4OT5o5246Y6V7uXcM18RO1FaHHjs8w9CPJJ2Z1uUyoxnJ5X1z618H/E/Tf2gPAlpceKfD3jR7+1tSXkt5V7e//wCqvdreHWYKnzwhddTw6HGWWuSoyqLmZ94gkN97OMcHuP8A61fNP7Pnxpl+KGik6hEses2LiK4iB+44xmvjcXh3h6nJVVn27H19CMnDlUj6b82Eg4UjtzVSQeZtABG08mvMxFJNpTfocuEq2k4z0JmniO35TgkAEe1VMgkoOTuHHtWNKTUORamuLUOa0XuQ3SoCsij/AJaAHHc0k7KVwASV5Ar7PhriOrQrJxfu32ufIZ/kdKpRbW66ngv7RWh23iL4Y6/bmMMYYvMBHX/PrXpPirTl1bw7rFgQG+02Uq4PQ8V/WmQY+FakozWj0Z+AYqCw1d1oP3ovY+bf2RfEY1XwNDYO582wneLB6gKcc/hXjf7LWpPoXjvxr4SuHKta6mZFU9SGODj8q/mDxJyJ4PMJcuz1R/UGUY/63gac4vdbf5n6TQPGisZMF92AR+lUxIjMGwQCQAfWvziEpwlea0R6FZpRUY79TcS7jxwmG7Z61mq7MoU4HU8UUtHdoVPlb5k9WW5bpFZSEwME4HeqUq5RSD83IP4195wTmUqGKjzbN/cfGcW4KdWhKCLpvoAPuYKpuz6CsC9k8u2uJAcCKJuD9K/qzLqqq000fzxUk6c5RkrI+KotR/t79pXUJSikabZ7AR2yeTWT8EojrPxb8c642X8q/aHee+D/AEr8u8ace4uGEWyR/QPhrhYQwPt3Gzm/yPvyKYGONCgACAAioYFwiIOQOAwr+Xp04e0TT1P0Spy8mq06k8W5ZUk4yr96tEFWHlMSFALZronTco2prVsyjRjH3W2k+hK1wixYQELkms65cqmM5YEkj1r3uH8FUniI0Yaps8jN69OlRbRaW+jWMZQ4HB96888a68vhzw5fazJJtFnbO2D644r+tOHcpVOCpx3P5xzvF81bmS303OO8U+Om13xSng7RciG1Ae7lA+6D/D9a8q/Z/t5tYt9Q8W3kjtNrWoSS5ccgdAB7cV8Nx1x4sHfDYd69WfpnCXBUKKVavrJ2drWt5n1NpItrK3iijQ7IwAAO3vUe5IwQAcZGQPWv52x+cVq9Zyk9z9SoYSMeVx3Rstdop+VGHfrWMhaUqwDAh+AfevJ9tyySe5vTw0pz902o9QBAB7klQe9YNyXWJgCFkdTgjsa7cJGeImoUo63OXFVqdC8pOyR0Casq4XChdpySR+VfKXj/AOH3jzxAJrjR/H95a3O5miSPAVcdAa/QsN4d46rSTjpc+Snxpg4VFGcrH1YNUVvmwMgnBHpX5geA/jf8R/A3xGi+HnxNnM6XEqxwXJ6Mc8Zr5bPeGMXl6Trx0ufU5fmVLFUnKjJNeR+oP29vlfAAORj+tYGnXK39pDMGG14wyk9+K+ZpYhRlz3+RtWqRbSktehvS6jIoG0Z4Ocd6oP0BUHO7gnt6V0KsvZJ3I+rxm3Ff1che4Lum8kgtxntmmyJlAeSASTntX3nC3GFXCVI073R8rnXD9GvTae6IY5nSRVzhWyCPXFREbjvyQGycDoK/p/J8zhiKKmtD8GzLLnhq9pO6v6E/2pkR2C5PYHvVdyFB2knaCeP6V6yp3mkzzk5ql7RStqWGv5pFUF2KBTgHsKqA4QkEAE4HtWr5YP2cdyIKpNqtNf8ABLaTMm11HGOffHTNVg7vHGzsRjqo70pU05WfQvC13Km6qW72L8d67ctITnjg5xVBXDcggbsYx24pypuyJoybk3029C558hIO9htBJOevtVIyCMkrgEDJJ70vZrluOOIjH3Y6mk1yxVVWRgxyOT0rJ8wBsn+Igg+laU6cVrfc1eKjXUozjotjVE7Md6sepAHrVFG2gneflIII7UvZNK/YPrEZLlS9/T5F43U20fOc4PPpVUyLIFKkkEYPtWkbOV33KrVEpJtatW+ZIssrPtMhJYDDZ6e1UTnfwchWBI9M0q9NzTafyOLD49N2lGyLizOp5Y7TgHNU2mJ+oGAfYelVUouUE10OinXgpcq0TJQ+7IwcFuc/XpUeSpJUEHdgA/0rFztPux1sMqcUlLV6GrZuVfABGMAEd6qWkzqepPygn2Nc/sndpsqdOcGpS2tY2Lk7o9hYkseRgVTmmyoYAnaxJropRt78TSFOKpKC73PF/iEqi0mUk7sE59cU7x2PMtrhjkEqeB2ruou0oylux4WM6k3GnsurPzz+IhY3tyPlwhKgj1NWPiKNstw5OQ0mMjqaeKkoRSlqz2adOc4ySlrcsW8SfL0A9B/Wm6fCZPm3HzAoAPrXiLFSirz0OTEYGMKPNFaXv95Q1FyItu7D4IGO1SavBLjdk8EjA6Cu6ji6jfMl7tjwqdGlJpydptnmGo3vlK4BYhODjqfrVbVbfEg2dWyGPrWTxDhqma1aLqtULcr7lFNTKBGjJOTlie1ZS2ku7AQjZyR6+9cksVJtzZ62CU4y5HLpY2hq7giUsxTaOD2rDnhcqAgxjJyfXFczzCUm4vY9WhlqkrzldxOiXWdjo24k7QMGuHkEqqPMZs5GCD69KKeMqpOLE8BTmord9PTqdjda42MM5AwAuD6djXmV7cTI/G4qoyfQmulYipKCkmefiMn5aqTjdfkdv/wke2JyXIC45J6H0rylryQEJklSxDDPSonmcrpsqnlcXB0Xo77npLeIFOCzAMwAJHbPrXlxvZs9TgsQPwrVY5pp9WVSyigny1I7aHq8euxgKWlJIOCR6dq8vWeXg9BjdgdsdazeOlKNl0OpZNSpVGktX2PbvhpMda+Jej224sq3A4/uiqn7NsT3/wAU7GTONjoQD9a/MfEzNZRwfK92frPhXl9OlUqVUtkz91/DKG20awRc7RboAPoKuaRHtsLcA5+QAA9sCv56pydr7H3NaEJ8zas/8zZXHBznd0A7e9M3IcNzkEAkds1lOcX8O1xxpezglHoitduY0dyxxGhJA75qlqUgFnO5Y/IjHPpx0owlB1KqpdL7nnYjGONCatuflR8fdelXxReIshAWVvy9q85+P98X8WX+XKos7ZP41/VHC1NQw8V2PxWphXUqSmlu9T5+8VX0k9lK0jHDksff2qhcKt9F5BJMZYAjsa+hdZTTUtjmoU6ka0Ulqmfpb+x74+8KaT4Kt4NR1uCG6RypjkYDrjFfmZa2S2OPsxZMHGVJAr8gznw+nXryqxlo3c/YKnHtKvThQqwcXBW3/E/oIX4i+CWG7/hJLRnZdx2yDj0AGa/n/F1eROrw306Sqedrt+XWvLl4a14faR51Hi/DKXuyd/8AI/f5vH/hNxg6/akFlAYSLxn1r8DY77UCVI1K4CDJcB2wR+dZf8QvrTSamkjownGeGm3y3Xc/VP8AaM8TaReeGG+wahFK7ZwEYHtX5ktrmom3SJ76Z4QpADsTivpeG+C6uCqOc5XPkuIM1WJm40ehgX8kl3OUJK+ZJggnrzSRlZJ7fjcWulJB781+g4/93Tu+x5WQYeNeqrb3V/kfrx+zVoQ07wVpTpwZIFIJ6mut+AqSnwjpJcY2WyAH8BX8sZrXdSu3UfU/oHGU5NJJWSSR9GxMFjjBz0wR65pkMgC7CM/MMV4tSnGM2mtzy3CcoqV9EWJJGIRzwBkAZ6/WkKk43uDj9a29i0lKxLm5StHSx4J+0BqJsvCM5DYOCMDvxXKftOM//CKbAxUZycd8V+j8CYZyrJ1HsfAcYZkkrxWqPzfm112mbExKkndnqOa4iVnMzgE7fMJJPbPSv6NhTfsbQZ+QqUo1nNa36HWfC3UWHxo0MgsQ82CR254zVL4TIT8XNBcMQfPUc9/avy7xSpRlgb32P27wqqRjOorWsj92dIlJsbXLZBjHXuaNFCrptru6mJQPY4r+f4KMYu+59dzVKsmlqjQMQGOclgQc+mafISdqgkYHNOnHnk0tjVOSUVs/MrSQBgAHPztzjtVwBXjIBO7ack9qjDzTqXSua4yEpxcG7Kx8V/FLV10jxJIEkKBnxuHXGa87/aauxY+Igyv90gEjqPp9a/orgBSdBJ6n4vmtKMZyhJWWp4j8VvEH9q6t4Wt/OIYapGMH+Lkc14rqWuy6j4s8JoZSQdVjIJ7EEcV9hxdinTy2cGtLGfhhhEs7dRxvbY/bb4exH/hF9IQk/wDHsmMfStX4eqD4Z0wg8C3jIJ9hX8gTgnp1Z+3YyrGdacoKzT27nStFsYlVJAUAEd6tsW+6c4yTn0qsNTcU4yd2ctXmvGK+1pbsUCgGGfJPYirBIwTzncOvarhRsk0tEb16KUlCbPP9YmjgulVn5GC2f6VxPxI1ZdLvI8kqDzkHpmv3Hw2w7t7z6n4zxs1UnaC7nU3F2g0+chyGaGQjPbivGP8AhMQLGYmbgxnDE9MD+n0r9voUr1E2+p+UZpTqOg00eXfAuMTfF/xXIMFhdAEj0JPH5Vl/s2XY1L4l+K7mMjBmBJPBzmvxPxnqxeKit7H774WKMMmjOStr+J+lMMXyqCQeOPanwD5V5xk5Ar8TnQUkpR0Z90pxqRstxzR7dmCduSWp4yRycYPT8aU6MuZJs65JuLcjmvFB/wCJPflT1t2AxTfFZVNA1EEYKWsjD06V6uV4VqvG/c+Xzmu44az6H48ePQP+Eg1EHIdbtxk/XmovG0wfXNRYscmVj1+9z0r+qMmpOVCMWfjeKrRqytDbQ8R1eLzfFHhosANuqwZ9wTUuoN5nizwvG3CNqkOD6fN0rzeNqChgZuWl0z3fDmjKOZKLd9dz93PhyjnwppOW4+wx5z/u1d+HY8vwvpCMSQtknI78V/K1GiuWy3P2rF2dRtvZnWeUQULZ42454q0w3Lzj5WAAPcURw8mueREpc8Wktit5fyuVY4Jxz2qZmUYU545yOorooxUpKOzHSSkotvR6WPzE/bNjH9o2vXBjAIPfJ61b/bHDNqcMJbB8sEKe/wBa/duAqLjQve5+JcT3VSpQirO+/wAz82NeTZpjhSRlsA+pqfxKrGzVNoG6VBx655r7rGycKTkeZkXvYmFGW7/I/bT9iOwWy+GWk4X/AFkKY9M8V3H7INikHwq0A9JDYoTgdRgYr+XcS41sTObWre5/Qeat03Gne1kkfWqTKV2FssXxx3qBo/nVl4zgU5xnFNM4qUZRaaZaKnaOfwHaiN2VkVyQC2MntVUbSlZdSKGGk25vcoXzlI1UjcWPU96j1DOYzuzjOcH0r6/hrLVLFJS1sfFcWYv2VB3OU1XTrO/tXhuIVeGYEMCByO/6U3UZ9ilWOCQenev6IwVNUEp7M/Eq1V4hOla7WqZ+ZzWzfDf9oJLWyk8vT9aBGxfusQfw6VqfHmPyfi/4Ku48nfdg7u4z2/OvgvFTLo1sB7eKs0fsHg7xBUqxqYGtqkn52sfftlciaFJckEqDj+dZWisZNNtCckPboCW78V/LcKzcrpaH6ZCCUUluu/maUkhJTnIckEelVHJJAxjY5INVU96V5LRmrklBwS1Na0VXkQbs4cMcUmlAF2ypGMA1OFUWkmrs5ZQakpJWW3/BNdpsNkfdBAb2FZk8ypK5OcZyAO/tX9KeG8EqCifh/HkOSteLu7u5bM53kYICsG57+1ZD3O5mAznjdnuK/XI0uVJNH5rPEXqqMl1OgN0wABAwVz9D6VzT3e3kMQAcgHv7VrCi56LQ6sSuWKktjUlvPMONxHJA96whdxtg8jHAJ9ahJubaRjVkrWT7G4rr+7BOcPk7e9Y6z7BuLYOTkA0tZ2ppjo0VGXM3dGn5hb1IIxn0rLjuc7mjJI4x71tCktGjavNQg3U1Rrbhk5GF64Hc1ni44UEksWPI6U6ScmtTCmkpKD2lb7z48/aVu/s3iTwQN/7r+0oywPTryTVf9raxm/snR/EMAYnS7pGJx0UHOa4M/wALOpllRrc+04DxscNmjouzvt3PsHw0qv4dsCAMfZ1AI+lcb8HPElt4j8GaZcQSBm+yIC3pkV/HOM92XM1rc/oSlFOo+fc7MK6NwvTHXvV7aF6HJzyPX3rx61GTfNF27lOo1NUrblN85UYwCBx6VNJnLEADsM9qpJRepjXpqUOWXX8DKBZJORjJJGT6VbkAIw+CAQQfSv0rhzjpYaEaMo3S6nwmO4GqYhSlSna5i+MoE1bwbq9tjcfsjnHdjjgfhWuIVcGLOVZSCCOD6V+rZH4jYOVROTPh8y4JxKSUVZxa19P8z4L+AHjVvhpc61pXiDRb9Y5NVldHjiYqyk8HvX6BJoOnR4L2cZdiMAoOPfNeTnHDGDzXEOvGaV/67o+ho8dYmhQVCdK/LdXv/wAA8s/4aI8IxozSadqAt1BI/cvkn34r006HpbFnkskxyeVHJrKh4Z0YK6nden/BOWr4kJqNKNHV9eb/AIB5dB+0N4b1CaKG202/2yTBctCw5J+nSvS4tC0vcHjsog6kY2qPl9hW8/C+MtHU/D/gnJDxQjGPs3S6tXv/AMA0bS6F1Cl2gKo8RKhuvSnyMiiKKLG3dj6e1fS8PcFxy+Laldb/ANangcRZ3PGJJLTZNdz8zfiH4qsrP9paK68Qztb6dbWxSORh8uc9K+1PE/w68Ka1ftfalo0M1zJJkyOASOOtdvGmVrMsLChB8qXXc7+DOIHlVOcKq5nO/wAjnbf40fDCO3gV/FMC7cYwRyR2pp+FXgCRTG3hq1JGEYlB+FfktLwlmkm6mj8v+CfT1PFDD0mpezfZ6/8AANCD42fDLII8VW5yCBhh85H41Sj+D3gGONI4/DdqCXIHyDvWq8JpJul7Xz2/4JpX8S6fInCm9fM67Tvin4I167Wx0XX7e4usghIzyMcfrXPaX8PfCmhXi32m6JBFdxgqJEQZA7iump4WSiknPT0/4J4z8QeaNowbfr3+R6MjJnJOcPnnvRawytGchiAcgAe3NfoWTZTRwVFU5y2PlcbWxGLqylBGRr9tb3Wj6lFcKGhe1dWB6HI6Vp6ro51KxltfMdUuAFcr/dr1nxPhcM+aUlYzw3B2JxlqclbzPh79mHwxeaV4u8Z3sKsthday5jH8Jx1x+Nfanhvwrpfhm2Ftp0CogO5iBySep+tfzXx/nNPMcbKtCOh/RmRYVYTA08I9eXqbysdp5O5iASKkGAflAICkketfETim1KWx0cslHmT6/eRA9Av3hyfr6UxwTjBwTgkf3c1yw593sdNWlGEVPqVXLBZCzHJB4Hb1p83yhiDksSAa2hC04yjvc5MTzKhJpdDLLh1fZncFYADvxVXeVdfmPqAPev6z4UqTWFhffQ/mjMKcFiZSa3f5H5tgv4D/AGn3Uhlt9cBBz/EScmtP9qq1bw98QfBXjaJCPLvE3kdznH61zeKeTrGZasTTXvRPvPDDOlUrzwlfbofo9aOJre3YDczhTnsPWsPwNqS6toWm3gO5Z7ZHU+2K/k2NCcJc7Z+xKDjJ2e10dXGN44IOHIzV7yV+UgY3HGRSqc2jivkaU6KU71JXbRRmUgfLyQckGrUqybCmCTsIBPevUy+pKE4t7nFmeCc6MoQepwPi++Nh4b1e5LcxWMhyO3Fed/G/WxpPw98STtIyOlmy5/Div6+4GxLqU4zeyR/NOeZfD6x7CUrNtHiH7LFqxHiHWpCT/aOszE5+oFdz+y3p32XwHYzEYkuneViep3Gv578S8ynjsznKPw9j+jMny+WHwdOhHol/w59VwAsh3KT1GT2qRcL1yFHP1r82qUGqmh3zsoRgtbMm5+bBHAOT3pvGQFz8ynBq6cHGSTepq6biua97mZeXWHUEH5QfqfrWLe3QE5U5+UAE+tfsXh/w97Soq0tj8h474mu1hoqzXU+ef2n9cbTvhnqMaSlJrxliUjtkc4rzL9rvUGl8I6TaqWDTakmQO/Iwa/ouNsPg6le2qR+d5BQeIzKnRk9n957t8B9PWx8C6DGqgf6KrEehOK6X4TQrb+ENGUk/LYxDj/dGa/h/PMwliMTOUluf1BVop2lzWseiSISRjlQDkVYK7ywRiQWIX39K8qdNwtFas2hUunG/u9RseCeMkkjGKspHsVQG5ViQPfHNcssOtG+hz5fW5ql4sxNVk8kJgEjnGe9P1e2kuYsRE4QYGOtfpHALowxKdXRnyPG9KtOhaC1fY537SQ/U7SMYNOfS7jKgqSOOfQg1/StDOsC6STkkfhb4fx1OpdRufA37W2jQ2l/4Q8U22Fu4tTQFwOQQwr3j45/CHxD8Q7PTLTTZkRLW+SWR36gcZI965uKs3y/E5dOMpK/Y+i4DpY3D4tKcLK+57x8PL77f4Y0qdwR/oURIPc4HSrvg3SLjRdIsLCZSDbWqIR6EDmv47nRpyfurRs/feVuacWdr1UDBKsSPoaaMqjhnIwckntmuSVBqScmKVScrwjshm4jCAfJ3qf8AgGCVYOSSO9dlCg5O5jCo3LkmrXOfyAy+YSCJOSO2TUF5JhztwDuJAFf074eSlLDJS3PwHjWUMPiJKoiYyKNrbzjfjp0rEa8AQk8bc5Nfp8aE4LXdnxeHruvT9+KSTNOSdQ6xq+OTnPQcVykuoHI2HLEYJz1966oUGpczWpjHESldLSKOqa6VVAXgZHNcX/aGCFLEY5O6nTotO7D6yqi5YqzT0Oy+0Rkg8DY2RjvXIJeNuVckq5Aye4rRQinyLc1tzxVWUdnp2udh50RThyfkyQa5uO/zlA+ScEEdqw9g07ruZuq0rSj5HRKWc+uOOO2KyY7wYTDk/IScevrWuslzJaHY5ulSbbNcTkYyxw2CcVlLcK7Lhsq0hAx3FQqMrXezMKOPg4SlbV6G1HOQm44JwDj09arIYkXa2SxYnOaiUnzXsOlW9pTSjZyWmpI0iuGCFgcDBPvTdsWc7iXJwDW9moc6epwOrKLdNra9yUydOQSBz70m6NScdSVB9vWopualeGzO2cfaOLk9Y2sO81mjVlb7pJPHOaYrx4JY9D1Hb61jUj7ObkjSVZ1NXsnr8yaGYRMrMx2jOcdzVMsh+QtgZ4PpUNWSclowquajeK1f5GnNdBVXa4Afkj0NY7PGSR06YHYVqoNxTexx88lKMHvqzz3xpMBbzb3zvU8etUfGTRi3kL8sc8ntXdSupJs7sJVhUnKDv5vufDHxIaNJpwX/AIjjPas/4nNGzzBjgMxJb+7TxFGbXNKWp6+AUIJqGxe0icEJjJIOGJ/pVTQ2JiB2kM4APtXyVNSb5UjTMMXUqJxb1jbQ2L9gsZ2cnkADtVe8VxGepxgKR3r1YUrwt0PFrtwlF21fyOAvYUeVuMu/UGlvAwkLggZbBI7msaraiklsduGoRqOzdjDa2cHdgFmGAD29qvMwACuScuTz61lG7kk46HXTwEKc5cur7mS1sAMOwOV5HcmrkuSTGWAGAcjtU/FK72Zk6znFQirNaHPzWyM3lbQyspxkdK1miRRvGTwQB6HsaTdOLUYbsuniOWCTVknueeapZkhwXIUMCMdfqK6S8tlYZkB3I5JI/iz/AIVlKCTTa1NqeLneUlJI8jltGEpUMdoYgE9812U1oO6nIJAA9+lc8uVy95nbha8pVPeV2cHskyCEzlgDjtXXtZMjjC/IeGHpVOCclOOxrCvK7lN7GFFAo3bueFJJ7VtxwFFLHogIXPcVrJWVpblUJucbSfmeq/svQ/8AFz4uoTofXOetXP2W2CfFFd7Dc0ihQewz1r8Y8U5WpRuup+2+GPLDCVqjevT1P3D0twbaBQCV8pQAO5xSaa5NlH6LGMY7dK/JYYWMkubex7CxF03PU0NpVThyNw7dqcwG0jg5bH4GoajL3Ion6vdqUH6/MwNaYGyueoGwnnvVfX5Num3uc58tgB61vlOGtWjF7Nnn5xU5KUpQWysfi18eHLeLNQ3OMiZiAe+DWf8AHJnPjDUGI+QXLgAd8Gv6ZymLdBOK0PxlzqQlyuV1/meO27IzL1GMAY71BbSebMiRhgxcYB9c17M9Yc9x4evKc+72saAXcwBJz157V65oHwY8d6/axahp+kiW0lw24E5JPaud5jTguVtXR6dPLqspXkvv7Hjk0R+QgnIHbvX0dD+z18RV/wBZoMjEYAA/h+tRTzHDctpyR5uLoyc1GMX622PnWIpkbshc4PHWvoJ/2fPiAQvl6E465B7/AEpfX8PGN1JWMf7OlTk3GLseCRS5GACQOQDXsGr/AAt8R+G4Vn1fTHijOCrHp15HatYY6lNrlNvauEbNdjye1tidR04qCCbhAR681t3I+y31lJGBvN0gAb1FcOdNyoTkux6vCUKSx8eWWjZ+znwSjX/hEdMUx7SlugI9T2qP4H3IufCOn55zbpgjsQODX8r4rlq1Ly01P3XM6qVT2cdz3WKIZ+ZiAHGT6in8mNV4z7d+aypK65l0OL2Uo0+RPzHrGmSSchWGQfWm5JG/gnBIzUVqEk733MPbK6mnqfJf7UUoi8M7SSDkEH14qH9qJBJ4ZUgfeyeTX6nwHZzcHufmvF8b1Ywi7vsflzKRI7HdzuLEnuO1QyKPNbe7ERsQSO9fuqXLBX2PgMVRUFGUN77f10Oy+DskR+KehqAN/m5DH61W+CmyX4vaRHztWZdv51+a+I1RLDc9j9d8MqMpym5vQ/dXRW/4ltrvOf3akj14qLSxmxtQxHyqoBP0r8Iw87yumfb0qvJKSXW5oyPt3EkH0FVmBG/JJXIBz1OahTjFczM6WGla0paF7LfIcgZU/magDqI1OcAkgk9uK6MLNRldojETTTTe39I/NP8Aayl/4n8aR8soOSe9ZX7V1yn/AAkrruzJHgZ7kV+/8EOSw6lF2Px3MlF15OTvfp6HxfprmTx34VDYA/tKPhu2Omar6O27x/4VDYwNTjyOxGeSfpXrcdwk8umm7Hu+Gd45jHqtT+gHwR+78N6bGVIY2aE4HA4qTwNhPDWmxq52taJhvUYFfzPThHnT6n6LipSdSUYrRnWkchT/AHevrTspkksScdR2ojSuvNEu1KKnJXZXZuAhwQXPX+tDDJcdcqMEep61tRpc8uXa41W5qbc3o9j4o/aL1iWxvbfazY4zz/OuN/atnlhvoVXOQnGK/dPDuiqcPaWPxbihydfkgzxX/hM3SzmHmk4jJzmvB7vUGis5cuSwUnA9a/XFbnUos+SxNKlOPJJdNT6n/Y1uZL7xj4lui2R9rOM9wMVm/sLu0ut67NyQt0w57ZAr+fPFHEznjVdaH73whgoLJ6cIqyT/AMj9bEYsq4JJLKSPUe9RROm0FCR8gyK/OpaXTWjPVilzqy1JGOeAeBnIpp5JYEnGDn8Ky9jFR53si8RUlFOMdWzk/GRx4c1J+SxtXAx2FHjN/wDim9U6lTaOc+nvXt5BJvEwclpfY+cz9pYZpb6H4z+NJCNc1HKkAzMQR1Wq/jVmGvXrDOftDnA781/UGWcypKM1ofjHtIupywdrfieVSys3jTwmsjYI1SE4P1FIIxJ468I5cFhq0eSe/NeDxw5PL5XfQ+v8LqUY5m3J3XU/ffwBz4W0kg/MLNckd+KPAeV8M6SCSf8ARozkd+Oa/mmlBciUnoftuYStUcoanahFIGSR83PHao/n2hWOSDk+1V9XUVZvQ8mL5pcsd2Mk2HZyR1GT3wOppnmAEIeQDx+NRBpq9tzb2bik5PU/Mz9sZl/tuFsgFkXJHfHao/2v236xGuCCIiSD14r924DkoUIpn43xFhVWnOd/U/PHxIA0VuScCS5jIJ/hJPFJ4nQCGzQO21rpQQO4yK+xzSmlhpqL+RycO0WsdTlF9kf0C/stW/lfC7w/tICvZIOPUAVq/sxoY/hd4cRV/wCXGNjn1wMflX8wYKkpTnJ6NM/ds6rpVkp6+Z9EpHuweQozkfjUN/qENjGC2GkYDA+leh7K71Z5UaqUW0rstyLGqAnACoQffNcTcajPdEMXKpngA9K5qGIpRlyp7lU6U4xtP7zT1q7t4vLDOMkcAd64PXHYKhJKls4PpxX33A1ZuvZI/O+LqKjSunoyjfXvmlsAfLkDP6VzU1wUY5JJwAM9Ca/fLqSUras/H2/ZNzpq9lZep8S/Ht3f4oeBsHB+2gADvyeTVD42XG/4seCVyRvu1BA7H1/Kvl/EdqGUuW5+g+DddrHzquHQ++fD6O+k2IbgGFOe4IHWptBc/wBlWqDAcW4GR2yK/k2NOUlyLS5+818QqkueXmXJIwpBJyTkZ9KkZT0OcK4AJ71NaSguWRhQblJue1tPkaGlpkO31OfQ1NpqssW4jA3nGfcVvgsPonHoY411HJXdorVfqYF/KYbkgsdpYZxXP+INQWG8kUNnaxIz0r+jPDumvYps/A+O4ThVdRPf8Sd7vGXLkAEAY7VxFzqh25zlQx79q/WuRyV0j4inJRStvbU6JtR69eOme+a4f7YXyEbCD5QD1rdYZpXbsmedDGPmcUtUdkl+xAU53cEH0NclDe/6tjIw5B571FDDp+9bVM0ddKTpz2S3O3S+JCoxPzZ59a5WO8yQzMxUMTj096idBR1T1XQxoVJKajLWLf4M7KC5VAiJkZzwO3Nc/He4G4ttxwdvrSnC6533Omv703RjpFrc65LkhnAYknt6Vzwv0QHkjaQQR6mlTUm02hwg6UlCTvpr/mYvxL8Lw+MPCeoaRLzJNbsELDoccVv/ANoeaPLOApIwfXNaUasot32uU8PGMVNXU09/mfEn7O/xDm+Hviq8+G/ia4ZClyfs0j8K47AfSuv+Ofwb/wCEqi/4SHw2xg8SaexdHT+IjoeK/LuK/DqlipfWMNK0u1tD9S4b8UKD/cY2FuWyUu7fyPuc3MN2sdxEQY5FDZHevzy+Ef7Sdx4fubfwT8T1ktdQtHWJLiQYWXHAyfU1+G5nw1isLUbqqyR+rZfUp1o+3pvmi9rH6Bs3AXBG8ng9qx9N1jT9XgjvLG5WSBwCrKQevTpmvEVNqN47bno4nmSs+hfYZIBJBGM/T0pBjcSoyMjI/wAK4qlNwjeRvhqnM7Q3HIgRlG/J3gk9zilBQgEAA5P5mow6Uk5pG8JQnB8+6OqtJI7mIb8eYox9KxrKXypRkE4wDjvXrYbGypK8XY5cRhoVFqldmxNZllO1gBzwPcVd+0QhB84BK8j09q+wy7jbFUHFPVHx2YcGYOtHmfxehy0knkbQnO59pI7mte6tknAK4MignAr9Pybj+nXXsqsde9z8zzLgqpQlKdF3Odik3MHyTk4J9OetDMIvlA+pHav0nCV6c4pw1Phnh6lNNPRtszdRboccDJwKxtf1OGztRcTOUSEHcx6H0rsp04R0auXFSk4wbvZ/mV+SRtOfmwCO9Y/hqe41thelHSx3gKeQH96+XzfinCYSVpO7R72WcI4jFRakrXe7OztLWSQx78lXwMHtW/DEoVOpMSnB96/M8z8S0ptUY69D9FwHh1GKSrSv/wAAr/YYztRFHy8jHerSNhgcnlhwK+VxfGuMqv2kup9JheD8LSouFNa+hDHatGrqOBu5PpWmSsaEs2EHJz3zXz9XGYis+acnqelTwlKnDkhFIrrEI1+b5hxgelcN4o+JfhnwxBcG7uw8sKEssYyRWMMJWxEuWKuzqw9WlBOm2k0dNOy7yFzwCRjvXi/w4+Nnhz4n3d/FoQcLYXTRuXGCW4yMV5OZ4WVBqM1ZmqptpSb91nsCsuVIGd3Ix3oBjznJAVjn8OlcVSVppLY68RQjKlyN6CM28N8gyucj1pzD5dwz1Bz608VaSUlpY5lBOMae9inKMI3oQSSO1EyZR2zyASQP61OFoOUlKL0uTjptUfZrRo4mS5CzMAxyMgAf1rCvbnbcEBsYc5A74r+seEaSlhYRlukfzTxFCaxMpRemvQ+XP2vtJbUfAP8AacKMZ9OnDkjqcdhXqfxask1zwFr1gV3FrFyMjnNfcU8H7ajPDvqeFlebTwOKhiG0/wANDX/Zl8SDxH8OtBn35kFoqtnsQAMD6V4P+xJ4kzomoaBIzC50TVJECnpjIwf8iv414pympg8ZUpW0vof1hTr0q+HjiIuykv8Ahz9EQSwMfIIXketRLIdm1m5cnn0ryHgIzcWtGvxClNTbad7krEYKkknkVXLrJu4wc9fTNZ1KTjJQb+Z0T5nZrsfE/wC1rqzWfgm/sA2172ZI1A/iya5z9rdZLnUfCWkIx23+rQhlHfkV/QXCecRw2VynF2aVj8k/1ZlXzeNWo/dWvqfQ3wL0oWHgXQYCNu2xjGB24rvPAVoLTw5pUC/KVtoxz2OOa/A8xxHta7q9b3P2GjVdacoSenQ7ERrJtYE425x6VcCLkrjJGQR9KxeG5oqctzOvQg2oJ2st+5TmBSN2HAGSD6VX1uZbewlcE48sgY7V6GDyx1q0VFbs8/G5ioYZua1PML/UI1uZlLHdvIH1rirm7dp2yQSzMTntX9VcK5FGhhlFu5/Neb4/2taTa6s+Yv2rr0y6N4bi3/MNWUHHUAkVzf7UUzSWfh6PJO7WIirH13CvpeIpKnldRrqjo8NLLMYqptc+9/hup/4RXSG3EqLSIkj6dKf8ME2+DtHBkJV9PTbj+Hiv4krLnqPWyuf0xGryzdKburnfqcvleAMgAdzUqqNg25BViQK440IqTivvHKUqc1BD2X5VABDbuTSByoG4k7iAPesnSlGTg9jpoUk5uW1heAGI5zkjPc1geIvFnh7wrEt14g1KO3tmwN8h469a2w2DnOzS6nJCbjOSi7rTQ3PKfhjgxgnAHavLD8cvhQHA/wCE1sxvI5Djge/SvSnQqzioNE1KUG218z1IxqyAMoLHqD2B6V5a3xw+FeP+RzsxnoS4+YVFbCVUnJrQVCrT5OWCuz1NE9CSC2CPQdq8sX40/C4quzxjaMP98cY7nmuOlgai/dtWbDEOVlKOiXQ9WCgxse3fPevNY/jN8MmiUr4ysgCSAC44/WumOEm5WmtUYyqcsE299D0raCuSQWJGM1wdn8T/AIf6pPFbWPii0lu3cbIkcbm/ClSy+ro0jSpiIqUlN6In1GQxTP03BuMVX1K5inlZoz8snIJ7ZNf0V4eYdxwyc9z+f+NsTCpiJU3qlqc/fXe3Ozd82SfyrNv9ynKk5AOK/YMPTjypdT8/ji3BXeq7GTNcbJkBc4KnjPesi7coSS5O1gQT9a76VDmjyp6nn1se41buN1oaLXgb75JbJyB6dq5syshBOSZCcZp14Ky5Xqb4LFQquXNGyT+83WvsKXySFIJAPSub+0SHKgA55xn9DW3I5SVth/XIteyStJbHWW+oFed5J3AkmuIW6c5JJHzHg1NbCvnU0y4uSXtD0631MNgOxG0E8V55Hqj4LAsCcgg9qxlg5SfM9wxc6bUVVej6HqkF8jSL1G0gLjvmvObXVJN0bhyDuXjPWs6uHkrLqOdWmvdt7uy73Z6+t6rAlRwhIJPf6VxNvqYYFckgEZI7UoUpRjeRi6sKclBrdnbJc7vm77sgj2rnYr7eCUYjnBAPWuFwTa5dmehLE+zV+q/E6eK4JJDE7SAWBPftWElwM43EDbg475rVU1GV0/mck8XNx5Jxtf8ApI3hMF/dsdqjOMdBWN5u5flckDaAR39qXsnZRR1UMRCFTma+T7mmJWYkE5Bxj3zWZHOXbaTggjJP6VnOjaza1Rs8RTcnJbMvPJuLEjGCAuazpJgSMHhc8nvmmqSdpNW8jWq2ocu9+qOM8TMWhkRySzAk7u3H41V8RnfEfnwWBABPpXoUItystkcVOcqauup8S/FKFMXBZQQWYEDtir/xPiVvOmAO4ZB9/WssQ/dcU9T6LBVpOEWl7r69inpACqhVgEYAAetLpkZKAKMso4PYe1fMUHKyT6l1azm1WS1Tt6mjekYxnJI5x2+tPvVCw8A7mBx71200nFp6M46lNKqpyd+jPNtXYscA45J+tGqIXZQEICsCG9a53eCs/vO+ryNqPS5zQn3EO8x3MwBHpUZtpd0juQFLA+/HWuSrVkpRlcilhXUnyq631Edzv3eYcMBnPfHQVVkNuEiAkLckk+lZwrucmpaWO+WCjGMZT20+ZrROQAAAQp6nsOxFYv2w/LsbDgjp3A6VzK05e6i62KgmoSWn5XL0zjdhlyQGznt71d0/S31DDTbgpJIx15/wrrjFONpl4elTsk1e+3yObeJTIdqZ5HNeiDQLSOM4BIwQSf51rGjG6insU+RpuenkeXzWR/jyuG24A612mpWeCI1U4G5gc9eK0p4d8t5HL9YhzOD2b0PPzZK0U2GyAM5A7+laF1BJEcDczgHCjvWNeN0rbHa6MaMXKc7va3Y2v2frhbL4q2SjAJkGT681x/w+1M6T8StFnLFQ10oJPbnvX5V4lYBVcP7R/ZZ+w+FGIVV1MNLS6P6AtFmSXT7ZskAxKRjvxWP4MvFvNBsJlOfMgU5HTp2r8To0m1zNn0tecKLn0S0sdnGCEBOOTyTUSZYbZGypyVB7VnUbjJSkrJioqE0lt/wTntdG7T7gKpH7tsmtO/RZbdo2yNy4J9PU12YKpCM1JvqefmuGk6VSnB3Vj8QfjrbzDxXqLBim65IDD616r+0T4XmtvEU8nlsVmnYhj0Nf0jkGKVTDxjHY/EaeFqQcot6pnw1ey3Nu8IWVy/2kYY9zXbf2BLqGqadpscZLTXqKoA5JzTzTFKFKVaeiPqMjp1Hi6dG13e5+wf7MdkJvh7ok1wA2YUCsR0yBzXpfwT8MzaH4K0ewOQ0dqnB7HFfzZWlVnXdaT0Z+zZrGNWsuWNkkerDT7Ur8q8EAkmtBlZSxdTwADisJVZtJxlueTLK6c4qD7mKbCBZMCMAsSeOgHpV6UqAjEEMM/N6VderUX7tPQ2WGpwbSWlrHx7+0zFBbeH0McS72YkZ6CuR/at12OK1gtBKC6khh6Yr9L8P6Mrtt3R+WcVVKUK0Ulbp6H5x6sjvf2WcELcqePrSXrMTBMxwyyhjjtX6Xj6fPRkrnJkFeFLFwklrdH7E/AJG/4QzS9p6QKSPWsP8AZm1mG+8G6cu8s0aYY+h7Cv5mzChKFWcWtb7H7zmNaKqRmmfTqeYpBU/KEJINW12YCk4OAR7V59ailG7ep57qOqlJqyIt3ysgBBCjHtTnIUhgOB1I71MYJpRiyKNFO9Tqj5K/ahhaTw0MJ8ysQMd+K6b9oTSbnUvCVyVUs0RLADvxX6b4e1fZYjkktj8p41im1OS0PyJnRImZs5B3cetal9aGCV45EKvvcHP8PtX71Ts5Ox8G8bUjR9+7UdjpP2fbU3PxgtEVS3lYxjquTXov7JXh2a9+JN5qbRN9ntGUFx3r8l8T8Ry8tOLTbZ+2+GdSVLCzxNvdasfsDYKI7G2QgghBkevFWIOYowWOVQAE9xX4zUoyT5HsfRSm5OU47sgJBfGT1yfcUhO0jcoY7uAe1S6HLZLoc0lJRjT7u5JIV8skkhXBXnoKr38sdpYzTyEbEjZjn6VpRwvNUSvp2MsfWp0otte9bfufk5+09qL3fjGdTnzI5gp29sVw3xr1D+1PGupzByUjmYAg9s1/SHCuFjh6MVHW6PyPFyhXTqS91rX7zxDw6v8AxcPwoSOG1GNQD356GpPDqeX8RPCu/Jxfxke+ehpcdTk8DJt+R9D4XKP11qL7+ux+/wB4OOPDumqGwy2sYPp06VF4PCroGmZJJWCPgfSv56wrT1gj9Tx9BQk5OR14UjknJzgk0jM38J5B6eop87Seh5cqS5E07ojkkKsFXJXofSmlxwyDawyB7Y706VOLjzJam65nHXZH54/tXky6jEcE4TOT2rf/AGp9KkkkguVBMIQAn1PvX7fwDXU6Shc/JuI1GNZzabffsfnfdRyG1YqxPykcd/rWrrSi3tZ1CksEIVV6scdBX6thq65HN6JHwWMws6tVcqu3ZH1B+wbZyi6166XJ3XrKSewGK94/Y38CXHhzwdDfXkBW61Bi7Ajpmv5n44xMa+Yt09Uj+kcpnChltLDPST3/AAPuSEADuNwAFKG24GARwAe4r5GpRd1dHZ9adlFDg5+Y84Lrwe2PSlV2IwepBIx2rajh+d3ZNWpBSSvdHIeOX2+GNW3Z+ezcA+/aj4gsP+EV1Rt2C9q447V7fDlBPFwb7nz/ABG19Vajo+5+LvjEmTXbt0wT57AgHqfSpfFceNaviswCrKWII6nPNf1RhZxVFJLU/DMVVk6tpK77+p5fBx8QfB6dGk1VAT9TUlllfiP4PAXI/tOPg/WvjePk3l0m2fVeGE5wzKXV/wDAP308EK3/AAj2lKQfktY1HtxTPBTldA07dkkwpkn6V/NeEw817iP26rVftLyWp15yxGQB1ORTQ4JUHJAXgentVeydtzlnQhzXi9SJ9pDAkggHH4d6fLsIba2cYyPWssPh1UnzN7GPtZKm2j8xf2u0c69Hzw6gc9sdKl/aymH9vxIQdoIAz29c1/QXANNSoJLofjXEFaSqSqT1W5+evi2BlgseS26+jUY75Iq74wIjtYWQ8idCuO/NfV5vCTw0mt2rHFwtGE8fCpDS7XU/f39n6/isvhf4cQsPN/s2MEL647157+z7cPdfD3w5LvYgWMY2/gK/mWnCVJtbs/es+i44hxW2/qfQ0lxcXcrNNIWTcQAe1VbVHOTuJ+bGD3rCtCUpczOejTlGCjHqzYtLdppIlDE4cZq/oqldztnHGSO3rUU4KTTS1OytWnTvCWpxPja4WBljDY2AjIrkvinem3gkuV7PyR3r7/g6py4nmjsfmvGNODo2cdji7nVxsYO+WQ5HNeH3XipSSjSFmIYkehBr+gcPKLcWj8TrzlTjKMlp3PGPiTqK6j8bPBUAcnZcBifTjmuW06R/E/x/0xUYsljbCQnsMnmvjPFXHQo5ZGnL7R+qeEVGcZVa6Vk9Ln6oaHtjsLZRyFjUA+oxxSaZuitoFUfdhUAfhX8z03zxs/kfslWquZSvdPc0ZBnDAkKCQAe5GKfv754Ocg1xU6Cg/Zvr1Jp4pxblTNO0cmEKR94tnHQU2E7I2HHAJB9a68LdRt5mNWuoyl1Vjwnx3deVqTgEjJ4I71zHxGvGj1eUuchWBCjtntX9N+HNNSoKK3P518QKsXUUorZ/cZS37/3iehIbuRXKR3QzkOeAct2Ga/U4RTu7nxmG5VKNNb7nVpdsGXJGS+cD0Nc/DIMKS/JcZ56fWqrW9pyNXscMak5TU1HlSep1kd5u/jOFYEgHpiubjuDF1PykkZz1qpUrRTRFPDOrieWpoui7+p2aXcexWz8o4JPeuQ/tBVjxuIGSMHvWMYWqWaO+UVODcn7y0R2g1FIg4UnPJ/SvPbnVfLXcXJIPH+FXCm5a3DmjGdnG11Znc/2vKA5WYY469q8sk1d9rFpCMHBAPWtKyaaa3LwlOEISlJ3b09D1BdbCKPnyFXJweRXl2jaxa6vq8ekLexpeEqQjHlga87MJU6dp1ZWX5np4bAVqsf3GqPVodaZztMhDOOvt3FaUfgC/ZRIk/wDrMAe2eleK+JcEo83MrHfPh+ulGm4u66niPxH+GfhP4hWUy6laBbsq2yaMfMh9cjFe5n4eaku5fO5DNkH/ABrkxec4CtFKUk12Ly7Kszw9Xnp3jbt1Pzog1D44/AW6MuhXr6t4ShkyIHY70H6/hX3NrngC7S1mnklUhFDHA6+tfG43IslxFRKDtJn3cuI89o0uavFTieffC/8Aa+8E+LTHpuvyHTdcLBXiuDgBsc8nFfOfjz4UeFvEzyGa2EV+jNtniADKfXjrXz+L8JJVF7ShVuuzX63PSy/xFpqShiqfK+rTvv8AI/UfTdWsdSijubSdZIpMFXUjBHHNfjDpHxD+L/wBvonj1ibUvCMU4ykxJZE9uvGOlfFZjwBjsImpxvF9UfX5dxDhMU1UpT12sft0rr8hK4+c5I7Y6ivGvg78VdJ+Knhuw1vTZCTMql0J5Rscg+9fGVcIpNpq1me7TlKnJQe7PblCuXyTu659KZE6EDHUt1Pf61kqSg0n8ghB1ZNp2Q/MgDhXKqQSR9aR3BUDOScgV2ylOKcl0MYOPM5TRwniHV30uQM5zAfmPtXI/Fy8TTtHlu5BxDE7A+uBX6/4aZ1Vc1TnqfkfG+XSmvaU1Z32PKdU8TN4/wDFkHhbTrlvsVk6yXQHRh02nnrXmX7I7PrWueK9elbcbrUpFXPbB4FfS+IHGLoyWFw+ja1Z7PBHC6oUViaiTlLoz700ewj0+ztraMBdgUDPb1NbccSgDjJD9fSv55xVNym5Xd9z9NScY8sWghRmJBIIXHNTB0iDOx5JGAD1rWeGbsn8zljBK0U/MeypCu93xGoyc1yvijVJLTS7uaIkbI2YEdq7suwTrVI0m9Wc+OzGVClKajojzbx98QUtRJZWMg3KdrYP518yaxqMtxqc07uW3SE4PcGv37hTgLDKmqtR3fofhXEfG2JdbkiuVX1ZZ1+7FxpupNNICZLeRiSehxXL6/fRR6ResSAVtpAfbiv0fLsmpUJ3SR8fPH1atRKUm0318zB/Y2aRNW8YScnGtu2PXpgVpfsVWkkjeJrznZNrDsPfpX8w+K8ufMm47I/pnh2aeX0233/Q/QyNd0a/7TcD19qvxxAkBsAKSMe/tX5zUipL2ie3Q9V1J1JWeif6GeRyCHYpgEj+laRiAPAweOnSuqNBxgpyV2cdV1IyjKO3XyMqb5omPYREce9WLqJhA49UGCT09zSwkL1VGCtqGL5Z03Ob3R86a3fbLuRQ7BQ7A471z3iKdl1Ob5gdsxIIPSv624ITWFi3skfzdxJG2IkoPqW7q4jurSe2fLLJEVYH+LiufinWReWIYMCAe+O1fZUIKEvaJnzGJjFxXOtVr6nyv+zlff8ACJfHHxf4aeUpDe3AkRe3XtWBrf8AxSX7RPh7WFISHVp0icnuWPFfjHjHkbSjjOm5++eGGZQxWFdFvbS1z9gIE82GNvvZ4Oe4xUOizC7063kQkhoVOR3wBX881KMoySi9D9O5pcuqWmxa8na27PTt6Y61f2kMgyckHI9frVU6bUW2ty5VruMk7HyV8d/CP9t+JPAl2qE/Z9VBY9iB0r6U1jQLTU5bW4kAJtJiyg+tezTzGSw7ox0ueJhsNOGLeIv30K+i24hsLaMZISNSAe2K34YhCNiAbRGDXhKmnFtdz1qUdPaN6DU53AHGCGB75FTCNGCuWJYknFaU6CmnE6XWi6b5VscJ42ujFp5QMRnJJ9q5v4kXzwvDBgBBgEZ61+peHOTqtXVV7H49xzmipUHHld3+h5JJKrzNIM5CkZPf6VQkuEIODjdkgjv7Gv6Sw1H2cVC10fhdSTryvLdanyv+1C23TvD7hsFdVi6emQMio/2nombw7p06uD5V+hB9TkdaOIKUpZbUjHQ+i4CxFOGbU3LZbn6GfChVfwnozBiVNnEcHtwKzPgrdm98BaDKGGWsIyCO/Ar+G8bTlCTXmf1dicRFzairroeyPgfu+cjHNKu50BIIORgnua45UpxbS3M6MuZ3bvLoRjgqSAFGBn1qQJkHOQoOMnv7VonJ1EktH0MvaNQU57o8Y+KmladqtrBBqNqs0aZwjjIOetaHxK3xwwsGIHev1rw7w0atZqorpdD8u43xzpNuldX3PlKf4b+Dm66BCMORkKM/hXVTXWAQWJbqT/Ov6Nw2SYd2agtfI/EJ5riZuSlOXL01OXi+GvgsspfQ7cu3yoCo4NYniX4mW/g/WNHsbqxaVNTukjDKfuEnv+FYZjlmFoUZV6sVZHr5Rjcdi6yoUW7rzOoi+FXg6TrotsXQ5Pyj5T9a+qPD/h/StV022u1TC3ESvn6ivzvEcX5TBpOH9fcfbYPh3M5TlJ1Wr6W7fifL0Pwm8GLHn+wIMsSCdow1fYEfhHTo1wIsgAEY7Yo/1wyhJT5NP68ipcNZnOn7N1XZeup806H8MPCOj3cd9YaNFHdQuCkkYwUr6ZXw3YxEADBYEgVyPi7K20+Xb+uw58I5jCnyxqOz7/8ADnnYuCqIC5LRtxz1FZfiSZNPvHto2Iw5A96/QMixmHxUeeirI/P86ymvhkoVpXd7/d0JrmXzVQpkHJ4PeuROp70Rg4IMhyDnOa+po0HGTu9GeJHEuUdIap7k1wCwyuDnue3NZ096ZE6kcHkd6uS5mlYmtGEUpydosrTbkDMWIJYHIPQVQu3DbFMhB5Ax2+tdEUlaS22OepXlZU1G7etyKSRMo29gruQcdSazJJcBFJ4wOfr1xWkJxSakduKwzcE4u0ixNKX8oI3O7FYclx1Cvg9M9iadKk5RtH7zl9pB1FCb1S26NmoLwo20kkZyx9q5yfUAgBycICGNTh6SaUXujkw2HhRqupN3k2dZDcLvLeYTjGAa8/bWBCQN/Jwee1ZqLceVa2PVnCLqKq3Z9FY9htr8gj5jgnBI7V5rDr6uAPMwu7JzVypSnF8ysDpOMlJe9zOz7HsMOpqrLyeXBz615YusnG3eTjkY7Vy1sJFxSYoRUZNqN2nr/me0RakhkwxO0kAkdga8ot9eZJtrAlN46H+dKpg5Ja7MxjXlWmqcdFc9jjuVEgIztwcgV5zb6yWYDccHtnoKU6LUeXub1EnNRe8T0r7UnMhYkrxgV58dZMfyqwJB5HrWMsOnBpO5ph6jc3CovmdrLqYQNnJHI5rzG61hyxKygHJPB5NXGHupGrpxg03pa/3G9rN5HOjDOcqVPvmvONS1vaD85yMkn1qlDlio9DaMXUTcdH6/iePfEX5vtAwSoJwD2rF8ZaorJJkbnYkHntU8l9j2qThGmpp2b0/zR02lWbIqhnG3AAB9RVDTLg7f9YSzLj5e3vXxkKTjJpvc3xjcnHl27epq6iIY45PL3O2BkkVm3V18jKDwNwOe4r17unGJ4NaU3WlQjpzaXOI1iYDgcKhI+mar3rCRHYY7kA9xUTV5qK1FluI9lGpKCba01ORvS43YLfX1qS6Us+MnoT06Vy1HyWk0e5h8VdtJ6s5G7EgMbcnDgnHf2rVaxkkkjxkqSPlIrirSckpSVrmuDq+yTbXM9ivplrLcyplfkBA9wfSvV/Cvhl5AJXj2oSCP6isedxlyvbc9ynNuDtorff8A8MWNFsmjhQKgwVAJ9PSvS4dJEaKVT5QFU49qK03O1nZI3wtK6VWTv26HAXULgNGxxwcgd67G70cZViQCGJOe/SteWcmlEjlXPJy2Z45qRcgJggc59DXXalozddpC7yDkdfelS55O8hVkoRlbfovU8juWBKhlZiM5xxmunvdJYlhsJ64AHauiUrPbQ4qcrQUGve7+p4Xfs+maxY6qjEtBcoQD/Dg9K6/XNEluopYthBXLD8K8nNss9vQdOpsz0cjz+pgcZGcVrdfI/YL4BeLYvEXgrSJll3uIkUjuMCvgj9ln4tnwlqcfhbV5tkMs4WNmPH86/nHH5HVwNaVKfw9Gf0TXq0syprF0n6rzP2ARSo+YA4OQT6Viabq8GpWsEsEoaOVFIJ78cVyVIqKTktTyYVpQapyWhflLTMqDK7T19atxgBQOCFIGR3rkqYeL0iWqkY3lbTqeI+P/AIT6R42jMV7HtkZs7l7epr3UQZI6j5q97K80rUH7j1Z89iMtoV73j5nyX4L/AGXPC3h/W4dcmRpry3bMZk52/SvsSJdp3cAbeVNGMz3FYiDhVeh34TBxw1nQ0b6lSyt4tPto4kXCLhQF9attkbiXOBzivG+qNK0j06fLKEpSen6jzMjjcGyAT1rHnZiPv4HBye1YTwsYtKT1MYYp+zUkLfusMUsjZ2xpnA6CvE/in8RLfwto1xGtxm6mVgqA+o616+WcO1a8korQ8fMM3pwi531Phf8AaW1ePXdemtYZiUjdl256c8ivL9e1H+37+4vLgFnllYg+ua/ccmyV4eEYfofkWZ1fauUr2bex5Be2ZhhLAhmjjwB6jHHrXW6jYLJGyx8Lgjnqa9hUk1rszGU5U5KKekdvU+mv2N/iAsklzoMzkNBKSFY9fevkf4b+KZfhz4+tL5sJZXFwBIwOM81+QcbcOTjN4iktOp+78J8Q08XhVQqK1VLQ/eiK5dVViSQ+cYrlfBniLTfEmhWeoWN0kgnjU5B9hXwnslNXWmh01K04S5ZQ2OvZi2NzYIbPHf60jRh2A7sCCK86bu+XodWG5Lc0V7zMTXdLi1rTp7O4G6N1IIP866GK0YAJ/FyfrXRl1SdGTnSd2eNmGUxrw5Z2ufDfiD9lSbWb6S4tL9Y7W4kJbcPuk194xoEbaQTx+VfZx40xkIqFtH1PAw3DVKUlfeJ4F8IvglpXwwtBHYsHlmYtI5HLE9c19A7d5VycAY/H0FfOYypPF1eeo9T6XAYpUYcifurYrquBjOQrDPsPSrDRqo65djjjvWPsOVqPRmaqqXvx2MwuA4DKFCkgH1qK6lFsrSscogJOa55ULyUkPDV3BSUtWjgPin4hi0Dwjql3JIVzbsASeua+P/2kPifDqEh8P2ExaOIsGx0J9K/ReEeFnVqKrVWh8dxDmzdH2FJ7fqfGfiK6/tXWri4U5WSUklu31qtDGr4aUEeo9a/aqODjTiqR+bTx84ybktFY5CVl0rxX4dvlJ/c3yYb2zT/GenXEltDeQEr9imV1I68GvNz/AClV8LKD3PoOBs+WDx6q1FeLeh+8fw51CPUPCuj3CE7jbR5HY8DFeH/sr+NbfxT4C0pVn3T28KxlQemAM5r+apYWVKcoSVnsfu2OpqpVVVLR6p+p9XO3QA/dUkZ6mpSMhGVRtAIIPenDDrmTS1PFhWSqaPVFYAnHXvk/hUyQqSwyVXOSBQ6Nk5Sep0OaglJatnnnjTwLpXjGyNlqCFk/vAcjivT4rZNjk8q2evUDtXpZbja2F96nqeRi8sp11drU+Q9J/ZU8Fw6lFqNzunEUm5EYcH3OTX2RHBGARyFHAx2r2cbxTi50/ZuVkzHKshoYaft3vc5/RdEtNDtI7SxiVIYlAVR0AxVS48T6TBqyaIboHUGC/uxjj3NfNQwkpw9q/kfRYmtzSSik7as6AquVYkBt5BA6cU4LG4V9xLOQSBVRp80OZ6WMaeOaa08vvERkVeGGS4UE1ZVEVH9CRgDtTng+ZJth7jlZaJX+bOB+IMgXwtq2O1qwJPal+IkQfwtqjZIzaucetfScNUWsVFvRHx3FVVrDuLemp+MviZ/N1i+jVjxO+QepwaveJ40TVr5CuT9oIDCv6NwtZuMXFan5K6SajGT93p8jyqz3SfEjwgEyNupJkEeprQ0y2H/Cy/CDDJZ9RQnP16V8px2msHNt9D7vww5pY6Siv6sfvH4NRl8P6WWbJNvGc+pxVvwtADommAZC/ZI8gduK/nTDxc4OUfuP03GTlGs09rm2cMRjAGeSe1WxCigj7y7Tkn6c1LwjirRe5rHEJqy3KLAlgucEgk471qPCny44O3Ix611YfCyl7stLanFOvH2bU3qnsj8tf2ssnxHtTcMYDD19quftXW5PiVlByT8xHoCeK/d+EIOGGU0j8hz7EKNRwgr669D89/GMcz6YJgcLDKjE+vPNdT4l0n7To115ZySCcDsRX19ajOtRdtz5fA4yOEx8HFaN7n65/sp6mL/4XeHpVwf9HVQPXGP8mvGf2F/FMV34Lj0SSU+dp0pRlJ+705r+YczoVKeMqQl0Z/TuPqTqUqeIW0kfobEQWI4C8HApsaHKqv3mIAB7Htmub2Um7NHBh01TcoM7KxAWyPIAbkH1pwULZJnGDFnB7HsK1w9G7SvqjkxlRJpxR5R420cazpeoWqYExDbN3fit64+d2Urn5yee1duHzKWHrKVPdGGIy721KKktbn5qa/4Y8b6XqFzFb6TLIUkYIEzyPf2r9FZrK3d5GMSszAMSRyfavu8N4j1IpRdP8f8AgHydbhPmlL39fQ+H/gD8H9Y07xBd+MfE1oY9Ru5dqo3VEB4Br7i8lIwGRem0kDvXxXEnEFbManPUWi6H3WVYD6vhlhabSX5vzEjGwBU+6pGR9KcWPzFcAbePavmlQUYXS0KnPmST3QqhjIoXO0MG5oiHzZJGSxH0pyjGCilqzoUna0tmacrMqLtOdoOc96qzy/ugCSHDcbe9b0Yqm1dbnFVbcZRS0Wn3nyN8UtTSDXJFIwzNu57/AFryr45a1Ja+JpozIRgnrX9K+HPIsOn2Pwvi/D1eb3Xo7olj1mMYw37skAg9zXha+KSigLLnBJyO2a/R4yVS8Wj4KngfYKMpPU+hE1aNmXa/DMQSOvtXh8HiYkApLgBsnPb3pRppTdjsrUXaM5vTy8z3s6pHIcI5CnB57nvXiS+KQ2whzlSV3H071tCcoLmZy0MG6k7pnsc2qooypICnvXjB8R5ziQnLEDNbRbfvS6nHQqUoS5Xe6bTfY9QuNWJBXefr6V5imt+edonBjGcjvXNVik047pnqYCtFSlfW/U7lrxmj/wBYQWznPeuMW+j24ViWzkg9/TFZzqtzbOrCUlOm017t/nocDpOuTab8ddAZ2IW6lERbJwSOma4D4l3s2heJfD3ia34/s/UI3dx35718V4kYeeJwF6a2/M/QfDXMI08VLDTa128ux+32lzebY2s27OYlJPrxzXnPwr8T23ibwlo97b3CyLJbBmweeg61/LvvrSe6Z+uypSg5J9j1aSXzFAAB44I7VWTG3ByQCRz396qF4N2epnH2coKKMXV4FuLO6hHO+JgeOtaE4LcEYQ8gnvUvFShVVSKvYccLGrB0kt9j4E8Y2UunahdZQqxlBBPevqXxb4A0/wAQAuylZiR8yjjHvX7dwv4iUJRVOutvM/IM74LrKrOVL4n1Pz58a2dvfeHtRinjVg1u5O76V9dv8BtMv4hb38jG1aT5gv8AEOwxX1FbjzAwTqN8ytscWH4KxblzSdn3t2PDP2H9J1bS/D2oTzl1tLm/dog+fu56j+lfavhjwlp3hewisdNgWOCKMKAoxmv5sznFxxWLnXpK0Wfu+XzisLCjLVxW53QnC7SQcYGc+9U4lJBLOQGIH4Vw1+WErM096zk3ptY0d6gDrnBOfSs5nxF82Ttxk+gqcM5NpJFuq407ppNbHz/+0Xq32bwpeooJdrST5V65xwa8w+O/iCLVDf6bBKTiFkA9eOlfs/htlk1UVWSsmfiXG2ZRknJau+vkcl+w7dI2iawNw81NVlyfXNeT/sW+JE0rxj4g8LXUjK0l+8iBu4PXFfF+IWXVIZg3J6M/VuG8bCrl1OpDXSx+swmlx8jYyvBNSLGrIoAJGQA3rXyFSgnBWegQrNNqW7InRpR/rCPmz9KtquABk7e+KtSlKXLE6KFVxbVR7anPavYte6ddWhB2tEw475FdEqZD84GBgnvXVg6lWjJTitTlzCj9YWj03ufBHiPQ76w1K4R42+U4HofcV9q6p4Y0vUWD3VsG2vkYAzX7Jk/iVCFFUpx28/8AgH5pmXAc6s5JStd9v+Cfm/4vhvn0Se1srSSW9vGMUaKCckjpxX6I2/g7RbaRXgtI1IbILAHGfSvWxfixShQcqcLy23/4B5eX+GqdZSqPRO+29vmeLfs4/Dl/BHhOxgvYdt9csZJuxBcg19Hw2y24WNCRuwMDqPev5+zTEVMZXlXfVn7LSr8uHstIxVic4AAX5uSBnqKlP3uOOMH2qPZOm0mrs1w84yipX1IGxhQT0I6etAR/l4wqnGPXNaWlazOv20atPlTsV7tBJEwbAG0kD0xTnV3V0/hGCSe9Oim2otW1ODGYbmg3JbI+WPENlI2pTqBkPKcEe9egatpha8ff1Z2GR35r+neFK/LhlF7n898R074lps8mh01lbAXLAjA9PpXpUOk7C22MHcuAfrX11StZRTZ8jhHBxnFLQ+BP2mNJk06Tw94ogBSfTNRjYuB02sOa+gP2ifCi6r8O9UZELTWiGRQvfHWsc2wVPG4GeGnulofR8J4z6pmNOTdovofUfwk1tNa8G6PdQuGEtojFh64Ga8N/Y8159X+HOmWksgMlgXjYE9CuBX8d4nAOhXlSqa2Z/S9WL5FOn9qx9k7lAyyk8YOKkCsuMZxkg1rTioxcpPQwq39qqSK7KuAFGBvzwPX1q20O3bwfvZNR7JKN3uzrmoSV10epQWN9qr1AU8+oq/5eDECpAY5+lc88LOMbGdScr8qVl0KexEK9vlHXtUl6vkW082D8kZPFdWFpuUlBbnNisVKneo10sfKXxN1rfqssYb5Yh37V5743vmuNavJuCryMDjvjpX9K8AZIqNJSZ+F8XZzKTbluZ63kZHzEgNnP+zXJte7AAMkZP4V+qr3JaH5VWhB1lOorX/U8v/aIU3vgeaVBgwOr/XnrV/4jL/bXhm/0/AJkhbGOhx2rjqUFXo1KW10e9l1V0cXSqtaXtf0Pqj9lTXI9a+F/h2QSbjb2wjOfUYzXzV+wt46SO31bwZeSAXGm3zlUb+6cdq/jPiLKJ4TGzpvvdH9UUakatGNem9GvyP0+ULxuJGOAo7n1pyLujVj3+bFfPU8O3O3Rnfh8VCKcYrW1xCBsaQfdAPB7fSlI3YznPYeldUKMk9duhlTcXDn6o8v+JtjLcaK00CFvJycAcgYr0K4sor2NoZlJRuCD3z1r3+HM5ngqvtWrq54ed5Q8XRcotJ27H57XN5PFOwkJzkjAr6g1f4PaTf3T3MZZC5Jx2PpX7vhPETCyoxU9Gfj9XgjGe15uZW9D87fGtvd+K/HPgzRbNGaVb9ZXKDkKDzmv0T8MfBfw5oOof2tDbeZqO85lk5wPQf8A66+T438QqGIwzw2HjZ97n3nBPDLwlV1ams31PQ/CliLLSLG2UY8uFE2nouB1rpooVt9uH4xjH1r8IlU9/mlsfosWnOKW4/5SVUZJHPHbFNYk5HIJOdwroknJpN2ucNaqqcJNav8ArYhlYCMl2GEUn6Cud8SalHpWlXl1NJgJE2Ce/tXTgsLUnP2cerHiZKFFVIytdbeR8ufELxGi61deW4/dzEDnrg9a+dvFfiaW61e4ckkSXDED0Ga/qzhDL3h8PFNX01P544oqRqYptO6PT4vEe/5Gcg4PA714hFr2SpDsc4G4Hqa+zp0pWuj5fEU5U6aUpe6r7HvUGt+Yz7nZVAJAPavJbfVZSyFHYKDgk9/rXXFc0eaPQ5OZRqRjVj8XX/M9cl1MyYYn5cEk9685bVGCgM2EzggUXVuRBUy+cZqo3dHXy6omVVicA8k9688uL9i0YBYkMCQO2aU5rdIPZXnZvVa2Otn1FWTyjxtc7QOxrzi51WaOT/WYLMAB65qVKXKpRep2KDk3FrVdfJHSXWreUSC5O7pk9K4Ga6e72kOVOSD71rCop+89Gea5+zcoJXffsbEmqNICS4OOcA9q5ZA+5vnIYdAO9aVFyWS6mUcbObUXtsdOurMDHmT5C2CO9csGOY1Vskkk57V3U6LppzbvYnCVJSTdPvr8j0OPV3Z1CM3QnP1rm7MsybTjOB071ySrRimrasuVeU5KTbv1S6J9z0SHUHAz5hGMEHNclFK5H8QJIxntXPrCzkdMJwUpOKul+Z6Hb6wUCDcSSgJJrlfMfywCxJ5AI7VxzvLc6aeHVGtGtLZq9n+R17624ZiGK5yBjt7VxDvN8hbIUv09Pc1NGk5KyIrV1Gopt6vZG7cavIxyJMFc5Ga5aQvIN/zHaxyB3x6VpTrRm7NEuMpVIxm3b71c0NR1J3AOSX249q5y5ZtrMSx4IIHatKVNp83Q48bjKStfo9WefeJ7hiCScbicnP8A+qq3iVGZGByUwRg/rSrOMkuVWR7ycFT9m5N631NW21rytuHA24A2968olv5Y5CWn2K5Iyf1r4airRTktGd2JUr8r+Janqr60ZAEDZDMCSD0z1rzSzvT5iEyHCOucdxXdLEtNRtoTUpwt7d6t9D0SSQy4yuS7gDH9araZMsmcgn5iQfSohUSblF7kqvOrLlirJFh7UtIgIwWyFI6fjW3CYiw2k5ZgCPSsqdRKKutRUcdOVSdJK6WxBo2jrcXcZOSgkBOe1eiaNbpGvygDJOSf0rHG4lN8sVuerltCUpOU1Zqx1umWMVvEFC9wRinxXGwAAk9yQOPxry40m0uc9NxlOVoP5eprrEOicbXOCR+dMt5pGaNyeOc5py5ld2JrVpOKpSfz/QrXFsrBXViBgmllldyxYAIrFTj29K3oVGvQVOunONFfEjnrmwV3c7gc8nPStMoGXczfu2OSB6Vq4JOyepUMdJys1bscZc6XHx1DZBwK6SYpgAYOSSD9O1bwmlC0nuzNSnz8sXeR5de6IjO+UOGO1hjr7V6BLEroAygo7DGO9P2icknsW6aqO8ZWa3X/AAT571DwNMbhb/TQUuoW3K49jX0Lb2qoCJTkMcgY7V5WY4WlXfs6kbpnRSzyrg/fpSfMiX4Z/tC674HWLR/FtrI9lGQvnYOcDt/hWfqvh2yu4j5kYLcYB718jifDqhWfPTk438r/AKn12V+IteatWp81mr62f5H3b4T+OfgXxHDA1rrkKPJglJGAI9e9fmHfeDbOF3e1R45efmQkfljFfOYnw1rxbkpppeX/AAT3KXHGGqS9nGLWuzf/AAD9nrPxRolykbQapC/mHg7xg/rX4oRt4i0w+Xaa7dopIJAkb9Oa43wJXUdXojsw/EmEd5ylqfuCda07jF5Fg5BYMODX4jL4u8XxRsh127Ma7VA8xs8dT1p1eDcRzOV7XHT4iocv93ufsnq/jrwvpKNJea7bptJO1nGW+gzX4qnV9Sv2LX19I0hY4dmJ4P1NdtPgSoklUlv5HDTz2iouVLWzP0r8a/tGeGrGKeLQ7jz7nyyNy/wmvzXXUBC6oAZJBnnsfrXtUOCqFOSlV1d9EfP5hxXOranHS34HpXirxjr3i68kuLmYmN3J5J45rg0urmdkYgpGQeB2+lfZUqFOlFckbI+dlRnUqcvM23r5GpFGkTksytIBgDPTntWaPJgdFMh83bgE+tXGaclZ6GNWrOF+bVpaabEk0IRgdhPmcn2qC7uHMSngbGySO9dFnUi+ZaI741ITgqktzlda0C0vQXmUA9Qe5NaEYuLp9rg4yTzWFbDQacZnFKtVc1OjL3tzs/hF+0H4h+FOpJpWoLJNoSyABsk7Oev/AOquYfR4bhAI4g7gAHI9etfC5pwDh8RJypS5Zeh+h4Hj7EU4RhiqfPH9T9avAHxr8B+NLWG4tNciWd0BMbsAykjp1r8hk8H3NvMtxYXUttcIQwaJiCMd+DXy9fw8rWT5016HVgeLcLUTbTjd+vy6H7yWt5aXCrLFcI6t0Kkc1+LGleMfihoKKNO8bXRWPAUPkgg9c81564IxEFZbHdXzfC1pJKep+2gkVVUOQGZsAk9c1+Py/Gr4uRhPN8XSyAjOAOTx25qlwjikm0tDqwmZUI1Lqa1W5+wLTxLszKoQMeMjjFfjlc/F/wCIl1GqT+KLllkJBHTA9/pRh+CcU20+hyYjMcFCXvSWp+smseLvDujRSSX+rxR7AMAsM/zr8ar/AMTazf5e81OaSTac73JA/CvdwvAVZtJyseFmfEVOnFSp9D7U+L37RNgttc6X4anZ22lS4/i9xXwI7G6YFj8zkgt/d9cV9dlfB9Cik5as+exub1KlNcu0ut9h2r6tc6ldzXV87NJLISWPcn0qKS1LDDSDCgEZGSfevqKGFjCSSVkfO1q05RT6L9CO1dtyEAFVZQPp71JmOMqAcDBCkdq7YycmotHm08QqUr1N1qyS7jS9tpbc4wyYJPf6VH5zFCNwJVQcjvit5Uop8rX/AATnoY2clGo3davta5qfAv4v6j8GPFgtNRZz4fvJwGIzheef/rVzl1aWd9GvnIpByMntXwee8GU8ZJ1E+WR+k5Bx7Uwqjha6509ne1vwP3A8GfEbwx420q21DSNUiYTKCEDDIzjivw+0LU/EXha58zwzr1xbFCCEVjtyOoxXw1XgXFUnfex9bR4kwM5cinZ799ex+/8AHIcglySDkkd89K/HTSPjt8XrWGOGXxhIFON2eo/WuP8A1RxTjzNWZr/bFBy9m5I/Zb7XFbxiSZtq8k5ONv1r8gJ/jN471EkX/iSaReRknGc9jzXdg+BsROLUtDza3E9B1XGEr2P0v8c/FfSfD9hcC2uo5LnYQAp7+pr8vm8VX1+x8+5Yhxg7j+eK+oy/gCEVGUpX12sfO4ziOdW6p6WPS/hR8Sr7xT8dNUm1G9YW6DMYc8AAmvD7bwvY/wBpyapBfzQ3rnJkjcgj24PQ0+JeFqlZRp0NOU9bh7i6lRoyp1Ityk9z9p7fUtOaK3xeR52AAhxzn8a/H0za3Dt8jxPfqfugCZ8D9a+ajwXiHBcx6j4jw0JWhLVn7Ix3ln8jLdRkOx53DmvxsOreMYlIg8WXwRcYzKef1rR8F4qOskVPP8M9HLU/WD4i3MH/AAiuqhZVO63YDBHJr8qrfxt4yjtZbO81y4ntgP8Alq5O4kc/lXpZPwriKNdSmtD5zibNcNVo81OV3ez0OK8Sy/8AE4u3yMGdhj6d6o38s8rtJMEJlkYknOea/WI1W4RptWPgISqSTqWvbT5HEaPK3/C0fCKHDK2oxkH3zSXehzNqdlrFtfNFeWUwaNlHKkdMV8rxjhJ4rCeypvXufZ8F5hSwNd15x5W9Efvb4SkVtB02Pf1tkOT34FfkHpXxk+LmmwRW9p4wmMSIAVI61+T0eGq9OCTWrPu6mOhWlKpz6bn7Tq6KVYkktwD6A9a/H0fH/wCNsCssXiknPADKDk+9RPh3Eyailpc7nXoRabmktD9fhJuUOTjPAJ6D1r8ibT9pH40xTx/aNbikh3gFWXGT3xWseHsVdSUWkceJxeHceVzSZ6N+1O7N4kkIUBlO0g9TzxXhPjHxtq3jW6N7q8oad8HK9zX6rwxNUaap1Fc/MM4o+3nN0mubTX+u5wC2vnQyRStkOCOerZ7mtawg/egDkhs5r6WeJilZK6PnpZdUqv2cmn5dhnwG8czfCX4jGG6kZNH1SYBy33Rk9c561Drfhy31SIsy7Z05DKOQe1fnnEmQPG3qw0kfpnDmcLAUfq2Id4rz2P3C8N65YeINOtb60nV454lcFTwOBX42/Cr4++O/hBeR6ZqKvfeHo3wquTuQY7V+U47KcVSdqqa8z9Ews8PUip4eSa7dT9w3nfyCvmEbVAHoK+QvCv7YPwo1u2iXUtSe0u2UK6S4ypxXBRoVFFQ6HNXi+ZzkrO59SSSoCTtGdoGR1P1r53vv2mPhGqmWLxVHIFPIXtxz610wy6rODSVweKU1roe/l0PXqqnn1r4Q8e/theHLS3lg8Jq0k5G1ZCcFc9/8mvRwXDmJxCta2p4NfNlh4+zbXqe0fGz4zaZ8OdLiWO4DarcyKkcYIySxGM81+LPxb+JXiXxhrdvqc9y8xhu1k2AnHXPFfV0uCamHoOc9ZdjzsHxBGeMjTl8Ol2fvb4N1mTWNAsdRlcl7yINz16V+bngT9tyPQtDsdPvfCUjy2sCJhSDjbjJ5x1r4qOBrxcuaD3Ps1TpzneMla/Q/UxHGQAQB1JNfnXN+3tpB8oL4WnIJIYJgEexrjqZNVlUTinr5FU69OUHCU1pc/Q+SViAysRjnFfn1b/t0aDdhRN4cuI1YYDDt7V2xyus5cjWpyVcRSjFwjZ6dzhP2l76SHxXcMhYDceR6mvFvi38SbXx9rj6nbIyR3LkhT/CT2r914RhOjRSa1PxLOHKdZyvo9EcJHrLRFV8wlmyWCntXGzXIhlKrneYyCR2Fff0sbJq6Vz5WNOdrWV1v59meh22ubcYc/KCDk9a4EXqiLBbA6AjviieIUp2mc9OvKEHeOi69/I9JHiJo2Ub22nJ57Z615gb98+WjkLyMD17VssTptsYYii2lUpaRetuzPWo9fwVYzHaASQOteVw3xTyWbKhX59/eqjWclojz3FSqXivePZ7XWVJw0xAGBkd/WvLkvQrfK7eoBPWtpYpSSSOunCFGEZS3X3XZ7THrMgYMsxEYI49a8rh1d0yolJzjPtWX1hJJW3N6nspU5OLs09fM7bxjFF4i0eWzcjzNpZSe7dsVyC6u67QOWJyB6c1nUoxlGXY15PZwjJOz3XyPaf2VPjwfBWqf8IB4suzHbLLi3kfocnha+XfE2jQazILy1mMOoRHcrp3x71+RcRcAxqz9pRlb5H67kfGyjTjRxK+dz+g7T9UtNStIruCVWWWMMpXuDX4w/CD9qnx58MntdG8U20moaHBhUcZLgf8A1vrX5ljOHcTRrPmj87H2uExWHnBKlJNn7T3aFQJCTlwB9K+Y/C37Wfwq8UWkS3OtJZ3kgBEc/GDjoc15NfAVLJvc6q3MkpU1ZI+j+QRhiSSNxrz6z+K3w/vY1ki8U2ZBBJxIuD79a54YeUUotbms6qp3utT0JADjr+7J/GuMl+JXgOBN0nimyBYbgDIKVHBTk1KzM/ap0nd3OxddxBD4Xkc14hrX7Qvwv0WOQHxDDPNkFUiYEsT2FdSyWpUacEc0MXFp3Wh7aGiU/M54bcAB09K/P/x1+2BBNBJa+FrJx5m4CZjyMdK9zKuFMRXlytWXoeZjc9w9Fp82+59PfFT4o6V4N0qaNbtDqEkT7VBHy1+SHij4i614nvHuNQuTI0jZO7OBmvv8l8OoU6ntaz/A+JzLi5NunS3ex7Be+MJddvprqaZh5r9+vzH1rxTS9TbZlnJKsucdq/VcHhaVP3KaskfnWPdVy5qj1ZXfxJffCn4l6Z41s2ZrB5gJ1XoQTzWxqdlaeI7J7W7U7XUjLdiO9eTxRwzDMadp7n0fDXFUsukqU43p+p+zvwu+IGlePfDWmazpd0s0d1bqxCHOCegr8Xvhl8TPiP8AAbV45tJd7zw00wZrZmPy+46/hgV+G5hwjiMN+7a5l5H7BlWaYXFR9rQnyt9/8z99EXClwPnPCqO9fGHgH9tj4Z+IraKPX7qXT9QQhXSZSMnHr6V5UMC3K6VjurVHGPLJXS3PtBF4GOzAEeleP2/x/wDhNOiyReM7QggfKGyfasauXVG/aIIYpSXInZ2vY9jkhEifPklWxXiV/wDH/wACCMx6XePcybh8sanafqe1TTy6q5XS0ZyYqtBQi5PVPU9Md/J3tIw+UMeegr5P8R/Gi41CdoLaIQxP0UHoO2TX0OG4LxFePPLRHjYziOhRqKK3ev3HqGs/Gzw1pvjDTvBiTCTVr1S3B4T2+tflt8RdX1/RvixoPjWxsp7q2tLlGnWLqV9BXs5/wLLB4ZVqb5r62sRwvxNSxs3GquV69d/M/am2uTPCkrZO/BAHevh3Sv2ytCgsYY7jwRqoljTDcDk18PDJ8RJ86ifUYjExcfde3Q+6TLhVIck5wc/0r4oP7ZXholT/AMIfqfJJBC8D6VUMkqtJ8ooY2FH3X/wx9oyS5VuSOmMdq+Mof2vvDsrxj/hE9TVpWCqXjPHoTz0q5ZNXdRNLRHHLH0qidpXPb/EGoC1vCkjENnI/GvI/Evj/AE7xElveWMTxNKgLBvU1+z8IOpOkqc46n4pxTRg6zq03onqd7J4hMez5gFyMjPWvATrhkm2SO2VIA5r9Cpwg4KTR8fHmliOWDtf+rHqfjCaPW/D+p2TPkXFo6gfUVxmn6g048vfkElcjtW9CSU1OJ04rDtwUY7xe/U8q/Yz8SNpfibxX4Smfi31KQxqT0U9MfjXm2hReI/hP8bdQ8UWfhq8vdAvwARapnHOfavwnxH4alHGfWKKvc/fOE+I6WJyxU6mk49+p+x4k+RW3fexj2zXybbftSW32aNZvh5rBYDIIj618JHLqyilKOp6iqqVS7mfW4kdAoD5z1r5Vj/ag01sKfAWsFux8o81lDLasLTcbnSsTSgkr6n1UjtkbsgYOAe9fLR/aZtNyFvAWslDkA7Bx611wyqtGDfLcFiozldPRn0D4uvmtdHumjkI3fKCO9eU3vjpPFPh+GaGylgW5DOIpRhlzjg19Lwxw/UnXU5x2PlOIM9pQh7Gk7s+XPFEtwt7PL95S5UAnpzU3ihSs0gzliGxu7V/ReWRVOmoy6H4hxCpYlqcXt0PKtR1Z4GcHIJBxjtiuV8RysgZN5OW4x2r054hJpJaHNSy+NSmoz3j+pRvfELMhQn5Wzu3e/pXnNy8zXBG8lEkxj1FUsYrOUtDF4KNOao0V/wAOecW/izVvg/8AEy08aaVCRpVxMq3AUn5l7gj+VegX+h2ev2EtpfRkxPwwI5P0r4TinhSjmcLp2kz7ThrjCeWL6viFdH67/Cj4p6D8RPDGnaxpOoRTeZECyqeVOBkEeor8UPC+p/En4F6yuq+CdQeTSVnBa1kJ2kH25r8QzfgXGYVtpcyP2LLuLsJiIpxkk33P6CfOZm45G0gAdvrX50fDX9unwffm2s/HtnNp18oCu2CUPvmvmI5RUoq1RHqxqKspNrQ/RQzEqTnkPz715PoXxs+GPiGGGXTvF9kxmztVpACPQHNc0qU03Gw51FKmoJWat8z1WV93y5Afrkelcw3i7wxKikeILQjAyfMXofXmp9nJrmktR1FTSXPsdIX2qNuOSFJPpXF3fjrwpZxNNceILUIAOTIuT645rF4aTqRXLqjWu0qcXGV46nWvIECtg7sZ57V4hrXxz8CWKMLTVhcTxkgrEMj8TXRLJatWXurc4MViUmnJ7I9onvY4Yy0hVUUnPtXwH49+P19qyy2mlyG3t5OM5+Zh6Gvpst4ExWI5W1Zeh4WMz7D0JezlJa/kdp8cvipa7H0bT7gNHkqzKe/p/jXwzrGqzalNJK9y5aRyWY1+zcN8A08FFVJO8mfmefcW1K03RirRXZ7ktxqz3c/nHHmMxVSa55NsnHIYMcH0r9HoQVNctj4SEZVJe3qvTXTyR0UN4kbRo6kKcE/XNUIhGQA7k7cghu30qo43TlnuZYjAwk4zpvTc7qx1FleFuDtI47cVhWbKxk2MdqAAf1qZ1IuCstB4KM4OTS5kvlv1O3W7Qk7+SV4H1Nc2JGHljccEDGPelGhK15M9SpOKXPFXTWq9DcuboMW2g5JwMd8ViSzShc+Ydq+vpWfLGSVt2ddOjd80tF0Xr5kElw0jMWPGTx65rPlV2O9ckE5rSnJxik+h4+IwbVZt7XvZFvzTkBVC5w2R6VRjWR8NtO8ZJ+lXGrFvUJYWpUjJw0i7F3zwhYtnaeQB1zVWKNpHUEBkfjIzx7GrlUd7vZGTpyw6jy63/UtBAwSZSRuGeOv0rRitGQRqFJTcAAe30pxrSqNwi9DCs0lCFtPyZYtQyhF6EgnI7ZrctbIsq7QTk8iq548yu9UKNlN2jdO1y3bw+Ym1VyTtDAnqK2IrVY41c4ATBI9a85zUpXR7VLBRopNvrt5D1iKhM4wAN3qKsI3B3uR9R61VJOUrMIwU4ucNIplGYK2ew8sYJ7VbeA7WCNjOAOKyfNBWi/mKdSFSqk0rdDEeIK/7p8g5OefzrTSLdliQAD+f1rWqm48sXqcEqrw8+apG0d9DDnt1Ck7cg53Y7+ma1bqBcPhudoI9qiDfIotm06seaDpq97tnk3iKOPysEAlARnvzT/Ey/wCs+fqDkeldLShFykzoi2lyxj7x4hPCXEW7kFiCT2rf8pHxjOGOWB7CvkZtbo9LAwVJLnlrqZVlbgS4JIJbOfWugggVcYb1BBrFxd02RLMIJSi47fqbGnyGNd6nhWySe1Pt1CxYXBUggj+VOFVyk1sr2OGcfZU3Va5paP18jqdOuPPKhchf4v8Aa4p2k4jABUZUAlvWorU1DSLuz3MO3VpqpJcr7HdWlx5KIVJCqMkHtWP55cMEBy2RxWUowqxtN6mcIVYNNO+p1kd4hYsHO7tg8Vy0V4DgAkc457EVFSnaK5tkdEJqc3b4m7W6+p3cd4AQzEh+MnPWuWivgVLnq2B9B7VUZKMdVqzN1ZJ8yV90diLkNuDHrgDnrXMC6KgA7icHgd6Sgpe8nYrEwjyJX1f3nS/aBICCdqqSMetYC3O5c4xk85qpWaTa1QVmpU0m9Vt8jYc+ZtDAECQ4z2rLS54JLfLvOQPetnTahZI0WKjJc0pWa6GlksG93xgVFHIrJGQSFJOSe/sKqnSi3yN2PJ9vKp78/lYtwQ+ZIisSdoBA9CO5osnfLOM9AQa0rJxajY0wtaU25y2VtGaLwfK2WAboCO1NeVcqFz+8kO4D3rohT0XKEpTcm29G90YN5aozqq5ILHHsfetiVTnjnpg46YqkoW5okyxE4zipann99pMcnmsoGduBnPHrXXOiKWLHJdskd2xXn08NGUVFPdmlfFqc3NLle3zPKJdHwCgBDEg59K9Cu7RMLtUKcknHepqpcto7nrKpKlGNOpqur/zPJJtNA3biQrAA+x9a9En05HQ5AI4J989c1hQpqT1IxHtIpVIr3b/eeWNbQwLuRWJydwPfFddc6SrlWHy7WOT61fsZRev4ixU1XgnblknozlPNlkARARzkAdq6WPTPmVo+mQD7nvWHI5NNPQ7qlR03Go9JP9Dn0hk85XfJUEECuvGn/IVUAvwTntTppS0sQ6kXW5ou73+85mRF2/MnJwBmuiSweZ92BjBBJ74pxpqN5SZwUcVUm5JR0XnvcxrG0RAN6HLZOT0PpXcW2kfLFzkSDOR3qKik1ypnqYblUk5qysYtogVgFAHcg966ZNOVQxVergn3pcqs29Dojj70lCitDI8rPz8ABiMeua1pYUQg4JdegNVRpqVOzZz0nVU7r4fMwp4H4K8bj0HcVpfZprjliVQMSCOprWFN8rUlZnNQuq/NeyOWmtgMDoFIxiuwWwjADMuWDHIPb6VXKoqzW5thsJebUZ3d9VY85e3umk+RBs+7k9hXpH9nxshZUBI7fhWruoJJHmYubdTnUdI6I8pk0i4JUyyEkuM47j0NekvpLMGPlkEkgn8ODTjCUklc7KdRRpuVr7HmQ0+52/KpxvIJz09K9H/s9YlAC9ySKxqcrle2qNqUFVilPRnmMsFygLBmAOPmz0rsbm3Vlxn5gcYPYUJQT5Y7nHOlU5nG95Pc82uIbkvkZA2gDnqPWuzntkEobGTtIPHpWuHgpNpbGk4U5SipvVdzhPJuCm2MMysVIGTXbLZoiHk4YcDHfNdMXebTRzxUHJpP3dE/Q4cR3WdhRgQcAg967Sa1yrKqk7mBz3NKjJp3iTiqMFTdOlsvvscTCs8YYHcZmfIBrrV05UJLbxuGcDt7CsJVHU1fQmnCtTpKpyprVaHMG5vE5Rj8rA5PT2FdK1oiHncUbrgU5RfK1FanRGdSM4qor3OcF5qGIkAPmsxZgTWkyrmST5skgEDsPaiNRt81tTLmUJtrdF60v5IpIxPK4JAJHY1nGFQyyMWJ3KOTWD5otsiftZVYx72a8vM9CtdYVwMAlicBj3rhRdMpTDsFDdO4966KUbrV6nX7aTqNt3Xfb1PUor9HKs3Drz9fWvNUv5uGyy/OME9WI/pVcrnHlgzKc4QaqqO23mentekghMFBGQMdSa4aHUWZQASG4BI71apqUbNa/oZ0Kc5SUqm76djp1kAEivIWYnOPTPasGKdpZSuSFHJY1y1U5pS6bHpxlH2qw9ttb9PIW4clpFIYtgHk9KdcDdErj76A4PrXj06bc+VOx6eImvZ2irtLUhWTO35TsBHB79KgSRhKTkgHIBHasaUpte8tDTnVRqT2tovM3rZFxG64wxwQe1R20pxs3YPoRxjFEYtT01PQrTmqKS0b/AvnCgDdkDJOe9QeamfvAsvHHf1raFLW8Xozw6qcnGMnqIEVyCzg8Er7UqlCAxLBF6L79zW821qlp0NIKVNNvVJFQqwO5iQB0BqZQJOSDt6EHvmlCcYpprU6NPZqTW5tacwbhiQcnBqvabIz8xO1m3c9h6CoaafNB+pz0Vz1X7VWa/FF+e6LKwUkOcH8PrWReXKrG5IIQDkDt6ZrSnKTenfQWIo0qkedPW6v5nD61dCWYI6nPIBHcViX1yHuvM8wkbwQaxxvIm4vfsa4elzTU1pv1KGoG2ghBVMvlmHA46Vh61qAdSkZBDHBANeZh8JGppKOhpUxU8O0oVL76GM2olJUeMlSuCqjt71zzzx+dsGcgAE+gr0lgqUdLWRz0cdiZxTqS11Og/tSSSJjv4cnJrAS6QA4BK5GA3f1rsptK1tjyK7lUjKM36GoricowOdrggn+KqUV8oZN4HDEA9/xrStK6bR3YWMuSMep0KNGqq2RjpkjpWNJeoYnKyAnbkA9TiuNxcoaqw6MJ0ZOXNdvYs/bP3ibMHc5yfXHr/SsNb6IlBuABcAn14rGFk72OqpRlKHvO3c6s3WVj7ANk+9ZbX0Pk8Sj7oGR3zV024uyV7nDicvTmmno0baXLOqybsYb5SO1c5FfgOAMlSuB/s4r043bd2ZPDqlOMWtH07HRSzg5cSEh1AI9+1ZH2gHEqkjBAye1dNGKb5W7I82phVCpzqVrXLrXDgqnIYN0FVElJzIGO48DHb3Fdsk4pS3Zg2qs3FO0bfiW4pRs37iJDgsfUCqJ+UkBvmznP+NRG795iUZ8vso63aNeOd9mHl5ckjHf0rKMzrkDlchW9q1dZppo6Z0lTjKEV73fsb6Xbg5kYqVx+PtWOkp+YEAoSG59q6PbKVpP5nlQpJpu234m8L0yEgErnBJ/vGstXY5KMApUjHoT3rJzalzLobOKesl6G19rlYkFyM4BJ71hOVQp1Dkkk88jNSk1TfKtTerhJOKlJ+7v6G2t2FI35zyMjoRWPC5bDOuduQF9OetZU5Sk2qi1MaEaV1CL1VtTtrUQyMEkx5bMcZGcZ6c1W07dsO2RgqAMR656VbS5brc2rSduVay6/LqjP8QQ6cAqiNA4IACjp9azNduWMvyxgsoGfeuWWAw/LyzitzXBZvia0moSaSRiw2kduBJBPIpXOAjED+dRlykTKgIIyQK4K2UUE9II9XD53iW7KVy4jTB08y6kLAgjcxOf171liUsyrvxgbjT/ALKpJt8qsZzzive8pu3U6CO+8zGMgkkBj2rJgD7cZIwS27tXU8LSp2jGNkedTzOp7GTcm3fqaTTvIGcO3zgAsO+KRLb5UUHL4JB7mu+lyxjePQ8mtTlK/tNbgJWG9ckv0JHao5IJGZtkgAyACvXjrUwp83vtnXh67cFTgrtWfodRo9zIIyV6MRk+nSodLikWIDDHJBz6VzzTbSWh3ukqidWSu0drb3/EZZvl5+YdzWQgcqAGJ+c4Iroo125WZxYrALkcoPla/M6u2ulmcLIgKF8YYDFZtm2Cuc8nGKqpUTja1jswNOrJKUld6anc6doui3DLLcafG7B9wDKMEd/zqnpt0YtgyQ+4DB7ewrhr0KU3ZRTR3wnVhLWTT6HpWmeHdDgQSQ6fCgUZJCjp3qjbanKIgWkYruwCO3tUVMBR5UopGdLE4pfvK0r7o6ozxWcYjjTbHgfKP4vSuVur/e3LEEELkdcV2YaEGklBXOGpOpKSipNoW+1ecMSJDtBOc9/SuWuC9ySQScEgg5r1FGMYOSOKNSfM6Sjf8zVXWmmdcuC2/BPqPauTt42jlDs7Apxz3rlnKEoa7s6qlJJ3S1/M9JtJredTnHzsVxjkZ71n6N5EpgaWbAV8HPfNZwhFqzscrVWE1KO0tN9l1OsW3t0CExAlMc4HSldrNCfLuiUDdD0+hrso4aKlZrVmOPquVNzpyej/ACLkQt1VS0WRnaAw6VjnUI1I/eAkbjtBqnhoyfLJbnnrG1IQXsndr9Tqhcgx7FJULjn0rnor0EFhgquCQPeq+rpT91bGtCrOUHNy6q5vmRmkUjBbcMkd6LPLMrZBDPkD0rRTaglIuWHWIlzwWp6D4fRC0WRuBfII7VLoIQTR4J3bwzVxwlCem2h3Ymc6UOVa3PcdMtIpbWL/AGTuGO/FN0mVRHFjIG7aD2461lyOEby1R5MsUudUZPVm4um2yneqK3Tg9z6VfiVcnMoJDg49PanWpQ5U7bmWEoNzlGUtEtGV7bTrVX8woRnAwPbtWnAiAq3mrtPJHpWfsqaik1oa5dGcZqMZba3GmwtchDECu04XHTPap7qVEgQK+W3EkjtUrAwbcV6nVh61Xn5oN8u1v1OB14pawyhWOFU8D2rJ8TXBcP8AOVXJAJ7V20KMVJKxGInUipRg7PT53PC/E85M7qXJHUEds9qoa+olLnzBnp9M/wCNev7VSSi1qcTw9SLSkrrozxXXU81iqZK5yT647VvXdkJC+5M/KQR6+lTLlp25VdmlVySvF2cfxPK1sS8mcElSSAe9d1/ZeHUhCCGBPv7VVV83umcVNwi+a8r3MmysNqhpCMFSB9TW+sYjVQxAJXIA7VmqMpXjfREUatNN3e/V/kcZqdgJo8SKdh4U9cV1LW0kg2sxMXUp6Vq7NpJaHFRwE5R5lPZ7Hlk3hTTrxgJ7KNhkg8Dn0r0cWoj5RRhuAa43llKpryo9/EY+vShZSafkeY/8K70RFLx2xXe+cKSMn0HPH4V6XKjFV3KOW/l3rj/sLDzdqkFY7YZxjKFNVIVHd/0zhI9AgtQPLmn74Jkbg44712FxbOzEgEZIyT3NcsuHMFPSMEVW4mzBRlUhNpKxy8disQCfMzb8rvYkL+ZNbM9vLIgYxjDfLkdQfatqOQYaEk1BXRw187xztOpVbT1M6W/uNoUSHcGxheg7c06exlG8MSQygYr2KeBoQStFJs4VmuKrxbbbiu7ObuGuJGcGQl8nP/1qtz2z7g7Iwb5SdvQ13ScJLlWnoeNh6c4V1VlHvq+xglWJb1fAyP1rTltHDDbkhgRg9vWoopp3W6HWr1HOyk2pO/3FHLMAwfLAEEdyTU9vbyZLOCVyP8/hSqO8rvfsd1JOzjZly3TChsbtzgEfzra06yDlVBYNKwyQKOSMm7k4nEVJ0k6K1i1p37lq2gYKAoI3KAQO3rXV2WmuqhWIZece1cEafInd3Z1UasU0mrXMZYXXbuQ/LggjtXXCwdRtKlhgjI+la80mlc7J0W7OW+yOQFtLJvOPQgGu3bT3HzYLFsAAdq5eZySdup01E0owb5tfuOBkgZThEIAYA+2e9duNLRXYtGQrEEkd/rWsla0rGU53lNRtZ6/ccRb23zD5MHIBPr6Cuzj0siU5yNpB6dcd63lTi17z3PLw1dxi3J9TAtLWRm2hQCGPHpntmu3g00R7XYDazYIHf3rGpUglyp6noRwknH2q1cvwRnW1iflyvAwQDXTrAUAwgwBlTUxouFpPc5quLUPchH1K1tb+TCAHAGOCeo9a05Aot1Zs/MePYirjKVSShL1HVrypUVVtvdX/ACM+QL5ap1znn196fMA+QSQyAAEdDWjSjNS6m9RTqx+rxVtLv5lXcy8ODySMGlEbNzwFIJwfX1rOdKz5m/I5q9SnBxp9Oo0Fm+feQBkEDvSiMIu1AQxDHI7VlZppJaHTGlOrN62VtP8AMjlcKoj5ATHWs+7mwHYkkAk59K7oXUk3uzzK9aSmqUl7qKd5dtsI3MMAnI6iufvrkjaEyQxIOP4c+tayimrpHbCcqUoxVrN6HE+IrsSCRuSoJ+UdT61l6+mFdcnOCc/TtWFaShFJbM6I0p0ozp7t6mFBA33iSTgH6V6H/ZCkLkADJPTkivlaMXLVPQ3ni5Rp3qRu+hx9vYOzgK+fnAAx09q9JttFDBeoXCke9Q4Xik2ciqpTUX8kcnBayooGCSzEMcdK9Ft9IXLIGGd+TjNdU6UYxTWz/M5/bzrTdKGjjv52OctLZk2AhjuTIUdB9a9Ps9ERE3lsOSCcdxXn1YxclBn0uExDhTbvc8+EMkYyqN93G30969Dk0xW4K878FexrSVJptKJhiMRFNSUt/wAf+GPPHhkKxnac8Ake/rXavpiDO05bIJFRTw81Lm6Gf12GInGnCNrdTjFV40PJzuyM966M2GJCWBOCMEjpVPCOS5pmOJxTdRwgtXuYCTvKwYsQyAjj07VrJCIwA4xnIB7mt50o0rQjrcxw8uepzzdm7WKUbyYyGPzHLGrYRA47qZAcitIU0nzLodMcVOUoxlsm7skj+4gOcMwyD2oUhsnk7HJPrxWOIpzhLR2TOiVKjVaqra+xowM2FR3JBkHA7U6FlUrxx14rH2aTbbOqrTpTlyyWhuW3mEk87VJAPpUsEqlVKY5VR+JrSFOU0mtjmxfsvZuD7fcOuwI13nIEXUf1qK6lV1+6wKkkkdMeldkabaStozjpS9xKL+dupCrmbDZJ5OQf4uKo28q+W4Vj0OOeo71lKha0U9Caimnee46YbDjPPHJ7U5to2lieCSvvUTmqaSWpthcPGUnK5HtVwpJOwZIA7+1SxSqiqF2tyRzUzUnK0VuZzpKpSU3LW/3lWSEODgEq8ff1FXJJ08wZUhA2cnuT3q6mGSs4nZhalZJqWy6nPRWUjOVILBgTg9q6GNlZ1UYEm4EMO4qasXUkk18zvo2jByT5upjRaY4w+MDAJA711CqoAH3duOT2zWVTBLmtHoc/19zUYt7Jv/gHOTWgjiDrGNwG3610t2yeXtRVIxj61lCjeXvLciriL0lClKz/AMzkLe3LMEYbVxgZxzmtdfKyQxyQeM9jUPBqMuRPU2ljopOdrW7dSVLcKFVAxfJBAq9bAKvmZyBnk1E6KjJwRvSqvExjOG0SstsxUgnl2IAPbNWndXjWQH7jDk966vqza5epnPMk5RlJWTZnPaAZP3gMDnvx1q2+xgpBJxkH2Ncs8FKTST1Wp3xxMqdVyi/dM1LYltqEZAHy+9a1uqDkAg9QfSu10HKScd2YPFznFTho107le3snDBjy24DP9K2ICqjO4kBxyexFGIfIkrEYfEV5VOVLluQR2WSH8sAbiSKvtNyETJQbifTPetKMHOLlJ6HNKonLkpqz6mW+nSEAgHAbnPetESP1VgF5xn6VhWgqbS7nXTlCVPlW6/Q5m40ySbdjK8kkjuK6KSYKr4OCfTtUQoylLtYxq12oKpSWnU8/utKO0FSAwxg/3vY11Mx8zcCcsSSD6V1UsNyp31ZX9oRnNRjHW25wR09UYK6AOM4J9+1desGZRhh8rZOe/pUxpNu8dzKviowj7NLXucW2myMz5jJUMM47+g/ya7gwyLnkFWBIHrXTHDqUUuvc8qeKdOs2tE19554dOl6iPaQhxn+tegSWrOQQoOVIYflUvCPlTOqjWjSl7VtvbQ4AaTKMnBBwCcduK72FSpYMoIBABPaphSfNZ6o9GtWgk3J2vseftpEhX5unUZHWvSDEiRg5DOD3HShU/aVEloeVUxMqDVVLU8tOhMdwCYHB+ma9KeIMrscAscHHX6URpNSstzrwOGjUTm9XueRyaQbYHqQWAIA616VJbocjZ1UkA+1E6LlFNo3wsrU50pu99n2PLzpxVFKxnJAOT/D7V6A0cbIV2AMQcn0rOWEvJXWhhSx0ZQ5H00+Z5w2nSuVG0kZwoHY13siKpGVHIAyO9bU8LJ69C1yRpqFR67o4VLVkbb5RBzkkeldtDEF+bAXAOcdselZ1MG5zPWjWTS5VpbQ5+1sJvMjncERggqv09a6hJQoVShIAwT6itIYdxm4z26HDTdRRU4/E9Cu9hG8O9IgQy/MD3NbJVSu5T8gU4X1rwvqbTlFq76HbXn7SKfNy9Lb3OMubSIPgHDjoF6V0UsON7KM4AwB71xKi4xWup7NNQjC8H6nLLbO7rkkqr549K6HyET52JxwCPSroYbmjywWpGIrRglOb0ZjrHg4wCRkEj3rP1S5kt53VSdjEEnI4r2cNlsqsFKDW54KzNUZ2lHRfky5JPGuwE4yM4FcJeXzmY7mbGAeOhrqqcPySUk7FSz6E5KDW39I7Fb2OE7HYcycMD2rzuW7YAlpCN5JBFXS4ebiuaRks+p0U6ijd3Z6Wur22WDOwUYxnv615GNVcF4wwKlgAD0PqK1oZCuazkRWzzmjpDXc7bXNdhEbxxKd5UnIPtXmFzqILNyccdO1bxymnTV07nk1M5rSXtFCwzUdTlkLKgIHHJ/nWLLMjEo4JXI/DmsoYOm581j0Y4ivVhFS2Mu43ysrLMSSCSR0JFXR5TbgmAwBHHanPDR5tNjCVeo5pS3X3MwCkj7c5+Ukkn+L2rfhtdw24O1TyR396z/s+MnzMirjnF8ltXqznBHIMjec44IPA5rqUsVDKVjGDkDPeqnhlpyozVRX9nLfc4wxTMzFnIUDoO9d8uiuzmQgZYgj2IFSsEm7paHoU1Za7v8Dze5E0RVN7BtuR6EH1rvpdFdpCzrjccqB3p1MGnKzCDnhqPtIx5te55qsbt5eSeWw2M8Y716X/AMI5hiQDtPII7cVz/Vml5ESzOU5J1Fq+hwux2R8sxVcEE9TXcy6JJGjER4DqME9TXU6NopRB4tKClJ2u7I4aK4mjMZaQgbvzrfl0sqjhj8wzgkdK57Rs7rc1oxUp3U9UVItTbYUyTuYgn1pV0qVedpKuuRj9a5Y4dKN2hyqxjO61Zu286yRZJOcAgHv7Vp6Tp0rQqMAncAc/Sq5VdRZli7OV2V40kZcjG58EY7fWuut9IcrgjAGSo7/St1DmhzI5kpwiot6a3OPEXl7FySXY5Ydq7D+y2CbSmTjAz/Opcb6JXZUMwd/ZxZyqqRtYnjP58V1H9muChKDdkjOOgrSFOTfs2GKlaMXFe8mYMcblgQGGeua7CDSSWB3YBwD7+laQpNOy6GeJxilFuq99PmcfLFIv3CGJcAZrvToj44GAxIGelVCpzPQ4cNyQbk7tHHafaszKNxDcgV6bpvh1yEYjBA7dyPSsXFSneSszaUofBSVupn2dm0dq+AzLggnu30r0hdGcWOAuGGMn0rspwUKlpLQ5OeqqalB3tv8AM8EvdNeSVywIPUj2PpXsf/COrIA5BIOQT6VtiaUZO6+4KMpRg4t6PqeJPpcilZE/1aAbQO+K9mk8OjPCkhVGMDpXCqEElJO+prQnNOMWvdtueILpUifMEGXcfKe2a9kGhp+6HkjjJBHasHQtJtfcdleooqPKk79X0PL7fSmdFXGDxkAdc9a9tsdAtwB8pAcgA+uOxrSNBQnyrU2rTqSheyvoeZ2+jOzIEQ7kAXH94elfQmmeH4AqMYlMy8gDsO9a0HGK5WefiKNWcuenKy66djxIeFGkBd4/lA3AHvX0Y+iIY2+QKACNp7D1rmjJcya1R6uGiknUvbSx8/QaLHHGgTGGPQ/w17ImgRtvyoPzYII6+mK0nGKejM6GDU5qpfZo8ji0zawVieHyuK9afRl3opUjsSO/1rDljy6bnp4lzrNKa93oeXxaeVfKk5DYBr02LRflIwBnjJ96uc00m1ocdPDzbSStZqxxVtavEcsODyvsa7dNH2YPIUZxUuhdWjoOdSp7SSTuznImbaBvJVSQ2K6NdJcMAkhGCTg9x3oq04RvNbGsKslFRmtehgsZCiPjoQSOckV0a6Y7L94kOD171v8AAmnszOVRSdNrpf8ApmZZWaMM9Gc4GfpWls8hWIwdrHJ7ACuerOUlpuTSrqjUslfW/wAjl9UgjsizIw2s42g9K5nxZqhELujnccjB7Vck5NRm7vudcuWFP2lJbu+prWd6pAYOoZWIJJ5ArwVvE8isIySWZuSe2a5VJQq8rNZ01OPNCWstz6LttSVrkRySgxt15/WvBLTXZI33oPmkYcA8H617dHFJQUY7ngZnhYxm2j6XSWzbaVJKbyev04rwKLxNdxsNshCgE8dq7aeLSkm467HlSSlhry3fRHuk921pcY3ERn5ix7Yrya08S3EpxK5YL0z15ralL2fuyepn9U5mnTjZb69LH0fpepRP5Mu8gg8D2PWvKNM1tpdgR/mbBye2fSuNR95pHs0MWpwc5KzufT2m6iFdQsoIbjryK8Wj8QSQLEPOIxtyw7eorL6sk/eewShVqq62R9a6X4iijVA8oBLbee/0r5QT4g+SwDSj75Cgdx61i6E20lqZujFRTeiZ9sWnia38zbLNw54Oe3rXxrH8QZJCEE/GQSc9K0p0U3Z6WOOEFUbjGV09j7rh1yw6GUknbj2FfINj8RiE2PIxxgA/Sqp0ldcx0U6VSMeSfR7n2Fd63aRRDYwbCkk+tfJFx8RkZAshcMPukdKiFKDuluzSvQlVaVH4Vq/8j2zxFqEUseYZMndyAex618+r41M4kBLdcAjt711xkovUipgYqPs4P3u/qdVdqJJZOQDwQOOTWTZahHczrvRmDHJz3NYxrNq76HHSwUaVZxb1krEUtp5isUBBJBOe9dJNCspRYlwNwwO4q6NZuSvsazjCn+7nrLv5HBvZEZO4hi3T1rtJLVCAyLnaSCcfe9RW9eolLXcww9CdKKcbP1OBksgVUuM4YkHHWuuaxDnOBhXwB9aydacnzWsjRUKdb3b6nFR2ux8hcEsSc9xXamxYDJToTye/HQVtOzVmjClGVGHK9Xc4YWBdnAXCMAQfeu1/s3cy9T2GOwrKpJtRcHqisPCMIc27k3fy7HAS6aSS2wHuD6D1r0CPT3G/KgIAQeRznrSq1ZN7nT7Bum6aV0eevZbgAQQQc8/0r0X+ykMKtgiUyYAPQZrO6jL3d0RPEVFH2TenY87GloqmMD+ENz3ruRpjFxuUZXKg+pqq0tFJvqYPBKclTin/AJfI85udKY4OD6c9/SvRBYM8gDDJUgnPb6V1wxLgrtGtbAwqScebW33Hk7aVKhLSDKkjBI6Zr1g6SrowxkjByaynWUnZLR9S4ZfOFBS5r67HjkmjvnkZJyQMV682hE7JSh8xWIOOgFOlNxdk7o5cNSkpyltpseM/2E/HGcEkD1r1mTS9rqQuDgkZ9aVWrJSs9mW6sa0OWL1R5xaaYsZVn4YbfwxXT3kRjk4AB2nOe1RKVk2ncvBYaM3FydpakFnsQ5we+MVQjndGCMuNjHIU9RWUq7k+WS6m1egnRcYvWJ29qqBW3AbFUEEd8jrXOW944UBmO12AXnpUzjKUrx0ZjSUoQUKjvf8ApHW5jWMYC5VwAe5z61zpviSo2kkYwT1HrWtBJu7epvibRgoyWj6mhcTRAkEjcORiuanuzIQOoLd6uMlypNXuZToKdVSTsl17mzG4yHBJXcRxWRaF33YZgvAwOlRUblKMVojWEIKLkldxvp3OqimiXbhTvORj0qG2BGCN3y4BPr7Vo0k1fqVGtO6jFb7+RoMxwcKTjoT3zTnhICgMfnbn2FRGKaWt2jyVBxbk9L6fcQh/MQJ1Zc4IqxDEoXCklGO0ZHWtvbNTvB6nR7KNSEabd9dPUpPEGJGDtC9B+laPk7SG3E5yMVUpq6d7lRr+zvJr3tUZYAB2opJBHB7VfCJHnJ4JI96yV7OSZ2wSqWbVkzGnj2sByMMSTnrUWp3CxhuoYDkjv7V0RrPk97c86nSUXdv3U2jnb1gAUOQFBIHesTU9SRGXc5G1AMntU0XGcveZ20oOMfdV15k/kJJhCANyk/SsaDWoWI3SAYY9/wCdZV8Q07o1p0lKcYy0SMXXLAtGCeApxnH61qaleJcQSDduLqAAP0xW08Q3ZNWucVPCxU3V5r26eRulIy6PGwOw557VnWXLASvtGMbh15r5/D4hxTTd0aV8udRc8ZO6OjWRTjC4GQB7+1U2vbO2VEM+5m6Z69aKVSEm5JaDr5fKDjWlv08jqbBED+YVwWYDI7GuXh1gIW2MVVnO0nsfWs6yb6+6ejzKMXWcL/qeliWFTuQ7WZcn3x2rgF1hZSVEhK8YJ/XFY05XVnsy4YVVpe2aszuZ7iIKuSc4JB9fpXAPq8IwS23GScfyrqSUZXTMMbhYykoJaLt5nUNdxL1YEKTyO31rgp9YjyFJPzZx9a64QjOF763OSLlRnZLT8TrZr9ASDgAnPHcV5zdayqKAXyUyQR7U2k46CVCUZqMtpXOwNwhwzHIDZJNcQusxM4UuAqx4yehNc86zSba8vU7qeWRglXUk35nWXF5gHoAjEn3riLjVCR/rR0Iwvf6fSiMW5JIJ1Fyezt1vc6b+0QhTaRu3gHNcR/aW3OME5B561NaMFUUZMdHWLpX0s/8AgnocOrKxZWOSuMEe1eawaoN8fmOyh8EY7U6qg5JReqKwl3Rd3voj2a01NDEd2RlwAe5968ui1vEZSOQEhiVB6mslNU5qK6nLGk+WUZPR/wBM9Iv9TWON080dOmeteRX+u+ZnzdxHTaO/1rWdRpLnWzN6eWuEb0paPT0udv8A2wYmUJL8m7P0ryZ9ZaIkM+GDYGe+aKdZt6kKmqMXSinoe7Q6rDLCoWQk7uhPX1rw2HxCwMeyQhQScHufSpc+ZNy2XQ7aUY2jNbPQ95+3KEXBzsYEgd680sNeWUFd+0gAkg+tY0ORL2q+aCcHG6St2PQmv9+5y42qpAWvP5tVOSySDDYCmune1mY0aCqScqjdrOx6RbXwJRhIPlbk+lebWmrBTtZ8OxAwe3vVptttbGlLD01h7p6r+tD199TXBTeBI4BAJ615RJrwViJGG8MQB6ConUjFXW41hmm09Ej1F78FCFY5AYn0Oa8vGvb0U7yuOOe9c8pp3m9zShQSiuTbdnd/biJASwAyGOeprzAa3uuQN+FDDn2qYVFdTT3M6WGhVrScdUewJqYKIM4GSSfbArzGLWNxGZAUyAAe9V7KFS8onfKCpR5E7XPVxqKNGSGCp0UHoK8wOqsV4chgMgKeQPatVUUpJdjjx1Fwoxajdy/q56UmoJGD+8DfNzj6V5kmqMD8rEM7AgGrqU4ytNPVF4bnUVSltc9TjvA5iVXGC+GIPTNcFDqOAWjciQYpat36iliKUZtP+kegm/RHwsxxtJXPevOJ9UEa4LsTg8A1pHDKy5tbkfWfaJxjHlSaPSBqh2pg5VgAQD1JrytNWdmVfMI2sCSKhU5a2RhUrxSlGOrR60+pnG1HGeCc9q8xbVDuB80mRnI/AetbYaklFt6mNPD+9q+U9Am1NDkhzyAOOgrzJtWYuGLHkk4PtVSbi/NamyrUqt6Sdl1Z6N9vi5dZMnOAPX3rz4X5+8GJKjIGevsKamlMmVK/K4xs9Ff+u53jajGPk3kcZOe1efPqSkKGzvBJzWdXWagFChyQkote8/melRanFtViwIBAU56V5empTBMAqQxyVJ7VFTDuD5U9DrqxjGCqKOqT/wCHPTX1VdzMScqCQPWvL5L8rj94WI+9g9KISimoSPN9s9KiWjPSF1UN8zv8nAA9a8wGqsGARm2LnO7vTlibxtDf8zpWHUKiqzd0z0htUXaNzt97OfavKp9ZcKyqxI4BNJ0k3dqzOalWc05OOquennV/lYBsgPgEeleUDU5XzyQTgEA/lWe01OXU9Clh5tOalZHqP9tlPm3ncR1HYV5S2oFlYlipGRn0roq1IySsiqylQgop6b99TvJdXXdtSUh5MkkdvpXmn2yUuMHaNpII71PtVGKuebOFOsudOy6noR1dNqlmIZuBn261529zIyEhiQASM9vpTddyfMTQpxqUlFvXVJnobasm4YkyGyDzz9K4S0aZtshGUAI69c+tZPE2i4ra9z0atFypc6spJWO3h1bgHeQuSceuK5UysoGzAAIBBrNTjUa5Tky/2vs7pao78aqQq7WOSoIGf5VyVuZJiFwcsgzj+HFebUi1L3kfV4ChBRVSfxHbR3TSRr8+CGOSe3vXKB54htDHqCFbqeeteS7tpS26HZVxEuXlfTU3bq8iRDiQkhiTnv7VydwZcMTnGSSQema7KcXzJREqEKsU27vqU9e1HIXdjLgjI7YrldbMzxIqHC7yDnqfSvYyvERjJqLPHx+EikuR6J/kRyX9uwK7/l3Dg/qa4i4WUbmLEHaQuK9+pi3GKinqzy1go1ZyrNWt+ppXeoIrOPMwqnHH8I9q5xVcuA53OxAJHb61xvFOnHQ2jgacWox1dxk2rGNz8xEeSAaydQs5EZSNxjZmJIHAz1rP61K6TOueFpzfvx16DZtWYsBnI54PesCRJAqEnCqcAHvUV6t9XuZ0aKuofZRux6jtiYM5K5JJHqK58xShVjk3YIyMfzrCGIUI3QKT9rZLTodBb3wKgbchsA5rMtRIQoboSSMd/rVKsqkr7IHSdKyTu2drZT71VmPKhgfesm1kYMoOV5yR61tKb5X0PNhgISnKbeq0aO3t5Y3I2kYZsH2rF05WcsEmK5YFvf2FXSqy3MVhYuSk1ZroejWqROu1VBbBYMfes+B2VB5ZKluBjtXfRalHlWjuE6TVTnkrpm4tpGyKzYHlsT7H60sEyIY02lt6gEg9MdaxqRb95bEq8VJN77I1LfTFlwMjIYcitCzdGVAmc5Xk9D70tb2XU0l7kHUlvdaFS50VWRI9ueCNw7Yrq3AKg4OX6Ae3rUWTi0lZs6Kco1KSindJ7Hlcnh9Hl2MuVyMAd816itmFZXZRnJyPTPauBpp8iWpMKyaUFpLX/gHk40AnDLH8quQpHWvWYLEliSMIMHGOhrtrUEoRkmeYqVeE3KTOP0TQ1G1T91iG57+td9aQrAyZjyCxIA+tc9fCS5Wos9KliKlWMW9HrYgg0SM7MrkhsgY612kQiIO5SVfJ+maVKs3BNbBXy+pZRv7y1ONbQIgmeFDMTnFd9FArhCPul+/tWd3C7R0Rw0JTTbeu7POjoDbhsTK7gADjgV6W0O4HauCzEc9sd6dGo5StJmlfD04wlKm2upwEOgiMRr1G5iSe31r0i3twEX5c/P0I6etW60lNxR488HTajKo9XscLFoiZUMpyrMWGOufSvTY7SNpMMcANgACpeITjyPqztlgpKSUJXaOW07RgpXk8MCB616Ha2ccSq8kgVF5JNbUcPFRcV0M6tKcLKMe7/wAzm76wdVVFQHzGAwK9a0r4f6r4ogF7pjI8ak4K8g15k8ZTp2UpWZ2VMH7souLto/U8VSwPyqq4bOCD39K+iIfgp4oKkTQIcgA4PWtY5rQV25oqWVzny8is2u34HzlPYsWHyBXyFyO5A6mvpj/hSviFwW8hC+/BGT07Uqea4eC+IrFYHERUU436eiPln+zCCVwCwckHHWvonVvhJrulWrXt0qKkY5UdxThj6M2nCSug/smLpxlVdkfPtrZeXLgpllOQT2Fdwmm+U7An51YHB7111KknNSW5yOdGik73vey7WKVlCUi9GL8Ed66zw9Dpd9rEGhNqEa3lxghG6iuPG4mNH3pnXllOdWXLTjorfiZP8OGH3mAP9a+krb4HXDIJBfjJIILDgfhXmLPsLFvXRnTPh/FVm5RVmj5m+zuu6QRgEueB1Ir6mHwPl433oOCSCR1Paj+38NFXjI58NkWIhFOpFvU+UfsqDaSpyWJz6V9Tr8CZmXBvMuM8kcH1rGeeYaW7PVoZbiGpQasj5VW3gP3iVJICjFek+J/CD+H9Qa2L7sSAFjXr0nTrU1OEjw6aq4ao4z1SOA+xRy/wkDaARXQrZo67mJIZtpHp7VrGnK7T3KdduytuYP8AZsTAbR83Aye1dY1sEJVckjGD61DhzSjpobzk2lza2OSGlcbuPkAwPU11BtWY4XJAxkAda1rYZTdm9DgjinTjdRu76HmGqWJgD7SRnnp1r1pPA+s698lraP1+ViOGzS+t0uS02tCY4SrUqqLXLdp3326HxD4rt5GacEEqWyAPXvX2hJ+zD4j1py89zHAh5OedgxzjpXn1M2wqXNKR6lLLa0JyTV308j8wDp05uJFZeQ+CB2Ffpg37HV4RvGqpuYg7gv3setcVTN8NJ80ZG2Cy2vB8ko6LX5nwRoXh17sg5KxqxBx9P51953n7NOp+HrSS/W+V44uSFBy2O9b0cyoVbRhLUyxlKvBt1IadD40j8F4bIZgXkU4PevoR9EltX8kxqZAxy3XBr2nO8Go7nmww0HVTleyR4SnhK4t9rIQQ5xn+77GvZ7nSrp4h90YYg49K0i23Zy1OWGGnOLvdR9TytNNutNAbA2NyCDyea9Li0K7l2mYKyhsjHeumnZr94zeFOVOpGlT1TRwLC7+zkqGKtkhj7dq9ctvDDvGG2Agk8emcVm8RCWkmWqSgpTUteq72PBry3vH2tHkHkgj/AAr3f/hEgSJFjAKn5s9xThFpXTODFYqNaapS0tbT1PHNMsbnKuRywCknv617/Z+GUWSNjGMMAOBway+uNO7Vzqw2Cg5qLdkrfI81tdOuF8rglS4GfWvaYtGiUFVj+SJgScdPStaVS7bZeJqwnNU4v1ODt7Lz4ChjXdjoBjPvXdtYKGOxdu05yO59q1jKSTlY48LQhBypc1mzi7e1SFwJMFpHBCAda7AWrA5GCMZ3Y5FYNOclJaHZUkqUXFv3VY09IgMpQJFhwcgEfzq3pks8TpkBdzjkd6cqDtytar8jnp1KLaqN6Xv8zpoNPl4LqQ2DkitCDUpAMEAAkA1MHOSSWjMq8HJtNaMpi1jQKu0EbjknqfarRuPNaMMpILAsR2redJxTlPc44qUny83S1rFAacnzcAknOavGbZnqQeAD2q5ybglHoQ6c4Uly9zM+x4UFiC/BJA9OuK0vMzgBh8zDHtTp2i0ky5rkipTV12M5bAJ85z1yQe1Wnn/2s88e5pKmlG7OiU4VpuytdfcVvsSuETABlUrwOlWBciHawIHJJA6kd6ltNtwMaGBm6Kpyls/vKzWSgqFGQqjntTZ9Qj24UkPnBX8qxTcUlbU2eHsozXR7EMdqvzZbCgHIIpz6gF3kuGJyAPb3p1Iyau1uRCNWFVzi9F/X4FVYEG1j/EcH0HvTHvYfLCoCF6DFbe1jK0XsEqMo0PaQdm/xLqxoMPwQABkY5qiL9FALNy7cgY5qeTVKT0JU24WtZqyXmW2g2KSvKsxzWc2qYDJ94ck47cdqt2i1LsZV+VpuSfN+Yy4jV0LAEFcj61nT6gqKY0YbiTj29M0qzcVzR2Ko2rWpqPL+hzuoWsYzuQAbyR7+9OvJfMc/LncwJGfbpWaSnFST1PSalGd30scXPbOsx2gnLEHP6V0kkcTYGCFBzz3rm9pd8sjtqxd4uk7N3MKG1d2B5VRF0Fba+QiFcHLMSD/UVtK6SppdTyIUpV5OdRaR3XoZc0LAxkPhcgEkVohyXAYkqrZIPepWEnFuU3e5pQx1CU4qKt8znntnJICnqSSe4roo4dzLlySWBGe9bOmotSbOj6xGrQnBKzX59ynY2pKDb9wsQSa31ChWCgNtOSB2reklU95s51z0247ydvkWrS3RckqfUj1qb7QohGDjBJIPbiuao2qns47HRg26UHVqTu3psSSbchUwDkAZ71ky3mMMmBjpmtsPTUbqLPLni6c/eSL4kSMojkkMMn2rjdQ1vy/ldl5XOfT6VFWck01oezR5I0+enq/Q6qTUIVQ4fI7V4fqPilYW2+YwxnGP4q0qRVua5GAhGq+Wcdz1CbWYVYlZMsOAD3+leAXni2IZIYtlscHoKHXTXL1Jllj+BO1m7Ho+u+IocMzSEDaenc/rXz3rfiV2jwsmSwBPPT+dRCtGm2lqJUL2qS2RY8Q+LH4AnIHmHIJrwjxHq0jlmjlOC56etebWxfLJ23Paw+DVWlyPW7v6Ho8HjcBwPN5DZP09q+eBqsqHczNyeB6VwzzB2aRf9n82k9EfVtv4tE2397uXAOM8ivnrTtXuAQxcjgBQe9XTxzkve3POxOWxpybktLWR9fw6tdSyqA5CFlJOa4+G9aOTuQpzweTWcW4qxw1asalZVZLRbs7UXzMw3vuIfJHbntXLJcBiGSQ/M2AD60qmLjLSKszeVGSTvK8d0dM+qeSCokPy9cHg59K4S7uwJMJIQMgAHvWU8Q1selhJ8yUWly6anfRa4Y3XMmVA5z3ry86gytnzMRqSMev0raFRyV0rk1ZShU9nBvl6ux6lJrSyDhyMNnJrzQalI+Mngg5JpKo0uddzkqYWLaimdvc68hjO1ySpAB9K80u71tnykkk9adHEvnvfUzhQiocvTW//AA51k2sybQokySwzXnM946kNnAYAcdR61Uayk2l0JnQbpK666eR6AdXKfMH3dT7ivNRqTsBtBBfIA9azhjHGXK9jvx2TylCLXlY9Ng1YScsQAORjv61xEF2I4wxLDOBirdVznZHHQw1op1Fv+h1dxq5SSQgsC5AGT09a4S8vX3sFPPH410SqKVk0RUw8YT5477HSya1KWVhIdqfKF4yK8+ku3YoCxALAkg9a4oyak20epKDcIqnutf8AI9S0/VC29xJkgEAt2rkbWciBm5BIOMdhSlVbaSMa0XOzatqbuoas2Ww5VmyBj+lcZcCSZh85OCSDWr5eW1yJOovsLUu3OpOyqpc7l5Gazcjco2kh0IDevrmsHNRldbnRGT9km1do0or+UiPdI2MgE+9U47WQqrovOScHtUVZTi0k9zpVNThzp7HUWmsTxkbJOCf5Vz0QljAXblSOa0hiVBJpamTw06rdNs9Gg1kzoeSTySfw6VxlkZS2RuCAHj37VvUxF1aO7OKGBlGanJaPsdxDfM6giQ7hjANZUaSiMfIGUYOR9OlawxWjbWh14rLFOKqJ35ehau76QSq3mnczKB7GqqWE0uZm3bnfG0dvSsqmMbnZK9jGl8LjJ2TaNhLiR48hiUVSAM8itex0hnhTIODwSR0FcvtXq0tDrhTnKopxdk7fgc8s8zyujggZUZB6V3FtooJICjrjBH3q3p8sbIxSSqyhN2b6mRaO4UiQkDbgEd67qz0IBOAGUsRgjpmpliFGSsglhW6LVPucmZGU/KGJfaM967mTRMogEZLAnp3rod6juloZ0qU0k0/eX6HCJ5xZWLHKDJPpzwK72Lw8+BiInbEA2e2aSpyhK7d1c6MRJypKTdm1p8zmUuJAqgZDcZPpXYPoL7VZcjGeCPvYraGJVTdWsefOhKMI8yvfS5wkskjEp1P3iG711r6CxK7gcliV46+ldHtVJcq6EUqP7212np8zkbf5mLMxHzYJH6V3UGhOoIOP3jgFh2B6Vw1cSnpHY9TCU4U5uNSSfkcmR8vOV2tnJ712Euhuse7axdpCOR0HatKfMp3ZEqbkr26nn5V/OB3kKhAIHQ1266BM79MYUsT60Vb8qT3OKo405qKWmpzMaOyAKTuYEKf613EOgSZHBDnk47UJyilJ7mkaMVDkk9WcBNA6MpJILkAt3r0V9CcsFK5+fGQKunmDlBya1Ip5c41I01ovzPMfILTblLDKjJ9cV6aPDr7lG35jkkHv6GtKEpTi5roRWklN2Wj/ADPNnhKhAjHG4nJr1lPDII+VMhSM5Fc0dXddSniKigqc0mos8eEM0gA8tsb8E+tezxeFm3qWXHzDC461tDDqD5nuE8RFqLWjXc8Zey2w4Jw5GcY6fWvaX8JxuSVjO8gg5FXQiudcz1uc1eLcnOnpHR+rPEFsJGZMAjnDE9692i8IblAMX3VyCRwQaxqzi3yrZm8aNamnODu7/meJJpkkq52sVyBkDt617/F4UUYXyzjb+WKmEnGzaKeCtTbk7yZ4UmiORtQEBsjPtX0hF4Ui+UmPDcZzjB4rT2ym9YmMoSppO+h87w+H5RtGDngAEdMV9KDwwPlYR7cMAfenWruSbtYvBtKTSd2/I8Ah0GTymiCtgMSGx619BP4djV0O0lR0wOtSoSnJVFuRFJRkpbPqeEDw5L5RPl7sYIzX0CnhvdjcMBcbsdxUwTXvSVmiq2InGSV9Ho1/wTxmz8PukbFUAm3BSR3Fe7waAIwqrGCu3OT2rkxfuyvfVnrUcLGaVRLVWt8zwk6C7BVCdWzg/rXvw8PIMMyYJyCAOuelcNOCuoyWjPRc3SSa1fY+epfDZkD4Uq2QAB39K+hf7CQ8qoO0ZAPfFbt8iTLnWc4p/afRHypqXhCQxyOBgqBn3r6du/DCyKT5YZWwcsOprXASTldvqc+Kw1lGr0PiefwrcO0h8o5GMEjtX1U/hhFYh4/lPUHtX1jlCUU7HzSlGFVznN3bb8kj5Cj8LzRSblj+8BkgdfpX1tJ4NgKb1XLbeh7VnKnBrRjfMpJdNz5Hu/D8skZHlEO2TgDjFfVLeDYZtrGHawBAJ9BWMKELNX1QVcXONLmjH3fXU+Mn8ITucmElAQQMdjX2T/whUDiMbSNxwQR2rlnC7kn0Oahmrq04uUbSZ8cXPhK4JGyAjC/ifpX2JL4MgZlDLgD+LHUdqwhSdrI6445tyaVpLofHVt4TdZIlMbYGAcjoRX2F/wAIPGGJWMAknHvWtKl32HXq1IUl/PJ/gfK8PhBtxYoTgnHHTp1r6t/4RMKvMIBJBI9cVdOlKUVC5eIklT9re/f5HzXa+F2jwAmRkYz3zX0zb+FQMkxj5HByPSvQpUoRsnqRi6k5Urwdn+aPnyPQHCqpVgAcgDtX0E/hn94u2LGQRkV1VqSvdPRHBltdKXLbVngyaPNhMKQq84I6817p/wAI28jqhjO1BzjPHrXNaVuduyN8Q4y92ir9zyuysWBUFThUJx6V7BbeGViYMY8AqMD1rmm5Qd13KpVW6bVtEjgILVyitIn8QIz0r1AaEoATYF4BAPf0rRxSl7y0IwqUqXIpWk7vueYraHfhchdwIz2969GbREY7hk7lwM1z8kFLTU66HtINJyvfc4U27hAxBIDEjH9a9B/sV9mQCQwIUEdfauuhFJXTMKVeEa8aLjpqeeGCV1JGSA4HPau/GkDDIIsYwST/ABGolUTV0tDXFVIxUqaXvX0OetoD5SyNksEBA9a7ez0rATJGcEAY6ZrkirNJ7GlOq6cG4u7VvxOetoZF8oMQMsCPpiu8GiCK3UkZkdScDvzXL7Cc5NtiVdwWi0OXSEyFAFx8xwx7V11tpru0ZZSTkAY/h9q3jHmTktGaxzGDi6EVuZEdkV2twwDZNdYLH5eCQC4GDV+zbmot7nLSlFQdVLyOaa2YuFAAPBK/WupS0zNySFGTnHX1zWqUYLmW7OGo1KTpq6S6rqeceO/MtfCOpTQu6yRW5IK+vetL4pxeX4L1UEcNbPjHfjpWuGhyttvbU9GPKrJrR2R7h+xvfT6j8PrZ7mRneORxlick1W/YrP8AxbqyYkZMrdO/PFfzvnFecsZNPufurw3Jh4WXRH3DHAoAGQf4ifSrcaDZ8wJDELj1rHlaaUnqYqPu/CrsqlVxlwADkH2qyyAEbBw3JJ9R0q6tVqXKiYYWDTa3PO/iDbK3h+5wBgqQfarHjzjw5d4JBcHr2r2slvKsrPU8DOYKMG5R0R8JXYAuWQHo5ByOmK17u0bfK2TuLMR7V+00ZqaUF95+ZYumpJOSVnex8+6LO4/aA8NLGW2bgCPTn+tLYI1r8fvDDqQHZiCMdfSvkvEiLWFg4n6J4aK0akUtbH7CaWymyiYcbohkH6VT0+VTYWp6bkUBR0HFfjPJKUEnt1PtIJxfNFmoSshVwPu5AzUCnGFQgncTkd/rV1Zu3JBaEQu2pssPjBy3C9xUOSydSFbrmqo05SqRnfRGeNoKmuZatnyN8WG8vWpn2gAE8HsP/wBVHxXjkfWrjB5G0FT3r9e4Zk3RUkfmub+zlJxtqePR3QTA243Op+tJ9ikZUXoPMznua+oxTU/di9D5qt7SbunZR6Fia9SMtI5CoFzyeleV/EzU7jS9NtrG1LC71CZIUPdsntWdecaFKVSeyOnCZfLFV4Uou02fQ3wo0uXxpfNeLFjSrWcgNjiQj09q+gPgt4Zi0LwXo8CrhhbhmJ7k4r8kzPjOpXk401yxXmfqmD4Op0FdPmkv6Z6VpukQWtsIkjCAcYA4I9a3lj2gBMH5ySa8HEYypJK256+EwkIz036FWOCFCVCgrswcevrVoKGOdxG5jkHvWMlNu4qnKpvlWqE8pWTaiDIwDn09atRHKnZnIyOe9VBSSU7FVMPzwcI76M4TxjbR/wBh3q4BJjIBP8PrWh40jJ0K7OCFMJyB6172R03KqruzR4fEcW8OnJKyPzz1a0jN5KGU7RITkenpWvq9q32uQjIBcnjtzX7LguZU+Q/GMXVk5ubi7LVWONe0Ac4GdwBHtiugewf92wJzuODj867sNZ03zasylONk27JnOrbjGSoALdB39a6H7K0bK4yyhsEdvrWHsklZo7ZVZq0k7r8TNAZFCcBSAW9vpWhLCsjDHLN1I/lVOolo1qea8O+Zcm/YptJGN2SMBcAg9TUpsyhCkclgTmkvehfod+GqWlzNe8QpM42sCVBxk+lSyQPu/dKT5jDpSUeeCSFiZP2jk9VbfzJE1GUZyxGQR/vAVXe0mA4JYKMqPf0pThBPlvqKWI5YJRWttWSteo3DpxuwD71TS1kRgXAByQVPf3rdxUU4p6l4bmqwU7e7H8zUilGNoTBbue9VvKKoD8w+bJHrUV5ybQU6dOCcnK3M1ddjThmU+WXUYVySTVILKU2hjyC2T6eldFOd2lLZ9S61OndRWlr/AD8zVbUVUFeRwWBrBw4O0nKhskHvUug4SVtjzqmMjVptwlez29DYGolgMOcgk4FYJLIRyxGM49ar2k5Nya3OTCq901oa82pyIEJctgDkfyrnMsCF3EhgWwe3tV+09m7tHTQk5RdK/ou6OgGqFQrBj1BA9PWuOeaT5oySM8rnuamck5e71Iwji4XqaNXsdLJq7Fl35+Y8AVx2+V2jKuclTketZe0s3Fo63Rp3goO7fU60avuAXrgkkjt+Ncg7TonlkZjznB7VTptPQVGrywnCavZ/edG+ohjGwYloySCeo57VyjzOQNwwcggjv6UpuSkmtjmdOUkopWX+Z0J1HepYuQFfJI6nNcp50m9SSQpcggU5xahzp6Hq4HnUpUqj0/VnSyag3TeAoc5X1rFzgM5J5cAZ71EoNpNHBeNG9OT0u/kbf23lSXIIY4A/i4rFZZflBHyKCQc9D7UUZOV3JG0pc9GMU7yb37GlLetHjMhz0we9YTrINjt8xViRmnsrPY1oylJpW+EuzXoJzvAJOc+lc/Pu+6FPJ4I71h7RLRq6NMdhnB80JW5uhpG5fcdrZPfJ6fSsdfNYgnIw4JI7VpCUXC0lYyw8nOoozekbL5mk91KZFBY8MMg1lb/ml2sSm7JJPT2qKdX3bJWuaV6dN17uWqdvvNk3JZgwHy7Rg9wRWXbh2I28Y5J/vZq3zQjeRtGVNJVIPV6GrHcSMpYjCjOfaqyo+3OTg8Ek9T2FOtV5ndqyPOUoQ92bu+5ejuhg7mbcrHB/lWVtZBtOdwIGB3z/AIVDjaSa9EVWxMpfuXHzubKagyIAwwzMOtYO6RlZj1TgA9B710U5uM/ZvqE8DCUVJLW3Q2ZdQQ7lJznofWuVm3nY4c7iSDWVW9rzZ3UIOgk4x3L19rG1MoThRwD0HqP8K5i+eR4wu0k4wCe/rVUoO12jGbhUV79dn+Jh6zrClSxcZA4APT1xWHqFm0m/IB45PrVz5ZRSTMqUYtpWslfU4DWNVcl/3vIB2gVFq2muQ7BAu7pjv9a53JJpS3No1fZycaSvqtzi5dSkdijN0kJINQ3dptbocA8n19q4JVHGN49D24UEveb1fQxbrUH+dSzBVYjJrPu4pJFIyfvZJP8AKvPc25Jm1GE5y1+E5jUpJHLDcdgOc/WrLwkkIzZ+bJ96VVztz7omSoxlaK1/M5NkkUx9CGOPpXS/YN7H5uQSRgda45UNdTahJwheTuZdtlXCA4wQQx71sC2jjUEoS6kDPrWnKlGyYq0Zyas/M91t5Uk2YYkqATjtV/TtOmkYDZnJHA6VEpqDsnoedhqEal1FWa/GxO0pghRl+6GYjHbpV+bTnQhQSRgkYH6GrpVFF3to+oLRSpT1ejt2OQuHeTOXYlmOD3rXfSZXYBV+UnnH9a0aald6IjLsLCnCUlLd7GApbDKBySOD2xXYQaGyqrLkkKcg9yaiMVJXprU6ottqEn7re5yhjkAO5yF2jgdvU16FFoDuiF0wcgkdsd6FzRkpPc5JYeMYunKN7Pc84eJpAihOCRkH+KvR/wDhHy27EZ34wCO9d0tFdrUxpYunyOEvn8zyK7t3CLtVjsySD3r0S68OyJIARtVuD/tGpjQctYjnF86S0TPKLeCYyIqnneAQf4fWvUofDJDiRk2ktnnqcVyX5ZabnTVoRlKMEml5nCmCRQFYkDtjse9emDw2flbaTuYjaeq12Rw7TTe5xV5qLScu55TPbSHDDqMHivUX8MkgB1+Xg896uth7vmWvQMLiVGXMlotjyB7B3cOQS24cegr2WLw0f3RMQ5cEk/wiuX2M1LU9nD1VVbnFWkjgbK1byAByu5R9a9ltPC4RVTZghiwPqKKVJRlzMzxWLSfs38R5JFpLFt4TOc9e+K9ibw6iMmwkYw2eeKVTCyndxexxUsQrJtWkzyFdDLZDrli2ABXtUOhpwecdTx1qoUuZXZcZOnJze548miy7u5HGF9PpXuqaHHwFByDgk96cMFKSSZc8QpSaS16/oeOw6A5Mfynbu79ua90j8Poyx45bOCCOlVGko+7fUqq3Vm3LSNvvPIItCdcttIzg4HavbodDDp5ZXhCckd6aoNNNs8uChL923bXQ82sdC80RnYPmJBNe1WGiLuOANuehH3fWt5qEHzM6sDia1Rxo3urs8+t/DeNkQ6sGJ9zXs1ro4LrtAyuCxpwnFwUkj1KlCnVdl3/I4CPRDDGoKgnaAQO2a9OuLONFClck4zkfe9a4I+7JqWxwVGlUtB2kcPp+htKD8gGGOMD+dOTxVLoXirTrSVVa1uplSQN0IzXJnOLVGnGpbTue7kWFlmFRqL1j+J0lr4cuGaNVgYBWGc9zX3B4f8NaNqFhZXptkIkRWGAMnjtXy0OMaFZXgrteZ6+L4dqQfLJ2v5HxpD4ZcsA0LBz2I4Ge9feA8G6S5GbRAd3pWv8ArZCdmlYwnw5KCipu/Y+Hk8NSgxnyW5yB15r7qfwdpKKubdC4XOcdK6qXGMVdNXXa5x1+DqkYPlfnt/wT4Wbw7Lt2tGc7gQQOgr3fxjpCWGoiOFAA7Y/CvawecRxEbwVmeBXwk8PJxrPRL8TwKTQI+QFA2gEtjrz0r0t7UJkbcoByB3xXtQjKC5pLct4vlcYJ6nn48OAqERCd3AAFdn8O/EKeIPG15oQtg1paYBc9CfSvLzLOaeDp3q7s9TLeHsRi06lNaX3scePDcu/L25wQcGvuT/hCdF8tf9GXJUckd/WvBfGVLlty/iejQ4exEcRyuV0vLY+GYfDrbkUQnc+eQOo9a+6P+EM0naM26HAwMDmojxpRlFxUevf/AIBkuF8QqsZ1JaK58Sr4d5ZjBkDBYAdPrX2hJ4T0iGGaT7Oo+UjIFKnxbRc4qCv8znpcOVZTlGo9N9j4tOgqm7EeWYYJ9K9a1WxgF3N5XyoHJUY619dQqqtG8VZM8V4eMKsFvys8uj0JfkGwEnIBI716C8cUSAswCNhsntXfVqtNRWx5+IjBVHGG5xsejRICoj5dRgDtXsng3wydcdJmUm3Eh2k9/evGxuaU6C9938j0aOX163Iox0b7HlkWgSTBVjgJJbGAOtfZuneEdNslJECnBABx6189W40pxklFH00eFJV1KMparyPkeHwTeyKrJaNt5JBFfbUelW0ePLQA8AEDpXI+MmpXUdETR4PapODl13sfHKeBdRVRm2bagIHHSvstbOMocABQAxGOv1rOnxmlHmUbtmkuD1CSSlZPyPi6TwhdQt81q33AQAO9fZk2l2kqANAhOTggDnNdNLjhLRxMZcFVJPWWnp/wT4ufSPKIJQktnj096+sNQ8FWF6gIiVGByNoGSfeu/DcY0G0mjy8bwtiYVHOm/dSPlD+zSVBVeQckGvT9d8L3OlSFthaFiQCO9fRUMfTqu8GeVUw1R2lOOnY8tOnRuoLJ8uBgjsa6X7vBUgMpXB7V6CklJJO5w1ZKai7WRiw6cFGNpYsRjNbJfaASpChMAjtxXT7NSbb6GeKlGKhSirpkFppsUhUkYG5Qcjr6CpvB3ifQvEHih/DCNIupRMp2kfKegznNfOZpWp0LSm7H1eU5bXqw5oxv3/QfNpCpIT1z0I7177J4FhdE/eEs2Rkd6+dqcQUU0k+p7sctqypuMo+h85/2dH8qLHzvJHsa+gB8NoiysJmDFwQB29q6ln1BJ3ep5OH4frJLmV9TwD+zlUMMc5zjHrXu938OXjXzFuDhASfQ/Wtaeb0XJJO7HLJKsbOV+p80XGmIruzrgEZA9a63V7E2l3LbsT8jEA+tfY4XGRqRioHx1em4Sk2rpNrU4mGxXcT1B4z6VrXN7aWESyXkyxQL1LkYFejVUmmlsclHFQl+7StJ6ehkf2XEOR8xBO4Y/QV6roHg9dd0+LUNNu45bedd6lDwa86eZUYSacj1sJlNVtQSu0jyg6bECgReOoB7Zr2eT4b6kcMHyApPA4PrXJLMaM25OZdXJ60bStszxJtMBONuV5ySBkV7Ufh/fKuQwLA4I9c1z/2jRTUlK9iKuUVatRtwseUx6PGQGTbtbIJPUV6Fqfh660WBZJsAFug711YXM6U7xTuxY/BTpzjLl0Wp5dNoiFiJGKgA4x3rpJ5vMkRtuAWAGe1enGpeVkeXhalrwabvsc5baNGwChPlKA4P6V3WmWj37tFagF4wAQDyPenUmoavT1NMNUqc3snG7X3I4KTQYNxIBLEjkdOnevVZvCmrAoBaOeBnHWsqlam1yqR2ThXlUU6kdvuPKYtHEYbGSGIBJ716avhHWWz5lswRicH1or4mEo8jeiOT2NRxcYwd/wAzzP8AsqIyYwOAce1ehX/hnVNPCNNbkQ7Ml8fpUUa8XFKLuE8PKC9pJW7o8yuNMjaWMKQGxjpW9OoWTcQQQBx61rKo4QtLdmFKm6tZtfCc3Lp6+cvy8cAH0967G10q91B41t4WYSNjIHT61wQxFJO73PYq4KpFXhG9zkzYAKMDO44x/Ou81Dwzf2FsLucZCkEA11wx9OSST1OPFYWs1yzVmzzR7DC7lHBBwO4rRndvPxsOBkcdq7G3ZXWi1KwtGnBezl8b0v0K1vagvErYHBwT6+la0A8xlwnQjOegArklXUrpK3U1lgalOvGVN3irXJXgZipzkjbgnuO9W0UsoTkKDnPp7Vnh6nLLlbOfNKMrr2WjXTuSWcCW8m9wCjEKwPYe1WTGNqEkkH9T6UVueatc6KSjK0Zxs35jLuxg5MDLsBDADv7VKqNIgUHuRz296px5tZOzRxYfDypR5XO6uU7e0ZmV88HOQfpXofh/wtd6qn2ksIrNX5kfoBXNiMSnFRW6N4S9m7pb6Hz38WbUv4M1XGNiW74x3OOn41638V/DnhOLwnqdvea3IY5bYiRo0BxkemRXXh8eknE5HCsq0FFLlur+ZX/YvQn4e2KcjE0mCO+TzXQfsl2umW3hCG30a6eWyEjlZJBgk571+AY+hL67UcddT+icTVjKnTcJW91aH2IuMBcgk8DHf61GyMiA8/Lk/Wude7O7OLD0nUtKpsiNm2ybMnJUE0+NlYgg46gk1VSpGW50qLhVfKtGcl4uikm0W4DAYO4ZPetDxMinSpd+SNjEe9epkMJwqJ3PP4htOKUXofIV1pm6SQHAw3GBXW3Sr5pyOck+wr9owslCNkz8cxUHKtJXsv8AI+IfFEt54U+LWieIZtIuZ9PtHzIYlJJB7ce1fXNxpUeoybRDvkIOQBWPEeCji6KpL3bfM7MhzWtgH7SXv82/T07k1n+1l4QihggfwpqoKIqhliOF/Coh4EvCF22B5YAHHT1r4GrwzSg1BTV/68z7ShxXJxT9lonvf/gGuP2rvC2f3fhfVSQ2AfKIzjrWangm6Cr/AMS5htboQOD6inLhWi3b2mvp/wAEMTxZKL5oUvdfn/wDqdI/aY0DV7u3sovD2pI87bQZUwF9zWDH4Nu0X5LQgs+cgdT6VnPh2nCV+dWMqHEjnBRdO2umv/ALvjG/ttevDcxqF83By3XjpWZJYTWrGG4BDgAAEdPSvrMoytUlZPQ+WzPHKrJx2vucz9kjDBdx3EAZxXYWOkTXzMLePcwbBx/CfevRxGIVOHNJnDQwyv8Au1f/AIB8gfEcLP8AEXwPpO4lJNQjITseec/Su/8AGnw28Z3nxT8IatZaO8mm6fdAyyj+EDpXz/GuY01l9ovc+v8AD7CNYx4mStdNWf6H6MeFEWHRbCFAAsca5I7cDpU2hBo9Lto5VIdYFBB7cV+MUqcbXlqz9FcZSb5HY6DKnBTPU9argttC7jtyB9a7I3i7SM8DCM5e0b/pFosGIxgA5GfSq65CZGSOx9a3XuRtJ6FN2TtHVs83+Imv6tYWBttFvxb3kgJEgXO30OPWsjxtpd9dXge0gZ1IwfevruHcvpVI81SWh8ZnOa4mhV5aUb369jxbS9b8YrBexeIPEM160xJVn/hGemPSupu/D2pRRmWW0KL2IHUCvq8FlVBT509bnzuMzDFVaTTd0/I83nto5ZfMkHzM4JHrV65jMcqh1AOeg9a+vjhGloz5CjXmpOSWj0KDJCgQNggE449KmSNXGcjqeveio402ot6noXnOChskU5LaBVUZyr88dqtLFJcMoUEgkjA7VnUhyX52edRtOXJQXUzDYRMrui4JYEH1rtdO8L6hesnlxsI9wJJHelWxdKEk5PRHpPKq8IWindnBrpxMiEk53HrXtsHw6uWIeaZdi4+VetefPiCioNKRzYTh7EwrKc1p/mePLpoVRIuN277te6r8OyvAkA3r0I/nXK+JaLlyp6Hq0uGsRHSTu73+R4R/ZpYhh8o3Yx/OvdpPh9MiHBGCCAPX0rb+26E2oRehy4nhWu253dmeBS6RudWU5HOfavTtR8JalYg/u2KEHlR0x2/GvSjj6aXLFppnBXwNaVNQTaseSSWar95N4AG3HYjvXSSwvBuEi4O7OD1BqvaJuyejZnRpOmm5xuzmGtVjJbAJ2EY9Ku3MuR5afLlhnHetKbjdRjqbYuKv7eortK1vIxJoUaTOMdAAO9OlcF+ucY6dvrTopJNMWAhCULpWtr6lOeBVUIFH7s5A9KGIxyeCuAPSrpSSfM92ZfVoytKLutf+HMeWLBD7DxkZ9auF8sUyeSAQf51daLUdTKgk6qUVa3X1MZrMuQzEjgNgfw471sADKpjO7OMfyp87STaGqFO1lra5hfY02KqgBmJIHrWzt5G0YKDABratytcqZy06UowimtHcxDbsYwWG7aeQa13iYEY6tnAFRdKej3PTx9GVTDxi9LdTAa1G4hseUFyB6VouCSFXgEjdnvUNN6SOaljJOShLZKz8zn/seHT58oGyRittlhBCjBZxjntipeKUoqK6lU8M3NtLTovMpJahipU8lhuB7/StGCNFXG0gZPPp71atFpJ6PceMo1VDmmtPIqNF8xQAgZ79jWoUBCMvIGQCaIqKu76nl0o1Zzi47GA9sCFVWJBwCT2JrScthwGUsGyAOwrCM23eL0PYqqEIuFR6LX17HNvaygoGAZgeD6Vphomy/I6gn1reMotONt2Y0cU+aM46aapmSLMRoBxjzRz3J960dg2KsgICgsM9655wvJKX3nsTmqkHCorarQx/sBBXgFGYkn0PpWsuHzt/hxgU5S2VQ5FSUfep623X5amdDZMVVlICKckDtjrWssixyJjgngkDg1TmnNpPQ4/YNKMlvfoMWyUt8+QgAK+5rShkxgOgzuBz6VjKpLRJCq4Dmcqk31tYxfseWTGQN+Qe49a6F9sjKqtncQTntXROpGba2LddwjGmt7O6OYkstwC7cZOTXQPErEE/dU5zWdZ21TFBK0acXq9TijZFgBIACWIB+tdOttHknqBzzVVpRlFWIw2ZVXUcJRvyrfzOGm0+Ns4diRyGHaupkgXhMZ+bnpgCtk2kpJmtS86Sg9GcBLpbBXAXILADPVjXcvaDCkAAc8epp1ZU0rJbfmKlXnD929FJfgeOajoWQUEYBfJY4616hd2uRvYg/PkqKUbNeZNFJ+9J2inp69D5p1jw7IhzEuNuSVA617bqGlSOjOcZPIKjoKyjhYP4mX7eo6kknaWmn6nybfaJO7vJtOwYOP617jqOhO5cqoVXXBBHJrgqYW8eZLY9DCVVCa5Xdv8ACx8zXOjsJd2CCH5HavXNQ0C4VmK4C9M/XvWM6PMk0UklzTfqeMG0KAbFPmJzg+1dld6TKhwoO5Dyfb3rKpG2iQYaTSS6M4hoiw+ZSVVhk+pNbU9pKQxU4x0U9BXHZpXsewoxmrR3PrKy8Oxosb7cqSNwx1r1VNPjjCMnXdxnotKlGLatscdKvCm3Bqz0PPG0BGk3YwCACAOlemfZAwQqADnofalh4te4tyMxx0Y2qWt0PL4vDYUkiMsBg4HcDrmvV47EoihSQrc8frmu32UVK61PPweKqNNzj77/AE6nma+Hk2ENFyMngcn2r1ZbONUbC5YNxitabUJXjq2XXgqlS1T3VY87g0AOwVh1Ck57V6L5KfMwXkHbk96dWMbqXLqycLhpxm05pxR5+NFEaghcAHIx29a7V0CKpOMdG3fzFTKLT5kzmpRpqcZPrc8wm0kSyMzgFdwIA/hr0QwBsFVHyMCAehHarjUVOS5ep142MHDmevRnn6aIi+Wr9WbG49sV3KwIW+Ygs7gDPv0qqbUZXZz+3ldU0rLY4waQnyY5ycZ9q7drbLBAMbSenc9gP/1Uqc4uLk3oP6tUhPlh1td/8A446LHIQqAAg/nXbxwKpUjJXGCT2+lc9Hmj70df63PRr4aFWKlLRnFx6TGrJvjJQkAkdjXd/ZkwVyDkjPt712ex9rG0vv7HmxlKEk29V+Jz4sIxBtQg9Rk9q6hrJVXaGBXGCD24rmp4WUZWWx2VcRzz9pNXey6HDPpwkwFXOGIz6CuvFmpPyjlXPB74rXnlCVnsdFCl7Rpt2cehzMOnqUT5Ae270x2rqIrQ/OS20NhgfT2pqMk7nLWqwlRk2rP8bGQtmuBgAA5zj3FdGLGPbux8xYHHr9ainFe0bejMIWqUVTvq9jIt7IM4G5vNBAOf6V0nkhO+X5wT29KiNNNc60udsa7pT9i3fo9DMa1Kj5UBO4ZB71roBI8TBMruIGex9frWtKD5W5dDz62JhSklT+GTsQ2VsN/zHhmH/wCqujsLZFjbap2ZIBPaor0lJprc6aSTi5x07glvsXPTORj1rUjUDCgZLYAJoqvkafR/gbUW5RUZO1vxMi4t2aNGK8AnA9Kv3PAVVPzZIJ9a4aqXtLrUdR8y55eh84/E60fTr3TdTBIaC5jP055zXY/FPT5LvQncA7kJYMOtPF4NYrCzpSW2x08N455dmUKkNptJn3P8I9YTU/COmysx2m3Xk9uleT/sxa0uoeEra2dx+5AUD+lfzW8PKlXdOT2P6NzTDQnJ1YPSSPrlHVVUeYeAOarKo3L1CoehPWvTpV5NPmZ4MqVJ+9LoaKkj5dxJYAAds+lVslR8uQFz+FRVxEpyUb2Ma8HKCle9vxPGPH6gXXnnP7vJGB+grT8eRhUjlIySSD71+hcK4yK9xLY/OM+wjnPmbs2eHarcfZrG6nBIIgYc9+K5rx9fGz8PX06nAEZHH07V+q4ajHmjF7H59nE6kaXK372i0Kf7M1q+o+JfEGruSV+3MAT3x3ruv2VNMeLw89/tIe6uWck/xZNfhHHOZyxOYpdIn9IZFhZYLKYUXu1d/gfaSSZQAk/7O79KgQZUDk7W5PpXz0JrmSb2MqUWtY9dyVhuxu4OQM00se5AxkDPetoxk9epLoKnOzldMwvEVwLPS5nJwRGQf6Vzfjy+EdgU3H5uGAr28jwzq1uZrS54Oe4x0Y8q6bnhNxdNJNNK7nCyHBPb6VwvjXXotG0e9vCdrRxkKD39h71+24HDxUY2ex+YzxtSLk1G93pYl0q4uPGXiq28P2hL2FoSbhxzk54UV3/7NHh0jRxr14oNxqU7Slj1+boK/P8AinitRqyw9D5s/Qso4Vp0qUcTW+N6/I+ovD+jRaXYxW1vxsjAyPYcV0aYiUYPOOR6V+c161Wa5r3ufTYWCkrRHKSiANg4IBxTlI5HqOCKHLmXI9xwpyhpJ2HGUBkP90jBrA1nVLXSLGS+nYlYYiyqDyx9K3pYRyXI0U68Fo7JLodAsmCQTwc5J7V8Yaz+1XYaFq622qeH7iGyMoTzyRtOTwev9K66+V1IRU5aWFQj7Z/ummfaO7JC55Jxg9q4rwX4w0vxjpdvq2nSK8UyEgA9q8+M43tHqbTw9SnJKSO5VstwQcIcg96jQqGxtI+XGTSjQUYpowqVOVJLVmXrGmxX8LI6YZ0wox0rWVlJ+ZSSmT9K9vCYyVGKcTyMxwVGsk27f8E+YNd05tNvZEOCMk4I6V6H8RNNUItygOSeT69M1+h5DnHtIpy3ufnmb5dHD3ha6fXyPEriVvJc845OKgunCrKGzja2AO/HWvt4V4waklufG18rnSp+2jK3Y8W+DNy03x21SMOQFAIB9zzVH4HOH+O+s7XJZFAIP8WTwa/K/Fdt1YNH7p4W1XPK5RqdHv3P1RQKASGJ5wCe3pUka7owFwRjpX5bCTbSWx9fGpKOsthyOAEOCWyOT3pUAVQAflQYGK2jaUveJdT33GC0ILp91vIDghwwHtTrvYttMVAyUJI/Cu7DYxOopR3PMq0qlOg7vRnyR4tlUanOqjq+GJ9ulUfFzAanMwBwJWBxX7pkSUoJI/F84pKpVk4vTt5nzp8dr1rPwZeSRylTlckcdetZHx/nJ8HXIwSkjA7TivtI4hqjUaWiTPBopU8dQ5V7zaufY37M12Jvhpo7MzFmt1GD36dKzv2Y96/DbQQ3IW1HTtwM/pX83rFyVeTjs2f0XmtKFOpyyjpZfifTe/HyhcgjIqBjtGSThztA9K0xdeTin0R5yhBWm1dirGgiYDGQxyD3quSdq+WxDKQSDXm0cTVlO73NIYSEU7PQ89+JAjGlJjggkZqH4gKXsDHyAxBAPrX0fDGIarfvD5PiRRcdFdnz0lwkEbszAsFJy304NVbq0mkV9vDEEYPfjg1+t0ailJOTtqfnGZY2VOnGFGN2eYfA/wATahf/ABq1jS5bqRrOCRQiE8EE1xvwESeL4768sjkYwD78/wBK+K8RsxnCtCMHoj9T4Do0q2VTqVI3fn/mfrEIFnEaqCScYwOo96tWTfZrYXRcmSUYUfWvjHVlGKm5bnrRoJ1FGCWxVuUS3jjh2g+WSCKpzS+aCwyXduD6e1Kpjp6KLFPDwvKSWpzPi8RvpFwZCMrGcsfSpfEmmSarpc9gshQ3UJUsP4aMFm8oVbzZyY/Kk6Sstz5Z8PWVx4o114LUMLG2nw8nY47Cvo3wv4SsfDOnxWdhGMoQWdurH1/Gvpc24xbp8lFbeZ5uB4ahTqxU3qaOk6La6bAiRxAHYBn0rcJBxjgYwB6GvinmdWUryluz6Ctl7hK6V11OF8dIn9kttQA5K4HfFR+O2A0zK/8ALRiRX0eQYmdSsnHfseBxBQpqmmkfMssDeY5OSWPB9avvIo3F+eSBn2r9hoVLwUWtT8snKMZSlOWyHWsWVzvOVAHT9KSCbAYdAAMADoc1yYmUrqKOjBUZRXNe8Wrl0bUJGCS2AKgS4Jkzjb0BA7irdpw5lujmTUKseZaFiNnClM4yTgnvUiSR8HOOpGe1Q9I36nU6TjN8y06fMazt5iAZA4Jz35qnLLuZFQnCsScfyraSi6bTZzYVSdS8ldHqV34ka10ays45gtttVnUfxfWvNbphLbRDJZg24g9vSuOhSgm4PdnVOg6UnVWqujlfi7P53g3U5onIjaNuD1qj47ljbwhqUd2SIvs7Ek9uK9LBWTd+wThTqVYSelmd7+xuWbwLbsHYLuY5Pck81f8A2QYFXwDbGIcG4kUKfQYxX89Zs5Qxk/U/dFUg8PBPXSx9pwSSMu1xhVznPeo1f7ijhx0B+lZUrtO26IjNu1OCtcsKFUqM56kD60oHyepboe9VJKUEmxVas3U9nHRHP+K3J0yQDJJJB9qqeKbhY9McM4yoP4e9e3kdaMaqT3PIziHNScWtF1Pna7dvMlLdFOMetVLq5V5XzksSc57/AEr9kwKXJG3U/KcWqkJylB38jwabx1rWmfGPQ/D8N66WNwwLRg8NXDa08R/aA8LHBDcjPrzXgcf4qVHBRlB631Pq/DWiqtWqqsOblVz9VbGGKWxt5JRmRo0z78d6ZpUm2xtyc/6tQSP4uK/GY4+o4tyeqP0Gnhow5ZRirPoWzZx/wADDDPvSCTJUhiNxyD61MsVUa5rlVcLCEffWv6MU2lt9487WwAKduJY8/u05B9CO9V7WSUXz6GcqFNrlUdFqfPfxHKWgv7mFiJY4ZAMdiBwayvi1cbYtTGTn7O4JHTpya/XeEJyVlJn5TxXSUpcuiv1/Q8m/Za8W6jr+o+IrbULp5lttVdQHPRQRiuL/AGNSr614wZDlzq0gOO/PAr4zjPFzhjnTvufp2W4CksupSjbT/gH6RGwhc5I3ZBODT1Z3GckNnIP4V8tDE1JpOT0PTjh6UpJRWhbjREVAGAAIU/4UxS5VTwcEAn1PGTRGCV0tzOpVS1S2ZbXhSpySGyM0jtkY38McD3rn9pKLvLqaT96CnHRoU4BHzckZGKZkHCg4yc5Pb2rX2yT9mzppwnOHPHciljjdgSclsHB7+tTHaCF6DP411U5Spx5YyucNClCo2mtTB16GKPTJT5eTtY49KXXirafcFcnEbED1NetlWJnKok2eXmeGpqLaWh8s63EDcO/AKkkY7fSna3PFb/abiTCrDlgT29c1+x5ZOVlBn4/mFOnSXtIrv+Jx0ky2zLHuJmnIVFB5Y+wqv8KbZvGfii512cE6bptyUt1boxB5IH1ry8+z6lhKlo+9P8j3cl4XnXpc9WVoNaI908F+EpJIILm+jIkkYFVP8P1r2SwjWCJU2jAxgjq1fmmN4orVJNy6n6HlnDlChHlitLf0xlvpkcCqgXO7A47VrBhjI5w2TivLeJrVLXkenSpxsrrYqrbogC7cHcSSB1qVrhUBLMAMgEn0rCo5N6vUMOuVq+t2SiMK4JH3xyD+lcxd+NvC1lKLS81+2huMsAGcZ4rGKlfkkilUUZ33OhLJFtAGVyFJHas+01bT9RQPZXUckRbhkIOffiuuV4WQNqbVuuliSaCKcDgbcnt1pzvgFc4yvB9PQ1MsRUTSgznpYRNyg1c8z8U+DrW+iaS3UCZdxyvfNeg5UeoJyDjv7V7dHPa1Fq2qPNxWRU6s3bR+h8W61p11plx5MsZG3OSewr3f4l6DHNZG+j++M7sDqK+6yDiFV/cnpK58Dm2RRhBybu/zPl65kELEbh0BBPaqGofuZArMSFwST2r7amm1ZnyVOrOlFRjH+uwAtkEuSozxVBJAzkO5CnBXHeqnNq8k9TbD0uW7to9f+AX0AeRSRgg9T3x0pAdxVFxweay55SXK2YpKU9VZP8C4X2hCMgl8/wD16ZvH3WALb8jPYVzwlZ8kti61PkaUXp6akBaPPOT8xYZ7VFKq7t6nBjywA6GtZWa5mzn5ajqezi/dI5ZDnaWPysBx3zVZ3Z9oJHfJrSnGDlzI6lQcmo82i/EgLqvDhhkkcVVMqqCTk4OMelaVHFzSbFTcqU+dx17BHIrSbMAgYzxyR61QeT7zLuBBJqJUYy1joxRqvmcnrqjZGGCqCTsyB7n0rNjkdWXc5AJGCe9WqjirPbqKCcE1G93tfoaas4COScHGAe1OR1c5XPOAAex74qIVXKXM9g9jNxc1uvxGSgnGG3YABI7+9MMkh+9jHBwP1pOfJ7z3LrwpTgpVVZvTuU28tQfLGGGASf4vWh23SbwThccHvRBW0QYqjGSSlLXRJfqUpSSw3Z2g5AqSfLAFcFmbH0Fa0Ki5feHKinP2aV3sQrNu8tUyoJwcd81XJJdCVJ5wB6eprGvFNNPqZ4SMIQjTT2epa3YZcE7FOQo6H3NUTKd2d5VUJIB7+tRBK3M9Wy2/Z8zUbedzSBdRlmyTkgD1qj9oDkgE7PUdD6/lWig1FTsd6w0FFSpyvJ9DbjmTZGUUZOCQe1Yf2v5ghXCnGD/WuVe9eT2OWnGLnZpK/wDW51AkBiKcZOBg9q59Ln7uGP3gCR2q6WklJG1LCVEml7qNfDYVhwWB6dOOtURcOzHaTknnHQVdeEp63JxFFp79iWdMgMQCY1yPfNSRjznRA5HIJJ747mtoVJNtPY8+vh/dVNqzXUrhVlXbzt6A+lajaaVUNuA+Y9B2Na1KabcovQ0w9KLT59jAKBkCkc7yCR0X/wDXWwNOkaQAHCFc4PtWVS1ue+i0MqU5puNr3/A5iS3zkZwpJGMelbMtkw2SHcFKkZ9a0oVYuPM9l0KrTcqyhKO3U42602NtrZywGCPrXTtZEsegYHBJ+nSsouz30eppVUZU2orVHm95oaSjAX73JPqewr0STTw6ruYDaACB3pc0IXigtJqm6ui1ueC6l4aQCQqh3bCGz3r2S40pHYIXxuPJ/vDtWSo80VJE0cTGNfka0aaT9D5fv/DRiUMqAckgfX0r3q88O78hyTwAAO/rSrU4ykrvQ76OKqUYpJabnoqOXjDbyVHABrPtpcLkA554/rXixnKF2kdcpOq3F/EzXSTPy4wFwQ39DVWM7zwSOeh71upwSUUYUMNz+5fU00fEfDEgkAgelQxPyBwBvAAxzxSlTvK8du5y0l7OUoVXddC6pDOpyRuBximwtnhjgqTkHvXUqTguToZYqlBvnS5ttBXZclXcgAE89s96a6STKSRht2Rz0oV00pvVDwbjKnJ01o/wM5T5jHexC5yAfpSSRhJEYnjdjAqnRUnzJ6oqpS9pFxn8gKZTHAQ4yB2qVAMbhkMwOBUyw0W9CMPUUlyp6JfeymEbeuSCny7fer37rdGC/CPk4963rPlin2Fh6klNTa93qisVAfcwAYMMf41ZaFXGdvDNx7VjCMGlc6frifNTaspbEKJkEckK2c/WpmLIqx5IAwDj+dOnJOV2rJ9Ryw9WnFUpu9xirtPDZI4yf1qINiTDu3zEHj2oqzsly7GFbD+zlyrV7+hpHBjVVfJ5Iz1IqGUbQpBwX5A78VlGUpysnoiH7WbcIx95tMgV9ziNZOVOdx7VEGYBWAwDjGO/Perm1JqVjvnXqQqOlLV21NEsCVAIJzwfT0qshO7OAdhOSe1Dpci50zKg4yklKPvdC0sjEDjKhQMehpFAeNQSMkHJXuaynJKyS3ZrToSjJKbWn6gAd6Ag8Yyc9TTo1LBV7jnAroqRcVyy2M4zmpqpHddCzExLKWwBnIUdzUYQIwK/dU4x6+tTTukdeJi6soVlG3c7G0KLDHlTl1yCejZrGtrohep+UHAPbFc0oOnJ85x1OWs+VOyRvSK6BHBBzlQT29DTY7pZkHzEsoDHHf2oniLXuro5vq6UbSlv99inIwLbCcquNx7mq0jM0pAx8zcn69q5rNSSk9T1cPXhVh7KC07/ANdjA8Y2xutEmUoTlGOB6etbt9GZNPnTbuyjDntXRhaip1YvdM5cVTbV0/h2+Rz37LGsm3ur/S3c5iuGAB7eled/BvUToXxPuLNjtjnkAJPQ81+Kcd4CWHxftobSP6C4Rzh47K1zLWB+psE5dAeclep7VmWM/m28bA9UBGO9fG01JR916G05xb5Ybm0WfG3J3Bh+FVjIpwwB69u9RPnbUkGIxFNJRta3U4zxwAbHzFPKE5+lXPFMCSabLnJRMnn2r6jh7F8lRRb30+Z8Xn+AjXXPNaI+GvjLfmDw7PbozBp3CAj1PSsb4xE3uoaPoiHAuL0KRnk1+34jMoUsDKtJ6pH51kGTPF5rTprZPY+xf2fdOOmeBNHR4yrvaBsjtkV2vw6tPsHhvTIApAS1QE/hg1/NsswdWcqjWreh/ReaxlFqMForL5HpAlBcBWGAmcHqMVUZ2UFQcjHIx1qo4hOSbd9Tx41YqTVtC2JFP38jpg1ky3SKpcMcRKSM9+K6FVkpJ9yMRdx5ltE8k+I+pKZxbfNxkZHqTXIeK71bnUpfmJw55FfrHCeEUYKpM/Ks+qyrV+ZbLfsfM3xhvGuLfTdHjYg390iADqwyM1g+Nbk6h8RPCunZLRJeg5P1r6jiXGLC5fKonudPh9R+sZlrqoan6NfCjR00nwlpMaYCiBcj8BXTeFQLbRbCH+FIlyPwFfz1RqTk3Vb1ufrub1va4hyirI6wyKSD5h2ggjHfNVjIAVPoQMetbyned+2h59Cq2247Mul8I2OTtwPaqIkzG3l5HJH610tc01KO5nOgk1JvRbnkXxK1XYVtw5A2YKnvxXMfEh/MvsFuFPJFfoPC9Dnj7SS1Z+e59WdTEK2y27M+XPiboVrq2halvizL5bFcdQa67XlWTTLxQAxFu+T68cV+iU6cZVkpq/Sx8hWnODlOCtZ7on/Y28UXEmm3Wj3Ezt/Z900YVj06ZzXA/slu0Hi3xFbBzzckgelfhnGmDWFzJqmtGj+hskxUsZlVKrOVpbPz7H6iJKTg7y3zAZNUImKoMPklB/KvLVZyg5HJ7Hl9xfebKOm8EEZdguew9KoiUYQjGSRu/wDrUoYiVOKi9TOphIzTlN7o5zxtbLLpU+MEqCB7Voa6pmsJ1Y5URkAnua9/IsfKNVJHzmfYOMqUYSeyPkTU3IWWISENggE1JrkP7y6UjO0MSew9q/asrqKdNSa1PyPHucYOD1ieC/AMl/jprjYG4RKBn+L1/Wl+AW6P44a5IAPkjXGf4eTX5j4qySrRcT9o8LcPOnlTilfW79D9WLSUrADzyw/AelVoXAjiO47ioJ/wr81xE420Pq6cZt2q7dDSeUMw2A4wB9MVHGwkQKQM54A71o6qVO8kPDKCl7Neol04FtMeuQQaq3ZUQTBTngnI+nSujCVP3iR5uYNThKKej8j5M8WqX1CccgmY4Ppir3iWBnu7g9A0rA571+58PybStsfiubYyUaqgo6L8T5E/aALr4LlZ16yAj8DzVr9ohdng24AzvQkLjuK+/hXgsPUT6pnzWHoynjqMktpan1p+zKMfDbRAuC32bIx3BA5p37MqbPhroITBJto8Y+gwf1r+Xq07V2kurP6OzNOUoxkt9vM+j5SzKijIcngepqzJDMgUtwVTk+melNS5k7LU5oxTg4zlojOcFcdQ2AcDtTpNrMCWJLAnPp7VxSnJPmepLt8EPI888bE/Yg2OmcA0vjbc9ltBG7kgntX0fDWJbq8slofLcS4ZuF29WeNGJRbzMy4coSSw+6KfM2yKRJWIR05Oelfq1Kqm1Lofn1aaVN00rNHzn8ELWKb45a5KuVWNjnvlmI/SrXwIlj/4Xf4iJYqnyAHt14P49q/MPEPEuOKpuXQ/XuCLPKnZXTe5+mt+0Sw28cTHiIAkdz2NZiuxG5iSNpx7YFeM8Q50Ut0deGpqEnUtuCgjkYwwA471Hv5Vk3KpAwB1FccarktDRRtFyQ6RgcbAfkGCKi3MpIJJVu1RP2jSaRHOvaJJFWRxuIZiABnj36VgeINesfD9m97e7tqfNher47CtcLh5O8YPUmdSnKd72OkJxGq4ODnJPavjnXv2pX0idoo/A1/JBvIWVcfMPpnvXXHK6yXPbX0JjUvU5ZPTTU9+8d3BXSmHAABIP1rxS5+Klp428PR3UNjJbzSqS0Uw5U17fC9KTxHM0fNcW0oRhyKRx1zdliMkfLk8dvSsldzsWdgfmxg1+2csUlJux+ZVKacbwV5djUhupCRlmy2AB7VBFGxUMuRhsiuLExXLrua+3k5wja1v6saIusJ5gc7FGAT1qgZGYlAhAAJrChzNvn2FWxKnK9NbGq10zAkk7iSxqvDDNLtVgwVlOeeldlOrFxuctNOclKO3X1EjkklYlXIxxWnbWYCJ1OwHJNP28ZVEjoxWElGKjDVdx9jMytvbJCNyPWr0USR5G4KW5H17VcqUX7xx05Nt0mv+HPPvixIj+DNYeNCFEDbmH8Ix2ql8Wbg2/gjVDvPzwt07YrpoUm3KKfQ5K0GnTlN9dj1b9jhy3gS2eSYlt7FQe3IwKxf2OZxJ4At2XnMrhWP161/NefVlHFzilp3P6ZngmqFJ097H3bJeRowfnheBx69axkBWM5PzEkZ9KdKtCKjHueb7NKblU3W6RoS3TlVI3AFSRisUyF1eMSdUwCOo96zqYpJ8rWwvZU+ZSV3/AME53xZO8mmTYckZI57Gk8SwkaTOepJNerw9O+JjdnhZ2o8korZngCRO7bm4wxJB61LvZCvXOCSB2r9zwjmoqP4n5HioOMnd3bPlTxDIU+PvhXy0IPJIHf0FRa2Xk+PXhdRxiQhW9yelfJ+JMH/Z0JPQ/QvDDESeIqQ6JH6paZI39nwDdgiMAE1n6W+bC2DsclQCfWvw2nim43ufoNTCwjJuO7/A2vM2ADOcnGR2+lVgw2ALn5SQSe1EMU+a7WjNZSlKPLJ7fiaCy/KxGcY5Hqar/eTCSNuDYI7Cu+nWi5OLZ5tSDnFVHpynzX8WIpJxqMMedzwuFx7jpWh48QPqMoJJDsQc9q/aeDcRyQUpI/JOKMLGpV03Ph/4I+LvE3wo13Xjc+C7q6tb++eVXiIGc4xivpGfT4ZNwwCSQAB1xU5zwzDG4lV1KzPTy7iythKMcNVin2N3Sf2r7e41zTfD+o+FLi0utRnEamVhxnoTzXyN49jSD4s+CihYbbyMEZ4P/wCqvmuJeG1g8L7aE7v0PsOFc7p47ESoOnypK+j6/cfr/Y3QuraG4DfK6hsD+VYvhVlbRrA/w/Z0AHpxX57h617KT1PpK1OKvY6dccsxzhiQT2xUZz87Ek7jgCqrTajdMVSpor7dhAxVgc4yc/QUoZQNrnoMgEdBXQqiqK6Wpk6clGMG+u54t8SPipqXge7SCx8OzX3mYJZCOOO2aZ8RbaN7oM4yABX1+TZXTrQTb1Pmc2z6WGqKCjzHM6P8Yb3xZY3C3+hyWbkAKsmNx+nNcSLeOKVyhIZmBA/CvrKXC8YSU1LX0PkcZxbKbS5eX5nnfxq8RSaT4Xv2gYLc3Y8tG9Ca83+Ot4ZrzwrpIbLXWqxBx3A3c19FiqzweElVlqjmyajHFZikleKtc+u/gV4fGl+C9JwmJ5bdXc+5Fem/D6yS28PabD1VLWMj8q/CK+MlUquctr3P1zlhKbcPh2sdlE+PKHO7aoYimZG5h5YByfmFcySast9zooe4+ZLRFnft2qvIAwSf8/1qspOCMkgHJ960hUUFeJnCUk71OrOY8X3zw6W8aMS8wZSQegxxzXLePpWCKOdoBOD2r6rh7DqtNTPmM/zBU72V0j5D8dfDXS/EK3E2Jo71slZlc7gT+P8AWvT7hvMBQk4BU59Pav1Shl9FRcZwR+Z086xa/e0ptO58m/A/4neL/hz8Th8P/E2pSy6PeTkRGQncnPAGfUVzPxWs/sfxd8F6nA215dRjDH8cZ/CvieL+HqdGgsXR+4/UOD+J3jJvDYp3klv2P2Hs7v7XbxXBYhJFXaD3rmfB8/naXYgyFttuvP4V+VRxTk7y2Po8RQ9inJPU7Mtl8duhA7VAGYAsQAwbBPpXako2cnqbZdNXagr3MzW7KG60y7STJYQMB7+lWrgBoJl3dYyea9HB4zkqxd9zzMywM61JqS26Hwf4kga3vJl4XaxwT3NaPj3EWrXGB9x2Ix0PP4V+3ZNX9rSjOTsfkma0XRcqcFdvY4mHHzYODkE/j1qpHICS4zyQMDt616rbck4nzdNyStN/LzNqCU4+UZbcRn0461USQiFQHYkMAT2HHetK8UpqLKg7Jc0dWa3UAn5s5wfQ1WSUljuOP3YII71zVoRclN/ca4im1B03L3txsm5d2WwoGWx2/lUrRu6ySICQoyR29KmeIk1ZlUJunCzjdb+rMeV2CqcsSDkH1p0pZhyRvVhw3bPWumfLJrm0sVRcU1KL+Jq/kV5BhQ/8Skkk9Tx0pk6kfIrE4wcmsVWTTa1NMXQhRqJzenQprlycAqQ5OPWlcFXGRgLk8H730qpyvK62SObB4ZRnaT1etyFrkhlHDDOBjtVYMFcEnbhuMetTaMKd09WNVZVpqlFaJ3NFZW3RsjHAbnFZkcm1tu8kqcknvWMpRSstUd9KrVqpqWjv+RpmUsdgJxjBPrmqAePkMWZQOQe1dK5ZNM45UZKoqbdy4p+c7TlRkDd29qhV0CDJwwYcntUybceV7mkaEZKXtFq9LjsrhSCCAWI29BTEYElFGEcAqB355qoq7XMtC3KoocvNqtF5kJjYFJA5J5BUnjmpZSruTyuTmsm5NWb0OehCMari173fuZ1wxZwWbLMQAPT3qzIuSpUEncBgdjVRvBWRn7N1Y3rLRPR9CqsiQYJYBDkHPam3KtIuFyG8w8rRJKUeWTsbq9CUZ09b/cV2n+5yWAJ4qrKDg5wzlRk9jRJa3tqzmglNWk9Lslt7qQOd5JTcCc9uKgXoM8Dr9TUYhxcbJanfg6cpU3Sg7pGpFeSFsZxliBnr7iswXA+VixAJIDD8Ktq9PkuYTwzfuRfVHSpesoB5EiDJ96w/OU5YMcBhk+tZqoob7s7J0atpQnLRHYW2sMpUSZbJ2jPb1rk4rhHwTyUx17mtlUjBWk9DGtFSpxUXZ+R6TDIsikK4245NcRZ6lNbuHVjw5BzWM1Nav7jOrFLRTVu52kluXRVY4bkjPoKo2upCdduSZGxkH3pOo27WsKhUjWbae3TuZ11FPEQpJO9yTjpitwhJkw/AHJz+tXhddV0FiIVm1ppc5XEhXqScg8+9Xry2eNQyKRGgJPq2azqVm3ZK6OqNNTe7utzFMm51XkngkH+GmjqNxIwep966pSaj6nIqkqkFyrRfmiG6yRndhgSAB39adMuUKg5wuCT6d65sFTjGajLUmcpVYyadmyCLG5V3Enduz7d6ltVERMmMs0mBnvXiU63JBJLVHZToNVJKD+0aUQY8qAdrDBPpViNVIKZGMg49a0pyc5J2MHQUHJ1Za3/4YmgSV28wk7I2wfb6VLudGLIxwCpwvauuFe0LR6mcU4xT3abNBV2BWcEjkDH9apmbbg7icck1hGc+Zykzu5JTguSNmjQWLzOA2FGOneoEmGQcEYJHHeqq15KKjDcK9JU372l9SCa3I+bjbuHWr2MoOSA+ASK6qddKDk3qjmxGHdlUhu9TIOAB0C8A1peRknqcEYJ9KiEnJKcXY5bynFQlCzvcykG1gQCCBwR3rRW1+9tcgb8H3rWq5TjqxKCp1HCL3M+OZiX3ZJSQgAVd+xMAys4zkEAH9alWsodDJ4hOPNLWSendmczIykgncrEHP9KkktGLHsMAAntjrQm5zTZ018LUUlGMrQuvx3+RRRGcsyksxIIPpz2rWtbJiB8xGZAcetc9StJtXWp0zock+X4k36FaVJmERc5IJGT2rYnhJXAwQThgO/0pR5VBHbTi51FUbtHUw0QlEL4IBIJXt6VeS1c7gUKngEDvVUpqLa2OZQhKoptad/QiVCpyhJUAZz2qzHaySKoRSMkZyfT0rWVXlaS1Xc1dWM3K70GpkbWJOR+lW0hPcH5mAz/drKcnGKVrtmeIy2E4e3jKz/MI0JJPQ5Bx6ZqwgwCeSVBGKynyzSUTv9j7OEpt3bS/pEDx9CVJXcSQPT0qy8oXABwx6f8A1q3hWlKNktEedWpOU4xW6X3jYcKny8qMZB7imRXCqGBUkj7oHU+lZV6jjJOKuRFqLUJo2YCqrsBIZkJ47Z6YrPNwqJvLYYHG49vasKzmpXe/Y3fPNe8tPxROxXOAR5itwPWs5rsNcxjcQA2c+tY1Ktlr0ZWBwKjSck7KXU3VzJG0TDqhJA71nxXXJbdgbT070mkpKT7nZClCpFqUulvU8C1I/wDCPfEzSLxWKRT3CqR64PNQ/FnMGoaZqcQIkhuULE9sV5XF2WrF4Vyi9UfWeGebxwOP+pS1T/U/ULwxeR3emWckbE74VJA964j4Q6omo+FdMmRt22BRx24r+ecPUlOD7pn6znFJxquktj2GJM43EjLEAHvUe8KEODkngDsBV/WOktDgrYFct1qUtaAexnVsfcIGKdf/ADW0kYPOw7f9o+lehl1dRqqUtfM8XOKVSeG5Yn52+Js6t8XNDsACUt7kMx7Dmug8N2El/wDG28kkyYrXAUnoTk5r7vi7NI08DGjHeWp4/hvlslKrjZL4dF8j710GIQafbxgniNRj8KsWuxYo1GcACvy6nWdOKtsz7vmlJqpf/gGkZQAo5DE4z6VUjG5yzZ46D0rWLkr825hDDuFVTg7rcztXnW1sriUfNvjGCe9c140vvsukzKCMuMjHbivosrwvtqsbPS58vneNkoOPVngWr3jyXchVidrkAn+VYtxLI7ttJ/eZwc8mv3HK6HsqSjJaH5tmEIOLXNds+fXlW8+M2hRlyTDKv4Y64qnpIb/hd2mIAAQcsPTJ618z4lVFDBw8z7rwifO60nHVaH6v6HIBYWpJPyxA89/XNR6U6rYW/GSVA/SvxSnVThyvc+4g52dRvS+xvhtmM8kEke1UvNchDgHDBgR6VpRxEdkjCFGNT372XYuebhTjqGJBH9ap5ADHGSBnmtaNVNprQu120tn+R4B8Qiz37KMhskkntUnjcO+ouOeGLE+ntX7BwbXcIKSPyfiClebpp9TybVogLC5BBYmFs46Yq9rER+w3JGcLGenav0DB1LzUmfE5jinShKK2PI/2W98fxA8TIGIzddu9O/Zh/dfEPxG75O+7LEHr1/zivx/xOklj404aXP6C4IkpZFTUtW+v3H6ZxBnRVDckAE1HasyquAQpOcjvXwdBuE9XuevXqXSjF6mjEpK/KSSpwR64pVLcZyDyMDv71NPEOU7NHnUsPGabe9yC/bzLG4ABG5MHNQ6jIfsjNznYQMd69HCVJQrJvQyxlLmouklr3Pl7W1w9+pUhMMOe+Rx+VWvERaR7wBsKoYE1+8ZPim4wTPw3N+aKnBnzX8Bdn/C69fYFg42KxPbBqP4CKG+NWvuSMMxwM9TnvXwfitGKxVOCeh+yeGNObyXmqO6ufqVGyhIjuIGDnHbFVoJD5Me7Jbv7V+XSnZcqPWimqkpLVGqg2DYM7iT1+lU42bcpLEEjGT2Fc9GdSL122O2klUXNsmTXBCwtg9mI/KkulHkMTnIUjHpxXZhaqU00c2Z4fnTUdFE+bNew93cKDy0pAHpUeuyBbubbkt5xYj0ANft+RVHFRlHsfkWbRdWbila34nzB+0BpLz+D5QZARvB2j8Mj8a0fj5dFvCeEbB81CSe3Ir7uljXDCVHa7sz4XLaTnm9Kmumtz6t/Zo0tY/h7oPJKJbRkA9sgVp/s8HZ4B0Rs4JtlIA7DAr+XJY5zxEm11P6ezeg+dSe6SPdL0AKRk7c4x6VBczLJkM2TkgZ/Su+pWurxOCdKmpc1RanPOrANgkjJJOe1OGVlZgcICAB6+tY0rTSb7lU1L2nOkcZ4zso5NPhEudj5BHqPQ1a8azKlhEWYBQxCgV9bw7CDqWTPieJ69Sb5Ix6ngOtjybOVcsBsYHHUiquu3SPZ3AaUkquBu7V+s4OCi4pvU/P8fOCi04cy79dD5w/Z3u9/xr8S7X/1ZOM98H/OK5/9nOTzPjn4lOSFLDdg9MHr+Ir8u8UOWGKhBKz7n634b1YVMllJOyva3Y/VUu4UKCQjAZ9qFkGxDyRsBI9TX519bVvZx6n0lKhThea1Qw+ZIDyQMkZHU/SoJnkjKbWx8pOR3pRxd0qlro5ZwhKXs9mSvKEyWb7mcD1rNMsjQuT1BOM9qdDE8qs2OrhpQqNrVNHgfxL1j7VeNbbm2LkbVrl/FyTSapNI7ElpSCfTFfuHB+EpwpxbV3Y/IM/xLqTfLKy1TPP7rT4JdjvGCWJznrxW6li/lEuSwck/Svu6lGPI1FnyqxanOM5PbQ5mKFkaRQcrxj3roYrFt4ZshlwSD3rjqUYwSnHRmqrvE1ZU5SvbZGcsR2r8pDAgAH2xzXS3dqwWFkGCxOSO1aUW5NW26k0pypVJU7a208ihHCDGoznk54rTt4Au05xggEj+deXXUnNtPQ9PDVFJRktylDbqJIi6hoi2SpHDCt0oqr5Z+9uIB9Kzoc7mo3umbZjCydRP+ux0dnf6KYhbz6QgPQOrfe9OK5qOEYXkjDE5HbFenPDWk4p6Hg0MXJwU1HRG/cW+mtve3Lx4yVQjgZ9//rVQigwoZZTtLZINbPlU7p7HbRw/K3KO8jJlSQFkJYbDnIHUVuPaBiSJCWZCc9j7V0J8sW3ujgrtVqihTe3Q8a+LMW/wRq6ByQLcgg9QMU/4wRmHwVqgR8sYCAT6Y6VvgpcrlK3QyxmFVSpTTlrzI7v9jeFU+H1kGySjuuB255qX9jfn4fWK7sszkZHQetfzDxFBLGyS7n9LRhyUacW76I+z4yY8Dk89B3qQKRgN8vBbIHXFeVVqtxu1qNapKL1Y8QRLtJXDFTwKY0oMfzkb13EjuK2ldNJbnNTq890c14lCppMm3qCTk1S8WzAaTKVzgDqO2a+kySulWTseJm2FboODdkj57upz5pUqflLAk96q31wkbMqEmTcev6V+94aqnScUfi1anPmTavY+Xr5t/wAevDMbZDBiSw6dQKrXMjt+0F4dMuVwq7QenJ5r4/xJvVwMYo+98MLqVV9fyZ+pumrILWIYJ+RRgduKn05i2n2pJI3RAkDvx0r+fbeybUUfpns23FyevVlpEIBVm+YPg/h2pwKKULA7g3GOxq6c4yd5HbCrDVwVyfcdmQRgkDA9vWkA8sbyThSTgdvauijObaVPuc+IjKMOeR4F43+bVJGdgu0sQT6+9O8aHOoTZyRkFT/Sv2rhSV6Nnufj3EUlCopLd3t6nn0bdD1BbJpQ2WAzjBB+lff1KMU1Jbnx2BrXqunN69T5T+JPyfFnwQ3Kg3qkHHLZPNM+KEmfir4Jxk41BAfbnnFfNceuTy20en4n3fh9JRxM5S66W+8/VjwtM39kWJBH+pXIPc4qj4XO3R7LqSY1x7cV+AwSjLlb16n6bhrQuoLU7cSFj83Cq3GO1Z/m5jO8khm4A/rRKTtdO92dVWCm0pOzLySA784LDg1RONowxBLHIFdim2kmyatKNKLlf8Dybx6SZyGY44B9uaj8buJLpQXIKjkHvX6jwnVbSmtj8u4jw7m+V7nmW9SSWGGBGT6fSmFApY7jt5HHev0SpZ2UWfC0oyhFxktendnyh8X3c/EPwTCSWP8AaUZIPUDPWqvxZZx8VfAr7iFa8UNXh8ZVZQy1xfc+38P8E4Y114vVo/T3wcyppFjnIT7OvJ64x3qv4XmP9kWmwjLWqEA/xcV/P88Ra3LsfqeHoSbk0zrLhgkgPJ3ZwD6Co5MOpI5OBtPpW7r8j5X1MVh5KKcNtmNbaVwAQzDOfWqZlOQMnIxjPeilVULyWpq8MlK0XsYWvaMmrBASflBwD2reWUMGGCeQfp6V15fnVXDzTgY4/KaeLX7xnlE/w/VyRHI2N45PevW22BUBBGScfWvfp8bYlK6Pn6vCuFjdS07WR8ieLP2d7PxH4g0jWpbyQNpFysiqBw3PPevq92G4HYcDGD9OtZYri2vjIOlU+ErLcip4ap7ahvaz0MrQdP8A7Ptbe3BIEaqMntjrW1uYgKnIY9T3zXzXIp6RPoaFZRSUtVfUkBIOGYkE7celQFyNqg5PIIPpTqVGo27HOmqU+SKsmLcuqRkrnuuR2HrVaVgqylzkMpBrtp1nKSb2HiYyVLTzPjL4igHU7kgkL5rMT65pPiEV/teYOxwHIUe9ftvDrSoWtdH43nfLVrKL0ae55QvDbtxIY557VBJLsbJJOGJHoK+oo4ht8i0PAeDjOSk3qvxNSKbDLlicHkHt6VjrdqSvOCOCD3PareKfK29zmnQpqrzU9kjroEacFkYcYzj9KoWF2AHCOQdoUE9q851L8sY/idsISqT5566bl43FxYkoTgdRk8Nmsq6mluFZckkEEEmulNtrnOmnRioOrfXZDpZFJ3YBY4yPWsdpWcum4hojzjuKKNpq09jltKjFSS9/UuvLsODIScDH9KzmmO0ZJOeCB2xRCheS1sRUdRQs3ctmVQynJPUfX3rO85D/ABEhep9a5aqirt6MVPENJRS5osdNIVkO0nD4JHrUDeWdsgPzAEH39q6Kbi4OLVjSs7zTWll0/ARpCVJHHzHA7n2qu6sgXbwGzg9xVQqrSCOSn7SjSdRrmcibzFj2buOhHsazwznBDEY4J9c1TqJNdzX6+8RGPJDpqa8cqMwG7I27gG71SjwZE3McLIAQO4rnk4um5tmtConXVCMdF/VzXjYAMqnnIJOKr/aMsBHwu4D6iqjJ2SaOeUp0pSfSTLRwApHJ3ZJPaqv7xivzEc5BHetnUurXOmFWTnFz1XYnXLMRyDjqD19qp7nRyoyCWBBp1IylBNMipWbbUY28iVyfMCqRtIyCP1zQSdiluGLEfnWcoq1pb9xxgmvaX0tsZhC52qh2sSQT6VYIbzCc52jO30zWqbXurc2hOnUkvZ2WjRSGAgJAG4kAClkfcQAhAHGfSs3F1G29DlwlWOGqKKV0+pTdkEgBfC8gAdDmq7BfNc8hkA2k9DUSa5U2dGJVOdT2NrPdEglLEBiNm8jA7VUyy5fI3DJyPWtZuNm0HtkoRlf3tjVjlHBB/wBX1PrWeshQdR8yjGO5rGNS7vE1lNKlzS3/ACNYSqw2szAsOlZhuDkKOVHr/SmrytJKxhgpp3hLW3Xvc2re6dNzbvukAEd/rWMLgKnJ+9nGKmE237p34fDxcHyu1nod/ZarFIipJkyAg57GvPftLxMrI5Cgf5FTODc1NytbQ7YWUIvtf5nqplDR7twYHHHrXE2GsKqpHM2WR+COw96hzcZrseY6qUWrat2+TN++teTLFgrJtyPQeopBcZVXWUN8+AB2HoauM046arocKtGDhF2d7MxQFJcZychQGrSuIUlZmiyHOBgf0q54hWUo6NF4ejBQlRnrdO7KsaAhMqMgDmiGWMhl6MzAAn+VeF7Kzuup1zxa5FCVrr9S9ArK6Z+5nj3PrSeaVC5YjecA+n1rWk+aFrESi5NLdtl9QGPlhsEkEk9qqLMobnORgg+tayTSU46PojqVBRp8lR6al0AA4Ay+MhT3piXKOQRg8AZH86xnWbspKzREpwVOME7rv/mXAIyIyykneQRUH2jYmGckAkjHf60+VRej3KpQVaEm1qkaaEOMA7SpIPtWd9oBTcuQ23IB9a6KUlGd1uckaKVJ82sTa24XbkhsE57VlfbFJVQxzk5JPWo54p6lKShJU1ojTRkjYbvuleAO/vWI92SMKeOmT2rSykmm9SIV6aq2krv+tTdO0gE4DMwH41gC8YuN79ApA9adOUuW03odbdOU4unHZ7m63l7z1yDkg9DWA18zNhTzuJA9KmjQtHng7HVWnCdV23N6R1ZVCjBCkjHeueN1wRv64GR2qIQmkmtjx69bnd0vev8AkbqXQLBdmAzDmucN4ykMrfMR1PTHpUTotRTZ6uGqqo+V6M6oOoJKtlQwzjtXLpelioDYZSCR61rCktL9CadBVIty3V2dzabWQng8gkntXNwarsBDHDlSAB3qqlCDalc82FOrKrypb99jpiFiUDBJJzgY4rnYtQZyZS5GMKAPbqa2qySkki6OGioySei0NqcxMUQYDsTkegrLecEEFiGJJBPaueEkkk0ddSzg3a601RBKhKoYiDyQRnp9KasgZOn3RyDXVNSpybX3HHFU6tOMld7pFc+YgwchkA/D2rS3RyLzkgjnPeueDTleWh3xyqUKTcXdsyzOyn5jkORgH1q7IkPKgdMnJ+lGIaVmmKhVvC0Y3a3XoYEzyGUN5nHIA9eOKsyqu9QT0IGfT6VwJScbpHRJyaXMrx/K4izPtbnOADg9uOaRo2QkD5sZyR3/APr10OSk046mE8So+7ayR5j8VIfP0Pz36xKDge3NdV4utFvtGuYdoAVCc46cVrSgpJ06n2jkhWnhq8cRTXw/ie9fsx699v8AClvA8rCOJRhc8r9ea8Y/ZU1n7Le3uiPIQvnYye3Oa/nHiXBPDY2VNbM/pb61TxWBp4mnrK136n6NqxVQSxCryQO4qrHcAxrgkAnB968Fwkmk9bHDGnBySbs7XJLtQbaVOxQkE9qQuCrhlOCOPpit411Cok/QzxGGbgopaang3hjwp9l8Y6lqoTImkABI4HPavarW1hilLlD80nOO2a2zLFObi5bbE5FB0aLpR2vc1kDmP5OTG3QU1ZQCeo2jivPWIdrxR01KSqtwjoTo0md3mHhsECqjSlVyG45wfStVTbja5EOWnU9nF6I8w+IN4Qhh3EbsDArmvGN6bnUGV+cHAA7Y6mv1HhLBcslJq5+c8Y4lzUlF2T0PPvLIDOMgDIIA61PIxiRwuTu6g/pX6rCpKyg1dH55RwqTveysfL8E7Wvxu00nIExA/I8CqursLT4u6FdOSA9yij2yea+T8T6HtMDGcVa2x+keD2JUJVadR8zP1W0R82NpuJKsAee3FVvD0ySaVauRwYgfwxX4G6l9Fuz9OrKUKicJHVfKdu1iBgYxWYbjew2uRjIOe1OMnG0W1czjSlUk4wVr9TQZ125BPQgj1rOeZSoC4IBOB6n1onXgpcr0Zz00nNxe609TyHxc++/fb1x0+tQeLX/00kHncCc/zr9j4NqJU1FbI/J+IY3qSqLTucHqm1NOvMqCRASD6nvVbXZA2n3mxtu2B+R3GK/TcNQ99SfRnx2PqWoy63S0PK/2ZMv448USAZ2XYwfrVz9lm2B8TeJZ85Bv2JxX4t4kuLzJSi9UfvXA9J0sihUe7f8AkfotCC0aYbBUAZ9aZCw2gD7pYDHpXwdWpFS5mdVbklJJK36l7fkZ8zDA4YjtUG/byMAqCcHv9a0+stpTitzNRnTaW4zUHAspBk4KEg+lZWryFNOuiWJIQk+wI7V25fJzxCpz0ucWaxaw/PLR9j58125+a8BySQ3WsDV76NvtYBbdsPTsR0r97yai4Uos/H8xzFc06Sd2lqeIfAJ8fGHxC+Tu3gE+/wD+qqP7PkoPxc8RSbwUEpQr618F4rc860Yy00P2Pw+UZ5QmnrfY/U+zxJCCeoweKgsLlBEiKwAIHJ+lflFWLk00e3hpW0btqX85IxnapJwe9N+0o6k7jk9aitGTg7aNGlODp1eZO7G3EhNq5LEfIy4P6Gql/cIbN13/AHVJHt9a7MFOEaim9jnzKnVnRkkz5n8R3QF/K2RkSEEH61ieI7hVvpuQQZSCT3xX7flVZOmnFaH43WgpNyl0Z8/fHi4z4VcIcsk64z3571zHx4vJD4eijVsK92gJ9R6GvosROpHDTk9kjzsnp06WZ0r6uTPvz9n4j/hXujEtkm0TGPXFV/gEuz4f6LvLKxsYzz9P6V/K+Ek/bTm3rdn7znMrVlLo/wAD2wsB8rHJ5JI96oSzYLdcDnPpXurGSs4wPI5G42UboglZgWYuDySCfaq0gVF2xkAAHC+vtVxx7jrJHZhYNL3FrdHnfxM1RxYw5YjyyQAKwPicT9gjGCDk/j619vwilKbUFufDcWYuNGSk97nhlzqzPDJGHUuVYEN/F9axZUwsknAwCeK/YqSk3GT0PzzFYyVPm093/M8h/Z2hkPxx8SbsjzHQjB6D0Fan7On/ACWLxCOpkcg4/hwev5V+LeKdaKxcZSP1ngGi3lb5O5+oar+7+8AQDzSwn90AzZwAQT3r855uSSqW6H09HERsoxX/AAStdsiomQS2CDjv0ouACoGcNjIxU06tk5dDKryyqJrRspM2IZJOgMTAjufSnv8A8e0+M5A/MY7UQpuUlBPS5w46PLRcnK9z5l17P9o3IYg7pCB7Vf1mBW1GSR16y9B39K/oTIeaNKKbPxHMMNTdafNLRnPxoPJ2hiQcfhVtYiNu5icnGOwz1r6alU5aj1ukeBVnSlNRi9rFZVQYIBJyRz2xVhUIXDA/NyKpwU9loVSxMYydTm94jwJAUIyVOMH3pkWS2CxBL4I9a7MVaNNX+Z04Wr7SfMtWuokihGJViC6nNOlY7hvBIDDPt7Vyq8m4o9fDNwfOorXYZvO3DgFpDjI7YpV6DgcAkD3NclFqElJk18C6lO8t1r6k0T8DDcoQMn1rIkl2sMvhWOBjv7160VytTSPP9pzxVOWjOhSYbF3ddwJx0UVhee4PynoCMDv6VrNykk9kbpRUHCfxJGy90U4jc9SQT254rE85mT58nGMAmnVm5Ss9jChOdlKna7X32OB+MMofwRrI3gK9s6k46DHWsj4vzn/hB9WVTwISCB7DpV4aDUmltZkSxbnVpznDr/keh/sf3LJ4DtZEYABm49MdKy/2P2K/D+zBPzybgSe3Nfy7xFXax81Huf0oox9jTb191H3nZa0qyobhQ3YA9/b6Vx+4q3yscoep7mvMWLdJrm1Zh7BN8z22PSdWksbu3jns0CydwK89/tMxbQrsC3B5PNejPOaVdunKNmup59Cbo6RWxV8SyRHTZI5jtDccdU9/8muP8W3rDS52djkcZHvXdw9JfWVFO7PNznmnD2iVjyy90/bM8sVwHGSAfUVyD6zPG7FCcFjx6V/QWAxUp01BI/Hq9H2VZuUtNTwHUJdnx98NDcfmYkE9RjriqV5rVpefHDw0jQgXgYMHHUn09q+c8RHKWBjTXQ+98LIuNSrUTupaH6vaTMJLC2+U/LGuCPpWdozH7BCSSCQuQe1fz77RJWaP0rDKTm7dDodylwOhycj0qssm4njhRgN/erNQW7fU5KlPkqJSVkXgTtAIJG0k57VXaQqgXI3YAJNehQqpSvbU6q9BL4nvseGeNHLX8uGJO7hfWl8XlRqDhs5XJAr9n4SrKNNOx+TcR01zJt3tqcJKmACFw7cnHfFSTMpG3ODk191Tkpqz7nx8kpVFKO63/Q+RPiW7L8WvBPAwbpQSfTPFP+JpJ+KfgvaAd18oJJ6YrwuOJ8uXtRPqfDqmni5yk72T+R+pPhZkXSLJskIYFwP7vFVfDDj+yLEd1hTIPfiv53w8XOftD9fULtKL2/E7APuJLAEdQB2qmJDkquQWJwRWdatJpSS2Nq8k5RS3Le9SCMkbm5qsSyK3Tjqa1hOSldFSquLSmzynxxj7WH52lQCT29qqeOHVp0PIXknHf61+scGYlSg4vofknFqk6nMtehwbP5ZYM4EQA2qO1VG+YoFwdpBJ7EV+n4eUeS7PksVQajCV7o+Svi5IX+J/goKDtW9Un3PqKX4st5XxN8FOzYU36kqO2T3rwuN5xeAu0fU+HdSMsVOMnZ2P0w8IvnRrINk7Yhz6DAo8GSK2iWm3HECkE/Sv5uk3CXNLZn6qsS5Nwei0/A7GIqQmMj5SRnvUBZcEhzuKkc126TSUVY0jXVKNp63IHX5yMjBckA9vWo7jLKrAHhiM+groppzvT673MI804tcy5UebeNfiXpPgZk/tGCd1lUMogUnp64zXFfEm3hnkQSKSxQAA/wBa+j4d4fji3e/U+bzfiZYKPLGPN87MyD+0r4Pwxe1vspgkNEQR/n6V5M2i2+9t6KOucDpX2P8AqK27xmkvT/gnh0eOYcri6TuvP/gHqh/aX8IADNtd5yML5bc/WvGJ9DtzhEUZc4G0dqyXATStzrvt/wAE6KXiHBwu6Noq/X/gHtLftLeDVUD7NeAhuSYzXhN14bZY2/0ciMMO3WsI8BqNRRdRW9P+Cc0uO4uCVOi9fP8A4B7gf2mfBhCFYLovnAxGePrXzufDpWONBGQAxIBHSuuXBFNOUnPT0/4JGD46suSdF37X/wCAfS2mftB+E9bma2toplfbjLqRivmq30GW1LyRxMOMhlHWqfB0ZTioTXKarjKKpSbg7+ux2/jXVIdQvZJ4ekjMQR39K5VYJXVS+Q8fKg9/evu8qwCoU+S90fG1cQsTUjVprd6nM3m0KGznCjIPUGrN/CCnIJDk4Pr65r02mpWa1OHEUVKXNLbbQ5+SXzX4yNpADHv71FKuHWNOCCAT60nNKOhtUUozUYWXT1OgtPO8yNVYkSAdO1U7bUWhlj3thkQAY7VhJqVPmS1MJOaqwbdvkbxnFspWdAHIPAPI9Kx3mS5csTkgDJPfNbUq0YpORv7KdT3WhWkGPNDk4OAR39c1TkiVhngHbg+/1pzqpy5rabHLQqRw8fZ7yd7/AKDd4ZSqnG9xgiqrBNiKuQUJBI7YpYmvJwVuhjQpqo5O7tIVSQrLk5YkgDv61SYv5i4kJOSFI7VK5pvmlsZUVOhT9lFb9TZjliK42gNuxgfTrWQk5QrngooJZe5pVL8tmy8PRpSlo9WacjhFD5+VAeDVBZy6fMSdwYc96ihTcWnJ7nNVpyad1dqyRIHXK45A5AXvVQS4+aQnHTaO1aNq93v2NnWtCMJ2trqW0kYyEjI55U9qom45jxgEglvYVlU5uRtbovBKMpcze+n9M1lmTGByN2WA9ay1kAGD8yux5rKylHmmzslBQkpJXRuCZT90jqMD+77iseOTZHlXO7cTjsPQ11+6vcjvY4KLanKdNWfb8jcD7TtIBLAkAdqyPtQjYKQSwIOfWnNWSTR1TqSmnKas9NTXdnO0ggL1IPasj7Zyodm39h6Cqk29EtTlhSlOfLF6aNeReBjLDG7DMBn0wKzPPMbAq5BduhPetJ0JOCa0COJjSm0o6IvTEiPuxLEAVCJ1fGGzlwCR0/Cs40nK99kaVKnNTSv7zfXoV3UqeRgswAxT5WVSSzZbJyB2p0aMErrVkuEpQd1rda+hWkCsRgEsFYHIqQEErg4Z8kk9TVWSWiOpTm5qm1rvcz5MgjbwoGfrir7pvUnOPLUnBHrXNCTejXUmoqaSklbVXfcyWkGQm85ds5HbFV5kYglX53D8adaEm+WWxvBRbUaatrf1HNKj+WwbAGcsf1rO+YOCxATcQQO9RRkoK8drkOu3X5ZLbr+aL/mK5BJICDJA9O1VjkLuDkEdB60oQhJWb2O2snFupTWhaSY4O8kZbg+lUHl3Iux8fOAc+1VOTS5FucsoqcPaN6/5HRWeqSQ7i4OwAEkVzEc5IR2Y7m4we9YOpFSae5i6brqLWl/0PUbW+WUBlfKhiVPccc151a30kLFtxUBxk+tZVYSmubY2oSVNuCWr+47GK42geYSTkDj9KzBMQiAsSAckHv71DlZO5zNQm1FPXs0bgvNp2NkncQfYVkrOSByCXHAPb2p0IqezMsxjKg+aD06I20ui2eSOvB7iqSFCpfzANuSSf4R61EIKckgqe7RUJ636+pqLcpmMLnsQPX2rHd2BCpnAcFW+tdMKaUeaWplhsRSjV5Yr19O5sG8GQMADoTnp71iuzoqvuO4Agk1lGydrWdzujNqSqKV4rWxtLcnOAzYBA5Nc5HcBeSwCg7ia0aSvpqOnL2tRSUvde5vyagMqpXnLAH1rmPtL5BByOSSe2azVNyjZ7m+KcYu7ei6m4bxlKKSSOTgHrXPrcqv+sJL7MAjoKKitFpq7ucsaaU1Vg7JLf/gHQvexngcOAQT+HGK583SsiNjIDE8jrWFC0E4zR6VeUl7y2e3/AAxtC7EgjOSdx4x1BNZSTqoA7YIJ9K64zTi7axMMJBKo3W3tc2FumQfMWI+U/XFZcUylyjyEkEEA1pTwymk2tDkhifZycbaPVeRqTzMWUAYxwB65qqrgoCNxyxBJpYdxcuVoqMZNqUJa3LvnuWRUcb1++O9RBt/OMlSCD6VzU48sbX3OnFwjCUuR+91LcNyxbO7IVgQP6VXJ5j34G5SSR2/+vWzilFRmZfXpp8sXo1obS3AXyxyAWOCO31qjCrPtOejAgGhyik5NHTKlzx5W0nbuawmcrJli2BkZ74psMaM5IXBXAI9fSrw0IStJnm4qc3Dki9bGjHMzqhZCC6gmrkKkD7uR1z6Cpq6vmijowrlKKo1dkSxKevRTwB6ZqwiEDaXBznv2rKortcuzPQo3lBqSu/0KzRhg3BBDgHPerQjDKWBIySMikqTpRSkzieLUpuNN69/IxZV8xiP4VODnpWn5OOOcFhzThR6rf8jGjaSlTWnW5mCM5GTnB+79KvlVSVS2OMgmpg7Rv1LhByapz23uzG1K1NxZShh8rRsAK2thkjlBAKckH0NRGuoNVOxWZwbgowWp4N8G9QfQPiXd2cjlUnmwoPGMmuZ1Sd/D3xH028d9qy3K5PpzX554pZZzUo4pLU/XPCDMFXoVMDV1a2P1qsro3FtHIhPzIATnpxzXLeENSF7o9rNkkyQqcHvxx61+JQnaKS3Z9s8JCEm2r2O5372HzYAwBmqeC/ygnIwQf8K2qqdlzPQydSLalHruaiuvIbhycAn+VZ+/cVIBIGAc96x9q7OK6GdKDi2n1LSsofaxJwSQfWoopN7hCCOpBNdWJh7iT0FgYt3urtMguZzDbSbmzwSM/wANZHiK6+z6dMzHDdie9a5Zg5VsSop6nFm+KVPCvlV3d/ieN6tMxu5WYklnYZ9Oazbi5E0r/KcMxyT71+95HhnTpxdrH5Pj8U6sJRUfn6ELFNpJyJDwM+9RCTcRtc5UgYNfSe0UL2dz56nFSg29HY+WPiwH07xVoOpgAGG8U5B64Peuj+NWmvPpf26LmWyl8wY7YxmufO8M8Xl0qcVruepwDnEcvzKEqu09D9APAd6L/wAM6dcb9y+TGRz7V41+zh4ti1vwnaWxl3TQKAQe5r+aqN6MvZTWqP6Bx9GTbrxfuv8AI+m2bbjg5JPTtSbgx5bJU5APTmsq2GipczerPNo1nCXNAEIK8EFmIAA65NCHa7FVyWwc+tcbpwk+fdk4hTqX5Xb9TyjxpblHEqty3HPevQ9b0WLVYhGxBIBAAr9E4VziNG0ZaNHwuc5FVqwfLsfJ/izUTa6HfTbuBCwIPbAr1fWfhTFrEBtbiRxbS5Dqp5YV+j4bivDU4+0i7nxb4Wr1ZLm0219DzX9lLw9Pb6de6tPEwa+vJJFLdx2r6n8HeGrPw3p9vYWKbIoAQox0r8Yz7HVMZiZV1sz9zwlaFPB08M9ofidxbAqvByuVDe5HrSBtrAliAQA3vXjpqzSepjS95OTdmiWVgCMjI5UgVWmdD8ysRlu/atowaWq0OenJzupbM5fxdfC30a5beQzKygHqMVwfxN1gQ2qWoP3VOcd89a+p4cyydWupLZM+dz7GtpQT2PDNUvC4nbcQWBORWTcq1xE4QEl93Br9xwTcIqN9j8nzKFKWIUpLV7nl/wCztOG+LHiBNxLhyoB7gnmsD4JTvpfxqvYNxH2lgFz/ABHNfmvism60KiP3Hw8qxeVyhF2Sa+4/V61fCoW4BxwO2PSq1rIvlQ8knj9e9fltWm9HFaHq0K1OmnLmurmh5rIM7jzkAjtTGUEbiRgcgfzrjxLmpWTujphjoyblF66Ed7ITbSjJ+4QffikKgxnJJEqnGe3tWdGpyy5nqrmePTlFwva6Pk/xM0jX83oJGBI7ZNen+JvBU93ctNbtjzGYkHv61+zZFndGNOMW7H5bm+TynJK3/BufBnxkim1I6JoNtuee/v41Kjr15/IV9YaH8Fftfiy08Q644k+wkiCIj7pPQmu3iHjFUMG6dLVyOnhThal9beJqpqMNl3fe57l8MdPm0bwfpVmRtaKzQc/QV2fkLZWqQA/uwo2he2K/DaEZt87V/I/VatSFWtF2sMEvO4sS2SQD06VUJXKAbh147N7Gu6PM9U7XOl0ItOCRJJcMdpGcqxx7VCWQZ4OQ2BjsampWV0nuefDBRd3Dc8s+JLvLZxKowFycjtT/AB64EKb8DnHXrX3XCkpQnZ9T8+4roRUW0uh89zjEUjqRtVTn16UavMiwzGIkb1PI7/Wv2rCyc6a0PyjGOaSk3p+Z5F+zxIF+L3iMBiFDqfzJ4NYf7Od2r/GLxIiqRmQbj6jFfjXim+Ssk1qfu/ASlVya0tr6H6vxTZVckkEADNY6XOI0ADc8DHavy5uXKrqx72HrzcFCK0RqtcI+c4BAPHpWOm8tjklienbPrXfTkoxTXU4pVL3k9XfcvO6+TLycMpwR2psyYt5I1yQFOT61g8c1JJLQ4MwSUFGD76ngWrMPttwckqrsBnvVDWp/9PnXkDeT9a/oThqrP2UZJaH4dnqU60qL0fcriVY8qD1+YE9h61khtrFi5IJ4X1r6615aanzmtN8u99y/NOFZSrDAYDmsmSY/NjJBBIX0pRg4Wvsz0HhoTcJT05diSS6bKngbGODjp7VleYeTglRkkjsa6pSTjZLQ7K0IqPM99tOxqvdFhnAOBnFUY1AQDnJB4PbNcCxLhJtFuurKL0XmaKXJYbuQFByf6VkqxG1FBBGcjsaupSlJczOtYvlipw1fYS5u1STJyVGSM1k3TYlwMEZ4B7elOhUm42buiatJ1qib0b3Lwv8AK8glXJI9RWGZsOXYnqDgdq7KnNKCit2cXtYxST2u0bguzw+Tt2g4HeqEDgLzklug9PauSte6e1jf6nGSi4K7POvjDNv8E6svzL+5Yk+g96h+MaZ8GasAQQ1q4OOor0MJXU6Mnaxy/VpPGwhH4U0ehfsfEv8AD60KNl2kIGe4p37IGE+Hljjh/NbIHpxjNfy1xHKbx04pbs/pDHYdQw9NrTQ+wzG0YKkkjI61PIPkjKkk4yM14c4NtOW6DljyJN6mZIvO8nO3AHtU8yklSeRg7vfFXOSjFOLCniHJKLWqOJ8YOzaVIxxswCcdTUfi7a2lTFXIKEEA9K9vhSXJiYqW7PC4kcalNqMbPU+dpjvmfB4bO32qvJKDMWORtA6d6/pDBQlGipt7H4pVjeXJJas+YDLH/wANC+HTvIyeQO/0/rVaQoP2gvD2FzskB49e1fL+JUUsHFp20P0XwucIqo5bq5+weiyn7BaYOSUXr3qvoRYWFt82QIlAJ7Cv599pZczR917SXtW1pGR0SH5wMnIPA9aiLDap5JLYBqpVOeVrBOM3bmZpIrYG4DBwKYlyvlYk+YqCST1FdWHpOckoirc0JKMvhS3PA/GlwBqTt0BlIx/I1a8W2kF1qcvlPhDyA3YdxX7jwk1SpqnJdD8n4inKScku/wBxwW4u53E4GR9TT2tXhBRv7xx719c5W0TPAo1XOi52u9kfI3xLYj4peCwDwupKQO596d8S2Vfil4KdsAtfBee9ebx2k8u5F2PovDKlXdeU5r3dT9Q/CjbtIsDgkeQnTvxzTPCUoGjWR2niBQfbiv5rk0pJQ2Z+wU8O6UXFO7OkkXDIFJAXkEdqZ8xA+ckucgnsK6HQikpPoVRw80k2++hIZHwMAHOCTn0qMMo6HBYEnPesKdVNWW5zYid2urPI/G7H7TgEjI5PrS+OGCzZViDwMHvX69wReykfmnE6n7R0U7Lc83aVcoFyMsAAKrEeWQDk/Lk+wz0r9NUk1bsfGRhPmaqfCfJ3xyka08YeErsoAsepR5x35qf9pSFobLS9SwR9lu1JYfw89a87PsP7fASTPf4Rxzp5gqUYfPufov4CuPO8OaWxOGeNRkfQVx/wV1ZNV8DaRIp3H7MgDA+wzX824iLjNqR+yxU5zUJKz/yPb4jtHzKDg4LDvn0qGIsqAdAGJJPtUe2XxIwTWsG72LzHCdOgI471VkPyhVbAYnP+FdWHm3dt3OahHlSUNjwr4iAee3LDgDPp9K6H4g6fJPa/aIgSEXn3r9H4QzKk5KmtGfA8SZZKEHWSu72/4J87TTsoaNRn5jkkdaJ8x7wyhZOeT3Jr9Zw0rQ5Vqz87qym66c3ZR19TyO5+IN5pPj7RvD2xWtNQmVWJHJ5rBh8LXXiL4u6XLHEzW2mMGkYdFJ6V83xpjo0MOlTfvP8AM+54SwscQ3KtHToz9CdN0PTr21glMKnzEBxj2roNAgNpZW8R5wigY78V+LUc6xMV7NvfqfobyfCSXMvLQyB4Q0wHm3QE43ZArrJD8yAYyrYPsO9aPOsRJpRbsT/Y9FqVRrVHGXHhPSooJGWBAQjcY6VvapILaylYgldjHnqK9HDZlXclFPQ87EYGi4NRWh8i+IkhtL6eOM7R5gAGOnPNYfi/UWGozv8AMBvYEjqRX7PkU17FX1dz83x9F0k+R2Rz2oSR7CAPl3E4rlr67fqzggg5xX0FOHNJNnhpKLvJ2uNmCqFlCkjJ4HXj0rGmuyFUZPAJ69KG25NSWnQ3hVdSk5K3uk8kilwUfo3IPWsP7UxbeQNwJOR29axjFtXaMPrFOU1Re26OrjkACgttIxn3rCt5w7gkNkMckdTWVOmkrGftpxq2Wi7HUnb1LZLDJX0qlFOTGcLnAKnPf61r7GSXK2XCEFJOT0ILg7GBQHAJOD3p08icYB/d9Sff0q8O1J2POrXc5ScrJfkUcMgjYYBDgEHqBSjIGck9wDV1ZRkrdUduEimlNvSW36ApBbGDguRn0qHftOMENuJNcqnNyul0N/qsaKUpO+r+Qss22UgsSuBgcVUmJYbmydoI+lODUkufcxq1JVIuMXZfncRpSXGSSGYgA9veqbyKm8ncANpBHrVU6kZxshSy9xk2/IvI4dgQPmBwfYVTEwVww5Xg5/vVc4a863fQMNQlGcYys0+pfMowOpwwAHpVRZM5ZSQpGSDSw0YRbl+AqtWsl7J9y555UYd856Y7+oNZZuA0nHJbKgEenWuazcn0sbSi3WUqdrW/E0kmO4LI55XGfSsnz97jkl1BIWt3zumnJnRgow5nyKz69TXWQl1+YgcAk/Ss37QuMMfmAPA60o4iSXJA5XQca7q9fzNbeAVBJ27gAT7VnxygBULkkbeT3rWdRqKUtR0qMHNKMraX+ZpeaV2gAbeqkd8+tQ+YQSu4EHBJ/lW1Oq1rI57RqS5W9f61LJl3MGYDG3BB71VWURMnTG/v70qKUad4rY56jcajU3o9vkX+jRsDhiRgntmgOu3a2SEznPfNc1VRs4P1PTd6Nqij7z/AsswYbs5LDJA9qpyScqQcRrnPPT/61OMI2U5O3kcqr1KzdJO6T36FKVVBO0kqxAyR09qHeNgYxydwOT7+lKbTabPRniOWPMtlbQyJUlyoDEBRwB3qWXceWUqvQY6H3qalH3bR2OPEYq01Vcb2WnzKYz03EEdD6GneWgxtYfLkkHqawdVRkk+hpUrVpUuSls/wKoV8KpfJBLA/4+9SSnaAoGQM856+1aSnKctFp+ZX1Tlo+05tVr9xVLlvmBHy5Iz3qHEY2g5+8SQKydKcVZLyIVRKrCctE1f+vUkknQt5eCAQDg/rVWdgwYEHqSCOvFVFqFO09L9TqrYiM5+8nbZHW+duK5bG/wBO1UrcZO4MRtbJB6GvPdKUHp0HXzOFROKTu3v2NOF/mU7t3zHBPYUiRnOdwVW5x6mnGu4xtE82WHdRqnLVt6Ggs4ZSrSEcgVAkTmVCxBzkEemK3VeKXOkbQTu6dVbGkJRuj2gnqWz39c0qYjIIH31OQe+KvBzVROHc5JxhQnzLZ2sVpt4OA4IOAoIqS4wVjbkNg4Hp9auEJRm0zWLqxqJNaGGXZTyPvSA8dKu+TnnJKSZHHbFFKUV70dx8kYzuo2bZA3ReoUkmrCwiRolBwisQc1nUsvfk7HZCvKcHTa0KO3GG3YG7HHcnoDV6OBg7KeduSPfmqqqbaSfmcGGxnK5KO70t/XcpquRguc7s89604U2hs4wSOT29zXRON2kjfGUYuPPze9G2hFbwsWAxnDcA55rWVP3YdMZU557+9ZJN2gbK7lGpPZ7IqrGWdSWGQ5BAHUVpgbijnA28ZraGtOUdjKvVnCspP5fqQrE6sAn3ZBk+3tWjGpMasWIAYErXLVajNRauyqEJRpuUnu/6ZWjHmAYXAyDzV2PqQo3BcE57VpO7agysPh5purVJRbq7ZcBimSCO9SxOFXeTxkgAHr6Vm1KTUYvRHJTxMYzb5Xbu/MseRhAR1OMDHQ1NFI8jg/dVSAc1Eqqkk2rHdiaVKo1y7ksC/MA4O4MCcdwaniU7wWYEAgk+p9K6Kq0vc4oY+qp8ko2iuvkXlkCrgAlXBGQaquxxuUAE5Iz0FOF4x5k7m1Sr7dKmtLl+KRN0SBiPlwAe9VEk+6AMYXOewNLEVHF7G1O0HBJbXNxSoVRwAH5z3rL+0CQAZx85IrOzi7vXQdWsqrSg7K5bmZFy+SSGJA9KqvJ5gwpznBGehFZUIKSSbsjaOJcFKKje25AxUKckkjnPrxTXRiAc4KNjntWlS0J8yexnhq0ppuEf+AOXDKVDkBm6+v1qusgwrFvl34b0FYVGmtEc9H3oynfXY+dfi/arbXen6pyGgulP1OeDXV/GCz+1aI8ykFlxx/OssbGGJwsqUkejwzjZ4DH06kJXb0a2Vj7E+DmspqPhTTXDFgbdc885AFeRfsz699o8ORQPhvJ+UD06ZBr+WsZhPZ15UorZn9H4qDqqNSGz1+8+yVlYqW7jqT29KzYbhpHC9FYjmorRaace55bp2aildM12JxtB+cHjHeqqvtG3PRqzlh+Vqd9UbRrKS5JdCyCVZck8dcd+KrlhtBLk9QParqS5lzRNKd4RSjqn1OH8cXzRWoj7OcYP9a5PxpdmW6NurkKGA+lfoHCOXttTkj4jiXGwjNRg7M4qS4DumMk85A/WkghYxjggg8g1+y0IqmnF6XR+b4qFRzjO+qbsS7i7hASGyDk9OcVfRckKSCGIBFVQw15X7s58Ti40+WG7kzkPFejDVtLuLRlDbo2BWunmkSJ3U8gHLD19q64VqlJXjuTXwsK0pcmjjqfMfwi8YS/DXxfJot9IY7G5uTtznA5q78RvCIvpl1G0O25RywYdq+E4n4HePf1ig+Wfofd8LeJaoYf6hjl7iej8z9JdJ1q11OyhubaQNGyqwYd8ivzp+HPxr13wY8Ola7E8lqjqBIx+6O9fleOy/E4eXsqkde5+gOdKtBOk7xf3n6aQsowSThgQQOxryPwz8XfCuvQRtDqMZkdcgMQCDxwea8iMHGSilozeNHlglUi3bQ9nT/Vs2AQT1Pase11vTriJXhu0IJyckYP61r7NKai1uc3tL03DZI6GMglCQCSoHPbAqmt1A4wkyk5BIJHNSuaHvN3ORU4VUoro9zYQogLAE9DWM2pWcMYMl2gGQCSRxWqpSa1Z31pxUeWWq8jWE6ujAE7i3U9q4a78aaLbl40vFcockLXTQwtacuWK0OeviaKhJPRW3Ouv7y3s4Xnmk+VVOQfWvnfxR47fUv3VvIVi3E8d/rX0mU8J1ZyvU0PDzDiCFOklHVGF4x1k6pqLbJMrvAIH8Irky5kkJYkk4PPrX6tleVwoQST1Pgcdmjrc0krf8EUxgrtUkKyEgjvg9KSR/LOWyAAcH0r06EnJcqZ5OMwkITUZ63t8j5dvb6Xwf8W9K1dty281wqM3YZPWup+LHhmTVrIX9qpNxatuUr1OK4uKch+vYW0H7yPe4L4mpZZiXh60b05O1z9NvCmpw6ppNleRSbllhQg18X/s6/Ge2e1h8L63c+Xd2qhQ0hxnFfz1iMJXpvkqq1n95+y1cLBRVWjaVN7W/I++jKwXplc9B2rMs9QguIo5YptySFcYIrixVGzUErtlU5qC5nHQvEgZ3DHPAFMeQM6njCtgfWuWUWkrdTo9muXnlqTkCUqNvQjI9RTVlCoDnlgcE/w11pSirJXRxYicZavQlRUj+ckALkn3x0ryH4oeP4fCXhvUbuCYG4jt3II/hOOpr18HktXF1FGGhzVsVTglFvQ9SW/trt5VWcMysV2jse9fLf7O3iy88V6PJqeoTFppbliWY9yazxOGlQqOL3R9BPCqhThJauWvofUjLnb2ORgVAki42s2WyT16+lcNSm5Ts9icRJytOL1BwArjJGGyDULyNIMMx+8cAd60TindqxzQVeMHCW3c8w+IYX7JGBxuyQPWpviBsNpCBkNk5J96+94QUpT5kfD8URhNKMz521G3ZrWfaSWSMrkfStG+5tpvL4yjgY6Div2LDSlKyWh+LZvR5OZx1tsfN37OkJX4y+JsnjeCeeme9an7PEW74v8AiR5OAsgxj+IA/wBK/HfFeLhiY36H7T4Y4tvJpRXxb2P00tYlaOEAk5YAn096tRAgR54wcHFfnlnZKJ6Xt01ab94niiGFGSXbg+9SF2jwM4OQfpmolQkm01uZVKcqclyu6/zG3SmOB9znhDiq+oy/uXO9iMH8aiFOM5RXS4VKkVTaPnrW5B9umJBLlyAR0qnrBzfzkMQ3mk49K/feGpRdKLkj8UzTESjVlKS0vYxvLf8AjABDEADt71N9xPnySWyB/OvrnWk2owR5aqKM5qWnYoSjJJHLkHbjvTrg/OE6hgfwqVKSd2+phWUeRXV+uhWZlQq5JBzyBVec/N36HGOvvV4jmUU7m1GvGTU4ppr8S6067Sc45I59Mcms6N1wpDHBY4HpXBXpOErx1PQjRpYhauze+hM8hZicngjHocCqcjZ2xqcksQCe2K2jWleMWhPD2fsoy2KtzKGkLBvmIALHtVS5ZPMDkAGNcHFdik4x5DOrBUqiha+2vZiPG3BV8u2QSaqiTLA7snggDvShUc2nHSxrik1LlSv5mrasQuDnGATjvSqSqr85BLDp/WtIcrVramlHFOMX08zzf4wsI/BWqMowfIbgnrkVQ+NLZ8D6mgYnEZGfQY5rqy9cynbszhr15qvSfLu1fU9Y/ZDIX4f6eqMScODkdOBzUX7IsqDwFYvnnGVHr61/LHEUL4+bvo2f01S/3aCnrZI+y9xJjyThARj1+tVvtIIQjOHfJH4159Sk3FRm9NzzY1I1ZucFZLoWJGyhBYnnOKquyHPz4IwRnofpXM6cWudO5vWrOCTjszgvGRB02ZM4HC59c07xoqrpcwJAVgSc9/QV9DwtBrERm92fNcTxc6HInofNk4OXIPytgEDtVe4dstuJID7hnsBX9FZcnKCTPxmtJuXslt3Pljcx/aC0Ec5SQYA6cdKjWTd+0FoTA53yYz6c9a+W8TKklhIqK6H3vhZQVT20HLTVH7DaG+dNthgkGBeD34FQaE6yaZZqpIzGAD61/PVKbk1Hsfp3RwRuKzFvvHywAMGolc7uASC5IIoi5Nc0tiqUYzUnF7KxMxfBPG44GaFeN1XOeMnmuyjU5XdMyqYhSgoT1Wx4b4ymddQbGQQwGfxpnjHY15IFzksSM9q/a+EakXSVz8qzulN1W07L8zlpbt22Z3bWJH0rPEg2btxxuHA7193CaUVZXPnN4yi9D5d+JcgPxQ8HMxJCXYwB29qrfEps/ErwgACGF8rAn3PSvJ41cpYDkWh73AdBvESi5WbX4H6geGJ9+kWLbyubdenQ8DrVPwiyjR7NSDtaBcZ7cV/NNSXI+W5+uUZTUVzPuvuOzMgDJ8xK8nJqKNkwueucAntWk6Se+ljphepDlk9eg4ysMkHOcge+agaYFsdOx9PrWlBq9pHJVxCpxXOtvxPL/HDATgliAOcn1rP8c3B8885IHHHev1Xgb3YJvqfn/E8nVcpU1ZHBSsku0tkkFcmqPnDG1vXBz3+lfq1JKDvFHwmGnNJJ99zyr40aCdb8H30caFnhQsCe1ek6hDFe2U1rMQUmBUj61pTlGUfZy+FkVq9SnNVUrOLucX+yH45S80GTw9cXBF3pcxiKMeR6V8uSXWsfBL4kr4hsVJ0K9uh5qnouT1//AF1+KcYcJVaE/b0tYbn7VkPE9HMKahzctRI/ZWNgSuSc84z0NeWfD/4jaL400a0vtOvEdzGpbDDKkjvXwrqqKTR6FSNaMuSMderPWi2QucgxsSDWXHcht5yDGwyOevrV1KCUlJ7MKNOUZRilrclureG5g8t0ym09aUThjjgKABinH93O7ZVWEK11P7jzC/8AA9jNIx8sDzGyAAOPWvRpzsC/MNvJGe2e9fQ0eIa8FaL0PMhkVJtKbsrnnWi+B9N0iczW9vGkzSElwOT7mu+VgcDOcEkH1rzMVi6+IXNNaXO/6jSw93DXYkhj8ryypPzLn6UzzdgG7tyc1y1Iyauth0oxV3U0/XyBm7kkZx0/irIv9TS1hZ5XC7MZJ75NdPsKk2ro54t07RfyOa8darHp+lSbpNsjow4718/fEnxiL53hhl/do2MV9lw5llScuaS8j57N83jFOmtzxzxFfvcXMpVyVZmOPT3rmZrrfuYkkSqSSOwr9gwOGVOSilsfl+ZYl4imltJPTzIWkdj8+CzDAx0NRKgB3hjtYECvSs7WRzVq0XPnktevmQOQUAzlmTBYD0q41sxRthO5lGCe49qhVtbsiVBOCcnZdvUxHdFcBcZc8j1NOmtyH3bT8rDGfWr9hGcXK+u6OepONJwTTb2Llq6xBQGBk4xn61RTdHKVfAweGA4NZUoOUuaT+R0ZhCacW15G9bXGccjJk+ZR3FUY1y4YHluNw/hrRTTjdbmCrVYKdGMbrc0Zp9/c5fj6VRkeR8LxkHqT2xT5U1ddNjiVCrGHI3vuTIQWCtkZODz1FU0chVCZOSdxNefV5mmkj21Rp0ppTfS9i44znDchh19qpSSnEaFiFJwAe1dWHdo2OHFUalOcXLXm1QtyGfKk9eAQaqzuHkDKxDLgHPeigoppo1xlBzjeGi/UgkkyqgkjHXPtUb7WXKk7i2SD2zWVSlFz5omkY1fYODkrXWvfyEVvLUK3zMXJJPaqe7gsThScAim6cXNO+tjpwzhOl7NqyuaKyjPzYPXkdBWQzeSyq0uckkAVk43fK3sS8NDnap6vsanmYjYgBcscsO1Z6TjIUnjsP51xObU7PVHZOnCFB1INczTJy4GDyASTkdTVRn434IyM7e2RXc5yUlc4qDpRSlB6lnziSFQYbceT6CqrnAXb9/8Aiz3rOEtG0tjjzRyUozgru+xfikVBh85JBI7A96pRuXXfuIw4yT39K1TkpcrZ6UXCclNRtG23mb0chGQARhcgnoaxUuPkBIY8tjH8qapzlK0nY5cXhVUjePTY2jdAso5+UZP1rF80nyypJxgkk1K5otozozdWCnVV+lvJdTdF44ABIIYjBFZSyI7B92QGzz/SlCUG00b1Jzc48rsnfz0NZrhiQQflkABB7VlfaNgLJgsXAYHuK1p2T5LXbOSFRJSlLRL8fM0ZZG8uNkY8nBA79M4rPMxIOxQFVSQDToUOV69TpwrhUU4rV21LcshcAEkAIR9eKpq+7A3EueBnuaz0guRPU2qxlCnGz1f4EgIwcKfvYJbvx2qNiCN2cMXAI7ZrOrh1JpLcKOIbik9PP/MifOwnoFxkevvTHkD4GCGKjJNRzXqKy0NalGdKlK0/ddkQN8xQlDt2jgnp7GkkdwVXJwxxjsauLvGVtEeVUSjyWd2iKdgSCeMAg460kwwxY5w20gDvWcKicLPY9jF1Yzj7vU6WBGV9oYFdytkVctkcKc8bmGcdxXNqlaTueTytRdSmt27/ACNGGAnBODJu4zU9u2MMwAkIAOO9bRw0Y2jB6nQsSqsedbJfkCxqFYkESMwH0Herq4LqRkqVBGKIRcFd7I41iFXm4t20/MEBRVO1txYAg96tEbQArEMSAcdga57xqty2SMZ4OUKsIT1Xcz5VLzALGSDjKj1zxirKxCQkJKQFYkE9sdK9BQUqXKzolX9nNzp+9bSxVWGKUFhgYzwe/vWkloA2CuR1onSjFKRhhqtXnbmv+H7GZ5OwIBgNuBBPer0sbfIXOApOCO1Z8skr9jslmHNNSlF6mf5TpIWU4y2TmrZhy4IYkOABmoi20o2NsRTpymq0db/hYij+YEKpBc5Yjv6VOkLoSc4UHhfX2qvZODtAwrTUIOUviuOt1BBXBGzBb+lSKrSJ5in7rYPvTqOU56dURhacfZck9bX19Rwj5kPAC4wew96WLIHUbNzZHrUyjUik0tGdNPE0Knu296OgeYQBgkbXGCO/1p4YEe45FXUinNSasc0cRGo2l0GBiUyCdxJyc8mmpE6s2XycgEDtRVdpJJ3TRrT5pNJKyuXYnCOFB6EAAf57UJg7c9VcDP0rFx1cXtYdacnBtdX+RqwhpHJUgqT0Pc1REu0cHAOSGPUVPsrpcp0Zfyxk5t69jWYDBZQRuOMDqKoG4LDAyGCAgjvilCU4tN7DnRlKrea3NYS7djtknaBjPTispJVIOTzjv2rblUfdgLF7Rn2/FFo3JfKkgDDcH36VnSShASORtGT/AEq40pJJtanP7aEoSqSemuhOtyN+NxK46jtxWQLnCsd2B8w4qKiSZjRw8k4xi/jOlS62R7xnapGSOgxXLSajsT5JCAOCPXNYuDlLlSPRoUKdOTcnqvxOlmvCPmHQgHaPWuIm1MIiysSAmc5qKlOTd+XUdOc1FRb9251X2lHXbkglgTjtXFeDvEdtrfiH+zFyQuQwHPQ15GOzOnh0lN6o9rCcP1sVF1aa93Uk8bss+i3cDghgpAJ6EV79/wAK+sL+LbcIWjkIBVu9eTLi/DQ1fTzJqcJ1puMXKzT7Hk37MGmXtnp91NMjrb3E5Kgjt6j619S+HPD9poVpHZ2sYWJFxwOnvX4nn+PWLxLqwVkj9tyvFcuEhhp9Op1sRwNxbGfl47e9Rh1XZgnaevvXlqnL4k73LhUbSg9V0NcZbDlsncFA9aihZwp3Eg9AR2qYYf7L3bMoUVzJJ6EtzMIYS7ghfLOfauW8Y6qun6bIWfDSIQADXZl+Vzr1VBb9zkzLFKjTUY/EeT6zfJNfTMWLMzEfl0rzSTVmMjFiSS5GfT0Ffv8AkuTKhSim9T8qxVRYm9SW7f5HdJqUUZxuJbjIPb3NefPqbtu25OAVIHevqOW9ro8afLOdk7W/M7s6moxhiGAOCa4H7QWwSxLPkAfWs5Vk46bozgnOo4tfPuzqLnUn3Bt25ick9jmuU3MfLO4jawVff2pOq5Oz3FVwrpxjFy33LlzMtyymdNyseAe/POfaqjByoAPzBiCD2pUarez0ubYmhGLtLfS2nQ5jU/DOnXrBvL53dh0rrYIwVCKQMAAAjp71NeEW/eMpQqRglTl5nnEfhF7f57VmUh1IKk8V6cjxjYu08N1HT8a82tl2Hm23FXsdmCzrFxiqTqOz1OUtYtdsdixatdDY2QokbH1xmux2hXIVs7Rgkjr7CuOnw7hKjXLGx6MOKsbTnywldd2QWupeJWAjbXbojJJ+Y59h9K0o3CkbcFhjC96b4WweyWp0y4lxMYucnotSS3uNTkZhdX87tgg7nOG44yM0olYhWRiAxzgdsdquPDNCLvFbHnx4kq1IKLdm+ppC6kUBfMI6cj+Kqa/fAOcljt+or0qWWUYpyijkr46u4rmn5GgG3kF2GCxIxTEORkdFOCT39a7LqNmkcuGqzd5T1RdUozE7s7RgY7VXil2lRgbjzgdvc1pSSm0+o6bjKMZSdlctlh8oUllfBJPvTNpJQxcADhT/ADFVSowaevvHNjJyhJSirrW4XNlb3Vv5MyghyQR3FWYDliWbkggZ71va00+pzzl7amklaK/E8V134aRG9j1HTGaK6QkhoyRkfh/hXuBcADLA7QeAOledisqhXjKNRJ3Z3YDOK2EahRdrWZwXhfxV8TPDaiCLVFlgi+ULKD07An/61ekRwW7x/wCrUljk47/Wvh8bwZhJ3cdD7nC8eYqafMk2tC5p3xZ8eSIUuYbcOGGG5546/lVDyIwxBADbskDp9K5qHAmHdpuTTRtieNMVGzjBPQ7GHxvrt2u+7vCDwcRjgewrlrYIuUGAWIJNd8eEaNJprVHny4srYi7lZN2uvIwfiQl74g0S5so3PmXUTKWb0NdQ8UU6EPg7CDk9/avosHh4YZ2SPPxNaVVqom7r7j51+HF98Rfhzbtp+lTwSW3mbgGB79+9e2fYoH5CAEH868jHcMYavJuW97nvVfEHFxpU1KCbjZWM1Pi98UYTxa2srZJJbIx/PpWutrbb/lUEnrx6V5i4Pw7aSbJrceVYtqUFZtbdBlv8aviUzqk+k2g3KCWRjn27f1rQt9EEoEsceAuSWHfFTLgejKTTZtW8R69NRioJs6i+8TX2u2Ft9uUrdNwxU8dBWZHEI0GVOEJCj0r1cmyqnhrxi7s8jMM+r1m5NWehg30UzQSqueR271sSBSwxycE819RUxrholfU+cqYZVk6c95I+WPAv/CQfDvxxq/iBtHe4TULkhFTsPevpaXTYZj5gUDcCufp1r5HP8npZnNVajtI9rIs9xOWYWVCMU4J/M17L9oO8do438JXSNuA4xx696wv7NgQIcZYEgGvCqcEQptJT1W2h2U+LY1aTrThq/Psekap8brbT0hll0e5kMsYJKDlT7/SvPrmBJ4xFKvyrgLn0FEeCY1INc+voaYXiSMYOc4Wb8+n3He6X8ZrHxJI1qthPD8pAaQEfXNed2tqtqUIJBfPTsB2rnocDqm7qd0vL/gir8TxqUW4U7O/f/gHS3sqzXMsrNt8zGD61niXDbiQxySoPpX6Bl8Y0Yxglrbc+VzCiqic5LVkwZyGAIG1jkmqk0xYE4yoIOB3r06c24+6zilk75uabvcgnbYFYsc7iAR2NU7uRcBSPvEkDsCa05ueevRDp5dGEVyvrqMluC4jHJ2gnNU8gJjbtI6475qF7zem5thqE3UkraDmfacIDnqB6fSkhb5QCCWDZBPYVNOLtZrqViKcas4qFrr8xkjsfmZiBww9R7VKHJyxGSeBnvWkGpPlSFWpuT5XK6X4mJdbhKp5O8ZGP60XquWTr0GSO1ddCk0ryd30OGtNU6yu7J7lXzGBXK4w2AR2poCksqnkMSc9hWuqaTWhzTx0VUk4R1NiKUOkWWy23BJ71BGF+97DFRhanNPlezHTmlamtZbo8x+LqXd14TvLW2hLvMhwq9zXf3EC3RdZEym7AB7e9dkIQcWmt9DmlVq+2Upyvy6v5HnPwD+K8Hgfw3a6LqWiXZmiyN6L92uwi0K3y6rhWPUgdea/MMd4a0pVJVnV+Ly/4J+gYHxNekJUvhXf/AIB6hcftIaQNjf2NdkqwAAU/MD3P0rzOXRbby9gxywyR3rln4cw1tU1fl/wT1avHzTjUjT/Hv30PUE/aM0mRVMehXjrGTjC9M15vp2nw7ShGG3EgevtV/wDEOKd1zT38v+Cb4fjl25lRur66/wDAPZrv4j2PivQmkitJYd+AElGD+NeaGAwR8OSg5I9a7MDwPGjUUua/yPns24ti5OMY2T21Me6O4yOrEqM5B70kmxmABIznB9c19/SlyJRWyPjp3clKD31Z8n+JpdT0L4sad4mh0eaaysmBYxjrX0zd6bDOSCBubaWB7eleXn+S08whGnOVvM9fhniOrl03OELpvZ9D07Qf2iEGnW4/4Ru6VvLHDDpxXKWelQLFEGwQFAPt9K/P4eHVJLSp+H/BPvaviC1pGjZ+vT7jvv8AhokISy+Hbos2MDHT9a4ufTYBsxwQSce3oat+H9Obbc9PT/gnDR8QpU5OCpXv5/8AAPSdL+PB1S9jtm0SaJTyWYYCkjkda4S002GIpKCN5JIyOorOp4fwpwspa+h1rj2NSKgqeve//APRdY1ZNQlacKQGVdoNcnEzjyxyQGOM+tfX5NkSoRsz4TN87nVxCjFepePG0tk4JIB7Gmo7ueeGbIz6Yr6ShTfLaW55taClGUqS0Pl/4raVrreL9C1vTNPeePT5wW2HrX0nc2MFyNkoBzgZ965MzwMK9H2MnbzNeHc2r4Ks6kFdMh8N/HLX7SwhgfwrIRHEoyT1Ixx2pYtMiVMDgLngV+fR8P6MJpc2vofdT46nWp86pqyvfX/gHRf8L71qR1Z/CcwJc5JYYH61gPpsQj4Gd2cA9q3/ANQaajaMvwNXx+3CLdO1/M6C3+Oup3dwsD+GHSORwpYngH1rmxpcalG9wKy/1Coq0YzevkcmI4wmp80qab9f+Ad1rmuJrKpIEKuyAkE9M1ykUccW6MZZVAAPp9K+qy3JKWEglF9T5bMs0niaiglay79x2xiI4w5IOe/0o3uCmAQGIwD2r6CjdLmR5EqyhKzbv+o7eqqwzy2Dk98dqFAR1Dc7m6mujERUWpdDbWcW5L3mjifFnhHS/FNhJbahbh1kBIB7e/4V2bOG2nIwxOM/yrnlTm4+zT03JpcsJRk2+bufI1l4Y8f/AAyvnvPB945slYkwMTtcelfVFzDDOcMCVbse/tXzua8M4bFWlKNn5H1eTcYYrD2puXMn0fkc34P/AGo7m3ihtPF+iSwzocNIMlRj/GqOo+GdPncz+Su5gR06nvXy0+AqTguSo/mv+Ce/U8QeSpzVKWq7P/gH0Lo/x48B6kkci6qqBwCwbjHqK+XZPB9iFO2FBh8YIrjxPAMqjTVTby/4J0R44oTk3KDSduv/AAD7LX4neDrhAya3CVPIG4cCvi1fDsUQEaxoWZiD7/Wso8BVub3JbG743w8GrxbPr2T4seEYmITVEdVBwE5LHvivkEWEtnLGYgiYGAcdcdq6aPAdZJpSvr2/4JxYvjWi3zuLu9j6dvPizZSANZxMQMDc/f8A+vXzGGuFYlnP3sgHtXp4XgVKN5S1MJ8cL4I09NNWz0/xN8RLq9i2GUhQSQB+leNSyhyWblixGD2xXv0eHqWHipNanh/6x1cTWcIr5kF/eNfyybpCSSWAPasaWRwDgEPkkj19q+ipUPYwXs0eRLGxmpQqu6enoNLCQgZJB4IP61CoferbuTjIFbUrtOV9WcFVP2sFOPuLY0oI2ZlPGNpHHbmrunv5LjcwAJ5ArpnFctlscuZ4q8uV7pbI0rfTw+Ny7gxwQe1dXaeWY4gMA5Iye1cdJOcmn0NaWJUvdcdUkcDe6aIkLHgHcAPeun1NAxbLAqS2PQ+9dPJaPNLaxzRxyqNuLs09V6HmDqU27ssxJUAdKW+GJ1QKdhc4HYEf41soK6SVkcVLEt1YrfUlibcoVsr0zgd/SsuSbY+3efZR06VyRWnNF2PZsnJt7K5tMkZCbV2jIOT1OO1Zn2lMLuck5Gc9vYU4Tle6Jbbab0WrLRVgSpbO1SQw6moZZI1EWzcGJYkDoKxpYiUndoqpRhGKc3dbkb+WHi37iQxJA/nUYk3ouQSQxOT296ucnBuMup0YShGvBSirpa/cMbcjHGWy3zE9h2qHzdykckBqdaHNFJ6GeGfspuTV4CNyiEAlsc+/pSqFeRScqAO/f0qqc4qTc0FSi6kYypSsr7dyFVXYQQQGOcHtSPw0Z3Ny5AJ7/WsZYqTn7SKM44e3NCbv0Ks21WjXkkEjJ75pHBbaE5w5H/661p1OSL5lq+pwqjUUoRirFN2YSKCcDA2g9/rS3JBYL/GoGGPb6VnD3o8rR7GLounJVG9H0HLJgbTkh2IAFVFl2lRtBBJx7mpjC7TW7MKkqdKbT1RcWZiQpAwx7fSq6MdispxhySPTHYVpy8iULaiq4iNam6l7tX26lgsXA25BDYIpnmDdkEAdCKwqT5dEjs9pGnRUV2+eo9ywQZYbwpIzVZ3DAMmS2RwK3lBSakvuOHkjTi5N3i0/mSGQjAXO8nAB71SMjeaAT91xhj3qPYtJze2xgq7lGmktN9C8s0mG44BGT9azy0gKFcg45P8AI1lGomk4rRM3hVdOpzPfp82bBbzEAzgoScf41lBi3PI3HH/66qhVfPzLc3x+JkpOnKF79VsbCXLKCTwTgfWsxpB5QXodwUGuupZvVnBQboO9KLaNgyIpU85OQSP4elZCzrgjOeuSOgIrGlKUo2Z6TtSUpS+KWpqm4Z1KAljvG0Dv7VSEqoFP91gc+tKm3F7lwxbqUlKfzLvmLz8zHI6Hr9KhV9qZYDJYkkdRWc0nKy6HLCpOCcZwupbeVyRmLEBAeepH9aqeYwMYXJJwQB3qlh+W8Y6h7e7i0la1iRyAVJJBJxg9qiaRCWcZOcZz2qqUIpNBDFKD9ny6aHeKG2IuRnkAk9PSq0e5pAd2exB7Y715tGKUnKL1ZvXrybVK2nf1NKKT5vmXPOAcfdpIpHLKpIC7ByPWumpUbcW1ZnMsvXtGua97GxG+WBDdeDnt9KpxSg/OSFDAgAf1pOCUXqE9ZLlWu33F2WTKZXO4BVJPoO9ZtzdYVQFBLqcH+7VU6SVRJIz9tH2PJJ69CwJv4gxHPT1IrFDjnqACTkH+da3lBKUtNdjzqfs6lKSgrfqdIl2cAhvmCk4J6msFJcEtuAjOCMdTXU4NRTZ14GupVXFdEjqPtabULHB28gdM+tc+blcbQSTvBPsPSuVPRNdT06sYVZxlKSurqxtiSNiG3HDAEetYvm7jlWIw5JPp6ClzRlH3jlpUG5OCdlfQ3nkjkK4JBLk5Pf2rC84sGO/Axgk963hBpW6s1dNxSdR6G35nZSBknI9ayTLyEViVB6jvWCtN86WpFSNWE3p7tt0dBHKowQoyMDB9PWsBLwuNrEjaAAQensaU6smuR9DPD0IuDqI3wdsnOAJFIUetYRudxRlY4U8n1xVOLbb6dyFh17SLWl+huGSMYwcEkEn1FcydQXcMPnBOAe3FKnUm5W5dDomlGPLPvqdQLmIqpBOFILD1rm0u1+4WPKjJNEuWErvr+AqmDVaL5XZWudO86BGwDk8YHWuZW5bIcMcISDz196cXJaX2No0acqkIuOjXyRv/AGngMQQQwxj2rm3ulZxnJRSQPbNRFKTvY5J1JWlRUr3drm9JdpGUBYks2AR25rmTdBo1PIL5XnsKv2DjFRR6fLGKu1fpc1p7mQ5Bcjew5XqfWualvOG2HJ2kgN0NaTpOTimcFSirSm5X6W6mw92UZUQlmzgge/WsAXO0MwJ4IJxXPianLZR1Ztl1CLlaWljXe9R1OQw7hT3rlpr0u0ZAYZwTn+EVPO4zcpHo4ZpJU9tdyxqV2yWlwmThlIVh2rnb+6K2s+GJKqTj1ra7TjY8nET54uq9lovNmb8C7hm+Il5HvZlD4J9M1kfBHU7Kx8cXc93OsS+YPmY9ea/HPEhS9rFU0fufh7KSy1xqvVn6lWLr5aHGcqAM9q5rTPFOizQQFNSi6DIDDNfmzwrm4tnrYmjJyvNaf5HexyBT5ZOQzAEiuZ/4SLSlIdr6MRhsD5hn61jOjJRbW6M1QcpJx2OvVxuXEm5S5wR0FcI/jbRLfKrdqxZjgKfzrWhg5ySjbRmlSrKUVZ6I9Be4SH5gxAAyCe31rwnxN8QIpYTa2TED+Ijuf/1V9HlnDssRK8loeNi83hTk1DtqVviJ4iF5cG2t3PlRKqgj2rySa7N1KWaQnfzz2r9Qyfh6FFJpanwOb4yUoLXckVXO1S5PJII6DPU0kJVQeTxJ3719ZJqMPePlOWcIWd2mx8caqcK7MGPBPXFBZwy7eS2SB6e9Vh6fNFNu7Yp4tQlyxXYtIinB3ksnGB3FQKxQguxCcjA+tdUqMVTcnqdNKvFyvUXK118i3tYbSMgB8A+lVRPhTtY5dsjPavOp4dx91nqpKpFzTun/AFcvGPMgy7cEj61WWRyA+QQMnIrrjTkoxprc4Ks4qLqSe/6E6ZV/M5HABx3pIwu7JY8DIA6CrqRUopNanBQq801GrtrqaSRLsYjA+XcQPpSIQRhskg9B3rnhFt+8XW5KcuWkrPvuOjDNIDlljIBPv71ei28q/Z8AeoreXLK0bamFSXK+dPViBWOMYwN2SRyfepwrEL5bD5mLDd0HtRUi72W6NqFepXjyS+G33jfLzHlskhwSD3FWgC5IDYIk5J6dKdHDLnTTM3XcIWav09BkSkhcAqFJPPfNTRby+3PO3qfrTlQXM2tjtpK8FJLTQbHknZknIzk96sIWLMTxjAGKynJykktznxGJhCi3FaJj0UhXO3jaQcfxU6LkKDwMknJ6ela1qdnZInD4tzoKMtY3+4fHjAJPCnH0+lSKQgI64bIx2qEmpJRW5yVqqUGk7309CUssbqhHJIxjtTt64GQSx4BFbUYys090XzRqSgm/dQu0ABgzccY9am2kHIcg7cAfyqqc7ys9UzpdCU6XLTjZ663LEc2wKVwQ2cgdjTYsDgA9Bj+prirUYP3WjpoVuT4t9mhvm7m3E/N90k/yp8gLA4TCk4JrPE4d8yil0O/CVXGlKUt1t6CBioXGfnYEe1PRVAUEksQCfb0rjp3+FnPXUZxSj8TaLOcFnxlehB70pJZCoO3dkkenFCsklPZHb7FQi23uVOS5XcANpLH1pd3K45AGAf8AGuqNpJNryOKtWk5JrpsmWYY/uqpx1BNNVj8gIKqG5I9KfJKMr9EYUsLH2nv6p6npukWKRWLM+MSQnk9zWVBqaGxWJWPyoQW9MDmuWhyylzvQjE0VBuNDW5ivB5ly0aNkb2XA7mqsVwqSSSgn5iQfY1vUlGDWm5msHJU229rE81usZXOSQcEDtWfcXjAk7zjqAeo+la0oRSvDYuiqzV5PZ6W6khKKxUNjBAwe1ZsrghWDnrkg/wAqToRnHlTsyqPtKUqkpO6/InkYbgd+VViPrVJ2dgFzhsg5PQ1rCMYJpvUxkpYlQi3ZaXLB+YeZvBww4HbFVlOBt2kquc49O9RKEYy5Y6I78V7NxUVG7/KxbZlwnJ5wSB3+lUSzLvRQOCDuPfPSs4RUJctt+pyKtJw5pots65U5znIBPUVmSscEtISyvnHpQlFuyepp7OK1qOy/Uu+erLjBJiQjjv7isobioySNwIOPT1rGpSSkmu56FOtKVNJtO2y7k9wwKLIBjc3Q9vcVQllbALSEqGIxWsKSXvN3TMqFWU6vO1ZdSEyt94qfl4yfTvVcOGDDJ+YEZNdVk2l0OVuMZyi9vwLXnEHK8LgZz9eazZMorIzdcgEVnGUX7rdrnNFQpyag/e7mobksSisMbsEDtWXGcGUBiShBPtn1p04qLv1NZU3KKs+uuhNdSoSF5BODz2rKuJiZF3MRyBn1Irtoxsm2ebPEx9o4tXQ4DMinHqST3qKGRmZGYfQCt5xcVZ7GEsVaaje1/wCvxNXePLQ45HOB2qFp0aPaCQ5zketRyNO9tWTVSUeenpbUZE5dizodm4EEfSoVPlhNoIJIJx3repSk9Eb4Wmmo8zV5LVdi/G4Y55LKCAR+uKbHt2sACOScjtXLJXSSWhnGkoOUU7v+vzGXEi+UeSvJH0psqnyScHBAIHrXZJO6j0HDHRhBxlG1wtW2+WPNG3jJPeq0akPGof7rDI9KyhTsnKTMqtayjTpyu+x0m8vGUX7xBUE9qoQuZSOwD4PvW1OnLl5lvuW5qUfZ1NelzEnBjZRkAknjPWmXpUOxlVtu44I/WlNNJpq5rhJqMkmtFb5ktuhMm5sZJGSO9PsFWSTHOVbODXPWuqQ+SU5NW+I6W3f5UU5w4J57U2EqNgwAeefWop0op3SNo4yTj7KVtFoTzHLq0bZC8Ae31quWIU7G4LdRT5ZSjZMmjUvJJovRSyEAgjaARg/4VUhk3R4JAYEjIrknHmlqtzStScIucHoi6pkUBWcYU5A+vahWTIPJOBx6e9dXOnbQ4MDRaTnC5dimbYU3Ack49RVWLCqQWBJAIINXUjFNWe/Q65YmMqcUtN/vLyFVALEnDcD0qCNjuXzH+TPGO1YTjJ+9e5jhuZVfYxRf80Bl4OwqFye1VtwCocELk4Bop0IctrmtXFONVQSV+5cMyMG2sDliMVRZyNmcFVY596ptKXIzXE4uPNa1td/MtCbCEgEkMTj61TErFl2sQATnPenU5U02aU6MarUb6k4YLs3E5YjBHaonfcBwQSQpK06idR2WhriZwoLlTvfsSeZyke5icklj2qo7OSdpHPAGayVOTdkcX1ilTasrPS5MS8TLmQsc4JPXnpUBZlwrMRklgD1at4z53e2htVTh+8vq3t5EhdjyepOVPpUDFv3YJ5bG4noeahVley2MFh3Jub2/IV3I5JyUA4NVJWIZlySeB9KPZytZOxveEEp7u2nkJIxAJwATjI7fWqklynlYI4O4EHtW9KjJSi0tTnrYhKHs7tPt3uIpkC7nOcEkY7/WqcU2MRggMeOTXLiWm7pHVl0XGnytadPUeXyyNsPHIA7U1y5KgkHgkkdvarlGKg3E56sJRlFy3X6mTcjcx8wtuycEelOmmEanJ4DAjHYVpo0r7FRoTm7xevYwZc7gckiXgA9h71Tu5vmZvV8Y+nStVRfLyR2MLqc1J7ppGfI0YJU55bt2zVaUqCrA4YtwPr61E4OU0m9T0MJGFpSbta7+4z5ckiM556EdqhnmYOGOAckAAda29k7PuYrG0qtNpLT9QwoYtvKsABgd6otvYx/OQAck/wBKzgk42i7DhBzmpPR/obccyRhCVJOck+vpWMkkmd24kliAB2FZU7czkyq8IQXKlvuzuLfVSEXkl9/A9ema44XjqcAn91ggDvVKUqi1VkOlWhTg3F9Trbq+YooVjsLFcVyD3LyIQJCOd2Ce1dVKoklFrWx52IpxlFVIKzvt5CXoEj7t3zDofSs6W4Vwmd2OTz/F6iiNVPma3ZGGoNtc2yKbgtITxk8NVW4dtpkVjz1A7e1c3sm/cWhvgaiqSfLHZ2v6kqzjf5Z5AYAgVjea2MbtpCsTjvW1KH8zLxl5pUU7NOx08cueF6gg/Wsm3n4TJOQMk+vpUc0YzsmYUaU3Hki/J/5mu4jDcZIIwT9KgVywV1GQMtj3rSVLlptvVmKpPmTpqyvZA23jcvABzjv7UwZJIMmFDgsp7+1Y8ylZyRSkp1VHm1W4xWY7t2dq8qo9MUkpwAcEKHG0Dt61VGUZwcbbG0qM1/EejelhzMT93A8wgYPbFVGbZ5ZDEkseT70OTu01oZ1KdVQ5ZPTqTgxqnIwwbgNVZmLDl2/3fapp+5K8np2PSxMJTpxUdVuSOgkMYyAvJLHt71CJVVSTJgsSQSOlYxhJNqLJw2MoyqxUt+3crvDGu3acpk/N3qGQlPkc5XcMEd62jB30d7mOJ5J+6o2Ter3ItpJ5ZhtIAI70pcKoLEBsEL6CqdZQaiiaWXU6aSi7WepEZMgKCBkE8VA2Sd24gYAJH61lNxVl1YV5VIO8HfQc8u0hQOqgZHX8aUuuwZILEHJHYVlzLVoEqqcXF20f4iGUMoUJlujEduKqmQqMjOSTjHQD1q5apJkYXDuUeSUtm2WNyoUAckOpwPpVcyAmPceoIH1rGEGm7m9StFNWd0TPKUHUgnOSO/HSs8ybiOoXOQfU1lKhyqz0Op4unGLhTXNr9xeNz8iEtgds+orDM20GM5I3fhW0IWld7Fxw8ZpT5/h/M11lQfMpJ3YwT2NZIdSqsj7VL4wOo9xUSxClZLocFTDSpzbT0/zOgS5O4b8kkgD3xWIsxKZHYklj2rpov3k5GDbilKOzOjW4LE5yrHIwT09K59LpodkhYnY+QT3NVWqRcbLoUqknLkqLR9fyNwTE4LH5umfSsaK73yE5JPfPb2rOni50o33uU8towoqUp9TaEiqFJyD7nrWSJwWZdxJOOT2rKjU5oK+gpxjF8lF81+p6XDMIyz8cgAE/1qjbTKUUHggkknvWcq0Ye81sawfLH2qXxaI6G33FcPx83Jqir8bDw5wRjtWsIOcl0RhicfGFNJK7bsbGI1VVL8Anp3/z3qlJJwOccDPvVezlGy5tzKWYQrTbjHSP6DbmbOScnDBT7e9Z73COeeehJXvXXBuLR53PLkaTTvqvRloFtqJyckZJ71W+0L0UkLwFz3rKV07jjhm5KUuvQvZyPvAbCAM/risuKfdjJzlwMjtVwqSjKKbOyeHpyTUPdtrf0NUyglQzE54J7+1ZvnkIRyXXJ470pxldq+5dOCqpVZK1rfOxrx3CNnLZZMEk9/c1zP2tueCNwOCPUVnOjz2d7WZ04aupT9onddDqFljCNyMO5wPQ1z0NznDhSe5Pc+tRGEpXaehWInF1VSfXqbhkWOJVDKWDEnHY1hvPmTAypJJJHeumm2ldsw5L1JUWref/AADZWcAEKp2gkE465rDW8BYKGJAfJH1rKc3pJo2hgorDyp81+purOAAfMJUAk+9YglCgKzAFskEdRV15ya5UtEY4XCu6cFvsn1v/AJGk9yN33ASnRvWsYzlpED4GASaik1GLmzWWHc5+zcrT0ujaN0AME5cAkeorBlnX7ysSwJOaVNRaUmx06zk3Fq1m9fQ6BbobB8xDA4IPc1z5mZlJZsZ+YkmlVpN2mejgpxceSTvJ3f8AkbRmGMEEA4wc9T6VhrcgBcsSOufT1zURUnJp9epbhCcE6eji9jSa6GGXJA5OfT2rDefjzAPl3HAPetopt6dfwOXEUJR5tbouvPlSGckvnJzWIJ3l2kAYDAkr0HrUz5oyaaul1M8PRVozp9TXadWQr5hByCRWarOzcYJLZJHesK8EpqUnc0dOUoqF+5YFwGZnOcNxj1ohVQq7gCCuBntk9amdHmimbYahyJyvpa/zKE0TXEbLyN64wM8+grRIB2s7EBe46j3qqVOUlzbWOVWqP3tFY8+g8My2VybqBD+9kJBHXtmvTI1J2BXzlmwD3rzMyy+FVOdRHtZRmM6EXShP5mLZ3GpQtG8O9SGAJUnk108caoS3Gwrgn09a8z/V/DWTa3O+GfY1OK5+v4Dba81Ek+bI4bBUAk88fjVgPli2SFxkk9qyXD2FhBzitfQ6sbnuIj+7jqnre5pW2o3Vttjc4IJAbOSKyfPCvnncxOSO3Fd+GyykoJpanm1s5qz96pKyex0C3kkgcNIflGCfX1rCimyC2SELYJHUfhXqKlCLVlrc8yipTTu7p/edZDKoOFY4AHPpWXaylfKzkruGT61cY6PU66F404wi/dvqdV5yMsaqSdvU+lUUk3bTkbdxAz6YrONJp3epyVcS52jB9fvNTD7OSxPqKpIW+75pxwAa19m4x5ntcxUKdeTSdprozQEnmbdx+VSQTTFbiNXxtLEECs6lTkjy23On93WrQg37yvdiZLFUDD/ZI7HNO2v8vOMMQCK7lO6V1qDpwi7J+6tvMsxF/LALHB4FSRJuK4zzzn+7WfvRTlbUvEQhVlGaVl95oxqh8tieQR171Eo5TnOw5x61nQg1G6ZwV6VSStFf8Maxk2YypwGAAGKpB2LeaHJ7AN0HHWqw8Vycz2IWHkrQjve9+hqRzB354DMASf4cVWsxl+mcg5J7n0rSpBJKUjejUdasqd9EbOdxbDFcoQCPequSwVRg7e3pToTU3zdmY18NyVLy17F+BQWO7oAfxqGNjtDnoMAqD1OadSN5KMe5zxqwoJ129X0L0Ea7pCGIOMfSmI5yoyTl+Qe496mMHJ3S1ReGqKdWU4PdFplCcgjIGSRUQyWVy20dceo9KPq8ouzfmZVq8ZS5OW1t2JEPn3EZ3DBAqSEKzBVY/KMAkUYio1G6WhODxCq1FB9BxAQgtwNoOD9aJcMyljnYRyP5VVONqaUnuycXRSrqNPazuTExb9vOMDnHXBqu0xDZGQVwTmujk5YuJvRU/clK2vQvr0wGOVxx6VAjjh8nLk5FY0aFlzR3RSxdSUnTikmy+jBUAZwBngetVl25BIG4EYJ9qr2EW/eZth+WlFyetvzL+9PJO7JLY5HaoI2GwgA5BJIPp7V52KglPVnXg8TGSaWjfcuIAwDcgljj8KrB0LIck7cge1eeoNNto64NTaUZK68iZmwrYxxnI+tZ00zqxQtkspz7+hreULrmOOWLjCo1JXkSK4BAAPBIHt9appNtZN7HKkA471qo8vvIcZxnScXo+hpwtjapfKhiWqisgwCpJJcDj+tc13Kbb0ucsZVVTVHdI6GO42QGKNiN2Sp/rWYJ1MYUY3IAAfQV3YfCJttvVGtX2qpqn9rfz9DQwCrDdyBux6/SskzyF/lYgr6/TjNcai5O7fU68JjJVXyqHrqOkmAZsnIAHB7E1mSSZBbGCWwTXTVvKVkhVsUo6wdywreVudgWVmAAB6565rNuX3KFBJDcnn8q0cHJRRx/W3ThNveRq+aCGAJDZBGO30rGE2wZ35296lYe2repxKtVlUUE9DYUuhGTwOee+KzWvGK7SW+YA59KVRPeZ00YSjTlydPzNZWL9MjOBg1lfbkDHDHeTgEd/SsKs5OKjHYuhGUpJVW3ItzMgcgk7yBlh2rOkuwQDkn5QCB/Woo07adTsxyaftKmyX3kr8xcEkpgA/0qGORXUhXIJbkjoDXVKuoSSRyYeaqRipRsyOQCRNoLAgkgmpy0W3OTzwR61jTpvnu3qem405QdOOv/AATLVWDJlieWA/2qlHlMp4IIY4B713ToSb5WePhZOlGUZLZk3l+Z5bDnbgEeppqzCNCqDBGSQe9Ycs4u25TqxqqN0yR4QisXGFKZJ9eKjaZWJViSMAY/xq6dJuXM9yViHCOusdr9jCv9yOM/cOAMfqaL4ruDhixUEkelephFFO8tzyFypuVGXW4WzbSHbJUEAD+tFrKgZGLY55HY054hwu7aHe39Ymqi+I1MR8K2QS3B9c1H5m7DbsnJAz6e1FOo2uVkOknJp6IkiTHzEgqvQH270FxIArZwD0qU5uykzHDxp07tq6bJ0XazO5JKqMEVG0qgqgc5XJ4pS1VktmZRxcFU5E9bXJW2zIo24xgkmq8rrgHJ5U8DvWsajWsSqCVSfLPbq+1ivgmTKdd2ST047VHHlQEXIJyQa1krpNbMj2r55SnHRfkaULxoOgCMwAAqC1JwoJIUuCT3rmk0p2T0LhUjOMVNWi3oR3seJR0POcetW7tVBzIcggAECtKkLQ5mzWrOdWSUVZLbzG2luSpY5GXGMfyqzp7DqxyQQM+vNcqUmrN6G7w0Y1eZSsy6sWAN6nfuYgelWVKyNuDAhHJB9amdSMVdFzrUppRS95blfyCIxk4O4kjvzU03y85JwxI9qqNNzldO9zlqNpKTWz0IBAoABII3ZGP608OAEYAAk8j69KqnTlG7ZTg69uZ6fkPVACuHAyAOO9Kr/McnGACB6e4rOCc/ebsdDl7GKgnrt9/Ul2iFvUMoBIHX1pFkzkNgc5B9qjX4VuZRwqUlJPbfzJigEeWBODgBe1APygA89/fFZ003HUp0U6inezs0iTc8aKF5ZmHDdqaxUEEEkjBb1PtW9PDu6uzneHlyc1tnuLs+bCk9Sc+tG/heDjPUe9PkUZe6tTudKL1qO6/AaVk4PBJ2kA9R60wFuFBO0HJz6Vqm23KTscFOHJJRirp/1Ysq+1E/dnkAkjtUAb5vkyN55B9+lY01zyumdM7UIJtepI6kNuwDlgeO1MXG5SSTg5BPaqm7rllo1obYaUHNyT03S9SOQMxU87mBIz29KlIdmU7gQGzz1FK0IQv2Y40qlaaU0VHYPlTknOQB7VJIw4BBU9Qfp6VnK0LRitHuXPBRVaM5S1MyVizkBsuFwR6UTq/AH3c4B710xanG66GUvaRlrqvyKEzYAGDmM5z68VHMWAVRn52XkU1TabsLF4qLUOV6vqVJQ+5HGAfMU4H8jUkvIyMYTLfU0RsklLqTiIXlZvVapk67tuSwCgDIHr7VTSQmPah+8nQ9qznHlaiXCj7SCq9StdnyyDjOGGPekuGZvvEkKoG719BTo0kryk9TrqyjNJRdmjlr9SqruB+cnkdj6mtO9hEsOXOCSRx2qoYpaNI4Pq8dXGSeqOTLAvEykknCnPfFRygxSgZJOSOT1xWuGgmnB9SqlaEKns5K3mirceXIjAk56KRULO6DByDyfpXTCinZrocP1mKUqfR6XK0gBUA524yMdeKjncyoCAM7iMDuPespUmk4vSx1UoSjCNndieYRjaSOc4Paqivs2hiTgkZ9a5vY2jfqa8zlFxk9F08ycurLlWbzCME9jVV3QPnfwoPArTltJNbHJVwspKKho/vJXlKneCQxPyn1HvVVpFZdgILKQQD2ouo6MqjQd1NP3ru4rlvkTcd2cADpSDPygE5AyAe9PDzTk5QWxnONSbdJojdCqOGbJbIx6VI58wMTxypz71lFyuufVm0ZKk+VrVmNPGFTcThyoBI9qnuEwq4Y5DDGP601CU2pdEbr4VKSvfQrROxcZ5UDGTVQ5ULkkfN+dZtOKcUjiwsqlKTcEve2NqO4wnltIF+ckZrDjm/eJHjKquc9zVLlvcqhi1TTU5XfXTqzfDKTvLjk8gd8VnLLyAMkF+AO5raU3PRCnBUrVFvf5s1HYyIoEhGDkY71WimwCOdzZOazgopNrcyrxdWapuTi462Q0sUYFck9QP7vvT3C5UryWB3Y746VqqbcbJas3r0pRaTdl1IvMZADnIyAGI60zgqF5JbjHpWdakoyuzvw1aUYqKd09BskwcFmHCkEEd/WoJJFjUksSpXAI7VFkkm2Rg8a2/Z0l3V+xCz4ZWDAqW5H4Uw4lwQRwmQf6Vg6qgnI0lWqU5qk3f8AVDS68l84BJ4qjKWDfJgk5GD/AA1VKUWmpEUsS1VUm7LsTtOCPmGFOckd6zzIcJnJAYj65rGKcLJCbeImmnZ3+8U3BWYZbKEHGKquSMMDjGAcdxV80akXHZ3KaqRnGpJXfYtyOhUgKSGZdoHYVSQtGdwboSRnp9Kr2bi7rcU1TnFwel769i20jAIWJ++MZ7iqjsGCMG6fMB606aXN7xy4iTjGDg7paf8ABHyEpghiSGJJH8qqySkIwjBXIyAe9TzKbSaNIUeVNp7jJVLbsnA4Ix+tQSOAUYsxyQcelYxi+XlidlTkpyjOT13sCysrLHuBycfSoGO2Qtw2VLE9hVewb0QRrRajJ6LVssiQgFd5ILANxVQbsLk8uQSPT2pT5la+46dGKbbleO5oCThAxySx6/0qgWYNk5KgEg/UdKwdGT95PQ2ck4KT3vYvRuFYt6HBU96zwzq0ZOGLHPH6VrzOTvLocrp0ac0nHRmtFOuSAckA5JrNSQkkkneTyR3AqpydlGRVGD5lKktEem27nl1JOCp59Kw7S57biM4BPpTnVldKWx5U501L2avoztIpv3n3sgqSPeueNwFAYYA5JPriu2FJOPKnaxz4mFOE1NRvf8GdLNcjO5QQVI47HNc1JcMFcrlgCOM+1ZUqcWmmylUVFOovek7r/gF6W42vuLHAYMSPashWHDsSE4OD2+ta1KySaautjhw9FqpGouu6RufaflUkbkHIHoCOapW9vv4Vj8xYEGoo01FtSfodlfHNu0d+q7f8OX0m3RgrjBY4A/rVq2tGChW5/eEAntU1E3O5rTxMY0mmuuxEDIWjG4lwRk+vrW5Hp27aTzgk59aiEVFO73OtVIySgo3XcxFic8hWB3ZGf1rqfs8aJtzhh39AelXf3kkY4emoJwitFt+pzYhkRdzDlkJA9K1LtkjG4DBPAz2qZRkou2xryxk01rJnN5IOGyCDgA9/eoryWNiMcKHABHajljKC7mVGNRJzb/zEWYr8wweo+tYzz/OACSVJxV1nFVBwU/ZKSerdjZNywKpu55PFZMEzHDF+WJHPvVzqWabR0UPrDaW0NtzSMobaeemGJqujeWSjnggYH8qlw1UvwD6zUVWUakbLv3JyH56ZboB3qVIgwVs8A5ANaOmmuU5KNerJSilrff1/yGZZVUOeeMj09qmKM7smxSxwBnt71Sg0rI6HKKUZrRr8SMKdm9HGCSRgdPWpgCqkOcHGOO4rOLXPpsZRdSs+Z6PT/hyswZvlQZQcEGpwxVGG4Fcj8MjmoleSXKddDlfPJq6TRnMpzhTgLgEetW40yRgAluBn9KqUoxi1bU51Rq1KkWpcqV7IERAc4Yqcjnv9K1FhIWNj+IPQc/57Vze3UEnJHq4aXM+Zys+3coYDIuWAUuRnFSurBmVeVHHPbis3iJSdoI872dVyduj2Gwyfe3EBgeg7Coyj7whcgqMn/a9q0hOMY2SOvklGdraq3zRdgUH7hJJxgntTYX8pDkkgnPPX6VnaVuboWqdPV9S2wZVCO3I6gn8qg8xXcMwOAMH347U1DlvzPc5pSniaiilqhxZFCiQn5mAFRlfMI2AlUwQKcYybvLSw8JTjzyjBu/3jN53LlgFbOCOpNX4rVZZoVI4PI46cVN7xTk9Dqgqcp2qfIitlJK8kvkEn0ret7DYNxckmUAe1bOfMrpGdONKEotdWS28OXHBJAyPatKBcIVUEuCc4/SuWMJxXKtjolGE5vl2tsWIQo+UqNu7Ax3+tTxK0RjYsSSuMVvGg5QvF6o4Y13GpGLjr+Q4gp8xGeRkDtVsxq5R84CjkCrgk4KN9DaGHpyqOUldrURVRE3EsSQCQexqVEydzBi7Ekewpxw6aTvoLmkk3GK3HKMOjq7FiOFPSrcaFQjnIzkjPcHrXRGSb5XsjD2SlWSS13JHCr5SDJPfNSfx8L2BBPapjFc1nqmZz5r8qdlf5iqpcAgEBTgkfrV6OMfdLYLZJI7/SooVI8tloiqtKcVzX5kxikYCsxPl45PerUahUYnJYc5P9apQinZdQw/NXV52STX3E8eVjVVyMkZb3NMjYscfQn3rJwcnax0TcYU+RPvqiVXbflThgSQT/AFqSMAsxB45x70uaSSUVqYuk4U05SumTgkDJOSTnI7H1qIMCN2SQxGMe1TJSckmrMvDuKhabv/kWYJskcEhXyzCq4JUgBsBsjBrupQfNyr/hjyq1b2rtSel9UbKBDg7jkNn61QhYty27IJP0FRVrNtdz0aDv7qjtuaAbDDy8F92MnoPrTI2UcbSWbGAO1R7NOLjPVEwrxmmo+6/xLEmHUE4BY4JFR8E9QC2QAKUaaiouDHJSdHnerlpYjzliD/CATn0pGDHywAODhgO9Sk/ikzCTdO0VtYmUr+6BOAMhQP4qgJ2YKDD4OPb1rXlkpXT3NsRip0YqS0gaXzIp5HIIA9Krh2lRX57En1ojBqalNmMkpWWyauSeZ8mGBbD8EVEZgHyRhSD+NRLllJRex04qjJPl66W9CXJYAhyG65Pb2qDJ2ZXkZHBHXnpTq0VzWtsRSxU6bUYa9PvG3DBgDkFR1PcioJCQQ+NxYkAegpfV3FJLbcqq0m6tSOo5mXEYywftj0qvJKvyjcSe2exFcVJpNpI9CvOMnCyvsydG4BB+YMAT61EkjFhkbQ2Ac96t1JWu1oefisUnVU9r9C5NdbVAbIYjkjoapTtGSFPJLEYPpWeHoJ+8jajiZVG5SaW9+9i0kvHmKwCA5PPX0zWY8myMYbnIAHp6ZqJUqjmotGVXGU+VSpuzZbdwz8cKSSSO1ZJuMcMDwQOO9dNPD6WuGHxE7pbK+pbd3ZTGuQwA59qp/aDlEZSG4zk9KuDlF3ZviVRjTi3K7TuOYbGHJO5icHtxTHZdwCuQMZxWkoKaZzwqyco1b23+4VXaMZUn58nntVXL+YMklQB+Nc9WlZ2a90uOIqKmpL4n0HzyONsikAg5JHrVWWQEgLkqeQMdKt0IzV09RwruVSMaqaQ5bll3E5PzE8981GfunPA4OfT1rBJuSk9GjqhUdCDT1ev3Ey3fzcE5549RWaFQ48tjvUEgGtXTk1dPU86ni3FqpDVr+rGpHc85RiQexqm3IPy5Chck9qahOMrW1K9vFNVWtdbovxTSFSoPPXP9KzllRTt3kng05TfMpPY6YTXI1Fb/ANfgapuCquSpDMCMHtzWFcXe5UbnhQCR/OtFed1HdFKrOlTV9W0PuL6UOq8gHIBB61ivMAdxwSCAMdK3oUG1zyPGqYqo6jitF+pZa4kdijsSWyAR/Wq+9EbJJxtIPqK6fawjFNI56kGqnI52cl8kX7dsbskn5jgDsarRybRuJIGTwe57VzTnKVrPVBQpRimoM2vtGerHnBz6+tQWuSd2ThlIAParS5IqRvLnc+ROyRe8yQgYxuVTgDt71XWTa/ByW457fWt3FOK5VrcjDRVGTVR7ltpBty2QzADPfrUAdfmGSRgYA7fWnGFt+v4G1SnSjPmi7trf9C4rmRRkkDfz71WRD90sf3gAIH8NWqaaOOhGNR3Sff7iVX+dcEkFgKYiqqruYAlxyvYDtXPU1XLHQ0w2MvJN7LSxfjYKACx4Y5+lRx4dUCsThs59cmqo8sp2kzWs04c1OO3Qt3h/ch8kleRjtSs26F1DA5UYPp6VqpWSVvdOWhTU580t0Ps8FYyxIGQee/rT7Q7Y1G37xIOa5Y3knCJ6DqUnVTqLT/I1oSRwpG1CDg9qps4wAMj5+Qe+K4Z4Ztcz2OyjjKcIOSWt9y7uyOCS2Sfp70xD8oG84ycr61stGjmniXPSK87jVKMoIGQOM+uPWogcFQpbDZBX1o5nVbd9CaMUlyrfr8x5BOecsuCD6+1JGnltgsT5hPHpVurePLE0pJRThD4u4rMPkVsgcE+/rSqfNKKTjL447YNVTTS5pmU6jqWityzG3JwQMkBSe31pAD5g8vgcEg96yhSsrs9KUIOUWnqrkjscL8w6kkD+Kq4lUH5wDhs4HatIRabadzy6dPmcuZu+6JY5RvcgnZ1APc1WUMflGMMBgelVUjFbvYvB1aik5pXui0sg+XA4LZ4qCNgWUAnAJGKftlGk015l4eg1apF6NlkO7HLHIByuPamIwXAJJU5wPQmudzUbSitDeEnOThN3/rYsKTyuSuGORVUyEAhjkljgjsMVdSldube5y1krppWLDOxO4ZwDyfWswzmLC5blsEDtVUqKimn6nVOvVhOLTv2JZ5MgsATggDPQ+tVZZscbyUc8Yp0ZJpSirnLi6sZOVOUrNWGs+QAGO3OVBPrVXepJGDlVyPb6VrFuMnJbGapOXKou76kMpx8yg7F6EevegPsXacsNwJHpmtqk7J26nTGCpxTnZapEMykhX6EMcY7UkhKqoDAZJyR29Kxvy3lLZF1cJGUrN7tWKRYRSxoCcljz9fWq10QpDbSQSWJHUUOhGrdt6szeLjTmklpH8R6kv5gDMdp/AfSqxm3AHkD+ED36k1bvGybNaEqbs31K8xxhWB9BnvUFxI27ByGJzz2+tZqyd5IwjTilyRd3r+Jz14V8xpTkKCAM96lvlBhOWxtBJPpWXOpS9mtzqw+DdHllNf5HPTPjDM+Ar5wDyfaq0jHcQuGypAJHQd//AK1d1Kk1F3MZKK1qy6leeRWyyseeSBVKX5ANx5diAB/DWU23JRjsZxhCSU4rXa3cYJV2udx4OQfQ96QKoVGdy2cgg1pXvKLjE0hWjFNpXGKGwwXAZCMk85pCu5QA5A4IHrnrU1OdJSRzVJOMYxg2SdBkgcZzjt7VAbhcMquQSpBArmnObkuZHfGnSm1CLs/zJRIAFUE7n4A9KryNJwwODggEd6qnSnOWpx42vGi2o73RZZlwFZiDkAqKYoaQKV5YAEjPWlKPLNGLqqUlF+f4kDkyKVA5zkY74p7Q/NkDBBwAPTvVSi4Pm3LwlduSpmZNGURmTIyR19avSx7owoBGMZJpUKKulbQ9bF4iFT3ILbU5zcFCuxw+cZHai7baUU89hgcGrlScno9DljiIQpOTXvP7yWC6X+IknccEdBWdKSpjIJOSN2e9TUppL3d/yOFYxpxXd6fI3opGUqFxycnHesuK5IJRQQEXBPpV06reiWx0csKcbxd5O7OhjkYbQWAQEEgVUimWReWw2SM+nvW8FyxdlucOISrNRUrKNrl0lHwenOceoqHerBlLYJxkiuOpGyT6M9ijRpQ96L1X9bFWbAPlncEIBJHf2olXa+JG++CeO9OfK5aFckbt01bzKLISpdFIIU5B9BRKd2FLkfLkY71xulGb5nscEoSVpyd3YpSEgFlyZMjOO1ErBMLjOc1qqcopKKNcOoNLmWtyn824DOQw5Hp7VGVQowAKndnnsfrTjF09FqVWUqkHJOyXQUEbti9O4PbHpVZQ3mISwDDGT603RUUpI0pSi0kl5jmbOFckY7j0pswAZwD/AKwkE+n0rGDUWov7zlr0ZvmdTRS/q4CZAYo9hBU7c+nuKh28N82CoGD611zd5Xb3MqDpxp+zSdrXv+ZMWGJC2D1wfT0FVG3KS7BmViMA9q51FTfLfVHqYOkvZc0NU9v1JFwVU7c7DyD/AA/SmeaiKg3EuTkA9zUaxXKmZ/VYSrc0ulkRlcgljj/69KHAIJ+bOSCe9Zyk2rvcp0ZObktnoRBjuAIAKnOT2BqGbG4ljgtgkDvXPabTlY2oQVSXsouzt+I6RgFwAcBiCSemfSqbyLKuAzBt3OO1HKua608i6eEUYyU3dv8AQttOI1GGyBgE+lZTs3CglhwDn+dOFJyleT1M8XXdGKShf5miZsYJ7t39e1UN6MFKscIwznvRVqq9k9RRg3BSZ2trMqFcOW3sAc9qxrKeQMMP0YcHv7U4QvrJnjzny+7NXaO3tnVwUx8owCPWoLFkxG2CcuCa7PYqaaUrHn15TjJWW/3GqsIbbtyewA9fQ1qwvEq4wBgZwe1bUqbhBTfc6YVlOEaLjZv8yO2s1QDgjg5J/i+lWftsUZGCPlPft9Kp11OTbVjH2M6C5YvuXra2OMnABPOapPq8KqRux1BPr61yzlJy02OulQVR8q7X9TpYTHGwHBHXA7Yri5dbMm0qxGMjjoauSa12uKL5JWT0f5nbvdxIvDkE55+nQV5bPrcjkgMRgkkE9eKJQagorqP62npPXoztLrV1U8n5thGfWvMTqEhdWcliHyAK2nFxS5NzJU5KSadr3V/I6671VmIwxPGCD/SuPMzsQd3zkjANYUZJNwjuddKn7Jqq10f4dTRe4bLhgTkAEevuKpRgs+4sSenPaqr05NKc31NaU1O6W1i1EXOCckEEEmpI1PIGQcYJPf3rG1lzRWhdWq+SNNatEwRcgZJIGQPWpyrRhGZgWTGR60XlNuJ3YdxpKnKbTj5kqzPsjJJbbJkD0HHSmCXITZ96TJOBWirOOq2OOvSbTjKWl7oupOPlwSVHGD3rP8znaQVG8ZA/z2rdWqR5pMunOcIXpPV9DaViNrnIwnAHaswuXUBixGcgHoa5INSjbozanjozUqTXvF5pwrqOhd8knvVBH4w+SAwwG7V02UIpR6mGFrVI1+ZS91LVWLW/5TuPLHj3qrsQ4diQowNp7c9ajmtUu0KeIlTg1BXWjLcEuHBXIwwHH9KqRbklHyjdu4OeBWbg37yLpVudJVFZanULIDH1zyFGe1RRRgqMDCsAcn+I1z3TTaVzurxUoxi3axWypfcACzEbvUirEcaq5O75Tnk1LUVFNGVJTi2+r1sKkZ3NsBLEgc9qtxq65OMMCCAO9dCgk4qTuZ1uWb9otGOeAgIHI+Z8FR29TU53FwS5GGyR6U/bybUuiLrQlRik9XJ39CBLZGVnKgiTIAP61fRUC/u2yc5ANZpRk1cj2MnFyT1X6/5DIIFSMIoCnnDGrI24KuCflOcdD61pUpJz5nszChVaaiviJIowCCCS248+lNiJwSoOAwUn0pVKcpxtF6G+PqxikqyXN0NKLknJG4jAB7+lSQhfkk2gbMfj6mopQi/i3CtXhFck42VtC1BE24hpAMMMH19qlRQCjZA87BDDvQ25at7EUK0eVpRs3+NyRMMfLYghWIx606PYpQhQSSSMVVRezXMupqlJ00ktET7WYPGoyjDJx29Kmjbj7oHzZJ+tazou6cdWc2HxKU+WeiX436lmEOELbduMgA01S4OCQxXJBNRFycrNHTOlOcHVi+qsWEc56kfLkKO1CSbiqqflHLYrak2leT2OKdSXtFOTstvmxI3ZQS5G7AJz71LgP0OPm5AqnVpuVkV7OUYKM1p37lsSEbT7AKfU1CDgISx+9k+1RVppu0jZXTUIq6/TqXUkdiMrhTnP5VXWXcV2t/CQD6Vo8OvZ8tjkxclCoo/ZZdDFSNxJDLtOf51CjZXkkAElQO9ZShaVmz0HyU6ShJXv+BbgDYJJGVbjiiPYCSSQSwPHY05pOatoc0pOlFpq6ZMSIQQi5Kn5j7VGu5024JJ/UVpBSjK01qck5RmlOmuVbFhXwoyPm2gZpqoVOFYHgnB71Voy96Jth7wioytf+tSxAQ0pJyeowfSiJRHh3JOccVNaLUVFMMPNus5SfzLigM5JPGcgjt61GSpUpnA25Jpqs5JRgOFH2k+ZxuyUyFirqAQCuSe1QRuQyp0VyADVcyheTjoyHJzlCEt09C00inAHGS2cVAeGYhgWyeB24rmhSStFBLHyTnGb2vYcHIBywySQCe1MDRhM89cknp9a9CKSsjinRk4Kdtd9SyrkKpBAXqMd6omVs4GTg5GPT1pVoRck0jTD1pwpcyjpr/w5PLNg9iHXGfSqj/Ph1IwhAwe1KktG2YVKs6s40pbXLHnuoDKx2hjg+tV45FYqjDI5Jx0NNXWrNItRTlR1d/wLr8JkSkDuvrVcyA7Qn3VyTj2qJQTdkdVLERcbR67kTJvlUljnIGBUkTEshGQQTketYunFqyMZVJ06iqW1Q5gE+VgdoPIPWoZ5PmABIwTnPetFhacoJyeppDFyhOfOrt9PUrZffjknPQ96SOZC55xtwCfWumcoqCRw+7Sm6sddAuV+XKnAPDH0qK4n3oVUbWYEZ9KFhE/ebKji7RvGJmTTBVCqxIDDB7jNZdzOTIyjI69K5YYdRV11OiNRTndvW+pde7CshZuH4JPSsISEgbySFJ4HT8adLDRUHzs6qtWc6icY2XVm2t7swEzjPOewrGTLFd5IVgTg16KoRjH3WebRrVIzUEvd7s3XughYhjuxj61ms55YsRtIA965ZYRNpTevQ68RiowftI/ClZl1LnKqcHqTg1S80fNuwQyr07VhPBQnLnka08TFQ5YK7/zLX2hfOXcCWAB5/pWe8y7iRyvBwO1XChColoY81WD54Su3dehoLdKdgBAZmIPt71kmQPIij5cjk+pronhopXgcmG5nJRlLXvY02uU+6SD8uAB/WsrBPJUBmckkdqahGU9PvLlCo5uFR3JpJ3ClxnKscH+lVwSxdQwMTIVBP865KkeaSbWhOEg+SVJPVa+ZE80rbRvyNwyPWoXTyyo3cKeDW9OmkmoluSc4QnfQnVi+4MQMZPFU1kIOV+6Wxk96yqTcUk9wxGHUm3zXuSGTDBi5IDEVGdpZcjB5x7/WqhGzV9Og4xUEpPVIvQMrSKCSctkZ7/WmQP8AvVcZyxUEDoOat02lzGGHkptqWmv9I6GJyyKQCBvGD61HHuKgRggJkA1nTelkbRmozUmr2eoPu8zcxOGYEjvxTAxlydwGMgZ6k962pRlFON7FYunSryU0t/wL0bIhQ8liB+NVkD/Lv9ASfSh02vieooVYyUaTVnF/mXg7YABAK849M1XmJKKu8AEdfT0xWsVeXKkY1akqUXKHUsIUAHUOCWz6VFFkKo3/AOsYnB7YrjcXzprVdR4ecZR5Fo11LyMEKBTjaFJA756j8KgAKqzOxHBxjtVys43W50TUU2uazNGMjb0K7sgE9z6VBG7lVB4y4yT2GBirXO3ZvUijShGFvNa9y/BIoUpk8EHjuKbbMCoJG1s4we9cMpuL5bHVRk3NzlsupcZlDRkjJyQD6VTLbSSMnHIx2ropvmVmjnpU6TfNGXW7RcjkAbcQxJOVz/D9Kp5YsCCcAgj2zUNqcEkXQxClHnSsrvTyLqud+dxAyDtPvVBSxbk5xghjWUaCbtc6Zz5HKpJe7axqhtxDuRtDAgDsTVNZWIUA4AcNn3B/pVumlFxWiOGFJxrRqQV2aPybcMxLtkH2qu+HEZWQHbkkj+lThpKbd3azHKU4q8Fe/wDVi6s65QDPC4yKpfKhxvOTnCn19qhQUpWi9DvnCpBKbjZ+ZJIwJ4IGc7j646VEzr8rAEOCMg+9dUqrcbNa3OGlTnKdmv6Y7fhBycHGM9sVUfOdmScKSw7fhQoxqNt6GcMZOmlCOq2JfN2KWTIIzn2qNHVTtfJBTFDqaqTXkaRhOSUk7P8AM0EkG0K2eADk1k+dlzGMnLbST2Fc06UnLm7Fp04Nwh8X+f8AkabMp2lckKSMn3qiJlwiqchcDBq4XnK8tmTOjVqU48r1JncHluGJ2k/yqtJlmOQRnn8a1jFSa5Xods1UjB0pq7/MYrtJtbOAAQo7D3qLduVQcqQ2CBUPmhJxjoYYdxqwuloh7ZjZ+Buyc1Vzn5w53cEk98VcUmrTZM5SjUjCGvUeZ0cMMjzGwCR2x0qlMSpB5O3JyO/1qqkEkm3axt9YVd8qXvfoTNKpX73KqTn1NZ7yN5noNoJz04qHBuze25tUjFx55O1rJf5jJZFzuZiAN3B9KMoe3XHPrRUhFpRSsji+qONdThJNb7FBmwzAEhVycCq83AZSWBLcY71rFNJRaKnjVVqT5bXS0Ip5V2MeC5JPPeqUhcbcYKbuSacItyuibONJNrrf1KD7m+U5G8E4HbFRySKyjLf6skAjvROCi1J7ke1nKKcVdN6opXRjULgcv39KrzkMuRk9ck9qmnSmqjTe/wCB2Y7ERnRi1o1su5mT7BhiDjgFj296juXHlSMD90Hk9BRBL2ia2KrYeOIwyUnyvqVXYZCgHK5AAqOQnEXJALZJrem3Zp9Nzjq4RU1dyu7aabCyOu9A34E9gKpvIPNG7BHKis0pKKcUFLHtVHCa5U0vmLxg7QR8wJz/AEqLc6up4K85A6A0b+9F3sdnOqceVx17l6Hy5PLBySCeTU1uSSuTgFckelZqs5SvYeKoJ03yv3nubtnp5ZchccYDetdRoTIVQY4DgmsueTak1scsaEZR9guvUprooIRwgGABk9T616da2UcsbKcHeBx6cc1q3GSfL13POpRqKdov4fxPFb7SZI/mJIJXA9+e9enaxpf7tkVSY2AII6g0QrNqy2uepRhOlS9pfXt3+Z86XsCxhd2eXOMfzrqdb07y2KsckEiupYVyXMmc9PH0ppcy97zPMZ2IkjUljwTuH9avXVptYl+JCpGB2rj9m02luxRnFxty6Lb59TLiuX52ucZ5A7mq5j2NtXPUHI71MaSWj6FqSqKKbSN+Ob5Qd5AbAbPU1lQSbRtCnljtPcUP3fdZu5NJtbdfNG75+MhSQAapQSnaVbIOR+NaU5RUkmcmN9omp09vzNOWViuCcl1GQe1URI3LLkZGMHtRKpyzdt2KvJVFGMnoStgtGBkFDuI9agJYDjsT9T7VmoqMbQ2ZeHoUoVZKTtbpfX1IJvvKwG7ajHPv2FRbnDDoAxBB7j2q4vljpqaVKcpQ5o99wkwFJbBBJJx6+lNlYPyOVJJAHY1yNXs2rMwzCs0lOm7W3XVkJyzH5eGxgjtik80JErZIbJAHpShKT0aPTr0oclOae5WBcbmJwuPXrilY7NwySzsAAOgqvdlG1jClUjCslbe5EXAY7cEnkE/0pkzMFIAwygE5/iFNUU1q9Sac5xq2ivd2D745bqcgCmFiBzwu3JX1rBJp32Z3yTi97228yIFVCFgN27GBR82A2CRyQPwqJUeZOUnqbPEcrUEt7X+YMMLhRkYJIqMn7hXOM8A9fxpU6enMkVGo3PkjL3RjbSVJYb2GAfT6VGRnb8pCgk59Kp01d2DCyVSMYzWtyBuoeMEFuMN2PrUjZfGWHXO30rGc4295WN7STsnsUfnc57nByO1Pdy2PmI7HHY1Dkoy5YnDUoxlNTW6/ErHGH+UBjgAjtTlcKMyHgMVz61o6Sup21N5YuVNckHc//9k=" + ) scenario.variables["phonenumber"] = "" scenario.variables["templateid0"] = "" scenario.variables["sigid0"] = "" diff --git a/tests/test_services/test_set_867.py b/tests/test_services/test_set_867.py index 1eb6a8de..4dd4776c 100644 --- a/tests/test_services/test_set_867.py +++ b/tests/test_services/test_set_867.py @@ -21,15 +21,15 @@ def test_set_867(client: utest.Client, variables: dict): scenario.variables["SnapshotSysDesc"] = "snapshot-ARK-SYS-01-desc" scenario.variables["SnapDiskType"] = "LocalBoot" scenario.variables["SnapshotDataNameModify"] = "snapshot-ARK-DATA-01-modify" - scenario.variables[ - "SnapshotDataDescModify" - ] = "snapshot-ARK-DATA-01-desc-Modify" + scenario.variables["SnapshotDataDescModify"] = ( + "snapshot-ARK-DATA-01-desc-Modify" + ) scenario.variables["UhostName"] = "uhost-snapshot-ARK-auto-api-1" scenario.variables["SnapshotDataName"] = "snapshot-ARK-DATA-01" scenario.variables["SnapshotDataDesc"] = "snapshot-ARK-DATA-01-desc" - scenario.variables[ - "CreateFromTimeMachinePassword" - ] = "Z3VhbmxpeXVhbm1pbWExMjMhQCM=" + scenario.variables["CreateFromTimeMachinePassword"] = ( + "Z3VhbmxpeXVhbm1pbWExMjMhQCM=" + ) scenario.variables["ImageID"] = "#{u_get_image_resource($Region,$Zone)}" scenario.run(client) diff --git a/tests/test_unit/test_core/consts.py b/tests/test_unit/test_core/consts.py new file mode 100644 index 00000000..6d66f731 --- /dev/null +++ b/tests/test_unit/test_core/consts.py @@ -0,0 +1 @@ +TEST_URL = "https://api.ucloud.cn/" diff --git a/tests/test_unit/test_core/test_auth.py b/tests/test_unit/test_core/test_auth.py index b8a8fc42..b64ed35a 100644 --- a/tests/test_unit/test_core/test_auth.py +++ b/tests/test_unit/test_core/test_auth.py @@ -22,3 +22,7 @@ def test_verify_ac(): "46f09bb9fab4f12dfc160dae12273d5332b5debe", ) assert cred.verify_ac(d) == "4f9ef5df2abab2c6fccd1e9515cb7e2df8c6bb65" + assert cred.to_dict() == { + "public_key": "ucloudsomeone@example.com1296235120854146120", + "private_key": "46f09bb9fab4f12dfc160dae12273d5332b5debe", + } diff --git a/tests/test_unit/test_core/test_client.py b/tests/test_unit/test_core/test_client.py index 3973446e..f9c1c03c 100644 --- a/tests/test_unit/test_core/test_client.py +++ b/tests/test_unit/test_core/test_client.py @@ -1,15 +1,22 @@ -import os +import json +import uuid + import pytest import logging +import collections +import requests_mock from ucloud.client import Client from ucloud.core import exc +from ucloud.core.transport import RequestsTransport, http from ucloud.testing.mock import MockedTransport +from tests.test_unit.test_core import consts + logger = logging.getLogger(__name__) -@pytest.fixture(scope="session", autouse=True) +@pytest.fixture(scope="function", autouse=True) def client(): return Client( { @@ -17,7 +24,6 @@ def client(): "public_key": "foo", "private_key": "foo", "timeout": 10, - "max_retries": 3, "ssl_verify": False, } ) @@ -28,54 +34,73 @@ def transport(): return MockedTransport() -class TestClient: - def test_client_invoke(self, client, transport): - transport.mock_data(lambda _: {"RetCode": 0, "Action": "Foo"}) - client.transport = transport +def test_client_invoke(client): + expected = {"RetCode": 0, "Action": "Foo"} + with requests_mock.Mocker() as m: + m.post( + consts.TEST_URL, + text=json.dumps(expected), + headers={http.REQUEST_UUID_HEADER_KEY: str(uuid.uuid4())}, + ) + assert client.invoke("Foo") == expected + - assert client.invoke("Foo") == {"RetCode": 0, "Action": "Foo"} +def test_client_invoke_code_error(client): + expected = {"RetCode": 171, "Action": "Foo", "Message": "签名错误"} - def test_client_invoke_code_error(self, client, transport): - transport.mock_data(lambda _: {"RetCode": 171, "Action": "Foo"}) - client.transport = transport + with requests_mock.Mocker() as m: + m.post( + consts.TEST_URL, + text=json.dumps(expected), + headers={http.REQUEST_UUID_HEADER_KEY: str(uuid.uuid4())}, + ) with pytest.raises(exc.RetCodeException): try: client.invoke("Foo") except exc.RetCodeException as e: - assert str(e) - expected = {"RetCode": 171, "Action": "Foo", "Message": ""} - assert e.json() == expected + assert e.retryable is False + assert e.json() == { + "RetCode": 171, + "Action": "Foo", + "Message": "签名错误", + } raise e - def test_client_invoke_with_retryable_error(self, client, transport): - # RetCodeError is retryable when code is greater than 2000 - transport.mock_data(lambda _: {"RetCode": 10000, "Action": "Foo"}) - client.transport = transport +def test_client_invoke_with_retryable_error(client): + # RetCodeError is retryable when code is greater than 2000 + with requests_mock.Mocker() as m: + m.post( + consts.TEST_URL, + text=json.dumps({"RetCode": 10000, "Action": "Foo"}), + ) with pytest.raises(exc.RetCodeException): client.invoke("Foo") - def test_client_invoke_with_unexpected_error(self, client, transport): - def raise_error(_): - raise ValueError("temporary error") - transport.mock_data(raise_error) - client.transport = transport +def test_client_invoke_with_unexpected_error(client): + def raise_error(_): + raise ValueError("temporary error") - with pytest.raises(ValueError): - client.invoke("Foo") + transport = RequestsTransport() + transport.middleware.request(raise_error) + client.transport = transport + + with pytest.raises(ValueError): + client.invoke("Foo") + + +def test_client_try_import(client): + for name in dir(client): + if name.startswith("_") or name in [ + "invoke", + "logged_request_handler", + "logged_response_handler", + "logged_exception_handler", + ]: + continue - def test_client_try_import(self, client): - assert client.pathx() - assert client.stepflow() - assert client.uaccount() - assert client.udb() - assert client.udpn() - assert client.udisk() - assert client.uhost() - assert client.ulb() - assert client.umem() - assert client.unet() - assert client.uphost() - assert client.vpc() + client_factory = getattr(client, name) + if isinstance(client_factory, collections.Callable): + print(client_factory()) diff --git a/tests/test_unit/test_core/test_encoder.py b/tests/test_unit/test_core/test_encoder.py index 746bc76c..3bdf1a84 100644 --- a/tests/test_unit/test_core/test_encoder.py +++ b/tests/test_unit/test_core/test_encoder.py @@ -13,6 +13,7 @@ ({"foo": True}, {"foo": "true"}), ({"foo": False}, {"foo": "false"}), ({"IP": ["127.0.0.1"]}, {"IP.0": "127.0.0.1"}), + ({"TemplateParams": ["中文"]}, {"TemplateParams.0": "中文"}), ({"IP": ["foo", "bar"]}, {"IP.0": "foo", "IP.1": "bar"}), ({"IP": [{"foo": "bar"}]}, {"IP.0.foo": "bar"}), ], diff --git a/tests/test_unit/test_core/test_transport.py b/tests/test_unit/test_core/test_transport.py index f6b0da6d..484a4a70 100644 --- a/tests/test_unit/test_core/test_transport.py +++ b/tests/test_unit/test_core/test_transport.py @@ -1,73 +1,136 @@ +import json +import uuid + import pytest import logging - -from ucloud.core.transport import RequestsTransport, Request, Response, utils +import requests_mock +from collections import Counter + +from tests.test_unit.test_core.consts import TEST_URL +from ucloud.core import exc +from ucloud.core.transport import ( + RequestsTransport, + Request, + Response, + utils, + http, +) logger = logging.getLogger(__name__) -@pytest.fixture(scope="function", autouse=True) -def transport(): +@pytest.fixture(name="transport", scope="function", autouse=True) +def transport_factory(): return RequestsTransport() -class TestTransport: - def test_transport_send(self, transport): - req = Request( - url="http://httpbin.org/anything", - method="post", - json={"foo": "bar"}, - ) - resp = transport.send(req) - assert resp.text - assert resp.json()["json"] == {"foo": "bar"} - - def test_transport_handler(self, transport): - global_env = {} - - def request_handler(r): - global_env["req"] = r - return r - - def response_handler(r): - global_env["resp"] = r - return r - - transport.middleware.request(handler=request_handler) - transport.middleware.response(handler=response_handler) - - req = Request( - url="http://httpbin.org/anything", - method="post", - json={"foo": "bar"}, +@pytest.mark.parametrize( + argnames=("status_code", "content", "expect", "expect_exc", "retryable"), + argvalues=( + ( + 200, + '{"Action": "Mock", "RetCode": 0}', + {"Action": "Mock", "RetCode": 0}, + None, + False, + ), + (500, "{}", None, exc.HTTPStatusException, False), + (429, "{}", None, exc.HTTPStatusException, True), + (500, "x", None, exc.HTTPStatusException, False), + (200, "x", None, exc.InvalidResponseException, False), + ), +) +def test_transport( + transport, status_code, content, expect, expect_exc, retryable +): + with requests_mock.Mocker() as m: + m.post(TEST_URL, text=content, status_code=status_code) + + got_exc = None + try: + resp = transport.send(Request(url=TEST_URL, method="post", json={})) + assert resp.json() == expect + except Exception as e: + got_exc = e + + if expect_exc: + assert str(got_exc) + assert got_exc.retryable == retryable + assert isinstance(got_exc, expect_exc) + + +def test_transport_handler(transport): + req_key, resp_key, exc_key = "req", "resp", "exc" + counter = Counter({req_key: 0, resp_key: 0, exc_key: 0}) + + def request_handler(r): + counter[req_key] += 1 + return r + + def response_handler(r): + counter[resp_key] += 1 + return r + + def exception_handler(r): + counter[exc_key] += 1 + return r + + transport.middleware.request(handler=request_handler) + transport.middleware.response(handler=response_handler) + transport.middleware.exception(handler=exception_handler) + + expect = {"foo": "bar"} + req = Request(url=TEST_URL, method="post", json=expect) + + with requests_mock.Mocker() as m: + request_uuid = str(uuid.uuid4()) + m.post( + TEST_URL, + text=json.dumps(expect), + status_code=200, + headers={http.REQUEST_UUID_HEADER_KEY: request_uuid}, ) resp = transport.send(req) assert resp.text - assert resp.json()["json"] == {"foo": "bar"} - - assert "req" in global_env - assert "resp" in global_env - - -class TestResponse: - def test_guess_json_utf(self): - import json - - encodings = [ - "utf-32", - "utf-8-sig", - "utf-16", - "utf-8", - "utf-16-be", - "utf-16-le", - "utf-32-be", - "utf-32-le", - ] - for e in encodings: - s = json.dumps("表意字符").encode(e) - assert utils.guess_json_utf(s) == e - - def test_response_empty_content(self): - r = Response("http://foo.bar", "post") - assert not r.text + assert resp.json() == expect + assert resp.request_uuid == request_uuid + + with pytest.raises(Exception): + transport.send(Request(url="/")) + + assert counter[req_key] == 2 + assert counter[resp_key] == 1 + assert counter[exc_key] == 1 + + +def test_guess_json_utf(): + encodings = [ + "utf-32", + "utf-8-sig", + "utf-16", + "utf-8", + "utf-16-be", + "utf-16-le", + "utf-32-be", + "utf-32-le", + ] + for e in encodings: + s = json.dumps("表意字符").encode(e) + assert utils.guess_json_utf(s) == e + + +def test_request_methods(): + req = Request( + TEST_URL, data={"foo": 42}, json={"bar": 42}, params={"q": "search"} + ) + assert req.payload() == {"foo": 42, "bar": 42, "q": "search"} + + +def test_response_methods(): + r = Response(TEST_URL, "post") + assert not r.text + assert r.json() is None + + r = Response(TEST_URL, "post", content=b"\xd6", encoding="utf-8") + with pytest.raises(exc.InvalidResponseException): assert r.json() is None diff --git a/ucloud/_compat.py b/ucloud/_compat.py deleted file mode 100644 index 62fed4c1..00000000 --- a/ucloud/_compat.py +++ /dev/null @@ -1,21 +0,0 @@ -from ucloud.core import client - - -class CompactClient(client.Client): - def __init__(self, config: dict, transport=None, middleware=None): - self._config = config - super(CompactClient, self).__init__(config, transport, middleware) - - def pathx(self): - from ucloud.services.pathx.client import PathXClient - - return PathXClient( - self._config, self.transport, self.middleware, self.logger - ) - - def vpc(self): - from ucloud.services.vpc.client import VPCClient - - return VPCClient( - self._config, self.transport, self.middleware, self.logger - ) diff --git a/ucloud/client.py b/ucloud/client.py index 29580710..3670cfa3 100644 --- a/ucloud/client.py +++ b/ucloud/client.py @@ -1,135 +1,539 @@ """ Code is generated by ucloud-model, DO NOT EDIT IT. """ -from ucloud._compat import CompactClient +from ucloud.core import client -class Client(CompactClient): - def __init__(self, config: dict, transport=None, middleware=None): +class Client(client.Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): self._config = config - super(Client, self).__init__(config, transport, middleware) + super(Client, self).__init__( + self._auto_config(), transport, middleware, logger + ) def pathx(self): from ucloud.services.pathx.client import PathXClient return PathXClient( - self._config, self.transport, self.middleware, self.logger + self._auto_config("pathx"), + self.transport, + self.middleware, + self.logger, + ) + + def cube(self): + from ucloud.services.cube.client import CubeClient + + return CubeClient( + self._auto_config("cube"), + self.transport, + self.middleware, + self.logger, + ) + + def iam(self): + from ucloud.services.iam.client import IAMClient + + return IAMClient( + self._auto_config("iam"), + self.transport, + self.middleware, + self.logger, + ) + + def ipsecvpn(self): + from ucloud.services.ipsecvpn.client import IPSecVPNClient + + return IPSecVPNClient( + self._auto_config("ipsecvpn"), + self.transport, + self.middleware, + self.logger, + ) + + def isms(self): + from ucloud.services.isms.client import ISMSClient + + return ISMSClient( + self._auto_config("isms"), + self.transport, + self.middleware, + self.logger, + ) + + def nlb(self): + from ucloud.services.nlb.client import NLBClient + + return NLBClient( + self._auto_config("nlb"), + self.transport, + self.middleware, + self.logger, + ) + + def sts(self): + from ucloud.services.sts.client import STSClient + + return STSClient( + self._auto_config("sts"), + self.transport, + self.middleware, + self.logger, ) def stepflow(self): from ucloud.services.stepflow.client import StepFlowClient return StepFlowClient( - self._config, self.transport, self.middleware, self.logger + self._auto_config("stepflow"), + self.transport, + self.middleware, + self.logger, + ) + + def tidb(self): + from ucloud.services.tidb.client import TiDBClient + + return TiDBClient( + self._auto_config("tidb"), + self.transport, + self.middleware, + self.logger, + ) + + def uaaa(self): + from ucloud.services.uaaa.client import UAAAClient + + return UAAAClient( + self._auto_config("uaaa"), + self.transport, + self.middleware, + self.logger, + ) + + def uads(self): + from ucloud.services.uads.client import UADSClient + + return UADSClient( + self._auto_config("uads"), + self.transport, + self.middleware, + self.logger, ) def uaccount(self): from ucloud.services.uaccount.client import UAccountClient return UAccountClient( - self._config, self.transport, self.middleware, self.logger + self._auto_config("uaccount"), + self.transport, + self.middleware, + self.logger, + ) + + def ubill(self): + from ucloud.services.ubill.client import UBillClient + + return UBillClient( + self._auto_config("ubill"), + self.transport, + self.middleware, + self.logger, ) def ucdn(self): from ucloud.services.ucdn.client import UCDNClient return UCDNClient( - self._config, self.transport, self.middleware, self.logger + self._auto_config("ucdn"), + self.transport, + self.middleware, + self.logger, + ) + + def uclickhouse(self): + from ucloud.services.uclickhouse.client import UClickhouseClient + + return UClickhouseClient( + self._auto_config("uclickhouse"), + self.transport, + self.middleware, + self.logger, + ) + + def ucompshare(self): + from ucloud.services.ucompshare.client import UCompShareClient + + return UCompShareClient( + self._auto_config("ucompshare"), + self.transport, + self.middleware, + self.logger, ) def udb(self): from ucloud.services.udb.client import UDBClient return UDBClient( - self._config, self.transport, self.middleware, self.logger + self._auto_config("udb"), + self.transport, + self.middleware, + self.logger, + ) + + def udbproxy(self): + from ucloud.services.udbproxy.client import UDBProxyClient + + return UDBProxyClient( + self._auto_config("udbproxy"), + self.transport, + self.middleware, + self.logger, + ) + + def uddb(self): + from ucloud.services.uddb.client import UDDBClient + + return UDDBClient( + self._auto_config("uddb"), + self.transport, + self.middleware, + self.logger, + ) + + def udi(self): + from ucloud.services.udi.client import UDIClient + + return UDIClient( + self._auto_config("udi"), + self.transport, + self.middleware, + self.logger, + ) + + def udns(self): + from ucloud.services.udns.client import UDNSClient + + return UDNSClient( + self._auto_config("udns"), + self.transport, + self.middleware, + self.logger, ) def udpn(self): from ucloud.services.udpn.client import UDPNClient return UDPNClient( - self._config, self.transport, self.middleware, self.logger + self._auto_config("udpn"), + self.transport, + self.middleware, + self.logger, + ) + + def udts(self): + from ucloud.services.udts.client import UDTSClient + + return UDTSClient( + self._auto_config("udts"), + self.transport, + self.middleware, + self.logger, ) def udisk(self): from ucloud.services.udisk.client import UDiskClient return UDiskClient( - self._config, self.transport, self.middleware, self.logger + self._auto_config("udisk"), + self.transport, + self.middleware, + self.logger, + ) + + def uec(self): + from ucloud.services.uec.client import UECClient + + return UECClient( + self._auto_config("uec"), + self.transport, + self.middleware, + self.logger, + ) + + def ues(self): + from ucloud.services.ues.client import UESClient + + return UESClient( + self._auto_config("ues"), + self.transport, + self.middleware, + self.logger, + ) + + def ufs(self): + from ucloud.services.ufs.client import UFSClient + + return UFSClient( + self._auto_config("ufs"), + self.transport, + self.middleware, + self.logger, + ) + + def ufile(self): + from ucloud.services.ufile.client import UFileClient + + return UFileClient( + self._auto_config("ufile"), + self.transport, + self.middleware, + self.logger, + ) + + def ugn(self): + from ucloud.services.ugn.client import UGNClient + + return UGNClient( + self._auto_config("ugn"), + self.transport, + self.middleware, + self.logger, + ) + + def uhids(self): + from ucloud.services.uhids.client import UHIDSClient + + return UHIDSClient( + self._auto_config("uhids"), + self.transport, + self.middleware, + self.logger, + ) + + def uhadoop(self): + from ucloud.services.uhadoop.client import UHadoopClient + + return UHadoopClient( + self._auto_config("uhadoop"), + self.transport, + self.middleware, + self.logger, ) def uhost(self): from ucloud.services.uhost.client import UHostClient return UHostClient( - self._config, self.transport, self.middleware, self.logger + self._auto_config("uhost"), + self.transport, + self.middleware, + self.logger, + ) + + def uhub(self): + from ucloud.services.uhub.client import UHubClient + + return UHubClient( + self._auto_config("uhub"), + self.transport, + self.middleware, + self.logger, + ) + + def uk8s(self): + from ucloud.services.uk8s.client import UK8SClient + + return UK8SClient( + self._auto_config("uk8s"), + self.transport, + self.middleware, + self.logger, + ) + + def ukafka(self): + from ucloud.services.ukafka.client import UKafkaClient + + return UKafkaClient( + self._auto_config("ukafka"), + self.transport, + self.middleware, + self.logger, ) def ulb(self): from ucloud.services.ulb.client import ULBClient return ULBClient( - self._config, self.transport, self.middleware, self.logger + self._auto_config("ulb"), + self.transport, + self.middleware, + self.logger, + ) + + def ulogservice(self): + from ucloud.services.ulogservice.client import ULogServiceClient + + return ULogServiceClient( + self._auto_config("ulogservice"), + self.transport, + self.middleware, + self.logger, ) def umem(self): from ucloud.services.umem.client import UMemClient return UMemClient( - self._config, self.transport, self.middleware, self.logger + self._auto_config("umem"), + self.transport, + self.middleware, + self.logger, + ) + + def umongodb(self): + from ucloud.services.umongodb.client import UMongoDBClient + + return UMongoDBClient( + self._auto_config("umongodb"), + self.transport, + self.middleware, + self.logger, + ) + + def unvs(self): + from ucloud.services.unvs.client import UNVSClient + + return UNVSClient( + self._auto_config("unvs"), + self.transport, + self.middleware, + self.logger, ) def unet(self): from ucloud.services.unet.client import UNetClient return UNetClient( - self._config, self.transport, self.middleware, self.logger + self._auto_config("unet"), + self.transport, + self.middleware, + self.logger, + ) + + def upfs(self): + from ucloud.services.upfs.client import UPFSClient + + return UPFSClient( + self._auto_config("upfs"), + self.transport, + self.middleware, + self.logger, ) def uphost(self): from ucloud.services.uphost.client import UPHostClient return UPHostClient( - self._config, self.transport, self.middleware, self.logger + self._auto_config("uphost"), + self.transport, + self.middleware, + self.logger, + ) + + def upgsql(self): + from ucloud.services.upgsql.client import UPgSQLClient + + return UPgSQLClient( + self._auto_config("upgsql"), + self.transport, + self.middleware, + self.logger, + ) + + def uphone(self): + from ucloud.services.uphone.client import UPhoneClient + + return UPhoneClient( + self._auto_config("uphone"), + self.transport, + self.middleware, + self.logger, + ) + + def uslk(self): + from ucloud.services.uslk.client import USLKClient + + return USLKClient( + self._auto_config("uslk"), + self.transport, + self.middleware, + self.logger, ) def usms(self): from ucloud.services.usms.client import USMSClient return USMSClient( - self._config, self.transport, self.middleware, self.logger + self._auto_config("usms"), + self.transport, + self.middleware, + self.logger, ) - def ipsecvpn(self): - from ucloud.services.ipsecvpn.client import IPSecVPNClient + def utsdb(self): + from ucloud.services.utsdb.client import UTSDBClient - return IPSecVPNClient( - self._config, self.transport, self.middleware, self.logger + return UTSDBClient( + self._auto_config("utsdb"), + self.transport, + self.middleware, + self.logger, ) - def ucloudstack(self): - from ucloud.services.ucloudstack.client import UCloudStackClient + def uvms(self): + from ucloud.services.uvms.client import UVMSClient - return UCloudStackClient( - self._config, self.transport, self.middleware, self.logger + return UVMSClient( + self._auto_config("uvms"), + self.transport, + self.middleware, + self.logger, ) - def ufs(self): - from ucloud.services.ufs.client import UFSClient + def uwsc(self): + from ucloud.services.uwsc.client import UWSCClient - return UFSClient( - self._config, self.transport, self.middleware, self.logger + return UWSCClient( + self._auto_config("uwsc"), + self.transport, + self.middleware, + self.logger, ) - def uhub(self): - from ucloud.services.uhub.client import UHubClient + def ipv6gw(self): + from ucloud.services.ipv6gw.client import ipv6gwClient - return UHubClient( - self._config, self.transport, self.middleware, self.logger + return ipv6gwClient( + self._auto_config("ipv6gw"), + self.transport, + self.middleware, + self.logger, ) def vpc(self): from ucloud.services.vpc.client import VPCClient return VPCClient( - self._config, self.transport, self.middleware, self.logger + self._auto_config("vpc"), + self.transport, + self.middleware, + self.logger, + ) + + def _auto_config(self, package="generic"): + user_agent = "Package/{} {}".format( + package, self._config.get("user_agent") or "" ) + return dict(user_agent=user_agent.rstrip(), **self._config) diff --git a/ucloud/core/auth/_cfg.py b/ucloud/core/auth/_cfg.py index e1b7f5f6..ed8d4fa0 100644 --- a/ucloud/core/auth/_cfg.py +++ b/ucloud/core/auth/_cfg.py @@ -11,7 +11,7 @@ class CredentialSchema(schema.Schema): def verify_ac(private_key: str, params: dict) -> str: - """ calculate signature by private_key/public_key + """calculate signature by private_key/public_key the keys can be found on `APIKey documentation `__ @@ -39,7 +39,7 @@ def verify_ac(private_key: str, params: dict) -> str: class Credential: - """ credential is the object to store credential information + """credential is the object to store credential information the keys can be found on `APIKey documentation `__ diff --git a/ucloud/core/client/_cfg.py b/ucloud/core/client/_cfg.py index 9a44d0b2..970faddc 100644 --- a/ucloud/core/client/_cfg.py +++ b/ucloud/core/client/_cfg.py @@ -10,7 +10,7 @@ class ConfigSchema(schema.Schema): "base_url": fields.Str(default="https://api.ucloud.cn"), "user_agent": fields.Str(), "timeout": fields.Int(default=30), - "max_retries": fields.Int(default=3), + "max_retries": fields.Int(default=0), "log_level": fields.Int(default=logging.INFO), "validate_request": fields.Bool(default=True), "ssl_verify": fields.Bool(default=True), diff --git a/ucloud/core/client/_client.py b/ucloud/core/client/_client.py index 81f5ee58..980a5bc3 100644 --- a/ucloud/core/client/_client.py +++ b/ucloud/core/client/_client.py @@ -1,6 +1,7 @@ import typing import logging import sys +import time from ucloud import version from ucloud.core.client._cfg import Config @@ -9,14 +10,13 @@ RequestsTransport, Request, SSLOption, + http, ) from ucloud.core.typesystem import encoder from ucloud.core.utils import log from ucloud.core.utils.middleware import Middleware from ucloud.core import auth, exc -default_transport = RequestsTransport() - class Client: def __init__( @@ -29,16 +29,17 @@ def __init__( cfg, cred = self._parse_dict_config(config) self.config = cfg self.credential = cred - self.transport = transport or default_transport + self.transport = transport or RequestsTransport() self.logger = logger or log.default_logger if middleware is None: middleware = Middleware() middleware.response(self.logged_response_handler) middleware.request(self.logged_request_handler) + middleware.exception(self.logged_exception_handler) self._middleware = middleware def invoke(self, action: str, args: dict = None, **options) -> dict: - """ invoke will invoke the action with arguments data and options + """invoke will invoke the action with arguments data and options :param str action: the api action, like `CreateUHostInstance` :param dict args: arguments of api(action), see doc: `UCloud API Documentation `__ @@ -46,14 +47,14 @@ def invoke(self, action: str, args: dict = None, **options) -> dict: """ retries = 0 max_retries = options.get("max_retries") or self.config.max_retries + timeout = options.get("timeout") or self.config.timeout while retries <= max_retries: try: - return self._send(action, args or {}, **options) + return self._send( + action, args or {}, max_retries=max_retries, timeout=timeout + ) except exc.UCloudException as e: - for handler in self.middleware.exception_handlers: - handler(e) - if e.retryable and retries != max_retries: logging.info( "Retrying {action}: {args}".format( @@ -62,11 +63,6 @@ def invoke(self, action: str, args: dict = None, **options) -> dict: ) retries += 1 continue - - raise e - except Exception as e: - for handler in self.middleware.exception_handlers: - handler(e) raise e @property @@ -74,53 +70,77 @@ def middleware(self) -> Middleware: return self._middleware def logged_request_handler(self, req): - self.logger.info("[request] {} {}".format(req.get("Action", ""), req)) + action = req.get("Action", "") + self.logger.info("[request] {} {}".format(action, req)) return req - def logged_response_handler(self, resp): + def logged_response_handler(self, resp, http_resp: http.Response = None): + action = resp.get("Action", "") + request_uuid = http_resp and http_resp.request_uuid self.logger.info( - "[response] {} {}".format(resp.get("Action", ""), resp) + "[response] [{}] {} {}".format(request_uuid or "*", action, resp) ) return resp + def logged_exception_handler(self, e: Exception): + if isinstance(e, exc.RetCodeException): + self.logger.warning(e) + else: + self.logger.exception(e) + return e + @staticmethod def _parse_dict_config( config: dict, ) -> typing.Tuple[Config, auth.Credential]: return Config.from_dict(config), auth.Credential.from_dict(config) - def _send(self, action: str, args: dict, **options) -> dict: + def _send(self, action: str, args: dict, max_retries, timeout) -> dict: args["Action"] = action + + # inject request middleware for handler in self.middleware.request_handlers: args = handler(args) - req = self._build_http_request(args) - - max_retries = options.get("max_retries") or self.config.max_retries - timeout = options.get("timeout") or self.config.timeout - - resp = self.transport.send( - req, - ssl_option=SSLOption( - self.config.ssl_verify, - self.config.ssl_cacert, - self.config.ssl_cert, - self.config.ssl_key, - ), - timeout=timeout, - max_retries=max_retries, - ).json() - - for handler in self.middleware.response_handlers: - resp = handler(resp) - if int(resp.get("RetCode", -1)) != 0: - raise exc.RetCodeException( - action=req.data.get("Action"), - code=int(resp.get("RetCode")), - message=resp.get("Message"), + # send http request + try: + req = self._build_http_request(args) + + resp = self.transport.send( + req, + ssl_option=SSLOption( + self.config.ssl_verify, + self.config.ssl_cacert, + self.config.ssl_cert, + self.config.ssl_key, + ), + timeout=timeout, + max_retries=max_retries, ) + data = resp.json() + except Exception as e: + for handler in self.middleware.exception_handlers: + handler(e) + raise e - return resp + # inject response middleware + for handler in self.middleware.response_handlers: + data = handler(data, resp) + + # return when successful + if int(data.get("RetCode", -1)) == 0: + return data + + # inject exception middleware + ret_code_exc = exc.RetCodeException( + action=req.data.get("Action", ""), + code=int(data.get("RetCode", 0)), + message=data.get("Message", ""), + request_uuid=resp.request_uuid, + ) + for handler in self.middleware.exception_handlers: + handler(ret_code_exc) + raise ret_code_exc def _build_http_request(self, args: dict) -> Request: config = { @@ -139,6 +159,7 @@ def _build_http_request(self, args: dict) -> Request: headers={ "User-Agent": self._build_user_agent(), "Content-Type": "application/x-www-form-urlencoded", + "U-Timestamp-Ms": str(int(round(time.time() * 1000))), }, ) diff --git a/ucloud/core/exc/__init__.py b/ucloud/core/exc/__init__.py index 9a357633..c2632d4c 100644 --- a/ucloud/core/exc/__init__.py +++ b/ucloud/core/exc/__init__.py @@ -3,11 +3,7 @@ ValidationException, RetCodeException, RetryTimeoutException, + TransportException, + HTTPStatusException, + InvalidResponseException, ) - -__all__ = [ - "UCloudException", - "ValidationException", - "RetCodeException", - "RetryTimeoutException", -] diff --git a/ucloud/core/exc/_exc.py b/ucloud/core/exc/_exc.py index 1672f502..9eeb740d 100644 --- a/ucloud/core/exc/_exc.py +++ b/ucloud/core/exc/_exc.py @@ -1,4 +1,4 @@ -import collections +from collections.abc import Iterable from ucloud.core.utils import compat @@ -12,18 +12,58 @@ def retryable(self): MAX_COMMON_RET_CODE = 2000 +class TransportException(UCloudException): + pass + + +class HTTPStatusException(TransportException): + def __init__(self, status_code: int, request_uuid: str = None): + self.status_code = status_code + self.request_uuid = request_uuid + + @property + def retryable(self): + return self.status_code in [429, 502, 503, 504] + + def __str__(self): + return "[{uuid}] {self.status_code} http status error".format( + self=self, uuid=self.request_uuid or "*" + ) + + +class InvalidResponseException(TransportException): + def __init__(self, content: bytes, message: str, request_uuid: str = None): + self.content = content + self.message = message + self.request_uuid = request_uuid + + @property + def retryable(self): + return False + + def __str__(self): + return "[{uuid}] {self.message}: {self.content}".format( + self=self, uuid=self.request_uuid or "*" + ) + + class RetCodeException(UCloudException): - def __init__(self, action: str, code: int, message: str): + def __init__( + self, action: str, code: int, message: str, request_uuid: str = None + ): self.action = action self.code = code self.message = message + self.request_uuid = request_uuid @property def retryable(self): return self.code > MAX_COMMON_RET_CODE def __str__(self): - return "{self.action} - {self.code}: {self.message}".format(self=self) + return "[{uuid}] {self.action} - {self.code}: {self.message}".format( + self=self, uuid=self.request_uuid or "*" + ) def json(self): return { @@ -41,7 +81,7 @@ class ValidationException(UCloudException): def __init__(self, e=None): if isinstance(e, compat.string_types): self.errors = [e] - elif isinstance(e, collections.Iterable): + elif isinstance(e, Iterable): self.errors = e or [] else: self.errors = [e] diff --git a/ucloud/core/transport/_requests.py b/ucloud/core/transport/_requests.py index 0652ac72..6a6cd3dc 100644 --- a/ucloud/core/transport/_requests.py +++ b/ucloud/core/transport/_requests.py @@ -6,10 +6,11 @@ from ucloud.core.transport import http from ucloud.core.transport.http import Request, Response, SSLOption from ucloud.core.utils.middleware import Middleware +from ucloud.core import exc class RequestsTransport(http.Transport): - """ transport is the implementation of http client, use for send a request and return a http response + """transport is the implementation of http client, use for send a request and return a http response :type max_retries: int :param max_retries: max retries is the max number of transport request when occur http error @@ -34,7 +35,7 @@ def __init__( self._middleware = Middleware() def send(self, req: Request, **options: typing.Any) -> http.Response: - """ send request and return the response + """send request and return the response :param req: the full http request descriptor :return: the response of http request @@ -56,7 +57,7 @@ def send(self, req: Request, **options: typing.Any) -> http.Response: @property def middleware(self) -> Middleware: - """ the middleware object, see :mod: + """the middleware object, see :mod: :return: the transport middleware """ @@ -79,11 +80,17 @@ def _send(self, req: Request, **options: typing.Any) -> requests.Response: data=req.data, params=req.params, headers=req.headers, + timeout=options.get("timeout"), **kwargs ) resp = self.convert_response(session_resp) resp.request = req resp.response_time = time.time() + + if resp.status_code >= 400: + raise exc.HTTPStatusException( + resp.status_code, resp.request_uuid + ) return resp @staticmethod diff --git a/ucloud/core/transport/http.py b/ucloud/core/transport/http.py index 6f984b5d..985c88f9 100644 --- a/ucloud/core/transport/http.py +++ b/ucloud/core/transport/http.py @@ -2,6 +2,7 @@ import logging import json as json_mod +from ucloud.core import exc from ucloud.core.transport import utils from ucloud.core.utils.compat import str @@ -34,6 +35,9 @@ def payload(self): return payload +REQUEST_UUID_HEADER_KEY = "X-UCLOUD-REQUEST-UUID" + + class Response: def __init__( self, @@ -52,28 +56,27 @@ def __init__( self.request = request self.status_code = status_code self.reason = reason - self.headers = headers self.content = content self.encoding = encoding self.response_time = 0 + self.headers = headers or {} + self.request_uuid = self.headers.get(REQUEST_UUID_HEADER_KEY) def json(self, **kwargs) -> typing.Optional[dict]: - """ json will return the bytes of content - """ + """json will return the bytes of content""" if not self.content: return None - encoding = utils.guess_json_utf(self.content) - if encoding is not None: - try: - return json_mod.loads(self.content.decode(encoding), **kwargs) - except UnicodeDecodeError: - pass - return json_mod.loads(self.text, **kwargs) + try: + return self._decode_json(**kwargs) + except Exception as e: + raise exc.InvalidResponseException( + self.content, str(e), request_uuid=self.request_uuid + ) @property def text(self): - """ text will return the unicode string of content, + """text will return the unicode string of content, see `requests.Response.text` """ if not self.content: @@ -84,9 +87,17 @@ def text(self): content = str(self.content, self.encoding, errors="replace") except (LookupError, TypeError): content = str(self.content, errors="replace") - return content + def _decode_json(self, **kwargs): + encoding = utils.guess_json_utf(self.content) + if encoding is not None: + try: + return json_mod.loads(self.content.decode(encoding), **kwargs) + except UnicodeDecodeError: + pass + return json_mod.loads(self.text, **kwargs) + class SSLOption: def __init__( @@ -103,7 +114,7 @@ def __init__( class Transport: - """ the abstract class of transport implementation """ + """the abstract class of transport implementation""" def send(self, req: Request, **options: typing.Any) -> Response: raise NotImplementedError diff --git a/ucloud/core/transport/utils.py b/ucloud/core/transport/utils.py index ddebb8fc..b77ac123 100644 --- a/ucloud/core/transport/utils.py +++ b/ucloud/core/transport/utils.py @@ -7,7 +7,7 @@ def guess_json_utf(data): - """ guess_json_utf will detect the encoding of bytes, + """guess_json_utf will detect the encoding of bytes, see `requests.utils.guess_json_utf` :rtype: str diff --git a/ucloud/core/typesystem/encoder.py b/ucloud/core/typesystem/encoder.py index ec7cc9a6..d3079e1b 100644 --- a/ucloud/core/typesystem/encoder.py +++ b/ucloud/core/typesystem/encoder.py @@ -1,3 +1,6 @@ +from ucloud.core.utils.compat import str + + def encode(d: dict) -> dict: result = {} diff --git a/ucloud/core/typesystem/fields.py b/ucloud/core/typesystem/fields.py index e6c872e4..3961f920 100644 --- a/ucloud/core/typesystem/fields.py +++ b/ucloud/core/typesystem/fields.py @@ -1,6 +1,6 @@ import base64 import typing -import collections +from collections.abc import Iterable from ucloud.core.typesystem import abstract from ucloud.core.exc import ValidationException @@ -8,7 +8,7 @@ class List(abstract.Field): - """ array param is the custom field to parse custom param such as: + """array param is the custom field to parse custom param such as: - IP.N - UDisk.N.Size @@ -25,7 +25,7 @@ def __init__( self.item = item def dumps(self, value, name=None, **kwargs): - if not isinstance(value, collections.Iterable): + if not isinstance(value, Iterable): raise ValidationException( "invalid field {}, expect list, got {}".format( name, type(value) @@ -48,7 +48,7 @@ def dumps(self, value, name=None, **kwargs): return values def loads(self, value, name=None, **kwargs): - if not isinstance(value, collections.Iterable): + if not isinstance(value, Iterable): raise ValidationException( "invalid field {}, expect list, got {}".format( name, type(value) diff --git a/ucloud/core/utils/deco.py b/ucloud/core/utils/deco.py index 3ea8ff4f..1e604c8d 100644 --- a/ucloud/core/utils/deco.py +++ b/ucloud/core/utils/deco.py @@ -5,7 +5,7 @@ def deprecated(instead_of="", message=""): - """ deprecated is a decorator to mark a function is deprecated. + """deprecated is a decorator to mark a function is deprecated. it will logging warning when this function called >>> @deprecated(instead_of="new_function") diff --git a/ucloud/core/utils/middleware.py b/ucloud/core/utils/middleware.py index 8a109a2d..42e2b9ee 100644 --- a/ucloud/core/utils/middleware.py +++ b/ucloud/core/utils/middleware.py @@ -1,5 +1,5 @@ class Middleware: - """ middleware is the object to store request/response handlers + """middleware is the object to store request/response handlers >>> middleware = Middleware() @@ -27,7 +27,7 @@ def __init__(self): self.exception_handlers = [] def request(self, handler, index=-1): - """ request is the request handler register to add request handler. + """request is the request handler register to add request handler. :param handler: request handler function, receive request object and return a new request @@ -39,7 +39,7 @@ def request(self, handler, index=-1): return handler def response(self, handler, index=-1): - """ response is the response handler register to add response handler. + """response is the response handler register to add response handler. :param handler: response handler function, receive response object and return a new response @@ -51,7 +51,7 @@ def response(self, handler, index=-1): return handler def exception(self, handler, index=-1): - """ exception is the exception handler register to add exception handler. + """exception is the exception handler register to add exception handler. :param handler: exception handler function, receive exception object and raise a new exception or ignore it diff --git a/ucloud/helpers/utils.py b/ucloud/helpers/utils.py index 3e61a3f7..29b9660f 100644 --- a/ucloud/helpers/utils.py +++ b/ucloud/helpers/utils.py @@ -19,7 +19,7 @@ def gen_password( min_number: int = 1, min_specials: int = 1, ): - """ generate password for any resource + """generate password for any resource >>> len(gen_password(20)) 20 @@ -73,7 +73,7 @@ def first(arr: typing.List[typing.Any]) -> typing.Any: def b64encode(s: str) -> str: - """ base64 encode + """base64 encode :param str s: input string :return: base64 string @@ -82,7 +82,7 @@ def b64encode(s: str) -> str: def b64decode(s: str) -> str: - """ base64 decode + """base64 decode :param str s: base64 string :return: output string diff --git a/ucloud/helpers/wait.py b/ucloud/helpers/wait.py index fe6c47cb..99bce051 100644 --- a/ucloud/helpers/wait.py +++ b/ucloud/helpers/wait.py @@ -14,7 +14,7 @@ class WaitTimeoutException(exc.UCloudException): class StateConf: - """ StateConf is the utilities class to wait the state return by refresh function achieve the specific state, + """StateConf is the utilities class to wait the state return by refresh function achieve the specific state, the generally usage is wait the cloud resource, such as uhost, udb ... is ready after created. """ @@ -77,7 +77,7 @@ def wait_for_state( min_backoff_interval: float = 0.1, max_backoff_interval: float = MAX_BACKOFF_INTERVAL, ): - """ wait_for_state is a utilities function to wait the state return by refresh function achieve the specific state, + """wait_for_state is a utilities function to wait the state return by refresh function achieve the specific state, the generally usage is wait the cloud resource, such as uhost, udb ... is ready after created. diff --git a/ucloud/services/cube/__init__.py b/ucloud/services/cube/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/cube/client.py b/ucloud/services/cube/client.py new file mode 100644 index 00000000..60d67df7 --- /dev/null +++ b/ucloud/services/cube/client.py @@ -0,0 +1,618 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.cube.schemas import apis + + +class CubeClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(CubeClient, self).__init__(config, transport, middleware, logger) + + def create_cube_deployment( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateCubeDeployment - 创建容器实例Deployment + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Deployment** (str) - (Required) Deployment yaml,使用base64编码 + - **SubnetId** (str) - (Required) Deployment所属子网 + - **VPCId** (str) - (Required) Deployment所属VPC + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ChargeType** (str) - 计费模式 + - **CpuPlatform** (str) - CPU平台 + - **Name** (str) - Deployment名称 + - **Quantity** (str) - 数量,默认为1 + - **Tag** (str) - 标签 + + **Response** + + - **Deployment** (str) - Deployment yaml,使用base64编码 + - **DeploymentId** (str) - Deployment ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateCubeDeploymentRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateCubeDeployment", d, **kwargs) + return apis.CreateCubeDeploymentResponseSchema().loads(resp) + + def create_cube_pod( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateCubePod - 创建一个容器实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Pod** (str) - (Required) Pod yaml,使用base64编码 + - **SubnetId** (str) - (Required) 容器实例所属的子网ID + - **VPCId** (str) - (Required) 容器实例所属的VPC ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **CubeId** (str) - 容器实例ID + - **Pod** (str) - Pod yaml,使用base64编码 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateCubePodRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateCubePod", d, **kwargs) + return apis.CreateCubePodResponseSchema().loads(resp) + + def delete_cube_deployment( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteCubeDeployment - 删除容器实例Deployment + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DeploymentId** (str) - (Required) + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteCubeDeploymentRequestSchema().dumps(d) + + resp = self.invoke("DeleteCubeDeployment", d, **kwargs) + return apis.DeleteCubeDeploymentResponseSchema().loads(resp) + + def delete_cube_pod( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteCubePod - 删除容器实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **CubeId** (str) - 要删除的容器实例ID,若填写了Uid则可忽略 + - **ReleaseEIP** (str) - 要释放的EIP,如果容器实例绑定了EIP则可以填写,会将EIP一并释放。否则EIP会被保留。 + - **Uid** (str) - 要删除的容器实例UID,若填写了CubeId则可忽略 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteCubePodRequestSchema().dumps(d) + + resp = self.invoke("DeleteCubePod", d, **kwargs) + return apis.DeleteCubePodResponseSchema().loads(resp) + + def get_cube_deployment( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetCubeDeployment - 获取容器实例Deployment详细信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DeploymentId** (str) - (Required) Deployment ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Deployment** (str) - Deployment yaml,使用base64编码 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetCubeDeploymentRequestSchema().dumps(d) + + resp = self.invoke("GetCubeDeployment", d, **kwargs) + return apis.GetCubeDeploymentResponseSchema().loads(resp) + + def get_cube_exec_token( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetCubeExecToken - 获取容器实例执行token + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ContainerName** (str) - (Required) 要执行的容器名称 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **CubeId** (str) - 容器实例ID,若填写了Uid则可忽略 + - **Uid** (str) - 容器实例UID,若填写了CubeId则可忽略 + + **Response** + + - **TerminalUrl** (str) - 终端url + - **Token** (str) - 执行Token + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetCubeExecTokenRequestSchema().dumps(d) + + resp = self.invoke("GetCubeExecToken", d, **kwargs) + return apis.GetCubeExecTokenResponseSchema().loads(resp) + + def get_cube_extend_info( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetCubeExtendInfo - 获取容器实例附加信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **CubeIds** (str) - 容器实例ID,用逗号分割 + + **Response** + + - **ExtendInfo** (list) - 见 **CubeExtendInfo** 模型定义 + + **Response Model** + + **CubeExtendInfo** + - **CubeId** (str) - Cube的Id + - **Eip** (list) - 见 **EIPSet** 模型定义 + - **Expiration** (int) - 资源有效期 + - **Name** (str) - Cube的名称 + - **Tag** (str) - 业务组名称 + + + **EIPSet** + - **Bandwidth** (int) - EIP带宽值 + - **BandwidthType** (int) - 带宽类型0标准普通带宽,1表示共享带宽 + - **CreateTime** (int) - EIP创建时间 + - **EIPAddr** (list) - 见 **EIPAddr** 模型定义 + - **EIPId** (str) - EIPId + - **PayMode** (str) - 付费模式,带宽付费或者流量付费 + - **Resource** (str) - EIP绑定对象的资源Id + - **Status** (str) - EIP状态,表示使用中或者空闲 + - **Weight** (int) - EIP权重 + + + **EIPAddr** + - **IP** (str) - IP地址 + - **OperatorName** (str) - 线路名称BGP或者internalation + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetCubeExtendInfoRequestSchema().dumps(d) + + resp = self.invoke("GetCubeExtendInfo", d, **kwargs) + return apis.GetCubeExtendInfoResponseSchema().loads(resp) + + def get_cube_metrics( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetCubeMetrics - 获取容器实例指标 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BeginTime** (str) - (Required) 开始时间 + - **ContainerName** (str) - (Required) 容器名称 + - **EndTime** (str) - (Required) 结束时间 + - **MetricName** (str) - (Required) 指标名称 + - **ResourceId** (str) - (Required) 资源ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **DataSets** (list) - 见 **MetricDataSet** 模型定义 + + **Response Model** + + **MetricDataSet** + - **MetricName** (str) - + - **Values** (list) - 见 **ValueSet** 模型定义 + + + **ValueSet** + - **Timestamp** (int) - + - **Value** (float) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetCubeMetricsRequestSchema().dumps(d) + + resp = self.invoke("GetCubeMetrics", d, **kwargs) + return apis.GetCubeMetricsResponseSchema().loads(resp) + + def get_cube_pod(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """GetCubePod - + + **Request** + + - **ProjectId** (str) - (Config) + - **Region** (str) - (Config) + - **CubeId** (str) - + - **Uid** (str) - + - **Zone** (str) - + + **Response** + + - **Pod** (str) - + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetCubePodRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("GetCubePod", d, **kwargs) + return apis.GetCubePodResponseSchema().loads(resp) + + def get_cube_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetCubePrice - + + **Request** + + - **ProjectId** (str) - (Config) + - **Region** (str) - (Config) + - **ChargeType** (str) - (Required) + - **Count** (str) - (Required) + - **Cpu** (str) - (Required) + - **Mem** (str) - (Required) + - **Quantity** (int) - (Required) + - **Zone** (str) - (Required) + + **Response** + + - **OriginalPrice** (int) - + - **Price** (int) - + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetCubePriceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("GetCubePrice", d, **kwargs) + return apis.GetCubePriceResponseSchema().loads(resp) + + def get_cube_token( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetCubeToken - 获取容器实例Token + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ContainerName** (str) - (Required) 容器名称 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **CubeId** (str) - 容器实例ID,若填写了Uid则可忽略 + - **Uid** (str) - 容器实例UID,若填写了CubeId则可忽略 + + **Response** + + - **Token** (str) - 容器实例Token + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetCubeTokenRequestSchema().dumps(d) + + resp = self.invoke("GetCubeToken", d, **kwargs) + return apis.GetCubeTokenResponseSchema().loads(resp) + + def list_cube_deployment( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListCubeDeployment - + + **Request** + + - **ProjectId** (str) - (Config) + - **Region** (str) - (Config) + - **Limit** (int) - (Required) + - **Offset** (int) - (Required) + - **Zone** (str) - + + **Response** + + - **Deployments** (list) - + - **TotalCount** (int) - + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListCubeDeploymentRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("ListCubeDeployment", d, **kwargs) + return apis.ListCubeDeploymentResponseSchema().loads(resp) + + def list_cube_pod( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListCubePod - 获取容器实例详细列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **DeploymentId** (str) - 容器实例所属Deployment + - **Group** (str) - 容器实例组 + - **Limit** (int) - 返回数据长度,默认为20,最大100 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **SubnetId** (str) - 容器实例所属子网 + - **VPCId** (str) - 容器实例所属VPC + + **Response** + + - **Pods** (list) - 容器实例yaml列表,以base64编码 + - **TotalCount** (int) - 容器实例总数 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListCubePodRequestSchema().dumps(d) + + resp = self.invoke("ListCubePod", d, **kwargs) + return apis.ListCubePodResponseSchema().loads(resp) + + def modify_cube_extend_info( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyCubeExtendInfo - + + **Request** + + - **ProjectId** (str) - (Config) + - **Region** (str) - (Config) + - **CubeId** (str) - (Required) + - **Name** (str) - + - **Zone** (str) - + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyCubeExtendInfoRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("ModifyCubeExtendInfo", d, **kwargs) + return apis.ModifyCubeExtendInfoResponseSchema().loads(resp) + + def modify_cube_tag( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyCubeTag - + + **Request** + + - **ProjectId** (str) - (Config) + - **Region** (str) - (Config) + - **CubeId** (str) - (Required) + - **Tag** (str) - (Required) + - **Zone** (str) - + + **Response** + + - **CubeId** (str) - + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyCubeTagRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("ModifyCubeTag", d, **kwargs) + return apis.ModifyCubeTagResponseSchema().loads(resp) + + def reboot_cube_pod( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RebootCubePod - + + **Request** + + - **ProjectId** (str) - (Config) + - **Region** (str) - (Config) + - **CubeId** (str) - (Required) + - **Zone** (str) - + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.RebootCubePodRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("RebootCubePod", d, **kwargs) + return apis.RebootCubePodResponseSchema().loads(resp) + + def renew_cube_pod( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RenewCubePod - 更新容器实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Pod** (str) - (Required) Pod yaml,以base64编码 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **CubeId** (str) - 要更新的容器实例ID + + **Response** + + - **Pod** (str) - Pod yaml,以base64编码 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.RenewCubePodRequestSchema().dumps(d) + + resp = self.invoke("RenewCubePod", d, **kwargs) + return apis.RenewCubePodResponseSchema().loads(resp) + + def update_cube_deployment( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateCubeDeployment - + + **Request** + + - **ProjectId** (str) - (Config) + - **Region** (str) - (Config) + - **Deployment** (str) - (Required) + - **DeploymentId** (str) - (Required) + - **Name** (str) - + - **Zone** (str) - + + **Response** + + - **Deployment** (str) - + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateCubeDeploymentRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("UpdateCubeDeployment", d, **kwargs) + return apis.UpdateCubeDeploymentResponseSchema().loads(resp) diff --git a/ucloud/services/cube/schemas/__init__.py b/ucloud/services/cube/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/cube/schemas/apis.py b/ucloud/services/cube/schemas/apis.py new file mode 100644 index 00000000..03a5f92e --- /dev/null +++ b/ucloud/services/cube/schemas/apis.py @@ -0,0 +1,548 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.cube.schemas import models + +""" Cube API Schema +""" + + +""" +API: CreateCubeDeployment + +创建容器实例Deployment +""" + + +class CreateCubeDeploymentRequestSchema(schema.RequestSchema): + """CreateCubeDeployment - 创建容器实例Deployment""" + + fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CpuPlatform": fields.Str(required=False, dump_to="CpuPlatform"), + "Deployment": fields.Str(required=True, dump_to="Deployment"), + "KubeConfig": fields.Str( + required=False, dump_to="KubeConfig" + ), # Deprecated, will be removed at 1.0 + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Str(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateCubeDeploymentResponseSchema(schema.ResponseSchema): + """CreateCubeDeployment - 创建容器实例Deployment""" + + fields = { + "Deployment": fields.Str(required=True, load_from="Deployment"), + "DeploymentId": fields.Str(required=True, load_from="DeploymentId"), + } + + +""" +API: CreateCubePod + +创建一个容器实例 +""" + + +class CreateCubePodRequestSchema(schema.RequestSchema): + """CreateCubePod - 创建一个容器实例""" + + fields = { + "ChargeType": fields.Str( + required=False, dump_to="ChargeType" + ), # Deprecated, will be removed at 1.0 + "CouponId": fields.Str( + required=False, dump_to="CouponId" + ), # Deprecated, will be removed at 1.0 + "CpuPlatform": fields.Str( + required=False, dump_to="CpuPlatform" + ), # Deprecated, will be removed at 1.0 + "Group": fields.Str( + required=False, dump_to="Group" + ), # Deprecated, will be removed at 1.0 + "KubeConfig": fields.Str( + required=False, dump_to="KubeConfig" + ), # Deprecated, will be removed at 1.0 + "Name": fields.Str( + required=False, dump_to="Name" + ), # Deprecated, will be removed at 1.0 + "Pod": fields.Str(required=True, dump_to="Pod"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int( + required=False, dump_to="Quantity" + ), # Deprecated, will be removed at 1.0 + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + "Tag": fields.Str( + required=False, dump_to="Tag" + ), # Deprecated, will be removed at 1.0 + "VPCId": fields.Str(required=True, dump_to="VPCId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateCubePodResponseSchema(schema.ResponseSchema): + """CreateCubePod - 创建一个容器实例""" + + fields = { + "CubeId": fields.Str(required=True, load_from="CubeId"), + "Pod": fields.Str(required=True, load_from="Pod"), + } + + +""" +API: DeleteCubeDeployment + +删除容器实例Deployment +""" + + +class DeleteCubeDeploymentRequestSchema(schema.RequestSchema): + """DeleteCubeDeployment - 删除容器实例Deployment""" + + fields = { + "DeploymentId": fields.Str( + required=True, dump_to="DeploymentId" + ), # Deprecated, will be removed at 1.0 + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str( + required=False, dump_to="Zone" + ), # Deprecated, will be removed at 1.0 + } + + +class DeleteCubeDeploymentResponseSchema(schema.ResponseSchema): + """DeleteCubeDeployment - 删除容器实例Deployment""" + + fields = {} + + +""" +API: DeleteCubePod + +删除容器实例 +""" + + +class DeleteCubePodRequestSchema(schema.RequestSchema): + """DeleteCubePod - 删除容器实例""" + + fields = { + "CubeId": fields.Str(required=False, dump_to="CubeId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ReleaseEIP": fields.Str(required=False, dump_to="ReleaseEIP"), + "Uid": fields.Str(required=False, dump_to="Uid"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DeleteCubePodResponseSchema(schema.ResponseSchema): + """DeleteCubePod - 删除容器实例""" + + fields = {} + + +""" +API: GetCubeDeployment + +获取容器实例Deployment详细信息 +""" + + +class GetCubeDeploymentRequestSchema(schema.RequestSchema): + """GetCubeDeployment - 获取容器实例Deployment详细信息""" + + fields = { + "DeploymentId": fields.Str(required=True, dump_to="DeploymentId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetCubeDeploymentResponseSchema(schema.ResponseSchema): + """GetCubeDeployment - 获取容器实例Deployment详细信息""" + + fields = { + "Deployment": fields.Str(required=True, load_from="Deployment"), + } + + +""" +API: GetCubeExecToken + +获取容器实例执行token +""" + + +class GetCubeExecTokenRequestSchema(schema.RequestSchema): + """GetCubeExecToken - 获取容器实例执行token""" + + fields = { + "ContainerName": fields.Str(required=True, dump_to="ContainerName"), + "CubeId": fields.Str(required=False, dump_to="CubeId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Uid": fields.Str(required=False, dump_to="Uid"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetCubeExecTokenResponseSchema(schema.ResponseSchema): + """GetCubeExecToken - 获取容器实例执行token""" + + fields = { + "TerminalUrl": fields.Str(required=True, load_from="TerminalUrl"), + "Token": fields.Str(required=True, load_from="Token"), + } + + +""" +API: GetCubeExtendInfo + +获取容器实例附加信息 +""" + + +class GetCubeExtendInfoRequestSchema(schema.RequestSchema): + """GetCubeExtendInfo - 获取容器实例附加信息""" + + fields = { + "CubeIds": fields.Str(required=False, dump_to="CubeIds"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetCubeExtendInfoResponseSchema(schema.ResponseSchema): + """GetCubeExtendInfo - 获取容器实例附加信息""" + + fields = { + "ExtendInfo": fields.List( + models.CubeExtendInfoSchema(), required=True, load_from="ExtendInfo" + ), + } + + +""" +API: GetCubeMetrics + +获取容器实例指标 +""" + + +class GetCubeMetricsRequestSchema(schema.RequestSchema): + """GetCubeMetrics - 获取容器实例指标""" + + fields = { + "BeginTime": fields.Str(required=True, dump_to="BeginTime"), + "ContainerName": fields.Str(required=True, dump_to="ContainerName"), + "EndTime": fields.Str(required=True, dump_to="EndTime"), + "MetricName": fields.Str(required=True, dump_to="MetricName"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetCubeMetricsResponseSchema(schema.ResponseSchema): + """GetCubeMetrics - 获取容器实例指标""" + + fields = { + "DataSets": fields.List( + models.MetricDataSetSchema(), required=True, load_from="DataSets" + ), + "Message": fields.Str( + required=False, load_from="Message" + ), # Deprecated, will be removed at 1.0 + } + + +""" +API: GetCubePod + + +""" + + +class GetCubePodRequestSchema(schema.RequestSchema): + """GetCubePod -""" + + fields = { + "CubeId": fields.Str(required=False, dump_to="CubeId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Uid": fields.Str(required=False, dump_to="Uid"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class GetCubePodResponseSchema(schema.ResponseSchema): + """GetCubePod -""" + + fields = { + "Pod": fields.Str(required=True, load_from="Pod"), + } + + +""" +API: GetCubePrice + + +""" + + +class GetCubePriceRequestSchema(schema.RequestSchema): + """GetCubePrice -""" + + fields = { + "ChargeType": fields.Str(required=True, dump_to="ChargeType"), + "Count": fields.Str(required=True, dump_to="Count"), + "Cpu": fields.Str(required=True, dump_to="Cpu"), + "Mem": fields.Str(required=True, dump_to="Mem"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=True, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetCubePriceResponseSchema(schema.ResponseSchema): + """GetCubePrice -""" + + fields = { + "OriginalPrice": fields.Int(required=True, load_from="OriginalPrice"), + "Price": fields.Int(required=True, load_from="Price"), + } + + +""" +API: GetCubeToken + +获取容器实例Token +""" + + +class GetCubeTokenRequestSchema(schema.RequestSchema): + """GetCubeToken - 获取容器实例Token""" + + fields = { + "ContainerName": fields.Str(required=True, dump_to="ContainerName"), + "CubeId": fields.Str(required=False, dump_to="CubeId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Uid": fields.Str(required=False, dump_to="Uid"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetCubeTokenResponseSchema(schema.ResponseSchema): + """GetCubeToken - 获取容器实例Token""" + + fields = { + "Token": fields.Str(required=True, load_from="Token"), + } + + +""" +API: ListCubeDeployment + + +""" + + +class ListCubeDeploymentRequestSchema(schema.RequestSchema): + """ListCubeDeployment -""" + + fields = { + "Limit": fields.Int(required=True, dump_to="Limit"), + "Offset": fields.Int(required=True, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class ListCubeDeploymentResponseSchema(schema.ResponseSchema): + """ListCubeDeployment -""" + + fields = { + "Deployments": fields.List( + fields.Str(), required=True, load_from="Deployments" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: ListCubePod + +获取容器实例详细列表 +""" + + +class ListCubePodRequestSchema(schema.RequestSchema): + """ListCubePod - 获取容器实例详细列表""" + + fields = { + "DeploymentId": fields.Str(required=False, dump_to="DeploymentId"), + "Group": fields.Str(required=False, dump_to="Group"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ListCubePodResponseSchema(schema.ResponseSchema): + """ListCubePod - 获取容器实例详细列表""" + + fields = { + "Pods": fields.List(fields.Str(), required=True, load_from="Pods"), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: ModifyCubeExtendInfo + + +""" + + +class ModifyCubeExtendInfoRequestSchema(schema.RequestSchema): + """ModifyCubeExtendInfo -""" + + fields = { + "CubeId": fields.Str(required=True, dump_to="CubeId"), + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class ModifyCubeExtendInfoResponseSchema(schema.ResponseSchema): + """ModifyCubeExtendInfo -""" + + fields = {} + + +""" +API: ModifyCubeTag + + +""" + + +class ModifyCubeTagRequestSchema(schema.RequestSchema): + """ModifyCubeTag -""" + + fields = { + "CubeId": fields.Str(required=True, dump_to="CubeId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Tag": fields.Str(required=True, dump_to="Tag"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class ModifyCubeTagResponseSchema(schema.ResponseSchema): + """ModifyCubeTag -""" + + fields = { + "CubeId": fields.Str(required=True, load_from="CubeId"), + } + + +""" +API: RebootCubePod + + +""" + + +class RebootCubePodRequestSchema(schema.RequestSchema): + """RebootCubePod -""" + + fields = { + "CubeId": fields.Str(required=True, dump_to="CubeId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class RebootCubePodResponseSchema(schema.ResponseSchema): + """RebootCubePod -""" + + fields = {} + + +""" +API: RenewCubePod + +更新容器实例 +""" + + +class RenewCubePodRequestSchema(schema.RequestSchema): + """RenewCubePod - 更新容器实例""" + + fields = { + "CubeId": fields.Str(required=False, dump_to="CubeId"), + "Pod": fields.Str(required=True, dump_to="Pod"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class RenewCubePodResponseSchema(schema.ResponseSchema): + """RenewCubePod - 更新容器实例""" + + fields = { + "Pod": fields.Str(required=True, load_from="Pod"), + } + + +""" +API: UpdateCubeDeployment + + +""" + + +class UpdateCubeDeploymentRequestSchema(schema.RequestSchema): + """UpdateCubeDeployment -""" + + fields = { + "Deployment": fields.Str(required=True, dump_to="Deployment"), + "DeploymentId": fields.Str(required=True, dump_to="DeploymentId"), + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class UpdateCubeDeploymentResponseSchema(schema.ResponseSchema): + """UpdateCubeDeployment -""" + + fields = { + "Deployment": fields.Str(required=False, load_from="Deployment"), + } diff --git a/ucloud/services/cube/schemas/models.py b/ucloud/services/cube/schemas/models.py new file mode 100644 index 00000000..1d19d799 --- /dev/null +++ b/ucloud/services/cube/schemas/models.py @@ -0,0 +1,58 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class EIPAddrSchema(schema.ResponseSchema): + """EIPAddr - EIP地址""" + + fields = { + "IP": fields.Str(required=False, load_from="IP"), + "OperatorName": fields.Str(required=False, load_from="OperatorName"), + } + + +class EIPSetSchema(schema.ResponseSchema): + """EIPSet - EIP信息""" + + fields = { + "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), + "BandwidthType": fields.Int(required=False, load_from="BandwidthType"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "EIPAddr": fields.List(EIPAddrSchema()), + "EIPId": fields.Str(required=False, load_from="EIPId"), + "PayMode": fields.Str(required=False, load_from="PayMode"), + "Resource": fields.Str(required=False, load_from="Resource"), + "Status": fields.Str(required=False, load_from="Status"), + "Weight": fields.Int(required=False, load_from="Weight"), + } + + +class CubeExtendInfoSchema(schema.ResponseSchema): + """CubeExtendInfo - Cube的额外信息""" + + fields = { + "CubeId": fields.Str(required=True, load_from="CubeId"), + "Eip": fields.List(EIPSetSchema()), + "Expiration": fields.Int(required=False, load_from="Expiration"), + "Name": fields.Str(required=False, load_from="Name"), + "Tag": fields.Str(required=False, load_from="Tag"), + } + + +class ValueSetSchema(schema.ResponseSchema): + """ValueSet -""" + + fields = { + "Timestamp": fields.Int(required=False, load_from="Timestamp"), + "Value": fields.Float(required=True, load_from="Value"), + } + + +class MetricDataSetSchema(schema.ResponseSchema): + """MetricDataSet - 监控数据集合""" + + fields = { + "MetricName": fields.Str(required=False, load_from="MetricName"), + "Values": fields.List(ValueSetSchema()), + } diff --git a/ucloud/services/iam/__init__.py b/ucloud/services/iam/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/iam/client.py b/ucloud/services/iam/client.py new file mode 100644 index 00000000..12437c1e --- /dev/null +++ b/ucloud/services/iam/client.py @@ -0,0 +1,1078 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.iam.schemas import apis + + +class IAMClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(IAMClient, self).__init__(config, transport, middleware, logger) + + def add_user_to_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AddUserToGroup - 添加成员到用户组 + + **Request** + + - **GroupName** (str) - (Required) 用户组名 + - **UserName** (str) - (Required) 用户名 + + **Response** + + - **Message** (str) - 错误消息 + + """ + # build request + d = {} + req and d.update(req) + d = apis.AddUserToGroupRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AddUserToGroup", d, **kwargs) + return apis.AddUserToGroupResponseSchema().loads(resp) + + def attach_policies_to_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AttachPoliciesToGroup - 关联IAM策略到用户组 + + **Request** + + - **GroupName** (str) - (Required) 用户组名称 + - **PolicyURNs** (list) - (Required) 策略URN + - **Scope** (str) - (Required) 应用范围 + - **ProjectID** (str) - 项目ID(当Scope=Specified时ProjectID必传) + + **Response** + + - **Message** (str) - 错误消息 + + """ + # build request + d = {} + req and d.update(req) + d = apis.AttachPoliciesToGroupRequestSchema().dumps(d) + + resp = self.invoke("AttachPoliciesToGroup", d, **kwargs) + return apis.AttachPoliciesToGroupResponseSchema().loads(resp) + + def attach_policies_to_user( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AttachPoliciesToUser - 关联IAM策略到用户 + + **Request** + + - **PolicyURNs** (list) - (Required) 策略URN + - **Scope** (str) - (Required) 应用范围 + - **UserName** (str) - (Required) 用户名称 + - **ProjectID** (str) - 项目ID(当Scope=Specified时ProjectID必传) + + **Response** + + - **Message** (str) - 错误消息 + + """ + # build request + d = {} + req and d.update(req) + d = apis.AttachPoliciesToUserRequestSchema().dumps(d) + + resp = self.invoke("AttachPoliciesToUser", d, **kwargs) + return apis.AttachPoliciesToUserResponseSchema().loads(resp) + + def create_access_key( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateAccessKey - 创建用户密钥 + + **Request** + + - **UserName** (str) - (Required) 用户名 + + **Response** + + - **AccessKey** (dict) - 见 **AccessKey** 模型定义 + + **Response Model** + + **AccessKey** + - **AccessKeyID** (str) - 用户公钥 + - **AccessKeySecret** (str) - 用户私钥 + - **CreatedAt** (int) - 密钥创建时间 + - **DeletedAt** (int) - 密钥删除时间 + - **Description** (str) - 密钥备注 + - **ExpiredAt** (int) - 密钥过期时间 + - **Status** (str) - 密钥状态 + - **UpdatedAt** (int) - 密钥更新时间 + - **UserId** (int) - 用户ID + + + """ + # build request + d = {} + req and d.update(req) + d = apis.CreateAccessKeyRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateAccessKey", d, **kwargs) + return apis.CreateAccessKeyResponseSchema().loads(resp) + + def create_group(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """CreateGroup - 创建用户组 + + **Request** + + - **GroupName** (str) - (Required) 用户组名称 + - **Description** (str) - 对用户组的描述 + + **Response** + + - **Message** (str) - 错误消息 + + """ + # build request + d = {} + req and d.update(req) + d = apis.CreateGroupRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateGroup", d, **kwargs) + return apis.CreateGroupResponseSchema().loads(resp) + + def create_iam_policy( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateIAMPolicy - 创建IAM策略 + + **Request** + + - **Document** (str) - (Required) 策略内容 + - **PolicyName** (str) - (Required) 策略名称 + - **Description** (str) - 描述 + - **ScopeType** (str) - 策略作用域类型 + + **Response** + + - **Message** (str) - 错误消息 + + """ + # build request + d = {} + req and d.update(req) + d = apis.CreateIAMPolicyRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateIAMPolicy", d, **kwargs) + return apis.CreateIAMPolicyResponseSchema().loads(resp) + + def create_project( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateProject - 创建项目 + + **Request** + + - **ProjectName** (str) - (Required) 项目名称,不得与现有项目重名 + + **Response** + + - **ProjectId** (str) - 所创建项目的Id + + """ + # build request + d = {} + req and d.update(req) + d = apis.CreateProjectRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateProject", d, **kwargs) + return apis.CreateProjectResponseSchema().loads(resp) + + def create_user(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """CreateUser - 创建IAM用户 + + **Request** + + - **AccessKeyStatus** (str) - (Required) API密钥访问状态(LoginProfileStatus值为Inactive时,AccessKeyStatus不能为Inactive) + - **LoginProfileStatus** (str) - (Required) 控制台登录访问状态(AccessKeyStatus值为Inactive时,LoginProfileStatus不能为Inactive) + - **UserName** (str) - (Required) 用户名 + - **DisplayName** (str) - 显示名称 + - **Email** (str) - 用户邮箱(LoginProfileStatus值等于Active必传,LoginProfileStatus值等于Inactive不传) + + **Response** + + - **Message** (str) - 错误消息 + + """ + # build request + d = {} + req and d.update(req) + d = apis.CreateUserRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUser", d, **kwargs) + return apis.CreateUserResponseSchema().loads(resp) + + def delete_access_key( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteAccessKey - 删除用户密钥 + + **Request** + + - **AccessKeyID** (str) - (Required) 用户公钥 + + **Response** + + + """ + # build request + d = {} + req and d.update(req) + d = apis.DeleteAccessKeyRequestSchema().dumps(d) + + resp = self.invoke("DeleteAccessKey", d, **kwargs) + return apis.DeleteAccessKeyResponseSchema().loads(resp) + + def delete_group(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """DeleteGroup - 删除用户组 + + **Request** + + - **GroupName** (str) - (Required) 待删除用户组名称 + + **Response** + + - **Message** (str) - 错误消息 + + """ + # build request + d = {} + req and d.update(req) + d = apis.DeleteGroupRequestSchema().dumps(d) + + resp = self.invoke("DeleteGroup", d, **kwargs) + return apis.DeleteGroupResponseSchema().loads(resp) + + def delete_iam_policy( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteIAMPolicy - 删除IAM策略 + + **Request** + + - **PolicyURN** (str) - (Required) 策略URN + + **Response** + + - **Message** (str) - 错误消息 + + """ + # build request + d = {} + req and d.update(req) + d = apis.DeleteIAMPolicyRequestSchema().dumps(d) + + resp = self.invoke("DeleteIAMPolicy", d, **kwargs) + return apis.DeleteIAMPolicyResponseSchema().loads(resp) + + def delete_project( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteProject - 删除项目 + + **Request** + + - **ProjectID** (str) - (Required) 项目ID + + **Response** + + - **Message** (str) - 错误消息 + + """ + # build request + d = {} + req and d.update(req) + d = apis.DeleteProjectRequestSchema().dumps(d) + + resp = self.invoke("DeleteProject", d, **kwargs) + return apis.DeleteProjectResponseSchema().loads(resp) + + def delete_user(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """DeleteUser - 删除用户 + + **Request** + + - **UserName** (str) - (Required) 用户名 + + **Response** + + - **Message** (str) - 错误消息 + + """ + # build request + d = {} + req and d.update(req) + d = apis.DeleteUserRequestSchema().dumps(d) + + resp = self.invoke("DeleteUser", d, **kwargs) + return apis.DeleteUserResponseSchema().loads(resp) + + def detach_policies_from_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DetachPoliciesFromGroup - 移除用户组关联的IAM策略 + + **Request** + + - **GroupName** (str) - (Required) 用户组名称 + - **PolicyURNs** (list) - (Required) 策略URN + - **Scope** (str) - (Required) 应用范围 + - **ProjectID** (str) - 项目ID(当Scope=Specified时ProjectID必传) + + **Response** + + - **Message** (str) - 错误消息 + + """ + # build request + d = {} + req and d.update(req) + d = apis.DetachPoliciesFromGroupRequestSchema().dumps(d) + + resp = self.invoke("DetachPoliciesFromGroup", d, **kwargs) + return apis.DetachPoliciesFromGroupResponseSchema().loads(resp) + + def detach_policies_from_user( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DetachPoliciesFromUser - 移除用户关联的IAM策略 + + **Request** + + - **PolicyURNs** (list) - (Required) 策略URN + - **Scope** (str) - (Required) 应用范围 + - **UserName** (str) - (Required) 用户名 + - **ProjectID** (str) - 项目ID(当Scope=Specified时ProjectID必传) + + **Response** + + - **Message** (str) - 错误消息 + + """ + # build request + d = {} + req and d.update(req) + d = apis.DetachPoliciesFromUserRequestSchema().dumps(d) + + resp = self.invoke("DetachPoliciesFromUser", d, **kwargs) + return apis.DetachPoliciesFromUserResponseSchema().loads(resp) + + def get_group(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """GetGroup - 查询用户组详情 + + **Request** + + - **GroupName** (str) - (Required) 用户组名称 + + **Response** + + - **Group** (dict) - 见 **Group** 模型定义 + - **Message** (str) - 错误消息 + + **Response Model** + + **Group** + - **CreatedAt** (int) - 用户组创建时间戳 + - **Description** (str) - 用户组描述信息 + - **GroupName** (str) - 用户组名称 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.GetGroupRequestSchema().dumps(d) + + resp = self.invoke("GetGroup", d, **kwargs) + return apis.GetGroupResponseSchema().loads(resp) + + def get_iam_policy( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetIAMPolicy - 获取策略详情 + + **Request** + + - **PolicyURN** (str) - (Required) 策略URN + + **Response** + + - **Message** (str) - 错误消息 + - **Policy** (dict) - 见 **IAMPolicy** 模型定义 + + **Response Model** + + **IAMPolicy** + - **CreatedAt** (int) - IAM权限策略创建时间 + - **Description** (str) - IAM权限策略描述 + - **Document** (str) - IAM权限策略文本 + - **PolicyName** (str) - 策略名称 + - **PolicyURN** (str) - IAM权限策略URN + - **ScopeType** (str) - IAM权限策略应用范围(ScopeRequired:项目级, ScopeEmpty:全局级, ScopeUnrestricted:项目级/全局级) + - **UpdatedAt** (int) - IAM权限策略更新时间 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.GetIAMPolicyRequestSchema().dumps(d) + + resp = self.invoke("GetIAMPolicy", d, **kwargs) + return apis.GetIAMPolicyResponseSchema().loads(resp) + + def get_login_profile( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetLoginProfile - 获取用户登录资料 + + **Request** + + - **UserName** (str) - (Required) 用户名 + + **Response** + + - **LoginProfile** (dict) - 见 **LoginProfile** 模型定义 + + **Response Model** + + **LoginProfile** + - **MFABindRequired** (bool) - 是否必需绑定MFA + - **MaxPasswordAge** (int) - 密码最长有效期,单位:天 + - **Status** (str) - 登录资料状态 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.GetLoginProfileRequestSchema().dumps(d) + + resp = self.invoke("GetLoginProfile", d, **kwargs) + return apis.GetLoginProfileResponseSchema().loads(resp) + + def get_user(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """GetUser - 获取用户信息 + + **Request** + + - **UserName** (str) - (Required) 用户名 + + **Response** + + - **Message** (str) - 错误消息 + - **User** (dict) - 见 **User** 模型定义 + + **Response Model** + + **User** + - **CreatedAt** (int) - 创建时间戳 + - **DisplayName** (str) - 昵称 + - **Email** (str) - 邮箱 + - **Status** (str) - 状态(Active:正常,Inactive:未激活,Frozen:冻结,ConsoleInactive:控制台未激活) + - **UserName** (str) - 用户名 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.GetUserRequestSchema().dumps(d) + + resp = self.invoke("GetUser", d, **kwargs) + return apis.GetUserResponseSchema().loads(resp) + + def list_access_keys( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListAccessKeys - 获取指定用户密钥列表 + + **Request** + + - **UserName** (str) - (Required) 用户名 + + **Response** + + - **AccessKey** (list) - 见 **AccessKey** 模型定义 + + **Response Model** + + **AccessKey** + - **AccessKeyID** (str) - 用户公钥 + - **AccessKeySecret** (str) - 用户私钥 + - **CreatedAt** (int) - 密钥创建时间 + - **DeletedAt** (int) - 密钥删除时间 + - **Description** (str) - 密钥备注 + - **ExpiredAt** (int) - 密钥过期时间 + - **Status** (str) - 密钥状态 + - **UpdatedAt** (int) - 密钥更新时间 + - **UserId** (int) - 用户ID + + + """ + # build request + d = {} + req and d.update(req) + d = apis.ListAccessKeysRequestSchema().dumps(d) + + resp = self.invoke("ListAccessKeys", d, **kwargs) + return apis.ListAccessKeysResponseSchema().loads(resp) + + def list_entities_for_policy( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListEntitiesForPolicy - 列出引用权限策略的实体 + + **Request** + + - **PolicyURN** (str) - (Required) 策略URN + - **Limit** (str) - 需要查询的用户组数量 + - **Offset** (str) - 从第几条数据开始查询 + + **Response** + + - **Entities** (list) - 见 **Entity** 模型定义 + - **Message** (str) - 错误消息 + - **TotalCount** (int) - 数据集合数量 + + **Response Model** + + **Entity** + - **AttachedAt** (int) - 引用时间 + - **DisplayName** (str) - 子账户展示名称 + - **EntityKind** (str) - 实体类型(User:用户,Group) + - **EntityName** (str) - 实体名称 + - **Scope** (str) - 生效空间 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.ListEntitiesForPolicyRequestSchema().dumps(d) + + resp = self.invoke("ListEntitiesForPolicy", d, **kwargs) + return apis.ListEntitiesForPolicyResponseSchema().loads(resp) + + def list_entities_for_project( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListEntitiesForProject - 列出拥有指定项目权限的实体 + + **Request** + + - **ProjectID** (str) - (Required) 项目ID + - **Limit** (str) - 需要查询的用户组数量 + - **Offset** (str) - 从第几条数据开始查询 + + **Response** + + - **Entities** (list) - 见 **Entity** 模型定义 + - **Message** (str) - 错误消息 + - **TotalCount** (int) - 数据集合数量 + + **Response Model** + + **Entity** + - **AttachedAt** (int) - 引用时间 + - **EntityKind** (str) - 实体类型(User:用户,Group) + - **EntityName** (str) - 实体名称 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.ListEntitiesForProjectRequestSchema().dumps(d) + + resp = self.invoke("ListEntitiesForProject", d, **kwargs) + return apis.ListEntitiesForProjectResponseSchema().loads(resp) + + def list_groups(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """ListGroups - 列出用户组 + + **Request** + + + **Response** + + - **Groups** (list) - 见 **Group** 模型定义 + - **Message** (str) - 错误消息 + - **TotalCount** (int) - 总数 + + **Response Model** + + **Group** + - **CreatedAt** (int) - 用户组创建时间戳 + - **Description** (str) - 用户组描述信息 + - **GroupName** (str) - 用户组名称 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.ListGroupsRequestSchema().dumps(d) + + resp = self.invoke("ListGroups", d, **kwargs) + return apis.ListGroupsResponseSchema().loads(resp) + + def list_policies( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListPolicies - 获取IAM策略列表 + + **Request** + + - **Owner** (str) - (Required) 策略所有者 + - **Limit** (str) - 需要查询的用户组数量 + - **Offset** (str) - 从第几条数据开始查询 + + **Response** + + - **Message** (str) - 错误消息 + - **Policies** (list) - 见 **IAMPolicy** 模型定义 + - **TotalCount** (int) - 数据集合数量 + + **Response Model** + + **IAMPolicy** + - **CreatedAt** (int) - IAM权限策略创建时间 + - **Description** (str) - IAM权限策略描述 + - **Document** (str) - IAM权限策略文本 + - **PolicyName** (str) - 策略名称 + - **PolicyURN** (str) - IAM权限策略URN + - **ScopeType** (str) - IAM权限策略应用范围(ScopeRequired:项目级, ScopeEmpty:全局级, ScopeUnrestricted:项目级/全局级) + - **UpdatedAt** (int) - IAM权限策略更新时间 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.ListPoliciesRequestSchema().dumps(d) + + resp = self.invoke("ListPolicies", d, **kwargs) + return apis.ListPoliciesResponseSchema().loads(resp) + + def list_policies_for_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListPoliciesForGroup - 列出用户组关联的权限策略 + + **Request** + + - **GroupName** (str) - (Required) 用户组名称 + - **Limit** (str) - 需要查询的用户组数量 + - **Offset** (str) - 从第几条数据开始查询 + - **ProjectID** (str) - 项目ID + - **Scope** (str) - 应用范围 + + **Response** + + - **Message** (str) - 错误消息 + - **Policies** (list) - 见 **Policy** 模型定义 + - **TotalCount** (int) - 总数 + + **Response Model** + + **Policy** + - **AttachedAt** (int) - 策略被添加到用户组时的时间戳 + - **CreatedAt** (int) - 创建时间 + - **Description** (str) - 描述 + - **PolicyName** (str) - 权限策略名称 + - **PolicyURN** (str) - 策略URN + - **ProjectID** (str) - 项目ID + - **Scope** (str) - 应用范围(ScopeRequired:项目级, ScopeEmpty:全局级, ScopeUnrestricted:项目级/全局级) + + + """ + # build request + d = {} + req and d.update(req) + d = apis.ListPoliciesForGroupRequestSchema().dumps(d) + + resp = self.invoke("ListPoliciesForGroup", d, **kwargs) + return apis.ListPoliciesForGroupResponseSchema().loads(resp) + + def list_policies_for_user( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListPoliciesForUser - 列出用户关联的IAM策略 + + **Request** + + - **UserName** (str) - (Required) 用户名 + - **Limit** (str) - 需要查询的用户组数量 + - **Offset** (str) - 从第几条数据开始查询 + - **ProjectID** (str) - 项目ID + - **Scope** (str) - 应用范围 + + **Response** + + - **Message** (str) - 错误消息 + - **Policies** (list) - 见 **Policy** 模型定义 + - **TotalCount** (int) - 数据集合数量 + + **Response Model** + + **Policy** + - **AttachedAt** (int) - 策略被添加到用户组时的时间戳 + - **CreatedAt** (int) - 创建时间 + - **Description** (str) - 描述 + - **PolicyName** (str) - 权限策略名称 + - **PolicyURN** (str) - 策略URN + - **ProjectID** (str) - 项目ID + - **Scope** (str) - 应用范围(ScopeRequired:项目级, ScopeEmpty:全局级, ScopeUnrestricted:项目级/全局级) + + + """ + # build request + d = {} + req and d.update(req) + d = apis.ListPoliciesForUserRequestSchema().dumps(d) + + resp = self.invoke("ListPoliciesForUser", d, **kwargs) + return apis.ListPoliciesForUserResponseSchema().loads(resp) + + def list_projects( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListProjects - 列出所有项目 + + **Request** + + - **Limit** (str) - + - **Offset** (str) - + + **Response** + + - **Message** (str) - 错误消息 + - **Projects** (list) - 见 **Project** 模型定义 + - **TotalCount** (int) - 总数 + + **Response Model** + + **Project** + - **CreatedAt** (int) - 创建时间 + - **ProjectID** (str) - 项目ID + - **ProjectName** (str) - 项目名称 + - **UserCount** (int) - 用户数量 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.ListProjectsRequestSchema().dumps(d) + + resp = self.invoke("ListProjects", d, **kwargs) + return apis.ListProjectsResponseSchema().loads(resp) + + def list_users(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """ListUsers - 列出用户列表 + + **Request** + + - **Limit** (str) - 分页Limit(默认:10,最大100) + - **Offset** (str) - 分页offset + + **Response** + + - **Message** (str) - 错误消息 + - **TotalCount** (int) - 用户数量 + - **Users** (list) - 见 **Users** 模型定义 + + **Response Model** + + **Users** + - **CreatedAt** (int) - 创建时间戳 + - **DisplayName** (str) - 昵称 + - **Email** (str) - 邮箱 + - **Status** (str) - 状态(Active:正常,Inactive:未激活,Frozen:冻结,ConsoleInactive:控制台未激活) + - **UserName** (str) - 用户名 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.ListUsersRequestSchema().dumps(d) + + resp = self.invoke("ListUsers", d, **kwargs) + return apis.ListUsersResponseSchema().loads(resp) + + def list_users_for_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUsersForGroup - 列出用户组包含的用户 + + **Request** + + - **GroupName** (str) - (Required) 用户组名称 + - **Limit** (str) - 需要查询的组内用户数量 + - **Offset** (str) - 从第几条数据开始查询 + + **Response** + + - **Message** (str) - 错误消息 + - **TotalCount** (int) - 总数 + - **Users** (list) - 见 **UserForGroup** 模型定义 + + **Response Model** + + **UserForGroup** + - **DisplayName** (str) - 昵称 + - **Email** (str) - 邮箱 + - **JoinedAt** (int) - 用户被添加到用户组时的时间戳 + - **UserName** (str) - 用户名 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.ListUsersForGroupRequestSchema().dumps(d) + + resp = self.invoke("ListUsersForGroup", d, **kwargs) + return apis.ListUsersForGroupResponseSchema().loads(resp) + + def modify_project( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyProject - 修改项目 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ProjectName** (str) - (Required) 新的项目名称 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyProjectRequestSchema().dumps(d) + + resp = self.invoke("ModifyProject", d, **kwargs) + return apis.ModifyProjectResponseSchema().loads(resp) + + def remove_user_from_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RemoveUserFromGroup - 移除用户组中的IAM用户 + + **Request** + + - **GroupName** (str) - (Required) 用户组名称 + - **UserName** (str) - (Required) 用户名 + + **Response** + + - **Message** (str) - 错误消息 + + """ + # build request + d = {} + req and d.update(req) + d = apis.RemoveUserFromGroupRequestSchema().dumps(d) + + resp = self.invoke("RemoveUserFromGroup", d, **kwargs) + return apis.RemoveUserFromGroupResponseSchema().loads(resp) + + def remove_user_from_project( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RemoveUserFromProject - 移除项目中的IAM用户,同时移除此用户在此项目下的所有权限 + + **Request** + + - **ProjectID** (str) - (Required) 项目ID + - **UserName** (str) - (Required) 用户名 + + **Response** + + - **Message** (str) - 错误消息 + + """ + # build request + d = {} + req and d.update(req) + d = apis.RemoveUserFromProjectRequestSchema().dumps(d) + + resp = self.invoke("RemoveUserFromProject", d, **kwargs) + return apis.RemoveUserFromProjectResponseSchema().loads(resp) + + def update_access_key( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateAccessKey - 修改用户密钥状态 + + **Request** + + - **AccessKeyID** (str) - (Required) 用户公钥 + - **Description** (str) - 密钥描述 + - **Status** (str) - 密钥状态 + + **Response** + + + """ + # build request + d = {} + req and d.update(req) + d = apis.UpdateAccessKeyRequestSchema().dumps(d) + + resp = self.invoke("UpdateAccessKey", d, **kwargs) + return apis.UpdateAccessKeyResponseSchema().loads(resp) + + def update_group(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """UpdateGroup - 更新用户组信息 + + **Request** + + - **Description** (str) - (Required) 用户组描述信息 + - **GroupName** (str) - (Required) 用户组名称 + + **Response** + + - **Message** (str) - 错误消息 + + """ + # build request + d = {} + req and d.update(req) + d = apis.UpdateGroupRequestSchema().dumps(d) + + resp = self.invoke("UpdateGroup", d, **kwargs) + return apis.UpdateGroupResponseSchema().loads(resp) + + def update_iam_policy( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateIAMPolicy - 更新IAM策略 + + **Request** + + - **Document** (str) - (Required) 策略内容 + - **PolicyURN** (str) - (Required) 策略URN + - **Description** (str) - 描述 + - **VersionDescription** (str) - 策略版本描述 + + **Response** + + - **Message** (str) - 错误消息 + + """ + # build request + d = {} + req and d.update(req) + d = apis.UpdateIAMPolicyRequestSchema().dumps(d) + + resp = self.invoke("UpdateIAMPolicy", d, **kwargs) + return apis.UpdateIAMPolicyResponseSchema().loads(resp) + + def update_iam_policy_name( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateIAMPolicyName - 修改自定义策略名称 + + **Request** + + - **Description** (str) - (Required) 策略描述 + - **PolicyName** (str) - (Required) 策略名称 + - **PolicyURN** (str) - (Required) 策略URN + + **Response** + + + """ + # build request + d = {} + req and d.update(req) + d = apis.UpdateIAMPolicyNameRequestSchema().dumps(d) + + resp = self.invoke("UpdateIAMPolicyName", d, **kwargs) + return apis.UpdateIAMPolicyNameResponseSchema().loads(resp) + + def update_login_profile( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateLoginProfile - 更新用户登录资料 + + **Request** + + - **UserName** (str) - (Required) 用户名 + - **MFABindRequired** (bool) - 是否必需绑定MFA + - **MaxPasswordAge** (int) - 密码最长有效期,单位:天 + - **Status** (str) - 登录资料状态 + - **UserEmail** (str) - 用户真实邮箱 + + **Response** + + + """ + # build request + d = {} + req and d.update(req) + d = apis.UpdateLoginProfileRequestSchema().dumps(d) + + resp = self.invoke("UpdateLoginProfile", d, **kwargs) + return apis.UpdateLoginProfileResponseSchema().loads(resp) + + def update_user(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """UpdateUser - 更新用户 + + **Request** + + - **UserName** (str) - (Required) 用户名 + - **DisplayName** (str) - 用户名称(用户名称和用户状态不能同时为空) + - **NewUserName** (str) - 新用户名 + - **Status** (str) - 用户状态(用户名称和用户状态不能同时为空,枚举值:Active:解冻,Frozen:冻结) + + **Response** + + - **Message** (str) - 错误消息 + + """ + # build request + d = {} + req and d.update(req) + d = apis.UpdateUserRequestSchema().dumps(d) + + resp = self.invoke("UpdateUser", d, **kwargs) + return apis.UpdateUserResponseSchema().loads(resp) diff --git a/ucloud/services/iam/schemas/__init__.py b/ucloud/services/iam/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/iam/schemas/apis.py b/ucloud/services/iam/schemas/apis.py new file mode 100644 index 00000000..399af8ea --- /dev/null +++ b/ucloud/services/iam/schemas/apis.py @@ -0,0 +1,973 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.iam.schemas import models + +""" IAM API Schema +""" + + +""" +API: AddUserToGroup + +添加成员到用户组 +""" + + +class AddUserToGroupRequestSchema(schema.RequestSchema): + """AddUserToGroup - 添加成员到用户组""" + + fields = { + "GroupName": fields.Str(required=True, dump_to="GroupName"), + "UserName": fields.Str(required=True, dump_to="UserName"), + } + + +class AddUserToGroupResponseSchema(schema.ResponseSchema): + """AddUserToGroup - 添加成员到用户组""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: AttachPoliciesToGroup + +关联IAM策略到用户组 +""" + + +class AttachPoliciesToGroupRequestSchema(schema.RequestSchema): + """AttachPoliciesToGroup - 关联IAM策略到用户组""" + + fields = { + "GroupName": fields.Str(required=True, dump_to="GroupName"), + "PolicyURNs": fields.List(fields.Str()), + "ProjectID": fields.Str(required=False, dump_to="ProjectID"), + "Scope": fields.Str(required=True, dump_to="Scope"), + } + + +class AttachPoliciesToGroupResponseSchema(schema.ResponseSchema): + """AttachPoliciesToGroup - 关联IAM策略到用户组""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: AttachPoliciesToUser + +关联IAM策略到用户 +""" + + +class AttachPoliciesToUserRequestSchema(schema.RequestSchema): + """AttachPoliciesToUser - 关联IAM策略到用户""" + + fields = { + "PolicyURNs": fields.List(fields.Str()), + "ProjectID": fields.Str(required=False, dump_to="ProjectID"), + "Scope": fields.Str(required=True, dump_to="Scope"), + "UserName": fields.Str(required=True, dump_to="UserName"), + } + + +class AttachPoliciesToUserResponseSchema(schema.ResponseSchema): + """AttachPoliciesToUser - 关联IAM策略到用户""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: CreateAccessKey + +创建用户密钥 +""" + + +class CreateAccessKeyRequestSchema(schema.RequestSchema): + """CreateAccessKey - 创建用户密钥""" + + fields = { + "UserName": fields.Str(required=True, dump_to="UserName"), + } + + +class CreateAccessKeyResponseSchema(schema.ResponseSchema): + """CreateAccessKey - 创建用户密钥""" + + fields = { + "AccessKey": models.AccessKeySchema(), + } + + +""" +API: CreateGroup + +创建用户组 +""" + + +class CreateGroupRequestSchema(schema.RequestSchema): + """CreateGroup - 创建用户组""" + + fields = { + "Description": fields.Str(required=False, dump_to="Description"), + "GroupName": fields.Str(required=True, dump_to="GroupName"), + } + + +class CreateGroupResponseSchema(schema.ResponseSchema): + """CreateGroup - 创建用户组""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: CreateIAMPolicy + +创建IAM策略 +""" + + +class CreateIAMPolicyRequestSchema(schema.RequestSchema): + """CreateIAMPolicy - 创建IAM策略""" + + fields = { + "Description": fields.Str(required=False, dump_to="Description"), + "Document": fields.Str(required=True, dump_to="Document"), + "PolicyName": fields.Str(required=True, dump_to="PolicyName"), + "ScopeType": fields.Str(required=False, dump_to="ScopeType"), + } + + +class CreateIAMPolicyResponseSchema(schema.ResponseSchema): + """CreateIAMPolicy - 创建IAM策略""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: CreateProject + +创建项目 +""" + + +class CreateProjectRequestSchema(schema.RequestSchema): + """CreateProject - 创建项目""" + + fields = { + "ProjectName": fields.Str(required=True, dump_to="ProjectName"), + } + + +class CreateProjectResponseSchema(schema.ResponseSchema): + """CreateProject - 创建项目""" + + fields = { + "ProjectId": fields.Str(required=True, load_from="ProjectId"), + } + + +""" +API: CreateUser + +创建IAM用户 +""" + + +class CreateUserRequestSchema(schema.RequestSchema): + """CreateUser - 创建IAM用户""" + + fields = { + "AccessKeyStatus": fields.Str(required=True, dump_to="AccessKeyStatus"), + "DisplayName": fields.Str(required=False, dump_to="DisplayName"), + "Email": fields.Str(required=False, dump_to="Email"), + "LoginProfileStatus": fields.Str( + required=True, dump_to="LoginProfileStatus" + ), + "UserName": fields.Str(required=True, dump_to="UserName"), + } + + +class CreateUserResponseSchema(schema.ResponseSchema): + """CreateUser - 创建IAM用户""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DeleteAccessKey + +删除用户密钥 +""" + + +class DeleteAccessKeyRequestSchema(schema.RequestSchema): + """DeleteAccessKey - 删除用户密钥""" + + fields = { + "AccessKeyID": fields.Str(required=True, dump_to="AccessKeyID"), + } + + +class DeleteAccessKeyResponseSchema(schema.ResponseSchema): + """DeleteAccessKey - 删除用户密钥""" + + fields = {} + + +""" +API: DeleteGroup + +删除用户组 +""" + + +class DeleteGroupRequestSchema(schema.RequestSchema): + """DeleteGroup - 删除用户组""" + + fields = { + "GroupName": fields.Str(required=True, dump_to="GroupName"), + } + + +class DeleteGroupResponseSchema(schema.ResponseSchema): + """DeleteGroup - 删除用户组""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DeleteIAMPolicy + +删除IAM策略 +""" + + +class DeleteIAMPolicyRequestSchema(schema.RequestSchema): + """DeleteIAMPolicy - 删除IAM策略""" + + fields = { + "PolicyURN": fields.Str(required=True, dump_to="PolicyURN"), + } + + +class DeleteIAMPolicyResponseSchema(schema.ResponseSchema): + """DeleteIAMPolicy - 删除IAM策略""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DeleteProject + +删除项目 +""" + + +class DeleteProjectRequestSchema(schema.RequestSchema): + """DeleteProject - 删除项目""" + + fields = { + "ProjectID": fields.Str(required=True, dump_to="ProjectID"), + } + + +class DeleteProjectResponseSchema(schema.ResponseSchema): + """DeleteProject - 删除项目""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DeleteUser + +删除用户 +""" + + +class DeleteUserRequestSchema(schema.RequestSchema): + """DeleteUser - 删除用户""" + + fields = { + "UserName": fields.Str(required=True, dump_to="UserName"), + } + + +class DeleteUserResponseSchema(schema.ResponseSchema): + """DeleteUser - 删除用户""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DetachPoliciesFromGroup + +移除用户组关联的IAM策略 +""" + + +class DetachPoliciesFromGroupRequestSchema(schema.RequestSchema): + """DetachPoliciesFromGroup - 移除用户组关联的IAM策略""" + + fields = { + "GroupName": fields.Str(required=True, dump_to="GroupName"), + "PolicyURNs": fields.List(fields.Str()), + "ProjectID": fields.Str(required=False, dump_to="ProjectID"), + "Scope": fields.Str(required=True, dump_to="Scope"), + } + + +class DetachPoliciesFromGroupResponseSchema(schema.ResponseSchema): + """DetachPoliciesFromGroup - 移除用户组关联的IAM策略""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DetachPoliciesFromUser + +移除用户关联的IAM策略 +""" + + +class DetachPoliciesFromUserRequestSchema(schema.RequestSchema): + """DetachPoliciesFromUser - 移除用户关联的IAM策略""" + + fields = { + "PolicyURNs": fields.List(fields.Str()), + "ProjectID": fields.Str(required=False, dump_to="ProjectID"), + "Scope": fields.Str(required=True, dump_to="Scope"), + "UserName": fields.Str(required=True, dump_to="UserName"), + } + + +class DetachPoliciesFromUserResponseSchema(schema.ResponseSchema): + """DetachPoliciesFromUser - 移除用户关联的IAM策略""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: GetGroup + +查询用户组详情 +""" + + +class GetGroupRequestSchema(schema.RequestSchema): + """GetGroup - 查询用户组详情""" + + fields = { + "GroupName": fields.Str(required=True, dump_to="GroupName"), + } + + +class GetGroupResponseSchema(schema.ResponseSchema): + """GetGroup - 查询用户组详情""" + + fields = { + "Group": models.GroupSchema(), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: GetIAMPolicy + +获取策略详情 +""" + + +class GetIAMPolicyRequestSchema(schema.RequestSchema): + """GetIAMPolicy - 获取策略详情""" + + fields = { + "PolicyURN": fields.Str(required=True, dump_to="PolicyURN"), + } + + +class GetIAMPolicyResponseSchema(schema.ResponseSchema): + """GetIAMPolicy - 获取策略详情""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "Policy": models.IAMPolicySchema(), + } + + +""" +API: GetLoginProfile + +获取用户登录资料 +""" + + +class GetLoginProfileRequestSchema(schema.RequestSchema): + """GetLoginProfile - 获取用户登录资料""" + + fields = { + "UserName": fields.Str(required=True, dump_to="UserName"), + } + + +class GetLoginProfileResponseSchema(schema.ResponseSchema): + """GetLoginProfile - 获取用户登录资料""" + + fields = { + "LoginProfile": models.LoginProfileSchema(), + } + + +""" +API: GetUser + +获取用户信息 +""" + + +class GetUserRequestSchema(schema.RequestSchema): + """GetUser - 获取用户信息""" + + fields = { + "UserName": fields.Str(required=True, dump_to="UserName"), + } + + +class GetUserResponseSchema(schema.ResponseSchema): + """GetUser - 获取用户信息""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "User": models.UserSchema(), + } + + +""" +API: ListAccessKeys + +获取指定用户密钥列表 +""" + + +class ListAccessKeysRequestSchema(schema.RequestSchema): + """ListAccessKeys - 获取指定用户密钥列表""" + + fields = { + "UserName": fields.Str(required=True, dump_to="UserName"), + } + + +class ListAccessKeysResponseSchema(schema.ResponseSchema): + """ListAccessKeys - 获取指定用户密钥列表""" + + fields = { + "AccessKey": fields.List( + models.AccessKeySchema(), required=True, load_from="AccessKey" + ), + } + + +""" +API: ListEntitiesForPolicy + +列出引用权限策略的实体 +""" + + +class ListEntitiesForPolicyRequestSchema(schema.RequestSchema): + """ListEntitiesForPolicy - 列出引用权限策略的实体""" + + fields = { + "Limit": fields.Str(required=False, dump_to="Limit"), + "Offset": fields.Str(required=False, dump_to="Offset"), + "PolicyURN": fields.Str(required=True, dump_to="PolicyURN"), + } + + +class ListEntitiesForPolicyResponseSchema(schema.ResponseSchema): + """ListEntitiesForPolicy - 列出引用权限策略的实体""" + + fields = { + "Entities": fields.List( + models.EntitySchema(), required=True, load_from="Entities" + ), + "Message": fields.Str(required=True, load_from="Message"), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: ListEntitiesForProject + +列出拥有指定项目权限的实体 +""" + + +class ListEntitiesForProjectRequestSchema(schema.RequestSchema): + """ListEntitiesForProject - 列出拥有指定项目权限的实体""" + + fields = { + "Limit": fields.Str(required=False, dump_to="Limit"), + "Offset": fields.Str(required=False, dump_to="Offset"), + "ProjectID": fields.Str(required=True, dump_to="ProjectID"), + } + + +class ListEntitiesForProjectResponseSchema(schema.ResponseSchema): + """ListEntitiesForProject - 列出拥有指定项目权限的实体""" + + fields = { + "Entities": fields.List( + models.EntitySchema(), required=True, load_from="Entities" + ), + "Message": fields.Str(required=True, load_from="Message"), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: ListGroups + +列出用户组 +""" + + +class ListGroupsRequestSchema(schema.RequestSchema): + """ListGroups - 列出用户组""" + + fields = {} + + +class ListGroupsResponseSchema(schema.ResponseSchema): + """ListGroups - 列出用户组""" + + fields = { + "Groups": fields.List( + models.GroupSchema(), required=True, load_from="Groups" + ), + "Message": fields.Str(required=True, load_from="Message"), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: ListPolicies + +获取IAM策略列表 +""" + + +class ListPoliciesRequestSchema(schema.RequestSchema): + """ListPolicies - 获取IAM策略列表""" + + fields = { + "Limit": fields.Str(required=False, dump_to="Limit"), + "Offset": fields.Str(required=False, dump_to="Offset"), + "Owner": fields.Str(required=True, dump_to="Owner"), + } + + +class ListPoliciesResponseSchema(schema.ResponseSchema): + """ListPolicies - 获取IAM策略列表""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "Policies": fields.List( + models.IAMPolicySchema(), required=True, load_from="Policies" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: ListPoliciesForGroup + +列出用户组关联的权限策略 +""" + + +class ListPoliciesForGroupRequestSchema(schema.RequestSchema): + """ListPoliciesForGroup - 列出用户组关联的权限策略""" + + fields = { + "GroupName": fields.Str(required=True, dump_to="GroupName"), + "Limit": fields.Str(required=False, dump_to="Limit"), + "Offset": fields.Str(required=False, dump_to="Offset"), + "ProjectID": fields.Str(required=False, dump_to="ProjectID"), + "Scope": fields.Str(required=False, dump_to="Scope"), + } + + +class ListPoliciesForGroupResponseSchema(schema.ResponseSchema): + """ListPoliciesForGroup - 列出用户组关联的权限策略""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "Policies": fields.List( + models.PolicySchema(), required=True, load_from="Policies" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: ListPoliciesForUser + +列出用户关联的IAM策略 +""" + + +class ListPoliciesForUserRequestSchema(schema.RequestSchema): + """ListPoliciesForUser - 列出用户关联的IAM策略""" + + fields = { + "Limit": fields.Str(required=False, dump_to="Limit"), + "Offset": fields.Str(required=False, dump_to="Offset"), + "ProjectID": fields.Str(required=False, dump_to="ProjectID"), + "Scope": fields.Str(required=False, dump_to="Scope"), + "UserName": fields.Str(required=True, dump_to="UserName"), + } + + +class ListPoliciesForUserResponseSchema(schema.ResponseSchema): + """ListPoliciesForUser - 列出用户关联的IAM策略""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "Policies": fields.List( + models.PolicySchema(), required=True, load_from="Policies" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: ListProjects + +列出所有项目 +""" + + +class ListProjectsRequestSchema(schema.RequestSchema): + """ListProjects - 列出所有项目""" + + fields = { + "Limit": fields.Str(required=False, dump_to="Limit"), + "Offset": fields.Str(required=False, dump_to="Offset"), + } + + +class ListProjectsResponseSchema(schema.ResponseSchema): + """ListProjects - 列出所有项目""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "Projects": fields.List( + models.ProjectSchema(), required=True, load_from="Projects" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: ListUsers + +列出用户列表 +""" + + +class ListUsersRequestSchema(schema.RequestSchema): + """ListUsers - 列出用户列表""" + + fields = { + "Limit": fields.Str(required=False, dump_to="Limit"), + "Offset": fields.Str(required=False, dump_to="Offset"), + } + + +class ListUsersResponseSchema(schema.ResponseSchema): + """ListUsers - 列出用户列表""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + "Users": fields.List( + models.UsersSchema(), required=True, load_from="Users" + ), + } + + +""" +API: ListUsersForGroup + +列出用户组包含的用户 +""" + + +class ListUsersForGroupRequestSchema(schema.RequestSchema): + """ListUsersForGroup - 列出用户组包含的用户""" + + fields = { + "GroupName": fields.Str(required=True, dump_to="GroupName"), + "Limit": fields.Str(required=False, dump_to="Limit"), + "Offset": fields.Str(required=False, dump_to="Offset"), + } + + +class ListUsersForGroupResponseSchema(schema.ResponseSchema): + """ListUsersForGroup - 列出用户组包含的用户""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + "Users": fields.List( + models.UserForGroupSchema(), required=True, load_from="Users" + ), + } + + +""" +API: ModifyProject + +修改项目 +""" + + +class ModifyProjectRequestSchema(schema.RequestSchema): + """ModifyProject - 修改项目""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "ProjectName": fields.Str(required=True, dump_to="ProjectName"), + } + + +class ModifyProjectResponseSchema(schema.ResponseSchema): + """ModifyProject - 修改项目""" + + fields = {} + + +""" +API: RemoveUserFromGroup + +移除用户组中的IAM用户 +""" + + +class RemoveUserFromGroupRequestSchema(schema.RequestSchema): + """RemoveUserFromGroup - 移除用户组中的IAM用户""" + + fields = { + "GroupName": fields.Str(required=True, dump_to="GroupName"), + "UserName": fields.Str(required=True, dump_to="UserName"), + } + + +class RemoveUserFromGroupResponseSchema(schema.ResponseSchema): + """RemoveUserFromGroup - 移除用户组中的IAM用户""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: RemoveUserFromProject + +移除项目中的IAM用户,同时移除此用户在此项目下的所有权限 +""" + + +class RemoveUserFromProjectRequestSchema(schema.RequestSchema): + """RemoveUserFromProject - 移除项目中的IAM用户,同时移除此用户在此项目下的所有权限""" + + fields = { + "ProjectID": fields.Str(required=True, dump_to="ProjectID"), + "UserName": fields.Str(required=True, dump_to="UserName"), + } + + +class RemoveUserFromProjectResponseSchema(schema.ResponseSchema): + """RemoveUserFromProject - 移除项目中的IAM用户,同时移除此用户在此项目下的所有权限""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: UpdateAccessKey + +修改用户密钥状态 +""" + + +class UpdateAccessKeyRequestSchema(schema.RequestSchema): + """UpdateAccessKey - 修改用户密钥状态""" + + fields = { + "AccessKeyID": fields.Str(required=True, dump_to="AccessKeyID"), + "Description": fields.Str(required=False, dump_to="Description"), + "Status": fields.Str(required=False, dump_to="Status"), + } + + +class UpdateAccessKeyResponseSchema(schema.ResponseSchema): + """UpdateAccessKey - 修改用户密钥状态""" + + fields = {} + + +""" +API: UpdateGroup + +更新用户组信息 +""" + + +class UpdateGroupRequestSchema(schema.RequestSchema): + """UpdateGroup - 更新用户组信息""" + + fields = { + "Description": fields.Str(required=True, dump_to="Description"), + "GroupName": fields.Str(required=True, dump_to="GroupName"), + } + + +class UpdateGroupResponseSchema(schema.ResponseSchema): + """UpdateGroup - 更新用户组信息""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: UpdateIAMPolicy + +更新IAM策略 +""" + + +class UpdateIAMPolicyRequestSchema(schema.RequestSchema): + """UpdateIAMPolicy - 更新IAM策略""" + + fields = { + "Description": fields.Str(required=False, dump_to="Description"), + "Document": fields.Str(required=True, dump_to="Document"), + "PolicyURN": fields.Str(required=True, dump_to="PolicyURN"), + "VersionDescription": fields.Str( + required=False, dump_to="VersionDescription" + ), + } + + +class UpdateIAMPolicyResponseSchema(schema.ResponseSchema): + """UpdateIAMPolicy - 更新IAM策略""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: UpdateIAMPolicyName + +修改自定义策略名称 +""" + + +class UpdateIAMPolicyNameRequestSchema(schema.RequestSchema): + """UpdateIAMPolicyName - 修改自定义策略名称""" + + fields = { + "Description": fields.Str(required=True, dump_to="Description"), + "PolicyName": fields.Str(required=True, dump_to="PolicyName"), + "PolicyURN": fields.Str(required=True, dump_to="PolicyURN"), + } + + +class UpdateIAMPolicyNameResponseSchema(schema.ResponseSchema): + """UpdateIAMPolicyName - 修改自定义策略名称""" + + fields = {} + + +""" +API: UpdateLoginProfile + +更新用户登录资料 +""" + + +class UpdateLoginProfileRequestSchema(schema.RequestSchema): + """UpdateLoginProfile - 更新用户登录资料""" + + fields = { + "MFABindRequired": fields.Bool( + required=False, dump_to="MFABindRequired" + ), + "MaxPasswordAge": fields.Int(required=False, dump_to="MaxPasswordAge"), + "Status": fields.Str(required=False, dump_to="Status"), + "UserEmail": fields.Str(required=False, dump_to="UserEmail"), + "UserName": fields.Str(required=True, dump_to="UserName"), + } + + +class UpdateLoginProfileResponseSchema(schema.ResponseSchema): + """UpdateLoginProfile - 更新用户登录资料""" + + fields = {} + + +""" +API: UpdateUser + +更新用户 +""" + + +class UpdateUserRequestSchema(schema.RequestSchema): + """UpdateUser - 更新用户""" + + fields = { + "DisplayName": fields.Str(required=False, dump_to="DisplayName"), + "NewUserName": fields.Str(required=False, dump_to="NewUserName"), + "Status": fields.Str(required=False, dump_to="Status"), + "UserName": fields.Str(required=True, dump_to="UserName"), + } + + +class UpdateUserResponseSchema(schema.ResponseSchema): + """UpdateUser - 更新用户""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } diff --git a/ucloud/services/iam/schemas/models.py b/ucloud/services/iam/schemas/models.py new file mode 100644 index 00000000..cc2c1e0f --- /dev/null +++ b/ucloud/services/iam/schemas/models.py @@ -0,0 +1,127 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class AccessKeySchema(schema.ResponseSchema): + """AccessKey - 密钥信息实例""" + + fields = { + "AccessKeyID": fields.Str(required=False, load_from="AccessKeyID"), + "AccessKeySecret": fields.Str( + required=False, load_from="AccessKeySecret" + ), + "CreatedAt": fields.Int(required=False, load_from="CreatedAt"), + "DeletedAt": fields.Int(required=False, load_from="DeletedAt"), + "Description": fields.Str(required=False, load_from="Description"), + "ExpiredAt": fields.Int(required=False, load_from="ExpiredAt"), + "Status": fields.Str(required=False, load_from="Status"), + "UpdatedAt": fields.Int(required=False, load_from="UpdatedAt"), + "UserId": fields.Int(required=False, load_from="UserId"), + } + + +class GroupSchema(schema.ResponseSchema): + """Group - 用户组模型""" + + fields = { + "CreatedAt": fields.Int(required=False, load_from="CreatedAt"), + "Description": fields.Str(required=True, load_from="Description"), + "GroupName": fields.Str(required=True, load_from="GroupName"), + } + + +class IAMPolicySchema(schema.ResponseSchema): + """IAMPolicy - 获取IAM权限策略详情""" + + fields = { + "CreatedAt": fields.Int(required=False, load_from="CreatedAt"), + "Description": fields.Str(required=False, load_from="Description"), + "Document": fields.Str(required=False, load_from="Document"), + "PolicyName": fields.Str(required=False, load_from="PolicyName"), + "PolicyURN": fields.Str(required=False, load_from="PolicyURN"), + "ScopeType": fields.Str(required=False, load_from="ScopeType"), + "UpdatedAt": fields.Int(required=False, load_from="UpdatedAt"), + } + + +class LoginProfileSchema(schema.ResponseSchema): + """LoginProfile - 登录资料""" + + fields = { + "MFABindRequired": fields.Bool( + required=True, load_from="MFABindRequired" + ), + "MaxPasswordAge": fields.Int(required=True, load_from="MaxPasswordAge"), + "Status": fields.Str(required=True, load_from="Status"), + } + + +class UserSchema(schema.ResponseSchema): + """User - 用户模型""" + + fields = { + "CreatedAt": fields.Int(required=False, load_from="CreatedAt"), + "DisplayName": fields.Str(required=False, load_from="DisplayName"), + "Email": fields.Str(required=True, load_from="Email"), + "Status": fields.Str(required=False, load_from="Status"), + "UserName": fields.Str(required=True, load_from="UserName"), + } + + +class EntitySchema(schema.ResponseSchema): + """Entity - 权限策略的实体""" + + fields = { + "AttachedAt": fields.Int(required=True, load_from="AttachedAt"), + "EntityKind": fields.Str(required=True, load_from="EntityKind"), + "EntityName": fields.Str(required=True, load_from="EntityName"), + } + + +class PolicySchema(schema.ResponseSchema): + """Policy - 权限策略""" + + fields = { + "AttachedAt": fields.Int(required=False, load_from="AttachedAt"), + "CreatedAt": fields.Int(required=False, load_from="CreatedAt"), + "Description": fields.Str(required=False, load_from="Description"), + "PolicyName": fields.Str(required=True, load_from="PolicyName"), + "PolicyURN": fields.Str(required=True, load_from="PolicyURN"), + "ProjectID": fields.Str(required=False, load_from="ProjectID"), + "Scope": fields.Str(required=False, load_from="Scope"), + } + + +class ProjectSchema(schema.ResponseSchema): + """Project - 项目模型""" + + fields = { + "CreatedAt": fields.Int(required=True, load_from="CreatedAt"), + "ProjectID": fields.Str(required=True, load_from="ProjectID"), + "ProjectName": fields.Str(required=True, load_from="ProjectName"), + "UserCount": fields.Int(required=True, load_from="UserCount"), + } + + +class UsersSchema(schema.ResponseSchema): + """Users - 用户模型""" + + fields = { + "CreatedAt": fields.Int(required=False, load_from="CreatedAt"), + "DisplayName": fields.Str(required=False, load_from="DisplayName"), + "Email": fields.Str(required=True, load_from="Email"), + "Status": fields.Str(required=False, load_from="Status"), + "UserName": fields.Str(required=True, load_from="UserName"), + } + + +class UserForGroupSchema(schema.ResponseSchema): + """UserForGroup - 用户模型""" + + fields = { + "DisplayName": fields.Str(required=False, load_from="DisplayName"), + "Email": fields.Str(required=True, load_from="Email"), + "JoinedAt": fields.Int(required=False, load_from="JoinedAt"), + "UserName": fields.Str(required=True, load_from="UserName"), + } diff --git a/ucloud/services/ipsecvpn/client.py b/ucloud/services/ipsecvpn/client.py index 5b451c6e..4de39687 100644 --- a/ucloud/services/ipsecvpn/client.py +++ b/ucloud/services/ipsecvpn/client.py @@ -15,30 +15,232 @@ def __init__( config, transport, middleware, logger ) + def create_remote_vpn_gateway( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateRemoteVPNGateway - 创建客户VPN网关 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **RemoteVPNGatewayAddr** (str) - (Required) 客户VPN网关地址 + - **RemoteVPNGatewayName** (str) - (Required) 客户VPN网关名称 + - **Remark** (str) - 备注,默认为空 + - **Tag** (str) - 业务组名称,默认为 "Default" + + **Response** + + - **RemoteVPNGatewayId** (str) - 新建客户VPN网关的资源ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateRemoteVPNGatewayRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateRemoteVPNGateway", d, **kwargs) + return apis.CreateRemoteVPNGatewayResponseSchema().loads(resp) + + def create_vpn_gateway( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateVPNGateway - 创建VPN网关 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Grade** (str) - (Required) 购买的VPN网关规格,枚举值为: Standard, 标准型; Enhanced, 增强型 + - **VPCId** (str) - (Required) 新建VPN网关所属VPC的资源ID + - **VPNGatewayName** (str) - (Required) 新建VPN网关名称 + - **BusinessId** (str) - 业务组ID + - **ChargeType** (str) - 付费方式, 枚举值为: Year, 按年付费; Month, 按月付费;Dynamic, 按需付费(需开启权限);Trial, 试用(需开启权限);默认为按月付费 + - **CouponId** (str) - 代金券ID, 默认不使用 + - **EIPId** (str) - 若要绑定EIP,在此填上EIP的资源ID + - **Quantity** (int) - 购买时长, 默认: 1 + - **Remark** (str) - 备注,默认为空 + - **Tag** (str) - 业务组名称,默认为 "Default" + + **Response** + + - **VPNGatewayId** (str) - 新建VPN网关的资源ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateVPNGatewayRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateVPNGateway", d, **kwargs) + return apis.CreateVPNGatewayResponseSchema().loads(resp) + + def create_vpn_tunnel( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateVPNTunnel - 创建VPN隧道 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **IKEPreSharedKey** (str) - (Required) 预共享密钥 + - **IKEVersion** (str) - (Required) ike版本,枚举值: "IKE V1","IKE V2",默认v1 + - **IPSecLocalSubnetIds** (list) - (Required) 指定VPN连接的本地子网的资源ID,最多可填写10个。 + - **IPSecRemoteSubnets** (list) - (Required) 指定VPN连接的客户网段,最多可填写20个。 + - **RemoteVPNGatewayId** (str) - (Required) 客户VPN网关的资源ID + - **VPCId** (str) - (Required) vpcId + - **VPNGatewayId** (str) - (Required) VPN网关的资源ID + - **VPNTunnelName** (str) - (Required) VPN隧道名称 + - **IKEAuthenticationAlgorithm** (str) - IKE协商过程中使用的认证算法,"md5", "sha1", "sha2-256"。默认值为“sha1” + - **IKEDhGroup** (str) - IKE协商过程中使用的DH组,枚举值,"1", "2", "5", "14", "15", "16"。默认为“15” + - **IKEEncryptionAlgorithm** (str) - IKE协商过程中使用的加密算法,枚举值,"aes128", "aes192", "aes256", "aes512", "3des"。默认值为“aes128” + - **IKEExchangeMode** (str) - IKE协商过程中使用的模式,枚举值,主模式,“main”;野蛮模式,“aggressive”。IKEV1默认为主模式“main”,IKEV2时不使用该参数。 + - **IKELocalId** (str) - 本端标识。枚举值,自动识别,“auto”;IP地址或域名。默认为自动识别“auto”。IKEV2必填该参数 + - **IKERemoteId** (str) - 客户端标识。枚举值,自动识别,“auto”;IP地址或域名。默认为“自动识别“auto”。IKEV2必填该参数 + - **IKESALifetime** (str) - IKE中SA的生存时间,可填写范围为600-604800。默认为86400。 + - **IPSecAuthenticationAlgorithm** (str) - IPSec隧道中使用的认证算法,枚举值,"md5", "sha1","sha2-256"。默认值为“sha1” + - **IPSecCloseAction** (str) - IPSec隧道关闭后的处理动作,枚举值:“none”,流量触发;“restart”,自动重联,默认为none + - **IPSecEncryptionAlgorithm** (str) - IPSec隧道中使用的加密算法,枚举值,"aes128", "aes192", "aes256", "aes512", "3des"。默认值为“aes128” + - **IPSecPFSDhGroup** (str) - IPSec的PFS是否开启,枚举值,,不开启,"disable";数字表示DH组, "1", "2", "5", "14", "15", "16"。默认为“disable”。 + - **IPSecProtocol** (str) - 使用的安全协议,枚举值,“esp”,“ah”。默认为“esp” + - **IPSecSALifetime** (str) - IPSec中SA的生存时间,可填写范围为1200 - 604800。默认为3600 + - **IPSecSALifetimeBytes** (str) - IPSec中SA的生存时间(以字节计)。可选为8000 – 20000000。默认使用SA生存时间, + - **Remark** (str) - 备注,默认为空 + - **Tag** (str) - 业务组,默认为“Default” + + **Response** + + - **VPNTunnelId** (str) - VPN隧道的资源ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateVPNTunnelRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateVPNTunnel", d, **kwargs) + return apis.CreateVPNTunnelResponseSchema().loads(resp) + + def delete_remote_vpn_gateway( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteRemoteVPNGateway - 删除客户VPN网关 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **RemoteVPNGatewayId** (str) - (Required) 客户VPN网关的资源ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteRemoteVPNGatewayRequestSchema().dumps(d) + + resp = self.invoke("DeleteRemoteVPNGateway", d, **kwargs) + return apis.DeleteRemoteVPNGatewayResponseSchema().loads(resp) + + def delete_vpn_gateway( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteVPNGateway - 删除VPN网关 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **VPNGatewayId** (str) - (Required) VPN网关的资源ID + - **ReleaseEip** (bool) - 删除VPN时是否一并释放EIP。false,只解绑EIP不删除EIP;true,解绑并释放EIP。默认是false + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteVPNGatewayRequestSchema().dumps(d) + + resp = self.invoke("DeleteVPNGateway", d, **kwargs) + return apis.DeleteVPNGatewayResponseSchema().loads(resp) + + def delete_vpn_tunnel( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteVPNTunnel - 删除VPN隧道 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **VPNTunnelId** (str) - (Required) VPN隧道的资源ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteVPNTunnelRequestSchema().dumps(d) + + resp = self.invoke("DeleteVPNTunnel", d, **kwargs) + return apis.DeleteVPNTunnelResponseSchema().loads(resp) + def describe_remote_vpn_gateway( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeRemoteVPNGateway - 获取客户VPN网关信息 + """DescribeRemoteVPNGateway - 获取客户VPN网关信息 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Limit** (int) - 数据分页值, 默认为20 - **Offset** (int) - 数据偏移量, 默认为0 - **RemoteVPNGatewayIds** (list) - 客户VPN网关的资源ID,例如RemoteVPNGatewayIds.0代表希望获取客户VPN网关1的信息,RemoteVPNGatewayIds.1代表客户VPN网关2,如果为空,则返回当前Region中所有客户VPN网关实例的信息 - **Tag** (str) - 业务组名称,若指定则返回业务组下所有客户VPN网关信息 - + **Response** - **DataSet** (list) - 见 **RemoteVPNGatewayDataSet** 模型定义 - **TotalCount** (int) - 符合条件的客户VPN网关总数 - + **Response Model** - - **RemoteVPNGatewayDataSet** - - - **ActiveTunnels** (str) - 活跃的隧道id + + **RemoteVPNGatewayDataSet** - **CreateTime** (int) - 创建时间 - **Remark** (str) - 备注 - **RemoteVPNGatewayAddr** (str) - 客户网关IP地址 @@ -47,6 +249,7 @@ def describe_remote_vpn_gateway( - **Tag** (str) - 用户组 - **TunnelCount** (int) - 活跃的隧道数量 + """ # build request d = { @@ -59,52 +262,79 @@ def describe_remote_vpn_gateway( resp = self.invoke("DescribeRemoteVPNGateway", d, **kwargs) return apis.DescribeRemoteVPNGatewayResponseSchema().loads(resp) + def describe_vpn_gateway( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeVPNGateway - 获取VPN网关信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - 数据分页值。默认为20 + - **Offset** (int) - 数据偏移量。默认为0 + - **Tag** (str) - 业务组名称,若指定则返回指定的业务组下的所有VPN网关的信息。 + - **VPCId** (str) - VPC的资源ID,返回指定的VPC下的所有VPN网关的信息。默认返回当前Region中所有VPN网关实例的信息 + - **VPNGatewayIds** (list) - VPN网关的资源ID,例如VPNGatewayIds.0代表希望获取VPN网关1的信息,VPNGatewayIds.1代表VPN网关2,如果为空,则返回当前Region中所有VPN网关的信息 + + **Response** + + - **DataSet** (list) - 见 **VPNGatewayDataSet** 模型定义 + - **TotalCount** (int) - 满足条件的VPN网关总数 + + **Response Model** + + **VPNGatewayDataSet** + - **AutoRenew** (str) - 是否自动续费 + - **ChargeType** (str) - 付费类型 + - **CreateTime** (int) - 创建时间 + - **EIP** (str) - 绑定EIP的IP地址 + - **EIPId** (str) - EIPID + - **EIPType** (str) - EIP类型 + - **ExpireTime** (int) - 到期时间 + - **Grade** (str) - 网关类型 + - **Remark** (str) - 网关备注 + - **Tag** (str) - 网关业务组 + - **VPCId** (str) - 所属VPCId + - **VPCName** (str) - 所属VPC名字 + - **VPNGatewayId** (str) - 网关Id + - **VPNGatewayName** (str) - 网关名字 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeVPNGatewayRequestSchema().dumps(d) + + resp = self.invoke("DescribeVPNGateway", d, **kwargs) + return apis.DescribeVPNGatewayResponseSchema().loads(resp) + def describe_vpn_tunnel( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeVPNTunnel - 获取VPN隧道信息 + """DescribeVPNTunnel - 获取VPN隧道信息 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Limit** (int) - 数据分页值, 默认为20 - **Offset** (int) - 数据偏移量, 默认为0 - **Tag** (str) - 业务组名称,若指定则返回指定的业务组下的所有VPN网关的信息 - **VPNTunnelIds** (list) - VPN隧道的资源ID,例如VPNTunnelIds.0代表希望获取信息的VPN隧道1,VPNTunneIds.1代表VPN隧道2,如果为空,则返回当前Region中所有的VPN隧道实例 - + **Response** - **DataSet** (list) - 见 **VPNTunnelDataSet** 模型定义 - **TotalCount** (int) - VPN隧道总数 - - **Response Model** - - **IPSecData** - - - **IPSecAuthenticationAlgorithm** (str) - IPSec通道中使用的认证算法 - - **IPSecEncryptionAlgorithm** (str) - IPSec通道中使用的加密算法 - - **IPSecLocalSubnetIds** (list) - 指定VPN连接的本地子网,用逗号分隔 - - **IPSecPFSDhGroup** (str) - 是否开启PFS功能,Disable表示关闭,数字表示DH组 - - **IPSecProtocol** (str) - 使用的安全协议,ESP或AH - - **IPSecRemoteSubnets** (list) - 指定VPN连接的客户网段,用逗号分隔 - - **IPSecSALifetime** (str) - IPSec中SA的生存时间 - - **IPSecSALifetimeBytes** (str) - IPSec中SA的生存时间(以字节计) - **IKEData** - - - **IKEAuthenticationAlgorithm** (str) - IKE认证算法 - - **IKEDhGroup** (str) - IKEDH组 - - **IKEEncryptionAlgorithm** (str) - IKE加密算法 - - **IKEExchangeMode** (str) - IKEv1协商模式 - - **IKELocalId** (str) - IKE本地ID标识 - - **IKEPreSharedKey** (str) - IKE预共享秘钥 - - **IKERemoteId** (str) - IKE对端ID标识 - - **IKESALifetime** (str) - IKE秘钥生存时间 - - **IKEVersion** (str) - IKE版本 + **Response Model** - **VPNTunnelDataSet** - + **VPNTunnelDataSet** - **CreateTime** (int) - 创建时间 - **IKEData** (dict) - 见 **IKEData** 模型定义 - **IPSecData** (dict) - 见 **IPSecData** 模型定义 @@ -119,6 +349,30 @@ def describe_vpn_tunnel( - **VPNTunnelId** (str) - 隧道id - **VPNTunnelName** (str) - 隧道名称 + + **IKEData** + - **IKEAuthenticationAlgorithm** (str) - IKE认证算法 + - **IKEDhGroup** (str) - IKEDH组 + - **IKEEncryptionAlgorithm** (str) - IKE加密算法 + - **IKEExchangeMode** (str) - IKEv1协商模式 + - **IKELocalId** (str) - IKE本地ID标识 + - **IKEPreSharedKey** (str) - IKE预共享秘钥 + - **IKERemoteId** (str) - IKE对端ID标识 + - **IKESALifetime** (str) - IKE秘钥生存时间 + - **IKEVersion** (str) - IKE版本 + + + **IPSecData** + - **IPSecAuthenticationAlgorithm** (str) - IPSec通道中使用的认证算法 + - **IPSecEncryptionAlgorithm** (str) - IPSec通道中使用的加密算法 + - **IPSecLocalSubnetIds** (list) - 指定VPN连接的本地子网,用逗号分隔 + - **IPSecPFSDhGroup** (str) - 是否开启PFS功能,Disable表示关闭,数字表示DH组 + - **IPSecProtocol** (str) - 使用的安全协议,ESP或AH + - **IPSecRemoteSubnets** (list) - 指定VPN连接的客户网段,用逗号分隔 + - **IPSecSALifetime** (str) - IPSec中SA的生存时间 + - **IPSecSALifetimeBytes** (str) - IPSec中SA的生存时间(以字节计) + + """ # build request d = { @@ -130,3 +384,139 @@ def describe_vpn_tunnel( resp = self.invoke("DescribeVPNTunnel", d, **kwargs) return apis.DescribeVPNTunnelResponseSchema().loads(resp) + + def get_vpn_gateway_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetVPNGatewayPrice - 获取VPN价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Grade** (str) - (Required) VPN网关规格。枚举值,包括:标准型:Standard,增强型:Enhanced。 + - **ChargeType** (str) - 付费方式, 枚举值为: Year, 按年付费; Month, 按月付费; Dynamic, 按需付费(需开启权限); 默认为获取三种价格 + - **Quantity** (int) - 购买时长, 默认: 1 + + **Response** + + - **PriceSet** (list) - 见 **VPNGatewayPriceSet** 模型定义 + + **Response Model** + + **VPNGatewayPriceSet** + - **ChargeType** (str) - VPN网关付费方式 + - **Price** (float) - VPN网关价格, 单位"元" + - **PurchaseValue** (int) - 资源有效期, 以Unix Timestamp表示 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetVPNGatewayPriceRequestSchema().dumps(d) + + resp = self.invoke("GetVPNGatewayPrice", d, **kwargs) + return apis.GetVPNGatewayPriceResponseSchema().loads(resp) + + def get_vpn_gateway_upgrade_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetVPNGatewayUpgradePrice - 获取VPN网关规格改动价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Grade** (str) - (Required) 更改的VPN网关规格,枚举值为: Standard, 标准型; Enhanced, 增强型。 + - **VPNGatewayId** (str) - (Required) VPN网关的资源ID + + **Response** + + - **Price** (float) - 调整规格后的VPN网关价格, 单位为"元", 如需退费此处为负值 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetVPNGatewayUpgradePriceRequestSchema().dumps(d) + + resp = self.invoke("GetVPNGatewayUpgradePrice", d, **kwargs) + return apis.GetVPNGatewayUpgradePriceResponseSchema().loads(resp) + + def update_vpn_gateway( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateVPNGateway - 更改VPN网关规格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Grade** (str) - (Required) 网关规格。枚举值为: Standard, 标准型; Enhanced, 增强型。 + - **VPNGatewayId** (str) - (Required) VPN网关的资源ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateVPNGatewayRequestSchema().dumps(d) + + resp = self.invoke("UpdateVPNGateway", d, **kwargs) + return apis.UpdateVPNGatewayResponseSchema().loads(resp) + + def update_vpn_tunnel_attribute( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateVPNTunnelAttribute - 更新VPN隧道属性 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **VPNTunnelId** (str) - (Required) VPN隧道的资源ID + - **IKEAuthenticationAlgorithm** (str) - IKE协商过程中使用的认证算法 + - **IKEDhGroup** (str) - IKE协商过程中使用的DH组 + - **IKEEncryptionAlgorithm** (str) - IKE协商过程中使用的加密算法 + - **IKEExchangeMode** (str) - IKE协商过程中使用的模式,可选“主动模式”与“野蛮模式”。IKEV2不使用该参数。 + - **IKELocalId** (str) - 本端标识。不填时默认使用之前的参数,结合IKEversion进行校验,IKEV2时不能为auto。 + - **IKEPreSharedKey** (str) - 预共享密钥 + - **IKERemoteId** (str) - 客户端标识。不填时默认使用之前的参数,结合IKEversion进行校验,IKEV2时不能为auto。 + - **IKESALifetime** (str) - IKE中SA的生存时间 + - **IKEVersion** (str) - 枚举值:"IKE V1","IKE V2" + - **IPSecAuthenticationAlgorithm** (str) - IPSec隧道中使用的认证算法 + - **IPSecCloseAction** (str) - IPSec隧道关闭后的处理动作,默认与原本一致,若原本为空,必传。枚举值:“none”,不处理(推荐为none,流量会自动触发隧道重建);“restart”重建 + - **IPSecEncryptionAlgorithm** (str) - IPSec隧道中使用的加密算法 + - **IPSecLocalSubnetIds** (list) - 指定VPN连接的本地子网的id,用逗号分隔 + - **IPSecPFSDhGroup** (str) - IPSec中的PFS是否开启 + - **IPSecProtocol** (str) - 使用的安全协议,ESP或AH + - **IPSecRemoteSubnets** (list) - 指定VPN连接的客户网段,用逗号分隔 + - **IPSecSALifetime** (str) - IPSec中SA的生存时间 + - **IPSecSALifetimeBytes** (str) - IPSec中SA的生存时间(以字节计) + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateVPNTunnelAttributeRequestSchema().dumps(d) + + resp = self.invoke("UpdateVPNTunnelAttribute", d, **kwargs) + return apis.UpdateVPNTunnelAttributeResponseSchema().loads(resp) diff --git a/ucloud/services/ipsecvpn/schemas/apis.py b/ucloud/services/ipsecvpn/schemas/apis.py index 901f8d10..624053b0 100644 --- a/ucloud/services/ipsecvpn/schemas/apis.py +++ b/ucloud/services/ipsecvpn/schemas/apis.py @@ -1,6 +1,5 @@ """ Code is generated by ucloud-model, DO NOT EDIT IT. """ - from ucloud.core.typesystem import schema, fields from ucloud.services.ipsecvpn.schemas import models @@ -8,6 +7,214 @@ """ +""" +API: CreateRemoteVPNGateway + +创建客户VPN网关 +""" + + +class CreateRemoteVPNGatewayRequestSchema(schema.RequestSchema): + """CreateRemoteVPNGateway - 创建客户VPN网关""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "RemoteVPNGatewayAddr": fields.Str( + required=True, dump_to="RemoteVPNGatewayAddr" + ), + "RemoteVPNGatewayName": fields.Str( + required=True, dump_to="RemoteVPNGatewayName" + ), + "Tag": fields.Str(required=False, dump_to="Tag"), + } + + +class CreateRemoteVPNGatewayResponseSchema(schema.ResponseSchema): + """CreateRemoteVPNGateway - 创建客户VPN网关""" + + fields = { + "RemoteVPNGatewayId": fields.Str( + required=False, load_from="RemoteVPNGatewayId" + ), + } + + +""" +API: CreateVPNGateway + +创建VPN网关 +""" + + +class CreateVPNGatewayRequestSchema(schema.RequestSchema): + """CreateVPNGateway - 创建VPN网关""" + + fields = { + "BusinessId": fields.Str(required=False, dump_to="BusinessId"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "EIPId": fields.Str(required=False, dump_to="EIPId"), + "Grade": fields.Str(required=True, dump_to="Grade"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + "VPNGatewayName": fields.Str(required=True, dump_to="VPNGatewayName"), + } + + +class CreateVPNGatewayResponseSchema(schema.ResponseSchema): + """CreateVPNGateway - 创建VPN网关""" + + fields = { + "VPNGatewayId": fields.Str(required=False, load_from="VPNGatewayId"), + } + + +""" +API: CreateVPNTunnel + +创建VPN隧道 +""" + + +class CreateVPNTunnelRequestSchema(schema.RequestSchema): + """CreateVPNTunnel - 创建VPN隧道""" + + fields = { + "IKEAuthenticationAlgorithm": fields.Str( + required=False, dump_to="IKEAuthenticationAlgorithm" + ), + "IKEDhGroup": fields.Str(required=False, dump_to="IKEDhGroup"), + "IKEEncryptionAlgorithm": fields.Str( + required=False, dump_to="IKEEncryptionAlgorithm" + ), + "IKEExchangeMode": fields.Str( + required=False, dump_to="IKEExchangeMode" + ), + "IKELocalId": fields.Str(required=False, dump_to="IKELocalId"), + "IKEPreSharedKey": fields.Str(required=True, dump_to="IKEPreSharedKey"), + "IKERemoteId": fields.Str(required=False, dump_to="IKERemoteId"), + "IKESALifetime": fields.Str(required=False, dump_to="IKESALifetime"), + "IKEVersion": fields.Str(required=True, dump_to="IKEVersion"), + "IPSecAuthenticationAlgorithm": fields.Str( + required=False, dump_to="IPSecAuthenticationAlgorithm" + ), + "IPSecCloseAction": fields.Str( + required=False, dump_to="IPSecCloseAction" + ), + "IPSecEncryptionAlgorithm": fields.Str( + required=False, dump_to="IPSecEncryptionAlgorithm" + ), + "IPSecLocalSubnetIds": fields.List(fields.Str()), + "IPSecPFSDhGroup": fields.Str( + required=False, dump_to="IPSecPFSDhGroup" + ), + "IPSecProtocol": fields.Str(required=False, dump_to="IPSecProtocol"), + "IPSecRemoteSubnets": fields.List(fields.Str()), + "IPSecSALifetime": fields.Str( + required=False, dump_to="IPSecSALifetime" + ), + "IPSecSALifetimeBytes": fields.Str( + required=False, dump_to="IPSecSALifetimeBytes" + ), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "RemoteVPNGatewayId": fields.Str( + required=True, dump_to="RemoteVPNGatewayId" + ), + "Tag": fields.Str(required=False, dump_to="Tag"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + "VPNGatewayId": fields.Str(required=True, dump_to="VPNGatewayId"), + "VPNTunnelName": fields.Str(required=True, dump_to="VPNTunnelName"), + } + + +class CreateVPNTunnelResponseSchema(schema.ResponseSchema): + """CreateVPNTunnel - 创建VPN隧道""" + + fields = { + "VPNTunnelId": fields.Str(required=False, load_from="VPNTunnelId"), + } + + +""" +API: DeleteRemoteVPNGateway + +删除客户VPN网关 +""" + + +class DeleteRemoteVPNGatewayRequestSchema(schema.RequestSchema): + """DeleteRemoteVPNGateway - 删除客户VPN网关""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "RemoteVPNGatewayId": fields.Str( + required=True, dump_to="RemoteVPNGatewayId" + ), + } + + +class DeleteRemoteVPNGatewayResponseSchema(schema.ResponseSchema): + """DeleteRemoteVPNGateway - 删除客户VPN网关""" + + fields = {} + + +""" +API: DeleteVPNGateway + +删除VPN网关 +""" + + +class DeleteVPNGatewayRequestSchema(schema.RequestSchema): + """DeleteVPNGateway - 删除VPN网关""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ReleaseEip": fields.Bool(required=False, dump_to="ReleaseEip"), + "VPNGatewayId": fields.Str(required=True, dump_to="VPNGatewayId"), + } + + +class DeleteVPNGatewayResponseSchema(schema.ResponseSchema): + """DeleteVPNGateway - 删除VPN网关""" + + fields = {} + + +""" +API: DeleteVPNTunnel + +删除VPN隧道 +""" + + +class DeleteVPNTunnelRequestSchema(schema.RequestSchema): + """DeleteVPNTunnel - 删除VPN隧道""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "VPNTunnelId": fields.Str(required=True, dump_to="VPNTunnelId"), + } + + +class DeleteVPNTunnelResponseSchema(schema.ResponseSchema): + """DeleteVPNTunnel - 删除VPN隧道""" + + fields = {} + + """ API: DescribeRemoteVPNGateway @@ -16,8 +223,7 @@ class DescribeRemoteVPNGatewayRequestSchema(schema.RequestSchema): - """ DescribeRemoteVPNGateway - 获取客户VPN网关信息 - """ + """DescribeRemoteVPNGateway - 获取客户VPN网关信息""" fields = { "Limit": fields.Int(required=False, dump_to="Limit"), @@ -30,8 +236,7 @@ class DescribeRemoteVPNGatewayRequestSchema(schema.RequestSchema): class DescribeRemoteVPNGatewayResponseSchema(schema.ResponseSchema): - """ DescribeRemoteVPNGateway - 获取客户VPN网关信息 - """ + """DescribeRemoteVPNGateway - 获取客户VPN网关信息""" fields = { "DataSet": fields.List( @@ -43,6 +248,40 @@ class DescribeRemoteVPNGatewayResponseSchema(schema.ResponseSchema): } +""" +API: DescribeVPNGateway + +获取VPN网关信息 +""" + + +class DescribeVPNGatewayRequestSchema(schema.RequestSchema): + """DescribeVPNGateway - 获取VPN网关信息""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + "VPNGatewayIds": fields.List(fields.Str()), + } + + +class DescribeVPNGatewayResponseSchema(schema.ResponseSchema): + """DescribeVPNGateway - 获取VPN网关信息""" + + fields = { + "DataSet": fields.List( + models.VPNGatewayDataSetSchema(), + required=False, + load_from="DataSet", + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + """ API: DescribeVPNTunnel @@ -51,8 +290,7 @@ class DescribeRemoteVPNGatewayResponseSchema(schema.ResponseSchema): class DescribeVPNTunnelRequestSchema(schema.RequestSchema): - """ DescribeVPNTunnel - 获取VPN隧道信息 - """ + """DescribeVPNTunnel - 获取VPN隧道信息""" fields = { "Limit": fields.Int(required=False, dump_to="Limit"), @@ -65,8 +303,7 @@ class DescribeVPNTunnelRequestSchema(schema.RequestSchema): class DescribeVPNTunnelResponseSchema(schema.ResponseSchema): - """ DescribeVPNTunnel - 获取VPN隧道信息 - """ + """DescribeVPNTunnel - 获取VPN隧道信息""" fields = { "DataSet": fields.List( @@ -74,3 +311,145 @@ class DescribeVPNTunnelResponseSchema(schema.ResponseSchema): ), "TotalCount": fields.Int(required=False, load_from="TotalCount"), } + + +""" +API: GetVPNGatewayPrice + +获取VPN价格 +""" + + +class GetVPNGatewayPriceRequestSchema(schema.RequestSchema): + """GetVPNGatewayPrice - 获取VPN价格""" + + fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "Grade": fields.Str(required=True, dump_to="Grade"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class GetVPNGatewayPriceResponseSchema(schema.ResponseSchema): + """GetVPNGatewayPrice - 获取VPN价格""" + + fields = { + "PriceSet": fields.List( + models.VPNGatewayPriceSetSchema(), + required=False, + load_from="PriceSet", + ), + } + + +""" +API: GetVPNGatewayUpgradePrice + +获取VPN网关规格改动价格 +""" + + +class GetVPNGatewayUpgradePriceRequestSchema(schema.RequestSchema): + """GetVPNGatewayUpgradePrice - 获取VPN网关规格改动价格""" + + fields = { + "Grade": fields.Str(required=True, dump_to="Grade"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "VPNGatewayId": fields.Str(required=True, dump_to="VPNGatewayId"), + } + + +class GetVPNGatewayUpgradePriceResponseSchema(schema.ResponseSchema): + """GetVPNGatewayUpgradePrice - 获取VPN网关规格改动价格""" + + fields = { + "Price": fields.Float(required=False, load_from="Price"), + } + + +""" +API: UpdateVPNGateway + +更改VPN网关规格 +""" + + +class UpdateVPNGatewayRequestSchema(schema.RequestSchema): + """UpdateVPNGateway - 更改VPN网关规格""" + + fields = { + "Grade": fields.Str(required=True, dump_to="Grade"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "VPNGatewayId": fields.Str(required=True, dump_to="VPNGatewayId"), + } + + +class UpdateVPNGatewayResponseSchema(schema.ResponseSchema): + """UpdateVPNGateway - 更改VPN网关规格""" + + fields = {} + + +""" +API: UpdateVPNTunnelAttribute + +更新VPN隧道属性 +""" + + +class UpdateVPNTunnelAttributeRequestSchema(schema.RequestSchema): + """UpdateVPNTunnelAttribute - 更新VPN隧道属性""" + + fields = { + "IKEAuthenticationAlgorithm": fields.Str( + required=False, dump_to="IKEAuthenticationAlgorithm" + ), + "IKEDhGroup": fields.Str(required=False, dump_to="IKEDhGroup"), + "IKEEncryptionAlgorithm": fields.Str( + required=False, dump_to="IKEEncryptionAlgorithm" + ), + "IKEExchangeMode": fields.Str( + required=False, dump_to="IKEExchangeMode" + ), + "IKELocalId": fields.Str(required=False, dump_to="IKELocalId"), + "IKEPreSharedKey": fields.Str( + required=False, dump_to="IKEPreSharedKey" + ), + "IKERemoteId": fields.Str(required=False, dump_to="IKERemoteId"), + "IKESALifetime": fields.Str(required=False, dump_to="IKESALifetime"), + "IKEVersion": fields.Str(required=False, dump_to="IKEVersion"), + "IPSecAuthenticationAlgorithm": fields.Str( + required=False, dump_to="IPSecAuthenticationAlgorithm" + ), + "IPSecCloseAction": fields.Str( + required=False, dump_to="IPSecCloseAction" + ), + "IPSecEncryptionAlgorithm": fields.Str( + required=False, dump_to="IPSecEncryptionAlgorithm" + ), + "IPSecLocalSubnetIds": fields.List(fields.Str()), + "IPSecPFSDhGroup": fields.Str( + required=False, dump_to="IPSecPFSDhGroup" + ), + "IPSecProtocol": fields.Str(required=False, dump_to="IPSecProtocol"), + "IPSecRemoteSubnets": fields.List(fields.Str()), + "IPSecSALifetime": fields.Str( + required=False, dump_to="IPSecSALifetime" + ), + "IPSecSALifetimeBytes": fields.Str( + required=False, dump_to="IPSecSALifetimeBytes" + ), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "VPNTunnelId": fields.Str(required=True, dump_to="VPNTunnelId"), + } + + +class UpdateVPNTunnelAttributeResponseSchema(schema.ResponseSchema): + """UpdateVPNTunnelAttribute - 更新VPN隧道属性""" + + fields = {} diff --git a/ucloud/services/ipsecvpn/schemas/models.py b/ucloud/services/ipsecvpn/schemas/models.py index 15093b9a..66d3d68c 100644 --- a/ucloud/services/ipsecvpn/schemas/models.py +++ b/ucloud/services/ipsecvpn/schemas/models.py @@ -4,11 +4,12 @@ class RemoteVPNGatewayDataSetSchema(schema.ResponseSchema): - """ RemoteVPNGatewayDataSet - DescribeRemoteVPNGateway返回参数 - """ + """RemoteVPNGatewayDataSet - DescribeRemoteVPNGateway返回参数""" fields = { - "ActiveTunnels": fields.Str(required=False, load_from="ActiveTunnels"), + "ActiveTunnels": fields.Str( + required=False, load_from="ActiveTunnels" + ), # Deprecated, will be removed at 1.0 "CreateTime": fields.Int(required=False, load_from="CreateTime"), "Remark": fields.Str(required=False, load_from="Remark"), "RemoteVPNGatewayAddr": fields.Str( @@ -25,35 +26,31 @@ class RemoteVPNGatewayDataSetSchema(schema.ResponseSchema): } -class IPSecDataSchema(schema.ResponseSchema): - """ IPSecData - IPSec参数 - """ +class VPNGatewayDataSetSchema(schema.ResponseSchema): + """VPNGatewayDataSet - DescribeVPNGateway返回参数""" fields = { - "IPSecAuthenticationAlgorithm": fields.Str( - required=False, load_from="IPSecAuthenticationAlgorithm" - ), - "IPSecEncryptionAlgorithm": fields.Str( - required=False, load_from="IPSecEncryptionAlgorithm" - ), - "IPSecLocalSubnetIds": fields.List(fields.Str()), - "IPSecPFSDhGroup": fields.Str( - required=False, load_from="IPSecPFSDhGroup" - ), - "IPSecProtocol": fields.Str(required=False, load_from="IPSecProtocol"), - "IPSecRemoteSubnets": fields.List(fields.Str()), - "IPSecSALifetime": fields.Str( - required=False, load_from="IPSecSALifetime" - ), - "IPSecSALifetimeBytes": fields.Str( - required=False, load_from="IPSecSALifetimeBytes" + "AutoRenew": fields.Str(required=False, load_from="AutoRenew"), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "EIP": fields.Str(required=False, load_from="EIP"), + "EIPId": fields.Str(required=False, load_from="EIPId"), + "EIPType": fields.Str(required=False, load_from="EIPType"), + "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "Grade": fields.Str(required=False, load_from="Grade"), + "Remark": fields.Str(required=False, load_from="Remark"), + "Tag": fields.Str(required=False, load_from="Tag"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + "VPCName": fields.Str(required=False, load_from="VPCName"), + "VPNGatewayId": fields.Str(required=False, load_from="VPNGatewayId"), + "VPNGatewayName": fields.Str( + required=False, load_from="VPNGatewayName" ), } class IKEDataSchema(schema.ResponseSchema): - """ IKEData - IKE信息 - """ + """IKEData - IKE信息""" fields = { "IKEAuthenticationAlgorithm": fields.Str( @@ -76,9 +73,33 @@ class IKEDataSchema(schema.ResponseSchema): } +class IPSecDataSchema(schema.ResponseSchema): + """IPSecData - IPSec参数""" + + fields = { + "IPSecAuthenticationAlgorithm": fields.Str( + required=False, load_from="IPSecAuthenticationAlgorithm" + ), + "IPSecEncryptionAlgorithm": fields.Str( + required=False, load_from="IPSecEncryptionAlgorithm" + ), + "IPSecLocalSubnetIds": fields.List(fields.Str()), + "IPSecPFSDhGroup": fields.Str( + required=False, load_from="IPSecPFSDhGroup" + ), + "IPSecProtocol": fields.Str(required=False, load_from="IPSecProtocol"), + "IPSecRemoteSubnets": fields.List(fields.Str()), + "IPSecSALifetime": fields.Str( + required=False, load_from="IPSecSALifetime" + ), + "IPSecSALifetimeBytes": fields.Str( + required=False, load_from="IPSecSALifetimeBytes" + ), + } + + class VPNTunnelDataSetSchema(schema.ResponseSchema): - """ VPNTunnelDataSet - DescribeVPNTunnel信息 - """ + """VPNTunnelDataSet - DescribeVPNTunnel信息""" fields = { "CreateTime": fields.Int(required=False, load_from="CreateTime"), @@ -101,3 +122,13 @@ class VPNTunnelDataSetSchema(schema.ResponseSchema): "VPNTunnelId": fields.Str(required=False, load_from="VPNTunnelId"), "VPNTunnelName": fields.Str(required=False, load_from="VPNTunnelName"), } + + +class VPNGatewayPriceSetSchema(schema.ResponseSchema): + """VPNGatewayPriceSet - VPN网关的价格信息""" + + fields = { + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "Price": fields.Float(required=False, load_from="Price"), + "PurchaseValue": fields.Int(required=False, load_from="PurchaseValue"), + } diff --git a/ucloud/services/ipv6gw/__init__.py b/ucloud/services/ipv6gw/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/ipv6gw/client.py b/ucloud/services/ipv6gw/client.py new file mode 100644 index 00000000..93a68591 --- /dev/null +++ b/ucloud/services/ipv6gw/client.py @@ -0,0 +1,270 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.ipv6gw.schemas import apis + + +class ipv6gwClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(ipv6gwClient, self).__init__( + config, transport, middleware, logger + ) + + def allocate_ipv_6internet_bandwidth( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AllocateIpv6InternetBandwidth - 分配ipv6公网带宽 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Bandwidth** (int) - (Required) 出向带宽峰值。带宽值范围[1, 2000] + - **Ipv6AddressId** (str) - (Required) Ipv6地址ID + - **ChargeType** (str) - 付费方式;默认值:"Month";枚举值:"Dynamic" -> 按时付费,"Month" -> 月付,"Year" ->年付,"Day" -> 天付 + - **Ipv6GatewayId** (str) - ipv6网关ID;与VPCId二选一必填 + - **Name** (str) - 资源名称;默认值:"Ipv6InternetBandwidth" + - **PayMode** (str) - 付费模式;默认值:"Bandwidth";枚举值:"Bandwidth" -> 带宽计费 + - **Quantity** (int) - 购买数量;默认值:1。 月付时,此参数传0,代表了购买至月末。 + - **Remark** (str) - 备注 + - **Tag** (str) - 业务组名称;默认值:"Default" + - **VPCId** (str) - vpcId;与Ipv6GatewayId二选一必填 + + **Response** + + - **InternetBandwidthId** (str) - 开通公网带宽后,对应的公网带宽实例 ID。 + - **Ipv6Address** (str) - ipv6地址 + - **Ipv6AddressId** (str) - ipv6地址ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.AllocateIpv6InternetBandwidthRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AllocateIpv6InternetBandwidth", d, **kwargs) + return apis.AllocateIpv6InternetBandwidthResponseSchema().loads(resp) + + def create_ipv_6gateway( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateIpv6Gateway - 创建ipv6网关 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **VPCId** (str) - (Required) ipv6网关所属的VPCID + - **Name** (str) - IPv6 网关的名称 默认值 Ipv6Gateway + - **Remark** (str) - IPv6 网关的备注信息。 + - **Tag** (str) - 业务组名称;默认值:"Default" + + **Response** + + - **Ipv6GatewayId** (str) - ipv6网关ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateIpv6GatewayRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateIpv6Gateway", d, **kwargs) + return apis.CreateIpv6GatewayResponseSchema().loads(resp) + + def delete_ipv_6gateway( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteIpv6Gateway - 删除ipv6网关 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Ipv6GatewayId** (str) - (Required) ipv6网关ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteIpv6GatewayRequestSchema().dumps(d) + + resp = self.invoke("DeleteIpv6Gateway", d, **kwargs) + return apis.DeleteIpv6GatewayResponseSchema().loads(resp) + + def delete_ipv_6internet_bandwidth( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteIpv6InternetBandwidth - 删除ipv6公网带宽 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InternetBandwidthId** (str) - ipv6公网带宽ID;与Ipv6AddressId二选一必填 + - **Ipv6AddressId** (str) - ipv6 ID;与InternetBandwidthId二选一必填 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteIpv6InternetBandwidthRequestSchema().dumps(d) + + resp = self.invoke("DeleteIpv6InternetBandwidth", d, **kwargs) + return apis.DeleteIpv6InternetBandwidthResponseSchema().loads(resp) + + def describe_ipv_6gateway_attribute( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeIpv6GatewayAttribute - 查看指定ipv6网关详情, 该接口仅返回能开启公网带宽的ipv6信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Ipv6GatewayId** (str) - (Required) ipv6网关ID + - **Limit** (int) - 返回数据长度,默认值为20,最大值为100 + - **ObjectType** (str) - ipv6地址绑定资源类型。传空则返回不按资源类型过滤。枚举值:"uhost" -> 云主机; "uni" -> 虚拟网卡; "alb" -> 应用型负载均衡; "nlb" -> 网络型负载均衡 + - **Offset** (int) - 列表起始位置偏移量,默认值为0 + + **Response** + + - **CreateTime** (int) - 创建时间 + - **Ipv6AddressInfos** (list) - 见 **IPv6AddressInfo** 模型定义 + - **Ipv6GatewayId** (str) - ipv6网关ID + - **Name** (str) - 名称 + - **Remark** (str) - 备注 + - **Tag** (str) - 业务组 + - **TotalCount** (int) - 总数 + - **VPCId** (str) - vpc ID + + **Response Model** + + **IPv6AddressInfo** + - **AutoRenew** (str) - 是否自动续费。枚举值:"Yes" -> 是; "No" -> 否; "UnKnown" -> 未知 + - **Bandwidth** (int) - 带宽值 + - **ChargeType** (str) - 收费类型 + - **Expire** (str) - 是否过期。 枚举值: "Expired" -> 过期; "UnExpired" -> 未过期; "UnKnown" -> 未知 + - **ExpireTime** (int) - 过期时间 + - **InternetBandwidthId** (str) - ipv6外网带宽Id + - **Ipv6Address** (str) - ipv6地址 + - **Ipv6AddressId** (str) - ipv6地址ID + - **ObjectId** (str) - 绑定的资源ID + - **ObjectName** (str) - 绑定对象名称 + - **ObjectType** (str) - 绑定对象资源类型 + - **OperatorName** (str) - 线路名称。枚举值: "ChinaMobile" -> 移动; "BGP" -> BGP; "Unicom" -> 联通; "Telecom" -> 电信 + - **PayMode** (str) - 付费模式。枚举值:"Bandwidth" -> 带宽计费 + - **Status** (str) - 状态。 枚举值:"Public" -> 已开启公网带宽; "Normal" -> 未开启公网带宽 + - **SubnetId** (str) - 子网ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeIpv6GatewayAttributeRequestSchema().dumps(d) + + resp = self.invoke("DescribeIpv6GatewayAttribute", d, **kwargs) + return apis.DescribeIpv6GatewayAttributeResponseSchema().loads(resp) + + def describe_ipv_6gateways( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeIpv6Gateways - ipv6网关列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Ipv6GatewayIds** (list) - ipv6网关ID列表,最大长度为20。指定Ipv6GatewayIds查询时,将忽略其他条件 + - **Limit** (int) - 返回数据长度,默认值为20,最大值为100 + - **Offset** (int) - 列表起始位置偏移量,默认值为0 + - **VPCId** (str) - vpc ID + + **Response** + + - **Ipv6GatewayInfos** (list) - 见 **IPv6GateWayInfo** 模型定义 + - **TotalCount** (int) - Ipv6Gateway总数。指定Ipv6GatewayIds / VPCId时,返回数量受限 + + **Response Model** + + **IPv6GateWayInfo** + - **CreateTime** (int) - 创建时间 + - **Ipv6GatewayId** (str) - ipv6 网关 ID + - **Name** (str) - 名称 + - **Remark** (str) - 备注 + - **Tag** (str) - 业务组 + - **VPCId** (str) - vpc ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeIpv6GatewaysRequestSchema().dumps(d) + + resp = self.invoke("DescribeIpv6Gateways", d, **kwargs) + return apis.DescribeIpv6GatewaysResponseSchema().loads(resp) + + def modify_ipv_6internet_bandwidth( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyIpv6InternetBandwidth - 修改ipv6公网带宽值 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Bandwidth** (int) - 要修改为的出向带宽峰值。带宽值范围[1, 2000] + - **InternetBandwidthId** (str) - ipv6公网带宽Id;与Ipv6AddressId二选一必填 + - **Ipv6AddressId** (str) - Ipv6地址 id;与InternetBandwidthId二选一必填 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyIpv6InternetBandwidthRequestSchema().dumps(d) + + resp = self.invoke("ModifyIpv6InternetBandwidth", d, **kwargs) + return apis.ModifyIpv6InternetBandwidthResponseSchema().loads(resp) diff --git a/ucloud/services/ipv6gw/schemas/__init__.py b/ucloud/services/ipv6gw/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/ipv6gw/schemas/apis.py b/ucloud/services/ipv6gw/schemas/apis.py new file mode 100644 index 00000000..b8adbf71 --- /dev/null +++ b/ucloud/services/ipv6gw/schemas/apis.py @@ -0,0 +1,221 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.ipv6gw.schemas import models + +""" ipv6gw API Schema +""" + + +""" +API: AllocateIpv6InternetBandwidth + +分配ipv6公网带宽 +""" + + +class AllocateIpv6InternetBandwidthRequestSchema(schema.RequestSchema): + """AllocateIpv6InternetBandwidth - 分配ipv6公网带宽""" + + fields = { + "Bandwidth": fields.Int(required=True, dump_to="Bandwidth"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "Ipv6AddressId": fields.Str(required=True, dump_to="Ipv6AddressId"), + "Ipv6GatewayId": fields.Str(required=False, dump_to="Ipv6GatewayId"), + "Name": fields.Str(required=False, dump_to="Name"), + "PayMode": fields.Str(required=False, dump_to="PayMode"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + } + + +class AllocateIpv6InternetBandwidthResponseSchema(schema.ResponseSchema): + """AllocateIpv6InternetBandwidth - 分配ipv6公网带宽""" + + fields = { + "InternetBandwidthId": fields.Str( + required=True, load_from="InternetBandwidthId" + ), + "Ipv6Address": fields.Str(required=False, load_from="Ipv6Address"), + "Ipv6AddressId": fields.Str(required=False, load_from="Ipv6AddressId"), + } + + +""" +API: CreateIpv6Gateway + +创建ipv6网关 +""" + + +class CreateIpv6GatewayRequestSchema(schema.RequestSchema): + """CreateIpv6Gateway - 创建ipv6网关""" + + fields = { + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + } + + +class CreateIpv6GatewayResponseSchema(schema.ResponseSchema): + """CreateIpv6Gateway - 创建ipv6网关""" + + fields = { + "Ipv6GatewayId": fields.Str(required=True, load_from="Ipv6GatewayId"), + } + + +""" +API: DeleteIpv6Gateway + +删除ipv6网关 +""" + + +class DeleteIpv6GatewayRequestSchema(schema.RequestSchema): + """DeleteIpv6Gateway - 删除ipv6网关""" + + fields = { + "Ipv6GatewayId": fields.Str(required=True, dump_to="Ipv6GatewayId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DeleteIpv6GatewayResponseSchema(schema.ResponseSchema): + """DeleteIpv6Gateway - 删除ipv6网关""" + + fields = {} + + +""" +API: DeleteIpv6InternetBandwidth + +删除ipv6公网带宽 +""" + + +class DeleteIpv6InternetBandwidthRequestSchema(schema.RequestSchema): + """DeleteIpv6InternetBandwidth - 删除ipv6公网带宽""" + + fields = { + "InternetBandwidthId": fields.Str( + required=False, dump_to="InternetBandwidthId" + ), + "Ipv6AddressId": fields.Str(required=False, dump_to="Ipv6AddressId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DeleteIpv6InternetBandwidthResponseSchema(schema.ResponseSchema): + """DeleteIpv6InternetBandwidth - 删除ipv6公网带宽""" + + fields = {} + + +""" +API: DescribeIpv6GatewayAttribute + +查看指定ipv6网关详情, 该接口仅返回能开启公网带宽的ipv6信息 +""" + + +class DescribeIpv6GatewayAttributeRequestSchema(schema.RequestSchema): + """DescribeIpv6GatewayAttribute - 查看指定ipv6网关详情, 该接口仅返回能开启公网带宽的ipv6信息""" + + fields = { + "Ipv6GatewayId": fields.Str(required=True, dump_to="Ipv6GatewayId"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "ObjectType": fields.Str(required=False, dump_to="ObjectType"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DescribeIpv6GatewayAttributeResponseSchema(schema.ResponseSchema): + """DescribeIpv6GatewayAttribute - 查看指定ipv6网关详情, 该接口仅返回能开启公网带宽的ipv6信息""" + + fields = { + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "Ipv6AddressInfos": fields.List( + models.IPv6AddressInfoSchema(), + required=False, + load_from="Ipv6AddressInfos", + ), + "Ipv6GatewayId": fields.Str(required=False, load_from="Ipv6GatewayId"), + "Name": fields.Str(required=False, load_from="Name"), + "Remark": fields.Str(required=False, load_from="Remark"), + "Tag": fields.Str(required=False, load_from="Tag"), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + } + + +""" +API: DescribeIpv6Gateways + +ipv6网关列表 +""" + + +class DescribeIpv6GatewaysRequestSchema(schema.RequestSchema): + """DescribeIpv6Gateways - ipv6网关列表""" + + fields = { + "Ipv6GatewayIds": fields.List(fields.Str()), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + } + + +class DescribeIpv6GatewaysResponseSchema(schema.ResponseSchema): + """DescribeIpv6Gateways - ipv6网关列表""" + + fields = { + "Ipv6GatewayInfos": fields.List( + models.IPv6GateWayInfoSchema(), + required=False, + load_from="Ipv6GatewayInfos", + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: ModifyIpv6InternetBandwidth + +修改ipv6公网带宽值 +""" + + +class ModifyIpv6InternetBandwidthRequestSchema(schema.RequestSchema): + """ModifyIpv6InternetBandwidth - 修改ipv6公网带宽值""" + + fields = { + "Bandwidth": fields.Int(required=False, dump_to="Bandwidth"), + "InternetBandwidthId": fields.Str( + required=False, dump_to="InternetBandwidthId" + ), + "Ipv6AddressId": fields.Str(required=False, dump_to="Ipv6AddressId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class ModifyIpv6InternetBandwidthResponseSchema(schema.ResponseSchema): + """ModifyIpv6InternetBandwidth - 修改ipv6公网带宽值""" + + fields = {} diff --git a/ucloud/services/ipv6gw/schemas/models.py b/ucloud/services/ipv6gw/schemas/models.py new file mode 100644 index 00000000..1e502248 --- /dev/null +++ b/ucloud/services/ipv6gw/schemas/models.py @@ -0,0 +1,40 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class IPv6AddressInfoSchema(schema.ResponseSchema): + """IPv6AddressInfo - ipv6地址信息""" + + fields = { + "AutoRenew": fields.Str(required=False, load_from="AutoRenew"), + "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "Expire": fields.Str(required=False, load_from="Expire"), + "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "InternetBandwidthId": fields.Str( + required=False, load_from="InternetBandwidthId" + ), + "Ipv6Address": fields.Str(required=False, load_from="Ipv6Address"), + "Ipv6AddressId": fields.Str(required=False, load_from="Ipv6AddressId"), + "ObjectId": fields.Str(required=False, load_from="ObjectId"), + "ObjectName": fields.Str(required=False, load_from="ObjectName"), + "ObjectType": fields.Str(required=False, load_from="ObjectType"), + "OperatorName": fields.Str(required=False, load_from="OperatorName"), + "PayMode": fields.Str(required=False, load_from="PayMode"), + "Status": fields.Str(required=False, load_from="Status"), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + } + + +class IPv6GateWayInfoSchema(schema.ResponseSchema): + """IPv6GateWayInfo - ipv6 网关信息""" + + fields = { + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "Ipv6GatewayId": fields.Str(required=False, load_from="Ipv6GatewayId"), + "Name": fields.Str(required=False, load_from="Name"), + "Remark": fields.Str(required=False, load_from="Remark"), + "Tag": fields.Str(required=False, load_from="Tag"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + } diff --git a/ucloud/services/isms/__init__.py b/ucloud/services/isms/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/isms/client.py b/ucloud/services/isms/client.py new file mode 100644 index 00000000..43ef2e18 --- /dev/null +++ b/ucloud/services/isms/client.py @@ -0,0 +1,330 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.isms.schemas import apis + + +class ISMSClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(ISMSClient, self).__init__(config, transport, middleware, logger) + + def create_isms_signature( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateISMSSignature - 调用接口CreateISMSSignature申请视频短信签名 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID,不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CertificateType** (int) - (Required) 签名的资质证明文件类型,需与签名类型保持一致,说明如下:0-三证合一/企业营业执照/组织机构代码证书/社会信用代码证书;1-应用商店后台开发者管理截图;2-备案服务商的备案成功截图(含域名,网站名称,备案号);3-公众号或小程序的管理界面截图;4-商标注册证书;5-组织机构代码证书、社会信用代码证书; + - **Description** (str) - (Required) 短信签名申请原因 + - **File** (str) - (Required) 短信签名的资质证明文件,需先进行base64编码格式转换,此处填写转换后的字符串。文件大小不超过4 MB + - **SigContent** (str) - (Required) 短信签名内容;长度为2-12个字符, 可包含中文、数字和符号;无需填写【】或[],系统会自动添加 + - **SigPurpose** (int) - (Required) 签名用途,0-自用,1-他用; + - **SigType** (int) - (Required) 签名类型,说明如下:0-公司或企业的全称或简称;1-App应用的全称或简称;2-工信部备案网站的全称或简称;3-公众号或小程序的全称或简称;4-商标名的全称或简称;5-政府/机关事业单位/其他单位的全称或简称; + - **ProxyFile** (str) - 短信签名授权委托文件,需先进行base64编码格式转换,此处填写转换后的字符串。文件大小不超过4 MB;当您是代理并使用第三方的签名时(也即SigPurpose为1-他用),该项为必填项; + + **Response** + + - **Message** (str) - 返回状态码描述,如果操作成功,默认返回为空 + - **SigId** (str) - 短信签名ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.CreateISMSSignatureRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateISMSSignature", d, **kwargs) + return apis.CreateISMSSignatureResponseSchema().loads(resp) + + def create_isms_template( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateISMSTemplate - 申请视频短信模板 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Content** (str) - (Required) 视频短信模板内容。json数组的字符串格式。如:[{name:"0.txt",type:"txt",content:"北京是一座美丽的城市,我爱北京!",index:0},{name:"1.jpg",type:"jpg",content:"jpg文件字节的base64编码字符串",index:1},{name:”2.mp4”,type:"mp4",content:"mp4文件字节的base64编码字符串",index:2}]。name: 文件名,name中不能出现中文,必须要带上和type相同的后缀;type:文件类型,不能为空,文本为txt,图片为jpg、gif或png,音频为mp3,视频为mp4;content:文件内容,由文本、图片、音频、视频组成,文本使用txt文件,图片使用 jpg、gif、png 格式,音频使用 mp3 格式,视频使用mp4(视频只允许一个),文本、图片、音频、视频文件合计大小不可超过2M;index: 在视频短信中的位置。从0开始。 + - **MsgSignature** (str) - (Required) 视频短信签名 + - **MsgTitle** (str) - (Required) 视频短信标题 + - **Remark** (str) - (Required) 备注 + - **TemplateName** (str) - (Required) 视频短信模板名称 + - **UnsubscribeInfo** (str) - (Required) 退订信息,如:“回T退订” + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - API接口调用出错时表示错误信息 + - **ReqUuid** (str) - 本次接口调用请求Id,用于问题排查。 + - **TemplateId** (str) - 申请的模板Id。 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateISMSTemplateRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateISMSTemplate", d, **kwargs) + return apis.CreateISMSTemplateResponseSchema().loads(resp) + + def delete_isms_signature( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteISMSSignature - 调用接口DeleteISMSSignature删除视频短信签名 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID,不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **SigIds** (list) - (Required) 签名ID,支持以数组的方式,举例,以SigIds.0、SigIds.1...SigIds.N方式传入 + + **Response** + + - **Message** (str) - 返回状态码描述,如果操作成功,默认返回为空 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DeleteISMSSignatureRequestSchema().dumps(d) + + resp = self.invoke("DeleteISMSSignature", d, **kwargs) + return apis.DeleteISMSSignatureResponseSchema().loads(resp) + + def delete_isms_template( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteISMSTemplate - 调用接口DeleteISMSTemplate删除视频短信模板 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **TemplateIds** (list) - (Required) 模板ID,支持以数组的方式,举例,以TemplateIds.0、TemplateIds.1...TemplateIds.N方式传入 + + **Response** + + - **Message** (str) - 返回状态码描述,如果操作成功,默认返回为空 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteISMSTemplateRequestSchema().dumps(d) + + resp = self.invoke("DeleteISMSTemplate", d, **kwargs) + return apis.DeleteISMSTemplateResponseSchema().loads(resp) + + def get_isms_send_receipt( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetISMSSendReceipt - 获取视频短信发送记录的状态回执 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **TaskIdSet** (list) - (Required) 发送记录TaskId集合。调用SendUSMSVideoMessage时返回的TaskId的集合。以TaskIdSet.0、TaskIdSet.1...TaskIdSet.N的形式传入。每次请求最多支持100个 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Data** (list) - 见 **ReceiptPerTask** 模型定义 + - **Message** (str) - 错误信息 + - **ReqUuid** (str) - 本次请求uuid + + **Response Model** + + **ReceiptPerTask** + - **ReceiptSet** (list) - 见 **ReceiptPerPhone** 模型定义 + - **TaskId** (str) - 发送短信时返回的TaskId + + + **ReceiptPerPhone** + - **Phone** (str) - 手机号码 + - **ReceiptCode** (str) - 回执码 + - **ReceiptDesc** (str) - 回执结果描述 + - **ReceiptResult** (str) - 回执结果(发送成功、发送失败、状态未知) + - **ReceiptTime** (int) - 回执返回时间 + - **SessionId** (str) - SessionId + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetISMSSendReceiptRequestSchema().dumps(d) + + resp = self.invoke("GetISMSSendReceipt", d, **kwargs) + return apis.GetISMSSendReceiptResponseSchema().loads(resp) + + def query_isms_signature( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """QueryISMSSignature - 调用接口QueryISMSSignature查询视频短信签名申请状态 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **SigId** (str) - (Required) 已申请的短信签名ID(短信签名申请时的工单ID);签名ID和签名至少需填写1项; + - **SigContent** (str) - 签名内容;签名ID和签名至少需填写1项; + + **Response** + + - **Data** (dict) - 见 **OutSignature** 模型定义 + - **Message** (str) - 发生错误时,表示具体错误描述 + + **Response Model** + + **OutSignature** + - **ErrDesc** (str) - 短信签名未通过审核原因 + - **SigContent** (str) - 短信签名内容 + - **SigId** (str) - 短信签名ID + - **Status** (int) - 签名状态,0-待审核 1-审核中 2-审核通过 3-审核未通过 4-被禁用 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.QueryISMSSignatureRequestSchema().dumps(d) + + resp = self.invoke("QueryISMSSignature", d, **kwargs) + return apis.QueryISMSSignatureResponseSchema().loads(resp) + + def query_isms_template( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """QueryISMSTemplate - 查询模板状态信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **TemplateId** (str) - (Required) 模板Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Data** (dict) - 见 **OutTemplate** 模型定义 + - **Message** (str) - 错误信息 + - **ReqUuid** (str) - 本次请求uuid + + **Response Model** + + **OutTemplate** + - **CreateTime** (int) - 创建时间,时间戳格式1629357838 + - **ExpireTime** (int) - 截止有效时间,时间戳格式1629357838 + - **Purpose** (int) - 视频短信类型(3-会员营销) + - **Remark** (str) - 备注信息 + - **StatusDesc** (str) - 状态描述。json格式,给出运营商维度的审核状态信息,示例:{"telecom_status":2,"telecom_desc":"审核通过","unicom_status":2,"unicom_desc":"审核通过","mobile_status":2,"mobile_desc":"审核通过"}。状态枚举值:0-创建模板时未向该运营商报备 1->审核中 2->审核通过 3->审核未通过 4->禁用 7->过期 11->待审核 + - **TemplateId** (str) - 模板ID + - **TemplateName** (str) - 模板名称 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.QueryISMSTemplateRequestSchema().dumps(d) + + resp = self.invoke("QueryISMSTemplate", d, **kwargs) + return apis.QueryISMSTemplateResponseSchema().loads(resp) + + def send_isms_message( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """SendISMSMessage - 发送视频短信 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **PhoneSet** (list) - (Required) 手机号码列表。暂时只支持中国大陆号码。若号码中带区号,需要将区号使用小括号包含,放在号码前面。如: (86)1851623xxxx + - **TemplateId** (str) - (Required) 视频短信模板Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 错误信息 + - **ReqUuid** (str) - 本次请求uuid + - **TaskId** (str) - 本次调用TaskId,使用该字段查询回执信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.SendISMSMessageRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("SendISMSMessage", d, **kwargs) + return apis.SendISMSMessageResponseSchema().loads(resp) + + def update_isms_signature( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateISMSSignature - 调用接口UpdateISMSSignature修改未通过审核的视频短信签名,并重新提交审核 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID,不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **SigContent** (str) - (Required) 新的短信签名内容;长度为2-12个字符, 可包含中文、数字和符号;无需填写【】或[],系统会自动添加 + - **SigId** (str) - (Required) 签名ID,支持以数组的方式,举例,以SigIds.0、SigIds.1...SigIds.N方式传入 + - **SigPurpose** (int) - (Required) 签名用途,0-自用,1-他用; + - **SigType** (int) - (Required) 签名类型,说明如下:0-公司或企业的全称或简称;1-App应用的全称或简称;2-工信部备案网站的全称或简称;3-公众号或小程序的全称或简称;4-商标名的全称或简称;5-政府/机关事业单位/其他单位的全称或简称; + - **CertificateType** (int) - 签名的资质证明文件类型,需与签名类型保持一致,说明如下:0-三证合一/企业营业执照/组织机构代码证书/社会信用代码证书;1-应用商店后台开发者管理截图;2-备案服务商的备案成功截图(含域名,网站名称,备案号);3-公众号或小程序的管理界面截图;4-商标注册证书;5-组织机构代码证书、社会信用代码证书; + - **Document** (str) - 短信签名的资质证明文件URL,若未更改审核材料,则该处使用已上传审核材料的URL链接,否则使用File参数 + - **File** (str) - 短信签名的资质证明文件内容,需先进行base64编码格式转换,此处填写转换后的字符串。文件大小不超过4 MB。内容格式如下: [file type];[code type],[base64] 如:image/jpeg;base64,5YaF5a65 + - **ProxyDoc** (str) - 短信签名授权委托文件URL,若未更改授权委托文件,则该处填写已上传的授权委托文件的URL链接,否则使用ProxyFile参数 + - **ProxyFile** (str) - 短信签名授权委托文件内容,需先进行base64编码格式转换,此处填写转换后的字符串。文件大小不超过4 MB;当您是代理并使用第三方的签名时(也即SigPurpose为1-他用),该项为必填项;格式和File类似。 + + **Response** + + - **Message** (str) - 返回状态码描述,如果操作成功,默认返回为空 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.UpdateISMSSignatureRequestSchema().dumps(d) + + resp = self.invoke("UpdateISMSSignature", d, **kwargs) + return apis.UpdateISMSSignatureResponseSchema().loads(resp) diff --git a/ucloud/services/isms/schemas/__init__.py b/ucloud/services/isms/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/isms/schemas/apis.py b/ucloud/services/isms/schemas/apis.py new file mode 100644 index 00000000..0184babe --- /dev/null +++ b/ucloud/services/isms/schemas/apis.py @@ -0,0 +1,272 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.isms.schemas import models + +""" ISMS API Schema +""" + + +""" +API: CreateISMSSignature + +调用接口CreateISMSSignature申请视频短信签名 +""" + + +class CreateISMSSignatureRequestSchema(schema.RequestSchema): + """CreateISMSSignature - 调用接口CreateISMSSignature申请视频短信签名""" + + fields = { + "CertificateType": fields.Int(required=True, dump_to="CertificateType"), + "Description": fields.Str(required=True, dump_to="Description"), + "File": fields.Str(required=True, dump_to="File"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "ProxyFile": fields.Str(required=False, dump_to="ProxyFile"), + "SigContent": fields.Str(required=True, dump_to="SigContent"), + "SigPurpose": fields.Int(required=True, dump_to="SigPurpose"), + "SigType": fields.Int(required=True, dump_to="SigType"), + } + + +class CreateISMSSignatureResponseSchema(schema.ResponseSchema): + """CreateISMSSignature - 调用接口CreateISMSSignature申请视频短信签名""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "SigId": fields.Str(required=False, load_from="SigId"), + } + + +""" +API: CreateISMSTemplate + +申请视频短信模板 +""" + + +class CreateISMSTemplateRequestSchema(schema.RequestSchema): + """CreateISMSTemplate - 申请视频短信模板""" + + fields = { + "Content": fields.Str(required=True, dump_to="Content"), + "MsgSignature": fields.Str(required=True, dump_to="MsgSignature"), + "MsgTitle": fields.Str(required=True, dump_to="MsgTitle"), + "NetworkOperator": fields.Str( + required=False, dump_to="NetworkOperator" + ), # Deprecated, will be removed at 1.0 + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Purpose": fields.Int( + required=False, dump_to="Purpose" + ), # Deprecated, will be removed at 1.0 + "Region": fields.Str(required=False, dump_to="Region"), + "Remark": fields.Str(required=True, dump_to="Remark"), + "TemplateName": fields.Str(required=True, dump_to="TemplateName"), + "UnsubscribeInfo": fields.Str(required=True, dump_to="UnsubscribeInfo"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class CreateISMSTemplateResponseSchema(schema.ResponseSchema): + """CreateISMSTemplate - 申请视频短信模板""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "ReqUuid": fields.Str(required=True, load_from="ReqUuid"), + "TemplateId": fields.Str(required=True, load_from="TemplateId"), + } + + +""" +API: DeleteISMSSignature + +调用接口DeleteISMSSignature删除视频短信签名 +""" + + +class DeleteISMSSignatureRequestSchema(schema.RequestSchema): + """DeleteISMSSignature - 调用接口DeleteISMSSignature删除视频短信签名""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "SigIds": fields.List(fields.Str()), + } + + +class DeleteISMSSignatureResponseSchema(schema.ResponseSchema): + """DeleteISMSSignature - 调用接口DeleteISMSSignature删除视频短信签名""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DeleteISMSTemplate + +调用接口DeleteISMSTemplate删除视频短信模板 +""" + + +class DeleteISMSTemplateRequestSchema(schema.RequestSchema): + """DeleteISMSTemplate - 调用接口DeleteISMSTemplate删除视频短信模板""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "TemplateIds": fields.List(fields.Str()), + } + + +class DeleteISMSTemplateResponseSchema(schema.ResponseSchema): + """DeleteISMSTemplate - 调用接口DeleteISMSTemplate删除视频短信模板""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: GetISMSSendReceipt + +获取视频短信发送记录的状态回执 +""" + + +class GetISMSSendReceiptRequestSchema(schema.RequestSchema): + """GetISMSSendReceipt - 获取视频短信发送记录的状态回执""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "TaskIdSet": fields.List(fields.Str()), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetISMSSendReceiptResponseSchema(schema.ResponseSchema): + """GetISMSSendReceipt - 获取视频短信发送记录的状态回执""" + + fields = { + "Data": fields.List( + models.ReceiptPerTaskSchema(), required=False, load_from="Data" + ), + "Message": fields.Str(required=True, load_from="Message"), + "ReqUuid": fields.Str(required=True, load_from="ReqUuid"), + } + + +""" +API: QueryISMSSignature + +调用接口QueryISMSSignature查询视频短信签名申请状态 +""" + + +class QueryISMSSignatureRequestSchema(schema.RequestSchema): + """QueryISMSSignature - 调用接口QueryISMSSignature查询视频短信签名申请状态""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "SigContent": fields.Str(required=False, dump_to="SigContent"), + "SigId": fields.Str(required=True, dump_to="SigId"), + } + + +class QueryISMSSignatureResponseSchema(schema.ResponseSchema): + """QueryISMSSignature - 调用接口QueryISMSSignature查询视频短信签名申请状态""" + + fields = { + "Data": models.OutSignatureSchema(), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: QueryISMSTemplate + +查询模板状态信息 +""" + + +class QueryISMSTemplateRequestSchema(schema.RequestSchema): + """QueryISMSTemplate - 查询模板状态信息""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "TemplateId": fields.Str(required=True, dump_to="TemplateId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class QueryISMSTemplateResponseSchema(schema.ResponseSchema): + """QueryISMSTemplate - 查询模板状态信息""" + + fields = { + "Data": models.OutTemplateSchema(), + "Message": fields.Str(required=True, load_from="Message"), + "ReqUuid": fields.Str(required=False, load_from="ReqUuid"), + } + + +""" +API: SendISMSMessage + +发送视频短信 +""" + + +class SendISMSMessageRequestSchema(schema.RequestSchema): + """SendISMSMessage - 发送视频短信""" + + fields = { + "PhoneSet": fields.List(fields.Str()), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "TemplateId": fields.Str(required=True, dump_to="TemplateId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class SendISMSMessageResponseSchema(schema.ResponseSchema): + """SendISMSMessage - 发送视频短信""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "ReqUuid": fields.Str(required=True, load_from="ReqUuid"), + "TaskId": fields.Str(required=True, load_from="TaskId"), + } + + +""" +API: UpdateISMSSignature + +调用接口UpdateISMSSignature修改未通过审核的视频短信签名,并重新提交审核 +""" + + +class UpdateISMSSignatureRequestSchema(schema.RequestSchema): + """UpdateISMSSignature - 调用接口UpdateISMSSignature修改未通过审核的视频短信签名,并重新提交审核""" + + fields = { + "CertificateType": fields.Int( + required=False, dump_to="CertificateType" + ), + "Document": fields.Str(required=False, dump_to="Document"), + "File": fields.Str(required=False, dump_to="File"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "ProxyDoc": fields.Str(required=False, dump_to="ProxyDoc"), + "ProxyFile": fields.Str(required=False, dump_to="ProxyFile"), + "SigContent": fields.Str(required=True, dump_to="SigContent"), + "SigId": fields.Str(required=True, dump_to="SigId"), + "SigPurpose": fields.Int(required=True, dump_to="SigPurpose"), + "SigType": fields.Int(required=True, dump_to="SigType"), + } + + +class UpdateISMSSignatureResponseSchema(schema.ResponseSchema): + """UpdateISMSSignature - 调用接口UpdateISMSSignature修改未通过审核的视频短信签名,并重新提交审核""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } diff --git a/ucloud/services/isms/schemas/models.py b/ucloud/services/isms/schemas/models.py new file mode 100644 index 00000000..c87cf02d --- /dev/null +++ b/ucloud/services/isms/schemas/models.py @@ -0,0 +1,50 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class ReceiptPerPhoneSchema(schema.ResponseSchema): + """ReceiptPerPhone - 每个目的手机号的发送回执信息""" + + fields = { + "Phone": fields.Str(required=True, load_from="Phone"), + "ReceiptCode": fields.Str(required=True, load_from="ReceiptCode"), + "ReceiptDesc": fields.Str(required=True, load_from="ReceiptDesc"), + "ReceiptResult": fields.Str(required=True, load_from="ReceiptResult"), + "ReceiptTime": fields.Int(required=True, load_from="ReceiptTime"), + "SessionId": fields.Str(required=True, load_from="SessionId"), + } + + +class ReceiptPerTaskSchema(schema.ResponseSchema): + """ReceiptPerTask - 每个提交任务的视频短信的回执结果集合""" + + fields = { + "ReceiptSet": fields.List(ReceiptPerPhoneSchema()), + "TaskId": fields.Str(required=True, load_from="TaskId"), + } + + +class OutSignatureSchema(schema.ResponseSchema): + """OutSignature - 短信签名""" + + fields = { + "ErrDesc": fields.Str(required=True, load_from="ErrDesc"), + "SigContent": fields.Str(required=True, load_from="SigContent"), + "SigId": fields.Str(required=True, load_from="SigId"), + "Status": fields.Int(required=True, load_from="Status"), + } + + +class OutTemplateSchema(schema.ResponseSchema): + """OutTemplate - 模板状态""" + + fields = { + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "Purpose": fields.Int(required=False, load_from="Purpose"), + "Remark": fields.Str(required=False, load_from="Remark"), + "StatusDesc": fields.Str(required=False, load_from="StatusDesc"), + "TemplateId": fields.Str(required=False, load_from="TemplateId"), + "TemplateName": fields.Str(required=False, load_from="TemplateName"), + } diff --git a/ucloud/services/nlb/__init__.py b/ucloud/services/nlb/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/nlb/client.py b/ucloud/services/nlb/client.py new file mode 100644 index 00000000..07d8f9ba --- /dev/null +++ b/ucloud/services/nlb/client.py @@ -0,0 +1,580 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.nlb.schemas import apis + + +class NLBClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(NLBClient, self).__init__(config, transport, middleware, logger) + + def add_nlb_targets( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AddNLBTargets - 给监听器添加后端服务节点 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ListenerId** (str) - (Required) 监听器的ID。 + - **NLBId** (str) - (Required) 负载均衡实例的ID。 + - **Targets** (list) - 见 **AddNLBTargetsParamTargets** 模型定义 + + **Response** + + - **Targets** (list) - 见 **Target** 模型定义 + + **Request Model** + + **AddNLBTargetsParamTargets** + - **Enabled** (bool) - 服务节点是否启用 + - **Port** (int) - 服务节点的端口,限定取值:[1-65535] + - **Region** (str) - 服务节点所在地域 + - **ResourceIP** (str) - 服务节点的IP。在IP类型时,必传 + - **ResourceId** (str) - 服务节点的资源ID。在非IP类型时,必传 + - **ResourceName** (str) - 服务节点的资源名称 + - **ResourceType** (str) - 服务节点的类型。限定枚举值:"UHost" / "UNI"/"UPM"/"IP",默认值:"UHost";非IP类型,如果该资源有多个IP,将只能添加主IP;非IP类型,展示时,会显示相关资源信息,IP类型只展示IP信息。 + - **SubnetId** (str) - 服务节点的子网资源ID。 + - **VPCId** (str) - 服务节点的VPC资源ID。在IP类型时,必传 + - **Weight** (int) - 服务节点的权重。限定取值:[1-100],默认值1;仅在加权轮询、加权最小连接数算法时有效 + + + **Response Model** + + **Target** + - **Enabled** (bool) - 服务节点是否开启 + - **Id** (str) - 服务节点的标识 ID说明:添加服务节点的时候无需传更新服务节点属性时必传 + - **Port** (int) - 服务节点的端口 + - **Region** (str) - 服务节点所在地域 + - **ResourceIP** (str) - 服务节点的IP。在IP类型时,必传 + - **ResourceId** (str) - 服务节点的资源ID。在非IP类型时,必传 + - **ResourceName** (str) - 服务节点的资源名称 + - **ResourceType** (str) - 服务节点的类型 + - **State** (str) - 服务节点的健康检查状态说明:描述服务节点信息时显示限定枚举值:"Healthy"/"Unhealthy" + - **SubnetId** (str) - 服务节点的子网资源ID。在IP类型时,必传 + - **VPCId** (str) - 服务节点的VPC资源ID。在IP类型时,必传 + - **Weight** (int) - 服务节点的权重。支持更新 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.AddNLBTargetsRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AddNLBTargets", d, **kwargs) + return apis.AddNLBTargetsResponseSchema().loads(resp) + + def create_nlb_listener( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateNLBListener - 创建监听器 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **NLBId** (str) - (Required) 负载均衡实例的ID + - **Protocol** (str) - (Required) 监听协议限定取值:"TCP"/"UDP" + - **EndPort** (int) - 端口范围的结束端口限定取值:[1-65535]取值不小于起始端口默认值 65535 + - **ForwardSrcIPMethod** (str) - 传递源 IP 方法。限定取值:"" / "None" / "Toa"/"ProxyProto",空字符串和 None 代表关闭。 + - **HealthCheckConfig** (dict) - 见 **CreateNLBListenerParamHealthCheckConfig** 模型定义 + - **Name** (str) - 监听器的名称限定字符长度:[1-255]限定特殊字符,仅支持:-_.默认值:listener + - **Remark** (str) - 监听器的备注信息限定字符长度:[0-255] + - **Scheduler** (str) - 负载均衡算法限定取值:"RoundRobin"/"SourceHash"/"LeastConn"/"WeightLeastConn "/"WeightRoundRobin"默认值 "RoundRobin" + - **StartPort** (int) - 端口范围的起始端口限定取值:[1-65535]默认值 1 + - **StickinessTimeout** (int) - 会话保持超时时间。单位:秒限定取值:[60-900],0 表示不开启会话保持默认值60 + + **Response** + + - **ListenerId** (str) - 监听器的ID + + **Request Model** + + **CreateNLBListenerParamHealthCheckConfig** + - **Enabled** (bool) - 是否开启健康检查功能。暂时不支持关闭,默认 true + - **Port** (int) - 健康检查探测端口 说明: 限定取值:[1-65535],Ping 探测下,端口可填 0 + - **ReqMsg** (str) - UDP" 检查模式的请求字符串 + - **ResMsg** (str) - "UDP" 检查模式的预期响应字符串 + - **Type** (str) - 健康检查方式 限定取值:"Port"/"UDP"/"Ping" 默认值:“Port”,Ping 只允许 UDP 协议监听器设置 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateNLBListenerRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateNLBListener", d, **kwargs) + return apis.CreateNLBListenerResponseSchema().loads(resp) + + def create_network_load_balancer( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateNetworkLoadBalancer - 创建网络型负载均衡 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SubnetId** (str) - (Required) 负载均衡实例所属的子网资源ID + - **VPCId** (str) - (Required) 载均衡实例所属的VPC资源ID + - **ApiVersion** (str) - API 版本,限定取值 "v1.0"/"v2.0",默认值:"v2.0" + - **ChargeType** (str) - 付费模式,限定取值:"Dynamic"/"Month"/"Year" + - **CouponId** (str) - 代金券code + - **IPVersion** (str) - 负载均衡实例的IP协议,限定取值:"IPv4"/"IPv6"/"DualStack",默认值:"IPv4" + - **Name** (str) - 负载均衡实例的名称限定字符长度:[1-255]限定特殊字符,仅支持:-_.默认值:nlb + - **Quantity** (int) - 购买的时长,ChargeType = "Month",Quantity = 0 代表购买到月底,其余情况必须赋值 + - **Remark** (str) - 负载均衡实例的备注信息限定字符长度:[0-255] + - **Tag** (str) - 负载均衡实例所属的业务组ID + + **Response** + + - **Message** (str) - 返回信息 + - **NLBId** (str) - 返回的NLBId + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateNetworkLoadBalancerRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateNetworkLoadBalancer", d, **kwargs) + return apis.CreateNetworkLoadBalancerResponseSchema().loads(resp) + + def delete_nlb_listener( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteNLBListener - 删除一个网络型负载均衡监听器 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ListenerId** (str) - (Required) 监听器的ID + - **NLBId** (str) - (Required) 负载均衡实例的ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteNLBListenerRequestSchema().dumps(d) + + resp = self.invoke("DeleteNLBListener", d, **kwargs) + return apis.DeleteNLBListenerResponseSchema().loads(resp) + + def delete_network_load_balancer( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteNetworkLoadBalancer - 删除负载均衡实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **NLBId** (str) - (Required) 负载均衡实例的ID + - **ReleaseEIP** (bool) - 删除NLB时释放绑定的EIP + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteNetworkLoadBalancerRequestSchema().dumps(d) + + resp = self.invoke("DeleteNetworkLoadBalancer", d, **kwargs) + return apis.DeleteNetworkLoadBalancerResponseSchema().loads(resp) + + def describe_nlb_listeners( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeNLBListeners - 描述监听器 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **NLBId** (str) - (Required) 负载均衡实例的ID。未指定 ListenerId ,则描述指定的 LoadBalancerId 下的所有监听器 + - **Limit** (int) - 限制返回的监听器数量 + - **ListenerId** (str) - 监听器的ID + - **Offset** (int) - 设置监听器的偏移量 + + **Response** + + - **Listeners** (list) - 见 **Listener** 模型定义 + - **TotalCount** (int) - 全部个数 + + **Response Model** + + **Target** + - **Enabled** (bool) - 服务节点是否开启 + - **Id** (str) - 服务节点的标识 ID说明:添加服务节点的时候无需传更新服务节点属性时必传 + - **Port** (int) - 服务节点的端口 + - **Region** (str) - 服务节点所在地域 + - **ResourceIP** (str) - 服务节点的IP。在IP类型时,必传 + - **ResourceId** (str) - 服务节点的资源ID。在非IP类型时,必传 + - **ResourceName** (str) - 服务节点的资源名称 + - **ResourceType** (str) - 服务节点的类型 + - **State** (str) - 服务节点的健康检查状态说明:描述服务节点信息时显示限定枚举值:"Healthy"/"Unhealthy" + - **SubnetId** (str) - 服务节点的子网资源ID。在IP类型时,必传 + - **VPCId** (str) - 服务节点的VPC资源ID。在IP类型时,必传 + - **Weight** (int) - 服务节点的权重。支持更新 + + + **HealthCheckConfig** + - **Enabled** (bool) - 是否开启健康检查功能。 + - **Interval** (int) - 健康检查间隔时间限定取值:[1-60] 单位秒默认 2s + - **MaxFail** (int) - 健康检查最大失败数限定取值:[1-10] 默认 3 + - **MinSuccess** (int) - 健康检查最小成功数限定取值:[1-10] 默认 3 + - **Port** (int) - 健康检查探测端口说明:限定取值:[1-65535] + - **ReqMsg** (str) - UDP" 检查模式的请求字符串"HTTP" 检查模式的请求 json 字符串 + - **ResMsg** (str) - "UDP" 检查模式的预期响应字符串"HTTP" 检查模式的响应状态码 + - **Type** (str) - 健康检查方式限定取值:"Port"/"UDP"/"Ping" /"HTTP"默认值:“Port” + + + **Listener** + - **DeletionProtection** (bool) - 是否开启删除保护 + - **EndPort** (int) - 端口范围的结束端口 + - **ForwardSrcIPMethod** (str) - 传递源 IP 方法。限定取值:"" / "None" / "Toa"/"ProxyProto",空字符串和 None 代表关闭。 + - **HealthCheckConfig** (dict) - 见 **HealthCheckConfig** 模型定义 + - **ListenerId** (str) - 监听器的ID + - **Name** (str) - 监听器的名称 + - **Protocol** (str) - 监听协议,限定取值:"TCP"/"UDP" + - **Remark** (str) - 监听器的备注信息 + - **Scheduler** (str) - 负载均衡算法,限定取值:"RoundRobin"/"SourceHash"/"LeastConn"/"WeightLeastConn "/"WeightRoundRobin " + - **StartPort** (int) - 端口范围的起始端口 + - **State** (str) - listener 健康状态,"Healthy"/"Unhealthy"/"PartialHealth"/"None" + - **StickinessTimeout** (int) - 会话保持超时时间。单位:秒,0表示不开启会话保持 + - **Targets** (list) - 见 **Target** 模型定义 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeNLBListenersRequestSchema().dumps(d) + + resp = self.invoke("DescribeNLBListeners", d, **kwargs) + return apis.DescribeNLBListenersResponseSchema().loads(resp) + + def describe_network_load_balancers( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeNetworkLoadBalancers - 描述负载均衡实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - 数据分页值,默认为100 + - **NLBIds** (list) - 负载均衡实例的ID,数组 + - **Offset** (int) - 数据偏移量,默认为0 + - **ShowDetail** (bool) - 是否获取监听器和后端服务节点的详细信息 + - **SubnetId** (str) - 限定所在的子网 + - **VPCId** (str) - 限定所在的VPC + + **Response** + + - **NLBs** (list) - 见 **NetworkLoadBalancer** 模型定义 + - **TotalCount** (int) - 满足条件的负载均衡实例总数 + + **Response Model** + + **HealthCheckConfig** + - **Enabled** (bool) - 是否开启健康检查功能。 + - **Interval** (int) - 健康检查间隔时间限定取值:[1-60] 单位秒默认 2s + - **MaxFail** (int) - 健康检查最大失败数限定取值:[1-10] 默认 3 + - **MinSuccess** (int) - 健康检查最小成功数限定取值:[1-10] 默认 3 + - **Port** (int) - 健康检查探测端口说明:限定取值:[1-65535] + - **ReqMsg** (str) - UDP" 检查模式的请求字符串"HTTP" 检查模式的请求 json 字符串 + - **ResMsg** (str) - "UDP" 检查模式的预期响应字符串"HTTP" 检查模式的响应状态码 + - **Type** (str) - 健康检查方式限定取值:"Port"/"UDP"/"Ping" /"HTTP"默认值:“Port” + + + **Target** + - **Enabled** (bool) - 服务节点是否开启 + - **Id** (str) - 服务节点的标识 ID说明:添加服务节点的时候无需传更新服务节点属性时必传 + - **Port** (int) - 服务节点的端口 + - **Region** (str) - 服务节点所在地域 + - **ResourceIP** (str) - 服务节点的IP。在IP类型时,必传 + - **ResourceId** (str) - 服务节点的资源ID。在非IP类型时,必传 + - **ResourceName** (str) - 服务节点的资源名称 + - **ResourceType** (str) - 服务节点的类型 + - **State** (str) - 服务节点的健康检查状态说明:描述服务节点信息时显示限定枚举值:"Healthy"/"Unhealthy" + - **SubnetId** (str) - 服务节点的子网资源ID。在IP类型时,必传 + - **VPCId** (str) - 服务节点的VPC资源ID。在IP类型时,必传 + - **Weight** (int) - 服务节点的权重。支持更新 + + + **Listener** + - **EndPort** (int) - 端口范围的结束端口 + - **ForwardSrcIPMethod** (str) - 传递源 IP 方法。限定取值:"" / "None" / "Toa"/"ProxyProto",空字符串和 None 代表关闭。 + - **HealthCheckConfig** (dict) - 见 **HealthCheckConfig** 模型定义 + - **ListenerId** (str) - 监听器的ID + - **Name** (str) - 监听器的名称 + - **Protocol** (str) - 监听协议,限定取值:"TCP"/"UDP" + - **Remark** (str) - 监听器的备注信息 + - **Scheduler** (str) - 负载均衡算法,限定取值:"RoundRobin"/"SourceHash"/"LeastConn"/"WeightLeastConn "/"WeightRoundRobin " + - **StartPort** (int) - 端口范围的起始端口 + - **State** (str) - listener 健康状态,"Healthy"/"Unhealthy"/"PartialHealth"/"None" + - **StickinessTimeout** (int) - 会话保持超时时间。单位:秒,0表示不开启会话保持 + - **Targets** (list) - 见 **Target** 模型定义 + + + **IPInfo** + - **AddressType** (str) - 网络模式,限定枚举值:"Internet" / "Intranet" + - **Bandwidth** (int) - 带宽值。单位 M + - **BandwidthType** (int) - 带宽类型,限定枚举值:0(普通带宽)/ 1(共享带宽) + - **IP** (str) - IP 地址 + - **IPVersion** (str) - IP协议版本,限定枚举值:"IPv4" / "IPv6" + - **Id** (str) - 唯一标识 ID + - **OperatorName** (str) - 外网IP的运营商信息,限定枚举值:"Telecom" / "Unicom"/"International"/"Bgp"/"Duplet"/"BGPPro"/"China-mobile"/"Anycast" + - **Type** (int) - IP 类型,1(前向 IP)/ 2(后向 IP) + + + **NetworkLoadBalancer** + - **AutoRenewEnabled** (bool) - 是否开启自动续费 + - **ChargeType** (str) - 付费模式 + - **CreateTime** (int) - 负载均衡实例创建时间。格式为 Unix Timestamp + - **ForwardingMode** (str) - 负载均衡实例的转发模式 + - **IPInfos** (list) - 见 **IPInfo** 模型定义 + - **IPVersion** (str) - 负载均衡实例支持的IP协议版本 + - **Listeners** (list) - 见 **Listener** 模型定义 + - **NLBId** (str) - 负载均衡实例的ID + - **Name** (str) - 负载均衡实例的名称 + - **PurchaseValue** (int) - 有效期(计费) + - **Remark** (str) - 负载均衡实例的备注信息 + - **Status** (str) - NLB 状态:Normal-正常;Closed-欠费停服;Deleted 已删除 + - **SubnetId** (str) - 负载均衡实例所属的子网资源ID + - **Tag** (str) - 负载均衡实例所属的业务组ID + - **VPCId** (str) - 负载均衡实例所属的VPC资源ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeNetworkLoadBalancersRequestSchema().dumps(d) + + resp = self.invoke("DescribeNetworkLoadBalancers", d, **kwargs) + return apis.DescribeNetworkLoadBalancersResponseSchema().loads(resp) + + def get_network_load_balancer_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetNetworkLoadBalancerPrice - 获取负载均衡价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ChargeType** (str) - 付费模式限定枚举值:"Year" / "Month"/ "Dynamic"默认获取三种价格 + - **PayMode** (str) - 负载均衡实例计费方式限定枚举值:"Instance" / "LCU"默认值:"Instance" + - **Quantity** (int) - 购买时长按小时购买(Dynamic)时无需此参数。月付时,此参数传 0,代表了购买至月末默认 1 + + **Response** + + - **Prices** (list) - 见 **PriceDetail** 模型定义 + + **Response Model** + + **PriceDetail** + - **ChargeType** (str) - 负载均衡付费方式 + - **CustomPrice** (float) - 用户折后价,单位“元”。CustomPrice=OriginalPrice*用户折扣 + - **OriginalPrice** (float) - 购买负载均衡的原价,单位“元” + - **Price** (float) - 购买负载均衡的实际价格,单位“元” + - **PurchaseValue** (int) - 资源有效期,以Unix Timestamp表示 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetNetworkLoadBalancerPriceRequestSchema().dumps(d) + + resp = self.invoke("GetNetworkLoadBalancerPrice", d, **kwargs) + return apis.GetNetworkLoadBalancerPriceResponseSchema().loads(resp) + + def remove_nlb_targets( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RemoveNLBTargets - 删除后端服务节点 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Ids** (list) - (Required) 服务节点的标识ID。单次请求不能超过 40 个 + - **ListenerId** (str) - (Required) 监听器的ID + - **NLBId** (str) - (Required) 负载均衡实例的ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.RemoveNLBTargetsRequestSchema().dumps(d) + + resp = self.invoke("RemoveNLBTargets", d, **kwargs) + return apis.RemoveNLBTargetsResponseSchema().loads(resp) + + def update_nlb_listener_attribute( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateNLBListenerAttribute - 更新监听器属性 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ListenerId** (str) - (Required) 负载均衡实例的ID + - **NLBId** (str) - (Required) 负载均衡实例的ID + - **EndPort** (int) - 端口范围的结束端口 限定取值:[1-65535] 取值不小于起始端口 默认值 65535,只有全端口模式支持修改 + - **ForwardSrcIPMethod** (str) - 传递源 IP 方法。限定取值:"" / "None" / "Toa",空字符串和 None 代表关闭。 + - **HealthCheckConfig** (dict) - 见 **UpdateNLBListenerAttributeParamHealthCheckConfig** 模型定义 + - **Name** (str) - 监听器的名称 + - **Remark** (str) - 监听器的备注信息 + - **Scheduler** (str) - 负载均衡算法 限定取值:"RoundRobin"/"SourceHash"/"LeastConn"/"WeightLeastConn "/"WeightRoundRobin" 默认值 "RoundRobin" + - **StartPort** (int) - 端口范围的起始端口 限定取值:[1-65535] 默认值 1,只有全端口模式支持修改 + - **StickinessTimeout** (int) - 会话保持超时时间。单位:秒说明:限定取值:[60-900],0 表示不开启会话保持默认值60 + + **Response** + + + **Request Model** + + **UpdateNLBListenerAttributeParamHealthCheckConfig** + - **Enabled** (bool) - 是否开启健康检查功能。暂时不支持关闭,默认 true + - **Port** (int) - 健康检查探测端口 说明: 限定取值:[1-65535] + - **ReqMsg** (str) - UDP" 检查模式的请求字符串 + - **ResMsg** (str) - "UDP" 检查模式的预期响应字符串 + - **Type** (str) - 健康检查方式 限定取值:"Port"/"UDP"/"Ping" 默认值:“Port” + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateNLBListenerAttributeRequestSchema().dumps(d) + + resp = self.invoke("UpdateNLBListenerAttribute", d, **kwargs) + return apis.UpdateNLBListenerAttributeResponseSchema().loads(resp) + + def update_nlb_targets_attribute( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateNLBTargetsAttribute - 更新后端服务节点属性 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ListenerId** (str) - (Required) 监听器的ID + - **NLBId** (str) - (Required) 负载均衡实例的ID + - **Targets** (list) - 见 **UpdateNLBTargetsAttributeParamTargets** 模型定义 + + **Response** + + + **Request Model** + + **UpdateNLBTargetsAttributeParamTargets** + - **Enabled** (bool) - 是否禁用服务节点 + - **Id** (str) - 服务节点的ID + - **Weight** (int) - 服务节点的权重。限定取值:[1-100],默认值1;仅在加权轮询、加权最小连接数算法时有效 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateNLBTargetsAttributeRequestSchema().dumps(d) + + resp = self.invoke("UpdateNLBTargetsAttribute", d, **kwargs) + return apis.UpdateNLBTargetsAttributeResponseSchema().loads(resp) + + def update_network_load_balancer_attribute( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateNetworkLoadBalancerAttribute - 更新负载均衡实例属性 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **NLBId** (str) - (Required) 负载均衡实例的ID + - **Name** (str) - 负载均衡实例的名称 + - **Remark** (str) - 负载均衡实例的备注信息 + - **Tag** (str) - 负载均衡实例所属的业务组ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateNetworkLoadBalancerAttributeRequestSchema().dumps(d) + + resp = self.invoke("UpdateNetworkLoadBalancerAttribute", d, **kwargs) + return apis.UpdateNetworkLoadBalancerAttributeResponseSchema().loads( + resp + ) diff --git a/ucloud/services/nlb/schemas/__init__.py b/ucloud/services/nlb/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/nlb/schemas/apis.py b/ucloud/services/nlb/schemas/apis.py new file mode 100644 index 00000000..fd1acbc7 --- /dev/null +++ b/ucloud/services/nlb/schemas/apis.py @@ -0,0 +1,419 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.nlb.schemas import models + +""" NLB API Schema +""" + + +""" +API: AddNLBTargets + +给监听器添加后端服务节点 +""" + + +class AddNLBTargetsParamTargetsSchema(schema.RequestSchema): + """AddNLBTargetsParamTargets -""" + + fields = { + "Enabled": fields.Bool(required=False, dump_to="Enabled"), + "Port": fields.Int(required=False, dump_to="Port"), + "Region": fields.Str(required=False, dump_to="Region"), + "ResourceIP": fields.Str(required=False, dump_to="ResourceIP"), + "ResourceId": fields.Str(required=False, dump_to="ResourceId"), + "ResourceName": fields.Str(required=False, dump_to="ResourceName"), + "ResourceType": fields.Str(required=False, dump_to="ResourceType"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + "Weight": fields.Int(required=False, dump_to="Weight"), + } + + +class AddNLBTargetsRequestSchema(schema.RequestSchema): + """AddNLBTargets - 给监听器添加后端服务节点""" + + fields = { + "ListenerId": fields.Str(required=True, dump_to="ListenerId"), + "NLBId": fields.Str(required=True, dump_to="NLBId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Targets": fields.List(AddNLBTargetsParamTargetsSchema()), + } + + +class AddNLBTargetsResponseSchema(schema.ResponseSchema): + """AddNLBTargets - 给监听器添加后端服务节点""" + + fields = { + "Targets": fields.List( + models.TargetSchema(), required=True, load_from="Targets" + ), + } + + +""" +API: CreateNLBListener + +创建监听器 +""" + + +class CreateNLBListenerParamHealthCheckConfigSchema(schema.RequestSchema): + """CreateNLBListenerParamHealthCheckConfig -""" + + fields = { + "Enabled": fields.Bool(required=False, dump_to="Enabled"), + "Port": fields.Int(required=True, dump_to="Port"), + "ReqMsg": fields.Str(required=False, dump_to="ReqMsg"), + "ResMsg": fields.Str(required=False, dump_to="ResMsg"), + "Type": fields.Str(required=False, dump_to="Type"), + } + + +class CreateNLBListenerRequestSchema(schema.RequestSchema): + """CreateNLBListener - 创建监听器""" + + fields = { + "EndPort": fields.Int(required=False, dump_to="EndPort"), + "ForwardSrcIPMethod": fields.Str( + required=False, dump_to="ForwardSrcIPMethod" + ), + "HealthCheckConfig": CreateNLBListenerParamHealthCheckConfigSchema( + required=False, dump_to="HealthCheckConfig" + ), + "NLBId": fields.Str(required=True, dump_to="NLBId"), + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Protocol": fields.Str(required=True, dump_to="Protocol"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "Scheduler": fields.Str(required=False, dump_to="Scheduler"), + "StartPort": fields.Int(required=False, dump_to="StartPort"), + "StickinessTimeout": fields.Int( + required=False, dump_to="StickinessTimeout" + ), + } + + +class CreateNLBListenerResponseSchema(schema.ResponseSchema): + """CreateNLBListener - 创建监听器""" + + fields = { + "ListenerId": fields.Str(required=True, load_from="ListenerId"), + } + + +""" +API: CreateNetworkLoadBalancer + +创建网络型负载均衡 +""" + + +class CreateNetworkLoadBalancerRequestSchema(schema.RequestSchema): + """CreateNetworkLoadBalancer - 创建网络型负载均衡""" + + fields = { + "ApiVersion": fields.Str(required=False, dump_to="ApiVersion"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "IPVersion": fields.Str(required=False, dump_to="IPVersion"), + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + } + + +class CreateNetworkLoadBalancerResponseSchema(schema.ResponseSchema): + """CreateNetworkLoadBalancer - 创建网络型负载均衡""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "NLBId": fields.Str(required=True, load_from="NLBId"), + } + + +""" +API: DeleteNLBListener + +删除一个网络型负载均衡监听器 +""" + + +class DeleteNLBListenerRequestSchema(schema.RequestSchema): + """DeleteNLBListener - 删除一个网络型负载均衡监听器""" + + fields = { + "ListenerId": fields.Str(required=True, dump_to="ListenerId"), + "NLBId": fields.Str(required=True, dump_to="NLBId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DeleteNLBListenerResponseSchema(schema.ResponseSchema): + """DeleteNLBListener - 删除一个网络型负载均衡监听器""" + + fields = {} + + +""" +API: DeleteNetworkLoadBalancer + +删除负载均衡实例 +""" + + +class DeleteNetworkLoadBalancerRequestSchema(schema.RequestSchema): + """DeleteNetworkLoadBalancer - 删除负载均衡实例""" + + fields = { + "NLBId": fields.Str(required=True, dump_to="NLBId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ReleaseEIP": fields.Bool(required=False, dump_to="ReleaseEIP"), + } + + +class DeleteNetworkLoadBalancerResponseSchema(schema.ResponseSchema): + """DeleteNetworkLoadBalancer - 删除负载均衡实例""" + + fields = {} + + +""" +API: DescribeNLBListeners + +描述监听器 +""" + + +class DescribeNLBListenersRequestSchema(schema.RequestSchema): + """DescribeNLBListeners - 描述监听器""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "ListenerId": fields.Str(required=False, dump_to="ListenerId"), + "NLBId": fields.Str(required=True, dump_to="NLBId"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DescribeNLBListenersResponseSchema(schema.ResponseSchema): + """DescribeNLBListeners - 描述监听器""" + + fields = { + "Listeners": fields.List( + models.ListenerSchema(), required=True, load_from="Listeners" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeNetworkLoadBalancers + +描述负载均衡实例 +""" + + +class DescribeNetworkLoadBalancersRequestSchema(schema.RequestSchema): + """DescribeNetworkLoadBalancers - 描述负载均衡实例""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "NLBIds": fields.List(fields.Str()), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ShowDetail": fields.Bool(required=False, dump_to="ShowDetail"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + } + + +class DescribeNetworkLoadBalancersResponseSchema(schema.ResponseSchema): + """DescribeNetworkLoadBalancers - 描述负载均衡实例""" + + fields = { + "NLBs": fields.List( + models.NetworkLoadBalancerSchema(), required=True, load_from="NLBs" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: GetNetworkLoadBalancerPrice + +获取负载均衡价格 +""" + + +class GetNetworkLoadBalancerPriceRequestSchema(schema.RequestSchema): + """GetNetworkLoadBalancerPrice - 获取负载均衡价格""" + + fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "PayMode": fields.Str(required=False, dump_to="PayMode"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class GetNetworkLoadBalancerPriceResponseSchema(schema.ResponseSchema): + """GetNetworkLoadBalancerPrice - 获取负载均衡价格""" + + fields = { + "Prices": fields.List( + models.PriceDetailSchema(), required=True, load_from="Prices" + ), + } + + +""" +API: RemoveNLBTargets + +删除后端服务节点 +""" + + +class RemoveNLBTargetsRequestSchema(schema.RequestSchema): + """RemoveNLBTargets - 删除后端服务节点""" + + fields = { + "Ids": fields.List(fields.Str()), + "ListenerId": fields.Str(required=True, dump_to="ListenerId"), + "NLBId": fields.Str(required=True, dump_to="NLBId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class RemoveNLBTargetsResponseSchema(schema.ResponseSchema): + """RemoveNLBTargets - 删除后端服务节点""" + + fields = {} + + +""" +API: UpdateNLBListenerAttribute + +更新监听器属性 +""" + + +class UpdateNLBListenerAttributeParamHealthCheckConfigSchema( + schema.RequestSchema +): + """UpdateNLBListenerAttributeParamHealthCheckConfig -""" + + fields = { + "Enabled": fields.Bool(required=False, dump_to="Enabled"), + "Port": fields.Int(required=False, dump_to="Port"), + "ReqMsg": fields.Str(required=False, dump_to="ReqMsg"), + "ResMsg": fields.Str(required=False, dump_to="ResMsg"), + "Type": fields.Str(required=False, dump_to="Type"), + } + + +class UpdateNLBListenerAttributeRequestSchema(schema.RequestSchema): + """UpdateNLBListenerAttribute - 更新监听器属性""" + + fields = { + "EndPort": fields.Int(required=False, dump_to="EndPort"), + "ForwardSrcIPMethod": fields.Str( + required=False, dump_to="ForwardSrcIPMethod" + ), + "HealthCheckConfig": UpdateNLBListenerAttributeParamHealthCheckConfigSchema( + required=False, dump_to="HealthCheckConfig" + ), + "ListenerId": fields.Str(required=True, dump_to="ListenerId"), + "NLBId": fields.Str(required=True, dump_to="NLBId"), + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "Scheduler": fields.Str(required=False, dump_to="Scheduler"), + "StartPort": fields.Int(required=False, dump_to="StartPort"), + "StickinessTimeout": fields.Int( + required=False, dump_to="StickinessTimeout" + ), + } + + +class UpdateNLBListenerAttributeResponseSchema(schema.ResponseSchema): + """UpdateNLBListenerAttribute - 更新监听器属性""" + + fields = {} + + +""" +API: UpdateNLBTargetsAttribute + +更新后端服务节点属性 +""" + + +class UpdateNLBTargetsAttributeParamTargetsSchema(schema.RequestSchema): + """UpdateNLBTargetsAttributeParamTargets -""" + + fields = { + "Enabled": fields.Bool(required=False, dump_to="Enabled"), + "Id": fields.Str(required=False, dump_to="Id"), + "Weight": fields.Int(required=False, dump_to="Weight"), + } + + +class UpdateNLBTargetsAttributeRequestSchema(schema.RequestSchema): + """UpdateNLBTargetsAttribute - 更新后端服务节点属性""" + + fields = { + "ListenerId": fields.Str(required=True, dump_to="ListenerId"), + "NLBId": fields.Str(required=True, dump_to="NLBId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Targets": fields.List(UpdateNLBTargetsAttributeParamTargetsSchema()), + } + + +class UpdateNLBTargetsAttributeResponseSchema(schema.ResponseSchema): + """UpdateNLBTargetsAttribute - 更新后端服务节点属性""" + + fields = {} + + +""" +API: UpdateNetworkLoadBalancerAttribute + +更新负载均衡实例属性 +""" + + +class UpdateNetworkLoadBalancerAttributeRequestSchema(schema.RequestSchema): + """UpdateNetworkLoadBalancerAttribute - 更新负载均衡实例属性""" + + fields = { + "NLBId": fields.Str(required=True, dump_to="NLBId"), + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "Tag": fields.Str(required=False, dump_to="Tag"), + } + + +class UpdateNetworkLoadBalancerAttributeResponseSchema(schema.ResponseSchema): + """UpdateNetworkLoadBalancerAttribute - 更新负载均衡实例属性""" + + fields = {} diff --git a/ucloud/services/nlb/schemas/models.py b/ucloud/services/nlb/schemas/models.py new file mode 100644 index 00000000..cbb592d7 --- /dev/null +++ b/ucloud/services/nlb/schemas/models.py @@ -0,0 +1,115 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class TargetSchema(schema.ResponseSchema): + """Target - 服务节点信息""" + + fields = { + "Enabled": fields.Bool(required=False, load_from="Enabled"), + "Id": fields.Str(required=False, load_from="Id"), + "Port": fields.Int(required=False, load_from="Port"), + "Region": fields.Str(required=False, load_from="Region"), + "ResourceIP": fields.Str(required=False, load_from="ResourceIP"), + "ResourceId": fields.Str(required=False, load_from="ResourceId"), + "ResourceName": fields.Str(required=False, load_from="ResourceName"), + "ResourceType": fields.Str(required=False, load_from="ResourceType"), + "State": fields.Str(required=False, load_from="State"), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + "Weight": fields.Int(required=False, load_from="Weight"), + } + + +class HealthCheckConfigSchema(schema.ResponseSchema): + """HealthCheckConfig - 健康检查配置""" + + fields = { + "Enabled": fields.Bool(required=False, load_from="Enabled"), + "Interval": fields.Int(required=False, load_from="Interval"), + "MaxFail": fields.Int(required=False, load_from="MaxFail"), + "MinSuccess": fields.Int(required=False, load_from="MinSuccess"), + "Port": fields.Int(required=False, load_from="Port"), + "ReqMsg": fields.Str(required=False, load_from="ReqMsg"), + "ResMsg": fields.Str(required=False, load_from="ResMsg"), + "Type": fields.Str(required=False, load_from="Type"), + } + + +class ListenerSchema(schema.ResponseSchema): + """Listener - 监听器信息""" + + fields = { + "EndPort": fields.Int(required=False, load_from="EndPort"), + "ForwardSrcIPMethod": fields.Str( + required=False, load_from="ForwardSrcIPMethod" + ), + "HealthCheckConfig": HealthCheckConfigSchema(), + "ListenerId": fields.Str(required=False, load_from="ListenerId"), + "Name": fields.Str(required=False, load_from="Name"), + "Protocol": fields.Str(required=False, load_from="Protocol"), + "Remark": fields.Str(required=False, load_from="Remark"), + "Scheduler": fields.Str(required=False, load_from="Scheduler"), + "StartPort": fields.Int(required=False, load_from="StartPort"), + "State": fields.Str(required=False, load_from="State"), + "StickinessTimeout": fields.Int( + required=False, load_from="StickinessTimeout" + ), + "Targets": fields.List(TargetSchema()), + } + + +class IPInfoSchema(schema.ResponseSchema): + """IPInfo - 绑定的IP信息""" + + fields = { + "AddressType": fields.Str(required=False, load_from="AddressType"), + "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), + "BandwidthType": fields.Int(required=False, load_from="BandwidthType"), + "IP": fields.Str(required=False, load_from="IP"), + "IPVersion": fields.Str(required=False, load_from="IPVersion"), + "Id": fields.Str(required=False, load_from="Id"), + "OperatorName": fields.Str(required=False, load_from="OperatorName"), + "Type": fields.Int(required=False, load_from="Type"), + } + + +class NetworkLoadBalancerSchema(schema.ResponseSchema): + """NetworkLoadBalancer - 负载均衡实例信息""" + + fields = { + "AutoRenewEnabled": fields.Bool( + required=False, load_from="AutoRenewEnabled" + ), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "ForwardingMode": fields.Str( + required=False, load_from="ForwardingMode" + ), + "IPInfos": fields.List(IPInfoSchema()), + "IPVersion": fields.Str(required=False, load_from="IPVersion"), + "Listeners": fields.List(ListenerSchema()), + "NLBId": fields.Str(required=False, load_from="NLBId"), + "Name": fields.Str(required=False, load_from="Name"), + "PurchaseValue": fields.Int(required=False, load_from="PurchaseValue"), + "Remark": fields.Str(required=False, load_from="Remark"), + "Status": fields.Str(required=False, load_from="Status"), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "Tag": fields.Str(required=False, load_from="Tag"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + } + + +class PriceDetailSchema(schema.ResponseSchema): + """PriceDetail - 负载均衡实例的价格信息""" + + fields = { + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "CustomPrice": fields.Float(required=False, load_from="CustomPrice"), + "OriginalPrice": fields.Float( + required=False, load_from="OriginalPrice" + ), + "Price": fields.Float(required=False, load_from="Price"), + "PurchaseValue": fields.Int(required=False, load_from="PurchaseValue"), + } diff --git a/ucloud/services/pathx/client.py b/ucloud/services/pathx/client.py index 4b78dfda..2ec525ef 100644 --- a/ucloud/services/pathx/client.py +++ b/ucloud/services/pathx/client.py @@ -1,189 +1,1656 @@ -""" Code is generated by ucloud-model, DO NOT EDIT IT. """ - -import typing - - -from ucloud.core.client import Client -from ucloud.services.pathx.schemas import apis - - -class PathXClient(Client): - def __init__( - self, config: dict, transport=None, middleware=None, logger=None - ): - super(PathXClient, self).__init__(config, transport, middleware, logger) - - def create_global_ssh_instance( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ CreateGlobalSSHInstance - 创建GlobalSSH实例 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID,如org-xxxx。请参考 `GetProjectList接口 `_ - - **Area** (str) - (Required) 填写支持SSH访问IP的地区名称,如“洛杉矶”,“新加坡”,“香港”,“东京”,“华盛顿”,“法兰克福”。Area和AreaCode两者必填一个 - - **AreaCode** (str) - (Required) AreaCode, 区域航空港国际通用代码。Area和AreaCode两者必填一个 - - **Port** (int) - (Required) SSH端口,1-65535且不能使用80,443端口 - - **TargetIP** (str) - (Required) 被SSH访问的IP - - **ChargeType** (str) - 支付方式,如按月、按年、按时 - - **CouponId** (str) - 使用代金券可冲抵部分费用 - - **Quantity** (int) - 购买数量 - - **Remark** (str) - 备注信息 - - **Response** - - - **AcceleratingDomain** (str) - 加速域名,访问该域名可就近接入 - - **InstanceId** (str) - 实例ID,资源唯一标识 - - **Message** (str) - 提示信息 - - """ - # build request - d = {"ProjectId": self.config.project_id} - req and d.update(req) - d = apis.CreateGlobalSSHInstanceRequestSchema().dumps(d) - - # build options - kwargs["max_retries"] = 0 # ignore retry when api is not idempotent - - resp = self.invoke("CreateGlobalSSHInstance", d, **kwargs) - return apis.CreateGlobalSSHInstanceResponseSchema().loads(resp) - - def delete_global_ssh_instance( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ DeleteGlobalSSHInstance - 删除GlobalSSH实例 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID,如org-xxxx。请参考 `GetProjectList接口 `_ - - **InstanceId** (str) - (Required) 实例Id,资源的唯一标识 - - **Response** - - - **Message** (str) - 提示信息 - - """ - # build request - d = {"ProjectId": self.config.project_id} - req and d.update(req) - d = apis.DeleteGlobalSSHInstanceRequestSchema().dumps(d) - - resp = self.invoke("DeleteGlobalSSHInstance", d, **kwargs) - return apis.DeleteGlobalSSHInstanceResponseSchema().loads(resp) - - def describe_global_ssh_area( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ DescribeGlobalSSHArea - 获取GlobalSSH覆盖的地区列表 用于控制显示哪些机房地域可以使用SSH特性 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID,如org-xxxx。请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 机房地域代号,如hk、 us-ca、 us-ws等。不填默认为空,返回所有支持地区。 - - **Response** - - - **AreaSet** (list) - 见 **GlobalSSHArea** 模型定义 - - **Message** (str) - 提示信息 - - **Response Model** - - **GlobalSSHArea** - - - **Area** (str) - GlobalSSH覆盖的地区,如香港、东京、洛杉矶等 - - **AreaCode** (str) - 地区代号,以地区AirPort Code - - **RegionSet** (list) - ucloud机房代号构成的数组,如["hk","us-ca"] - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.DescribeGlobalSSHAreaRequestSchema().dumps(d) - - resp = self.invoke("DescribeGlobalSSHArea", d, **kwargs) - return apis.DescribeGlobalSSHAreaResponseSchema().loads(resp) - - def describe_global_ssh_instance( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ DescribeGlobalSSHInstance - 获取GlobalSSH实例列表(传实例ID获取单个实例信息,不传获取项目下全部实例) - - **Request** - - - **ProjectId** (str) - (Config) 项目ID,如org-xxxx。请参考 `GetProjectList接口 `_ - - **InstanceId** (str) - 实例ID,资源唯一标识 - - **Response** - - - **InstanceSet** (list) - 见 **GlobalSSHInfo** 模型定义 - - **Response Model** - - **GlobalSSHInfo** - - - **AcceleratingDomain** (str) - 加速域名 - - **Area** (str) - 被SSH访问的IP所在地区 - - **ChargeType** (str) - 支付周期,如Month,Year等 - - **CreateTime** (int) - 资源创建时间戳 - - **ExpireTime** (int) - 资源过期时间戳 - - **InstanceId** (str) - 实例ID,资源唯一标识 - - **Port** (int) - SSH登陆端口 - - **Remark** (str) - 备注信息 - - **TargetIP** (str) - 被SSH访问的EIP - - """ - # build request - d = {"ProjectId": self.config.project_id} - req and d.update(req) - d = apis.DescribeGlobalSSHInstanceRequestSchema().dumps(d) - - resp = self.invoke("DescribeGlobalSSHInstance", d, **kwargs) - return apis.DescribeGlobalSSHInstanceResponseSchema().loads(resp) - - def modify_global_ssh_port( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ ModifyGlobalSSHPort - 修改GlobalSSH端口 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID,如org-xxxx。请参考 `GetProjectList接口 `_ - - **InstanceId** (str) - (Required) 实例ID,资源唯一标识 - - **Port** (int) - (Required) 调整后的SSH登陆端口 - - **Response** - - - **Message** (str) - 提示信息 - - """ - # build request - d = {"ProjectId": self.config.project_id} - req and d.update(req) - d = apis.ModifyGlobalSSHPortRequestSchema().dumps(d) - - resp = self.invoke("ModifyGlobalSSHPort", d, **kwargs) - return apis.ModifyGlobalSSHPortResponseSchema().loads(resp) - - def modify_global_ssh_remark( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ ModifyGlobalSSHRemark - 修改GlobalSSH备注 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID,如org-xxxx。请参考 `GetProjectList接口 `_ - - **InstanceId** (str) - (Required) 实例ID,资源唯一标识 - - **Remark** (str) - 备注信息,不填默认为空字符串 - - **Response** - - - **Message** (str) - 接口返回消息 - - """ - # build request - d = {"ProjectId": self.config.project_id} - req and d.update(req) - d = apis.ModifyGlobalSSHRemarkRequestSchema().dumps(d) - - resp = self.invoke("ModifyGlobalSSHRemark", d, **kwargs) - return apis.ModifyGlobalSSHRemarkResponseSchema().loads(resp) +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.pathx.schemas import apis + + +class PathXClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(PathXClient, self).__init__(config, transport, middleware, logger) + + def bind_path_xssl( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """BindPathXSSL - 绑定PathX SSL证书 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。 请参考 `GetProjectList接口 `_ + - **Port** (list) - (Required) 绑定SSL证书的HTTPS端口。Port.0 Port.1对应多个Port。如果Port不存在则不会绑定 + - **SSLId** (str) - (Required) 证书ID,如果没有指定证书ID也没有申请免费证书,HTTPS接入无法正常工作 + - **UGAId** (str) - (Required) UGA实例ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.BindPathXSSLRequestSchema().dumps(d) + + resp = self.invoke("BindPathXSSL", d, **kwargs) + return apis.BindPathXSSLResponseSchema().loads(resp) + + def create_global_ssh_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateGlobalSSHInstance - 创建GlobalSSH实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID,如org-xxxx。请参考 `GetProjectList接口 `_ + - **Area** (str) - (Required) 填写支持SSH访问IP的地区名称,如“洛杉矶”,“新加坡”,“香港”,“东京”,“华盛顿”,“法兰克福”,“首尔”。Area和AreaCode两者必填一个 + - **AreaCode** (str) - (Required) AreaCode, 区域航空港国际通用代码。Area和AreaCode两者必填一个 + - **Port** (int) - (Required) 源站服务器监听的SSH端口,可取范围[1-65535],不能使用80,443, 65123端口。如果InstanceType=Free,取值范围缩小为[22,3389],linux系统选择22,windows系统自动选3389。 + - **TargetIP** (str) - (Required) 被SSH访问的源站IP,仅支持IPv4地址。 + - **BandwidthPackage** (int) - Ultimate版本带宽包大小,枚举值:[0,20,40]。单位MB + - **ChargeType** (str) - 支付方式,如按月:Month、 按年:Year、按时:Dynamic + - **CouponId** (str) - 使用代金券可冲抵部分费用 + - **ForwardRegion** (str) - InstanceType等于Basic时可以在["cn-bj2","cn-sh2","cn-gd"]中选择1个作为转发机房,其他付费版默认配置三个转发机房 + - **InstanceType** (str) - 枚举值:["Ultimate","Enterprise","Basic","Primary"], 分别代表旗舰版,企业版,基础版,入门版 + - **Quantity** (int) - 购买数量按月购买至月底请传0 + - **Remark** (str) - 备注信息 + + **Response** + + - **AcceleratingDomain** (str) - 加速域名,访问该域名可就近接入 + - **InstanceId** (str) - 实例ID,资源唯一标识 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.CreateGlobalSSHInstanceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateGlobalSSHInstance", d, **kwargs) + return apis.CreateGlobalSSHInstanceResponseSchema().loads(resp) + + def create_path_xssl( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreatePathXSSL - 创建SSL证书,可以把整个 Pem 证书内容传到SSLContent,或者把证书、私钥、CA证书分别传过来 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID org-xxx格式。 请参考 `GetProjectList接口 `_ + - **SSLName** (str) - (Required) SSL证书的名字 + - **CACert** (str) - CA颁发证书内容 + - **PrivateKey** (str) - 加密证书的私钥,不可使用密码保护,开启密码保护后,重启服务需要输入密码 + - **SSLContent** (str) - SSL证书的完整内容,私钥不可使用密码,包括加密证书的私钥、用户证书或CA证书等 + - **SSLType** (str) - 所添加的SSL证书类型,目前只支持Pem格式 + - **UserCert** (str) - 用户自签证书内容 + + **Response** + + - **SSLId** (str) - SSL证书的Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.CreatePathXSSLRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreatePathXSSL", d, **kwargs) + return apis.CreatePathXSSLResponseSchema().loads(resp) + + def create_uga_3instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUGA3Instance - + + **Request** + + - **ProjectId** (str) - (Config) + - **Bandwidth** (int) - (Required) + - **AccelerationArea** (str) - + - **AreaCode** (str) - + - **ChargeType** (str) - + - **CouponId** (str) - + - **Name** (str) - + - **OriginDomain** (str) - + - **OriginIPList** (str) - + - **Quantity** (int) - + - **Remark** (str) - + + **Response** + + - **CName** (str) - + - **InstanceId** (str) - + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.CreateUGA3InstanceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUGA3Instance", d, **kwargs) + return apis.CreateUGA3InstanceResponseSchema().loads(resp) + + def create_uga_3port( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUGA3Port - + + **Request** + + - **ProjectId** (str) - (Config) + - **InstanceId** (str) - (Required) + - **TCP** (list) - + - **TCPRS** (list) - + + **Response** + + - **Message** (str) - + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.CreateUGA3PortRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUGA3Port", d, **kwargs) + return apis.CreateUGA3PortResponseSchema().loads(resp) + + def create_uga_forwarder( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUGAForwarder - 创建加速实例转发器,支持HTTPS接入HTTPS回源、HTTPS接入HTTP回源、HTTP接入HTTP回源、TCP接入TCP回源、UDP接入UDP回源、 支持WSS接入WSS回源、WSS接入WS回源、WS接入WS回源 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。 请参考 `GetProjectList接口 `_ + - **UGAId** (str) - (Required) 加速配置实例ID + - **HTTPHTTP** (list) - HTTP接入HTTP回源转发,接入端口。禁用65123端口 + - **HTTPHTTPRS** (list) - HTTP接入HTTP回源转发,源站监听端口 + - **HTTPSHTTP** (list) - HTTPS接入HTTP回源转发,接入端口。禁用65123端口 + - **HTTPSHTTPRS** (list) - HTTPS接入HTTP回源转发,回源端口 + - **HTTPSHTTPS** (list) - HTTPS接入HTTPS回源转发,接入端口。禁用65123端口 + - **HTTPSHTTPSRS** (list) - HTTPS接入HTTPS回源转发,源站监听端口 + - **TCP** (list) - TCP接入端口,禁用65123端口 + - **TCPRS** (list) - TCP回源端口 + - **UDP** (list) - UDP接入端口,禁用65123端口 + - **UDPRS** (list) - UDP回源端口 + - **WSSWS** (list) - WebSocketS接入WebSocket回源转发,接入端口。禁用65123。 + - **WSSWSRS** (list) - WebSocketS接入WebSocket回源转发,源站监听端口。 + - **WSSWSS** (list) - WebSocketS接入WebSocketS回源转发,接入端口。禁用65123。 + - **WSSWSSRS** (list) - WebSocketS接入WebSocketS回源转发,源站监听端口。 + - **WSWS** (list) - WebSocket接入WebSocket回源转发,接入端口。禁用65123。 + - **WSWSRS** (list) - WebSocket接入WebSocket回源转发,源站监听端口 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.CreateUGAForwarderRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUGAForwarder", d, **kwargs) + return apis.CreateUGAForwarderResponseSchema().loads(resp) + + def create_uga_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUGAInstance - 创建全球加速配置项 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID,如org-xxxx。请参考 `GetProjectList接口 `_ + - **Name** (str) - (Required) 加速配置实例名称 + - **Domain** (str) - 加速源域名,IPList和Domain二选一必填 + - **IPList** (str) - 加速源IP,多个IP用英文半角逗号(,)隔开;IPList和Domain二选一必填 + - **TCP** (list) - TCP端口号,已废弃。请使用 CreateUGAForwarder API 创建端口 + - **UDP** (list) - UDP端口号,已废弃。请使用 CreateUGAForwarder API 创建端口 + + **Response** + + - **CName** (str) - 加速域名 用户可把业务域名CName到此域名上。注意:未绑定线路情况时 加速域名解析不出IP。 + - **Message** (str) - 返回信息 + - **UGAId** (str) - 加速配置ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.CreateUGAInstanceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUGAInstance", d, **kwargs) + return apis.CreateUGAInstanceResponseSchema().loads(resp) + + def create_upath(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """CreateUPath - 创建UPath + + **Request** + + - **ProjectId** (str) - (Config) 项目ID,如org-xxxx。请参考 `GetProjectList接口 `_ + - **Bandwidth** (int) - (Required) 当PostPaid为false时,该值为预付费固定带宽;当PostPaid为true时,该值为后付费保底带宽,保底带宽越大可用的上限带宽越大。最小1Mbps,最大带宽由 DescribePathXLineConfig 接口获得。可联系产品团队咨询最大带宽。 + - **LineId** (str) - (Required) 选择的线路,由DescribePathXLineConfig接口提供 + - **Name** (str) - (Required) 名字,便于记忆区分 + - **ChargeType** (str) - 计费模式,默认为Month 按月收费,可选范围['Month','Year','Dynamic'] + - **CouponId** (str) - 代金券Id + - **PathType** (str) - private:专线线路;public:海外SD-WAN。默认为private。 + - **PostPaid** (bool) - 是否开启后付费, 默认为false ,不开启后付费。当ChargeType为Dynamic时不能开启后付费。 + - **Quantity** (int) - 购买周期,ChargeType为Month时,Quantity默认为0代表购买到月底,按时和按年付费该参数必须大于0 + + **Response** + + - **PathId** (str) - 加速线路实例Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.CreateUPathRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUPath", d, **kwargs) + return apis.CreateUPathResponseSchema().loads(resp) + + def delete_global_ssh_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteGlobalSSHInstance - 删除GlobalSSH实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID,如org-xxxx。请参考 `GetProjectList接口 `_ + - **InstanceId** (str) - (Required) 实例Id,资源的唯一标识 + + **Response** + + - **Message** (str) - 提示信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DeleteGlobalSSHInstanceRequestSchema().dumps(d) + + resp = self.invoke("DeleteGlobalSSHInstance", d, **kwargs) + return apis.DeleteGlobalSSHInstanceResponseSchema().loads(resp) + + def delete_path_xssl( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeletePathXSSL - 删除PathX SSL证书 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。请参考 `GetProjectList接口 `_ + - **SSLId** (str) - (Required) SSL证书的ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DeletePathXSSLRequestSchema().dumps(d) + + resp = self.invoke("DeletePathXSSL", d, **kwargs) + return apis.DeletePathXSSLResponseSchema().loads(resp) + + def delete_uga_3instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUGA3Instance - + + **Request** + + - **ProjectId** (str) - (Config) + - **InstanceId** (str) - (Required) + + **Response** + + - **Message** (str) - + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DeleteUGA3InstanceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("DeleteUGA3Instance", d, **kwargs) + return apis.DeleteUGA3InstanceResponseSchema().loads(resp) + + def delete_uga_3port( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUGA3Port - + + **Request** + + - **ProjectId** (str) - (Config) + - **InstanceId** (str) - (Required) + - **TCP** (list) - + + **Response** + + - **Message** (str) - + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DeleteUGA3PortRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("DeleteUGA3Port", d, **kwargs) + return apis.DeleteUGA3PortResponseSchema().loads(resp) + + def delete_uga_forwarder( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUGAForwarder - 删除加速实例转发器 按接入端口删除 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。 请参考 `GetProjectList接口 `_ + - **UGAId** (str) - (Required) 加速配置实例ID + - **HTTPHTTP** (list) - HTTP接入HTTP回源,接入端口。禁用65123端口 + - **HTTPSHTTP** (list) - HTTPS接入HTTP回源, 接入端口。禁用65123端口 + - **HTTPSHTTPS** (list) - HTTPS接入HTTPS回源, 接入端口。禁用65123端口 + - **TCP** (list) - TCP接入端口 + - **UDP** (list) - UDP接入端口 + - **WSSWS** (list) - WebSocketS接入WebSocket回源, 接入端口。禁用65123端口。 + - **WSSWSS** (list) - WebSocketS接入WebSocketS回源, 接入端口。禁用65123端口 + - **WSWS** (list) - WebSocket接入WebSocket回源, 接入端口。禁用65123端口 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DeleteUGAForwarderRequestSchema().dumps(d) + + resp = self.invoke("DeleteUGAForwarder", d, **kwargs) + return apis.DeleteUGAForwarderResponseSchema().loads(resp) + + def delete_uga_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUGAInstance - 删除全球加速服务加速配置 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID,如org-xxxx。请参考 `GetProjectList接口 `_ + - **UGAId** (str) - (Required) 加速配置实例ID + + **Response** + + - **Message** (str) - 消息提示 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DeleteUGAInstanceRequestSchema().dumps(d) + + resp = self.invoke("DeleteUGAInstance", d, **kwargs) + return apis.DeleteUGAInstanceResponseSchema().loads(resp) + + def delete_upath(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """DeleteUPath - 删除UPath + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。请参考 `GetProjectList接口 `_ + - **UPathId** (str) - (Required) 加速线路实例ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DeleteUPathRequestSchema().dumps(d) + + resp = self.invoke("DeleteUPath", d, **kwargs) + return apis.DeleteUPathResponseSchema().loads(resp) + + def describe_global_ssh_area( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeGlobalSSHArea - + + **Request** + + - **ProjectId** (str) - (Config) + - **Region** (str) - (Config) + + **Response** + + - **AreaSet** (list) - 见 **GlobalSSHArea** 模型定义 + - **Message** (str) - + + **Response Model** + + **GlobalSSHArea** + - **Area** (str) - + - **AreaCode** (str) - + - **RegionSet** (list) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeGlobalSSHAreaRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("DescribeGlobalSSHArea", d, **kwargs) + return apis.DescribeGlobalSSHAreaResponseSchema().loads(resp) + + def describe_global_ssh_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeGlobalSSHInstance - 获取GlobalSSH实例列表(传实例ID获取单个实例信息,不传获取项目下全部实例) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID,如org-xxxx。请参考 `GetProjectList接口 `_ + - **InstanceId** (str) - 实例ID,资源唯一标识 + + **Response** + + - **InstanceSet** (list) - 见 **GlobalSSHInfo** 模型定义 + + **Response Model** + + **GlobalSSHInfo** + - **AcceleratingDomain** (str) - GlobalSSH分配的加速域名。 + - **Area** (str) - 被SSH访问的IP所在地区 + - **BandwidthPackage** (int) - globalssh Ultimate带宽包大小 + - **ChargeType** (str) - 支付周期,如Month,Year,Dynamic等 + - **CreateTime** (int) - 资源创建时间戳 + - **DomainStatus** (dict) - 加速域名当前可用性检测结果 HashMap 结构 0表示可用, 1 表示有污染 + - **Expire** (bool) - 是否过期 + - **ExpireTime** (int) - 资源过期时间戳 + - **ExtraDomain** (list) - GlobalSSH分配的其他可用加速域名列表 + - **ForwardRegion** (str) - InstanceType为Basic版本时,需要展示具体分配的转发机房 + - **GlobalSSHPort** (int) - InstanceType等于Free时,由系统自动分配,不等于源站Port值。InstanceType不等于Free时,与源站Port值相同。 + - **IPV6Access** (bool) - 是否开启EIP IPV6 接入,Flase:未开启 + - **InstanceId** (str) - 实例ID,资源唯一标识 + - **InstanceType** (str) - 枚举值:["Enterprise","Basic","Free","Welfare"], 分别代表企业版,基础版本,免费版本,较早的公测免费版 + - **Port** (int) - 源站服务器监听的SSH端口,windows系统为RDP端口 + - **Remark** (str) - 备注信息 + - **TargetIP** (str) - 被SSH访问的源站 IPv4地址。 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeGlobalSSHInstanceRequestSchema().dumps(d) + + resp = self.invoke("DescribeGlobalSSHInstance", d, **kwargs) + return apis.DescribeGlobalSSHInstanceResponseSchema().loads(resp) + + def describe_path_x_line_config( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribePathXLineConfig - 获取全球加速线路信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID,如org-xxxx。不填为默认项目。请参考 `GetProjectList接口 `_ + + **Response** + + - **LineSet** (list) - 见 **UGAALine** 模型定义 + + **Response Model** + + **UGAALine** + - **FlagUnicodeFrom** (str) - 加速国家区域国旗代码 + - **FlagUnicodeTo** (str) - 源站所在国家区域国旗代码 + - **GuaranteedBandwidthProportion** (int) - 后付费线路上限带宽与保底带宽的固定比例,正整数 + - **LineDetail** (list) - 见 **LineDetail** 模型定义 + - **LineFrom** (str) - 线路源 + - **LineFromName** (str) - 线路源中文名称 + - **LineId** (str) - 线路ID,可用于创建加速线路资源 + - **LineTo** (str) - 线路目的 + - **LineToName** (str) - 线路目的中文名称 + - **MaxBandwidth** (int) - 预付费线路可售最大带宽 + - **PostPaidMaxBandwidth** (int) - 后付费线路最大可售带宽 + - **RegionCategoryFrom** (str) - 加速国家区域所属地区代码 + - **RegionCategoryTo** (str) - 源站所在国家区域所属地区代码 + - **SupportPublicNetwork** (bool) - true:支持SD-WAN线路;false:不支持SD-WAN线路 + + + **LineDetail** + - **LineFrom** (str) - 线路源 + - **LineFromName** (str) - 线路源中文名称 + - **LineId** (str) - 线路计费Id + - **LineTo** (str) - 线路目的 + - **LineToName** (str) - 线路目的中文名称 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribePathXLineConfigRequestSchema().dumps(d) + + resp = self.invoke("DescribePathXLineConfig", d, **kwargs) + return apis.DescribePathXLineConfigResponseSchema().loads(resp) + + def describe_path_xssl( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribePathXSSL - 获取SSL证书信息,支持分页,支持按证书名称 证书域名模糊搜索 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。请参考 `GetProjectList接口 `_ + - **Limit** (int) - 最大返回条数,默认100,最大400 + - **Offset** (int) - 偏移值 默认为0 + - **SSLId** (str) - SSL证书的Id,不传分页获取证书列表 + - **SearchValue** (str) - 不为空则按证书名称、证书域名模糊搜索 分页返回结果 + + **Response** + + - **DataSet** (list) - 见 **PathXSSLSet** 模型定义 + - **TotalCount** (int) - 符合条件的证书总数 + + **Response Model** + + **PathXSSLSet** + - **CreateTime** (int) - SSL证书的创建时间 时间戳 + - **ExpireTime** (int) - 证书过期时间 时间戳 + - **SSLBindedTargetSet** (list) - 见 **SSLBindedTargetSet** 模型定义 + - **SSLContent** (str) - SSL证书内容 + - **SSLId** (str) - SSL证书的Id + - **SSLMD5** (str) - SSL证书(用户证书、私钥、ca证书合并)内容md5值 + - **SSLName** (str) - SSL证书的名字 + - **SourceType** (int) - 证书来源,0:用户上传 1: 免费颁发 + - **SubjectName** (str) - 证书域名 + + + **SSLBindedTargetSet** + - **ResourceId** (str) - SSL证书绑定到的实例ID + - **ResourceName** (str) - SSL证书绑定到的实例名称 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribePathXSSLRequestSchema().dumps(d) + + resp = self.invoke("DescribePathXSSL", d, **kwargs) + return apis.DescribePathXSSLResponseSchema().loads(resp) + + def describe_uga_3area( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUGA3Area - + + **Request** + + - **ProjectId** (str) - (Config) + - **Domain** (str) - + - **IPList** (str) - + + **Response** + + - **AreaSet** (list) - 见 **ForwardArea** 模型定义 + - **Message** (str) - + + **Response Model** + + **ForwardArea** + - **Area** (str) - + - **AreaCode** (str) - + - **ContinentCode** (str) - + - **CountryCode** (str) - + - **FlagEmoji** (str) - + - **FlagUnicode** (str) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUGA3AreaRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("DescribeUGA3Area", d, **kwargs) + return apis.DescribeUGA3AreaResponseSchema().loads(resp) + + def describe_uga_3instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUGA3Instance - + + **Request** + + - **ProjectId** (str) - (Config) + - **InstanceId** (str) - + - **Limit** (int) - + - **Offset** (int) - + + **Response** + + - **ForwardInstanceInfos** (list) - 见 **ForwardInfo** 模型定义 + - **TotalCount** (int) - + + **Response Model** + + **ForwardInfo** + - **AccelerationArea** (str) - + - **AccelerationAreaInfos** (list) - 见 **AccelerationAreaInfos** 模型定义 + - **AccelerationAreaName** (str) - + - **Bandwidth** (int) - + - **CName** (str) - + - **ChargeType** (str) - + - **CreateTime** (int) - + - **Domain** (str) - + - **EgressIpList** (list) - 见 **OutPublicIpInfo** 模型定义 + - **ExpireTime** (int) - + - **IPList** (list) - + - **InstanceId** (str) - + - **Name** (str) - + - **OriginArea** (str) - + - **OriginAreaCode** (str) - + - **PortSets** (list) - 见 **ForwardTask** 模型定义 + - **Remark** (str) - + + + **AccelerationAreaInfos** + - **AccelerationArea** (str) - + - **AccelerationNodes** (list) - 见 **SrcAreaInfo** 模型定义 + + + **SrcAreaInfo** + - **Area** (str) - + - **AreaCode** (str) - + - **FlagEmoji** (str) - + - **FlagUnicode** (str) - + + + **OutPublicIpInfo** + - **Area** (str) - + - **IP** (str) - + + + **ForwardTask** + - **Port** (int) - + - **Protocol** (str) - + - **RSPort** (int) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUGA3InstanceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("DescribeUGA3Instance", d, **kwargs) + return apis.DescribeUGA3InstanceResponseSchema().loads(resp) + + def describe_uga_3optimization( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUGA3Optimization - + + **Request** + + - **ProjectId** (str) - (Config) + - **AreaCode** (str) - (Required) + - **AccelerationArea** (str) - + - **TimeRange** (str) - + + **Response** + + - **AccelerationInfos** (list) - 见 **AccelerationInfo** 模型定义 + + **Response Model** + + **AccelerationInfo** + - **AccelerationArea** (str) - + - **AccelerationName** (str) - + - **NodeInfo** (list) - 见 **NodeDelays** 模型定义 + + + **NodeDelays** + - **Area** (str) - + - **AreaCode** (str) - + - **CountryCode** (str) - + - **FlagEmoji** (str) - + - **FlagUnicode** (str) - + - **Latency** (float) - + - **LatencyInternet** (float) - + - **LatencyOptimization** (float) - + - **Loss** (float) - + - **LossInternet** (float) - + - **LossOptimization** (float) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUGA3OptimizationRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("DescribeUGA3Optimization", d, **kwargs) + return apis.DescribeUGA3OptimizationResponseSchema().loads(resp) + + def describe_uga_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUGAInstance - 获取全球加速服务加速配置信息,指定实例ID返回单个实例。未指定实例ID时 指定分页参数 则按创建时间降序 返回记录 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。请参考 `GetProjectList接口 `_ + - **Limit** (int) - 返回的最大条数,默认为100,最大值400 + - **Offset** (int) - 偏移量,默认为0 + - **UGAId** (str) - 加速配置实例ID,如果传了实例ID 则返回匹配实例ID的记录;如果没传则返回 ProjectId 下全部实例且符合分页要求 + + **Response** + + - **TotalCount** (int) - 符合条件的总数 + - **UGAList** (list) - 见 **UGAAInfo** 模型定义 + + **Response Model** + + **UGAAInfo** + - **CName** (str) - 加速域名,请在加速区域配置您的业务域名的CName记录值为加速域名 + - **Domain** (str) - 源站域名 + - **IPList** (list) - 源站IP列表,多个值由半角英文逗号相隔 + - **L4ForwarderSet** (list) - 见 **UGAL4Forwarder** 模型定义 + - **L7ForwarderSet** (list) - 见 **UGAL7Forwarder** 模型定义 + - **Location** (str) - 源站所在区域,加速实例在绑定线路后会自动设置该值。console页面上通过该值过滤加速实例可以绑定的upath实例。注意:缺少该值会导致在console上无法修改线路 + - **OutPublicIpList** (list) - 见 **OutPublicIpInfo** 模型定义 + - **TaskSet** (list) - 见 **UGAATask** 模型定义 + - **UGAId** (str) - 加速配置实例ID + - **UGAName** (str) - 加速配置名称 + - **UPathSet** (list) - 见 **UPathSet** 模型定义 + + + **UGAL4Forwarder** + - **Port** (int) - 接入端口 + - **Protocol** (str) - 转发协议,枚举值["TCP","UDP","HTTPHTTP","HTTPSHTTP","HTTPSHTTPS"]。TCP和UDP代表四层转发,其余为七层转发 + - **RSPort** (int) - RSPort,源站监听端口 + + + **UGAL7Forwarder** + - **Port** (int) - 接入端口 + - **Protocol** (str) - 转发协议,枚举值["TCP","UDP","HTTPHTTP","HTTPSHTTP","HTTPSHTTPS"]。TCP和UDP代表四层转发,其余为七层转发 + - **RSPort** (int) - RSPort,源站监听端口 + - **SSLId** (str) - 证书ID + - **SSLName** (str) - 证书名称 + + + **OutPublicIpInfo** + - **Area** (str) - 线路回源节点机房代号 + - **IP** (str) - 线路回源节点EIP + + + **UGAATask** + - **Port** (int) - 接入端口 + - **Protocol** (str) - 转发协议,枚举值["TCP","UDP","HTTPHTTP","HTTPSHTTP","HTTPSHTTPS"]。TCP和UDP代表四层转发,其余为七层转发 + + + **UPathSet** + - **Bandwidth** (int) - 带宽 Mbps, 1~800Mbps + - **LineFrom** (str) - 线路起点英文代号,加速区域 + - **LineFromName** (str) - 线路起点中文名字,加速区域 + - **LineId** (str) - 线路ID + - **LineTo** (str) - 线路对端英文代号,源站区域 + - **LineToName** (str) - 线路对端中文名字,源站区域 + - **UPathId** (str) - UPath 实例ID + - **UPathName** (str) - UPath名字 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUGAInstanceRequestSchema().dumps(d) + + resp = self.invoke("DescribeUGAInstance", d, **kwargs) + return apis.DescribeUGAInstanceResponseSchema().loads(resp) + + def describe_upath( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUPath - 获取加速线路信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。请参考 `GetProjectList接口 `_ + - **UPathId** (str) - 如果不填参数 返回 ProjectId 下所有的线路资源,填此参数则返回upath实例ID匹配的线路 + + **Response** + + - **UPathSet** (list) - 见 **UPathInfo** 模型定义 + + **Response Model** + + **UPathInfo** + - **Bandwidth** (int) - 带宽,单位Mbps + - **ChargeType** (str) - 计费模式,默认为Month 按月收费,可选范围['Month','Year','Dynamic'] + - **CreateTime** (int) - UPath创建的时间,10位时间戳 + - **ExpireTime** (int) - UPath的过期时间,10位时间戳 + - **LineFromName** (str) - 线路入口名称 + - **LineId** (str) - 选择的线路 + - **LineToName** (str) - 线路出口名称 + - **Name** (str) - UPath实例名字 + - **OutPublicIpList** (list) - 见 **OutPublicIpInfo** 模型定义 + - **PostPaid** (bool) - 是否为后付费实例 + - **UGAList** (list) - 见 **PathXUGAInfo** 模型定义 + - **UPathId** (str) - UPath加速线路实例ID + + + **OutPublicIpInfo** + - **Area** (str) - 线路回源节点机房代号 + - **IP** (str) - 线路回源节点EIP + + + **PathXUGAInfo** + - **Domain** (str) - 源站域名 + - **IPList** (list) - 源站IP列表,多个值由半角英文逗号相隔 + - **UGAId** (str) - 加速配置ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUPathRequestSchema().dumps(d) + + resp = self.invoke("DescribeUPath", d, **kwargs) + return apis.DescribeUPathResponseSchema().loads(resp) + + def describe_upath_template( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUPathTemplate - 查询UPath的监控模板 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。请参考 `GetProjectList接口 `_ + - **UPathId** (str) - (Required) 加速线路实例ID,格式 upath-xxxx + + **Response** + + - **DataSet** (list) - 见 **AlarmRuler** 模型定义 + + **Response Model** + + **AlarmRuler** + - **AlarmFrequency** (int) - 告警探测周期,单位秒 + - **AlarmStrategy** (str) - 收敛策略,可选范围 ['Exponential','Continuous','Once'],分别对应指数递增、连续告警、单次告警 + - **AlarmTemplateRuleId** (int) - 告警模板策略ID + - **Compare** (str) - 比较策略,可选 ['GE','LE'] 分别代表不小于和不大于 + - **ContactGroupId** (int) - 联系组ID + - **MetricName** (str) - 告警指标名称, 所有n的个数必须一致。目前仅允许以下四项:UpathNetworkOut:出向带宽,UpathNetworkIn:入向带宽,UpathNetworkOutUsage:出向带宽使用率,UpathNetworkInUsage:入向带宽使用率 + - **ResourceType** (str) - 资源类型 + - **Threshold** (int) - 告警阈值,带宽使用率的阈值范围是[50,100]的正整数,带宽告警阈值为1000000的倍数, 如大于2Mbps则告警 阈值应该传 2000000 + - **TriggerCount** (int) - 告警触发周期(次数) + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUPathTemplateRequestSchema().dumps(d) + + resp = self.invoke("DescribeUPathTemplate", d, **kwargs) + return apis.DescribeUPathTemplateResponseSchema().loads(resp) + + def get_global_ssh_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetGlobalSSHPrice - 获取GlobalSSH价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID,如org-xxxx。请参考 `GetProjectList接口 `_ + - **ChargeType** (str) - 计费类型:Dynamic,Month,Year + - **InstanceType** (str) - 版本类型。枚举值,Enterprise:企业版;Basic:基础版。可不填,默认为Basic。 + - **Quantity** (int) - 购买周期,如果ChargeType为Month,Quantity默认为0;其他情况必须为大于0的整数 + + **Response** + + - **Price** (float) - 价格,返回单位为元 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetGlobalSSHPriceRequestSchema().dumps(d) + + resp = self.invoke("GetGlobalSSHPrice", d, **kwargs) + return apis.GetGlobalSSHPriceResponseSchema().loads(resp) + + def get_global_ssh_traffic( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetGlobalSSHTraffic - 获取GlobalSSH流量统计数据 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID,如org-xxxx。请参考 `GetProjectList接口 `_ + - **BeginTime** (int) - (Required) 查询起始时间,如1525017600 + - **EndTime** (int) - (Required) 查询结束时间,如1525103999 + - **UGAId** (str) - (Required) 资源ID,如uga-as5daw + + **Response** + + - **DataSet** (list) - 见 **TrafficDaily** 模型定义 + - **TrafficDailyRecently** (list) - 见 **TrafficDailyRecently** 模型定义 + - **UGAId** (str) - 资源ID + + **Response Model** + + **TrafficDaily** + - **BillingState** (str) - Yes:已扣费, No:未扣费 + - **Date** (int) - 日期 + - **Traffic** (int) - 流量(单位GB) + + + **TrafficDailyRecently** + - **Day** (str) - 日期 + - **TrafficUnitGB** (str) - 日流量(单位GB) + - **TrafficUnitMB** (str) - 日流量(单位MB) + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetGlobalSSHTrafficRequestSchema().dumps(d) + + resp = self.invoke("GetGlobalSSHTraffic", d, **kwargs) + return apis.GetGlobalSSHTrafficResponseSchema().loads(resp) + + def get_global_ssh_update_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetGlobalSSHUpdatePrice - 获取GlobalSSH升级价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID,如org-xxxx。请参考 `GetProjectList接口 `_ + - **InstanceType** (str) - (Required) 升级后的实例类型。枚举值,Enterprise:企业版;Basic:基础版。 + - **ChargeType** (str) - 计费类型:Dynamic,Month,Year。从免费版升级到付费版必须传,其他情况不需要传 + - **InstanceId** (str) - 实例ID,唯一资源标识。从免费版升级到付费版可不填,其他情况必填。 + - **Quantity** (int) - 购买周期,如果ChargeType为Month,Quantity可以不填默认为0;其他情况必须为正整数。 + + **Response** + + - **Price** (float) - 价格,返回单位为元。正数表示付费升级,负数表示降级退费。 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetGlobalSSHUpdatePriceRequestSchema().dumps(d) + + resp = self.invoke("GetGlobalSSHUpdatePrice", d, **kwargs) + return apis.GetGlobalSSHUpdatePriceResponseSchema().loads(resp) + + def get_path_x_metric( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetPathXMetric - 获取全球加速监控信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。请参考 `GetProjectList接口 `_ + - **BeginTime** (int) - (Required) 查询起始时间,10位长度时间戳 + - **EndTime** (int) - (Required) 查询结束时间,10位长度时间戳 + - **LineId** (str) - (Required) 具体线路id,调用DescribePathXLineConfig接口获取线路列表 + - **MetricName** (list) - (Required) 查询监控的指标项。目前仅允许以下四项:NetworkOut:出向带宽,NetworkIn:入向带宽,NetworkOutUsage:出向带宽使用率,NetworkInUsage:入向带宽使用率 + - **ResourceId** (str) - (Required) ResourceId,如upath ID 和 uga ID + - **ResourceType** (str) - (Required) upath:加速线路,uga:加速实例 + + **Response** + + - **DataSet** (dict) - 见 **MetricPeriod** 模型定义 + + **Response Model** + + **MetricPeriod** + - **NetworkIn** (list) - 见 **MatricPoint** 模型定义 + - **NetworkInUsage** (list) - 见 **MatricPoint** 模型定义 + - **NetworkOut** (list) - 见 **MatricPoint** 模型定义 + - **NetworkOutUsage** (list) - 见 **MatricPoint** 模型定义 + + + **MatricPoint** + - **Timestamp** (int) - 时间戳 + - **Value** (int) - 监控点数值 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetPathXMetricRequestSchema().dumps(d) + + resp = self.invoke("GetPathXMetric", d, **kwargs) + return apis.GetPathXMetricResponseSchema().loads(resp) + + def get_uga_3metric( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUGA3Metric - + + **Request** + + - **ProjectId** (str) - (Config) + - **BeginTime** (int) - (Required) + - **EndTime** (int) - (Required) + - **InstanceId** (str) - (Required) + - **AreaCode** (str) - + - **IsSubline** (bool) - + - **MetricName** (list) - + + **Response** + + - **DataSet** (dict) - 见 **UGA3Metric** 模型定义 + + **Response Model** + + **UGA3Metric** + - **ConnectCount** (list) - 见 **MatricPoint** 模型定义 + - **ConnectCountSubline** (list) - 见 **MatricPoint** 模型定义 + - **Delay** (list) - 见 **MatricPoint** 模型定义 + - **DelayPromote** (list) - 见 **MatricPoint** 模型定义 + - **DelayPromoteSubline** (list) - 见 **MatricPoint** 模型定义 + - **DelaySubline** (list) - 见 **MatricPoint** 模型定义 + - **NetworkIn** (list) - 见 **MatricPoint** 模型定义 + - **NetworkInSubline** (list) - 见 **MatricPoint** 模型定义 + - **NetworkInUsage** (list) - 见 **MatricPoint** 模型定义 + - **NetworkOut** (list) - 见 **MatricPoint** 模型定义 + - **NetworkOutSubline** (list) - 见 **MatricPoint** 模型定义 + - **NetworkOutUsage** (list) - 见 **MatricPoint** 模型定义 + + + **MatricPoint** + - **Timestamp** (int) - + - **Value** (int) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUGA3MetricRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("GetUGA3Metric", d, **kwargs) + return apis.GetUGA3MetricResponseSchema().loads(resp) + + def get_uga_3price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUGA3Price - + + **Request** + + - **ProjectId** (str) - (Config) + - **AreaCode** (str) - (Required) + - **Bandwidth** (int) - (Required) + - **AccelerationArea** (str) - + - **ChargeType** (str) - + - **Quantity** (int) - + + **Response** + + - **UGA3Price** (list) - 见 **UGA3Price** 模型定义 + + **Response Model** + + **UGA3Price** + - **AccelerationArea** (str) - + - **AccelerationAreaName** (str) - + - **AccelerationBandwidthPrice** (float) - + - **AccelerationForwarderPrice** (float) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUGA3PriceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("GetUGA3Price", d, **kwargs) + return apis.GetUGA3PriceResponseSchema().loads(resp) + + def get_uga_3update_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUGA3UpdatePrice - + + **Request** + + - **ProjectId** (str) - (Config) + - **InstanceId** (str) - (Required) + - **AccelerationArea** (str) - + - **AreaCode** (str) - + - **Bandwidth** (int) - + + **Response** + + - **Price** (float) - + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUGA3UpdatePriceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("GetUGA3UpdatePrice", d, **kwargs) + return apis.GetUGA3UpdatePriceResponseSchema().loads(resp) + + def modify_global_ssh_origin_info( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyGlobalSSHOriginInfo - 修改GlobalSSH 源站信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID,如org-xxxx。请参考 `GetProjectList接口 `_ + - **InstanceId** (str) - (Required) 资源ID:ugaa-xxxxxxx + - **InstanceType** (str) - (Required) Free,Basic,Enterprise,Ultimate + - **RsIP** (str) - (Required) 被SSH访问的源站IP + - **Area** (str) - 填写支持SSH访问IP的地区名称,如“洛杉矶”,“新加坡”,“香港”,“东京”,“华盛顿”,“法兰克福”。Area和AreaCode两者必填一个 + - **AreaCode** (str) - AreaCode, 区域航空港国际通用代码。Area和AreaCode两者必填一个 + + **Response** + + - **Message** (str) - 提示信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyGlobalSSHOriginInfoRequestSchema().dumps(d) + + resp = self.invoke("ModifyGlobalSSHOriginInfo", d, **kwargs) + return apis.ModifyGlobalSSHOriginInfoResponseSchema().loads(resp) + + def modify_global_ssh_port( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyGlobalSSHPort - 修改GlobalSSH端口 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID,如org-xxxx。请参考 `GetProjectList接口 `_ + - **InstanceId** (str) - (Required) 实例ID,资源唯一标识。当前仅收费版GlobalSSH实例可以修改端口。 + - **Port** (int) - (Required) 源站服务器监听的SSH端口号。收费版本端口范围[1,65535]且不能为80,443,65123端口。免费版不支持修改端口。 + + **Response** + + - **Message** (str) - 提示信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyGlobalSSHPortRequestSchema().dumps(d) + + resp = self.invoke("ModifyGlobalSSHPort", d, **kwargs) + return apis.ModifyGlobalSSHPortResponseSchema().loads(resp) + + def modify_global_ssh_remark( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyGlobalSSHRemark - 修改GlobalSSH备注 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID,如org-xxxx。请参考 `GetProjectList接口 `_ + - **InstanceId** (str) - (Required) 实例ID,资源唯一标识 + - **Remark** (str) - 备注信息,不填默认为空字符串 + + **Response** + + - **Message** (str) - 接口返回消息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyGlobalSSHRemarkRequestSchema().dumps(d) + + resp = self.invoke("ModifyGlobalSSHRemark", d, **kwargs) + return apis.ModifyGlobalSSHRemarkResponseSchema().loads(resp) + + def modify_global_ssh_type( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyGlobalSSHType - 修改GlobalSSH实例类型,仅支持低版本升级到高版本,不支持高版本降级到低版本 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID,如org-xxxx。请参考 `GetProjectList接口 `_ + - **InstanceId** (str) - (Required) 实例ID,资源唯一标识 + - **InstanceType** (str) - (Required) 取值范围["Enterprise","Basic"],分别对应企业版和基础版,表示升级后的实例类型。比如从Free版本升级为Basic版或Enterprise版,不可从收费版降级为免费版,或从企业版降级为基础版 + - **ChargeType** (str) - 支付方式,如按月、按年、按时 + - **CouponId** (str) - 可抵扣费用的券,通常不使用 + - **Quantity** (str) - 购买时间,当ChargeType为Month,Quantity为0代表购买到月底 + + **Response** + + - **Message** (str) - 提示信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyGlobalSSHTypeRequestSchema().dumps(d) + + resp = self.invoke("ModifyGlobalSSHType", d, **kwargs) + return apis.ModifyGlobalSSHTypeResponseSchema().loads(resp) + + def modify_uga_3bandwidth( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUGA3Bandwidth - + + **Request** + + - **ProjectId** (str) - (Config) + - **InstanceId** (str) - (Required) + - **Bandwidth** (int) - + - **CouponId** (str) - + + **Response** + + - **Message** (str) - + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyUGA3BandwidthRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("ModifyUGA3Bandwidth", d, **kwargs) + return apis.ModifyUGA3BandwidthResponseSchema().loads(resp) + + def modify_uga_3instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUGA3Instance - + + **Request** + + - **ProjectId** (str) - (Config) + - **InstanceId** (str) - (Required) + - **Name** (str) - + - **Remark** (str) - + + **Response** + + - **Message** (str) - + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyUGA3InstanceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("ModifyUGA3Instance", d, **kwargs) + return apis.ModifyUGA3InstanceResponseSchema().loads(resp) + + def modify_uga_3origin_info( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUGA3OriginInfo - + + **Request** + + - **ProjectId** (str) - (Config) + - **InstanceId** (str) - (Required) + - **OriginDomain** (str) - (Required) + - **OriginIPList** (str) - (Required) + + **Response** + + - **Message** (str) - + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyUGA3OriginInfoRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("ModifyUGA3OriginInfo", d, **kwargs) + return apis.ModifyUGA3OriginInfoResponseSchema().loads(resp) + + def modify_uga_3port( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUGA3Port - + + **Request** + + - **ProjectId** (str) - (Config) + - **InstanceId** (str) - (Required) + - **TCP** (list) - + - **TCPRS** (list) - + + **Response** + + - **Message** (str) - + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyUGA3PortRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("ModifyUGA3Port", d, **kwargs) + return apis.ModifyUGA3PortResponseSchema().loads(resp) + + def modify_upath_bandwidth( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUPathBandwidth - 修改加速线路带宽 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Bandwidth** (int) - (Required) 线路带宽,单位Mbps。最小1Mbps,最大带宽由 DescribePathXLineConfig 接口获得。如需更大带宽,请联系产品团队。 + - **UPathId** (str) - (Required) UPath 加速线路实例Id + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyUPathBandwidthRequestSchema().dumps(d) + + resp = self.invoke("ModifyUPathBandwidth", d, **kwargs) + return apis.ModifyUPathBandwidthResponseSchema().loads(resp) + + def modify_upath_template( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUPathTemplate - 修改UPath监控告警项 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。请参考 `GetProjectList接口 `_ + - **UPathId** (str) - (Required) 加速线路实例ID + - **AlarmFrequency** (list) - 告警探测周期,单位:秒 + - **AlarmStrategy** (list) - 收敛策略,可选范围 ['Exponential','Continuous','Once'],分别对应指数递增、连续告警、单次告警 + - **Compare** (list) - 比较策略,可选 ['GE','LE'] 分别代表不小于和不大于 + - **ContactGroupId** (list) - 告警组id + - **MetricName** (list) - 告警指标名称, 所有n的个数必须一致。目前仅允许以下四项:UpathNetworkOut:出向带宽,UpathNetworkIn:入向带宽,UpathNetworkOutUsage:出向带宽使用率,UpathNetworkInUsage:入向带宽使用率 + - **Threshold** (list) - 告警阈值,带宽使用率的阈值范围是[50,100]的正整数,带宽告警阈值为1000000的倍数, 如大于2Mbps则告警 阈值应该传 2000000 + - **TriggerCount** (list) - 告警触发周期(次数) + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyUPathTemplateRequestSchema().dumps(d) + + resp = self.invoke("ModifyUPathTemplate", d, **kwargs) + return apis.ModifyUPathTemplateResponseSchema().loads(resp) + + def uga_bind_upath( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UGABindUPath - UGA绑定UPath + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。请参考 `GetProjectList接口 `_ + - **UGAId** (str) - (Required) 加速配置实例ID,格式uga-xxxx + - **UPathId** (str) - (Required) 加速线路实例ID,格式upath-xxx + - **CouponId** (str) - 代金券 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.UGABindUPathRequestSchema().dumps(d) + + resp = self.invoke("UGABindUPath", d, **kwargs) + return apis.UGABindUPathResponseSchema().loads(resp) + + def uga_un_bind_upath( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UGAUnBindUPath - UGA与UPath解绑 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。请参考 `GetProjectList接口 `_ + - **UGAId** (str) - (Required) 加速配置实例ID 格式uga-xxx + - **UPathId** (str) - (Required) 加速线路实例ID 格式upath-xxx + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.UGAUnBindUPathRequestSchema().dumps(d) + + resp = self.invoke("UGAUnBindUPath", d, **kwargs) + return apis.UGAUnBindUPathResponseSchema().loads(resp) + + def un_bind_path_xssl( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UnBindPathXSSL - 解绑PathX SSL 证书 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。 请参考 `GetProjectList接口 `_ + - **Port** (list) - (Required) 解绑SSL证书的HTTPS端口。Port.0 Port.1格式 端口错误则解绑失败。 + - **SSLId** (str) - (Required) SSL证书ID。 + - **UGAId** (str) - (Required) UGA实例ID。 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.UnBindPathXSSLRequestSchema().dumps(d) + + resp = self.invoke("UnBindPathXSSL", d, **kwargs) + return apis.UnBindPathXSSLResponseSchema().loads(resp) + + def update_path_x_whitelist( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdatePathXWhitelist - 更新入口白名单,仅限GlobalSSH 实例使用。其他uga-实例不生效 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID,如org-xxxx。请参考 `GetProjectList接口 `_ + - **InstanceId** (str) - (Required) GlobalSSH实例ID,资源唯一标识 + - **Whitelist** (list) - 白名单规则,例如 "Whitelist.0": "192.168.1.1/24|tcp|22","Whitelist.1": "192.168.1.2|tcp|8080:8090",第一个参数为ip或ip段,第二个参数代表协议(tcp/udp),第三个参数代表端口号或端口范围(使用 ':' 隔开);可以添加多条规则(递增Whitelist.n字段内的n值);此接口需要列出全部规则,例如不填则为清空白名单规则,如若需要增量添加,使用InsertPathXWhitelist接口,globalssh 没有端口范围:端口设置成加速端口,协议设置成tcp:ip|tcp|加速端口 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.UpdatePathXWhitelistRequestSchema().dumps(d) + + resp = self.invoke("UpdatePathXWhitelist", d, **kwargs) + return apis.UpdatePathXWhitelistResponseSchema().loads(resp) diff --git a/ucloud/services/pathx/schemas/apis.py b/ucloud/services/pathx/schemas/apis.py index 2a3f5f80..370f6354 100644 --- a/ucloud/services/pathx/schemas/apis.py +++ b/ucloud/services/pathx/schemas/apis.py @@ -3,11 +3,34 @@ from ucloud.core.typesystem import schema, fields from ucloud.services.pathx.schemas import models - """ PathX API Schema """ +""" +API: BindPathXSSL + +绑定PathX SSL证书 +""" + + +class BindPathXSSLRequestSchema(schema.RequestSchema): + """BindPathXSSL - 绑定PathX SSL证书""" + + fields = { + "Port": fields.List(fields.Int()), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "SSLId": fields.Str(required=True, dump_to="SSLId"), + "UGAId": fields.Str(required=True, dump_to="UGAId"), + } + + +class BindPathXSSLResponseSchema(schema.ResponseSchema): + """BindPathXSSL - 绑定PathX SSL证书""" + + fields = {} + + """ API: CreateGlobalSSHInstance @@ -16,14 +39,18 @@ class CreateGlobalSSHInstanceRequestSchema(schema.RequestSchema): - """ CreateGlobalSSHInstance - 创建GlobalSSH实例 - """ + """CreateGlobalSSHInstance - 创建GlobalSSH实例""" fields = { "Area": fields.Str(required=True, dump_to="Area"), "AreaCode": fields.Str(required=True, dump_to="AreaCode"), + "BandwidthPackage": fields.Int( + required=False, dump_to="BandwidthPackage" + ), "ChargeType": fields.Str(required=False, dump_to="ChargeType"), "CouponId": fields.Str(required=False, dump_to="CouponId"), + "ForwardRegion": fields.Str(required=False, dump_to="ForwardRegion"), + "InstanceType": fields.Str(required=False, dump_to="InstanceType"), "Port": fields.Int(required=True, dump_to="Port"), "ProjectId": fields.Str(required=True, dump_to="ProjectId"), "Quantity": fields.Int(required=False, dump_to="Quantity"), @@ -33,15 +60,213 @@ class CreateGlobalSSHInstanceRequestSchema(schema.RequestSchema): class CreateGlobalSSHInstanceResponseSchema(schema.ResponseSchema): - """ CreateGlobalSSHInstance - 创建GlobalSSH实例 - """ + """CreateGlobalSSHInstance - 创建GlobalSSH实例""" fields = { "AcceleratingDomain": fields.Str( required=False, load_from="AcceleratingDomain" ), "InstanceId": fields.Str(required=True, load_from="InstanceId"), + "Message": fields.Str( + required=False, load_from="Message" + ), # Deprecated, will be removed at 1.0 + } + + +""" +API: CreatePathXSSL + +创建SSL证书,可以把整个 Pem 证书内容传到SSLContent,或者把证书、私钥、CA证书分别传过来 +""" + + +class CreatePathXSSLRequestSchema(schema.RequestSchema): + """CreatePathXSSL - 创建SSL证书,可以把整个 Pem 证书内容传到SSLContent,或者把证书、私钥、CA证书分别传过来""" + + fields = { + "CACert": fields.Str(required=False, dump_to="CACert"), + "PrivateKey": fields.Str(required=False, dump_to="PrivateKey"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "SSLContent": fields.Str(required=False, dump_to="SSLContent"), + "SSLName": fields.Str(required=True, dump_to="SSLName"), + "SSLType": fields.Str(required=False, dump_to="SSLType"), + "UserCert": fields.Str(required=False, dump_to="UserCert"), + } + + +class CreatePathXSSLResponseSchema(schema.ResponseSchema): + """CreatePathXSSL - 创建SSL证书,可以把整个 Pem 证书内容传到SSLContent,或者把证书、私钥、CA证书分别传过来""" + + fields = { + "SSLId": fields.Str(required=True, load_from="SSLId"), + } + + +""" +API: CreateUGA3Instance + + +""" + + +class CreateUGA3InstanceRequestSchema(schema.RequestSchema): + """CreateUGA3Instance -""" + + fields = { + "AccelerationArea": fields.Str( + required=False, dump_to="AccelerationArea" + ), + "AreaCode": fields.Str(required=False, dump_to="AreaCode"), + "Bandwidth": fields.Int(required=True, dump_to="Bandwidth"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "Name": fields.Str(required=False, dump_to="Name"), + "OriginDomain": fields.Str(required=False, dump_to="OriginDomain"), + "OriginIPList": fields.Str(required=False, dump_to="OriginIPList"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Remark": fields.Str(required=False, dump_to="Remark"), + } + + +class CreateUGA3InstanceResponseSchema(schema.ResponseSchema): + """CreateUGA3Instance -""" + + fields = { + "CName": fields.Str(required=False, load_from="CName"), + "InstanceId": fields.Str(required=True, load_from="InstanceId"), + } + + +""" +API: CreateUGA3Port + + +""" + + +class CreateUGA3PortRequestSchema(schema.RequestSchema): + """CreateUGA3Port -""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "TCP": fields.List(fields.Int()), + "TCPRS": fields.List(fields.Int()), + } + + +class CreateUGA3PortResponseSchema(schema.ResponseSchema): + """CreateUGA3Port -""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: CreateUGAForwarder + +创建加速实例转发器,支持HTTPS接入HTTPS回源、HTTPS接入HTTP回源、HTTP接入HTTP回源、TCP接入TCP回源、UDP接入UDP回源、 支持WSS接入WSS回源、WSS接入WS回源、WS接入WS回源 +""" + + +class CreateUGAForwarderRequestSchema(schema.RequestSchema): + """CreateUGAForwarder - 创建加速实例转发器,支持HTTPS接入HTTPS回源、HTTPS接入HTTP回源、HTTP接入HTTP回源、TCP接入TCP回源、UDP接入UDP回源、 支持WSS接入WSS回源、WSS接入WS回源、WS接入WS回源""" + + fields = { + "HTTPHTTP": fields.List(fields.Int()), + "HTTPHTTPRS": fields.List(fields.Int()), + "HTTPSHTTP": fields.List(fields.Int()), + "HTTPSHTTPRS": fields.List(fields.Int()), + "HTTPSHTTPS": fields.List(fields.Int()), + "HTTPSHTTPSRS": fields.List(fields.Int()), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "TCP": fields.List(fields.Int()), + "TCPRS": fields.List(fields.Int()), + "UDP": fields.List(fields.Int()), + "UDPRS": fields.List(fields.Int()), + "UGAId": fields.Str(required=True, dump_to="UGAId"), + "WSSWS": fields.List(fields.Int()), + "WSSWSRS": fields.List(fields.Int()), + "WSSWSS": fields.List(fields.Int()), + "WSSWSSRS": fields.List(fields.Int()), + "WSWS": fields.List(fields.Int()), + "WSWSRS": fields.List(fields.Int()), + } + + +class CreateUGAForwarderResponseSchema(schema.ResponseSchema): + """CreateUGAForwarder - 创建加速实例转发器,支持HTTPS接入HTTPS回源、HTTPS接入HTTP回源、HTTP接入HTTP回源、TCP接入TCP回源、UDP接入UDP回源、 支持WSS接入WSS回源、WSS接入WS回源、WS接入WS回源""" + + fields = { + "Message": fields.Str( + required=True, load_from="Message" + ), # Deprecated, will be removed at 1.0 + } + + +""" +API: CreateUGAInstance + +创建全球加速配置项 +""" + + +class CreateUGAInstanceRequestSchema(schema.RequestSchema): + """CreateUGAInstance - 创建全球加速配置项""" + + fields = { + "Domain": fields.Str(required=False, dump_to="Domain"), + "IPList": fields.Str(required=False, dump_to="IPList"), + "Name": fields.Str(required=True, dump_to="Name"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "TCP": fields.List(fields.Str()), + "UDP": fields.List(fields.Str()), + } + + +class CreateUGAInstanceResponseSchema(schema.ResponseSchema): + """CreateUGAInstance - 创建全球加速配置项""" + + fields = { + "CName": fields.Str(required=False, load_from="CName"), "Message": fields.Str(required=False, load_from="Message"), + "UGAId": fields.Str(required=True, load_from="UGAId"), + } + + +""" +API: CreateUPath + +创建UPath +""" + + +class CreateUPathRequestSchema(schema.RequestSchema): + """CreateUPath - 创建UPath""" + + fields = { + "Bandwidth": fields.Int(required=True, dump_to="Bandwidth"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "LineId": fields.Str(required=True, dump_to="LineId"), + "Name": fields.Str(required=True, dump_to="Name"), + "PathType": fields.Str(required=False, dump_to="PathType"), + "PostPaid": fields.Bool(required=False, dump_to="PostPaid"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + } + + +class CreateUPathResponseSchema(schema.ResponseSchema): + """CreateUPath - 创建UPath""" + + fields = { + "PathId": fields.Str(required=True, load_from="PathId"), + "UPathId": fields.Str( + required=True, load_from="UPathId" + ), # Deprecated, will be removed at 1.0 } @@ -53,8 +278,7 @@ class CreateGlobalSSHInstanceResponseSchema(schema.ResponseSchema): class DeleteGlobalSSHInstanceRequestSchema(schema.RequestSchema): - """ DeleteGlobalSSHInstance - 删除GlobalSSH实例 - """ + """DeleteGlobalSSHInstance - 删除GlobalSSH实例""" fields = { "InstanceId": fields.Str(required=True, dump_to="InstanceId"), @@ -63,22 +287,173 @@ class DeleteGlobalSSHInstanceRequestSchema(schema.RequestSchema): class DeleteGlobalSSHInstanceResponseSchema(schema.ResponseSchema): - """ DeleteGlobalSSHInstance - 删除GlobalSSH实例 - """ + """DeleteGlobalSSHInstance - 删除GlobalSSH实例""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } - fields = {"Message": fields.Str(required=False, load_from="Message")} + +""" +API: DeletePathXSSL + +删除PathX SSL证书 +""" + + +class DeletePathXSSLRequestSchema(schema.RequestSchema): + """DeletePathXSSL - 删除PathX SSL证书""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "SSLId": fields.Str(required=True, dump_to="SSLId"), + } + + +class DeletePathXSSLResponseSchema(schema.ResponseSchema): + """DeletePathXSSL - 删除PathX SSL证书""" + + fields = {} + + +""" +API: DeleteUGA3Instance + + +""" + + +class DeleteUGA3InstanceRequestSchema(schema.RequestSchema): + """DeleteUGA3Instance -""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class DeleteUGA3InstanceResponseSchema(schema.ResponseSchema): + """DeleteUGA3Instance -""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: DeleteUGA3Port + + +""" + + +class DeleteUGA3PortRequestSchema(schema.RequestSchema): + """DeleteUGA3Port -""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "TCP": fields.List(fields.Int()), + } + + +class DeleteUGA3PortResponseSchema(schema.ResponseSchema): + """DeleteUGA3Port -""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DeleteUGAForwarder + +删除加速实例转发器 按接入端口删除 +""" + + +class DeleteUGAForwarderRequestSchema(schema.RequestSchema): + """DeleteUGAForwarder - 删除加速实例转发器 按接入端口删除""" + + fields = { + "HTTPHTTP": fields.List(fields.Int()), + "HTTPSHTTP": fields.List(fields.Int()), + "HTTPSHTTPS": fields.List(fields.Int()), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "TCP": fields.List(fields.Int()), + "UDP": fields.List(fields.Int()), + "UGAId": fields.Str(required=True, dump_to="UGAId"), + "WSSWS": fields.List(fields.Int()), + "WSSWSS": fields.List(fields.Int()), + "WSWS": fields.List(fields.Int()), + } + + +class DeleteUGAForwarderResponseSchema(schema.ResponseSchema): + """DeleteUGAForwarder - 删除加速实例转发器 按接入端口删除""" + + fields = { + "Message": fields.Str( + required=True, load_from="Message" + ), # Deprecated, will be removed at 1.0 + } + + +""" +API: DeleteUGAInstance + +删除全球加速服务加速配置 +""" + + +class DeleteUGAInstanceRequestSchema(schema.RequestSchema): + """DeleteUGAInstance - 删除全球加速服务加速配置""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "UGAId": fields.Str(required=True, dump_to="UGAId"), + } + + +class DeleteUGAInstanceResponseSchema(schema.ResponseSchema): + """DeleteUGAInstance - 删除全球加速服务加速配置""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: DeleteUPath + +删除UPath +""" + + +class DeleteUPathRequestSchema(schema.RequestSchema): + """DeleteUPath - 删除UPath""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "UPathId": fields.Str(required=True, dump_to="UPathId"), + } + + +class DeleteUPathResponseSchema(schema.ResponseSchema): + """DeleteUPath - 删除UPath""" + + fields = {} """ API: DescribeGlobalSSHArea -获取GlobalSSH覆盖的地区列表 用于控制显示哪些机房地域可以使用SSH特性 + """ class DescribeGlobalSSHAreaRequestSchema(schema.RequestSchema): - """ DescribeGlobalSSHArea - 获取GlobalSSH覆盖的地区列表 用于控制显示哪些机房地域可以使用SSH特性 - """ + """DescribeGlobalSSHArea -""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -87,8 +462,7 @@ class DescribeGlobalSSHAreaRequestSchema(schema.RequestSchema): class DescribeGlobalSSHAreaResponseSchema(schema.ResponseSchema): - """ DescribeGlobalSSHArea - 获取GlobalSSH覆盖的地区列表 用于控制显示哪些机房地域可以使用SSH特性 - """ + """DescribeGlobalSSHArea -""" fields = { "AreaSet": fields.List( @@ -106,8 +480,7 @@ class DescribeGlobalSSHAreaResponseSchema(schema.ResponseSchema): class DescribeGlobalSSHInstanceRequestSchema(schema.RequestSchema): - """ DescribeGlobalSSHInstance - 获取GlobalSSH实例列表(传实例ID获取单个实例信息,不传获取项目下全部实例) - """ + """DescribeGlobalSSHInstance - 获取GlobalSSH实例列表(传实例ID获取单个实例信息,不传获取项目下全部实例)""" fields = { "InstanceId": fields.Str(required=False, dump_to="InstanceId"), @@ -116,63 +489,801 @@ class DescribeGlobalSSHInstanceRequestSchema(schema.RequestSchema): class DescribeGlobalSSHInstanceResponseSchema(schema.ResponseSchema): - """ DescribeGlobalSSHInstance - 获取GlobalSSH实例列表(传实例ID获取单个实例信息,不传获取项目下全部实例) - """ + """DescribeGlobalSSHInstance - 获取GlobalSSH实例列表(传实例ID获取单个实例信息,不传获取项目下全部实例)""" fields = { "InstanceSet": fields.List( models.GlobalSSHInfoSchema(), required=False, load_from="InstanceSet", - ) + ), } """ -API: ModifyGlobalSSHPort +API: DescribePathXLineConfig -修改GlobalSSH端口 +获取全球加速线路信息 """ -class ModifyGlobalSSHPortRequestSchema(schema.RequestSchema): - """ ModifyGlobalSSHPort - 修改GlobalSSH端口 - """ +class DescribePathXLineConfigRequestSchema(schema.RequestSchema): + """DescribePathXLineConfig - 获取全球加速线路信息""" fields = { - "InstanceId": fields.Str(required=True, dump_to="InstanceId"), - "Port": fields.Int(required=True, dump_to="Port"), - "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), } -class ModifyGlobalSSHPortResponseSchema(schema.ResponseSchema): - """ ModifyGlobalSSHPort - 修改GlobalSSH端口 - """ +class DescribePathXLineConfigResponseSchema(schema.ResponseSchema): + """DescribePathXLineConfig - 获取全球加速线路信息""" - fields = {"Message": fields.Str(required=False, load_from="Message")} + fields = { + "LineSet": fields.List( + models.UGAALineSchema(), required=False, load_from="LineSet" + ), + } """ -API: ModifyGlobalSSHRemark +API: DescribePathXSSL -修改GlobalSSH备注 +获取SSL证书信息,支持分页,支持按证书名称 证书域名模糊搜索 """ -class ModifyGlobalSSHRemarkRequestSchema(schema.RequestSchema): - """ ModifyGlobalSSHRemark - 修改GlobalSSH备注 - """ +class DescribePathXSSLRequestSchema(schema.RequestSchema): + """DescribePathXSSL - 获取SSL证书信息,支持分页,支持按证书名称 证书域名模糊搜索""" fields = { - "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), "ProjectId": fields.Str(required=True, dump_to="ProjectId"), - "Remark": fields.Str(required=False, dump_to="Remark"), + "SSLId": fields.Str(required=False, dump_to="SSLId"), + "SearchValue": fields.Str(required=False, dump_to="SearchValue"), } -class ModifyGlobalSSHRemarkResponseSchema(schema.ResponseSchema): - """ ModifyGlobalSSHRemark - 修改GlobalSSH备注 - """ +class DescribePathXSSLResponseSchema(schema.ResponseSchema): + """DescribePathXSSL - 获取SSL证书信息,支持分页,支持按证书名称 证书域名模糊搜索""" + + fields = { + "DataSet": fields.List( + models.PathXSSLSetSchema(), required=False, load_from="DataSet" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeUGA3Area + + +""" + + +class DescribeUGA3AreaRequestSchema(schema.RequestSchema): + """DescribeUGA3Area -""" + + fields = { + "Domain": fields.Str(required=False, dump_to="Domain"), + "IPList": fields.Str(required=False, dump_to="IPList"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class DescribeUGA3AreaResponseSchema(schema.ResponseSchema): + """DescribeUGA3Area -""" + + fields = { + "AreaSet": fields.List( + models.ForwardAreaSchema(), required=False, load_from="AreaSet" + ), + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: DescribeUGA3Instance + + +""" + + +class DescribeUGA3InstanceRequestSchema(schema.RequestSchema): + """DescribeUGA3Instance -""" + + fields = { + "InstanceId": fields.Str(required=False, dump_to="InstanceId"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class DescribeUGA3InstanceResponseSchema(schema.ResponseSchema): + """DescribeUGA3Instance -""" + + fields = { + "ForwardInstanceInfos": fields.List( + models.ForwardInfoSchema(), + required=False, + load_from="ForwardInstanceInfos", + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeUGA3Optimization + + +""" + + +class DescribeUGA3OptimizationRequestSchema(schema.RequestSchema): + """DescribeUGA3Optimization -""" + + fields = { + "AccelerationArea": fields.Str( + required=False, dump_to="AccelerationArea" + ), + "AreaCode": fields.Str(required=True, dump_to="AreaCode"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "TimeRange": fields.Str(required=False, dump_to="TimeRange"), + } + + +class DescribeUGA3OptimizationResponseSchema(schema.ResponseSchema): + """DescribeUGA3Optimization -""" + + fields = { + "AccelerationInfos": fields.List( + models.AccelerationInfoSchema(), + required=False, + load_from="AccelerationInfos", + ), + } + + +""" +API: DescribeUGAInstance + +获取全球加速服务加速配置信息,指定实例ID返回单个实例。未指定实例ID时 指定分页参数 则按创建时间降序 返回记录 +""" + + +class DescribeUGAInstanceRequestSchema(schema.RequestSchema): + """DescribeUGAInstance - 获取全球加速服务加速配置信息,指定实例ID返回单个实例。未指定实例ID时 指定分页参数 则按创建时间降序 返回记录""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "UGAId": fields.Str(required=False, dump_to="UGAId"), + } + + +class DescribeUGAInstanceResponseSchema(schema.ResponseSchema): + """DescribeUGAInstance - 获取全球加速服务加速配置信息,指定实例ID返回单个实例。未指定实例ID时 指定分页参数 则按创建时间降序 返回记录""" + + fields = { + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + "UGAList": fields.List( + models.UGAAInfoSchema(), required=False, load_from="UGAList" + ), + } + + +""" +API: DescribeUPath + +获取加速线路信息 +""" + + +class DescribeUPathRequestSchema(schema.RequestSchema): + """DescribeUPath - 获取加速线路信息""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "UPathId": fields.Str(required=False, dump_to="UPathId"), + } + + +class DescribeUPathResponseSchema(schema.ResponseSchema): + """DescribeUPath - 获取加速线路信息""" + + fields = { + "UPathSet": fields.List( + models.UPathInfoSchema(), required=True, load_from="UPathSet" + ), + } + + +""" +API: DescribeUPathTemplate + +查询UPath的监控模板 +""" + + +class DescribeUPathTemplateRequestSchema(schema.RequestSchema): + """DescribeUPathTemplate - 查询UPath的监控模板""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "UPathId": fields.Str(required=True, dump_to="UPathId"), + } + + +class DescribeUPathTemplateResponseSchema(schema.ResponseSchema): + """DescribeUPathTemplate - 查询UPath的监控模板""" + + fields = { + "DataSet": fields.List( + models.AlarmRulerSchema(), required=True, load_from="DataSet" + ), + } + + +""" +API: GetGlobalSSHPrice + +获取GlobalSSH价格 +""" + + +class GetGlobalSSHPriceRequestSchema(schema.RequestSchema): + """GetGlobalSSHPrice - 获取GlobalSSH价格""" + + fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "InstanceType": fields.Str(required=False, dump_to="InstanceType"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + } + + +class GetGlobalSSHPriceResponseSchema(schema.ResponseSchema): + """GetGlobalSSHPrice - 获取GlobalSSH价格""" + + fields = { + "Price": fields.Float(required=False, load_from="Price"), + } + + +""" +API: GetGlobalSSHTraffic + +获取GlobalSSH流量统计数据 +""" + + +class GetGlobalSSHTrafficRequestSchema(schema.RequestSchema): + """GetGlobalSSHTraffic - 获取GlobalSSH流量统计数据""" + + fields = { + "BeginTime": fields.Int(required=True, dump_to="BeginTime"), + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "UGAId": fields.Str(required=True, dump_to="UGAId"), + } + + +class GetGlobalSSHTrafficResponseSchema(schema.ResponseSchema): + """GetGlobalSSHTraffic - 获取GlobalSSH流量统计数据""" + + fields = { + "DataSet": fields.List( + models.TrafficDailySchema(), required=True, load_from="DataSet" + ), + "TrafficDailyRecently": fields.List( + models.TrafficDailyRecentlySchema(), + required=False, + load_from="TrafficDailyRecently", + ), + "UGAId": fields.Str(required=True, load_from="UGAId"), + } + + +""" +API: GetGlobalSSHUpdatePrice + +获取GlobalSSH升级价格 +""" + + +class GetGlobalSSHUpdatePriceRequestSchema(schema.RequestSchema): + """GetGlobalSSHUpdatePrice - 获取GlobalSSH升级价格""" + + fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "InstanceId": fields.Str(required=False, dump_to="InstanceId"), + "InstanceType": fields.Str(required=True, dump_to="InstanceType"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + } + + +class GetGlobalSSHUpdatePriceResponseSchema(schema.ResponseSchema): + """GetGlobalSSHUpdatePrice - 获取GlobalSSH升级价格""" + + fields = { + "Price": fields.Float(required=False, load_from="Price"), + } + + +""" +API: GetPathXMetric + +获取全球加速监控信息 +""" + + +class GetPathXMetricRequestSchema(schema.RequestSchema): + """GetPathXMetric - 获取全球加速监控信息""" + + fields = { + "BeginTime": fields.Int(required=True, dump_to="BeginTime"), + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "LineId": fields.Str(required=True, dump_to="LineId"), + "MetricName": fields.List(fields.Str()), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + "ResourceType": fields.Str(required=True, dump_to="ResourceType"), + } + + +class GetPathXMetricResponseSchema(schema.ResponseSchema): + """GetPathXMetric - 获取全球加速监控信息""" + + fields = { + "DataSet": models.MetricPeriodSchema(), + } + + +""" +API: GetUGA3Metric + + +""" + + +class GetUGA3MetricRequestSchema(schema.RequestSchema): + """GetUGA3Metric -""" + + fields = { + "AreaCode": fields.Str(required=False, dump_to="AreaCode"), + "BeginTime": fields.Int(required=True, dump_to="BeginTime"), + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "IsSubline": fields.Bool(required=False, dump_to="IsSubline"), + "MetricName": fields.List(fields.Str()), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class GetUGA3MetricResponseSchema(schema.ResponseSchema): + """GetUGA3Metric -""" + + fields = { + "DataSet": models.UGA3MetricSchema(required=False, load_from="DataSet"), + } + + +""" +API: GetUGA3Price + + +""" + + +class GetUGA3PriceRequestSchema(schema.RequestSchema): + """GetUGA3Price -""" + + fields = { + "AccelerationArea": fields.Str( + required=False, dump_to="AccelerationArea" + ), + "AreaCode": fields.Str(required=True, dump_to="AreaCode"), + "Bandwidth": fields.Int(required=True, dump_to="Bandwidth"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + } + + +class GetUGA3PriceResponseSchema(schema.ResponseSchema): + """GetUGA3Price -""" + + fields = { + "UGA3Price": fields.List( + models.UGA3PriceSchema(), required=True, load_from="UGA3Price" + ), + } + + +""" +API: GetUGA3UpdatePrice + + +""" + + +class GetUGA3UpdatePriceRequestSchema(schema.RequestSchema): + """GetUGA3UpdatePrice -""" + + fields = { + "AccelerationArea": fields.Str( + required=False, dump_to="AccelerationArea" + ), + "AreaCode": fields.Str(required=False, dump_to="AreaCode"), + "Bandwidth": fields.Int(required=False, dump_to="Bandwidth"), + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class GetUGA3UpdatePriceResponseSchema(schema.ResponseSchema): + """GetUGA3UpdatePrice -""" + + fields = { + "Price": fields.Float(required=True, load_from="Price"), + } + + +""" +API: ModifyGlobalSSHOriginInfo + +修改GlobalSSH 源站信息 +""" + + +class ModifyGlobalSSHOriginInfoRequestSchema(schema.RequestSchema): + """ModifyGlobalSSHOriginInfo - 修改GlobalSSH 源站信息""" + + fields = { + "Area": fields.Str(required=False, dump_to="Area"), + "AreaCode": fields.Str(required=False, dump_to="AreaCode"), + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "InstanceType": fields.Str(required=True, dump_to="InstanceType"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "RsIP": fields.Str(required=True, dump_to="RsIP"), + } + + +class ModifyGlobalSSHOriginInfoResponseSchema(schema.ResponseSchema): + """ModifyGlobalSSHOriginInfo - 修改GlobalSSH 源站信息""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: ModifyGlobalSSHPort + +修改GlobalSSH端口 +""" + + +class ModifyGlobalSSHPortRequestSchema(schema.RequestSchema): + """ModifyGlobalSSHPort - 修改GlobalSSH端口""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "Port": fields.Int(required=True, dump_to="Port"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class ModifyGlobalSSHPortResponseSchema(schema.ResponseSchema): + """ModifyGlobalSSHPort - 修改GlobalSSH端口""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: ModifyGlobalSSHRemark + +修改GlobalSSH备注 +""" + + +class ModifyGlobalSSHRemarkRequestSchema(schema.RequestSchema): + """ModifyGlobalSSHRemark - 修改GlobalSSH备注""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Remark": fields.Str(required=False, dump_to="Remark"), + } + + +class ModifyGlobalSSHRemarkResponseSchema(schema.ResponseSchema): + """ModifyGlobalSSHRemark - 修改GlobalSSH备注""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: ModifyGlobalSSHType + +修改GlobalSSH实例类型,仅支持低版本升级到高版本,不支持高版本降级到低版本 +""" + + +class ModifyGlobalSSHTypeRequestSchema(schema.RequestSchema): + """ModifyGlobalSSHType - 修改GlobalSSH实例类型,仅支持低版本升级到高版本,不支持高版本降级到低版本""" + + fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "InstanceType": fields.Str(required=True, dump_to="InstanceType"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Quantity": fields.Str(required=False, dump_to="Quantity"), + } + + +class ModifyGlobalSSHTypeResponseSchema(schema.ResponseSchema): + """ModifyGlobalSSHType - 修改GlobalSSH实例类型,仅支持低版本升级到高版本,不支持高版本降级到低版本""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: ModifyUGA3Bandwidth + + +""" + + +class ModifyUGA3BandwidthRequestSchema(schema.RequestSchema): + """ModifyUGA3Bandwidth -""" + + fields = { + "Bandwidth": fields.Int(required=False, dump_to="Bandwidth"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class ModifyUGA3BandwidthResponseSchema(schema.ResponseSchema): + """ModifyUGA3Bandwidth -""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: ModifyUGA3Instance + + +""" + + +class ModifyUGA3InstanceRequestSchema(schema.RequestSchema): + """ModifyUGA3Instance -""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Remark": fields.Str(required=False, dump_to="Remark"), + } + + +class ModifyUGA3InstanceResponseSchema(schema.ResponseSchema): + """ModifyUGA3Instance -""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: ModifyUGA3OriginInfo + + +""" + + +class ModifyUGA3OriginInfoRequestSchema(schema.RequestSchema): + """ModifyUGA3OriginInfo -""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "OriginDomain": fields.Str(required=True, dump_to="OriginDomain"), + "OriginIPList": fields.Str(required=True, dump_to="OriginIPList"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class ModifyUGA3OriginInfoResponseSchema(schema.ResponseSchema): + """ModifyUGA3OriginInfo -""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: ModifyUGA3Port + + +""" + + +class ModifyUGA3PortRequestSchema(schema.RequestSchema): + """ModifyUGA3Port -""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "TCP": fields.List(fields.Int()), + "TCPRS": fields.List(fields.Int()), + } + + +class ModifyUGA3PortResponseSchema(schema.ResponseSchema): + """ModifyUGA3Port -""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: ModifyUPathBandwidth + +修改加速线路带宽 +""" + + +class ModifyUPathBandwidthRequestSchema(schema.RequestSchema): + """ModifyUPathBandwidth - 修改加速线路带宽""" + + fields = { + "Bandwidth": fields.Int(required=True, dump_to="Bandwidth"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "UPathId": fields.Str(required=True, dump_to="UPathId"), + } + + +class ModifyUPathBandwidthResponseSchema(schema.ResponseSchema): + """ModifyUPathBandwidth - 修改加速线路带宽""" + + fields = {} + + +""" +API: ModifyUPathTemplate + +修改UPath监控告警项 +""" + + +class ModifyUPathTemplateRequestSchema(schema.RequestSchema): + """ModifyUPathTemplate - 修改UPath监控告警项""" + + fields = { + "AlarmFrequency": fields.List(fields.Int()), + "AlarmStrategy": fields.List(fields.Str()), + "Compare": fields.List(fields.Str()), + "ContactGroupId": fields.List(fields.Int()), + "MetricName": fields.List(fields.Str()), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Threshold": fields.List(fields.Int()), + "TriggerCount": fields.List(fields.Int()), + "UPathId": fields.Str(required=True, dump_to="UPathId"), + } + + +class ModifyUPathTemplateResponseSchema(schema.ResponseSchema): + """ModifyUPathTemplate - 修改UPath监控告警项""" + + fields = {} + + +""" +API: UGABindUPath + +UGA绑定UPath +""" + + +class UGABindUPathRequestSchema(schema.RequestSchema): + """UGABindUPath - UGA绑定UPath""" + + fields = { + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "UGAId": fields.Str(required=True, dump_to="UGAId"), + "UPathId": fields.Str(required=True, dump_to="UPathId"), + } + + +class UGABindUPathResponseSchema(schema.ResponseSchema): + """UGABindUPath - UGA绑定UPath""" + + fields = {} + + +""" +API: UGAUnBindUPath + +UGA与UPath解绑 +""" + + +class UGAUnBindUPathRequestSchema(schema.RequestSchema): + """UGAUnBindUPath - UGA与UPath解绑""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "UGAId": fields.Str(required=True, dump_to="UGAId"), + "UPathId": fields.Str(required=True, dump_to="UPathId"), + } + + +class UGAUnBindUPathResponseSchema(schema.ResponseSchema): + """UGAUnBindUPath - UGA与UPath解绑""" + + fields = {} + + +""" +API: UnBindPathXSSL + +解绑PathX SSL 证书 +""" + + +class UnBindPathXSSLRequestSchema(schema.RequestSchema): + """UnBindPathXSSL - 解绑PathX SSL 证书""" + + fields = { + "Port": fields.List(fields.Int()), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "SSLId": fields.Str(required=True, dump_to="SSLId"), + "UGAId": fields.Str(required=True, dump_to="UGAId"), + } + + +class UnBindPathXSSLResponseSchema(schema.ResponseSchema): + """UnBindPathXSSL - 解绑PathX SSL 证书""" + + fields = {} + + +""" +API: UpdatePathXWhitelist + +更新入口白名单,仅限GlobalSSH 实例使用。其他uga-实例不生效 +""" + + +class UpdatePathXWhitelistRequestSchema(schema.RequestSchema): + """UpdatePathXWhitelist - 更新入口白名单,仅限GlobalSSH 实例使用。其他uga-实例不生效""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Whitelist": fields.List(fields.Str()), + } + + +class UpdatePathXWhitelistResponseSchema(schema.ResponseSchema): + """UpdatePathXWhitelist - 更新入口白名单,仅限GlobalSSH 实例使用。其他uga-实例不生效""" - fields = {"Message": fields.Str(required=False, load_from="Message")} + fields = {} diff --git a/ucloud/services/pathx/schemas/models.py b/ucloud/services/pathx/schemas/models.py index fe4c30e9..33071568 100644 --- a/ucloud/services/pathx/schemas/models.py +++ b/ucloud/services/pathx/schemas/models.py @@ -1,33 +1,420 @@ -""" Code is generated by ucloud-model, DO NOT EDIT IT. """ - -from ucloud.core.typesystem import schema, fields - - -class GlobalSSHAreaSchema(schema.ResponseSchema): - """ GlobalSSHArea - GlobalSSH覆盖地区,包括关联的UCloud机房信息 - """ - - fields = { - "Area": fields.Str(required=True, load_from="Area"), - "AreaCode": fields.Str(required=True, load_from="AreaCode"), - "RegionSet": fields.List(fields.Str()), - } - - -class GlobalSSHInfoSchema(schema.ResponseSchema): - """ GlobalSSHInfo - GlobalSSH实例信息 - """ - - fields = { - "AcceleratingDomain": fields.Str( - required=True, load_from="AcceleratingDomain" - ), - "Area": fields.Str(required=True, load_from="Area"), - "ChargeType": fields.Str(required=True, load_from="ChargeType"), - "CreateTime": fields.Int(required=True, load_from="CreateTime"), - "ExpireTime": fields.Int(required=True, load_from="ExpireTime"), - "InstanceId": fields.Str(required=True, load_from="InstanceId"), - "Port": fields.Int(required=True, load_from="Port"), - "Remark": fields.Str(required=True, load_from="Remark"), - "TargetIP": fields.Str(required=True, load_from="TargetIP"), - } +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class GlobalSSHAreaSchema(schema.ResponseSchema): + """GlobalSSHArea -""" + + fields = { + "Area": fields.Str(required=True, load_from="Area"), + "AreaCode": fields.Str(required=True, load_from="AreaCode"), + "RegionSet": fields.List(fields.Str()), + } + + +class GlobalSSHInfoSchema(schema.ResponseSchema): + """GlobalSSHInfo - GlobalSSH实例信息""" + + fields = { + "AcceleratingDomain": fields.Str( + required=True, load_from="AcceleratingDomain" + ), + "Area": fields.Str(required=True, load_from="Area"), + "BandwidthPackage": fields.Int( + required=False, load_from="BandwidthPackage" + ), + "ChargeType": fields.Str(required=True, load_from="ChargeType"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "DomainStatus": fields.Str(), + "Expire": fields.Bool(required=True, load_from="Expire"), + "ExpireTime": fields.Int(required=True, load_from="ExpireTime"), + "ExtraDomain": fields.List(fields.Str()), + "ForwardRegion": fields.Str(required=False, load_from="ForwardRegion"), + "GlobalSSHPort": fields.Int(required=True, load_from="GlobalSSHPort"), + "IPV6Access": fields.Bool(required=False, load_from="IPV6Access"), + "InstanceId": fields.Str(required=True, load_from="InstanceId"), + "InstanceType": fields.Str(required=True, load_from="InstanceType"), + "Port": fields.Int(required=True, load_from="Port"), + "Remark": fields.Str(required=True, load_from="Remark"), + "TargetIP": fields.Str(required=True, load_from="TargetIP"), + } + + +class LineDetailSchema(schema.ResponseSchema): + """LineDetail - 子线路""" + + fields = { + "LineFrom": fields.Str(required=True, load_from="LineFrom"), + "LineFromName": fields.Str(required=True, load_from="LineFromName"), + "LineId": fields.Str(required=False, load_from="LineId"), + "LineTo": fields.Str(required=True, load_from="LineTo"), + "LineToName": fields.Str(required=True, load_from="LineToName"), + } + + +class UGAALineSchema(schema.ResponseSchema): + """UGAALine - PathX线路参数""" + + fields = { + "FlagUnicodeFrom": fields.Str( + required=True, load_from="FlagUnicodeFrom" + ), + "FlagUnicodeTo": fields.Str(required=True, load_from="FlagUnicodeTo"), + "GuaranteedBandwidthProportion": fields.Int( + required=True, load_from="GuaranteedBandwidthProportion" + ), + "LineDetail": fields.List(LineDetailSchema()), + "LineFrom": fields.Str(required=True, load_from="LineFrom"), + "LineFromName": fields.Str(required=True, load_from="LineFromName"), + "LineId": fields.Str(required=True, load_from="LineId"), + "LineTo": fields.Str(required=True, load_from="LineTo"), + "LineToName": fields.Str(required=True, load_from="LineToName"), + "MaxBandwidth": fields.Int(required=True, load_from="MaxBandwidth"), + "PostPaidMaxBandwidth": fields.Int( + required=True, load_from="PostPaidMaxBandwidth" + ), + "RegionCategoryFrom": fields.Str( + required=True, load_from="RegionCategoryFrom" + ), + "RegionCategoryTo": fields.Str( + required=True, load_from="RegionCategoryTo" + ), + "SupportPublicNetwork": fields.Bool( + required=True, load_from="SupportPublicNetwork" + ), + } + + +class SSLBindedTargetSetSchema(schema.ResponseSchema): + """SSLBindedTargetSet - Describle SSL Bind UAG Info""" + + fields = { + "ResourceId": fields.Str(required=True, load_from="ResourceId"), + "ResourceName": fields.Str(required=False, load_from="ResourceName"), + } + + +class PathXSSLSetSchema(schema.ResponseSchema): + """PathXSSLSet - Describle PathX SSL""" + + fields = { + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "SSLBindedTargetSet": fields.List(SSLBindedTargetSetSchema()), + "SSLContent": fields.Str(required=False, load_from="SSLContent"), + "SSLId": fields.Str(required=False, load_from="SSLId"), + "SSLMD5": fields.Str(required=False, load_from="SSLMD5"), + "SSLName": fields.Str(required=False, load_from="SSLName"), + "SourceType": fields.Int(required=False, load_from="SourceType"), + "SubjectName": fields.Str(required=False, load_from="SubjectName"), + } + + +class ForwardAreaSchema(schema.ResponseSchema): + """ForwardArea -""" + + fields = { + "Area": fields.Str(required=True, load_from="Area"), + "AreaCode": fields.Str(required=True, load_from="AreaCode"), + "ContinentCode": fields.Str(required=True, load_from="ContinentCode"), + "CountryCode": fields.Str(required=True, load_from="CountryCode"), + "FlagEmoji": fields.Str(required=True, load_from="FlagEmoji"), + "FlagUnicode": fields.Str(required=True, load_from="FlagUnicode"), + } + + +class SrcAreaInfoSchema(schema.ResponseSchema): + """SrcAreaInfo -""" + + fields = { + "Area": fields.Str(required=True, load_from="Area"), + "AreaCode": fields.Str(required=True, load_from="AreaCode"), + "FlagEmoji": fields.Str(required=True, load_from="FlagEmoji"), + "FlagUnicode": fields.Str(required=True, load_from="FlagUnicode"), + } + + +class ForwardTaskSchema(schema.ResponseSchema): + """ForwardTask -""" + + fields = { + "Port": fields.Int(required=True, load_from="Port"), + "Protocol": fields.Str(required=True, load_from="Protocol"), + "RSPort": fields.Int(required=True, load_from="RSPort"), + } + + +class AccelerationAreaInfosSchema(schema.ResponseSchema): + """AccelerationAreaInfos -""" + + fields = { + "AccelerationArea": fields.Str( + required=True, load_from="AccelerationArea" + ), + "AccelerationNodes": fields.List(SrcAreaInfoSchema()), + } + + +class OutPublicIpInfoSchema(schema.ResponseSchema): + """OutPublicIpInfo - 线路回源IP信息""" + + fields = { + "Area": fields.Str(required=False, load_from="Area"), + "IP": fields.Str(required=False, load_from="IP"), + } + + +class ForwardInfoSchema(schema.ResponseSchema): + """ForwardInfo -""" + + fields = { + "AccelerationArea": fields.Str( + required=True, load_from="AccelerationArea" + ), + "AccelerationAreaInfos": fields.List(AccelerationAreaInfosSchema()), + "AccelerationAreaName": fields.Str( + required=True, load_from="AccelerationAreaName" + ), + "Bandwidth": fields.Int(required=True, load_from="Bandwidth"), + "CName": fields.Str(required=True, load_from="CName"), + "ChargeType": fields.Str(required=True, load_from="ChargeType"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "Domain": fields.Str(required=False, load_from="Domain"), + "EgressIpList": fields.List(OutPublicIpInfoSchema()), + "ExpireTime": fields.Int(required=True, load_from="ExpireTime"), + "IPList": fields.List(fields.Str()), + "InstanceId": fields.Str(required=True, load_from="InstanceId"), + "Name": fields.Str(required=True, load_from="Name"), + "OriginArea": fields.Str(required=True, load_from="OriginArea"), + "OriginAreaCode": fields.Str(required=True, load_from="OriginAreaCode"), + "PortSets": fields.List(ForwardTaskSchema()), + "Remark": fields.Str(required=False, load_from="Remark"), + } + + +class NodeDelaysSchema(schema.ResponseSchema): + """NodeDelays -""" + + fields = { + "Area": fields.Str(required=True, load_from="Area"), + "AreaCode": fields.Str(required=True, load_from="AreaCode"), + "CountryCode": fields.Str(required=True, load_from="CountryCode"), + "FlagEmoji": fields.Str(required=True, load_from="FlagEmoji"), + "FlagUnicode": fields.Str(required=True, load_from="FlagUnicode"), + "Latency": fields.Float(required=True, load_from="Latency"), + "LatencyInternet": fields.Float( + required=True, load_from="LatencyInternet" + ), + "LatencyOptimization": fields.Float( + required=True, load_from="LatencyOptimization" + ), + "Loss": fields.Float(required=True, load_from="Loss"), + "LossInternet": fields.Float(required=True, load_from="LossInternet"), + "LossOptimization": fields.Float( + required=True, load_from="LossOptimization" + ), + } + + +class AccelerationInfoSchema(schema.ResponseSchema): + """AccelerationInfo -""" + + fields = { + "AccelerationArea": fields.Str( + required=True, load_from="AccelerationArea" + ), + "AccelerationName": fields.Str( + required=True, load_from="AccelerationName" + ), + "NodeInfo": fields.List(NodeDelaysSchema()), + } + + +class UPathSetSchema(schema.ResponseSchema): + """UPathSet - uga关联的upath信息""" + + fields = { + "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), + "LineFrom": fields.Str(required=False, load_from="LineFrom"), + "LineFromName": fields.Str(required=False, load_from="LineFromName"), + "LineId": fields.Str(required=False, load_from="LineId"), + "LineTo": fields.Str(required=False, load_from="LineTo"), + "LineToName": fields.Str(required=False, load_from="LineToName"), + "UPathId": fields.Str(required=False, load_from="UPathId"), + "UPathName": fields.Str(required=False, load_from="UPathName"), + } + + +class UGAATaskSchema(schema.ResponseSchema): + """UGAATask - 用户在UGAA实例下配置的多端口任务""" + + fields = { + "Port": fields.Int(required=True, load_from="Port"), + "Protocol": fields.Str(required=True, load_from="Protocol"), + } + + +class UGAL4ForwarderSchema(schema.ResponseSchema): + """UGAL4Forwarder - UGA实例 4层转发器信息""" + + fields = { + "Port": fields.Int(required=True, load_from="Port"), + "Protocol": fields.Str(required=True, load_from="Protocol"), + "RSPort": fields.Int(required=True, load_from="RSPort"), + } + + +class UGAL7ForwarderSchema(schema.ResponseSchema): + """UGAL7Forwarder - UGA实例 7层转发器信息""" + + fields = { + "Port": fields.Int(required=True, load_from="Port"), + "Protocol": fields.Str(required=True, load_from="Protocol"), + "RSPort": fields.Int(required=True, load_from="RSPort"), + "SSLId": fields.Str(required=False, load_from="SSLId"), + "SSLName": fields.Str(required=False, load_from="SSLName"), + } + + +class UGAAInfoSchema(schema.ResponseSchema): + """UGAAInfo - 全球加速实例信息""" + + fields = { + "CName": fields.Str(required=True, load_from="CName"), + "Domain": fields.Str(required=False, load_from="Domain"), + "IPList": fields.List(fields.Str()), + "L4ForwarderSet": fields.List(UGAL4ForwarderSchema()), + "L7ForwarderSet": fields.List(UGAL7ForwarderSchema()), + "Location": fields.Str(required=False, load_from="Location"), + "OutPublicIpList": fields.List(OutPublicIpInfoSchema()), + "TaskSet": fields.List(UGAATaskSchema()), + "UGAId": fields.Str(required=True, load_from="UGAId"), + "UGAName": fields.Str(required=True, load_from="UGAName"), + "UPathSet": fields.List(UPathSetSchema()), + } + + +class PathXUGAInfoSchema(schema.ResponseSchema): + """PathXUGAInfo - 加速实例配置信息""" + + fields = { + "Domain": fields.Str(required=False, load_from="Domain"), + "IPList": fields.List(fields.Str()), + "UGAId": fields.Str(required=False, load_from="UGAId"), + } + + +class UPathInfoSchema(schema.ResponseSchema): + """UPathInfo - 加速线路信息""" + + fields = { + "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "LineFromName": fields.Str(required=False, load_from="LineFromName"), + "LineId": fields.Str(required=False, load_from="LineId"), + "LineToName": fields.Str(required=False, load_from="LineToName"), + "Name": fields.Str(required=False, load_from="Name"), + "OutPublicIpList": fields.List(OutPublicIpInfoSchema()), + "PostPaid": fields.Bool(required=False, load_from="PostPaid"), + "UGAList": fields.List(PathXUGAInfoSchema()), + "UPathId": fields.Str(required=False, load_from="UPathId"), + } + + +class AlarmRulerSchema(schema.ResponseSchema): + """AlarmRuler - 告警详情""" + + fields = { + "AlarmFrequency": fields.Int(required=True, load_from="AlarmFrequency"), + "AlarmStrategy": fields.Str(required=True, load_from="AlarmStrategy"), + "AlarmTemplateRuleId": fields.Int( + required=True, load_from="AlarmTemplateRuleId" + ), + "Compare": fields.Str(required=True, load_from="Compare"), + "ContactGroupId": fields.Int(required=True, load_from="ContactGroupId"), + "MetricName": fields.Str(required=True, load_from="MetricName"), + "ResourceType": fields.Str(required=False, load_from="ResourceType"), + "Threshold": fields.Int(required=True, load_from="Threshold"), + "TriggerCount": fields.Int(required=True, load_from="TriggerCount"), + } + + +class TrafficDailyRecentlySchema(schema.ResponseSchema): + """TrafficDailyRecently - 最近3个月日流量统计""" + + fields = { + "Day": fields.Str(required=False, load_from="Day"), + "TrafficUnitGB": fields.Str(required=False, load_from="TrafficUnitGB"), + "TrafficUnitMB": fields.Str(required=False, load_from="TrafficUnitMB"), + } + + +class TrafficDailySchema(schema.ResponseSchema): + """TrafficDaily -""" + + fields = { + "BillingState": fields.Str(required=True, load_from="BillingState"), + "Date": fields.Int(required=True, load_from="Date"), + "Traffic": fields.Int(required=True, load_from="Traffic"), + } + + +class MatricPointSchema(schema.ResponseSchema): + """MatricPoint -""" + + fields = { + "Timestamp": fields.Int(required=False, load_from="Timestamp"), + "Value": fields.Int(required=False, load_from="Value"), + } + + +class MetricPeriodSchema(schema.ResponseSchema): + """MetricPeriod - 一段时间内的监控数据""" + + fields = { + "NetworkIn": fields.List(MatricPointSchema()), + "NetworkInUsage": fields.List(MatricPointSchema()), + "NetworkOut": fields.List(MatricPointSchema()), + "NetworkOutUsage": fields.List(MatricPointSchema()), + } + + +class UGA3MetricSchema(schema.ResponseSchema): + """UGA3Metric -""" + + fields = { + "ConnectCount": fields.List(MatricPointSchema()), + "ConnectCountSubline": fields.List(MatricPointSchema()), + "Delay": fields.List(MatricPointSchema()), + "DelayPromote": fields.List(MatricPointSchema()), + "DelayPromoteSubline": fields.List(MatricPointSchema()), + "DelaySubline": fields.List(MatricPointSchema()), + "NetworkIn": fields.List(MatricPointSchema()), + "NetworkInSubline": fields.List(MatricPointSchema()), + "NetworkInUsage": fields.List(MatricPointSchema()), + "NetworkOut": fields.List(MatricPointSchema()), + "NetworkOutSubline": fields.List(MatricPointSchema()), + "NetworkOutUsage": fields.List(MatricPointSchema()), + } + + +class UGA3PriceSchema(schema.ResponseSchema): + """UGA3Price -""" + + fields = { + "AccelerationArea": fields.Str( + required=True, load_from="AccelerationArea" + ), + "AccelerationAreaName": fields.Str( + required=True, load_from="AccelerationAreaName" + ), + "AccelerationBandwidthPrice": fields.Float( + required=True, load_from="AccelerationBandwidthPrice" + ), + "AccelerationForwarderPrice": fields.Float( + required=True, load_from="AccelerationForwarderPrice" + ), + } diff --git a/ucloud/services/stepflow/client.py b/ucloud/services/stepflow/client.py index 12e1c0c4..fadba0d1 100644 --- a/ucloud/services/stepflow/client.py +++ b/ucloud/services/stepflow/client.py @@ -18,21 +18,21 @@ def __init__( def create_sf_workflow_from_template( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateSFWorkflowFromTemplate - 导入工作流定义 + """CreateSFWorkflowFromTemplate - 导入工作流定义 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Namespace** (str) - (Required) 需要创建的工作流namespace - **Workflow** (str) - (Required) 描述工作流定义的base64字符串 - **WorkflowName** (str) - (Required) 需要创建的工作流名称 - + **Response** - **Message** (str) - 返回消息 - **Version** (int) - 创建的工作流版本号 - + """ # build request d = {"ProjectId": self.config.project_id, "Region": self.config.region} @@ -48,32 +48,32 @@ def create_sf_workflow_from_template( def get_sf_workflow_template( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetSFWorkflowTemplate - 导出工作流定义 + """GetSFWorkflowTemplate - 导出工作流定义 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **WorkflowId** (str) - (Required) 被导出工作流的Id - **WorkflowVersion** (int) - 被导出工作流的版本号。取值范围:WorkflowVersion >= 1;默认会获取发布版本对应的workflow;超过最大版本会返回错误 - + **Response** - **Message** (str) - 返回消息 - **Version** (int) - 导出工作流的版本号 - **Workflow** (dict) - 见 **WorkflowTemplate** 模型定义 - **WorkflowId** (str) - 导出工作流的Id - + **Response Model** - - **Param** - + + **Param** + - **Name** (str) - 参数名称 - **Type** (str) - 参数类型 - **Value** (str) - 参数值 - **ActivityTemplate** - + **ActivityTemplate** + - **Input** (dict) - Activity的输入 - **Name** (str) - Activity的名字 - **Next** (str) - 下一个Activity的名字 @@ -82,8 +82,8 @@ def get_sf_workflow_template( - **Timeout** (str) - Activity的超时时间 - **Type** (str) - Activity的类型 - **WorkflowTemplate** - + **WorkflowTemplate** + - **Activites** (list) - 见 **ActivityTemplate** 模型定义 - **Input** (list) - 见 **Param** 模型定义 - **Output** (list) - 见 **Param** 模型定义 diff --git a/ucloud/services/stepflow/schemas/apis.py b/ucloud/services/stepflow/schemas/apis.py index a3524865..35a51101 100644 --- a/ucloud/services/stepflow/schemas/apis.py +++ b/ucloud/services/stepflow/schemas/apis.py @@ -16,8 +16,7 @@ class CreateSFWorkflowFromTemplateRequestSchema(schema.RequestSchema): - """ CreateSFWorkflowFromTemplate - 导入工作流定义 - """ + """CreateSFWorkflowFromTemplate - 导入工作流定义""" fields = { "Namespace": fields.Str(required=True, dump_to="Namespace"), @@ -29,8 +28,7 @@ class CreateSFWorkflowFromTemplateRequestSchema(schema.RequestSchema): class CreateSFWorkflowFromTemplateResponseSchema(schema.ResponseSchema): - """ CreateSFWorkflowFromTemplate - 导入工作流定义 - """ + """CreateSFWorkflowFromTemplate - 导入工作流定义""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -46,8 +44,7 @@ class CreateSFWorkflowFromTemplateResponseSchema(schema.ResponseSchema): class GetSFWorkflowTemplateRequestSchema(schema.RequestSchema): - """ GetSFWorkflowTemplate - 导出工作流定义 - """ + """GetSFWorkflowTemplate - 导出工作流定义""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -60,8 +57,7 @@ class GetSFWorkflowTemplateRequestSchema(schema.RequestSchema): class GetSFWorkflowTemplateResponseSchema(schema.ResponseSchema): - """ GetSFWorkflowTemplate - 导出工作流定义 - """ + """GetSFWorkflowTemplate - 导出工作流定义""" fields = { "Message": fields.Str(required=False, load_from="Message"), diff --git a/ucloud/services/stepflow/schemas/models.py b/ucloud/services/stepflow/schemas/models.py index 47113e59..f75054d7 100644 --- a/ucloud/services/stepflow/schemas/models.py +++ b/ucloud/services/stepflow/schemas/models.py @@ -4,8 +4,7 @@ class ParamSchema(schema.ResponseSchema): - """ Param - 工作流参数 - """ + """Param - 工作流参数""" fields = { "Name": fields.Str(required=False, load_from="Name"), @@ -15,8 +14,7 @@ class ParamSchema(schema.ResponseSchema): class ActivityTemplateSchema(schema.ResponseSchema): - """ ActivityTemplate - 工作流的Activity定义 - """ + """ActivityTemplate - 工作流的Activity定义""" fields = { "Input": fields.Str(), @@ -30,8 +28,7 @@ class ActivityTemplateSchema(schema.ResponseSchema): class WorkflowTemplateSchema(schema.ResponseSchema): - """ WorkflowTemplate - Workflow对象定义 - """ + """WorkflowTemplate - Workflow对象定义""" fields = { "Activites": fields.List(ActivityTemplateSchema()), diff --git a/ucloud/services/sts/__init__.py b/ucloud/services/sts/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/sts/client.py b/ucloud/services/sts/client.py new file mode 100644 index 00000000..08f2ee4c --- /dev/null +++ b/ucloud/services/sts/client.py @@ -0,0 +1,46 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.sts.schemas import apis + + +class STSClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(STSClient, self).__init__(config, transport, middleware, logger) + + def assume_role(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """AssumeRole - 获取扮演角色的临时身份凭证 + + **Request** + + - **RoleSessionName** (str) - (Required) 角色会话名称。 + - **RoleUrn** (str) - (Required) 要扮演的RAM角色URN。 + - **DurationSeconds** (int) - Token有效期。 + - **Policy** (str) - 为STS Token额外添加的一个权限策略,进一步限制STS Token的权限。 + + **Response** + + - **Credentials** (dict) - 见 **Credentials** 模型定义 + + **Response Model** + + **Credentials** + - **AccessKeyId** (str) - 密钥ID。 + - **AccessKeySecret** (str) - 密钥Secret。 + - **Expiration** (str) - Token到期失效时间(UTC时间)。 + - **SecurityToken** (str) - 安全令牌。 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.AssumeRoleRequestSchema().dumps(d) + + resp = self.invoke("AssumeRole", d, **kwargs) + return apis.AssumeRoleResponseSchema().loads(resp) diff --git a/ucloud/services/sts/schemas/__init__.py b/ucloud/services/sts/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/sts/schemas/apis.py b/ucloud/services/sts/schemas/apis.py new file mode 100644 index 00000000..c0f452b8 --- /dev/null +++ b/ucloud/services/sts/schemas/apis.py @@ -0,0 +1,35 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.sts.schemas import models + +""" STS API Schema +""" + + +""" +API: AssumeRole + +获取扮演角色的临时身份凭证 +""" + + +class AssumeRoleRequestSchema(schema.RequestSchema): + """AssumeRole - 获取扮演角色的临时身份凭证""" + + fields = { + "DurationSeconds": fields.Int( + required=False, dump_to="DurationSeconds" + ), + "Policy": fields.Str(required=False, dump_to="Policy"), + "RoleSessionName": fields.Str(required=True, dump_to="RoleSessionName"), + "RoleUrn": fields.Str(required=True, dump_to="RoleUrn"), + } + + +class AssumeRoleResponseSchema(schema.ResponseSchema): + """AssumeRole - 获取扮演角色的临时身份凭证""" + + fields = { + "Credentials": models.CredentialsSchema(), + } diff --git a/ucloud/services/sts/schemas/models.py b/ucloud/services/sts/schemas/models.py new file mode 100644 index 00000000..060e75b7 --- /dev/null +++ b/ucloud/services/sts/schemas/models.py @@ -0,0 +1,16 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class CredentialsSchema(schema.ResponseSchema): + """Credentials -""" + + fields = { + "AccessKeyId": fields.Str(required=True, load_from="AccessKeyId"), + "AccessKeySecret": fields.Str( + required=True, load_from="AccessKeySecret" + ), + "Expiration": fields.Str(required=True, load_from="Expiration"), + "SecurityToken": fields.Str(required=True, load_from="SecurityToken"), + } diff --git a/ucloud/services/tidb/__init__.py b/ucloud/services/tidb/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/tidb/client.py b/ucloud/services/tidb/client.py new file mode 100644 index 00000000..a0d44510 --- /dev/null +++ b/ucloud/services/tidb/client.py @@ -0,0 +1,715 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.tidb.schemas import apis + + +class TiDBClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(TiDBClient, self).__init__(config, transport, middleware, logger) + + def create_ti_db_cluster_service( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateTiDBClusterService - 创建预付费实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ChargeType** (str) - (Required) 计费模式。枚举值为: Year,按年付费; Month,按月付费; Dynamic,按小时付费(需开启权限)。默认为月付 + - **Coupon** (str) - (Required) 代金券Id + - **DTType** (str) - (Required) 容灾类型:10:同可用区,20:跨可用区,默认是同可用区 + - **Name** (str) - (Required) 集群名称 + - **Password** (str) - (Required) 集群密码 + - **PubUlbId** (str) - (Required) 公网Ulb ID + - **Quantity** (float) - (Required) 购买时长。默认: 1。按小时购买(Dynamic)时无需此参数。 月付时,此参数传0,代表了购买至月末 + - **SubnetId** (str) - (Required) 子网ID + - **VPCId** (str) - (Required) VPC id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ActivityId** (int) - 活动ID。 + - **AlertStrategyIds** (list) - 告警策略IDs + - **DbVersion** (str) - 集群版本号 + - **Ip** (str) - 指定Ip地址 + - **Labels** (list) - 见 **CreateTiDBClusterServiceParamLabels** 模型定义 + - **NodeConfig** (list) - 见 **CreateTiDBClusterServiceParamNodeConfig** 模型定义 + - **OrderDetail** (list) - 见 **CreateTiDBClusterServiceParamOrderDetail** 模型定义 + - **Port** (str) - 指定端口 + - **PromotionId** (str) - 活动ID。若有产品折扣,则由各产品与计费约定。 + - **RuleId** (int) - 活动规则ID。 + - **SecGroupInfo** (list) - 见 **CreateTiDBClusterServiceParamSecGroupInfo** 模型定义 + - **TemplateId** (str) - 参数模版ID + + **Response** + + - **Data** (dict) - 见 **ServiceData** 模型定义 + + **Request Model** + + **CreateTiDBClusterServiceParamLabels** + - **Key** (str) - 用户资源标签的键值 + - **Value** (str) - 用户资源标签的值 + + + **CreateTiDBClusterServiceParamOrderDetail** + - **Multiple** (int) - 计费项数量 + - **ProductName** (str) - 计费项名称,CPU / MEM / DISK + + + **CreateTiDBClusterServiceParamSecGroupInfo** + - **Priority** (int) - 安全组优先级。取值范围[1, 5] + - **SecGroupId** (str) - 安全组 ID。至多可以同时绑定5个安全组。 + + + **CreateTiDBClusterServiceParamNodeConfig** + - **ConfigId** (str) - 节点规格ID + - **DiskSize** (int) - 节点磁盘容量 + - **NodeCount** (int) - 节点数量 + - **ServerType** (str) - 节点类型 + + + **Response Model** + + **ServiceData** + - **Id** (str) - 服务ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateTiDBClusterServiceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateTiDBClusterService", d, **kwargs) + return apis.CreateTiDBClusterServiceResponseSchema().loads(resp) + + def create_ti_db_service( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateTiDBService - + + **Request** + + - **ProjectId** (str) - (Config) + - **Region** (str) - (Config) + - **Name** (str) - (Required) + - **Password** (str) - (Required) + - **SubnetId** (str) - (Required) + - **VPCId** (str) - (Required) + - **DTType** (str) - + - **Ip** (str) - + - **Port** (str) - + - **TikvMemoryHardTh** (str) - + + **Response** + + - **Data** (dict) - 见 **ServiceID** 模型定义 + - **Message** (str) - + - **ServiceId** (str) - + + **Response Model** + + **ServiceID** + - **Id** (str) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateTiDBServiceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateTiDBService", d, **kwargs) + return apis.CreateTiDBServiceResponseSchema().loads(resp) + + def delete_ti_db_cluster_service( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteTiDBClusterService - 删除预付费实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Id** (str) - (Required) 集群ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **DeleteBackup** (bool) - 是否清理备份数据 + + **Response** + + - **ServiceId** (str) - 集群ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteTiDBClusterServiceRequestSchema().dumps(d) + + resp = self.invoke("DeleteTiDBClusterService", d, **kwargs) + return apis.DeleteTiDBClusterServiceResponseSchema().loads(resp) + + def delete_ti_db_service( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteTiDBService - + + **Request** + + - **Region** (str) - (Config) + - **Id** (str) - (Required) + + **Response** + + - **Message** (str) - + - **ServiceId** (str) - + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteTiDBServiceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("DeleteTiDBService", d, **kwargs) + return apis.DeleteTiDBServiceResponseSchema().loads(resp) + + def get_ti_db_cluster_service( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetTiDBClusterService - 获取预付费实例详情 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Id** (str) - (Required) 实例ID + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **Data** (dict) - 见 **UTiDBServiceData** 模型定义 + + **Response Model** + + **UTiDBServiceData** + - **AutoBackup** (str) - 自动备份状态 + - **BinlogState** (str) - 集群Binlog服务状态 + - **CreateTime** (int) - 创建时间 + - **DTType** (int) - 容灾类型 + - **DashboardUrl** (str) - Dashboard地址 + - **GrafanaUrl** (str) - grafana地址 + - **Id** (str) - 集群ID + - **Ip** (str) - 集群ip + - **Name** (str) - 集群名称 + - **Port** (int) - 集群端口 + - **State** (str) - 集群状态 + - **SubnetId** (str) - 子网ID + - **TiFlashState** (str) - 集群TiFlash服务状态 + - **VPCId** (str) - 私有网Id + - **Version** (str) - 集群版本 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetTiDBClusterServiceRequestSchema().dumps(d) + + resp = self.invoke("GetTiDBClusterService", d, **kwargs) + return apis.GetTiDBClusterServiceResponseSchema().loads(resp) + + def get_ti_db_cluster_uhost_specs( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetTiDBClusterUhostSpecs - 拉取预付费机器规格信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **NodeTypes** (list) - (Required) 节点类型列表 + + **Response** + + - **Data** (list) - 见 **UhostSpecs** 模型定义 + + **Response Model** + + **UhostSpecs** + - **ConfigId** (str) - 节点规格ID + - **ConfigName** (str) - 节点规格名称 + - **CoreNum** (int) - CPU核数 + - **DiskStep** (int) - 磁盘容量变更步长 + - **MaxDiskCapacity** (int) - 最大磁盘容量 + - **Memory** (int) - 内存 + - **MinDiskCapacity** (int) - 最小磁盘容量 + - **NodeType** (str) - 节点类型 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetTiDBClusterUhostSpecsRequestSchema().dumps(d) + + resp = self.invoke("GetTiDBClusterUhostSpecs", d, **kwargs) + return apis.GetTiDBClusterUhostSpecsResponseSchema().loads(resp) + + def list_ti_db_cluster_backup( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListTiDBClusterBackup - 列出按实例备份tidb的备份列表 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Id** (str) - (Required) 实例id + - **Limit** (int) - 返回数据长度,默认为30,最大30 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + + **Response** + + - **Data** (dict) - 见 **BackupData** 模型定义 + - **TotalCount** (int) - 备份总数 + + **Response Model** + + **BackupData** + - **BackupEndTime** (int) - 备份结束时间 + - **BackupId** (str) - 备份 ID + - **BackupSize** (int) - 备份文件大小,单位:MB + - **BackupStartTime** (int) - 备份起始时间 + - **BackupType** (str) - 备份方式 + - **State** (str) - 备份状态 + + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListTiDBClusterBackupRequestSchema().dumps(d) + + resp = self.invoke("ListTiDBClusterBackup", d, **kwargs) + return apis.ListTiDBClusterBackupResponseSchema().loads(resp) + + def list_ti_db_cluster_restore( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListTiDBClusterRestore - 列出实例恢复列表 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Id** (str) - (Required) 实例的服务Id + - **Limit** (int) - (Required) 返回数据长度,默认为30,最大30 + - **Offset** (int) - (Required) 列表起始位置偏移量,默认为0 + + **Response** + + - **RestoreData** (dict) - 见 **RestoreData** 模型定义 + + **Response Model** + + **RestoreData** + - **BackupId** (str) - 备份Id + - **RestoreEndTime** (int) - 恢复的结束时间 + - **RestoreId** (str) - 恢复的Id + - **RestoreStartTime** (int) - 恢复的起始时间 + - **SourceServiceId** (str) - 源实例Id + - **State** (str) - 恢复的状态 + - **TargetServiceId** (str) - 目标实例Id + + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListTiDBClusterRestoreRequestSchema().dumps(d) + + resp = self.invoke("ListTiDBClusterRestore", d, **kwargs) + return apis.ListTiDBClusterRestoreResponseSchema().loads(resp) + + def list_ti_db_cluster_service( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListTiDBClusterService - 拉取预付费实例列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (str) - 返回数据长度,默认为20,最大100 + - **Offset** (str) - 列表起始位置偏移量,默认为0 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **Data** (list) - 见 **UTiDBServiceData** 模型定义 + + **Response Model** + + **UTiDBServiceData** + - **AutoBackup** (str) - 自动备份状态 + - **BinlogState** (str) - 集群Binlog服务状态 + - **CreateTime** (int) - 创建时间 + - **DTType** (int) - 容灾类型 + - **DashboardUrl** (str) - Dashboard地址 + - **GrafanaUrl** (str) - grafana地址 + - **Id** (str) - 集群ID + - **Ip** (str) - 集群ip + - **Name** (str) - 集群名称 + - **Port** (int) - 集群端口 + - **State** (str) - 集群状态 + - **SubnetId** (str) - 子网ID + - **TiFlashState** (str) - 集群TiFlash服务状态 + - **VPCId** (str) - 私有网Id + - **Version** (str) - 集群版本 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListTiDBClusterServiceRequestSchema().dumps(d) + + resp = self.invoke("ListTiDBClusterService", d, **kwargs) + return apis.ListTiDBClusterServiceResponseSchema().loads(resp) + + def modify_ti_db_cluster_binlog( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyTiDBClusterBinlog - 开启/关闭 binlog + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Enable** (str) - (Required) binlog 状态 + - **Id** (str) - (Required) TIDB service id + - **NodeConfig** (dict) - 见 **ModifyTiDBClusterBinlogParamNodeConfig** 模型定义 + + **Response** + + - **ServiceId** (str) - ServiceId + + **Request Model** + + **ModifyTiDBClusterBinlogParamNodeConfig** + - **ConfigId** (str) - 节点配置ID + - **DiskSize** (int) - 节点磁盘大小 + - **NodeCount** (int) - 节点个数 + - **ServerType** (str) - 节点角色 + + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyTiDBClusterBinlogRequestSchema().dumps(d) + + resp = self.invoke("ModifyTiDBClusterBinlog", d, **kwargs) + return apis.ModifyTiDBClusterBinlogResponseSchema().loads(resp) + + def modify_ti_db_cluster_node( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyTiDBClusterNode - 集群扩缩容 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Id** (str) - (Required) TIDB service id + - **ScaleType** (str) - (Required) 扩缩类型,枚举值为:SCALEOUT,扩容;SCALEIN,缩容; + - **NodeConfig** (dict) - 见 **ModifyTiDBClusterNodeParamNodeConfig** 模型定义 + - **ServerId** (str) - 缩容节点ID,缩容时必填 + - **StartTime** (int) - 开始时间 + + **Response** + + - **ServiceId** (str) - ServiceId + + **Request Model** + + **ModifyTiDBClusterNodeParamNodeConfig** + - **ConfigId** (str) - 节点配置ID + - **NodeCount** (int) - 节点个数 + - **ServerType** (str) - 节点角色 + + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyTiDBClusterNodeRequestSchema().dumps(d) + + resp = self.invoke("ModifyTiDBClusterNode", d, **kwargs) + return apis.ModifyTiDBClusterNodeResponseSchema().loads(resp) + + def modify_ti_db_cluster_ti_flash( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyTiDBClusterTiFlash - 开启/关闭 tiflash + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Enable** (str) - (Required) tiflash 状态 + - **Id** (str) - (Required) TIDB service id + - **NodeConfig** (dict) - 见 **ModifyTiDBClusterTiFlashParamNodeConfig** 模型定义 + + **Response** + + - **ServiceId** (str) - ServiceId + + **Request Model** + + **ModifyTiDBClusterTiFlashParamNodeConfig** + - **ConfigId** (str) - 节点配置ID + - **DiskSize** (int) - 节点磁盘大小 + - **NodeCount** (int) - 节点个数 + - **ServerType** (str) - 节点角色 + + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyTiDBClusterTiFlashRequestSchema().dumps(d) + + resp = self.invoke("ModifyTiDBClusterTiFlash", d, **kwargs) + return apis.ModifyTiDBClusterTiFlashResponseSchema().loads(resp) + + def modify_ti_db_cluster_uhost_disk( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyTiDBClusterUhostDisk - 变更集群节点磁盘容量 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Id** (str) - (Required) 实例ID + - **ScaleType** (str) - (Required) 扩缩类型,枚举值为:SCALEOUT,扩容;SCALEIN,缩容; + - **NodeConfig** (dict) - 见 **ModifyTiDBClusterUhostDiskParamNodeConfig** 模型定义 + - **StartTime** (int) - 开始时间 + + **Response** + + - **ServiceId** (str) - 实例ID + + **Request Model** + + **ModifyTiDBClusterUhostDiskParamNodeConfig** + - **DiskSize** (int) - 磁盘容量 + - **ServerType** (str) - 节点角色 + + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyTiDBClusterUhostDiskRequestSchema().dumps(d) + + resp = self.invoke("ModifyTiDBClusterUhostDisk", d, **kwargs) + return apis.ModifyTiDBClusterUhostDiskResponseSchema().loads(resp) + + def modify_ti_db_cluster_uhost_specs( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyTiDBClusterUhostSpecs - 修改集群主机规格 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Id** (str) - (Required) 实例ID + - **NodeConfig** (dict) - 见 **ModifyTiDBClusterUhostSpecsParamNodeConfig** 模型定义 + - **StartTime** (int) - 开始时间 + + **Response** + + - **ServiceId** (str) - 实例ID + + **Request Model** + + **ModifyTiDBClusterUhostSpecsParamNodeConfig** + - **ConfigId** (str) - 机器规格ID + - **ServerType** (str) - 节点角色 + + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyTiDBClusterUhostSpecsRequestSchema().dumps(d) + + resp = self.invoke("ModifyTiDBClusterUhostSpecs", d, **kwargs) + return apis.ModifyTiDBClusterUhostSpecsResponseSchema().loads(resp) + + def set_ti_db_config( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """SetTiDBConfig - + + **Request** + + - **ProjectId** (str) - (Config) + - **Region** (str) - (Config) + - **Id** (str) - (Required) + - **Configs** (list) - 见 **SetTiDBConfigParamConfigs** 模型定义 + + **Response** + + - **ServiceId** (str) - + + **Request Model** + + **SetTiDBConfigParamConfigs** + - **Name** (str) - + - **Value** (str) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.SetTiDBConfigRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("SetTiDBConfig", d, **kwargs) + return apis.SetTiDBConfigResponseSchema().loads(resp) + + def start_ti_db_cluster_backup( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """StartTiDBClusterBackup - 开始按实例计费的tidb的备份 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Id** (str) - (Required) 实例的服务Id + - **BackupFilter** (str) - 备份过滤规则 + - **BackupTs** (str) - 备份时间 + + **Response** + + - **BackupId** (str) - 备份id + - **Message** (str) - 返回信息 + - **ServiceId** (str) - 实例id + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.StartTiDBClusterBackupRequestSchema().dumps(d) + + resp = self.invoke("StartTiDBClusterBackup", d, **kwargs) + return apis.StartTiDBClusterBackupResponseSchema().loads(resp) + + def start_ti_db_cluster_restore( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """StartTiDBClusterRestore - 开始按实例计费tidb的恢复 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BackupId** (str) - (Required) 备份id + - **Id** (str) - (Required) 实例id + + **Response** + + - **Message** (str) - 返回信息 + - **RestoreId** (str) - 恢复任务Id + - **ServiceId** (str) - 实例id + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.StartTiDBClusterRestoreRequestSchema().dumps(d) + + resp = self.invoke("StartTiDBClusterRestore", d, **kwargs) + return apis.StartTiDBClusterRestoreResponseSchema().loads(resp) + + def upgrade_ti_db_cluster( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpgradeTiDBCluster - 升级预付费tidb集群 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DbVersion** (str) - (Required) 目标版本号 + - **Id** (str) - (Required) 实例id + - **StartTime** (int) - 任务开始时间 + + **Response** + + - **Message** (str) - 返回信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpgradeTiDBClusterRequestSchema().dumps(d) + + resp = self.invoke("UpgradeTiDBCluster", d, **kwargs) + return apis.UpgradeTiDBClusterResponseSchema().loads(resp) diff --git a/ucloud/services/tidb/schemas/__init__.py b/ucloud/services/tidb/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/tidb/schemas/apis.py b/ucloud/services/tidb/schemas/apis.py new file mode 100644 index 00000000..e965d218 --- /dev/null +++ b/ucloud/services/tidb/schemas/apis.py @@ -0,0 +1,630 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.tidb.schemas import models + +""" TiDB API Schema +""" + + +""" +API: CreateTiDBClusterService + +创建预付费实例 +""" + + +class CreateTiDBClusterServiceParamLabelsSchema(schema.RequestSchema): + """CreateTiDBClusterServiceParamLabels -""" + + fields = { + "Key": fields.Str(required=False, dump_to="Key"), + "Value": fields.Str(required=False, dump_to="Value"), + } + + +class CreateTiDBClusterServiceParamOrderDetailSchema(schema.RequestSchema): + """CreateTiDBClusterServiceParamOrderDetail -""" + + fields = { + "Multiple": fields.Int(required=True, dump_to="Multiple"), + "ProductName": fields.Str(required=True, dump_to="ProductName"), + } + + +class CreateTiDBClusterServiceParamSecGroupInfoSchema(schema.RequestSchema): + """CreateTiDBClusterServiceParamSecGroupInfo -""" + + fields = { + "Priority": fields.Int(required=False, dump_to="Priority"), + "SecGroupId": fields.Str(required=False, dump_to="SecGroupId"), + } + + +class CreateTiDBClusterServiceParamNodeConfigSchema(schema.RequestSchema): + """CreateTiDBClusterServiceParamNodeConfig -""" + + fields = { + "ConfigId": fields.Str(required=True, dump_to="ConfigId"), + "DiskSize": fields.Int(required=True, dump_to="DiskSize"), + "NodeCount": fields.Int(required=True, dump_to="NodeCount"), + "ServerType": fields.Str(required=True, dump_to="ServerType"), + } + + +class CreateTiDBClusterServiceRequestSchema(schema.RequestSchema): + """CreateTiDBClusterService - 创建预付费实例""" + + fields = { + "ActivityId": fields.Int(required=False, dump_to="ActivityId"), + "AlertStrategyIds": fields.List(fields.Int()), + "ChargeType": fields.Str(required=True, dump_to="ChargeType"), + "Coupon": fields.Str(required=True, dump_to="Coupon"), + "DTType": fields.Str(required=True, dump_to="DTType"), + "DbVersion": fields.Str(required=False, dump_to="DbVersion"), + "Ip": fields.Str(required=False, dump_to="Ip"), + "Labels": fields.List(CreateTiDBClusterServiceParamLabelsSchema()), + "Name": fields.Str(required=True, dump_to="Name"), + "NodeConfig": fields.List( + CreateTiDBClusterServiceParamNodeConfigSchema() + ), + "OrderDetail": fields.List( + CreateTiDBClusterServiceParamOrderDetailSchema() + ), + "Password": fields.Str(required=True, dump_to="Password"), + "Port": fields.Str(required=False, dump_to="Port"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "PromotionId": fields.Str(required=False, dump_to="PromotionId"), + "PubUlbId": fields.Str(required=True, dump_to="PubUlbId"), + "Quantity": fields.Float(required=True, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "RuleId": fields.Int(required=False, dump_to="RuleId"), + "SecGroupInfo": fields.List( + CreateTiDBClusterServiceParamSecGroupInfoSchema() + ), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + "TemplateId": fields.Str(required=False, dump_to="TemplateId"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateTiDBClusterServiceResponseSchema(schema.ResponseSchema): + """CreateTiDBClusterService - 创建预付费实例""" + + fields = { + "Data": models.ServiceDataSchema(), + } + + +""" +API: CreateTiDBService + + +""" + + +class CreateTiDBServiceRequestSchema(schema.RequestSchema): + """CreateTiDBService -""" + + fields = { + "DTType": fields.Str(required=False, dump_to="DTType"), + "Ip": fields.Str(required=False, dump_to="Ip"), + "Name": fields.Str(required=True, dump_to="Name"), + "Password": fields.Str(required=True, dump_to="Password"), + "Port": fields.Str(required=False, dump_to="Port"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + "TikvMemoryHardTh": fields.Str( + required=False, dump_to="TikvMemoryHardTh" + ), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + } + + +class CreateTiDBServiceResponseSchema(schema.ResponseSchema): + """CreateTiDBService -""" + + fields = { + "Data": models.ServiceIDSchema(required=False, load_from="Data"), + "Message": fields.Str(required=False, load_from="Message"), + "ServiceId": fields.Str(required=False, load_from="ServiceId"), + } + + +""" +API: DeleteTiDBClusterService + +删除预付费实例 +""" + + +class DeleteTiDBClusterServiceRequestSchema(schema.RequestSchema): + """DeleteTiDBClusterService - 删除预付费实例""" + + fields = { + "DeleteBackup": fields.Bool(required=False, dump_to="DeleteBackup"), + "Id": fields.Str(required=True, dump_to="Id"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DeleteTiDBClusterServiceResponseSchema(schema.ResponseSchema): + """DeleteTiDBClusterService - 删除预付费实例""" + + fields = { + "ServiceId": fields.Str(required=True, load_from="ServiceId"), + } + + +""" +API: DeleteTiDBService + + +""" + + +class DeleteTiDBServiceRequestSchema(schema.RequestSchema): + """DeleteTiDBService -""" + + fields = { + "Id": fields.Str(required=True, dump_to="Id"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DeleteTiDBServiceResponseSchema(schema.ResponseSchema): + """DeleteTiDBService -""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "ServiceId": fields.Str(required=False, load_from="ServiceId"), + } + + +""" +API: GetTiDBClusterService + +获取预付费实例详情 +""" + + +class GetTiDBClusterServiceRequestSchema(schema.RequestSchema): + """GetTiDBClusterService - 获取预付费实例详情""" + + fields = { + "Id": fields.Str(required=True, dump_to="Id"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class GetTiDBClusterServiceResponseSchema(schema.ResponseSchema): + """GetTiDBClusterService - 获取预付费实例详情""" + + fields = { + "Data": models.UTiDBServiceDataSchema(), + } + + +""" +API: GetTiDBClusterUhostSpecs + +拉取预付费机器规格信息 +""" + + +class GetTiDBClusterUhostSpecsRequestSchema(schema.RequestSchema): + """GetTiDBClusterUhostSpecs - 拉取预付费机器规格信息""" + + fields = { + "NodeTypes": fields.List(fields.Str()), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class GetTiDBClusterUhostSpecsResponseSchema(schema.ResponseSchema): + """GetTiDBClusterUhostSpecs - 拉取预付费机器规格信息""" + + fields = { + "Data": fields.List( + models.UhostSpecsSchema(), required=True, load_from="Data" + ), + } + + +""" +API: ListTiDBClusterBackup + +列出按实例备份tidb的备份列表 +""" + + +class ListTiDBClusterBackupRequestSchema(schema.RequestSchema): + """ListTiDBClusterBackup - 列出按实例备份tidb的备份列表""" + + fields = { + "Id": fields.Str(required=True, dump_to="Id"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class ListTiDBClusterBackupResponseSchema(schema.ResponseSchema): + """ListTiDBClusterBackup - 列出按实例备份tidb的备份列表""" + + fields = { + "Data": models.BackupDataSchema(), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: ListTiDBClusterRestore + +列出实例恢复列表 +""" + + +class ListTiDBClusterRestoreRequestSchema(schema.RequestSchema): + """ListTiDBClusterRestore - 列出实例恢复列表""" + + fields = { + "Id": fields.Str(required=True, dump_to="Id"), + "Limit": fields.Int(required=True, dump_to="Limit"), + "Offset": fields.Int(required=True, dump_to="Offset"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class ListTiDBClusterRestoreResponseSchema(schema.ResponseSchema): + """ListTiDBClusterRestore - 列出实例恢复列表""" + + fields = { + "RestoreData": models.RestoreDataSchema(), + } + + +""" +API: ListTiDBClusterService + +拉取预付费实例列表 +""" + + +class ListTiDBClusterServiceRequestSchema(schema.RequestSchema): + """ListTiDBClusterService - 拉取预付费实例列表""" + + fields = { + "Limit": fields.Str(required=False, dump_to="Limit"), + "Offset": fields.Str(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class ListTiDBClusterServiceResponseSchema(schema.ResponseSchema): + """ListTiDBClusterService - 拉取预付费实例列表""" + + fields = { + "Data": fields.List( + models.UTiDBServiceDataSchema(), required=True, load_from="Data" + ), + } + + +""" +API: ModifyTiDBClusterBinlog + +开启/关闭 binlog +""" + + +class ModifyTiDBClusterBinlogParamNodeConfigSchema(schema.RequestSchema): + """ModifyTiDBClusterBinlogParamNodeConfig -""" + + fields = { + "ConfigId": fields.Str(required=True, dump_to="ConfigId"), + "DiskSize": fields.Int(required=True, dump_to="DiskSize"), + "NodeCount": fields.Int(required=True, dump_to="NodeCount"), + "ServerType": fields.Str(required=True, dump_to="ServerType"), + } + + +class ModifyTiDBClusterBinlogRequestSchema(schema.RequestSchema): + """ModifyTiDBClusterBinlog - 开启/关闭 binlog""" + + fields = { + "Enable": fields.Str(required=True, dump_to="Enable"), + "Id": fields.Str(required=True, dump_to="Id"), + "NodeConfig": ModifyTiDBClusterBinlogParamNodeConfigSchema( + required=False, dump_to="NodeConfig" + ), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class ModifyTiDBClusterBinlogResponseSchema(schema.ResponseSchema): + """ModifyTiDBClusterBinlog - 开启/关闭 binlog""" + + fields = { + "ServiceId": fields.Str(required=False, load_from="ServiceId"), + } + + +""" +API: ModifyTiDBClusterNode + +集群扩缩容 +""" + + +class ModifyTiDBClusterNodeParamNodeConfigSchema(schema.RequestSchema): + """ModifyTiDBClusterNodeParamNodeConfig -""" + + fields = { + "ConfigId": fields.Str(required=True, dump_to="ConfigId"), + "NodeCount": fields.Int(required=True, dump_to="NodeCount"), + "ServerType": fields.Str(required=True, dump_to="ServerType"), + } + + +class ModifyTiDBClusterNodeRequestSchema(schema.RequestSchema): + """ModifyTiDBClusterNode - 集群扩缩容""" + + fields = { + "Id": fields.Str(required=True, dump_to="Id"), + "NodeConfig": ModifyTiDBClusterNodeParamNodeConfigSchema( + required=False, dump_to="NodeConfig" + ), + "Region": fields.Str(required=True, dump_to="Region"), + "ScaleType": fields.Str(required=True, dump_to="ScaleType"), + "ServerId": fields.Str(required=False, dump_to="ServerId"), + "StartTime": fields.Int(required=False, dump_to="StartTime"), + } + + +class ModifyTiDBClusterNodeResponseSchema(schema.ResponseSchema): + """ModifyTiDBClusterNode - 集群扩缩容""" + + fields = { + "ServiceId": fields.Str(required=False, load_from="ServiceId"), + } + + +""" +API: ModifyTiDBClusterTiFlash + +开启/关闭 tiflash +""" + + +class ModifyTiDBClusterTiFlashParamNodeConfigSchema(schema.RequestSchema): + """ModifyTiDBClusterTiFlashParamNodeConfig -""" + + fields = { + "ConfigId": fields.Str(required=True, dump_to="ConfigId"), + "DiskSize": fields.Int(required=True, dump_to="DiskSize"), + "NodeCount": fields.Int(required=True, dump_to="NodeCount"), + "ServerType": fields.Str(required=True, dump_to="ServerType"), + } + + +class ModifyTiDBClusterTiFlashRequestSchema(schema.RequestSchema): + """ModifyTiDBClusterTiFlash - 开启/关闭 tiflash""" + + fields = { + "Enable": fields.Str(required=True, dump_to="Enable"), + "Id": fields.Str(required=True, dump_to="Id"), + "NodeConfig": ModifyTiDBClusterTiFlashParamNodeConfigSchema( + required=False, dump_to="NodeConfig" + ), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class ModifyTiDBClusterTiFlashResponseSchema(schema.ResponseSchema): + """ModifyTiDBClusterTiFlash - 开启/关闭 tiflash""" + + fields = { + "ServiceId": fields.Str(required=False, load_from="ServiceId"), + } + + +""" +API: ModifyTiDBClusterUhostDisk + +变更集群节点磁盘容量 +""" + + +class ModifyTiDBClusterUhostDiskParamNodeConfigSchema(schema.RequestSchema): + """ModifyTiDBClusterUhostDiskParamNodeConfig -""" + + fields = { + "DiskSize": fields.Int(required=True, dump_to="DiskSize"), + "ServerType": fields.Str(required=True, dump_to="ServerType"), + } + + +class ModifyTiDBClusterUhostDiskRequestSchema(schema.RequestSchema): + """ModifyTiDBClusterUhostDisk - 变更集群节点磁盘容量""" + + fields = { + "Id": fields.Str(required=True, dump_to="Id"), + "NodeConfig": ModifyTiDBClusterUhostDiskParamNodeConfigSchema( + required=False, dump_to="NodeConfig" + ), + "Region": fields.Str(required=True, dump_to="Region"), + "ScaleType": fields.Str(required=True, dump_to="ScaleType"), + "StartTime": fields.Int(required=False, dump_to="StartTime"), + } + + +class ModifyTiDBClusterUhostDiskResponseSchema(schema.ResponseSchema): + """ModifyTiDBClusterUhostDisk - 变更集群节点磁盘容量""" + + fields = { + "ServiceId": fields.Str(required=True, load_from="ServiceId"), + } + + +""" +API: ModifyTiDBClusterUhostSpecs + +修改集群主机规格 +""" + + +class ModifyTiDBClusterUhostSpecsParamNodeConfigSchema(schema.RequestSchema): + """ModifyTiDBClusterUhostSpecsParamNodeConfig -""" + + fields = { + "ConfigId": fields.Str(required=True, dump_to="ConfigId"), + "ServerType": fields.Str(required=True, dump_to="ServerType"), + } + + +class ModifyTiDBClusterUhostSpecsRequestSchema(schema.RequestSchema): + """ModifyTiDBClusterUhostSpecs - 修改集群主机规格""" + + fields = { + "Id": fields.Str(required=True, dump_to="Id"), + "NodeConfig": ModifyTiDBClusterUhostSpecsParamNodeConfigSchema( + required=False, dump_to="NodeConfig" + ), + "Region": fields.Str(required=True, dump_to="Region"), + "StartTime": fields.Int(required=False, dump_to="StartTime"), + } + + +class ModifyTiDBClusterUhostSpecsResponseSchema(schema.ResponseSchema): + """ModifyTiDBClusterUhostSpecs - 修改集群主机规格""" + + fields = { + "ServiceId": fields.Str(required=True, load_from="ServiceId"), + } + + +""" +API: SetTiDBConfig + + +""" + + +class SetTiDBConfigParamConfigsSchema(schema.RequestSchema): + """SetTiDBConfigParamConfigs -""" + + fields = { + "Name": fields.Str(required=True, dump_to="Name"), + "Value": fields.Str(required=True, dump_to="Value"), + } + + +class SetTiDBConfigRequestSchema(schema.RequestSchema): + """SetTiDBConfig -""" + + fields = { + "Configs": fields.List(SetTiDBConfigParamConfigsSchema()), + "Id": fields.Str(required=True, dump_to="Id"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class SetTiDBConfigResponseSchema(schema.ResponseSchema): + """SetTiDBConfig -""" + + fields = { + "ServiceId": fields.Str(required=False, load_from="ServiceId"), + } + + +""" +API: StartTiDBClusterBackup + +开始按实例计费的tidb的备份 +""" + + +class StartTiDBClusterBackupRequestSchema(schema.RequestSchema): + """StartTiDBClusterBackup - 开始按实例计费的tidb的备份""" + + fields = { + "BackupFilter": fields.Str(required=False, dump_to="BackupFilter"), + "BackupTs": fields.Str(required=False, dump_to="BackupTs"), + "Id": fields.Str(required=True, dump_to="Id"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class StartTiDBClusterBackupResponseSchema(schema.ResponseSchema): + """StartTiDBClusterBackup - 开始按实例计费的tidb的备份""" + + fields = { + "BackupId": fields.Str(required=True, load_from="BackupId"), + "Message": fields.Str(required=False, load_from="Message"), + "ServiceId": fields.Str(required=True, load_from="ServiceId"), + } + + +""" +API: StartTiDBClusterRestore + +开始按实例计费tidb的恢复 +""" + + +class StartTiDBClusterRestoreRequestSchema(schema.RequestSchema): + """StartTiDBClusterRestore - 开始按实例计费tidb的恢复""" + + fields = { + "BackupId": fields.Str(required=True, dump_to="BackupId"), + "Id": fields.Str(required=True, dump_to="Id"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class StartTiDBClusterRestoreResponseSchema(schema.ResponseSchema): + """StartTiDBClusterRestore - 开始按实例计费tidb的恢复""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "RestoreId": fields.Str(required=True, load_from="RestoreId"), + "ServiceId": fields.Str(required=True, load_from="ServiceId"), + } + + +""" +API: UpgradeTiDBCluster + +升级预付费tidb集群 +""" + + +class UpgradeTiDBClusterRequestSchema(schema.RequestSchema): + """UpgradeTiDBCluster - 升级预付费tidb集群""" + + fields = { + "DbVersion": fields.Str(required=True, dump_to="DbVersion"), + "Id": fields.Str(required=True, dump_to="Id"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "StartTime": fields.Int(required=False, dump_to="StartTime"), + } + + +class UpgradeTiDBClusterResponseSchema(schema.ResponseSchema): + """UpgradeTiDBCluster - 升级预付费tidb集群""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } diff --git a/ucloud/services/tidb/schemas/models.py b/ucloud/services/tidb/schemas/models.py new file mode 100644 index 00000000..1485c42b --- /dev/null +++ b/ucloud/services/tidb/schemas/models.py @@ -0,0 +1,95 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class ServiceDataSchema(schema.ResponseSchema): + """ServiceData - 服务ID""" + + fields = { + "Id": fields.Str(required=True, load_from="Id"), + } + + +class ServiceIDSchema(schema.ResponseSchema): + """ServiceID -""" + + fields = { + "Id": fields.Str(required=True, load_from="Id"), + } + + +class UTiDBServiceDataSchema(schema.ResponseSchema): + """UTiDBServiceData - 预付费实例详情""" + + fields = { + "AutoBackup": fields.Str(required=False, load_from="AutoBackup"), + "BinlogState": fields.Str(required=False, load_from="BinlogState"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DTType": fields.Int(required=False, load_from="DTType"), + "DashboardUrl": fields.Str(required=False, load_from="DashboardUrl"), + "GrafanaUrl": fields.Str(required=False, load_from="GrafanaUrl"), + "Id": fields.Str(required=False, load_from="Id"), + "Ip": fields.Str(required=False, load_from="Ip"), + "Name": fields.Str(required=False, load_from="Name"), + "Port": fields.Int(required=False, load_from="Port"), + "State": fields.Str(required=False, load_from="State"), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "TiFlashState": fields.Str(required=False, load_from="TiFlashState"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + "Version": fields.Str(required=False, load_from="Version"), + } + + +class UhostSpecsSchema(schema.ResponseSchema): + """UhostSpecs - 预付费机器规格""" + + fields = { + "ConfigId": fields.Str(required=False, load_from="ConfigId"), + "ConfigName": fields.Str(required=False, load_from="ConfigName"), + "CoreNum": fields.Int(required=False, load_from="CoreNum"), + "DiskStep": fields.Int(required=False, load_from="DiskStep"), + "MaxDiskCapacity": fields.Int( + required=False, load_from="MaxDiskCapacity" + ), + "Memory": fields.Int(required=False, load_from="Memory"), + "MinDiskCapacity": fields.Int( + required=False, load_from="MinDiskCapacity" + ), + "NodeType": fields.Str(required=False, load_from="NodeType"), + } + + +class BackupDataSchema(schema.ResponseSchema): + """BackupData - Backup数据""" + + fields = { + "BackupEndTime": fields.Int(required=True, load_from="BackupEndTime"), + "BackupId": fields.Str(required=True, load_from="BackupId"), + "BackupSize": fields.Int(required=True, load_from="BackupSize"), + "BackupStartTime": fields.Int( + required=True, load_from="BackupStartTime" + ), + "BackupType": fields.Str(required=True, load_from="BackupType"), + "State": fields.Str(required=True, load_from="State"), + } + + +class RestoreDataSchema(schema.ResponseSchema): + """RestoreData - 恢复的数据""" + + fields = { + "BackupId": fields.Str(required=True, load_from="BackupId"), + "RestoreEndTime": fields.Int(required=True, load_from="RestoreEndTime"), + "RestoreId": fields.Str(required=True, load_from="RestoreId"), + "RestoreStartTime": fields.Int( + required=True, load_from="RestoreStartTime" + ), + "SourceServiceId": fields.Str( + required=True, load_from="SourceServiceId" + ), + "State": fields.Str(required=True, load_from="State"), + "TargetServiceId": fields.Str( + required=True, load_from="TargetServiceId" + ), + } diff --git a/ucloud/services/uaaa/__init__.py b/ucloud/services/uaaa/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/uaaa/client.py b/ucloud/services/uaaa/client.py new file mode 100644 index 00000000..2159a516 --- /dev/null +++ b/ucloud/services/uaaa/client.py @@ -0,0 +1,311 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.uaaa.schemas import apis + + +class UAAAClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UAAAClient, self).__init__(config, transport, middleware, logger) + + def create_app_repo( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateAppRepo - 创建应用仓库加速实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ChargeType** (str) - (Required) 计费类型(年:'Year', 月:'Month',小时:'Dynamic') + - **Name** (str) - (Required) 名称 + - **VPCId** (list) - (Required) 待加速的VPCId ( 目前只允许一个) + - **CouponId** (str) - 代金券 + - **Description** (str) - 应用仓库描述 + - **Quantity** (int) - 数量(ChargeType对应的数值): ChargeType = Month 时,默认0 ,其他条件为必须字段 + - **RecordName** (list) - 记录名称,需在给定列表中 + + **Response** + + - **InstanceId** (str) - 应用仓库加速实例ID + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateAppRepoRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateAppRepo", d, **kwargs) + return apis.CreateAppRepoResponseSchema().loads(resp) + + def delete_app_repo( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteAppRepo - 删除应用仓库加速实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceId** (str) - (Required) 实例 ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteAppRepoRequestSchema().dumps(d) + + resp = self.invoke("DeleteAppRepo", d, **kwargs) + return apis.DeleteAppRepoResponseSchema().loads(resp) + + def describe_app_repo( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeAppRepo - 查询应用仓库实例信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceId** (str) - 应用仓库加速实例ID + + **Response** + + - **DataSet** (list) - 见 **AppRepoInstance** 模型定义 + - **Message** (str) - 错误信息 + + **Response Model** + + **AppRepoInstance** + - **ChargeType** (str) - 计费类型 + - **CreateTime** (int) - 创建时间。格式为Unix Timestamp + - **Description** (str) - 应用仓库描述信息 + - **ExpireTime** (int) - 到期时间 + - **InstanceId** (str) - 应用仓库实例ID + - **Name** (str) - 应用仓库名 + - **RecordName** (list) - 应用仓库绑定的加速域名 + - **VPC** (list) - 应用仓库绑定的vpc 信息 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeAppRepoRequestSchema().dumps(d) + + resp = self.invoke("DescribeAppRepo", d, **kwargs) + return apis.DescribeAppRepoResponseSchema().loads(resp) + + def describe_app_repo_permit_domain( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeAppRepoPermitDomain - 查询允许加速的域名白名单 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + + **Response** + + - **DataSet** (list) - 见 **DomainDetail** 模型定义 + - **Message** (str) - 错误信息 + + **Response Model** + + **DomainDetail** + - **Info** (dict) - 见 **DomainInfo** 模型定义 + - **Redirect** (list) - 见 **DomainInfo** 模型定义 + + + **DomainInfo** + - **Desc** (str) - 备注信息 + - **DomainName** (str) - 域名解析记录名称 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeAppRepoPermitDomainRequestSchema().dumps(d) + + resp = self.invoke("DescribeAppRepoPermitDomain", d, **kwargs) + return apis.DescribeAppRepoPermitDomainResponseSchema().loads(resp) + + def describe_app_repo_post_paid_record( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeAppRepoPostPaidRecord - 查询应用仓库实例后付费记录 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **EndTime** (int) - (Required) 结束时间 (StartTime dict: + """GetAppRepoPrice - 获取应用仓库实例价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ChargeType** (str) - (Required) 计费类型 + - **DomainQuantity** (int) - 域名绑定数量( >= 0) ,默认: 0 + - **Quantity** (int) - 数量(和ChargeType相关): ChargeType = Month, 默认值为0 , 其他情况为必传字段 + + **Response** + + - **Price** (float) - 价格 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetAppRepoPriceRequestSchema().dumps(d) + + resp = self.invoke("GetAppRepoPrice", d, **kwargs) + return apis.GetAppRepoPriceResponseSchema().loads(resp) + + def get_app_repo_upgrade_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetAppRepoUpgradePrice - 获取改配后的退/补金额 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceId** (str) - (Required) 实例资源id + - **DomainQuantity** (int) - 绑定域名的数量 + + **Response** + + - **Price** (float) - 应补差价(单位:元) + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetAppRepoUpgradePriceRequestSchema().dumps(d) + + resp = self.invoke("GetAppRepoUpgradePrice", d, **kwargs) + return apis.GetAppRepoUpgradePriceResponseSchema().loads(resp) + + def update_app_repo( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateAppRepo - 修改应用仓库实例基本信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceId** (str) - (Required) 应用仓库实例ID + - **Description** (str) - 应用仓库备注信息 + - **Name** (str) - 应用仓库名称 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateAppRepoRequestSchema().dumps(d) + + resp = self.invoke("UpdateAppRepo", d, **kwargs) + return apis.UpdateAppRepoResponseSchema().loads(resp) + + def update_app_repo_domain_name( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateAppRepoDomainName - 更新应用仓库实例绑定的加速域名 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceId** (str) - (Required) 应用仓库实例ID + - **CouponId** (str) - 代金券 + - **RecordName** (list) - 加速域名列表。 不填写,相当于清空所有加速域名 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateAppRepoDomainNameRequestSchema().dumps(d) + + resp = self.invoke("UpdateAppRepoDomainName", d, **kwargs) + return apis.UpdateAppRepoDomainNameResponseSchema().loads(resp) diff --git a/ucloud/services/uaaa/schemas/__init__.py b/ucloud/services/uaaa/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/uaaa/schemas/apis.py b/ucloud/services/uaaa/schemas/apis.py new file mode 100644 index 00000000..294f287c --- /dev/null +++ b/ucloud/services/uaaa/schemas/apis.py @@ -0,0 +1,252 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.uaaa.schemas import models + +""" UAAA API Schema +""" + + +""" +API: CreateAppRepo + +创建应用仓库加速实例 +""" + + +class CreateAppRepoRequestSchema(schema.RequestSchema): + """CreateAppRepo - 创建应用仓库加速实例""" + + fields = { + "ChargeType": fields.Str(required=True, dump_to="ChargeType"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "Description": fields.Str(required=False, dump_to="Description"), + "Name": fields.Str(required=True, dump_to="Name"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "RecordName": fields.List(fields.Str()), + "Region": fields.Str(required=True, dump_to="Region"), + "VPCId": fields.List(fields.Str()), + } + + +class CreateAppRepoResponseSchema(schema.ResponseSchema): + """CreateAppRepo - 创建应用仓库加速实例""" + + fields = { + "InstanceId": fields.Str(required=False, load_from="InstanceId"), + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: DeleteAppRepo + +删除应用仓库加速实例 +""" + + +class DeleteAppRepoRequestSchema(schema.RequestSchema): + """DeleteAppRepo - 删除应用仓库加速实例""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DeleteAppRepoResponseSchema(schema.ResponseSchema): + """DeleteAppRepo - 删除应用仓库加速实例""" + + fields = {} + + +""" +API: DescribeAppRepo + +查询应用仓库实例信息 +""" + + +class DescribeAppRepoRequestSchema(schema.RequestSchema): + """DescribeAppRepo - 查询应用仓库实例信息""" + + fields = { + "InstanceId": fields.Str(required=False, dump_to="InstanceId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DescribeAppRepoResponseSchema(schema.ResponseSchema): + """DescribeAppRepo - 查询应用仓库实例信息""" + + fields = { + "DataSet": fields.List( + models.AppRepoInstanceSchema(), required=False, load_from="DataSet" + ), + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: DescribeAppRepoPermitDomain + +查询允许加速的域名白名单 +""" + + +class DescribeAppRepoPermitDomainRequestSchema(schema.RequestSchema): + """DescribeAppRepoPermitDomain - 查询允许加速的域名白名单""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DescribeAppRepoPermitDomainResponseSchema(schema.ResponseSchema): + """DescribeAppRepoPermitDomain - 查询允许加速的域名白名单""" + + fields = { + "DataSet": fields.List( + models.DomainDetailSchema(), required=False, load_from="DataSet" + ), + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: DescribeAppRepoPostPaidRecord + +查询应用仓库实例后付费记录 +""" + + +class DescribeAppRepoPostPaidRecordRequestSchema(schema.RequestSchema): + """DescribeAppRepoPostPaidRecord - 查询应用仓库实例后付费记录""" + + fields = { + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "StartTime": fields.Int(required=True, dump_to="StartTime"), + } + + +class DescribeAppRepoPostPaidRecordResponseSchema(schema.ResponseSchema): + """DescribeAppRepoPostPaidRecord - 查询应用仓库实例后付费记录""" + + fields = { + "DataSet": fields.List( + models.TPostpaidBaseSchema(), required=False, load_from="DataSet" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: GetAppRepoPrice + +获取应用仓库实例价格 +""" + + +class GetAppRepoPriceRequestSchema(schema.RequestSchema): + """GetAppRepoPrice - 获取应用仓库实例价格""" + + fields = { + "ChargeType": fields.Str(required=True, dump_to="ChargeType"), + "DomainQuantity": fields.Int(required=False, dump_to="DomainQuantity"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class GetAppRepoPriceResponseSchema(schema.ResponseSchema): + """GetAppRepoPrice - 获取应用仓库实例价格""" + + fields = { + "Price": fields.Float(required=False, load_from="Price"), + } + + +""" +API: GetAppRepoUpgradePrice + +获取改配后的退/补金额 +""" + + +class GetAppRepoUpgradePriceRequestSchema(schema.RequestSchema): + """GetAppRepoUpgradePrice - 获取改配后的退/补金额""" + + fields = { + "DomainQuantity": fields.Int(required=False, dump_to="DomainQuantity"), + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class GetAppRepoUpgradePriceResponseSchema(schema.ResponseSchema): + """GetAppRepoUpgradePrice - 获取改配后的退/补金额""" + + fields = { + "Price": fields.Float(required=False, load_from="Price"), + } + + +""" +API: UpdateAppRepo + +修改应用仓库实例基本信息 +""" + + +class UpdateAppRepoRequestSchema(schema.RequestSchema): + """UpdateAppRepo - 修改应用仓库实例基本信息""" + + fields = { + "Description": fields.Str(required=False, dump_to="Description"), + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class UpdateAppRepoResponseSchema(schema.ResponseSchema): + """UpdateAppRepo - 修改应用仓库实例基本信息""" + + fields = {} + + +""" +API: UpdateAppRepoDomainName + +更新应用仓库实例绑定的加速域名 +""" + + +class UpdateAppRepoDomainNameRequestSchema(schema.RequestSchema): + """UpdateAppRepoDomainName - 更新应用仓库实例绑定的加速域名""" + + fields = { + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "RecordName": fields.List(fields.Str()), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class UpdateAppRepoDomainNameResponseSchema(schema.ResponseSchema): + """UpdateAppRepoDomainName - 更新应用仓库实例绑定的加速域名""" + + fields = {} diff --git a/ucloud/services/uaaa/schemas/models.py b/ucloud/services/uaaa/schemas/models.py new file mode 100644 index 00000000..76ea4ce9 --- /dev/null +++ b/ucloud/services/uaaa/schemas/models.py @@ -0,0 +1,47 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class AppRepoInstanceSchema(schema.ResponseSchema): + """AppRepoInstance - 应用仓库实例""" + + fields = { + "ChargeType": fields.Str(required=True, load_from="ChargeType"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "Description": fields.Str(required=True, load_from="Description"), + "ExpireTime": fields.Int(required=True, load_from="ExpireTime"), + "InstanceId": fields.Str(required=True, load_from="InstanceId"), + "Name": fields.Str(required=True, load_from="Name"), + "RecordName": fields.List(fields.Str()), + "VPC": fields.List(fields.Str()), + } + + +class DomainInfoSchema(schema.ResponseSchema): + """DomainInfo - 域名信息""" + + fields = { + "Desc": fields.Str(required=False, load_from="Desc"), + "DomainName": fields.Str(required=False, load_from="DomainName"), + } + + +class DomainDetailSchema(schema.ResponseSchema): + """DomainDetail - 域名详细信息""" + + fields = { + "Info": DomainInfoSchema(), + "Redirect": fields.List(DomainInfoSchema()), + } + + +class TPostpaidBaseSchema(schema.ResponseSchema): + """TPostpaidBase - 后付费记录""" + + fields = { + "EndTime": fields.Int(required=True, load_from="EndTime"), + "InstanceId": fields.Str(required=True, load_from="InstanceId"), + "StartTime": fields.Int(required=True, load_from="StartTime"), + "TrafficSum": fields.Int(required=True, load_from="TrafficSum"), + } diff --git a/ucloud/services/uaccount/client.py b/ucloud/services/uaccount/client.py index 17bea01c..9b0bbf11 100644 --- a/ucloud/services/uaccount/client.py +++ b/ucloud/services/uaccount/client.py @@ -1,192 +1,547 @@ -""" Code is generated by ucloud-model, DO NOT EDIT IT. """ - -import typing - - -from ucloud.core.client import Client -from ucloud.services.uaccount.schemas import apis - - -class UAccountClient(Client): - def __init__( - self, config: dict, transport=None, middleware=None, logger=None - ): - super(UAccountClient, self).__init__( - config, transport, middleware, logger - ) - - def create_project( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ CreateProject - 创建项目 - - **Request** - - - **ProjectName** (str) - (Required) 项目名称 - - **Response** - - - **ProjectId** (str) - 所创建项目的Id - - """ - # build request - d = {} - req and d.update(req) - d = apis.CreateProjectRequestSchema().dumps(d) - - # build options - kwargs["max_retries"] = 0 # ignore retry when api is not idempotent - - resp = self.invoke("CreateProject", d, **kwargs) - return apis.CreateProjectResponseSchema().loads(resp) - - def get_project_list( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ GetProjectList - 获取项目列表 - - **Request** - - - **IsFinance** (str) - 是否是财务账号 - - **Response** - - - **ProjectCount** (int) - 项目总数 - - **ProjectSet** (list) - 见 **ProjectListInfo** 模型定义 - - **Response Model** - - **ProjectListInfo** - - - **CreateTime** (int) - 创建时间(Unix时间戳) - - **IsDefault** (bool) - 是否为默认项目 - - **MemberCount** (int) - 项目下成员数量 - - **ParentId** (str) - 父项目ID - - **ParentName** (str) - 父项目名称 - - **ProjectId** (str) - 项目ID - - **ProjectName** (str) - 项目名称 - - **ResourceCount** (int) - 项目下资源数量 - - """ - # build request - d = {} - req and d.update(req) - d = apis.GetProjectListRequestSchema().dumps(d) - - resp = self.invoke("GetProjectList", d, **kwargs) - return apis.GetProjectListResponseSchema().loads(resp) - - def get_region(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ GetRegion - 获取用户在各数据中心的权限等信息 - - **Request** - - - **Response** - - - **Regions** (list) - 见 **RegionInfo** 模型定义 - - **Response Model** - - **RegionInfo** - - - **BitMaps** (str) - 用户在此数据中心的权限位 - - **IsDefault** (bool) - 是否用户当前默认数据中心 - - **Region** (str) - 地域名字,如cn-bj - - **RegionId** (int) - 数据中心ID - - **RegionName** (str) - 数据中心名称 - - **Zone** (str) - 可用区名字,如cn-bj-01 - - """ - # build request - d = {} - req and d.update(req) - d = apis.GetRegionRequestSchema().dumps(d) - - resp = self.invoke("GetRegion", d, **kwargs) - return apis.GetRegionResponseSchema().loads(resp) - - def get_user_info( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ GetUserInfo - 获取用户信息 - - **Request** - - - **Response** - - - **DataSet** (list) - 见 **UserInfo** 模型定义 - - **Response Model** - - **UserInfo** - - - **Admin** (int) - 是否超级管理员 0:否 1:是 - - **Administrator** (str) - 管理员 - - **AuthState** (str) - 实名认证状态 - - **City** (str) - 城市 - - **CompanyName** (str) - 公司名称 - - **Finance** (int) - 是否有财务权限 0:否 1:是 - - **IndustryType** (int) - 所属行业 - - **PhonePrefix** (str) - 国际号码前缀 - - **Province** (str) - 省份 - - **UserAddress** (str) - 公司地址 - - **UserEmail** (str) - 用户邮箱 - - **UserId** (int) - 用户Id - - **UserName** (str) - 称呼 - - **UserPhone** (str) - 用户手机 - - **UserType** (int) - 会员类型 - - **UserVersion** (int) - 是否子帐户(大于100为子帐户) - - """ - # build request - d = {} - req and d.update(req) - d = apis.GetUserInfoRequestSchema().dumps(d) - - resp = self.invoke("GetUserInfo", d, **kwargs) - return apis.GetUserInfoResponseSchema().loads(resp) - - def modify_project( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ ModifyProject - 修改项目 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **ProjectName** (str) - (Required) 新的项目名称 - - **Response** - - - """ - # build request - d = {"ProjectId": self.config.project_id} - req and d.update(req) - d = apis.ModifyProjectRequestSchema().dumps(d) - - resp = self.invoke("ModifyProject", d, **kwargs) - return apis.ModifyProjectResponseSchema().loads(resp) - - def terminate_project( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ TerminateProject - 删除项目 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID,不填写为默认项目,子帐号必须填写。 - - **Response** - - - """ - # build request - d = {"ProjectId": self.config.project_id} - req and d.update(req) - d = apis.TerminateProjectRequestSchema().dumps(d) - - resp = self.invoke("TerminateProject", d, **kwargs) - return apis.TerminateProjectResponseSchema().loads(resp) +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.uaccount.schemas import apis + + +class UAccountClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UAccountClient, self).__init__( + config, transport, middleware, logger + ) + + def add_member_to_project( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AddMemberToProject - 添加成员到项目 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID,请参考 `GetProjectList接口 `_ 的描述。不填写为创建时间最早的项目。 + - **CharacterId** (str) - (Required) 被加入成员归属角色ID + - **MemberEmail** (str) - (Required) 被加入成员Email + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.AddMemberToProjectRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AddMemberToProject", d, **kwargs) + return apis.AddMemberToProjectResponseSchema().loads(resp) + + def create_character( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateCharacter - 创建角色 + + **Request** + + - **CharacterName** (str) - (Required) 角色名称,不得与现有角色重名 + - **Add** (list) - 角色对产品的权限(增) + - **CharacterDescription** (str) - 角色描述 + - **Del** (list) - 角色对产品的权限(删) + - **Get** (list) - 角色对产品的权限(查) + - **Mod** (list) - 角色对产品的权限(改) + + **Response** + + - **CharacterId** (str) - 角色ID + + """ + # build request + d = {} + req and d.update(req) + d = apis.CreateCharacterRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateCharacter", d, **kwargs) + return apis.CreateCharacterResponseSchema().loads(resp) + + def create_project( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateProject - + + **Request** + + - **ProjectName** (str) - (Required) + + **Response** + + - **ProjectId** (str) - + + """ + # build request + d = {} + req and d.update(req) + d = apis.CreateProjectRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateProject", d, **kwargs) + return apis.CreateProjectResponseSchema().loads(resp) + + def describe_character_list( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeCharacterList - 获取角色列表 + + **Request** + + - **Limit** (int) - 角色列表的最大数量,默认为20 + - **Offset** (int) - 角色列表的偏移量,默认为0 + + **Response** + + - **CharacterSet** (list) - 见 **CharacterSet** 模型定义 + - **TotalCount** (int) - 角色总数 + + **Response Model** + + **CharacterSet** + - **CharacterDescription** (str) - 角色描述 + - **CharacterId** (str) - 角色ID + - **CharacterName** (str) - 角色名 + - **Modifiable** (bool) - 可修改性 + - **PermissionSet** (list) - 见 **PermissionSet** 模型定义 + + + **PermissionSet** + - **Add** (list) - 有增权限的产品列表 + - **Del** (list) - 有删权限的产品列表 + - **Get** (list) - 有查权限的产品列表 + - **Mod** (list) - 有改权限的产品列表 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.DescribeCharacterListRequestSchema().dumps(d) + + resp = self.invoke("DescribeCharacterList", d, **kwargs) + return apis.DescribeCharacterListResponseSchema().loads(resp) + + def describe_member_list( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeMemberList - 获取成员列表,限主账号使用。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID,请参考 `GetProjectList接口 `_ 。不填写为查询所有项目。 + - **Limit** (str) - 成员列表的最大数量,默认为200 + - **Offset** (str) - 成员列表的偏移量,默认为0 + + **Response** + + - **MemberSet** (list) - 见 **MemberInfo** 模型定义 + - **TotalCount** (int) - 成员总数 + + **Response Model** + + **MemberInfo** + - **ActivateFlag** (int) - 激活状态(0:未激活,1:已激活) + - **Created** (int) - 创建时间 + - **DefultProjectId** (str) - 默认项目 + - **IsAdmin** (int) - 是否主账号(0:子账号,1:主账号) + - **IsFinance** (int) - 是否有财务权限(0:无财务权限,1:有财务权限) + - **LastLogin** (int) - 最后一次登录时间 + - **LastRegionId** (str) - 最后访问的机房 + - **MemberEmail** (str) - 成员邮箱 + - **MemberName** (str) - 成员名字 + - **MemberPhone** (str) - 成员手机 + - **MemberPosition** (str) - 成员地址 + - **MemberQQ** (str) - 成员QQ + - **PasswordPolicyDate** (int) - 密码安全策略开启时间,格式:unix timestamp + - **ProjectSet** (list) - 见 **ProjectInfo** 模型定义 + - **PublicKey** (str) - 公钥 + - **State** (str) - 状态 + - **TOTPStatus** (int) - TOTP状态(0:未开启,1:已开启) + + + **ProjectInfo** + - **CharacterId** (str) - 角色ID + - **ProjectId** (str) - 项目ID,请参考 `GetProjectList接口 `_ + - **ProjectName** (str) - 项目名 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeMemberListRequestSchema().dumps(d) + + resp = self.invoke("DescribeMemberList", d, **kwargs) + return apis.DescribeMemberListResponseSchema().loads(resp) + + def freeze_member( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """FreezeMember - 冻结成员 + + **Request** + + - **MemberEmail** (str) - (Required) 需要被冻结的成员Email + + **Response** + + + """ + # build request + d = {} + req and d.update(req) + d = apis.FreezeMemberRequestSchema().dumps(d) + + resp = self.invoke("FreezeMember", d, **kwargs) + return apis.FreezeMemberResponseSchema().loads(resp) + + def get_network_mask( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetNetworkMask - 查询登录与API调用的网络掩码 + + **Request** + + + **Response** + + - **Data** (dict) - 见 **NetworkMask** 模型定义 + - **Message** (str) - 接口信息,成功时为`success`,错误时显示具体错误信息。 + + **Response Model** + + **NetworkMask** + - **APINetworkMask** (str) - API调用网络掩码,默认空字符串,不限制登录IP,多个IP以英文逗号分隔。 + - **LoginNetworkMask** (str) - 登录网络掩码,默认空字符串,不限制登录IP,多个IP以英文逗号分隔。 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.GetNetworkMaskRequestSchema().dumps(d) + + resp = self.invoke("GetNetworkMask", d, **kwargs) + return apis.GetNetworkMaskResponseSchema().loads(resp) + + def get_project_list( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetProjectList - 获取项目列表 + + **Request** + + - **IsFinance** (str) - 是否是财务账号(Yes:是,No:否) + + **Response** + + - **ProjectCount** (int) - 项目总数 + - **ProjectSet** (list) - 见 **ProjectListInfo** 模型定义 + + **Response Model** + + **ProjectListInfo** + - **CreateTime** (int) - 创建时间(Unix时间戳) + - **IsDefault** (bool) - 是否为默认项目 + - **MemberCount** (int) - 项目下成员数量 + - **ParentId** (str) - 父项目ID(已废弃) + - **ParentName** (str) - 父项目名称(已废弃) + - **ProjectId** (str) - 项目ID + - **ProjectName** (str) - 项目名称 + - **ResourceCount** (int) - 项目下资源数量(已废弃,不建议使用) + + + """ + # build request + d = {} + req and d.update(req) + d = apis.GetProjectListRequestSchema().dumps(d) + + resp = self.invoke("GetProjectList", d, **kwargs) + return apis.GetProjectListResponseSchema().loads(resp) + + def get_region(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """GetRegion - 获取用户在各数据中心的权限等信息 + + **Request** + + + **Response** + + - **Regions** (list) - 见 **RegionInfo** 模型定义 + + **Response Model** + + **RegionInfo** + - **BitMaps** (str) - 用户在此数据中心的权限位 + - **IsDefault** (bool) - 是否用户当前默认数据中心 + - **Region** (str) - 地域名字,如cn-bj + - **RegionId** (int) - 数据中心ID + - **RegionName** (str) - 数据中心名称 + - **Zone** (str) - 可用区名字,如cn-bj-01 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.GetRegionRequestSchema().dumps(d) + + resp = self.invoke("GetRegion", d, **kwargs) + return apis.GetRegionResponseSchema().loads(resp) + + def get_user_info( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUserInfo - + + **Request** + + + **Response** + + - **DataSet** (list) - 见 **UserInfo** 模型定义 + + **Response Model** + + **UserInfo** + - **Admin** (int) - + - **Administrator** (str) - + - **AuthState** (str) - + - **City** (str) - + - **CompanyName** (str) - + - **Finance** (int) - + - **IndustryType** (int) - + - **PhonePrefix** (str) - + - **Province** (str) - + - **UserAddress** (str) - + - **UserEmail** (str) - + - **UserId** (int) - + - **UserName** (str) - + - **UserPhone** (str) - + - **UserType** (int) - + - **UserVersion** (int) - + + + """ + # build request + d = {} + req and d.update(req) + d = apis.GetUserInfoRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("GetUserInfo", d, **kwargs) + return apis.GetUserInfoResponseSchema().loads(resp) + + def invite_subaccount( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """InviteSubaccount - 邀请子帐号成员 + + **Request** + + - **IsFinance** (str) - (Required) 是否有财务权限(true:是,false:否,默认为否) + - **UserEmail** (str) - (Required) 受邀成员邮箱地址,不得重复 + - **UserName** (str) - (Required) 受邀成员姓名 + - **UserPhone** (str) - (Required) 受邀成员手机号码 + + **Response** + + + """ + # build request + d = {} + req and d.update(req) + d = apis.InviteSubaccountRequestSchema().dumps(d) + + resp = self.invoke("InviteSubaccount", d, **kwargs) + return apis.InviteSubaccountResponseSchema().loads(resp) + + def modify_character( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyCharacter - 修改角色 + + **Request** + + - **CharacterId** (str) - (Required) 角色ID + - **Add** (list) - 角色权限(增) + - **CharacterDescription** (str) - 角色描述 + - **CharacterName** (str) - 新角色名称 + - **Del** (list) - 角色权限(删) + - **Get** (list) - 角色权限(查) + - **Mod** (list) - 角色权限(改) + + **Response** + + + """ + # build request + d = {} + req and d.update(req) + d = apis.ModifyCharacterRequestSchema().dumps(d) + + resp = self.invoke("ModifyCharacter", d, **kwargs) + return apis.ModifyCharacterResponseSchema().loads(resp) + + def modify_project( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyProject - + + **Request** + + - **ProjectId** (str) - (Config) + - **ProjectName** (str) - (Required) + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyProjectRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("ModifyProject", d, **kwargs) + return apis.ModifyProjectResponseSchema().loads(resp) + + def remove_member_from_project( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RemoveMemberFromProject - 从项目中移除成员 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID,请参考 `GetProjectList接口 `_ 的描述。不填写为默认项目,子帐号必须填写。 + - **MemberEmail** (str) - (Required) 需要被移除成员Email + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.RemoveMemberFromProjectRequestSchema().dumps(d) + + resp = self.invoke("RemoveMemberFromProject", d, **kwargs) + return apis.RemoveMemberFromProjectResponseSchema().loads(resp) + + def set_network_mask( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """SetNetworkMask - 设置登录与API调用的网络掩码 + + **Request** + + - **Code** (str) - (Required) 短信验证码 + - **APINetworkMask** (str) - API调用网络掩码,多个IP以英文逗号分隔。默认空字符串,不限制登录IP。 + - **LoginNetworkMask** (str) - 登录网络掩码,多个IP以英文逗号分隔。默认空字符串,不限制登录IP。 + + **Response** + + - **Message** (str) - 接口信息,成功时为`success`,错误时显示具体错误信息。 + + """ + # build request + d = {} + req and d.update(req) + d = apis.SetNetworkMaskRequestSchema().dumps(d) + + resp = self.invoke("SetNetworkMask", d, **kwargs) + return apis.SetNetworkMaskResponseSchema().loads(resp) + + def terminate_character( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """TerminateCharacter - 删除用户角色管理列表中的指定角色 + + **Request** + + - **CharacterId** (str) - (Required) 角色ID,使用 `DescribeCharacterList接口 `_ 获取角色ID + + **Response** + + + """ + # build request + d = {} + req and d.update(req) + d = apis.TerminateCharacterRequestSchema().dumps(d) + + resp = self.invoke("TerminateCharacter", d, **kwargs) + return apis.TerminateCharacterResponseSchema().loads(resp) + + def terminate_member( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """TerminateMember - 删除管理员人员管理页面的指定子账号 + + **Request** + + - **MemberEmail** (str) - (Required) 用户邮箱 + + **Response** + + + """ + # build request + d = {} + req and d.update(req) + d = apis.TerminateMemberRequestSchema().dumps(d) + + resp = self.invoke("TerminateMember", d, **kwargs) + return apis.TerminateMemberResponseSchema().loads(resp) + + def terminate_project( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """TerminateProject - 删除项目 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID,请参考 `GetProjectList接口 `_ 的描述。 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.TerminateProjectRequestSchema().dumps(d) + + resp = self.invoke("TerminateProject", d, **kwargs) + return apis.TerminateProjectResponseSchema().loads(resp) diff --git a/ucloud/services/uaccount/schemas/apis.py b/ucloud/services/uaccount/schemas/apis.py index c41026ba..dc005847 100644 --- a/ucloud/services/uaccount/schemas/apis.py +++ b/ucloud/services/uaccount/schemas/apis.py @@ -3,30 +3,182 @@ from ucloud.core.typesystem import schema, fields from ucloud.services.uaccount.schemas import models - """ UAccount API Schema """ +""" +API: AddMemberToProject + +添加成员到项目 +""" + + +class AddMemberToProjectRequestSchema(schema.RequestSchema): + """AddMemberToProject - 添加成员到项目""" + + fields = { + "CharacterId": fields.Str(required=True, dump_to="CharacterId"), + "MemberEmail": fields.Str(required=True, dump_to="MemberEmail"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class AddMemberToProjectResponseSchema(schema.ResponseSchema): + """AddMemberToProject - 添加成员到项目""" + + fields = {} + + +""" +API: CreateCharacter + +创建角色 +""" + + +class CreateCharacterRequestSchema(schema.RequestSchema): + """CreateCharacter - 创建角色""" + + fields = { + "Add": fields.List(fields.Str()), + "CharacterDescription": fields.Str( + required=False, dump_to="CharacterDescription" + ), + "CharacterName": fields.Str(required=True, dump_to="CharacterName"), + "Del": fields.List(fields.Str()), + "Get": fields.List(fields.Str()), + "Mod": fields.List(fields.Str()), + } + + +class CreateCharacterResponseSchema(schema.ResponseSchema): + """CreateCharacter - 创建角色""" + + fields = { + "CharacterId": fields.Str(required=True, load_from="CharacterId"), + } + + """ API: CreateProject -创建项目 + """ class CreateProjectRequestSchema(schema.RequestSchema): - """ CreateProject - 创建项目 - """ + """CreateProject -""" - fields = {"ProjectName": fields.Str(required=True, dump_to="ProjectName")} + fields = { + "ProjectName": fields.Str(required=True, dump_to="ProjectName"), + } class CreateProjectResponseSchema(schema.ResponseSchema): - """ CreateProject - 创建项目 - """ + """CreateProject -""" + + fields = { + "ProjectId": fields.Str(required=True, load_from="ProjectId"), + } + + +""" +API: DescribeCharacterList + +获取角色列表 +""" + + +class DescribeCharacterListRequestSchema(schema.RequestSchema): + """DescribeCharacterList - 获取角色列表""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + } + - fields = {"ProjectId": fields.Str(required=True, load_from="ProjectId")} +class DescribeCharacterListResponseSchema(schema.ResponseSchema): + """DescribeCharacterList - 获取角色列表""" + + fields = { + "CharacterSet": fields.List( + models.CharacterSetSchema(), required=True, load_from="CharacterSet" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeMemberList + +获取成员列表,限主账号使用。 +""" + + +class DescribeMemberListRequestSchema(schema.RequestSchema): + """DescribeMemberList - 获取成员列表,限主账号使用。""" + + fields = { + "Limit": fields.Str(required=False, dump_to="Limit"), + "Offset": fields.Str(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class DescribeMemberListResponseSchema(schema.ResponseSchema): + """DescribeMemberList - 获取成员列表,限主账号使用。""" + + fields = { + "MemberSet": fields.List( + models.MemberInfoSchema(), required=True, load_from="MemberSet" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: FreezeMember + +冻结成员 +""" + + +class FreezeMemberRequestSchema(schema.RequestSchema): + """FreezeMember - 冻结成员""" + + fields = { + "MemberEmail": fields.Str(required=True, dump_to="MemberEmail"), + } + + +class FreezeMemberResponseSchema(schema.ResponseSchema): + """FreezeMember - 冻结成员""" + + fields = {} + + +""" +API: GetNetworkMask + +查询登录与API调用的网络掩码 +""" + + +class GetNetworkMaskRequestSchema(schema.RequestSchema): + """GetNetworkMask - 查询登录与API调用的网络掩码""" + + fields = {} + + +class GetNetworkMaskResponseSchema(schema.ResponseSchema): + """GetNetworkMask - 查询登录与API调用的网络掩码""" + + fields = { + "Data": models.NetworkMaskSchema(), + "Message": fields.Str(required=False, load_from="Message"), + } """ @@ -37,15 +189,15 @@ class CreateProjectResponseSchema(schema.ResponseSchema): class GetProjectListRequestSchema(schema.RequestSchema): - """ GetProjectList - 获取项目列表 - """ + """GetProjectList - 获取项目列表""" - fields = {"IsFinance": fields.Str(required=False, dump_to="IsFinance")} + fields = { + "IsFinance": fields.Str(required=False, dump_to="IsFinance"), + } class GetProjectListResponseSchema(schema.ResponseSchema): - """ GetProjectList - 获取项目列表 - """ + """GetProjectList - 获取项目列表""" fields = { "ProjectCount": fields.Int(required=True, load_from="ProjectCount"), @@ -65,58 +217,106 @@ class GetProjectListResponseSchema(schema.ResponseSchema): class GetRegionRequestSchema(schema.RequestSchema): - """ GetRegion - 获取用户在各数据中心的权限等信息 - """ + """GetRegion - 获取用户在各数据中心的权限等信息""" fields = {} class GetRegionResponseSchema(schema.ResponseSchema): - """ GetRegion - 获取用户在各数据中心的权限等信息 - """ + """GetRegion - 获取用户在各数据中心的权限等信息""" fields = { "Regions": fields.List( models.RegionInfoSchema(), required=False, load_from="Regions" - ) + ), } """ API: GetUserInfo -获取用户信息 + """ class GetUserInfoRequestSchema(schema.RequestSchema): - """ GetUserInfo - 获取用户信息 - """ + """GetUserInfo -""" fields = {} class GetUserInfoResponseSchema(schema.ResponseSchema): - """ GetUserInfo - 获取用户信息 - """ + """GetUserInfo -""" fields = { "DataSet": fields.List( models.UserInfoSchema(), required=True, load_from="DataSet" - ) + ), } +""" +API: InviteSubaccount + +邀请子帐号成员 +""" + + +class InviteSubaccountRequestSchema(schema.RequestSchema): + """InviteSubaccount - 邀请子帐号成员""" + + fields = { + "IsFinance": fields.Str(required=True, dump_to="IsFinance"), + "UserEmail": fields.Str(required=True, dump_to="UserEmail"), + "UserName": fields.Str(required=True, dump_to="UserName"), + "UserPhone": fields.Str(required=True, dump_to="UserPhone"), + } + + +class InviteSubaccountResponseSchema(schema.ResponseSchema): + """InviteSubaccount - 邀请子帐号成员""" + + fields = {} + + +""" +API: ModifyCharacter + +修改角色 +""" + + +class ModifyCharacterRequestSchema(schema.RequestSchema): + """ModifyCharacter - 修改角色""" + + fields = { + "Add": fields.List(fields.Str()), + "CharacterDescription": fields.Str( + required=False, dump_to="CharacterDescription" + ), + "CharacterId": fields.Str(required=True, dump_to="CharacterId"), + "CharacterName": fields.Str(required=False, dump_to="CharacterName"), + "Del": fields.List(fields.Str()), + "Get": fields.List(fields.Str()), + "Mod": fields.List(fields.Str()), + } + + +class ModifyCharacterResponseSchema(schema.ResponseSchema): + """ModifyCharacter - 修改角色""" + + fields = {} + + """ API: ModifyProject -修改项目 + """ class ModifyProjectRequestSchema(schema.RequestSchema): - """ ModifyProject - 修改项目 - """ + """ModifyProject -""" fields = { "ProjectId": fields.Str(required=True, dump_to="ProjectId"), @@ -125,8 +325,98 @@ class ModifyProjectRequestSchema(schema.RequestSchema): class ModifyProjectResponseSchema(schema.ResponseSchema): - """ ModifyProject - 修改项目 - """ + """ModifyProject -""" + + fields = {} + + +""" +API: RemoveMemberFromProject + +从项目中移除成员 +""" + + +class RemoveMemberFromProjectRequestSchema(schema.RequestSchema): + """RemoveMemberFromProject - 从项目中移除成员""" + + fields = { + "MemberEmail": fields.Str(required=True, dump_to="MemberEmail"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class RemoveMemberFromProjectResponseSchema(schema.ResponseSchema): + """RemoveMemberFromProject - 从项目中移除成员""" + + fields = {} + + +""" +API: SetNetworkMask + +设置登录与API调用的网络掩码 +""" + + +class SetNetworkMaskRequestSchema(schema.RequestSchema): + """SetNetworkMask - 设置登录与API调用的网络掩码""" + + fields = { + "APINetworkMask": fields.Str(required=False, dump_to="APINetworkMask"), + "Code": fields.Str(required=True, dump_to="Code"), + "LoginNetworkMask": fields.Str( + required=False, dump_to="LoginNetworkMask" + ), + } + + +class SetNetworkMaskResponseSchema(schema.ResponseSchema): + """SetNetworkMask - 设置登录与API调用的网络掩码""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: TerminateCharacter + +删除用户角色管理列表中的指定角色 +""" + + +class TerminateCharacterRequestSchema(schema.RequestSchema): + """TerminateCharacter - 删除用户角色管理列表中的指定角色""" + + fields = { + "CharacterId": fields.Str(required=True, dump_to="CharacterId"), + } + + +class TerminateCharacterResponseSchema(schema.ResponseSchema): + """TerminateCharacter - 删除用户角色管理列表中的指定角色""" + + fields = {} + + +""" +API: TerminateMember + +删除管理员人员管理页面的指定子账号 +""" + + +class TerminateMemberRequestSchema(schema.RequestSchema): + """TerminateMember - 删除管理员人员管理页面的指定子账号""" + + fields = { + "MemberEmail": fields.Str(required=True, dump_to="MemberEmail"), + } + + +class TerminateMemberResponseSchema(schema.ResponseSchema): + """TerminateMember - 删除管理员人员管理页面的指定子账号""" fields = {} @@ -139,14 +429,14 @@ class ModifyProjectResponseSchema(schema.ResponseSchema): class TerminateProjectRequestSchema(schema.RequestSchema): - """ TerminateProject - 删除项目 - """ + """TerminateProject - 删除项目""" - fields = {"ProjectId": fields.Str(required=False, dump_to="ProjectId")} + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } class TerminateProjectResponseSchema(schema.ResponseSchema): - """ TerminateProject - 删除项目 - """ + """TerminateProject - 删除项目""" fields = {} diff --git a/ucloud/services/uaccount/schemas/models.py b/ucloud/services/uaccount/schemas/models.py index cc3922d2..2a634927 100644 --- a/ucloud/services/uaccount/schemas/models.py +++ b/ucloud/services/uaccount/schemas/models.py @@ -1,57 +1,128 @@ -""" Code is generated by ucloud-model, DO NOT EDIT IT. """ - -from ucloud.core.typesystem import schema, fields - - -class ProjectListInfoSchema(schema.ResponseSchema): - """ ProjectListInfo - 项目信息 - """ - - fields = { - "CreateTime": fields.Int(required=True, load_from="CreateTime"), - "IsDefault": fields.Bool(required=True, load_from="IsDefault"), - "MemberCount": fields.Int(required=True, load_from="MemberCount"), - "ParentId": fields.Str(required=True, load_from="ParentId"), - "ParentName": fields.Str(required=True, load_from="ParentName"), - "ProjectId": fields.Str(required=True, load_from="ProjectId"), - "ProjectName": fields.Str(required=True, load_from="ProjectName"), - "ResourceCount": fields.Int(required=True, load_from="ResourceCount"), - } - - -class RegionInfoSchema(schema.ResponseSchema): - """ RegionInfo - 数据中心信息 - """ - - fields = { - "BitMaps": fields.Str(required=True, load_from="BitMaps"), - "IsDefault": fields.Bool(required=True, load_from="IsDefault"), - "Region": fields.Str(required=True, load_from="Region"), - "RegionId": fields.Int(required=True, load_from="RegionId"), - "RegionName": fields.Str(required=True, load_from="RegionName"), - "Zone": fields.Str(required=True, load_from="Zone"), - } - - -class UserInfoSchema(schema.ResponseSchema): - """ UserInfo - 用户信息 - """ - - fields = { - "Admin": fields.Int(required=True, load_from="Admin"), - "Administrator": fields.Str(required=True, load_from="Administrator"), - "AuthState": fields.Str(required=True, load_from="AuthState"), - "City": fields.Str(required=True, load_from="City"), - "CompanyName": fields.Str(required=True, load_from="CompanyName"), - "Finance": fields.Int(required=True, load_from="Finance"), - "IndustryType": fields.Int(required=True, load_from="IndustryType"), - "PhonePrefix": fields.Str(required=True, load_from="PhonePrefix"), - "Province": fields.Str(required=True, load_from="Province"), - "UserAddress": fields.Str(required=True, load_from="UserAddress"), - "UserEmail": fields.Str(required=True, load_from="UserEmail"), - "UserId": fields.Int(required=True, load_from="UserId"), - "UserName": fields.Str(required=True, load_from="UserName"), - "UserPhone": fields.Str(required=True, load_from="UserPhone"), - "UserType": fields.Int(required=True, load_from="UserType"), - "UserVersion": fields.Int(required=True, load_from="UserVersion"), - } +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class PermissionSetSchema(schema.ResponseSchema): + """PermissionSet - 权限列表""" + + fields = { + "Add": fields.List(fields.Str()), + "Del": fields.List(fields.Str()), + "Get": fields.List(fields.Str()), + "Mod": fields.List(fields.Str()), + } + + +class CharacterSetSchema(schema.ResponseSchema): + """CharacterSet - 角色信息""" + + fields = { + "CharacterDescription": fields.Str( + required=True, load_from="CharacterDescription" + ), + "CharacterId": fields.Str(required=True, load_from="CharacterId"), + "CharacterName": fields.Str(required=True, load_from="CharacterName"), + "Modifiable": fields.Bool(required=True, load_from="Modifiable"), + "PermissionSet": fields.List(PermissionSetSchema()), + } + + +class ProjectInfoSchema(schema.ResponseSchema): + """ProjectInfo - 项目信息""" + + fields = { + "CharacterId": fields.Str(required=True, load_from="CharacterId"), + "ProjectId": fields.Str(required=True, load_from="ProjectId"), + "ProjectName": fields.Str(required=True, load_from="ProjectName"), + } + + +class MemberInfoSchema(schema.ResponseSchema): + """MemberInfo - 成员信息""" + + fields = { + "ActivateFlag": fields.Int(required=True, load_from="ActivateFlag"), + "Created": fields.Int(required=True, load_from="Created"), + "DefultProjectId": fields.Str( + required=True, load_from="DefultProjectId" + ), + "IsAdmin": fields.Int(required=True, load_from="IsAdmin"), + "IsFinance": fields.Int(required=True, load_from="IsFinance"), + "LastLogin": fields.Int(required=True, load_from="LastLogin"), + "LastRegionId": fields.Str(required=True, load_from="LastRegionId"), + "MemberEmail": fields.Str(required=True, load_from="MemberEmail"), + "MemberName": fields.Str(required=True, load_from="MemberName"), + "MemberPhone": fields.Str(required=True, load_from="MemberPhone"), + "MemberPosition": fields.Str(required=True, load_from="MemberPosition"), + "MemberQQ": fields.Str(required=True, load_from="MemberQQ"), + "PasswordPolicyDate": fields.Int( + required=True, load_from="PasswordPolicyDate" + ), + "ProjectSet": fields.List(ProjectInfoSchema()), + "PublicKey": fields.Str(required=True, load_from="PublicKey"), + "State": fields.Str(required=True, load_from="State"), + "TOTPStatus": fields.Int(required=True, load_from="TOTPStatus"), + } + + +class NetworkMaskSchema(schema.ResponseSchema): + """NetworkMask - 登录与API调用的网络掩码""" + + fields = { + "APINetworkMask": fields.Str(required=True, load_from="APINetworkMask"), + "LoginNetworkMask": fields.Str( + required=True, load_from="LoginNetworkMask" + ), + } + + +class ProjectListInfoSchema(schema.ResponseSchema): + """ProjectListInfo - 项目信息""" + + fields = { + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "IsDefault": fields.Bool(required=True, load_from="IsDefault"), + "MemberCount": fields.Int(required=True, load_from="MemberCount"), + "ParentId": fields.Str(required=False, load_from="ParentId"), + "ParentName": fields.Str(required=False, load_from="ParentName"), + "ProjectId": fields.Str(required=True, load_from="ProjectId"), + "ProjectName": fields.Str(required=True, load_from="ProjectName"), + "ResourceCount": fields.Int(required=True, load_from="ResourceCount"), + } + + +class RegionInfoSchema(schema.ResponseSchema): + """RegionInfo - 数据中心信息""" + + fields = { + "BitMaps": fields.Str(required=True, load_from="BitMaps"), + "IsDefault": fields.Bool(required=True, load_from="IsDefault"), + "Region": fields.Str(required=True, load_from="Region"), + "RegionId": fields.Int(required=True, load_from="RegionId"), + "RegionName": fields.Str(required=True, load_from="RegionName"), + "Zone": fields.Str(required=True, load_from="Zone"), + } + + +class UserInfoSchema(schema.ResponseSchema): + """UserInfo -""" + + fields = { + "Admin": fields.Int(required=True, load_from="Admin"), + "Administrator": fields.Str(required=True, load_from="Administrator"), + "AuthState": fields.Str(required=True, load_from="AuthState"), + "City": fields.Str(required=True, load_from="City"), + "CompanyName": fields.Str(required=True, load_from="CompanyName"), + "Finance": fields.Int(required=True, load_from="Finance"), + "IndustryType": fields.Int(required=True, load_from="IndustryType"), + "PhonePrefix": fields.Str(required=True, load_from="PhonePrefix"), + "Province": fields.Str(required=True, load_from="Province"), + "UserAddress": fields.Str(required=True, load_from="UserAddress"), + "UserEmail": fields.Str(required=True, load_from="UserEmail"), + "UserId": fields.Int(required=True, load_from="UserId"), + "UserName": fields.Str(required=True, load_from="UserName"), + "UserPhone": fields.Str(required=True, load_from="UserPhone"), + "UserType": fields.Int(required=True, load_from="UserType"), + "UserVersion": fields.Int(required=True, load_from="UserVersion"), + } diff --git a/ucloud/services/uads/__init__.py b/ucloud/services/uads/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/uads/client.py b/ucloud/services/uads/client.py new file mode 100644 index 00000000..7c7bc3a1 --- /dev/null +++ b/ucloud/services/uads/client.py @@ -0,0 +1,1148 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.uads.schemas import apis + + +class UADSClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UADSClient, self).__init__(config, transport, middleware, logger) + + def add_high_protect_game_ip_info( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AddHighProtectGameIPInfo - 添加代理ip + + **Request** + + - **LineType** (str) - (Required) 套餐线路类型, 如果是BGP的线路, 则为BGP;如果为双线, 则可选TELECOM, UNICOM;如果为海外, 则为INTERNATIONAL; + - **ResourceId** (str) - (Required) 资源Id + - **TypeIP** (str) - (Required) IP类型,取值范围为:TypeFree, TypeCharge + - **UserIP** (str) - (Required) 用户的源站ip + - **CouponId** (str) - 代金券ID + - **Remark** (str) - 备注,默认为空. + + **Response** + + - **Cname** (str) - cname记录 + - **DefenceIP** (str) - 防御IP + - **IPId** (int) - IPId + - **SrcIP** (str) - 源IP + + """ + # build request + d = {} + req and d.update(req) + d = apis.AddHighProtectGameIPInfoRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AddHighProtectGameIPInfo", d, **kwargs) + return apis.AddHighProtectGameIPInfoResponseSchema().loads(resp) + + def add_nap_allow_list_domain( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AddNapAllowListDomain - 添加域名允许列表 + + **Request** + + - **Domain** (list) - (Required) 域名,N从0开始,多个域名:Domain.0、Domain.1、... + - **ResourceId** (str) - (Required) 资源ID + + **Response** + + - **Data** (list) - 见 **DomainConfigResult** 模型定义 + + **Response Model** + + **DomainConfigResult** + - **Code** (int) - 错误码 + - **Domain** (str) - 域名 + - **Message** (str) - 提示信息 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.AddNapAllowListDomainRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AddNapAllowListDomain", d, **kwargs) + return apis.AddNapAllowListDomainResponseSchema().loads(resp) + + def bind_nap_ip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """BindNapIP - 直连高防:将尚未使用的高防EIP绑定到指定的资源 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。 请参考 `GetProjectList接口 `_ + - **BindResourceId** (str) - (Required) 绑定的资源ID + - **EIPId** (str) - (Required) EIP资源ID + - **NapIp** (str) - (Required) 高防IP + - **ResourceId** (str) - (Required) 高防资源ID + - **ResourceType** (str) - (Required) 绑定的资源类型(uhost:云主机,ulb:负载均衡,upm:物理机) + + **Response** + + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.BindNapIPRequestSchema().dumps(d) + + resp = self.invoke("BindNapIP", d, **kwargs) + return apis.BindNapIPResponseSchema().loads(resp) + + def buy_high_protect_game_service( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """BuyHighProtectGameService - 购买高防服务 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。请参考 `GetProjectList接口 `_ + - **AreaLine** (str) - (Required) 线路区域, 可取范围{"SouthChina", "EastChina"} + - **ChargeType** (str) - (Required) 计费方式 ,取值范围 {"Month", "Year", "Dynamic", "Day"};其中华东双线周付使用Day,其他支持的周付使用Dynamic; + - **EngineRoom** (list) - (Required) 购买的套餐所在机房,取值范围{"Hangzhou2", "Hangzhou", "Xiamen"} + - **LineType** (str) - (Required) 'default': 'DUPLET', 取值范围 {"DUPLET", "BGP"} + - **Quantity** (int) - (Required) 计费时长 + - **SrcBandwidth** (int) - (Required) 带宽 + - **CouponId** (str) - 代金券ID + - **DefenceDDosBaseFlowArr** (list) - DDoS基础防护值(当购买套餐为多种线路的时候,顺序为,电信,联通,移动...,当为单线的时候只传DefenceDDosBaseFlowArr.0) + - **DefenceDDosMaxFlowArr** (list) - DDoS最大防护值(当购买套餐为多种线路的时候,顺序为,电信,联通,移动...;当为单线的时候只传DefenceDDosMaxFlowArr.0) + - **DefenceType** (str) - 防御类型,默认为TypeFixed; 取值范围{"TypeFixed", "TypeDynamic"} + - **ForwardType** (str) - 转发类型,默认为:Proxy;Proxy:代理、Passthrough:直连 + - **HighProtectGameServiceName** (str) - 高防服务名称 + - **Vendor** (int) - 供应商编号 + + **Response** + + - **ResourceInfo** (dict) - 见 **ResourceInfo** 模型定义 + + **Response Model** + + **ResourceInfo** + - **ResourceId** (str) - 资源id + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.BuyHighProtectGameServiceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("BuyHighProtectGameService", d, **kwargs) + return apis.BuyHighProtectGameServiceResponseSchema().loads(resp) + + def create_bgp_service_fwd_rule( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateBGPServiceFwdRule - 创建BGP高防转发规则 + + **Request** + + - **BgpIP** (str) - (Required) BGP的IP + - **ResourceId** (str) - (Required) 资源id + - **BackupIP** (str) - 备份源站的IP + - **BackupPort** (int) - 备份源站的端口 + - **BgpIPPort** (int) - 默认为0,为IP协议的转发端口,其余的自定义 + - **FwdType** (str) - 转发协议的类型包括三种:默认为“IP”,还可以选择为“TCP” + - **LoadBalance** (str) - 转发协议的类型是否为负载均衡的:默认为“No”,还可以选择为“Yes”。负载均衡模式下必须配置BackupIP + - **Remark** (str) - 备注,默认为空 + - **SourceAddrArr** (list) - 回源地址,可填 IP地址 或 域名 + - **SourceDetect** (int) - 表示对源站进行检测:默认为0表示关闭,还可以选择为1表示开启 + - **SourcePortArr** (list) - 回源端口 + - **SourceToaIDArr** (list) - 回源TOA + - **SourceType** (str) - 回源类型,分 “IP”、“Domain” + + **Response** + + - **RuleIndex** (int) - 转发规则的数据库索引值 + + """ + # build request + d = {} + req and d.update(req) + d = apis.CreateBGPServiceFwdRuleRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateBGPServiceFwdRule", d, **kwargs) + return apis.CreateBGPServiceFwdRuleResponseSchema().loads(resp) + + def create_bgp_service_ip( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateBGPServiceIP - 分配一个BGP IP + + **Request** + + - **ResourceId** (str) - (Required) 资源id,表示归属在哪个高防服务下 + - **EIPRegion** (str) - 高防IP对应机房(直连高防必须携带) + - **Remark** (str) - 备注,默认为空 + - **TypeIP** (str) - ip的类型, 默认是TypeFree + + **Response** + + - **Cname** (str) - cname记录 + - **DefenceIP** (str) - 分配的BGP高防IP的IP地址 + - **EnableSwitch** (int) - 是否热备份开启 + - **IPId** (int) - IPId + + """ + # build request + d = {} + req and d.update(req) + d = apis.CreateBGPServiceIPRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateBGPServiceIP", d, **kwargs) + return apis.CreateBGPServiceIPResponseSchema().loads(resp) + + def delete_bgp_service_fwd_rule( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteBGPServiceFwdRule - 删除转发规则 + + **Request** + + - **ResourceId** (str) - (Required) 资源id + - **RuleIndex** (int) - (Required) 需要删除的转发规则ID + + **Response** + + + """ + # build request + d = {} + req and d.update(req) + d = apis.DeleteBGPServiceFwdRuleRequestSchema().dumps(d) + + resp = self.invoke("DeleteBGPServiceFwdRule", d, **kwargs) + return apis.DeleteBGPServiceFwdRuleResponseSchema().loads(resp) + + def delete_bgp_service_ip( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteBGPServiceIP - 删除BGP高防IP + + **Request** + + - **Region** (str) - (Config) 机房(直接模式高防需要传) + - **DefenceIp** (str) - (Required) 需要删除的高防IP + - **ResourceId** (str) - (Required) 资源id + + **Response** + + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteBGPServiceIPRequestSchema().dumps(d) + + resp = self.invoke("DeleteBGPServiceIP", d, **kwargs) + return apis.DeleteBGPServiceIPResponseSchema().loads(resp) + + def delete_high_protect_game_ip_info( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteHighProtectGameIPInfo - 删除高防IP + + **Request** + + - **DefenceIp** (str) - (Required) 要删除的高防ip + - **ResourceId** (str) - (Required) 资源ID + + **Response** + + + """ + # build request + d = {} + req and d.update(req) + d = apis.DeleteHighProtectGameIPInfoRequestSchema().dumps(d) + + resp = self.invoke("DeleteHighProtectGameIPInfo", d, **kwargs) + return apis.DeleteHighProtectGameIPInfoResponseSchema().loads(resp) + + def delete_high_protect_game_service( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteHighProtectGameService - 删除高防 + + **Request** + + - **ResourceId** (str) - (Required) 删除的资源Id + + **Response** + + + """ + # build request + d = {} + req and d.update(req) + d = apis.DeleteHighProtectGameServiceRequestSchema().dumps(d) + + resp = self.invoke("DeleteHighProtectGameService", d, **kwargs) + return apis.DeleteHighProtectGameServiceResponseSchema().loads(resp) + + def delete_nap_allow_list_domain( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteNapAllowListDomain - 删除域名允许列表 + + **Request** + + - **Domain** (list) - (Required) 域名,N从0开始,多个域名:Domain.0、Domain.1、... + - **ResourceId** (str) - (Required) 资源ID + + **Response** + + - **Data** (list) - 见 **DomainConfigResult** 模型定义 + + **Response Model** + + **DomainConfigResult** + - **Code** (int) - 错误码 + - **Domain** (str) - 域名 + - **Message** (str) - 提示信息 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.DeleteNapAllowListDomainRequestSchema().dumps(d) + + resp = self.invoke("DeleteNapAllowListDomain", d, **kwargs) + return apis.DeleteNapAllowListDomainResponseSchema().loads(resp) + + def describe_buy_high_protect_game_ip_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeBuyHighProtectGameIPPrice - 获取购买IP的价格 + + **Request** + + - **ChargeType** (str) - (Required) 付费方式, 枚举值为: Year, 按年付费; Month, 按月付费; Dynamic, 按需付费(需开启权限); Trial + - **Quantity** (int) - (Required) 购买数量 + - **ResourceId** (str) - (Required) 资源ID + + **Response** + + - **PremiumPrice** (float) - 溢价 + - **UnitPrice** (float) - 单位价格 + + """ + # build request + d = {} + req and d.update(req) + d = apis.DescribeBuyHighProtectGameIPPriceRequestSchema().dumps(d) + + resp = self.invoke("DescribeBuyHighProtectGameIPPrice", d, **kwargs) + return apis.DescribeBuyHighProtectGameIPPriceResponseSchema().loads( + resp + ) + + def describe_high_protect_game_ip_info( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeHighProtectGameIPInfo - 获取高防IP信息 + + **Request** + + - **ResourceId** (str) - (Required) 资源短id + - **Limit** (int) - 返回数据长度,默认为50。 + - **Offset** (int) - 列表起始位置偏移量,默认为0。 + + **Response** + + - **AvailableIPQuota** (int) - 可用剩余ip配额数 + - **GameIPInfo** (list) - 见 **GameIpInfoTotal** 模型定义 + - **TotalCount** (int) - 已经配置的总数 + + **Response Model** + + **GameIpInfoTotal** + - **Cname** (str) - 高防IP Cname + - **DefenceIP** (str) - 高防IP + - **LineType** (str) - 线路类型 + - **Remark** (str) - 用户mark + - **RuleCnt** (int) - 规则的个数 + - **SrcIP** (list) - 回源ip列表 + - **Status** (str) - ip配置状态 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.DescribeHighProtectGameIPInfoRequestSchema().dumps(d) + + resp = self.invoke("DescribeHighProtectGameIPInfo", d, **kwargs) + return apis.DescribeHighProtectGameIPInfoResponseSchema().loads(resp) + + def describe_nap_history_statistic( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeNapHistoryStatistic - 获取高防历史统计 + + **Request** + + - **BeginTime** (int) - (Required) 开始时间,Unix时间戳 + - **EndTime** (int) - (Required) 结束时间,Unix时间戳 + - **ResourceId** (str) - (Required) 资源ID + - **Accuracy** (int) - 查询粒度。1.分钟粒度 2.小时粒度 3.天粒度 默认为21.分钟粒度,BeginTime开始时间是7天内,EndTime-BeginTime时间跨度最大是1小时2.小时粒度,BeginTime开始时间是30天内,EndTime-BeginTime时间跨度最大是7天3.天粒度,BeginTime开始时间是180天内,EndTime-BeginTime时间跨度最大是90天 + - **Limit** (int) - 返回数据长度,默认不限制 + - **NapIP** (str) - 高防IP + - **Offset** (int) - 列表起始位置偏移量,默认为0 + + **Response** + + - **NetStats** (list) - 见 **NetStats** 模型定义 + + **Response Model** + + **NetStats** + - **Drop** (dict) - 见 **NetStatEntry** 模型定义 + - **Egress** (dict) - 见 **NetStatEntry** 模型定义 + - **Ingress** (dict) - 见 **NetStatEntry** 模型定义 + - **Time** (int) - Unix时间戳 + + + **NetStatEntry** + - **Bps** (float) - 流量,单位:Mbits + - **Pps** (int) - 包量,单位:pps + + + """ + # build request + d = {} + req and d.update(req) + d = apis.DescribeNapHistoryStatisticRequestSchema().dumps(d) + + resp = self.invoke("DescribeNapHistoryStatistic", d, **kwargs) + return apis.DescribeNapHistoryStatisticResponseSchema().loads(resp) + + def describe_nap_real_time_statistic( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeNapRealTimeStatistic - 获取高防实时统计 + + **Request** + + - **BeginTime** (int) - (Required) 开始时间,Unix时间戳 + - **EndTime** (int) - (Required) 结束时间,Unix时间戳(时间跨度不超过1小时) + - **ResourceId** (str) - (Required) 资源ID + - **Limit** (int) - 返回数据长度,默认不限制 + - **NapIP** (str) - 高防IP + - **Offset** (int) - 列表起始位置偏移量,默认为0 + + **Response** + + - **NetStats** (list) - 见 **NetStats** 模型定义 + + **Response Model** + + **NetStats** + - **Drop** (dict) - 见 **NetStatEntry** 模型定义 + - **Egress** (dict) - 见 **NetStatEntry** 模型定义 + - **Ingress** (dict) - 见 **NetStatEntry** 模型定义 + - **Time** (int) - Unix时间戳 + + + **NetStatEntry** + - **Bps** (float) - 流量,单位:Mbits + - **Pps** (int) - 包量,单位:pps + + + """ + # build request + d = {} + req and d.update(req) + d = apis.DescribeNapRealTimeStatisticRequestSchema().dumps(d) + + resp = self.invoke("DescribeNapRealTimeStatistic", d, **kwargs) + return apis.DescribeNapRealTimeStatisticResponseSchema().loads(resp) + + def describe_nap_service_info( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeNapServiceInfo - 获取高防服务信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。请参考 `GetProjectList接口 `_ + - **Limit** (int) - 返回数据长度,默认为10 + - **NapType** (int) - 高防类型;0:全部、1:内地高防、2:海外高防 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **ResourceId** (str) - 资源ID + + **Response** + + - **ServiceInfo** (list) - 见 **ServiceInfo** 模型定义 + - **TotalCount** (int) - 总数 + + **Response Model** + + **ServiceInfo** + - **AccessMode** (str) - 接入模式,Domain:网站接入、IP:非网站接入 + - **AreaLine** (str) - 防护机房所在区域 + - **AutoRenew** (str) - 是否开启自动续费 + - **ChargeType** (str) - 付费类型 + - **CreateTime** (int) - 创建时间 + - **DefenceDDosBaseFlowArr** (list) - 套餐基础防护组 + - **DefenceDDosMaxFlowArr** (list) - 套餐最大防护组 + - **DefenceStatus** (str) - 防护状态,Started:正常、Stopped:关闭、Expired:过期 + - **DefenceType** (str) - 防护类型 + - **EngineRoom** (list) - 防护机房名称 + - **ExpiredTime** (int) - 过期时间 + - **ForwardType** (str) - 转发类型,Proxy:代理、Passthrough:直连 + - **GameId** (int) - 套餐ID + - **LineType** (str) - 线路类型 + - **Name** (str) - 套餐名称 + - **NapType** (int) - 高防类型,1:内地高防、2:海外高防 + - **ProjectId** (str) - 项目ID + - **RegionId** (int) - region id + - **ResourceId** (str) - 资源ID + - **SrcBandwidth** (int) - 业务带宽 + - **Vendor** (int) - 供应商ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeNapServiceInfoRequestSchema().dumps(d) + + resp = self.invoke("DescribeNapServiceInfo", d, **kwargs) + return apis.DescribeNapServiceInfoResponseSchema().loads(resp) + + def describe_passthrough_nap_ip( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribePassthroughNapIP - 获取直连高防IP信息 + + **Request** + + - **ResourceId** (str) - (Required) 高防资源ID + - **Limit** (int) - 限制(传EIPs.0时暂时无效) + - **NapIp** (str) - 高防IP + - **Offset** (int) - 位偏移(传EIPs.0时暂时无效) + + **Response** + + - **AvailableIPQuota** (int) - 合法IP配额 + - **IPInfo** (list) - 见 **IPInfo** 模型定义 + - **Message** (str) - 错误信息 + - **TotalCount** (int) - IP总个数 + + **Response Model** + + **IPInfo** + - **CreateTime** (int) - 创建时间 + - **EIPAddr** (list) - 见 **EIPAddrSet** 模型定义 + - **EIPId** (str) - EIP资源ID + - **EIPRegion** (str) - EIP Region + - **Resource** (dict) - 见 **Resouce** 模型定义 + - **Status** (str) - 状态 + - **Tag** (str) - 业务组 + + + **EIPAddrSet** + - **EIPType** (str) - IP类型:gaofang + - **IP** (str) - 弹性IP地址 + - **OperatorName** (str) - 运营商信息, 枚举值为: BGP: BGP; International: 国际. + + + **Resouce** + - **EIPId** (str) - EIP资源ID + - **ResourceId** (str) - 资源ID + - **ResourceName** (str) - 资源名 + - **ResourceType** (str) - 资源类型 + - **Zone** (str) - 地区 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.DescribePassthroughNapIPRequestSchema().dumps(d) + + resp = self.invoke("DescribePassthroughNapIP", d, **kwargs) + return apis.DescribePassthroughNapIPResponseSchema().loads(resp) + + def describe_upgrade_high_protect_game_service_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUpgradeHighProtectGameServicePrice - 获取高防升降级价格 + + **Request** + + - **ResourceId** (str) - (Required) 资源ID + - **AreaLine** (str) - 区域,华东和华南,EastChina 和SouthChina + - **DefenceDDosBaseFlowArr** (list) - DDoS弹性防护值 + - **DefenceDDosMaxFlowArr** (list) - DDoS基础防护值 + - **DefenceType** (str) - 防御类型,默认为TypeFixed + - **EngineRoom** (list) - 代表机房,例如Dongguan Hangzhou + - **LineType** (str) - 线路 + - **SrcBandwidth** (int) - 带宽,默认100M + + **Response** + + - **ChargeIPQuota** (int) - 收费IP配额 + - **FreeIPQuota** (int) - 免费IP配额 + - **Price** (int) - 价格 + + """ + # build request + d = {} + req and d.update(req) + d = apis.DescribeUpgradeHighProtectGameServicePriceRequestSchema().dumps( + d + ) + + resp = self.invoke( + "DescribeUpgradeHighProtectGameServicePrice", d, **kwargs + ) + return apis.DescribeUpgradeHighProtectGameServicePriceResponseSchema().loads( + resp + ) + + def get_bgp_service_fwd_rule( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetBGPServiceFwdRule - 获取转发规则 + + **Request** + + - **ResourceId** (str) - (Required) 资源id + - **BgpIP** (str) - 指定需要查询的IP下的规则 + - **Limit** (int) - 分页显示的条目数,默认值为32 + - **Offset** (int) - 分页显示的起始偏移,默认值为0 + - **RuleIndex** (int) - 查询指定的rule_id, 不填写则默认获取所有的转发规则 + + **Response** + + - **AvailLoad** (int) - 负载模式下可添加的规则数量(根据IP查询才返回此参数) + - **AvailNonload** (int) - 非负载模式下可添加的规则数量(根据IP查询才返回此参数) + - **IpRuleExist** (bool) - 当前配置的规则中是否存在IP规则(根据IP查询才返回此参数) + - **RuleCnt** (int) - 满足要求的数据条目 + - **RuleInfo** (list) - 见 **BGPFwdRule** 模型定义 + + **Response Model** + + **BGPFwdRule** + - **BackupIP** (str) - 备份源站的IP + - **BackupPort** (int) - 备份源站的端口 + - **BgpIP** (str) - 转发规则对应的BGP高防的IP + - **BgpIPPort** (int) - 默认为0,为IP协议的转发端口,其余的自定义,在0~65535范围内即可,但是同一IP下配置的规则端口不能重复 + - **ClientProxyInfo** (dict) - 见 **FwdClientProxyInfo** 模型定义 + - **CreateTime** (int) - 创建时间,unix格式 + - **FwdType** (str) - 配置的规则的转发类型 + - **LoadBalance** (str) - 转发协议的类型是否为负载均衡的:默认为“No”,还可以选择为“Yes”。负载模式的规则最多添加2条,非负载模式的规则最多添加8条 + - **Remark** (str) - 备注 + - **RuleID** (str) - 转发规则的ID + - **RuleIndex** (int) - 生成的规则的数据库索引值 + - **SourceDetect** (int) - 表示对源站进行检测:默认为0表示关闭,还可以选择为1表示开启 + - **SourceInfo** (dict) - 见 **FwdSourceInfo** 模型定义 + - **Status** (str) - 规则的状态 + - **UpdateTime** (int) - 更新时间,unix格式 + + + **FwdClientProxyInfo** + - **Count** (int) - 回源IP个数 + - **IPList** (list) - 回源IP列表 + + + **FwdSourceInfo** + - **Conf** (list) - 见 **FwdSourceInfoConf** 模型定义 + - **Type** (str) - 回源类型,分 IP 和 Domain + + + **FwdSourceInfoConf** + - **IPList** (list) - 源站IP列表 + - **Port** (int) - 源站端口 + - **Source** (str) - 源站,兼容IP和域名 + - **Toa** (int) - 源站Toa + + + """ + # build request + d = {} + req and d.update(req) + d = apis.GetBGPServiceFwdRuleRequestSchema().dumps(d) + + resp = self.invoke("GetBGPServiceFwdRule", d, **kwargs) + return apis.GetBGPServiceFwdRuleResponseSchema().loads(resp) + + def get_bgp_service_ip( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetBGPServiceIP - 获取BGP高防IP的信息 + + **Request** + + - **ResourceId** (str) - (Required) 资源id + - **BgpIP** (str) - BGP高防IP + - **Limit** (int) - 分页显示的条目数,默认值为32 + - **Offset** (int) - 分页显示的起始偏移,默认值为0 + + **Response** + + - **AvailableIPQuota** (int) - 套餐可用的ip配额 + - **GameIPInfo** (list) - 见 **GameIpInfoTotal** 模型定义 + - **TotalCount** (int) - 套餐中已经配置的ip数量 + + **Response Model** + + **GameIpInfoTotal** + - **Cname** (str) - 高防IP Cname + - **DefenceIP** (str) - 高防IP + - **LineType** (str) - 线路类型 + - **Remark** (str) - 用户mark + - **RuleCnt** (int) - 规则的个数 + - **SrcIP** (list) - 回源ip列表 + - **Status** (str) - ip配置状态 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.GetBGPServiceIPRequestSchema().dumps(d) + + resp = self.invoke("GetBGPServiceIP", d, **kwargs) + return apis.GetBGPServiceIPResponseSchema().loads(resp) + + def get_buy_nap_service_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetBuyNapServicePrice - 获取高防价格 + + **Request** + + - **AreaLine** (str) - (Required) 地区线路 + - **ChargeType** (str) - (Required) 计费方式 + - **DefenceDDosBaseFlowArr** (list) - (Required) DDoS基础防护流量 + - **DefenceDDosMaxFlowArr** (list) - (Required) DDoS最大防护流量 + - **EngineRoom** (list) - (Required) 地区 + - **LineType** (str) - (Required) 线路类型 + - **Quantity** (str) - (Required) 计费时长 + - **SrcBandwidth** (str) - (Required) 带宽 + + **Response** + + - **ChargeIPQuota** (int) - 收费IP配额 + - **FreeIPQuota** (int) - 免费IP配额 + - **Message** (str) - 错误信息 + - **Price** (float) - 价格 + - **UdpFreeIpQuota** (int) - UDP免费IP配额 + + """ + # build request + d = {} + req and d.update(req) + d = apis.GetBuyNapServicePriceRequestSchema().dumps(d) + + resp = self.invoke("GetBuyNapServicePrice", d, **kwargs) + return apis.GetBuyNapServicePriceResponseSchema().loads(resp) + + def get_nap_allow_list_domain( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetNapAllowListDomain - 获取域名允许列表 + + **Request** + + - **ResourceId** (str) - (Required) 资源ID + - **Domain** (str) - 获取指定域名信息 + - **DomainLike** (str) - 域名模糊查找 + - **Limit** (int) - 返回数据长度,默认为1000 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + + **Response** + + - **DomainList** (list) - 见 **BlockAllowDomainEntry** 模型定义 + - **TotalCount** (int) - 列表总条目数 + + **Response Model** + + **BlockAllowDomainEntry** + - **CreateTime** (int) - 创建时间戳,例如:1581991500 + - **Domain** (str) - 域名 + - **Remark** (str) - 备注 + - **Status** (int) - 状态;1:添加中,2:成功,3:删除中,4:失败,5:已删除 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.GetNapAllowListDomainRequestSchema().dumps(d) + + resp = self.invoke("GetNapAllowListDomain", d, **kwargs) + return apis.GetNapAllowListDomainResponseSchema().loads(resp) + + def get_nap_service_config( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetNapServiceConfig - 获取高防服务配置 + + **Request** + + - **AreaLine** (str) - 线路区域 + - **EngineRoom** (str) - 购买的套餐所在机房 + - **LineType** (str) - 线路类型 + - **NapType** (int) - 高防类型;0:全部、1:内地高防、:2:海外高防 + + **Response** + + - **NapServiceConfig** (list) - 见 **NapServiceConfigEntry** 模型定义 + + **Response Model** + + **NapServiceConfigEntry** + - **AreaLine** (str) - 线路区域 + - **DR** (dict) - 灾备配置 + - **DayPay** (dict) - 按天购买配置 + - **Domain** (dict) - 域名配置 + - **DomainSrc** (dict) - 是否可以配置域名回源 + - **DynamicPay** (dict) - 按需购买配置 + - **EngineRoom** (str) - 购买的套餐所在机房 + - **LineType** (str) - 线路类型 + - **MonthPay** (dict) - 按月购买配置 + - **NapType** (int) - 高防类型,1:内地高防、2:海外高防 + - **YearPay** (dict) - 按年购买配置 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.GetNapServiceConfigRequestSchema().dumps(d) + + resp = self.invoke("GetNapServiceConfig", d, **kwargs) + return apis.GetNapServiceConfigResponseSchema().loads(resp) + + def modify_high_protect_game_ip_info( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyHighProtectGameIPInfo - 修改高防IP信息 + + **Request** + + - **DefenceIp** (str) - (Required) 高防ip + - **ResourceId** (str) - (Required) 资源Id + - **UserIP** (str) - (Required) 源站IP + + **Response** + + + """ + # build request + d = {} + req and d.update(req) + d = apis.ModifyHighProtectGameIPInfoRequestSchema().dumps(d) + + resp = self.invoke("ModifyHighProtectGameIPInfo", d, **kwargs) + return apis.ModifyHighProtectGameIPInfoResponseSchema().loads(resp) + + def modify_high_protect_game_service( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyHighProtectGameService - 修改高防信息 + + **Request** + + - **ResourceId** (str) - (Required) 资源Id + - **HighProtectGameServiceName** (str) - 高防名称 + + **Response** + + + """ + # build request + d = {} + req and d.update(req) + d = apis.ModifyHighProtectGameServiceRequestSchema().dumps(d) + + resp = self.invoke("ModifyHighProtectGameService", d, **kwargs) + return apis.ModifyHighProtectGameServiceResponseSchema().loads(resp) + + def modify_nap_service_auto_renew( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyNapServiceAutoRenew - 修改高防服务自动续费开关 + + **Request** + + - **AutoRenew** (int) - (Required) 自动续费开关, 0:关闭;1:开启 + - **ResourceId** (str) - (Required) 资源Id + + **Response** + + + """ + # build request + d = {} + req and d.update(req) + d = apis.ModifyNapServiceAutoRenewRequestSchema().dumps(d) + + resp = self.invoke("ModifyNapServiceAutoRenew", d, **kwargs) + return apis.ModifyNapServiceAutoRenewResponseSchema().loads(resp) + + def renew_high_protect_game_service( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RenewHighProtectGameService - 续费高防服务 + + **Request** + + - **AreaLine** (str) - (Required) 区域,华东和华南,EastChina 和SouthChina + - **ChargeType** (str) - (Required) 计费方式 + - **EngineRoom** (list) - (Required) 代表机房,例如Dongguan Hangzhou + - **LineType** (str) - (Required) 线路 + - **Quantity** (int) - (Required) 购买数量 + - **ResourceId** (str) - (Required) 资源ID + - **SrcBandwidth** (int) - (Required) 带宽,默认100M + - **CouponId** (str) - 代金券ID + - **DefenceDDosBaseFlowArr** (list) - DDoS基础防御值 + - **DefenceDDosMaxFlowArr** (list) - DDoS弹性防御值 + - **DefenceType** (str) - 防御类型,默认为TypeFixed + + **Response** + + - **ResourceInfo** (dict) - 见 **ResourceInfo** 模型定义 + + **Response Model** + + **ResourceInfo** + - **ResourceId** (str) - 资源id + + + """ + # build request + d = {} + req and d.update(req) + d = apis.RenewHighProtectGameServiceRequestSchema().dumps(d) + + resp = self.invoke("RenewHighProtectGameService", d, **kwargs) + return apis.RenewHighProtectGameServiceResponseSchema().loads(resp) + + def set_nap_domain_entry_remark( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """SetNapDomainEntryRemark - 设置域名条目备注 + + **Request** + + - **Domain** (str) - (Required) 域名 + - **ResourceId** (str) - (Required) 资源ID + - **Remark** (str) - 备注,默认为空 + + **Response** + + + """ + # build request + d = {} + req and d.update(req) + d = apis.SetNapDomainEntryRemarkRequestSchema().dumps(d) + + resp = self.invoke("SetNapDomainEntryRemark", d, **kwargs) + return apis.SetNapDomainEntryRemarkResponseSchema().loads(resp) + + def set_nap_fwd_rule_remark( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """SetNapFwdRuleRemark - 设置高防转发规则备注信息 + + **Request** + + - **ResourceId** (str) - (Required) 资源ID + - **RuleIndex** (str) - (Required) 要修改的规则index + - **Remark** (str) - 备注,默认为空 + + **Response** + + + """ + # build request + d = {} + req and d.update(req) + d = apis.SetNapFwdRuleRemarkRequestSchema().dumps(d) + + resp = self.invoke("SetNapFwdRuleRemark", d, **kwargs) + return apis.SetNapFwdRuleRemarkResponseSchema().loads(resp) + + def set_nap_ip_remark( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """SetNapIpRemark - 设置高防IP的备注信息 + + **Request** + + - **NapIp** (str) - (Required) 高防IP + - **ResourceId** (str) - (Required) 资源ID + - **Remark** (str) - 备注,默认为空 + + **Response** + + + """ + # build request + d = {} + req and d.update(req) + d = apis.SetNapIpRemarkRequestSchema().dumps(d) + + resp = self.invoke("SetNapIpRemark", d, **kwargs) + return apis.SetNapIpRemarkResponseSchema().loads(resp) + + def un_bind_nap_ip( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UnBindNapIP - 直连高防:将高防EIP从资源上解绑 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。请参考 `GetProjectList接口 `_ + - **BindResourceId** (str) - (Required) 需要解绑的资源ID + - **EIPId** (str) - (Required) 高防EIP资源ID + - **NapIp** (str) - (Required) 高防Ip + - **ResourceId** (str) - (Required) 高防资源ID + - **ResourceType** (str) - (Required) 解绑的资源类型(uhost:云主机,ulb:负载均衡,upm:物理机) + + **Response** + + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.UnBindNapIPRequestSchema().dumps(d) + + resp = self.invoke("UnBindNapIP", d, **kwargs) + return apis.UnBindNapIPResponseSchema().loads(resp) + + def update_bgp_service_fwd_rule( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateBGPServiceFwdRule - 用于修改BGP高防的规则信息 + + **Request** + + - **BgpIP** (str) - (Required) BGP的IP + - **ResourceId** (str) - (Required) 资源id + - **RuleID** (str) - (Required) 规则uuid + - **RuleIndex** (int) - (Required) 要修改的规则index + - **BackupIP** (str) - 备份源站的IP + - **BackupPort** (int) - 备份源站的端口 + - **BgpIPPort** (int) - 默认为0,为IP协议的转发端口,其余的自定义 + - **FwdType** (str) - 转发协议的类型包括三种:默认为“IP”,还可以选择为“TCP”或"UDP" + - **LoadBalance** (str) - 转发协议的类型是否为负载均衡的:默认为“No”,还可以选择为“Yes”。负载模式的规则最多添加2条,非负载模式的规则最多添加8条 + - **SourceAddrArr** (list) - 回源地址,可填 IP地址 或 域名 + - **SourceDetect** (int) - 表示对源站进行检测:默认为0表示关闭,还可以选择为1表示开启 + - **SourcePortArr** (list) - 回源端口 + - **SourceToaIDArr** (list) - 回源TOA + + **Response** + + - **RuleIndex** (int) - 转发规则的数据库索引 + + """ + # build request + d = {} + req and d.update(req) + d = apis.UpdateBGPServiceFwdRuleRequestSchema().dumps(d) + + resp = self.invoke("UpdateBGPServiceFwdRule", d, **kwargs) + return apis.UpdateBGPServiceFwdRuleResponseSchema().loads(resp) + + def update_nap_fwd_rule_domain_resolution( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateNapFwdRuleDomainResolution - 手动触发域名回源转发规则更新 + + **Request** + + - **ResourceId** (str) - (Required) 资源ID + - **RuleIndex** (int) - (Required) 要修改的规则index + + **Response** + + + """ + # build request + d = {} + req and d.update(req) + d = apis.UpdateNapFwdRuleDomainResolutionRequestSchema().dumps(d) + + resp = self.invoke("UpdateNapFwdRuleDomainResolution", d, **kwargs) + return apis.UpdateNapFwdRuleDomainResolutionResponseSchema().loads(resp) + + def upgrade_high_protect_game_service( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpgradeHighProtectGameService - 升降级高防服务 + + **Request** + + - **AreaLine** (str) - (Required) 区域,华东和华南,EastChina 和SouthChina + - **EngineRoom** (list) - (Required) 机房 + - **LineType** (str) - (Required) 线路类型 + - **ResourceId** (str) - (Required) 资源ID + - **SrcBandwidth** (int) - (Required) 业务带宽 + - **CouponId** (str) - 代金券ID + - **DefenceDDosBaseFlowArr** (list) - DDoS基础防御值 + - **DefenceDDosMaxFlowArr** (list) - DDoS弹性防御值 + - **DefenceType** (str) - 防御类型,默认为TypeFixed + + **Response** + + - **ResourceInfo** (dict) - 见 **ResourceInfo** 模型定义 + + **Response Model** + + **ResourceInfo** + - **ResourceId** (str) - 资源id + + + """ + # build request + d = {} + req and d.update(req) + d = apis.UpgradeHighProtectGameServiceRequestSchema().dumps(d) + + resp = self.invoke("UpgradeHighProtectGameService", d, **kwargs) + return apis.UpgradeHighProtectGameServiceResponseSchema().loads(resp) diff --git a/ucloud/services/uads/schemas/__init__.py b/ucloud/services/uads/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/uads/schemas/apis.py b/ucloud/services/uads/schemas/apis.py new file mode 100644 index 00000000..2a3a6668 --- /dev/null +++ b/ucloud/services/uads/schemas/apis.py @@ -0,0 +1,983 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.uads.schemas import models + +""" UADS API Schema +""" + + +""" +API: AddHighProtectGameIPInfo + +添加代理ip +""" + + +class AddHighProtectGameIPInfoRequestSchema(schema.RequestSchema): + """AddHighProtectGameIPInfo - 添加代理ip""" + + fields = { + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "LineType": fields.Str(required=True, dump_to="LineType"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + "TypeIP": fields.Str(required=True, dump_to="TypeIP"), + "UserIP": fields.Str(required=True, dump_to="UserIP"), + } + + +class AddHighProtectGameIPInfoResponseSchema(schema.ResponseSchema): + """AddHighProtectGameIPInfo - 添加代理ip""" + + fields = { + "Cname": fields.Str(required=True, load_from="Cname"), + "DefenceIP": fields.Str(required=True, load_from="DefenceIP"), + "IPId": fields.Int(required=True, load_from="IPId"), + "SrcIP": fields.Str(required=True, load_from="SrcIP"), + } + + +""" +API: AddNapAllowListDomain + +添加域名允许列表 +""" + + +class AddNapAllowListDomainRequestSchema(schema.RequestSchema): + """AddNapAllowListDomain - 添加域名允许列表""" + + fields = { + "Domain": fields.List(fields.Str()), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class AddNapAllowListDomainResponseSchema(schema.ResponseSchema): + """AddNapAllowListDomain - 添加域名允许列表""" + + fields = { + "Data": fields.List( + models.DomainConfigResultSchema(), required=False, load_from="Data" + ), + } + + +""" +API: BindNapIP + +直连高防:将尚未使用的高防EIP绑定到指定的资源 +""" + + +class BindNapIPRequestSchema(schema.RequestSchema): + """BindNapIP - 直连高防:将尚未使用的高防EIP绑定到指定的资源""" + + fields = { + "BindResourceId": fields.Str(required=True, dump_to="BindResourceId"), + "EIPId": fields.Str(required=True, dump_to="EIPId"), + "NapIp": fields.Str(required=True, dump_to="NapIp"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + "ResourceType": fields.Str(required=True, dump_to="ResourceType"), + } + + +class BindNapIPResponseSchema(schema.ResponseSchema): + """BindNapIP - 直连高防:将尚未使用的高防EIP绑定到指定的资源""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: BuyHighProtectGameService + +购买高防服务 +""" + + +class BuyHighProtectGameServiceRequestSchema(schema.RequestSchema): + """BuyHighProtectGameService - 购买高防服务""" + + fields = { + "AccessMode": fields.Str( + required=False, dump_to="AccessMode" + ), # Deprecated, will be removed at 1.0 + "AreaLine": fields.Str(required=True, dump_to="AreaLine"), + "ChargeType": fields.Str(required=True, dump_to="ChargeType"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "DefenceDDosBaseFlowArr": fields.List(fields.Str()), + "DefenceDDosMaxFlowArr": fields.List(fields.Str()), + "DefenceType": fields.Str(required=False, dump_to="DefenceType"), + "EngineRoom": fields.List(fields.Str()), + "ForwardType": fields.Str(required=False, dump_to="ForwardType"), + "HighProtectGameServiceName": fields.Str( + required=False, dump_to="HighProtectGameServiceName" + ), + "LineType": fields.Str(required=True, dump_to="LineType"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Quantity": fields.Int(required=True, dump_to="Quantity"), + "SrcBandwidth": fields.Int(required=True, dump_to="SrcBandwidth"), + "Vendor": fields.Int(required=False, dump_to="Vendor"), + } + + +class BuyHighProtectGameServiceResponseSchema(schema.ResponseSchema): + """BuyHighProtectGameService - 购买高防服务""" + + fields = { + "ResourceInfo": models.ResourceInfoSchema(), + } + + +""" +API: CreateBGPServiceFwdRule + +创建BGP高防转发规则 +""" + + +class CreateBGPServiceFwdRuleRequestSchema(schema.RequestSchema): + """CreateBGPServiceFwdRule - 创建BGP高防转发规则""" + + fields = { + "BackupIP": fields.Str(required=False, dump_to="BackupIP"), + "BackupPort": fields.Int(required=False, dump_to="BackupPort"), + "BgpIP": fields.Str(required=True, dump_to="BgpIP"), + "BgpIPPort": fields.Int(required=False, dump_to="BgpIPPort"), + "FwdType": fields.Str(required=False, dump_to="FwdType"), + "LoadBalance": fields.Str(required=False, dump_to="LoadBalance"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + "SourceAddrArr": fields.List(fields.Str()), + "SourceDetect": fields.Int(required=False, dump_to="SourceDetect"), + "SourcePortArr": fields.List(fields.Str()), + "SourceToaIDArr": fields.List(fields.Str()), + "SourceType": fields.Str(required=False, dump_to="SourceType"), + } + + +class CreateBGPServiceFwdRuleResponseSchema(schema.ResponseSchema): + """CreateBGPServiceFwdRule - 创建BGP高防转发规则""" + + fields = { + "RuleIndex": fields.Int(required=True, load_from="RuleIndex"), + } + + +""" +API: CreateBGPServiceIP + +分配一个BGP IP +""" + + +class CreateBGPServiceIPRequestSchema(schema.RequestSchema): + """CreateBGPServiceIP - 分配一个BGP IP""" + + fields = { + "EIPRegion": fields.Str(required=False, dump_to="EIPRegion"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + "TypeIP": fields.Str(required=False, dump_to="TypeIP"), + } + + +class CreateBGPServiceIPResponseSchema(schema.ResponseSchema): + """CreateBGPServiceIP - 分配一个BGP IP""" + + fields = { + "Cname": fields.Str(required=False, load_from="Cname"), + "DefenceIP": fields.Str(required=True, load_from="DefenceIP"), + "EnableSwitch": fields.Int(required=False, load_from="EnableSwitch"), + "IPId": fields.Int(required=False, load_from="IPId"), + } + + +""" +API: DeleteBGPServiceFwdRule + +删除转发规则 +""" + + +class DeleteBGPServiceFwdRuleRequestSchema(schema.RequestSchema): + """DeleteBGPServiceFwdRule - 删除转发规则""" + + fields = { + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + "RuleIndex": fields.Int(required=True, dump_to="RuleIndex"), + } + + +class DeleteBGPServiceFwdRuleResponseSchema(schema.ResponseSchema): + """DeleteBGPServiceFwdRule - 删除转发规则""" + + fields = {} + + +""" +API: DeleteBGPServiceIP + +删除BGP高防IP +""" + + +class DeleteBGPServiceIPRequestSchema(schema.RequestSchema): + """DeleteBGPServiceIP - 删除BGP高防IP""" + + fields = { + "DefenceIp": fields.Str(required=True, dump_to="DefenceIp"), + "Region": fields.Str(required=False, dump_to="Region"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class DeleteBGPServiceIPResponseSchema(schema.ResponseSchema): + """DeleteBGPServiceIP - 删除BGP高防IP""" + + fields = {} + + +""" +API: DeleteHighProtectGameIPInfo + +删除高防IP +""" + + +class DeleteHighProtectGameIPInfoRequestSchema(schema.RequestSchema): + """DeleteHighProtectGameIPInfo - 删除高防IP""" + + fields = { + "DefenceIp": fields.Str(required=True, dump_to="DefenceIp"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class DeleteHighProtectGameIPInfoResponseSchema(schema.ResponseSchema): + """DeleteHighProtectGameIPInfo - 删除高防IP""" + + fields = {} + + +""" +API: DeleteHighProtectGameService + +删除高防 +""" + + +class DeleteHighProtectGameServiceRequestSchema(schema.RequestSchema): + """DeleteHighProtectGameService - 删除高防""" + + fields = { + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class DeleteHighProtectGameServiceResponseSchema(schema.ResponseSchema): + """DeleteHighProtectGameService - 删除高防""" + + fields = {} + + +""" +API: DeleteNapAllowListDomain + +删除域名允许列表 +""" + + +class DeleteNapAllowListDomainRequestSchema(schema.RequestSchema): + """DeleteNapAllowListDomain - 删除域名允许列表""" + + fields = { + "Domain": fields.List(fields.Str()), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class DeleteNapAllowListDomainResponseSchema(schema.ResponseSchema): + """DeleteNapAllowListDomain - 删除域名允许列表""" + + fields = { + "Data": fields.List( + models.DomainConfigResultSchema(), required=False, load_from="Data" + ), + } + + +""" +API: DescribeBuyHighProtectGameIPPrice + +获取购买IP的价格 +""" + + +class DescribeBuyHighProtectGameIPPriceRequestSchema(schema.RequestSchema): + """DescribeBuyHighProtectGameIPPrice - 获取购买IP的价格""" + + fields = { + "ChargeType": fields.Str(required=True, dump_to="ChargeType"), + "Quantity": fields.Int(required=True, dump_to="Quantity"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class DescribeBuyHighProtectGameIPPriceResponseSchema(schema.ResponseSchema): + """DescribeBuyHighProtectGameIPPrice - 获取购买IP的价格""" + + fields = { + "PremiumPrice": fields.Float(required=True, load_from="PremiumPrice"), + "UnitPrice": fields.Float(required=True, load_from="UnitPrice"), + } + + +""" +API: DescribeHighProtectGameIPInfo + +获取高防IP信息 +""" + + +class DescribeHighProtectGameIPInfoRequestSchema(schema.RequestSchema): + """DescribeHighProtectGameIPInfo - 获取高防IP信息""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class DescribeHighProtectGameIPInfoResponseSchema(schema.ResponseSchema): + """DescribeHighProtectGameIPInfo - 获取高防IP信息""" + + fields = { + "AvailableIPQuota": fields.Int( + required=False, load_from="AvailableIPQuota" + ), + "GameIPInfo": fields.List( + models.GameIpInfoTotalSchema(), + required=False, + load_from="GameIPInfo", + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeNapHistoryStatistic + +获取高防历史统计 +""" + + +class DescribeNapHistoryStatisticRequestSchema(schema.RequestSchema): + """DescribeNapHistoryStatistic - 获取高防历史统计""" + + fields = { + "Accuracy": fields.Int(required=False, dump_to="Accuracy"), + "BeginTime": fields.Int(required=True, dump_to="BeginTime"), + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "NapIP": fields.Str(required=False, dump_to="NapIP"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class DescribeNapHistoryStatisticResponseSchema(schema.ResponseSchema): + """DescribeNapHistoryStatistic - 获取高防历史统计""" + + fields = { + "NetStats": fields.List( + models.NetStatsSchema(), required=True, load_from="NetStats" + ), + } + + +""" +API: DescribeNapRealTimeStatistic + +获取高防实时统计 +""" + + +class DescribeNapRealTimeStatisticRequestSchema(schema.RequestSchema): + """DescribeNapRealTimeStatistic - 获取高防实时统计""" + + fields = { + "BeginTime": fields.Int(required=True, dump_to="BeginTime"), + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "NapIP": fields.Str(required=False, dump_to="NapIP"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class DescribeNapRealTimeStatisticResponseSchema(schema.ResponseSchema): + """DescribeNapRealTimeStatistic - 获取高防实时统计""" + + fields = { + "NetStats": fields.List( + models.NetStatsSchema(), required=True, load_from="NetStats" + ), + } + + +""" +API: DescribeNapServiceInfo + +获取高防服务信息 +""" + + +class DescribeNapServiceInfoRequestSchema(schema.RequestSchema): + """DescribeNapServiceInfo - 获取高防服务信息""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "NapType": fields.Int(required=False, dump_to="NapType"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ResourceId": fields.Str(required=False, dump_to="ResourceId"), + } + + +class DescribeNapServiceInfoResponseSchema(schema.ResponseSchema): + """DescribeNapServiceInfo - 获取高防服务信息""" + + fields = { + "ServiceInfo": fields.List( + models.ServiceInfoSchema(), required=False, load_from="ServiceInfo" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribePassthroughNapIP + +获取直连高防IP信息 +""" + + +class DescribePassthroughNapIPRequestSchema(schema.RequestSchema): + """DescribePassthroughNapIP - 获取直连高防IP信息""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "NapIp": fields.Str(required=False, dump_to="NapIp"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class DescribePassthroughNapIPResponseSchema(schema.ResponseSchema): + """DescribePassthroughNapIP - 获取直连高防IP信息""" + + fields = { + "AvailableIPQuota": fields.Int( + required=True, load_from="AvailableIPQuota" + ), + "IPInfo": fields.List( + models.IPInfoSchema(), required=True, load_from="IPInfo" + ), + "Message": fields.Str(required=True, load_from="Message"), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeUpgradeHighProtectGameServicePrice + +获取高防升降级价格 +""" + + +class DescribeUpgradeHighProtectGameServicePriceRequestSchema( + schema.RequestSchema +): + """DescribeUpgradeHighProtectGameServicePrice - 获取高防升降级价格""" + + fields = { + "AreaLine": fields.Str(required=False, dump_to="AreaLine"), + "DefenceDDosBaseFlowArr": fields.List(fields.Str()), + "DefenceDDosMaxFlowArr": fields.List(fields.Str()), + "DefenceType": fields.Str(required=False, dump_to="DefenceType"), + "EngineRoom": fields.List(fields.Str()), + "LineType": fields.Str(required=False, dump_to="LineType"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + "SrcBandwidth": fields.Int(required=False, dump_to="SrcBandwidth"), + } + + +class DescribeUpgradeHighProtectGameServicePriceResponseSchema( + schema.ResponseSchema +): + """DescribeUpgradeHighProtectGameServicePrice - 获取高防升降级价格""" + + fields = { + "ChargeIPQuota": fields.Int(required=False, load_from="ChargeIPQuota"), + "FreeIPQuota": fields.Int(required=False, load_from="FreeIPQuota"), + "Price": fields.Int(required=True, load_from="Price"), + } + + +""" +API: GetBGPServiceFwdRule + +获取转发规则 +""" + + +class GetBGPServiceFwdRuleRequestSchema(schema.RequestSchema): + """GetBGPServiceFwdRule - 获取转发规则""" + + fields = { + "BgpIP": fields.Str(required=False, dump_to="BgpIP"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + "RuleIndex": fields.Int(required=False, dump_to="RuleIndex"), + } + + +class GetBGPServiceFwdRuleResponseSchema(schema.ResponseSchema): + """GetBGPServiceFwdRule - 获取转发规则""" + + fields = { + "AvailLoad": fields.Int(required=False, load_from="AvailLoad"), + "AvailNonload": fields.Int(required=False, load_from="AvailNonload"), + "IpRuleExist": fields.Bool(required=False, load_from="IpRuleExist"), + "RuleCnt": fields.Int(required=True, load_from="RuleCnt"), + "RuleInfo": fields.List( + models.BGPFwdRuleSchema(), required=True, load_from="RuleInfo" + ), + } + + +""" +API: GetBGPServiceIP + +获取BGP高防IP的信息 +""" + + +class GetBGPServiceIPRequestSchema(schema.RequestSchema): + """GetBGPServiceIP - 获取BGP高防IP的信息""" + + fields = { + "BgpIP": fields.Str(required=False, dump_to="BgpIP"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class GetBGPServiceIPResponseSchema(schema.ResponseSchema): + """GetBGPServiceIP - 获取BGP高防IP的信息""" + + fields = { + "AvailableIPQuota": fields.Int( + required=True, load_from="AvailableIPQuota" + ), + "GameIPInfo": fields.List( + models.GameIpInfoTotalSchema(), + required=True, + load_from="GameIPInfo", + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: GetBuyNapServicePrice + +获取高防价格 +""" + + +class GetBuyNapServicePriceRequestSchema(schema.RequestSchema): + """GetBuyNapServicePrice - 获取高防价格""" + + fields = { + "AccessMode": fields.Str( + required=False, dump_to="AccessMode" + ), # Deprecated, will be removed at 1.0 + "AreaLine": fields.Str(required=True, dump_to="AreaLine"), + "ChargeType": fields.Str(required=True, dump_to="ChargeType"), + "DefenceDDosBaseFlowArr": fields.List(fields.Str()), + "DefenceDDosMaxFlowArr": fields.List(fields.Str()), + "EngineRoom": fields.List(fields.Str()), + "LineType": fields.Str(required=True, dump_to="LineType"), + "Quantity": fields.Str(required=True, dump_to="Quantity"), + "SrcBandwidth": fields.Str(required=True, dump_to="SrcBandwidth"), + } + + +class GetBuyNapServicePriceResponseSchema(schema.ResponseSchema): + """GetBuyNapServicePrice - 获取高防价格""" + + fields = { + "ChargeIPQuota": fields.Int(required=True, load_from="ChargeIPQuota"), + "FreeIPQuota": fields.Int(required=True, load_from="FreeIPQuota"), + "Message": fields.Str(required=True, load_from="Message"), + "Price": fields.Float(required=True, load_from="Price"), + "UdpFreeIpQuota": fields.Int(required=True, load_from="UdpFreeIpQuota"), + } + + +""" +API: GetNapAllowListDomain + +获取域名允许列表 +""" + + +class GetNapAllowListDomainRequestSchema(schema.RequestSchema): + """GetNapAllowListDomain - 获取域名允许列表""" + + fields = { + "Domain": fields.Str(required=False, dump_to="Domain"), + "DomainLike": fields.Str(required=False, dump_to="DomainLike"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class GetNapAllowListDomainResponseSchema(schema.ResponseSchema): + """GetNapAllowListDomain - 获取域名允许列表""" + + fields = { + "DomainList": fields.List( + models.BlockAllowDomainEntrySchema(), + required=True, + load_from="DomainList", + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: GetNapServiceConfig + +获取高防服务配置 +""" + + +class GetNapServiceConfigRequestSchema(schema.RequestSchema): + """GetNapServiceConfig - 获取高防服务配置""" + + fields = { + "AreaLine": fields.Str(required=False, dump_to="AreaLine"), + "EngineRoom": fields.Str(required=False, dump_to="EngineRoom"), + "LineType": fields.Str(required=False, dump_to="LineType"), + "NapType": fields.Int(required=False, dump_to="NapType"), + } + + +class GetNapServiceConfigResponseSchema(schema.ResponseSchema): + """GetNapServiceConfig - 获取高防服务配置""" + + fields = { + "NapServiceConfig": fields.List( + models.NapServiceConfigEntrySchema(), + required=True, + load_from="NapServiceConfig", + ), + } + + +""" +API: ModifyHighProtectGameIPInfo + +修改高防IP信息 +""" + + +class ModifyHighProtectGameIPInfoRequestSchema(schema.RequestSchema): + """ModifyHighProtectGameIPInfo - 修改高防IP信息""" + + fields = { + "DefenceIp": fields.Str(required=True, dump_to="DefenceIp"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + "UserIP": fields.Str(required=True, dump_to="UserIP"), + } + + +class ModifyHighProtectGameIPInfoResponseSchema(schema.ResponseSchema): + """ModifyHighProtectGameIPInfo - 修改高防IP信息""" + + fields = {} + + +""" +API: ModifyHighProtectGameService + +修改高防信息 +""" + + +class ModifyHighProtectGameServiceRequestSchema(schema.RequestSchema): + """ModifyHighProtectGameService - 修改高防信息""" + + fields = { + "HighProtectGameServiceName": fields.Str( + required=False, dump_to="HighProtectGameServiceName" + ), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class ModifyHighProtectGameServiceResponseSchema(schema.ResponseSchema): + """ModifyHighProtectGameService - 修改高防信息""" + + fields = {} + + +""" +API: ModifyNapServiceAutoRenew + +修改高防服务自动续费开关 +""" + + +class ModifyNapServiceAutoRenewRequestSchema(schema.RequestSchema): + """ModifyNapServiceAutoRenew - 修改高防服务自动续费开关""" + + fields = { + "AutoRenew": fields.Int(required=True, dump_to="AutoRenew"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class ModifyNapServiceAutoRenewResponseSchema(schema.ResponseSchema): + """ModifyNapServiceAutoRenew - 修改高防服务自动续费开关""" + + fields = {} + + +""" +API: RenewHighProtectGameService + +续费高防服务 +""" + + +class RenewHighProtectGameServiceRequestSchema(schema.RequestSchema): + """RenewHighProtectGameService - 续费高防服务""" + + fields = { + "AreaLine": fields.Str(required=True, dump_to="AreaLine"), + "ChargeType": fields.Str(required=True, dump_to="ChargeType"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "DefenceDDosBaseFlowArr": fields.List(fields.Str()), + "DefenceDDosMaxFlowArr": fields.List(fields.Str()), + "DefenceType": fields.Str(required=False, dump_to="DefenceType"), + "EngineRoom": fields.List(fields.Str()), + "LineType": fields.Str(required=True, dump_to="LineType"), + "Quantity": fields.Int(required=True, dump_to="Quantity"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + "SrcBandwidth": fields.Int(required=True, dump_to="SrcBandwidth"), + } + + +class RenewHighProtectGameServiceResponseSchema(schema.ResponseSchema): + """RenewHighProtectGameService - 续费高防服务""" + + fields = { + "ResourceInfo": models.ResourceInfoSchema(), + } + + +""" +API: SetNapDomainEntryRemark + +设置域名条目备注 +""" + + +class SetNapDomainEntryRemarkRequestSchema(schema.RequestSchema): + """SetNapDomainEntryRemark - 设置域名条目备注""" + + fields = { + "Domain": fields.Str(required=True, dump_to="Domain"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class SetNapDomainEntryRemarkResponseSchema(schema.ResponseSchema): + """SetNapDomainEntryRemark - 设置域名条目备注""" + + fields = {} + + +""" +API: SetNapFwdRuleRemark + +设置高防转发规则备注信息 +""" + + +class SetNapFwdRuleRemarkRequestSchema(schema.RequestSchema): + """SetNapFwdRuleRemark - 设置高防转发规则备注信息""" + + fields = { + "Remark": fields.Str(required=False, dump_to="Remark"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + "RuleIndex": fields.Str(required=True, dump_to="RuleIndex"), + } + + +class SetNapFwdRuleRemarkResponseSchema(schema.ResponseSchema): + """SetNapFwdRuleRemark - 设置高防转发规则备注信息""" + + fields = {} + + +""" +API: SetNapIpRemark + +设置高防IP的备注信息 +""" + + +class SetNapIpRemarkRequestSchema(schema.RequestSchema): + """SetNapIpRemark - 设置高防IP的备注信息""" + + fields = { + "NapIp": fields.Str(required=True, dump_to="NapIp"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class SetNapIpRemarkResponseSchema(schema.ResponseSchema): + """SetNapIpRemark - 设置高防IP的备注信息""" + + fields = {} + + +""" +API: UnBindNapIP + +直连高防:将高防EIP从资源上解绑 +""" + + +class UnBindNapIPRequestSchema(schema.RequestSchema): + """UnBindNapIP - 直连高防:将高防EIP从资源上解绑""" + + fields = { + "BindResourceId": fields.Str(required=True, dump_to="BindResourceId"), + "EIPId": fields.Str(required=True, dump_to="EIPId"), + "NapIp": fields.Str(required=True, dump_to="NapIp"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + "ResourceType": fields.Str(required=True, dump_to="ResourceType"), + } + + +class UnBindNapIPResponseSchema(schema.ResponseSchema): + """UnBindNapIP - 直连高防:将高防EIP从资源上解绑""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: UpdateBGPServiceFwdRule + +用于修改BGP高防的规则信息 +""" + + +class UpdateBGPServiceFwdRuleRequestSchema(schema.RequestSchema): + """UpdateBGPServiceFwdRule - 用于修改BGP高防的规则信息""" + + fields = { + "BackupIP": fields.Str(required=False, dump_to="BackupIP"), + "BackupPort": fields.Int(required=False, dump_to="BackupPort"), + "BgpIP": fields.Str(required=True, dump_to="BgpIP"), + "BgpIPPort": fields.Int(required=False, dump_to="BgpIPPort"), + "FwdType": fields.Str(required=False, dump_to="FwdType"), + "LoadBalance": fields.Str(required=False, dump_to="LoadBalance"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + "RuleID": fields.Str(required=True, dump_to="RuleID"), + "RuleIndex": fields.Int(required=True, dump_to="RuleIndex"), + "SourceAddrArr": fields.List(fields.Str()), + "SourceDetect": fields.Int(required=False, dump_to="SourceDetect"), + "SourcePortArr": fields.List(fields.Str()), + "SourceToaIDArr": fields.List(fields.Str()), + } + + +class UpdateBGPServiceFwdRuleResponseSchema(schema.ResponseSchema): + """UpdateBGPServiceFwdRule - 用于修改BGP高防的规则信息""" + + fields = { + "RuleIndex": fields.Int(required=False, load_from="RuleIndex"), + } + + +""" +API: UpdateNapFwdRuleDomainResolution + +手动触发域名回源转发规则更新 +""" + + +class UpdateNapFwdRuleDomainResolutionRequestSchema(schema.RequestSchema): + """UpdateNapFwdRuleDomainResolution - 手动触发域名回源转发规则更新""" + + fields = { + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + "RuleIndex": fields.Int(required=True, dump_to="RuleIndex"), + } + + +class UpdateNapFwdRuleDomainResolutionResponseSchema(schema.ResponseSchema): + """UpdateNapFwdRuleDomainResolution - 手动触发域名回源转发规则更新""" + + fields = {} + + +""" +API: UpgradeHighProtectGameService + +升降级高防服务 +""" + + +class UpgradeHighProtectGameServiceRequestSchema(schema.RequestSchema): + """UpgradeHighProtectGameService - 升降级高防服务""" + + fields = { + "AreaLine": fields.Str(required=True, dump_to="AreaLine"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "DefenceDDosBaseFlowArr": fields.List(fields.Str()), + "DefenceDDosMaxFlowArr": fields.List(fields.Str()), + "DefenceType": fields.Str(required=False, dump_to="DefenceType"), + "EngineRoom": fields.List(fields.Str()), + "LineType": fields.Str(required=True, dump_to="LineType"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + "SrcBandwidth": fields.Int(required=True, dump_to="SrcBandwidth"), + } + + +class UpgradeHighProtectGameServiceResponseSchema(schema.ResponseSchema): + """UpgradeHighProtectGameService - 升降级高防服务""" + + fields = { + "ResourceInfo": models.ResourceInfoSchema(), + } diff --git a/ucloud/services/uads/schemas/models.py b/ucloud/services/uads/schemas/models.py new file mode 100644 index 00000000..4f011a25 --- /dev/null +++ b/ucloud/services/uads/schemas/models.py @@ -0,0 +1,199 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class DomainConfigResultSchema(schema.ResponseSchema): + """DomainConfigResult - 域名配置结果""" + + fields = { + "Code": fields.Int(required=True, load_from="Code"), + "Domain": fields.Str(required=True, load_from="Domain"), + "Message": fields.Str(required=True, load_from="Message"), + } + + +class ResourceInfoSchema(schema.ResponseSchema): + """ResourceInfo - 资源信息""" + + fields = { + "ResourceId": fields.Str(required=False, load_from="ResourceId"), + } + + +class GameIpInfoTotalSchema(schema.ResponseSchema): + """GameIpInfoTotal - 高防ip信息统一描述结构""" + + fields = { + "Cname": fields.Str(required=False, load_from="Cname"), + "DefenceIP": fields.Str(required=False, load_from="DefenceIP"), + "LineType": fields.Str(required=False, load_from="LineType"), + "Remark": fields.Str(required=False, load_from="Remark"), + "RuleCnt": fields.Int(required=False, load_from="RuleCnt"), + "SrcIP": fields.List(fields.Str()), + "Status": fields.Str(required=False, load_from="Status"), + } + + +class NetStatEntrySchema(schema.ResponseSchema): + """NetStatEntry - 统计条目""" + + fields = { + "Bps": fields.Float(required=False, load_from="Bps"), + "Pps": fields.Int(required=False, load_from="Pps"), + } + + +class NetStatsSchema(schema.ResponseSchema): + """NetStats - 网络统计""" + + fields = { + "Drop": NetStatEntrySchema(), + "Egress": NetStatEntrySchema(), + "Ingress": NetStatEntrySchema(), + "Time": fields.Int(required=False, load_from="Time"), + } + + +class ServiceInfoSchema(schema.ResponseSchema): + """ServiceInfo - 高防服务信息""" + + fields = { + "AccessMode": fields.Str(required=False, load_from="AccessMode"), + "AreaLine": fields.Str(required=False, load_from="AreaLine"), + "AutoRenew": fields.Str(required=False, load_from="AutoRenew"), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DefenceDDosBaseFlowArr": fields.List(fields.Int()), + "DefenceDDosMaxFlowArr": fields.List(fields.Int()), + "DefenceStatus": fields.Str(required=False, load_from="DefenceStatus"), + "DefenceType": fields.Str(required=False, load_from="DefenceType"), + "EngineRoom": fields.List(fields.Str()), + "ExpiredTime": fields.Int(required=False, load_from="ExpiredTime"), + "ForwardType": fields.Str(required=False, load_from="ForwardType"), + "GameId": fields.Int(required=False, load_from="GameId"), + "LineType": fields.Str(required=False, load_from="LineType"), + "Name": fields.Str(required=False, load_from="Name"), + "NapType": fields.Int(required=False, load_from="NapType"), + "ProjectId": fields.Str(required=False, load_from="ProjectId"), + "RegionId": fields.Int(required=False, load_from="RegionId"), + "ResourceId": fields.Str(required=False, load_from="ResourceId"), + "SrcBandwidth": fields.Int(required=False, load_from="SrcBandwidth"), + "Vendor": fields.Int(required=False, load_from="Vendor"), + } + + +class ResouceSchema(schema.ResponseSchema): + """Resouce - 资源信息""" + + fields = { + "EIPId": fields.Str(required=False, load_from="EIPId"), + "ResourceId": fields.Str(required=False, load_from="ResourceId"), + "ResourceName": fields.Str(required=False, load_from="ResourceName"), + "ResourceType": fields.Str(required=False, load_from="ResourceType"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class EIPAddrSetSchema(schema.ResponseSchema): + """EIPAddrSet - EIP地址信息""" + + fields = { + "EIPType": fields.Str(required=False, load_from="EIPType"), + "IP": fields.Str(required=False, load_from="IP"), + "OperatorName": fields.Str(required=False, load_from="OperatorName"), + } + + +class IPInfoSchema(schema.ResponseSchema): + """IPInfo - 高防IP信息""" + + fields = { + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "EIPAddr": fields.List(EIPAddrSetSchema()), + "EIPId": fields.Str(required=False, load_from="EIPId"), + "EIPRegion": fields.Str(required=False, load_from="EIPRegion"), + "Resource": ResouceSchema(), + "Status": fields.Str(required=False, load_from="Status"), + "Tag": fields.Str(required=False, load_from="Tag"), + } + + +class FwdSourceInfoConfSchema(schema.ResponseSchema): + """FwdSourceInfoConf - 转发规则,回源信息配置详细结构""" + + fields = { + "IPList": fields.List(fields.Str()), + "Port": fields.Int(required=False, load_from="Port"), + "Source": fields.Str(required=False, load_from="Source"), + "Toa": fields.Int(required=False, load_from="Toa"), + } + + +class FwdSourceInfoSchema(schema.ResponseSchema): + """FwdSourceInfo - 转发规则,回源配置信息""" + + fields = { + "Conf": fields.List(FwdSourceInfoConfSchema()), + "Type": fields.Str(required=False, load_from="Type"), + } + + +class FwdClientProxyInfoSchema(schema.ResponseSchema): + """FwdClientProxyInfo - 转发规则,回源代理配置列表""" + + fields = { + "Count": fields.Int(required=False, load_from="Count"), + "IPList": fields.List(fields.Str()), + } + + +class BGPFwdRuleSchema(schema.ResponseSchema): + """BGPFwdRule - BGP高防的转发规则信息""" + + fields = { + "BackupIP": fields.Str(required=False, load_from="BackupIP"), + "BackupPort": fields.Int(required=False, load_from="BackupPort"), + "BgpIP": fields.Str(required=False, load_from="BgpIP"), + "BgpIPPort": fields.Int(required=False, load_from="BgpIPPort"), + "ClientProxyInfo": FwdClientProxyInfoSchema(), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "FwdType": fields.Str(required=False, load_from="FwdType"), + "LoadBalance": fields.Str(required=False, load_from="LoadBalance"), + "Remark": fields.Str(required=False, load_from="Remark"), + "RuleID": fields.Str(required=False, load_from="RuleID"), + "RuleIndex": fields.Int(required=False, load_from="RuleIndex"), + "SourceDetect": fields.Int(required=False, load_from="SourceDetect"), + "SourceInfo": FwdSourceInfoSchema(), + "Status": fields.Str(required=False, load_from="Status"), + "UpdateTime": fields.Int(required=False, load_from="UpdateTime"), + } + + +class BlockAllowDomainEntrySchema(schema.ResponseSchema): + """BlockAllowDomainEntry - 阻止/允许域名条目""" + + fields = { + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "Domain": fields.Str(required=True, load_from="Domain"), + "Remark": fields.Str(required=True, load_from="Remark"), + "Status": fields.Int(required=True, load_from="Status"), + } + + +class NapServiceConfigEntrySchema(schema.ResponseSchema): + """NapServiceConfigEntry - 高防服务配置条目""" + + fields = { + "AreaLine": fields.Str(required=False, load_from="AreaLine"), + "DR": fields.Str(), + "DayPay": fields.Str(), + "Domain": fields.Str(), + "DomainSrc": fields.Str(), + "DynamicPay": fields.Str(), + "EngineRoom": fields.Str(required=False, load_from="EngineRoom"), + "LineType": fields.Str(required=False, load_from="LineType"), + "MonthPay": fields.Str(), + "NapType": fields.Int(required=False, load_from="NapType"), + "YearPay": fields.Str(), + } diff --git a/ucloud/services/ubill/__init__.py b/ucloud/services/ubill/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/ubill/client.py b/ucloud/services/ubill/client.py new file mode 100644 index 00000000..c47b2d53 --- /dev/null +++ b/ucloud/services/ubill/client.py @@ -0,0 +1,248 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.ubill.schemas import apis + + +class UBillClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UBillClient, self).__init__(config, transport, middleware, logger) + + def create_renew(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """CreateRenew - 创建单个续费订单 + + **Request** + + - **Quantity** (int) - (Required) 续费周期数[1~10],按月计费资源可传值为0,表示续费到月底 + - **ResourceId** (str) - (Required) 需要续费资源ID + + **Response** + + - **OrderNo** (str) - 订单号 + + """ + # build request + d = {} + req and d.update(req) + d = apis.CreateRenewRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateRenew", d, **kwargs) + return apis.CreateRenewResponseSchema().loads(resp) + + def get_balance(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """GetBalance - 获取账户余额 + + **Request** + + + **Response** + + - **AccountInfo** (dict) - 见 **AccountInfo** 模型定义 + + **Response Model** + + **AccountInfo** + - **Amount** (str) - 账户余额 + - **AmountAvailable** (str) - 账户可用余额 + - **AmountCredit** (str) - 信用账户余额 + - **AmountFree** (str) - 赠送账户余额 + - **AmountFreeze** (str) - 冻结账户金额 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.GetBalanceRequestSchema().dumps(d) + + resp = self.invoke("GetBalance", d, **kwargs) + return apis.GetBalanceResponseSchema().loads(resp) + + def get_bill_data_file_url( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetBillDataFileUrl - 生成账单数据文件下载的 url,包含三类文件,1. 已支付总览账单(支持CSV和PDF,从2023年03月开始支持PDF);2. 未支付总览文件(支持CSV,只有当月账期可以查看);3 账单详情文件(支持CSV)。 备注:文件生成有延迟,若返回值 IsValid=‘no’,需要使用者发起重试。 + + **Request** + + - **BillType** (int) - (Required) 账单类型,枚举值:\\ > 0: 账单总览报表; \\ > 1: 账单明细报表 + - **BillingCycle** (str) - (Required) 账期: YYYY-MM格式的字符串,例如 ”2021-08“ + - **BillPeriod** (int) - 账期: 时间戳格式,已弃用,请使用BillingCycle + - **Format** (str) - 文件格式,枚举值:\\ > ”csv“: csv格式;\\ > ”pdf“: pdf格式(已支付总览文件 从2023年03月开始支持PDF) + - **PaidType** (int) - 账单支付状态, (获取账单明细报表,不需要填写该参数),枚举值:\\ > 0: 0待支付总览账单(只支持当前月份的账期);\\ > 1: 已支付账单总览 + - **RequireVersion** (str) - 账单语言版本,枚举值:\\ > ”“: 默认中文;\\ > ”EN“: 英文版本 + - **Version** (str) - 文件版本,固定值"v1"。 + + **Response** + + - **FileUrl** (str) - 交易账单文件下载URL + - **IsValid** (str) - 是否有对应数据文件。(该参数返回no,表示文件正在生成中,需要用户发起重试获取。 + + """ + # build request + d = {} + req and d.update(req) + d = apis.GetBillDataFileUrlRequestSchema().dumps(d) + + resp = self.invoke("GetBillDataFileUrl", d, **kwargs) + return apis.GetBillDataFileUrlResponseSchema().loads(resp) + + def list_u_bill_detail( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUBillDetail - 获取某个账期内的所有消费。 + + **Request** + + - **BillingCycle** (str) - (Required) 账期,YYYY-MM,比如2021-08,只支持2018-05之后的查询 + - **ChargeType** (str) - 计费方式 (筛选项, 默认全部)。枚举值:\\ > Year:按年\\ > Month:按月 \\ > Day:按天 \\ > Dynamic:按时 \\ > Used:按量 \\ > Donate:赠送 \\ > Trial:试用 \\ > Post:后付费 \\ > Spot:抢占式 + - **Limit** (int) - 每页数量,默认值25,最大值:100。 + - **Offset** (int) - 数据偏移量 (默认0) + - **OrderType** (str) - 订单类型 (筛选项, 默认全部) 。枚举值:\\ > OT_BUY:新购 \\ > OT_RENEW:续费 \\ > OT_UPGRADE:升级 \\ > OT_DOWNGRADE:降级 \\ > OT_SUSPEND:结算 \\ > OT_ADDITIONAL:补单 \\ > OT_REFUND:删除 \\ > OT_POSTPAID_RENEW:过期 \\ > OT_POSTPAID_PAYMENT:后付费 \\ > OT_RECOVER:删除恢复 + - **PaidState** (int) - 支付状态 (筛选项, 1:仅显示未支付订单; 2:仅显示已支付订单; 0:两者都显示) 当前月份 传递1或者0,会返回历史所有未支付账单;历史月份不支持查询未支付,请勿传递1 + - **ProjectName** (str) - 项目名称 (筛选项, 默认全部) + - **ResourceIds** (list) - 资源ID(筛选项, 默认全部) 支持多筛选,多筛选请在请求参数中添加多个字段例ResourceIds.0: uhost-bzgf1gh5,ResourceIds.1: uhost-gu1xpspa, + - **ResourceTypes** (list) - 产品类型 (筛选项, 默认全部),支持多筛选,多筛选请在请求参数中添加多个字段。枚举值:\\ > uhost:云主机 \\ > udisk:普通云硬盘 \\ > udisk_ssd:SSD云硬盘 \\ > rssd:RSSD云硬盘 \\ > snapshot:云快照 \\ > uimage:云主机镜像 \\ > isolation_group:硬件隔离组 \\ > udisk_system_disk:云硬盘系统盘 \\ > phost:裸金属云主机 \\ > udset:资源池 \\ > udhost:专区宿主 \\ > rack:托管云机位 \\ > hybrid_rack:托管云机柜 \\ > hybrid_machine:托管云物理机 \\ > userver:金翼物理机 \\ > hybrid_host:托管云物理云主机 \\ > hybrid_vip_service:启明VIP服务 \\ > hybrid_public_net:外网-IP段 \\ > hybrid_public_bw:外网-带宽 \\ > rack_bw:网络 \\ > ulink:内网-云互通 \\ > hybrid_others:耗材 \\ > uconnect:专线 \\ > hybrid_switch:交换机 \\ > hybrid_port:交换机端口 \\ > shared_bandwidth:共享带宽 \\ > eip:弹性IP \\ > traffic:流量 \\ > bandwidth:带宽包 \\ > vpn:VPN网关 \\ > firewall:防火墙 \\ > vip:内网IP \\ > UAnycastClean:Anycast全球清洗防护包 \\ > AnycastEIP:AnycastEIP \\ > ulb:负载均衡 \\ > vlb:专享型ULB \\ > ssl:证书管理 \\ > subnet:子网 \\ > natgw:NAT网关 \\ > vpc:虚拟私有网络 \\ > acl:访问控制列表 \\ > udpn:高速通道 \\ > vpngw:VPN网关 \\ > remotevpngw:客户网关 \\ > vpn_tunnel:隧道 \\ > udee:域名要素引擎 \\ > ugaa:全球动态加速 \\ > upath:线路管理 \\ > Roma:罗马 \\ > ufs:文件存储 \\ > ufile:对象存储 \\ > udataark:数据方舟 \\ > uarchive:归档存储 \\ > ucdn:云分发 \\ > uodn:开放式分发节点 \\ > uodn2:边缘分发节点 \\ > umem:云内存存储 \\ > umemcache:单机版memcache \\ > uredis:主备版redis \\ > udb:云数据库 \\ > mongodb:MongoDB \\ > sqlserver:SQLServer \\ > postgresql:PostgreSQL \\ > utsdb:时序数据库 \\ > uddb:分布式数据库 \\ > tidb:分布式NewSQL数据库 \\ > Hadoop:托管Hadoop集群 \\ > HadoopHost:托管Hadoop集群节点 \\ > udw:云数据仓库 \\ > ues:弹性搜索 \\ > uscheduler:调度系统 \\ > ukafka:Kafka消息队列 \\ > usql_end:数据湖分析 \\ > UFlink:Flink实时计算 \\ > ukafka_host:Kafka消息队列节点 \\ > UKafkaSinker:Kafka连接器 \\ > message_queue:消息队列 \\ > UAPIGateway:API网关 \\ > ucs:通用计算 \\ > docker_uhost:节点 \\ > uiot:UIoT-Core \\ > uai_service:AI在线服务 \\ > uai_training:AI训练服务 \\ > UAI-Censor:AI内容审核 \\ > uvideo:云点播 \\ > ulive:云直播 \\ > umedia:媒体工厂 \\ > VideoSDK:视频工具 \\ > UKMS:密钥管理服务 \\ > SDefense:高防 \\ > ADS-HD:华东高防 \\ > ADS-abroad:海外高防 \\ > uclean:清洗 \\ > waf:WEB应用防火墙 \\ > uws:WEB漏洞扫描 \\ > uhids:主机入侵检测 \\ > uencrypt:加密服务 \\ > fortress_host:堡垒机 \\ > db_audit:数据库审计 \\ > usa:云安全中心 \\ > udbcp:等保咨询 \\ > usms:短信包 \\ > udnr:域名注册服务 \\ > hegui:备案 \\ > ussl:SSL证书唯一标识 \\ > umarket:应用市场 \\ > urtc:实时音视频 \\ > umr:MapReduce \\ > utss:UCloud技术支持服务 \\ > store_box:店铺盒子 \\ > ukv:容量型KV存储 \\ > ucloudperation:云合作 \\ > umon_network:网络质量监控 \\ > uaccess_box:UBox \\ > UOPS:运维服务 \\ > TeuProduct:非标-企业 \\ > TeuHumanResource:服务-企业 \\ > UBI:数据可视化分析 \\ > First_tier_Bandwidth:ODN一线城市带宽 \\ > Second_tier_Bandwidth:ODN二线城市带宽 \\ > ODN-EDU-BW:ODN教育网带宽 \\ > uodn_docker_resource:ODN容器 \\ > UAI-Solution:AI解决方案 \\ > USNAPSHOT:磁盘快照服务 \\ > ServiceFee:一次性收费 \\ > UCloudAntiDDoS-NorthChinaBGP:高防-华北BGP \\ > Cube:容器实例 \\ > UHybrid-EBN:混合云-企业网 \\ > UHybrid-VBS:混合云-虚拟边界交换机 \\ > UHybrid-EBNBandwidth:混合云-企业网带宽 \\ > UCGS:云游戏 \\ > USDP:智能大数据平台 \\ > UIoT-Stack:物联网平台系统套件 \\ > uiotedgebox:物联网边缘盒子 \\ > UClickhouse:云数据库仓库UClickHouse \\ > UDNS:云解析 \\ > UFS-SMB:SMB文件系统 \\ > EPC:云极高性能计算节点 \\ > EPCCluster:高性能计算集群 \\ > Instance:海外站云主机 \\ > UGA3:全球动态加速 \\ > uhybrid_xzone:混合云-金翼XZone \\ > udts:数据传输服务 \\ > uk8s_service:容器云 \\ > UIW:无间盾反欺诈系统 \\ > ISMS:视频短信 \\ > PLiveUPRO:Polyv云直播U享版 \\ > UNVS:号码认证 \\ > UVMS:语音消息服务 \\ > UGame:云游戏 \\ > UHive:UHive \\ > UDoris:UDoris \\ > USLK:短链工具 \\ > UPCA:UPCA \\ > URCM:富信消息 \\ > HTTPDNS:HTTP DNS \\ > UAdsSp:DDOS防御服务包 \\ > UPhone-eip:云手机(eip) \\ > UPhone-share-bandwidth:云手机(共享带宽) \\ > UCloud Phone Server:云手机服务器 \\ > UMongoDBMember:云数据库 MongoDB UDB 集群内节点成员 \\ > UPhone-NetworkResource:云手机(网络资源) \\ > UOL:海外直播加速 \\ > UDBProxy:云数据库读写分离中间件 \\ > UDBProxyMember:云数据库读写分离中间件集群内成员 \\ > UPgSQL:UDB For PgSQL \\ > UMongoDB:UMongoDB \\ > UPresto:UPresto \\ > UDBC:UDBC \\ > CAAS:CAAS \\ > UPhone:云手机 \\ > NVAS:混合云-网络增值服务 \\ > UNPP:号码隐私保护 \\ > UNPP:企业名片 \\ > UMongoDBVirtualMember:云数据库 MongoDB UDB集群内虚拟节点 \\ > CF-antiddos:CF高防服务 \\ > UAM:优信 \\ > UAIModelFactory:人工智能模型工厂 \\ > UGNBW:云联网带宽包 \\ > UDAS:数据库自治服务 \\ > URM:资源迁移 \\ > UDTS-DI:数据传输服务-数据集成 \\ > ALB:应用型负载均衡 \\ > UTrafficPack:共享流量包 \\ > ULHost:轻量应用云主机 \\ > UWSCBandwith:UWAN智联-接入带宽包 \\ > MySQLBackup:MySQL 备份服务 \\ > SkyMirror:天镜 \\ > UCustomImage:自定义镜像 \\ > UDTS-DIS:数据传输服务-数据集成子任务 \\ > utm:流量镜像 \\ > NLB:网络型负载均衡 \\ > ALS:ALB监听器 \\ > NLS:NLB监听器 \\ > ARS:ALB服务节点 \\ > NRS:NLB服务节点 \\ > UAIM:卡片消息 \\ > UWSC:UWAN智联 \\ > LBIP:负载均衡内网IP \\ > ULogstash:Logstash服务 \\ > UWCE:UWAN智联-CE客户网关 \\ > UWSC-Tunnel:UWAN智联-VPN隧道 \\ > UNDT:网络拨测 \\ > UHBW:托管带宽包 \\ > UHNet:托管网络 \\ > UH-VRrouter:托管虚拟路由器 \\ > XC:楼内线 \\ > UModelVerse:模型服务平台 \\ > ULogstash-Node:Logstash Node服务 \\ > CloudWatch:云监控 \\ > UGN:云联网 \\ > epsrv:终端节点服务 \\ > ep:终端节点 \\ > uwcpe:CPE智能网关 \\ > uwcpetunnel:CPE隧道 \\ > USCS:安全定制服务 \\ > UAAA:应用仓库加速 \\ > ULogService:日志服务 \\ > UXZONE-GPU:金翼GPU \\ > UReach:优睿达 \\ > UPLVR:专线虚拟路由器 \\ > maxir:云数据仓库MAXIR \\ > maxirvector:云数据仓库MAXIR向量版 \\ > UPFS:文件存储UPFS \\ > UMarketplace:云市场 \\ > IPRP:IP资源池 \\ > ExclusiveHosts:包销宿主机 \\ > RedisReplicate:Redis 从库 \\ > SecurityCenter:云安全中心 \\ > PrivateLink:私有链接 \\ > UMongoDBBackup:MongoDB备份服务 \\ > TiDBCluster:分布式数据库 TiDB Cluster \\ > MAXIRDPS:MAXIR DPS \\ > Label:标签 \\ > NVAS:混合云网络增值服务 \\ > UIBUDS:互联网事业部开发服务 \\ > KafkaGroup:Kafka消费组 \\ > RLM:实时无损监控告警 \\ > USG:安全组 \\ > CF-antiddos:CF高防服务 \\ > UClickhouseNode:云数据仓库UClickhouse节点 \\ > HPCExpress:盘柜直达服务 \\ > UDI:数据智能 \\ > UMountPoint:文件系统挂载点 \\ > UPrometheus:托管Prometheus服务 \\ > AnycastCleanPromotion:全球清洗促销 \\ > USMC:服务器迁移中心 \\ > UK8SPod:UK8SPod 类型资源 \\ > UAS:弹性伸缩 \\ > Manul:统一存储 \\ > UDas:分部式应用服务 \\ > USecLog:安全日志审计 \\ > UKafkaSinkerNode:Kafka连接器节点 \\ > IPv6Address:IPv6地址 \\ > UFlink-Node:Flink实时计算节点 \\ > UContract:电子合同 \\ > NAT64:IPv6转换 \\ > OBJ_TYPE_UDDBAC:UDDB分析节点 \\ > OBJ_TYPE_SYS_UDISK_SSD:SSD云硬盘系统盘 \\ > utoken:令牌服务 \\ > UATP:API测试平台 \\ > udb_region:跨可用区高可用数据库 \\ > compshareImage:算力镜像 \\ > commImage:算力社区镜像 \\ > MAXIR AI:知识洞察 \\ > UCNest:算力云巢 \\ > IPV6 Gateway:IPV6公网网关 \\ > UCNest ExIP:算力云巢外网IP \\ > IPV6 Address:IPV6地址 \\ > UDBProxy RoGroup for MySQL:数据库代理只读组 \\ > SSD Essential:经济型SSD云盘 \\ > RSSD Essential:经济型RSSD云盘 \\ > RocketMQ Message Queue Node:消息队列节点 \\ > Runc Instance:Runc 实例 \\ > Runc Image:Runc 镜像 \\ > UCDC:专属云平台服务 \\ > Other:其他 + - **ShowZero** (int) - 是否显示0元订单 (0 不显示, 1 显示, 默认0) + - **UserEmail** (str) - 用户邮箱,可以根据用户邮箱来进行筛选 + + **Response** + + - **Items** (list) - 见 **BillDetailItem** 模型定义 + - **TotalCount** (int) - 账单明细总长度 + + **Response Model** + + **ItemDetail** + - **ProductName** (str) - 产品小类名称 + - **Value** (str) - 产品小类规格 + + + **ResourceExtendInfo** + - **KeyId** (str) - 资源标识健 + - **Value** (str) - 资源标识值 + + + **BillDetailItem** + - **Admin** (int) - 是否为主账号。枚举值:\\ > 0:子账号 \\ > 1:主账号 + - **Amount** (str) - 订单总金额 + - **AmountCoupon** (str) - 代金券抵扣 + - **AmountFree** (str) - 赠送金额抵扣 + - **AmountReal** (str) - 现金账户支付 + - **AzGroupCName** (str) - 可用区 + - **BusinessGroup** (str) - 业务组 + - **ChargeType** (str) - 计费方式 (筛选项, 默认全部)。枚举值:\\ > Year:按年\\ > Month:按月 \\ > Day:按天 \\ > Dynamic:按时 \\ > Used:按量 \\ > Donate:赠送 \\ > Trial:试用 \\ > Post:后付费 \\ > Spot:抢占式 + - **CreateTime** (int) - 创建时间(时间戳) + - **EndTime** (int) - 结束时间(时间戳) + - **ItemDetails** (list) - 见 **ItemDetail** 模型定义 + - **OrderNo** (str) - 订单号 + - **OrderType** (str) - 订单类型 (筛选项, 默认全部) 。枚举值:\\ > OT_BUY:新购 \\ > OT_RENEW:续费 \\ > OT_UPGRADE:升级 \\ > OT_DOWNGRADE:降级 \\ > OT_SUSPEND:结算 \\ > OT_ADDITIONAL:补单 \\ > OT_REFUND:删除 \\ > OT_POSTPAID_RENEW:过期 \\ > OT_POSTPAID_PAYMENT:后付费 \\ > OT_RECOVER:删除恢复 + - **ProjectId** (str) - 项目id + - **ProjectName** (str) - 项目名称 + - **ResourceExtendInfo** (list) - 见 **ResourceExtendInfo** 模型定义 + - **ResourceId** (str) - 资源ID + - **ResourceLabel** (dict) - 资源标签。字符串键值对的map:{"cs_label": "cs_label_value"} + - **ResourceType** (str) - 产品类型 (筛选项, 默认全部),支持多筛选,多筛选请在请求参数中添加多个字段。枚举值:\\ > uhost:云主机 \\ > udisk:普通云硬盘 \\ > udisk_ssd:SSD云硬盘 \\ > rssd:RSSD云硬盘 \\ > snapshot:云快照 \\ > uimage:云主机镜像 \\ > isolation_group:硬件隔离组 \\ > udisk_system_disk:云硬盘系统盘 \\ > phost:裸金属云主机 \\ > udset:资源池 \\ > udhost:专区宿主 \\ > rack:托管云机位 \\ > hybrid_rack:托管云机柜 \\ > hybrid_machine:托管云物理机 \\ > userver:金翼物理机 \\ > hybrid_host:托管云物理云主机 \\ > hybrid_vip_service:启明VIP服务 \\ > hybrid_public_net:外网-IP段 \\ > hybrid_public_bw:外网-带宽 \\ > rack_bw:网络 \\ > ulink:内网-云互通 \\ > hybrid_others:耗材 \\ > uconnect:专线 \\ > hybrid_switch:交换机 \\ > hybrid_port:交换机端口 \\ > shared_bandwidth:共享带宽 \\ > eip:弹性IP \\ > traffic:流量 \\ > bandwidth:带宽包 \\ > vpn:VPN网关 \\ > firewall:防火墙 \\ > vip:内网IP \\ > UAnycastClean:Anycast全球清洗防护包 \\ > AnycastEIP:AnycastEIP \\ > ulb:负载均衡 \\ > vlb:专享型ULB \\ > ssl:证书管理 \\ > subnet:子网 \\ > natgw:NAT网关 \\ > vpc:虚拟私有网络 \\ > acl:访问控制列表 \\ > udpn:高速通道 \\ > vpngw:VPN网关 \\ > remotevpngw:客户网关 \\ > vpn_tunnel:隧道 \\ > udee:域名要素引擎 \\ > ugaa:全球动态加速 \\ > upath:线路管理 \\ > Roma:罗马 \\ > ufs:文件存储 \\ > ufile:对象存储 \\ > udataark:数据方舟 \\ > uarchive:归档存储 \\ > ucdn:云分发 \\ > uodn:开放式分发节点 \\ > uodn2:边缘分发节点 \\ > umem:云内存存储 \\ > umemcache:单机版memcache \\ > uredis:主备版redis \\ > udb:云数据库 \\ > mongodb:MongoDB \\ > sqlserver:SQLServer \\ > postgresql:PostgreSQL \\ > utsdb:时序数据库 \\ > uddb:分布式数据库 \\ > tidb:分布式NewSQL数据库 \\ > Hadoop:托管Hadoop集群 \\ > HadoopHost:托管Hadoop集群节点 \\ > udw:云数据仓库 \\ > ues:弹性搜索 \\ > uscheduler:调度系统 \\ > ukafka:Kafka消息队列 \\ > usql_end:数据湖分析 \\ > UFlink:Flink实时计算 \\ > ukafka_host:Kafka消息队列节点 \\ > UKafkaSinker:Kafka连接器 \\ > message_queue:消息队列 \\ > UAPIGateway:API网关 \\ > ucs:通用计算 \\ > docker_uhost:节点 \\ > uiot:UIoT-Core \\ > uai_service:AI在线服务 \\ > uai_training:AI训练服务 \\ > UAI-Censor:AI内容审核 \\ > uvideo:云点播 \\ > ulive:云直播 \\ > umedia:媒体工厂 \\ > VideoSDK:视频工具 \\ > UKMS:密钥管理服务 \\ > SDefense:高防 \\ > ADS-HD:华东高防 \\ > ADS-abroad:海外高防 \\ > uclean:清洗 \\ > waf:WEB应用防火墙 \\ > uws:WEB漏洞扫描 \\ > uhids:主机入侵检测 \\ > uencrypt:加密服务 \\ > fortress_host:堡垒机 \\ > db_audit:数据库审计 \\ > usa:云安全中心 \\ > udbcp:等保咨询 \\ > usms:短信包 \\ > udnr:域名注册服务 \\ > hegui:备案 \\ > ussl:SSL证书唯一标识 \\ > umarket:应用市场 \\ > urtc:实时音视频 \\ > umr:MapReduce \\ > utss:UCloud技术支持服务 \\ > store_box:店铺盒子 \\ > ukv:容量型KV存储 \\ > ucloudperation:云合作 \\ > umon_network:网络质量监控 \\ > uaccess_box:UBox \\ > UOPS:运维服务 \\ > TeuProduct:非标-企业 \\ > TeuHumanResource:服务-企业 \\ > UBI:数据可视化分析 \\ > First_tier_Bandwidth:ODN一线城市带宽 \\ > Second_tier_Bandwidth:ODN二线城市带宽 \\ > ODN-EDU-BW:ODN教育网带宽 \\ > uodn_docker_resource:ODN容器 \\ > UAI-Solution:AI解决方案 \\ > USNAPSHOT:磁盘快照服务 \\ > ServiceFee:一次性收费 \\ > UCloudAntiDDoS-NorthChinaBGP:高防-华北BGP \\ > Cube:容器实例 \\ > UHybrid-EBN:混合云-企业网 \\ > UHybrid-VBS:混合云-虚拟边界交换机 \\ > UHybrid-EBNBandwidth:混合云-企业网带宽 \\ > UCGS:云游戏 \\ > USDP:智能大数据平台 \\ > UIoT-Stack:物联网平台系统套件 \\ > uiotedgebox:物联网边缘盒子 \\ > UClickhouse:云数据库仓库UClickHouse \\ > UDNS:云解析 \\ > UFS-SMB:SMB文件系统 \\ > EPC:云极高性能计算节点 \\ > EPCCluster:高性能计算集群 \\ > Instance:海外站云主机 \\ > UGA3:全球动态加速 \\ > uhybrid_xzone:混合云-金翼XZone \\ > udts:数据传输服务 \\ > uk8s_service:容器云 \\ > UIW:无间盾反欺诈系统 \\ > ISMS:视频短信 \\ > PLiveUPRO:Polyv云直播U享版 \\ > UNVS:号码认证 \\ > UVMS:语音消息服务 \\ > UGame:云游戏 \\ > UHive:UHive \\ > UDoris:UDoris \\ > USLK:短链工具 \\ > UPCA:UPCA \\ > URCM:富信消息 \\ > HTTPDNS:HTTP DNS \\ > UAdsSp:DDOS防御服务包 \\ > UPhone-eip:云手机(eip) \\ > UPhone-share-bandwidth:云手机(共享带宽) \\ > UCloud Phone Server:云手机服务器 \\ > UMongoDBMember:云数据库 MongoDB UDB 集群内节点成员 \\ > UPhone-NetworkResource:云手机(网络资源) \\ > UOL:海外直播加速 \\ > UDBProxy:云数据库读写分离中间件 \\ > UDBProxyMember:云数据库读写分离中间件集群内成员 \\ > UPgSQL:UDB For PgSQL \\ > UMongoDB:UMongoDB \\ > UPresto:UPresto \\ > UDBC:UDBC \\ > CAAS:CAAS \\ > UPhone:云手机 \\ > NVAS:混合云-网络增值服务 \\ > UNPP:号码隐私保护 \\ > UNPP:企业名片 \\ > UMongoDBVirtualMember:云数据库 MongoDB UDB集群内虚拟节点 \\ > CF-antiddos:CF高防服务 \\ > UAM:优信 \\ > UAIModelFactory:人工智能模型工厂 \\ > UGNBW:云联网带宽包 \\ > UDAS:数据库自治服务 \\ > URM:资源迁移 \\ > UDTS-DI:数据传输服务-数据集成 \\ > ALB:应用型负载均衡 \\ > UTrafficPack:共享流量包 \\ > ULHost:轻量应用云主机 \\ > UWSCBandwith:UWAN智联-接入带宽包 \\ > MySQLBackup:MySQL 备份服务 \\ > SkyMirror:天镜 \\ > UCustomImage:自定义镜像 \\ > UDTS-DIS:数据传输服务-数据集成子任务 \\ > utm:流量镜像 \\ > NLB:网络型负载均衡 \\ > ALS:ALB监听器 \\ > NLS:NLB监听器 \\ > ARS:ALB服务节点 \\ > NRS:NLB服务节点 \\ > UAIM:卡片消息 \\ > UWSC:UWAN智联 \\ > LBIP:负载均衡内网IP \\ > ULogstash:Logstash服务 \\ > UWCE:UWAN智联-CE客户网关 \\ > UWSC-Tunnel:UWAN智联-VPN隧道 \\ > UNDT:网络拨测 \\ > UHBW:托管带宽包 \\ > UHNet:托管网络 \\ > UH-VRrouter:托管虚拟路由器 \\ > XC:楼内线 \\ > UModelVerse:模型服务平台 \\ > ULogstash-Node:Logstash Node服务 \\ > CloudWatch:云监控 \\ > UGN:云联网 \\ > epsrv:终端节点服务 \\ > ep:终端节点 \\ > uwcpe:CPE智能网关 \\ > uwcpetunnel:CPE隧道 \\ > USCS:安全定制服务 \\ > UAAA:应用仓库加速 \\ > ULogService:日志服务 \\ > UXZONE-GPU:金翼GPU \\ > UReach:优睿达 \\ > UPLVR:专线虚拟路由器 \\ > maxir:云数据仓库MAXIR \\ > maxirvector:云数据仓库MAXIR向量版 \\ > UPFS:文件存储UPFS \\ > UMarketplace:云市场 \\ > IPRP:IP资源池 \\ > ExclusiveHosts:包销宿主机 \\ > RedisReplicate:Redis 从库 \\ > SecurityCenter:云安全中心 \\ > PrivateLink:私有链接 \\ > UMongoDBBackup:MongoDB备份服务 \\ > TiDBCluster:分布式数据库 TiDB Cluster \\ > MAXIRDPS:MAXIR DPS \\ > Label:标签 \\ > NVAS:混合云网络增值服务 \\ > UIBUDS:互联网事业部开发服务 \\ > KafkaGroup:Kafka消费组 \\ > RLM:实时无损监控告警 \\ > USG:安全组 \\ > CF-antiddos:CF高防服务 \\ > UClickhouseNode:云数据仓库UClickhouse节点 \\ > HPCExpress:盘柜直达服务 \\ > UDI:数据智能 \\ > UMountPoint:文件系统挂载点 \\ > UPrometheus:托管Prometheus服务 \\ > AnycastCleanPromotion:全球清洗促销 \\ > USMC:服务器迁移中心 \\ > UK8SPod:UK8SPod 类型资源 \\ > UAS:弹性伸缩 \\ > Manul:统一存储 \\ > UDas:分部式应用服务 \\ > USecLog:安全日志审计 \\ > UKafkaSinkerNode:Kafka连接器节点 \\ > IPv6Address:IPv6地址 \\ > UFlink-Node:Flink实时计算节点 \\ > UContract:电子合同 \\ > NAT64:IPv6转换 \\ > OBJ_TYPE_UDDBAC:UDDB分析节点 \\ > OBJ_TYPE_SYS_UDISK_SSD:SSD云硬盘系统盘 \\ > utoken:令牌服务 \\ > UATP:API测试平台 \\ > udb_region:跨可用区高可用数据库 \\ > compshareImage:算力镜像 \\ > commImage:算力社区镜像 \\ > MAXIR AI:知识洞察 \\ > UCNest:算力云巢 \\ > IPV6 Gateway:IPV6公网网关 \\ > UCNest ExIP:算力云巢外网IP \\ > IPV6 Address:IPV6地址 \\ > UDBProxy RoGroup for MySQL:数据库代理只读组 \\ > SSD Essential:经济型SSD云盘 \\ > RSSD Essential:经济型RSSD云盘 \\ > RocketMQ Message Queue Node:消息队列节点 \\ > Runc Instance:Runc 实例 \\ > Runc Image:Runc 镜像 \\ > UCDC:专属云平台服务 \\ > Other:其他 + - **ResourceTypeCode** (int) - 产品类型代码 + - **ShowHover** (int) - 订单支付状态。枚举值:\\> 0:未支付 \\ > 1:已支付 + - **StartTime** (int) - 开始时间(时间戳) + - **UserDisplayName** (str) - 账户昵称 + - **UserEmail** (str) - 账户邮箱 + - **UserName** (str) - 账户名 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.ListUBillDetailRequestSchema().dumps(d) + + resp = self.invoke("ListUBillDetail", d, **kwargs) + return apis.ListUBillDetailResponseSchema().loads(resp) + + def list_u_bill_overview( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUBillOverview - 账单总览。可按产品/项目/用户纬度获取某个账期内账单总览信息。 + + **Request** + + - **BillingCycle** (str) - (Required) 账期,YYYY-MM格式,例如2022-02,只支持2018-05之后的查询 + - **Dimension** (str) - (Required) 账单维度, product 按产品聚合,project 按项目聚合,user 按子账号聚合 + - **HideUnpaid** (int) - 是否显示已入账账单, 1 已入账, 0 待入账 (默认0 ) + + **Response** + + - **Items** (list) - 见 **BillOverviewItem** 模型定义 + - **TotalCount** (int) - 账单总览数据总数 + - **TotalPaidAmount** (str) - 已入账订单总额(已入账时显示) + - **TotalPaidAmountReal** (str) - 现金账户扣款总额 (已入账时显示) + - **TotalUnpaidAmount** (str) - 待入账订单总额(待入账时显示) + + **Response Model** + + **BillOverviewItem** + - **Admin** (int) - 该账户是否为主账号,1 主账号,0 子账号(账单维度按子账号筛选时显示) + - **Amount** (str) - 订单总金额 + - **AmountCoupon** (str) - 代金券抵扣(已入账时显示) + - **AmountFree** (str) - 赠送金额抵扣(已入账时显示) + - **AmountReal** (str) - 现金账户支付(已入账时显示) + - **Dimension** (str) - 账单维度, product 按产品维度聚合,project 按项目维度聚合,user 按子账号维度聚合 + - **ProductCategory** (str) - 产品分类 (账单维度按产品筛选时显示) + - **ProjectName** (str) - 项目名称(账单维度按项目筛选时显示) + - **ResourceType** (str) - 产品类型 (账单维度按产品筛选时显示) + - **ResourceTypeCode** (int) - 产品类型代码(账单维度按产品筛选时显示) + - **UserDisplayName** (str) - 账户昵称(账单维度按子账号筛选时显示) + - **UserEmail** (str) - 账户邮箱(账单维度按子账号筛选时显示) + - **UserName** (str) - 账户名 (账单维度按子账号筛选时显示) + + + """ + # build request + d = {} + req and d.update(req) + d = apis.ListUBillOverviewRequestSchema().dumps(d) + + resp = self.invoke("ListUBillOverview", d, **kwargs) + return apis.ListUBillOverviewResponseSchema().loads(resp) + + def modify_auto_renew_flag( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyAutoRenewFlag - 修改资源自动续费标识 + + **Request** + + - **Flag** (str) - (Required) 开关标识(TURN_ON: 打开; TURN_OFF: 关闭) + - **ResourceId** (str) - (Required) 资源ID + + **Response** + + - **Fail** (int) - 操作失败资源数量 + - **ResultSet** (list) - 见 **ResultSet** 模型定义 + - **Success** (int) - 操作成功资源数量 + + **Response Model** + + **ResultSet** + - **Message** (str) - 错误信息描述 + - **ResourceId** (str) - 资源ID + - **RetCode** (int) - 续费结果(0:成功,失败返回错误码) + + + """ + # build request + d = {} + req and d.update(req) + d = apis.ModifyAutoRenewFlagRequestSchema().dumps(d) + + resp = self.invoke("ModifyAutoRenewFlag", d, **kwargs) + return apis.ModifyAutoRenewFlagResponseSchema().loads(resp) diff --git a/ucloud/services/ubill/schemas/__init__.py b/ucloud/services/ubill/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/ubill/schemas/apis.py b/ucloud/services/ubill/schemas/apis.py new file mode 100644 index 00000000..422952b9 --- /dev/null +++ b/ucloud/services/ubill/schemas/apis.py @@ -0,0 +1,183 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.ubill.schemas import models + +""" UBill API Schema +""" + + +""" +API: CreateRenew + +创建单个续费订单 +""" + + +class CreateRenewRequestSchema(schema.RequestSchema): + """CreateRenew - 创建单个续费订单""" + + fields = { + "Quantity": fields.Int(required=True, dump_to="Quantity"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class CreateRenewResponseSchema(schema.ResponseSchema): + """CreateRenew - 创建单个续费订单""" + + fields = { + "OrderNo": fields.Str(required=True, load_from="OrderNo"), + } + + +""" +API: GetBalance + +获取账户余额 +""" + + +class GetBalanceRequestSchema(schema.RequestSchema): + """GetBalance - 获取账户余额""" + + fields = {} + + +class GetBalanceResponseSchema(schema.ResponseSchema): + """GetBalance - 获取账户余额""" + + fields = { + "AccountInfo": models.AccountInfoSchema(), + } + + +""" +API: GetBillDataFileUrl + +生成账单数据文件下载的 url,包含三类文件,1. 已支付总览账单(支持CSV和PDF,从2023年03月开始支持PDF);2. 未支付总览文件(支持CSV,只有当月账期可以查看);3 账单详情文件(支持CSV)。 备注:文件生成有延迟,若返回值 IsValid=‘no’,需要使用者发起重试。 +""" + + +class GetBillDataFileUrlRequestSchema(schema.RequestSchema): + """GetBillDataFileUrl - 生成账单数据文件下载的 url,包含三类文件,1. 已支付总览账单(支持CSV和PDF,从2023年03月开始支持PDF);2. 未支付总览文件(支持CSV,只有当月账期可以查看);3 账单详情文件(支持CSV)。 备注:文件生成有延迟,若返回值 IsValid=‘no’,需要使用者发起重试。""" + + fields = { + "BillPeriod": fields.Int(required=False, dump_to="BillPeriod"), + "BillType": fields.Int(required=True, dump_to="BillType"), + "BillingCycle": fields.Str(required=True, dump_to="BillingCycle"), + "Format": fields.Str(required=False, dump_to="Format"), + "PaidType": fields.Int(required=False, dump_to="PaidType"), + "RequireVersion": fields.Str(required=False, dump_to="RequireVersion"), + "Version": fields.Str(required=False, dump_to="Version"), + } + + +class GetBillDataFileUrlResponseSchema(schema.ResponseSchema): + """GetBillDataFileUrl - 生成账单数据文件下载的 url,包含三类文件,1. 已支付总览账单(支持CSV和PDF,从2023年03月开始支持PDF);2. 未支付总览文件(支持CSV,只有当月账期可以查看);3 账单详情文件(支持CSV)。 备注:文件生成有延迟,若返回值 IsValid=‘no’,需要使用者发起重试。""" + + fields = { + "FileUrl": fields.Str(required=False, load_from="FileUrl"), + "IsValid": fields.Str(required=False, load_from="IsValid"), + } + + +""" +API: ListUBillDetail + +获取某个账期内的所有消费。 +""" + + +class ListUBillDetailRequestSchema(schema.RequestSchema): + """ListUBillDetail - 获取某个账期内的所有消费。""" + + fields = { + "BillingCycle": fields.Str(required=True, dump_to="BillingCycle"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "OrderType": fields.Str(required=False, dump_to="OrderType"), + "PaidState": fields.Int(required=False, dump_to="PaidState"), + "ProjectName": fields.Str(required=False, dump_to="ProjectName"), + "ResourceIds": fields.List(fields.Str()), + "ResourceTypes": fields.List(fields.Str()), + "ShowZero": fields.Int(required=False, dump_to="ShowZero"), + "UserEmail": fields.Str(required=False, dump_to="UserEmail"), + } + + +class ListUBillDetailResponseSchema(schema.ResponseSchema): + """ListUBillDetail - 获取某个账期内的所有消费。""" + + fields = { + "Items": fields.List( + models.BillDetailItemSchema(), required=True, load_from="Items" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: ListUBillOverview + +账单总览。可按产品/项目/用户纬度获取某个账期内账单总览信息。 +""" + + +class ListUBillOverviewRequestSchema(schema.RequestSchema): + """ListUBillOverview - 账单总览。可按产品/项目/用户纬度获取某个账期内账单总览信息。""" + + fields = { + "BillingCycle": fields.Str(required=True, dump_to="BillingCycle"), + "Dimension": fields.Str(required=True, dump_to="Dimension"), + "HideUnpaid": fields.Int(required=False, dump_to="HideUnpaid"), + } + + +class ListUBillOverviewResponseSchema(schema.ResponseSchema): + """ListUBillOverview - 账单总览。可按产品/项目/用户纬度获取某个账期内账单总览信息。""" + + fields = { + "Items": fields.List( + models.BillOverviewItemSchema(), required=True, load_from="Items" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + "TotalPaidAmount": fields.Str( + required=False, load_from="TotalPaidAmount" + ), + "TotalPaidAmountReal": fields.Str( + required=False, load_from="TotalPaidAmountReal" + ), + "TotalUnpaidAmount": fields.Str( + required=False, load_from="TotalUnpaidAmount" + ), + } + + +""" +API: ModifyAutoRenewFlag + +修改资源自动续费标识 +""" + + +class ModifyAutoRenewFlagRequestSchema(schema.RequestSchema): + """ModifyAutoRenewFlag - 修改资源自动续费标识""" + + fields = { + "Flag": fields.Str(required=True, dump_to="Flag"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class ModifyAutoRenewFlagResponseSchema(schema.ResponseSchema): + """ModifyAutoRenewFlag - 修改资源自动续费标识""" + + fields = { + "Fail": fields.Int(required=True, load_from="Fail"), + "ResultSet": fields.List( + models.ResultSetSchema(), required=True, load_from="ResultSet" + ), + "Success": fields.Int(required=True, load_from="Success"), + } diff --git a/ucloud/services/ubill/schemas/models.py b/ucloud/services/ubill/schemas/models.py new file mode 100644 index 00000000..cf6e0691 --- /dev/null +++ b/ucloud/services/ubill/schemas/models.py @@ -0,0 +1,107 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class AccountInfoSchema(schema.ResponseSchema): + """AccountInfo - 账户信息""" + + fields = { + "Amount": fields.Str(required=False, load_from="Amount"), + "AmountAvailable": fields.Str( + required=False, load_from="AmountAvailable" + ), + "AmountCredit": fields.Str(required=False, load_from="AmountCredit"), + "AmountFree": fields.Str(required=False, load_from="AmountFree"), + "AmountFreeze": fields.Str(required=False, load_from="AmountFreeze"), + } + + +class ItemDetailSchema(schema.ResponseSchema): + """ItemDetail - 产品配置""" + + fields = { + "ProductName": fields.Str(required=True, load_from="ProductName"), + "Value": fields.Str(required=True, load_from="Value"), + } + + +class ResourceExtendInfoSchema(schema.ResponseSchema): + """ResourceExtendInfo - 资源标识""" + + fields = { + "KeyId": fields.Str(required=True, load_from="KeyId"), + "Value": fields.Str(required=True, load_from="Value"), + } + + +class BillDetailItemSchema(schema.ResponseSchema): + """BillDetailItem - 账单详情数据""" + + fields = { + "Admin": fields.Int(required=True, load_from="Admin"), + "Amount": fields.Str(required=True, load_from="Amount"), + "AmountCoupon": fields.Str(required=True, load_from="AmountCoupon"), + "AmountFree": fields.Str(required=True, load_from="AmountFree"), + "AmountReal": fields.Str(required=True, load_from="AmountReal"), + "AzGroupCName": fields.Str(required=True, load_from="AzGroupCName"), + "BusinessGroup": fields.Str(required=True, load_from="BusinessGroup"), + "ChargeType": fields.Str(required=True, load_from="ChargeType"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "EndTime": fields.Int(required=True, load_from="EndTime"), + "ItemDetails": fields.List(ItemDetailSchema()), + "OrderNo": fields.Str(required=True, load_from="OrderNo"), + "OrderType": fields.Str(required=True, load_from="OrderType"), + "ProjectId": fields.Str(required=True, load_from="ProjectId"), + "ProjectName": fields.Str(required=True, load_from="ProjectName"), + "ResourceExtendInfo": fields.List(ResourceExtendInfoSchema()), + "ResourceId": fields.Str(required=True, load_from="ResourceId"), + "ResourceLabel": fields.Str(), + "ResourceType": fields.Str(required=True, load_from="ResourceType"), + "ResourceTypeCode": fields.Int( + required=True, load_from="ResourceTypeCode" + ), + "ShowHover": fields.Int(required=True, load_from="ShowHover"), + "StartTime": fields.Int(required=True, load_from="StartTime"), + "UserDisplayName": fields.Str( + required=True, load_from="UserDisplayName" + ), + "UserEmail": fields.Str(required=True, load_from="UserEmail"), + "UserName": fields.Str(required=True, load_from="UserName"), + } + + +class BillOverviewItemSchema(schema.ResponseSchema): + """BillOverviewItem - 账单总览数组内单个结构体数据""" + + fields = { + "Admin": fields.Int(required=False, load_from="Admin"), + "Amount": fields.Str(required=True, load_from="Amount"), + "AmountCoupon": fields.Str(required=False, load_from="AmountCoupon"), + "AmountFree": fields.Str(required=False, load_from="AmountFree"), + "AmountReal": fields.Str(required=False, load_from="AmountReal"), + "Dimension": fields.Str(required=True, load_from="Dimension"), + "ProductCategory": fields.Str( + required=False, load_from="ProductCategory" + ), + "ProjectName": fields.Str(required=False, load_from="ProjectName"), + "ResourceType": fields.Str(required=False, load_from="ResourceType"), + "ResourceTypeCode": fields.Int( + required=False, load_from="ResourceTypeCode" + ), + "UserDisplayName": fields.Str( + required=False, load_from="UserDisplayName" + ), + "UserEmail": fields.Str(required=False, load_from="UserEmail"), + "UserName": fields.Str(required=False, load_from="UserName"), + } + + +class ResultSetSchema(schema.ResponseSchema): + """ResultSet - 结果集""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + "ResourceId": fields.Str(required=False, load_from="ResourceId"), + "RetCode": fields.Int(required=False, load_from="RetCode"), + } diff --git a/ucloud/services/ucdn/client.py b/ucloud/services/ucdn/client.py index 478a93cb..c8e6788d 100644 --- a/ucloud/services/ucdn/client.py +++ b/ucloud/services/ucdn/client.py @@ -13,48 +13,62 @@ def __init__( ): super(UCDNClient, self).__init__(config, transport, middleware, logger) + def add_certificate( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AddCertificate - 添加证书 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CertName** (str) - (Required) 证书名称 + - **PrivateKey** (str) - (Required) 用户私钥 + - **UserCert** (str) - (Required) 用户证书 + - **CaCert** (str) - Ca证书,默认为空 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.AddCertificateRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AddCertificate", d, **kwargs) + return apis.AddCertificateResponseSchema().loads(resp) + def batch_describe_new_ucdn_domain( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ BatchDescribeNewUcdnDomain - 批量获取加速域名配置 + """BatchDescribeNewUcdnDomain - 批量获取加速域名配置 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **ChannelType** (str) - 渠道ucdn、ufile、uvideo - **DomainId** (list) - 域名id,创建域名时生成的资源id,默认获取账号下的所有域名信息,n为自然数 - **Limit** (int) - 返回数据长度,如果制定了Offset,则默认20,否则默认全部,非负整数 - **Offset** (int) - 数据偏移量,默认0,非负整数 - + **Response** - **Arrearage** (list) - 标识欠费的数组,数组含有下列元素值, 1=国内流量有欠费 2=国外流量有欠费 3=国内带宽有欠费 4=国外带宽有欠费 - - **ChargeType** (int) - 当前计费方式,10=流量付费 20=带宽日峰值 30=按月后付费 + - **ChargeType** (int) - 当前计费方式,10-流量付费 20-带宽日峰值 30-月95计费,31-月日均峰值, 32-月第四峰值 33-日均峰值之和 34- 日95再取平均 40-未选择计费方式 - **DomainSet** (list) - 见 **DomainInfo** 模型定义 - **LastChargeType** (int) - 表示最后一次切换的计费方式,10=流量付费 20=带宽日峰值 30=按月后付费 40=未选择计费方式 - **MaxDomainNum** (int) - 最大域名数量,默认20 - **TotalCount** (int) - 满足条件的域名个数 - **Vip** (str) - vip标示,yes-是 no-否 - - **Response Model** - - **CacheConf** - - - **CacheBehavior** (int) - 是否缓存,1为缓存,0为不缓存。为0的情况下,CacheTTL和CacheUnit强制不生效 - - **CacheTTL** (int) - 缓存时间 - - **CacheUnit** (str) - 缓存时间的单位。sec(秒),min(分钟),hour(小时),day(天) - - **Description** (str) - 缓存规则描述 - - **FollowOriginRule** (int) - 是否优先遵循源站头部缓存策略,0为不优先遵循源站,1为优先遵循源站缓存头部。默认为0 - - **HttpCodePattern** (str) - 状态码默认情况只缓存200类状态码,支持正则 - - **IgnoreQueryString** (int) - 是否忽略参数缓存(0为不忽略,1为忽略,默认为0) - - **PathPattern** (str) - 路径模式,支持正则 - **AccessConf** - - - **IpBlacklist** (str) - 多个ip用逗号隔开 + **Response Model** - **DomainInfo** - + **DomainInfo** - **AccessConf** (dict) - 见 **AccessConf** 模型定义 - **AreaCode** (str) - 查询带宽区域 cn代表国内 abroad代表海外 不填默认为全部区域 - **CacheConf** (list) - 见 **CacheConf** 模型定义 @@ -81,56 +95,153 @@ def batch_describe_new_ucdn_domain( - **TestUrl** (str) - 测试url,用于域名创建加速时的测试 - **ValidTime** (int) - 开始分配Cname时间。格式:时间戳 + + **AccessConf** + - **IpBlacklist** (str) - 多个ip用逗号隔开 + + + **CacheConf** + - **CacheBehavior** (bool) - 是否缓存,true为缓存,flase为不缓存。为flase的情况下,CacheTTL和CacheUnit强制不生效 + - **CacheTTL** (int) - 缓存时间 + - **CacheUnit** (str) - 缓存时间的单位。sec(秒),min(分钟),hour(小时),day(天)。上限1年。 + - **Description** (str) - 缓存规则描述 + - **FollowOriginRule** (bool) - 是否优先遵循源站头部缓存策略,false为不优先遵循源站,true为优先遵循源站缓存头部。默认为0 + - **HttpCodePattern** (str) - 状态码模式,非200,206状态码,多个状态码用竖线(|)分隔,该属性仅仅在状态码缓存配置列表中返回 + - **PathPattern** (str) - 路径模式,支持正则 + + """ # build request - d = {"ProjectId": self.config.project_id} + d = { + "ProjectId": self.config.project_id, + } req and d.update(req) d = apis.BatchDescribeNewUcdnDomainRequestSchema().dumps(d) resp = self.invoke("BatchDescribeNewUcdnDomain", d, **kwargs) return apis.BatchDescribeNewUcdnDomainResponseSchema().loads(resp) + def batch_refresh_new_ucdn_domain_cache( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """BatchRefreshNewUcdnDomainCache - 批量刷新缓存 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Type** (str) - (Required) 刷新类型,file代表文件刷新,dir 代表路径刷新 + - **UrlList** (str) - (Required) 待刷新URL列表,以JSON格式描述。刷新多个URL列表时,一次最多提交1000个。每个域名必须以”http://域名/”开始。目录要以”/”结尾, 如刷新目录a下所有文件,格式为:http://abc.ucloud.cn/a/;如刷新文件目录a下面所有img.png文件, 格式为http://abc.ucloud.cn/a/img.png。请正确提交需要刷新的域名 + + **Response** + + - **TaskId** (str) - 本次提交url对应的任务id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.BatchRefreshNewUcdnDomainCacheRequestSchema().dumps(d) + + resp = self.invoke("BatchRefreshNewUcdnDomainCache", d, **kwargs) + return apis.BatchRefreshNewUcdnDomainCacheResponseSchema().loads(resp) + + def control_ucdn_domain_cache_access( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ControlUcdnDomainCacheAccess - + + **Request** + + - **ProjectId** (str) - (Config) + - **Type** (str) - (Required) + - **UrlList** (list) - + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ControlUcdnDomainCacheAccessRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("ControlUcdnDomainCacheAccess", d, **kwargs) + return apis.ControlUcdnDomainCacheAccessResponseSchema().loads(resp) + + def delete_certificate( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteCertificate - 删除证书 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CertName** (str) - (Required) 证书名称 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DeleteCertificateRequestSchema().dumps(d) + + resp = self.invoke("DeleteCertificate", d, **kwargs) + return apis.DeleteCertificateResponseSchema().loads(resp) + def describe_new_ucdn_prefetch_cache_task( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeNewUcdnPrefetchCacheTask - 获取预取任务状态 + """DescribeNewUcdnPrefetchCacheTask - 获取预取任务状态 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **BeginTime** (int) - 查询的起始时间,格式为Unix Timestamp。如果有EndTime,BeginTime必须赋值 - **EndTime** (int) - 查询的结束时间,格式为Unix Timestamp。EndTime默认为当前时间,BeginTime默认为当前时间前一天时间。 + - **IsDcdn** (bool) - 是否全站加速 默认false - **Limit** (int) - 返回数据长度,默认全部,自然数 - **Offset** (int) - 数据偏移量,默认为0,自然数 - **Status** (str) - 需要获取的内容预热的状态,枚举值:success:成功;wait:等待处理;process:正在处理;failure:失败; unknow:未知,默认选择所有状态 - **TaskId** (list) - 提交任务时返回的任务ID - + **Response** - **TaskList** (list) - 见 **TaskInfo** 模型定义 - **TotalCount** (int) - 预热任务的总数 - + **Response Model** - - **UrlProgressInfo** - + + **TaskInfo** + - **CreateTime** (int) - 刷新任务创建的时间。格式为Unix Timestamp + - **Status** (str) - 刷新任务的当前状态,枚举值:success:成功;wait:排队中;process:处理中;failure:失败; unknow:未知 + - **TaskId** (str) - 提交任务时返回的任务ID + - **UrlLists** (list) - 见 **UrlProgressInfo** 模型定义 + + + **UrlProgressInfo** - **CreateTime** (int) - 刷新任务创建的时间。格式为Unix Timestamp - **FinishTime** (int) - 任务完成时间。格式为Unix Timestamp - **Progress** (int) - 刷新进度,单位% - **Status** (str) - 刷新任务的当前状态,枚举值:success:成功;wait:排队中;process:处理中;failure:失败; unknow:未知 - **Url** (str) - 刷新的单条url - **TaskInfo** - - - **CreateTime** (int) - 刷新任务创建的时间。格式为Unix Timestamp - - **Status** (str) - 刷新任务的当前状态,枚举值:success:成功;wait:排队中;process:处理中;failure:失败; unknow:未知 - - **TaskId** (str) - 提交任务时返回的任务ID - - **Type** (str) - file/dir 刷新任务会返回Type,预取任务没有 - - **UrlLists** (list) - 见 **UrlProgressInfo** 模型定义 """ # build request - d = {"ProjectId": self.config.project_id} + d = { + "ProjectId": self.config.project_id, + } req and d.update(req) d = apis.DescribeNewUcdnPrefetchCacheTaskRequestSchema().dumps(d) @@ -140,79 +251,170 @@ def describe_new_ucdn_prefetch_cache_task( def describe_new_ucdn_refresh_cache_task( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeNewUcdnRefreshCacheTask - 获取域名刷新任务状态 + """DescribeNewUcdnRefreshCacheTask - 获取域名刷新任务状态 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **BeginTime** (int) - 查询的起始时间,格式为Unix Timestamp。如果有EndTime,BeginTime必须赋值 - **EndTime** (int) - 查询的结束时间,格式为Unix Timestamp。EndTime默认为当前时间,BeginTime默认为当前时间前一天时间。 + - **IsDcdn** (bool) - 是否全站加速 默认false - **Limit** (int) - 返回数据长度,默认全部,自然数 - **Offset** (int) - 数据偏移量,默认为0,自然数 - **Status** (str) - 需要获取的内容刷新的状态,枚举值:success:成功;wait:等待处理;process:正在处理;failure:失败; unknow:未知,默认选择所有状态 - **TaskId** (list) - 提交任务时返回的任务ID - + **Response** - **TaskList** (list) - 见 **TaskInfo** 模型定义 - **TotalCount** (int) - 刷新任务的总数 - + **Response Model** - - **UrlProgressInfo** - + + **TaskInfo** + - **CreateTime** (int) - 刷新任务创建的时间。格式为Unix Timestamp + - **Status** (str) - 刷新任务的当前状态,枚举值:success:成功;wait:排队中;process:处理中;failure:失败; unknow:未知 + - **TaskId** (str) - 提交任务时返回的任务ID + - **UrlLists** (list) - 见 **UrlProgressInfo** 模型定义 + + + **UrlProgressInfo** - **CreateTime** (int) - 刷新任务创建的时间。格式为Unix Timestamp - **FinishTime** (int) - 任务完成时间。格式为Unix Timestamp - **Progress** (int) - 刷新进度,单位% - **Status** (str) - 刷新任务的当前状态,枚举值:success:成功;wait:排队中;process:处理中;failure:失败; unknow:未知 - **Url** (str) - 刷新的单条url - **TaskInfo** - - - **CreateTime** (int) - 刷新任务创建的时间。格式为Unix Timestamp - - **Status** (str) - 刷新任务的当前状态,枚举值:success:成功;wait:排队中;process:处理中;failure:失败; unknow:未知 - - **TaskId** (str) - 提交任务时返回的任务ID - - **Type** (str) - file/dir 刷新任务会返回Type,预取任务没有 - - **UrlLists** (list) - 见 **UrlProgressInfo** 模型定义 """ # build request - d = {"ProjectId": self.config.project_id} + d = { + "ProjectId": self.config.project_id, + } req and d.update(req) d = apis.DescribeNewUcdnRefreshCacheTaskRequestSchema().dumps(d) resp = self.invoke("DescribeNewUcdnRefreshCacheTask", d, **kwargs) return apis.DescribeNewUcdnRefreshCacheTaskResponseSchema().loads(resp) + def get_auth_config( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetAuthConfig - 接口获取鉴权信息(非标使用) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Domain** (str) - 希望获取的域名,不传则获取所有 + + **Response** + + - **AuthConfigs** (list) - 见 **KwaiDomainAuthConfig** 模型定义 + + **Response Model** + + **KwaiDomainAuthConfig** + - **Config** (list) - 见 **KwaiAuthConfig** 模型定义 + - **Domain** (str) - 域名 + + + **KwaiAuthConfig** + - **Keys** (list) - 见 **KwaiAuthKv** 模型定义 + - **Type** (str) - 类型 pkey / ksc / typeA + + + **KwaiAuthKv** + - **Iv** (str) - iv信息 + - **Key** (str) - key信息 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetAuthConfigRequestSchema().dumps(d) + + resp = self.invoke("GetAuthConfig", d, **kwargs) + return apis.GetAuthConfigResponseSchema().loads(resp) + + def get_certificate_v2( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetCertificateV2 - 获取证书列表(新) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CdnDomain** (str) - 根据加速域名筛选对应的证书 + - **Limit** (int) - 长度,默认为全部,非负整数 + - **Offset** (int) - 偏移,默认为0,非负整数 + + **Response** + + - **CertList** (list) - 见 **CertList** 模型定义 + - **TotalCount** (int) - 证书数量 + + **Response Model** + + **CertList** + - **BeginTime** (int) - 证书开始时间 + - **CaCert** (str) - ca证内容 + - **CertName** (str) - 证书名 + - **CommonName** (str) - 通用名 + - **DnsName** (str) - dns名称 + - **DomainCount** (int) - 已配置域名个数 + - **Domains** (list) - 已配置的域名列表 + - **EndTime** (int) - 证书获取时间 + - **UserCert** (str) - 证书内容 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetCertificateV2RequestSchema().dumps(d) + + resp = self.invoke("GetCertificateV2", d, **kwargs) + return apis.GetCertificateV2ResponseSchema().loads(resp) + def get_new_ucdn_domain_bandwidth( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetNewUcdnDomainBandwidth - 获取域名带宽数据 + """GetNewUcdnDomainBandwidth - 获取域名带宽数据 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **Type** (int) - (Required) 时间粒度(0表示按照5分钟粒度,1表示按照1小时粒度,2表示按照一天的粒度) - **Areacode** (str) - 查询带宽区域 cn代表国内 abroad代表海外 不填默认为全部区域 - **BeginTime** (int) - 查询的起始时间,格式为Unix Timestamp。如果有EndTime,BeginTime必须赋值。如没有赋值,则返回缺少参 数错误,如果没有EndTime,BeginTime也可以不赋值,EndTime默认当前时间,BeginTime 默认前一天的当前时间。 - **DomainId** (list) - 域名id,创建域名时生成的id。默认全部域名 - **EndTime** (int) - 查询的结束时间,格式为Unix Timestamp。EndTime默认为当前时间,BeginTime默认为当前时间前一天时间。 - + **Response** - **BandwidthList** (list) - 见 **BandwidthInfo** 模型定义 - - **Traffic** (str) - 从起始时间到结束时间内的所使用的CDN总流量,单位GB - + - **Traffic** (float) - 从起始时间到结束时间内的所使用的CDN总流量,单位GB + **Response Model** - - **BandwidthInfo** - - - **CdnBandwidth** (str) - 返回值返回指定时间区间内CDN的带宽峰值,单位Mbps(如果请求参数Type为0,则Value是五分钟粒度的带宽值,如果Type为1,则Value是1小时的带宽峰值,如果Type为2,则Value是一天内的带宽峰值) + + **BandwidthInfo** + - **CdnBandwidth** (float) - 返回值返回指定时间区间内CDN的带宽峰值,单位Mbps(如果请求参数Type为0,则Value是五分钟粒度的带宽值,如果Type为1,则Value是1小时的带宽峰值,如果Type为2,则Value是一天内的带宽峰值) - **Time** (int) - 带宽获取的时间点。格式:时间戳 + """ # build request - d = {"ProjectId": self.config.project_id} + d = { + "ProjectId": self.config.project_id, + } req and d.update(req) d = apis.GetNewUcdnDomainBandwidthRequestSchema().dumps(d) @@ -222,32 +424,34 @@ def get_new_ucdn_domain_bandwidth( def get_new_ucdn_domain_hit_rate( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetNewUcdnDomainHitRate - 获取域名命中率 + """GetNewUcdnDomainHitRate - 获取域名命中率 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Type** (int) - (Required) 时间粒度(0表示按照5分钟粒度,1表示按照1小时粒度,2表示按照一天的粒度) + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **Areacode** (str) - 查询带宽区域 cn代表国内 abroad代表海外,只支持国内 - **BeginTime** (int) - 查询的起始时间,格式为Unix Timestamp。如果有EndTime,BeginTime必须赋值。如没有赋值,则返回缺少参 数错误,如果没有EndTime,BeginTime也可以不赋值,EndTime默认当前时间,BeginTime 默认前一天的当前时间。 - **DomainId** (list) - 域名id,创建域名时生成的id。默认全部域名 - **EndTime** (int) - 查询的结束时间,格式为Unix Timestamp。EndTime默认为当前时间,BeginTime默认为当前时间前一天时间。 - + - **Type** (int) - 时间粒度(0表示按照5分钟粒度,1表示按照1小时粒度,2表示按照一天的粒度)默认5分钟 + **Response** - **HitRateList** (list) - 见 **HitRateInfo** 模型定义 - + **Response Model** - - **HitRateInfo** - - - **FlowHitRate** (float) - 流量命中率,单位% + + **HitRateInfo** + - **FlowHitRate** (float) - 总流量命中率,单位% - **RequestHitRate** (float) - 请求数命中率,单位% - **Time** (int) - 带宽获取的时间点。格式:时间戳 + """ # build request - d = {"ProjectId": self.config.project_id} + d = { + "ProjectId": self.config.project_id, + } req and d.update(req) d = apis.GetNewUcdnDomainHitRateRequestSchema().dumps(d) @@ -257,25 +461,24 @@ def get_new_ucdn_domain_hit_rate( def get_new_ucdn_domain_http_code( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetNewUcdnDomainHttpCode - 获取域名状态码监控 + """GetNewUcdnDomainHttpCode - 获取域名状态码监控 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **Type** (int) - (Required) 时间粒度(0表示按照5分钟粒度,1表示按照1小时粒度,2表示按照一天的粒度) - **Areacode** (str) - 查询带宽区域 cn代表国内 abroad代表海外,只支持国内 - **BeginTime** (int) - 查询的起始时间,格式为Unix Timestamp。如果有EndTime,BeginTime必须赋值。如没有赋值,则返回缺少参 数错误,如果没有EndTime,BeginTime也可以不赋值,EndTime默认当前时间,BeginTime 默认前一天的当前时间。 - **DomainId** (list) - 域名id,创建域名时生成的id。默认全部域名 - **EndTime** (int) - 查询的结束时间,格式为Unix Timestamp。EndTime默认为当前时间,BeginTime默认为当前时间前一天时间。 - + **Response** - **HttpCodeDetail** (list) - 见 **HttpCodeInfo** 模型定义 - + **Response Model** - - **HttpCodeInfo** - + + **HttpCodeInfo** - **HttpFiveXX** (int) - 5xx数量 - **HttpFourXX** (int) - 4xx数量 - **HttpOneXX** (int) - 1xx数量 @@ -283,9 +486,12 @@ def get_new_ucdn_domain_http_code( - **HttpTwoXX** (int) - 2xx数量 - **Time** (int) - 带宽获取的时间点。格式:时间戳 + """ # build request - d = {"ProjectId": self.config.project_id} + d = { + "ProjectId": self.config.project_id, + } req and d.update(req) d = apis.GetNewUcdnDomainHttpCodeRequestSchema().dumps(d) @@ -295,25 +501,24 @@ def get_new_ucdn_domain_http_code( def get_new_ucdn_domain_http_code_v2( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetNewUcdnDomainHttpCodeV2 - 获取域名详细状态码监控 + """GetNewUcdnDomainHttpCodeV2 - 获取域名详细状态码监控 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **BeginTime** (int) - (Required) 查询的起始时间,格式为Unix Timestamp。 - **EndTime** (int) - (Required) 查询的结束时间,格式为Unix Timestamp。 - **Type** (int) - (Required) 时间粒度(0表示按照5分钟粒度,1表示按照1小时粒度,2表示按照一天粒度,3表示按照一分钟粒度) - **Areacode** (str) - 查询带宽区域 cn代表国内 abroad代表海外,只支持国内 - **DomainId** (list) - 域名id,创建域名时生成的id。默认全部域名 - + **Response** - **HttpCodeV2Detail** (list) - 见 **HttpCodeV2Detail** 模型定义 - + **Response Model** - - **HttpCodeV2Detail** - + + **HttpCodeV2Detail** - **Http100** (int) - http100数量 - **Http101** (int) - http101数量 - **Http102** (int) - http102数量 @@ -371,10 +576,14 @@ def get_new_ucdn_domain_http_code_v2( - **Http509** (int) - http509数量 - **Http510** (int) - http510数量 - **Time** (int) - 时间 + - **Total** (int) - 当前分组的总状态码数 + """ # build request - d = {"ProjectId": self.config.project_id} + d = { + "ProjectId": self.config.project_id, + } req and d.update(req) d = apis.GetNewUcdnDomainHttpCodeV2RequestSchema().dumps(d) @@ -384,274 +593,1294 @@ def get_new_ucdn_domain_http_code_v2( def get_new_ucdn_domain_request_num( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetNewUcdnDomainRequestNum - 获取域名请求数 + """GetNewUcdnDomainRequestNum - 获取域名请求数 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **Type** (int) - (Required) 时间粒度(0表示按照5分钟粒度,1表示按照1小时粒度,2表示按照一天的粒度) - **Areacode** (str) - 查询区域 cn代表国内 abroad代表海外,只支持国内 - **BeginTime** (int) - 查询的起始时间,格式为Unix Timestamp。如果有EndTime,BeginTime必须赋值。如没有赋值,则返回缺少参 数错误,如果没有EndTime,BeginTime也可以不赋值,EndTime默认当前时间,BeginTime 默认前一天的当前时间。 - **DomainId** (list) - 域名id,创建域名时生成的id。默认全部域名 - **EndTime** (int) - 查询的结束时间,格式为Unix Timestamp。EndTime默认为当前时间,BeginTime默认为当前时间前一天时间。 - + **Response** - **RequestList** (list) - 见 **RequestInfo** 模型定义 - + **Response Model** - - **RequestInfo** - + + **RequestInfo** - **CdnRequest** (float) - 返回值返回指定时间区间内的cdn收到的请求次数之和 - **OriginRequest** (float) - 返回值返回指定时间区间内的cdn回源的请求次数之和 - **Time** (int) - 带宽获取的时间点。格式:时间戳 + """ # build request - d = {"ProjectId": self.config.project_id} + d = { + "ProjectId": self.config.project_id, + } req and d.update(req) d = apis.GetNewUcdnDomainRequestNumRequestSchema().dumps(d) resp = self.invoke("GetNewUcdnDomainRequestNum", d, **kwargs) return apis.GetNewUcdnDomainRequestNumResponseSchema().loads(resp) - def get_ucdn_domain_log( + def get_new_ucdn_log_client_ip_statistics( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetUcdnDomainLog - 获取加速域名原始日志 + """GetNewUcdnLogClientIpStatistics - 获取日志客户端ip统计 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **BeginTime** (int) - 查询的起始时间,格式为Unix Timestamp。如果有EndTime,BeginTime必须赋值。 - - **DomainId** (list) - 域名ID,创建加速域名时生成。默认全部域名 - - **EndTime** (int) - 查询的结束时间,格式为Unix Timestamp。EndTime默认为当前时间,BeginTime默认为当前时间前一天时间。 - - **Type** (int) - 查询粒度 0=default(没有粒度) 1=按小时 2=按天 - + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **DomainId** (str) - (Required) 域名id,创建域名时生成的id + - **BeginTime** (int) - 查询的日期,单位:Unix时间戳。只支持按天查询 + - **Limit** (str) - 返回结果数量限制,返回最多100条 + - **OrderBy** (int) - 0表示按照下载次数降序排列,1表示按流量降序排列,默认为0 + - **Type** (int) - 1表示按照1小时粒度,2表示按照一天的粒度 默认是天 + **Response** - - **LogSet** (list) - 见 **LogSetList** 模型定义 - + - **Action** (str) - 操作名称 + - **ClientIpStatisticsList** (list) - 见 **ClientIpStatisticsList** 模型定义 + - **RetCode** (int) - 返回码 + **Response Model** - - **LogSetInfo** - - - **AbroadLog** (list) - 国外日志url列表 - - **CnLog** (list) - 国内日志url列表 - - **Time** (int) - 日志时间UnixTime - **LogSetList** - - - **Domain** (str) - 域名 - - **Logs** (list) - 见 **LogSetInfo** 模型定义 + **ClientIpStatisticsList** + - **Flow** (int) - 流量单位字节 + - **FlowPercent** (float) - 流量占比 + - **IP** (str) - 客户端IP + - **RequestPercent** (float) - 请求数占比 + - **Requst** (int) - 请求数 + """ # build request - d = {"ProjectId": self.config.project_id} + d = { + "ProjectId": self.config.project_id, + } req and d.update(req) - d = apis.GetUcdnDomainLogRequestSchema().dumps(d) + d = apis.GetNewUcdnLogClientIpStatisticsRequestSchema().dumps(d) - resp = self.invoke("GetUcdnDomainLog", d, **kwargs) - return apis.GetUcdnDomainLogResponseSchema().loads(resp) + resp = self.invoke("GetNewUcdnLogClientIpStatistics", d, **kwargs) + return apis.GetNewUcdnLogClientIpStatisticsResponseSchema().loads(resp) - def get_ucdn_domain_prefetch_enable( + def get_new_ucdn_log_referer_statistics( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetUcdnDomainPrefetchEnable - 获取域名预取开启状态 + """GetNewUcdnLogRefererStatistics - 获取热点referer统计 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **DomainId** (str) - (Required) 域名ID,创建加速域名时生成。 - + - **Areacode** (str) - 查询带宽区域 cn代表国内 abroad代表海外 ;目前只支持国内 + - **BeginTime** (int) - 查询带宽的起始时间,格式:时间戳 + - **DomainId** (str) - 域名id,创建域名时生成的id + - **EndTime** (int) - 查询统计日志的结束时间,格式:时间戳。最大时间间隔30天 + - **Limit** (int) - 返回的结果数量限制,默认1000 + - **OrderBy** (int) - 0表示按流量降序排列,1表示按照下载次数降序排列,默认为0 + **Response** - - **Enable** (int) - 0表示该域名未开启预取,1表示该域名已开启预取 - + - **RefererStatistics** (list) - 见 **RefererStatistics** 模型定义 + + **Response Model** + + **RefererStatistics** + - **Date** (str) - 日期 + - **RefererList** (list) - 见 **RefererList** 模型定义 + + + **RefererList** + - **Percent** (float) - 次数占比,单位% + - **Referer** (str) - 客户端请求的referer + - **RequestTimes** (int) - 次数 + + """ # build request - d = {"ProjectId": self.config.project_id} + d = {} req and d.update(req) - d = apis.GetUcdnDomainPrefetchEnableRequestSchema().dumps(d) + d = apis.GetNewUcdnLogRefererStatisticsRequestSchema().dumps(d) - resp = self.invoke("GetUcdnDomainPrefetchEnable", d, **kwargs) - return apis.GetUcdnDomainPrefetchEnableResponseSchema().loads(resp) + resp = self.invoke("GetNewUcdnLogRefererStatistics", d, **kwargs) + return apis.GetNewUcdnLogRefererStatisticsResponseSchema().loads(resp) - def get_ucdn_domain_request_num_v2( + def get_new_ucdn_log_url_statistics( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetUcdnDomainRequestNumV2 - 获取域名请求数 + """GetNewUcdnLogUrlStatistics - 获取日志url统计 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **BeginTime** (int) - (Required) 查询的起始时间,格式为Unix Timestamp - - **EndTime** (int) - (Required) 查询的结束时间,格式为Unix Timestamp - - **Type** (int) - (Required) 时间粒度(0表示按照5分钟粒度,1表示按照1小时粒度,2表示按照一天的粒度, 3=按1分钟) - - **Areacode** (str) - 查询区域 cn代表国内 abroad代表海外,只支持国内 - - **DomainId** (list) - 域名id,创建域名时生成的id。默认全部域名 - + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **DomainId** (str) - (Required) 域名Id + - **Areacode** (str) - 查询带宽区域 cn代表国内 abroad代表海外 只支持国内 + - **BeginTime** (int) - 查询带宽的起始时间,格式:时间戳 + - **EndTime** (int) - 查询统计日志的结束时间,格式:时间戳,只能支持查询1天。可不填 + - **Limit** (int) - 返回的结果数量限制,默认1000 + - **OrderBy** (int) - 0表示按流量降序排列,1表示按照下载次数降序排列,默认为0 + **Response** - - **RequestList** (list) - 见 **RequestInfo** 模型定义 - + - **UrlStatisticsList** (list) - 见 **UrlStatistics** 模型定义 + **Response Model** - - **RequestInfo** - - - **CdnRequest** (float) - 返回值返回指定时间区间内的cdn收到的请求次数之和 - - **OriginRequest** (float) - 返回值返回指定时间区间内的cdn回源的请求次数之和 - - **Time** (int) - 带宽获取的时间点。格式:时间戳 + + **UrlStatistics** + - **Date** (str) - 日期 + - **UrlList** (list) - 见 **DownloadStatisticInfo** 模型定义 + + + **DownloadStatisticInfo** + - **DownloadTimes** (int) - 下载次数 + - **Percent** (float) - 流量占比,单位% + - **Traffic** (float) - 流量(单位为G) + - **Url** (str) - 下载链接的url + """ # build request - d = {"ProjectId": self.config.project_id} + d = { + "ProjectId": self.config.project_id, + } req and d.update(req) - d = apis.GetUcdnDomainRequestNumV2RequestSchema().dumps(d) + d = apis.GetNewUcdnLogUrlStatisticsRequestSchema().dumps(d) - resp = self.invoke("GetUcdnDomainRequestNumV2", d, **kwargs) - return apis.GetUcdnDomainRequestNumV2ResponseSchema().loads(resp) + resp = self.invoke("GetNewUcdnLogUrlStatistics", d, **kwargs) + return apis.GetNewUcdnLogUrlStatisticsResponseSchema().loads(resp) - def get_ucdn_domain_traffic( + def get_ucdn_domain_95bandwidth_v2( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetUcdnDomainTraffic - 获取加速域名流量使用信息 + """GetUcdnDomain95BandwidthV2 - 获取域名九五峰值带宽数据 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Areacode** (str) - 查询流量区域 cn代表国内 abroad代表海外,默认全部区域。 - - **BeginTime** (int) - 查询的起始时间,格式为Unix Timestamp。如果有EndTime,BeginTime必须赋值。 - - **DomainId** (list) - 域名ID,创建加速域名时生成。默认全部域名 - - **EndTime** (int) - 查询的结束时间,格式为Unix Timestamp。EndTime默认为当前时间,BeginTime默认为当前时间前一天时间。 - + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **BeginTime** (int) - (Required) 查询的起始日期,格式为Unix Timestamp + - **EndTime** (int) - (Required) 查询的结束日期,格式为Unix Timestamp + - **Areacode** (str) - 查询带宽区域 cn代表国内 abroad代表海外 不填默认为全部区域 + - **DomainId** (list) - 域名id,创建域名时生成的id。默认全部域名 + - **IsDcdn** (bool) - 是否是动态加速 默认是false + **Response** - - **TrafficSet** (list) - 见 **UcdnDomainTrafficSet** 模型定义 - - **Response Model** - - **UcdnDomainTrafficSet** - - - **Time** (int) - 流量获取的时间点,格式为Unix Timestamp - - **Value** (float) - 查询每日流量总值,单位:GB + - **CdnBandwidth** (float) - 查询期间的CDN的95带宽值,单位Mbps + - **Time** (int) - 查询时间期间的95带宽时间点 Unix时间戳 """ # build request - d = {"ProjectId": self.config.project_id} + d = { + "ProjectId": self.config.project_id, + } req and d.update(req) - d = apis.GetUcdnDomainTrafficRequestSchema().dumps(d) + d = apis.GetUcdnDomain95BandwidthV2RequestSchema().dumps(d) - resp = self.invoke("GetUcdnDomainTraffic", d, **kwargs) - return apis.GetUcdnDomainTrafficResponseSchema().loads(resp) + resp = self.invoke("GetUcdnDomain95BandwidthV2", d, **kwargs) + return apis.GetUcdnDomain95BandwidthV2ResponseSchema().loads(resp) - def get_ucdn_pass_bandwidth( + def get_ucdn_domain_bandwidth_by_ip_protocol( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetUcdnPassBandwidth - 获取回源带宽数据(cdn回客户源站部分) + """GetUcdnDomainBandwidthByIpProtocol - 获取域名带宽数据按ip协议(新) **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Type** (int) - (Required) 时间粒度(0表示按照5分钟粒度,1表示按照1小时粒度,2表示按照一天的粒度) - - **Areacode** (str) - 查询带宽区域 cn代表国内 abroad代表海外,只支持国内 + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **IpProtocol** (str) - (Required) 协议,ipv4、ipv6 + - **Type** (int) - (Required) 时间粒度(0表示按照5分钟粒度,1表示按照1小时粒度,2表示按照一天的粒度,3表示按照1分钟粒度) + - **Areacode** (str) - 查询带宽区域 cn代表国内 abroad代表海外 不填默认为全部区域 - **BeginTime** (int) - 查询的起始时间,格式为Unix Timestamp。如果有EndTime,BeginTime必须赋值。如没有赋值,则返回缺少参 数错误,如果没有EndTime,BeginTime也可以不赋值,EndTime默认当前时间,BeginTime 默认前一天的当前时间。 - **DomainId** (list) - 域名id,创建域名时生成的id。默认全部域名 - **EndTime** (int) - 查询的结束时间,格式为Unix Timestamp。EndTime默认为当前时间,BeginTime默认为当前时间前一天时间。 - + **Response** - - **BandwidthDetail** (list) - 见 **BandwidthInfoDetail** 模型定义 - + - **BandwidthTrafficList** (list) - 见 **BandwidthTrafficInfo** 模型定义 + **Response Model** - - **BandwidthInfoDetail** - - - **Bandwidth** (float) - 返回值带宽值数据。 - - **Time** (int) - 宽获取的时间点。格式:时间戳 + + **BandwidthTrafficInfo** + - **CdnBandwidth** (float) - 返回值返回指定时间区间内CDN的带宽峰值,单位Mbps(如果请求参数Type为0,则Value是五分钟粒度的带宽值,如果Type为1,则Value是1小时的带宽峰值,如果Type为2,则Value是一天内的带宽峰值) + - **Time** (int) - 带宽获取的时间点。格式:时间戳 + - **Traffic** (float) - 对应时间粒度的流量,单位字节 + """ # build request - d = {"ProjectId": self.config.project_id} + d = { + "ProjectId": self.config.project_id, + } req and d.update(req) - d = apis.GetUcdnPassBandwidthRequestSchema().dumps(d) + d = apis.GetUcdnDomainBandwidthByIpProtocolRequestSchema().dumps(d) - resp = self.invoke("GetUcdnPassBandwidth", d, **kwargs) - return apis.GetUcdnPassBandwidthResponseSchema().loads(resp) + resp = self.invoke("GetUcdnDomainBandwidthByIpProtocol", d, **kwargs) + return apis.GetUcdnDomainBandwidthByIpProtocolResponseSchema().loads( + resp + ) - def get_ucdn_traffic( + def get_ucdn_domain_bandwidth_v2( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetUcdnTraffic - 获取流量信息 + """GetUcdnDomainBandwidthV2 - 获取域名带宽数据(新) **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Areacode** (str) - 查询带宽区域 cn代表国内 abroad代表海外 不填默认为全部区域 + - **BeginTime** (int) - 查询的起始时间,格式为Unix Timestamp。如果有EndTime,BeginTime必须赋值。如没有赋值,则返回缺少参 数错误,如果没有EndTime,BeginTime也可以不赋值,EndTime默认当前时间,BeginTime 默认前一天的当前时间。 + - **DomainId** (list) - 域名id,创建域名时生成的id。默认全部域名;例(DomainId.0=ucdn-xxxxxx;DomainId.1=ucdn-xxxxxx) + - **EndTime** (int) - 查询的结束时间,格式为Unix Timestamp。EndTime默认为当前时间,BeginTime默认为当前时间前一天时间。 + - **IsDcdn** (bool) - 是否全站加速,默认false + - **Primeval** (int) - 原始带宽,不为0则获取原始带宽,默认为0 + - **Protocol** (str) - 协议,http、https、websocket、quic 不传则查所有协议的带宽,可以查多个协议,用逗号分隔 + - **Type** (int) - 时间粒度(0表示按照5分钟粒度,1表示按照1小时粒度,2表示按照一天的粒度,3表示按照1分钟粒度) + **Response** - - **TrafficSet** (list) - 见 **TrafficSet** 模型定义 - + - **BandwidthTrafficList** (list) - 见 **BandwidthTrafficInfo** 模型定义 + **Response Model** - - **TrafficSet** - - - **Areacode** (str) - 购买流量的区域, cn: 国内; abroad: 国外 - - **TrafficLeft** (str) - Areacode区域内总剩余流量, 单位GB - - **TrafficTotal** (str) - Areacode区域内总购买流量, 单位GB - - **TrafficUsed** (str) - Areacode区域内总使用流量, 单位GB + + **BandwidthTrafficInfo** + - **CdnBandwidth** (float) - 返回值返回指定时间区间内CDN的带宽峰值,单位Mbps(如果请求参数Type为0,则Value是五分钟粒度的带宽值,如果Type为1,则Value是1小时的带宽峰值,如果Type为2,则Value是一天内的带宽峰值) + - **Time** (int) - 带宽获取的时间点。格式:时间戳 + - **Traffic** (float) - 对应时间粒度的流量,单位字节 + """ # build request - d = {"ProjectId": self.config.project_id} + d = { + "ProjectId": self.config.project_id, + } req and d.update(req) - d = apis.GetUcdnTrafficRequestSchema().dumps(d) + d = apis.GetUcdnDomainBandwidthV2RequestSchema().dumps(d) - resp = self.invoke("GetUcdnTraffic", d, **kwargs) - return apis.GetUcdnTrafficResponseSchema().loads(resp) + resp = self.invoke("GetUcdnDomainBandwidthV2", d, **kwargs) + return apis.GetUcdnDomainBandwidthV2ResponseSchema().loads(resp) - def prefetch_new_ucdn_domain_cache( + def get_ucdn_domain_config( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ PrefetchNewUcdnDomainCache - 提交预取任务 + """GetUcdnDomainConfig - 批量获取加速域名配置 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **UrlList** (list) - (Required) 预热URL列表,n从自然数0开始。UrlList.n字段必须以”http://域名/”开始。目录要以”/”结尾, 如刷新目录a下所有文件,格式为:http://abc.ucloud.cn/a/;如刷新文件目录a下面img.png文件, 格式为http://abc.ucloud.cn/a/img.png。请正确提交需要刷新的域名 - + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ChannelType** (str) - 产品类型ucdn,可不填,默认为ucdn + - **Domain** (list) - 域名 + - **DomainId** (list) - 域名id,创建域名时生成的id。默认获取账号下的所有域名信息,n为自然数,从DomainId.0开始。 + - **IsDcdn** (bool) - 是否是动态加速 默认是false + - **Limit** (int) - 返回数据长度, 默认全部,非负整数 + - **Offset** (int) - 数据偏移量,默认0,非负整数 + **Response** - - **TaskId** (str) - 本次提交url对应的任务id - - """ - # build request - d = {"ProjectId": self.config.project_id} - req and d.update(req) + - **DomainList** (list) - 见 **DomainConfigInfo** 模型定义 + + **Response Model** + + **DomainConfigInfo** + - **AccessControlConf** (dict) - 见 **AccessControlConf** 模型定义 + - **AdvancedConf** (dict) - 见 **AdvancedConf** 模型定义 + - **AreaCode** (str) - 查询带宽区域 cn代表国内 abroad代表海外 all表示全部区域 + - **CacheConf** (dict) - 见 **CacheAllConfig** 模型定义 + - **CdnType** (str) - 加速域名的业务类型,web代表网站,stream代表视频 ,download 代表下载 + - **CertNameAbroad** (str) - 国外证书名称 + - **CertNameCn** (str) - 国内证书名称 + - **Cname** (str) - cdn域名。创建加速域名生成的cdn域名,用于设置CNAME记录 + - **CreateTime** (int) - 域名创建的时间。格式:时间戳 + - **Domain** (str) - 域名 + - **DomainId** (str) - 域名Id + - **HttpsStatusAbroad** (str) - 国外https状态 enableing-开启中 fail-开启失败 enable-启用 disable-未启用 + - **HttpsStatusCn** (str) - 国内https状态 enableing-开启中 fail-开启失败 enable-启用 disable-未启用 + - **OriginConf** (dict) - 见 **OriginConf** 模型定义 + - **Status** (str) - 创建的加速域名的当前的状态。check代表审核中;checkSuccess代表审核通过;checkFail代表审核失败;enable代表加速中;disable代表停止加速;delete代表删除加速;enableing代表正在开启加速;disableing代表正在停止加速中;deleteing代表删除中;deploying代表部署中 + - **Tag** (str) - 业务组:Default + - **TestUrl** (str) - 测试url。用于域名创建加速时的测试 + + + **AccessControlConf** + - **IpBlackList** (list) - ip黑名单,多个ip,可表示为:IpBlackList.0=1.1.1.1,IpBlackList.1=2.2.2.2 + - **ReferConf** (dict) - 见 **ReferConf** 模型定义 + + + **ReferConf** + - **NullRefer** (int) - ReferType为白名单时(删除),NullRefer为0代表不允许NULL refer访问,为1代表允许Null refer访问 + - **ReferList** (list) - Refer防盗链规则列表,支持正则表达式 + - **ReferType** (int) - Refer防盗链配置 0白名单,1黑名单 + + + **AdvancedConf** + - **Http2Https** (bool) - http转https回源 true是,false否 + - **HttpClientHeader** (list) - 客户端响应http头列表 + - **HttpOriginHeader** (list) - 源站http头列表 + - **QuicEnable** (bool) - 是否开启quic + - **WebSocketEnable** (bool) - 是否开启websocket + + + **CacheAllConfig** + - **CacheHost** (str) - 缓存Host,不同的域名可以配置为同一个CacheHost来实现缓存共享,默认为加速域名 + - **CacheKeyList** (list) - 见 **CacheKeyInfo** 模型定义 + - **CacheList** (list) - 见 **CacheConf** 模型定义 + - **HttpCodeCacheList** (list) - 见 **CacheConf** 模型定义 + + + **CacheKeyInfo** + - **Ignore** (bool) - 是否忽略 + - **PathPattern** (str) - 路径模式,支持正则 + - **QueryString** (str) - 自定义变量,以$符号开头,多个变量用加号(+)连接,$querystring表示所有变量 + + + **CacheConf** + - **CacheBehavior** (bool) - 是否缓存,true为缓存,flase为不缓存。为flase的情况下,CacheTTL和CacheUnit强制不生效 + - **CacheTTL** (int) - 缓存时间 + - **CacheUnit** (str) - 缓存时间的单位。sec(秒),min(分钟),hour(小时),day(天)。上限1年。 + - **Description** (str) - 缓存规则描述 + - **FollowOriginRule** (bool) - 是否优先遵循源站头部缓存策略,false为不优先遵循源站,true为优先遵循源站缓存头部。默认为0 + - **HttpCodePattern** (str) - 状态码模式,非200,206状态码,多个状态码用竖线(|)分隔,该属性仅仅在状态码缓存配置列表中返回 + - **PathPattern** (str) - 路径模式,支持正则 + + + **OriginConf** + - **BackupOriginEnable** (bool) - 1如果为false表示BackupOriginIp为空,表示没有备份源站,忽略BackupOriginIp,BackupOriginHost字段2如果为true表示BackupOriginIp.n必须至少有一个备份源站地址 + - **BackupOriginHost** (str) - 备份回源Http请求头部Host,默认是加速域名 + - **BackupOriginIpList** (list) - 备份源站ip即cdn服务器回源访问的ip地址。多个源站ip,可以这样表述,如:["1.1.1.1","2.2.2.2"] + - **OriginErrorCode** (str) - 主源响应的回源错误码(如:404|500),默认空字符串 + - **OriginErrorNum** (int) - 回主源的回源失败数,默认1 + - **OriginFollow301** (int) - 跟随301跳转 0=不跟随 1=跟随 + - **OriginHost** (str) - 回源Http请求头部Host,默认是加速域名 + - **OriginIpList** (list) - 源站ip即cdn服务器回源访问的ip地址。多个源站ip,可以这样表述,如:["1.1.1.1","2.2.2.2"] + - **OriginPort** (int) - 回源端口 + - **OriginProtocol** (str) - 源站协议http,http|https 默认http + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUcdnDomainConfigRequestSchema().dumps(d) + + resp = self.invoke("GetUcdnDomainConfig", d, **kwargs) + return apis.GetUcdnDomainConfigResponseSchema().loads(resp) + + def get_ucdn_domain_hit_rate( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUcdnDomainHitRate - 获取域名命中率 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Type** (int) - (Required) 时间粒度(0表示按照5分钟粒度,1表示按照1小时粒度,2表示按照一天的粒度,3表示按照一分钟的粒度)默认5分钟 + - **Areacode** (str) - 查询带宽区域 cn代表国内 abroad代表海外,只支持国内 + - **BeginTime** (int) - 查询的起始时间,格式为Unix Timestamp。如果有EndTime,BeginTime必须赋值。如没有赋值,则返回缺少参 数错误,如果没有EndTime,BeginTime也可以不赋值,EndTime默认当前时间,BeginTime 默认前一天的当前时间。 + - **DomainId** (list) - 域名id,创建域名时生成的id。默认全部域名 + - **EndTime** (int) - 查询的结束时间,格式为Unix Timestamp。EndTime默认为当前时间,BeginTime默认为当前时间前一天时间。 + - **HitType** (int) - 默认是0 + - **IsDcdn** (bool) - 是否全站加速,默认false + + **Response** + + - **HitRateList** (list) - 见 **HitRateInfoV2** 模型定义 + + **Response Model** + + **HitRateInfoV2** + - **FlowHitRate** (float) - 总流量命中率,单位% + - **RequestHitRate** (float) - 请求数命中率,单位% + - **Time** (int) - 带宽获取的时间点。格式:时间戳 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUcdnDomainHitRateRequestSchema().dumps(d) + + resp = self.invoke("GetUcdnDomainHitRate", d, **kwargs) + return apis.GetUcdnDomainHitRateResponseSchema().loads(resp) + + def get_ucdn_domain_http_code_v2( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUcdnDomainHttpCodeV2 - 获取域名状态码信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Type** (int) - (Required) 时间粒度(0表示按照5分钟粒度,1表示按照1小时粒度,2表示按照一天的粒度,3表示1分钟粒度) + - **Areacode** (str) - 查询带宽区域 cn代表国内 abroad代表海外,只支持国内 + - **BeginTime** (int) - 查询的起始时间,格式为Unix Timestamp。如果有EndTime,BeginTime必须赋值。如没有赋值,则返回缺少参 数错误,如果没有EndTime,BeginTime也可以不赋值,EndTime默认当前时间,BeginTime 默认前一天的当前时间。 + - **DomainId** (list) - 域名id,创建域名时生成的id。默认全部域名 + - **EndTime** (int) - 查询的结束时间,格式为Unix Timestamp。EndTime默认为当前时间,BeginTime默认为当前时间前一天时间。 + - **IsDcdn** (bool) - 是否全站加速 默认false + - **Layer** (str) - edge 表示边缘 + + **Response** + + - **HttpCodeDetail** (list) - 见 **HttpCodeInfoV2** 模型定义 + + **Response Model** + + **HttpCodeInfoV2** + - **Http1XX** (dict) - 见 **HttpCodeV2Detail** 模型定义 + - **Http2XX** (dict) - 见 **HttpCodeV2Detail** 模型定义 + - **Http3XX** (dict) - 见 **HttpCodeV2Detail** 模型定义 + - **Http4XX** (dict) - 见 **HttpCodeV2Detail** 模型定义 + - **Http5XX** (dict) - 见 **HttpCodeV2Detail** 模型定义 + - **Http6XX** (dict) - 见 **HttpCodeV2Detail** 模型定义 + - **Time** (int) - 带宽获取的时间点。格式:时间戳 + + + **HttpCodeV2Detail** + - **Http100** (int) - http100数量 + - **Http101** (int) - http101数量 + - **Http102** (int) - http102数量 + - **Http200** (int) - http200数量 + - **Http201** (int) - http201数量 + - **Http202** (int) - http202数量 + - **Http203** (int) - http203数量 + - **Http204** (int) - http204数量 + - **Http205** (int) - http205数量 + - **Http206** (int) - http206数量 + - **Http207** (int) - http207数量 + - **Http300** (int) - http300数量 + - **Http301** (int) - http301数量 + - **Http302** (int) - http302数量 + - **Http303** (int) - http303数量 + - **Http304** (int) - http304数量 + - **Http305** (int) - http305数量 + - **Http306** (int) - http306数量 + - **Http307** (int) - http307数量 + - **Http400** (int) - http400数量 + - **Http401** (int) - http401数量 + - **Http402** (int) - http402数量 + - **Http403** (int) - http403数量 + - **Http404** (int) - http404数量 + - **Http405** (int) - http405数量 + - **Http406** (int) - http406数量 + - **Http407** (int) - http407数量 + - **Http408** (int) - http408数量 + - **Http409** (int) - http409数量 + - **Http410** (int) - http410数量 + - **Http411** (int) - http411数量 + - **Http412** (int) - http412数量 + - **Http413** (int) - http413数量 + - **Http414** (int) - http414数量 + - **Http415** (int) - http415数量 + - **Http416** (int) - http416数量 + - **Http417** (int) - http417数量 + - **Http418** (int) - http418数量 + - **Http421** (int) - http421数量 + - **Http422** (int) - http422数量 + - **Http423** (int) - http423数量 + - **Http424** (int) - http424数量 + - **Http425** (int) - http425数量 + - **Http426** (int) - http426数量 + - **Http449** (int) - http449数量 + - **Http451** (int) - http451数量 + - **Http500** (int) - http500数量 + - **Http501** (int) - http501数量 + - **Http502** (int) - http502数量 + - **Http503** (int) - http503数量 + - **Http504** (int) - http504数量 + - **Http505** (int) - http505数量 + - **Http506** (int) - http506数量 + - **Http507** (int) - http507数量 + - **Http509** (int) - http509数量 + - **Http510** (int) - http510数量 + - **Time** (int) - 时间 + - **Total** (int) - 当前分组的总状态码数 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUcdnDomainHttpCodeV2RequestSchema().dumps(d) + + resp = self.invoke("GetUcdnDomainHttpCodeV2", d, **kwargs) + return apis.GetUcdnDomainHttpCodeV2ResponseSchema().loads(resp) + + def get_ucdn_domain_info_list( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUcdnDomainInfoList - 获取域名基本信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **PageIndex** (int) - 返回第几页,序号从1开始,不填默认是第1页,填0表示不用分页直接返回所有数据 + - **PageSize** (int) - 分页的大小,不填默认每页20个 + - **QueryByProject** (bool) - 是否按项目查询,true 或 false 默认为false + + **Response** + + - **DomainInfoList** (list) - 见 **DomainBaseInfo** 模型定义 + - **TotalCount** (int) - 账户下域名总个数 + + **Response Model** + + **DomainBaseInfo** + - **Domain** (str) - 域名 + - **DomainId** (str) - 域名的资源id + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUcdnDomainInfoListRequestSchema().dumps(d) + + resp = self.invoke("GetUcdnDomainInfoList", d, **kwargs) + return apis.GetUcdnDomainInfoListResponseSchema().loads(resp) + + def get_ucdn_domain_log( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUcdnDomainLog - + + **Request** + + - **ProjectId** (str) - (Config) + - **BeginTime** (int) - + - **DomainId** (list) - + - **EndTime** (int) - + - **Type** (int) - + + **Response** + + - **LogSet** (list) - 见 **LogSetList** 模型定义 + + **Response Model** + + **LogSetList** + - **Domain** (str) - + - **Logs** (list) - 见 **LogSetInfo** 模型定义 + + + **LogSetInfo** + - **AbroadLog** (list) - + - **CnLog** (list) - + - **Time** (int) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUcdnDomainLogRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("GetUcdnDomainLog", d, **kwargs) + return apis.GetUcdnDomainLogResponseSchema().loads(resp) + + def get_ucdn_domain_log_v2( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUcdnDomainLogV2 - 获取域名5分钟日志 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **BeginTime** (int) - (Required) 查询的起始时间,格式为Unix Timestamp + - **EndTime** (int) - (Required) 查询的结束时间,格式为Unix Timestamp + - **DomainId** (list) - 域名id,创建域名时生成的id。默认全部域名 + - **IsDcdn** (bool) - 是否全站加速 默认false + + **Response** + + - **DomainLogSet** (list) - 见 **DomanLogList** 模型定义 + + **Response Model** + + **DomanLogList** + - **Domain** (str) - 域名 + - **LogList** (list) - 见 **LogInfo** 模型定义 + + + **LogInfo** + - **LogTime** (int) - Unix时间戳 + - **LogUrl** (str) - 日志url地址,多个URL用分号隔开 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUcdnDomainLogV2RequestSchema().dumps(d) + + resp = self.invoke("GetUcdnDomainLogV2", d, **kwargs) + return apis.GetUcdnDomainLogV2ResponseSchema().loads(resp) + + def get_ucdn_domain_origin_http_code( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUcdnDomainOriginHttpCode - + + **Request** + + - **ProjectId** (str) - (Config) + - **Type** (int) - (Required) + - **Areacode** (str) - + - **BeginTime** (int) - + - **DomainId** (list) - + - **EndTime** (int) - + + **Response** + + - **HttpCodeDetail** (list) - 见 **HttpCodeInfo** 模型定义 + + **Response Model** + + **HttpCodeInfo** + - **HttpFiveXX** (int) - + - **HttpFourXX** (int) - + - **HttpOneXX** (int) - + - **HttpThreeXX** (int) - + - **HttpTwoXX** (int) - + - **Time** (int) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUcdnDomainOriginHttpCodeRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("GetUcdnDomainOriginHttpCode", d, **kwargs) + return apis.GetUcdnDomainOriginHttpCodeResponseSchema().loads(resp) + + def get_ucdn_domain_origin_http_code_detail( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUcdnDomainOriginHttpCodeDetail - + + **Request** + + - **ProjectId** (str) - (Config) + - **BeginTime** (int) - (Required) + - **EndTime** (int) - (Required) + - **Type** (int) - (Required) + - **Areacode** (str) - + - **DomainId** (list) - + + **Response** + + - **HttpCodeV2Detail** (list) - 见 **HttpCodeV2Detail** 模型定义 + + **Response Model** + + **HttpCodeV2Detail** + - **Http100** (int) - + - **Http101** (int) - + - **Http102** (int) - + - **Http200** (int) - + - **Http201** (int) - + - **Http202** (int) - + - **Http203** (int) - + - **Http204** (int) - + - **Http205** (int) - + - **Http206** (int) - + - **Http207** (int) - + - **Http300** (int) - + - **Http301** (int) - + - **Http302** (int) - + - **Http303** (int) - + - **Http304** (int) - + - **Http305** (int) - + - **Http306** (int) - + - **Http307** (int) - + - **Http400** (int) - + - **Http401** (int) - + - **Http402** (int) - + - **Http403** (int) - + - **Http404** (int) - + - **Http405** (int) - + - **Http406** (int) - + - **Http407** (int) - + - **Http408** (int) - + - **Http409** (int) - + - **Http410** (int) - + - **Http411** (int) - + - **Http412** (int) - + - **Http413** (int) - + - **Http414** (int) - + - **Http415** (int) - + - **Http416** (int) - + - **Http417** (int) - + - **Http418** (int) - + - **Http421** (int) - + - **Http422** (int) - + - **Http423** (int) - + - **Http424** (int) - + - **Http425** (int) - + - **Http426** (int) - + - **Http449** (int) - + - **Http451** (int) - + - **Http500** (int) - + - **Http501** (int) - + - **Http502** (int) - + - **Http503** (int) - + - **Http504** (int) - + - **Http505** (int) - + - **Http506** (int) - + - **Http507** (int) - + - **Http509** (int) - + - **Http510** (int) - + - **Time** (int) - + - **Total** (int) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUcdnDomainOriginHttpCodeDetailRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("GetUcdnDomainOriginHttpCodeDetail", d, **kwargs) + return apis.GetUcdnDomainOriginHttpCodeDetailResponseSchema().loads( + resp + ) + + def get_ucdn_domain_origin_request_num( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUcdnDomainOriginRequestNum - 获取域名回源请求数 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **BeginTime** (int) - (Required) 查询的起始时间,格式为Unix Timestamp + - **EndTime** (int) - (Required) 查询的结束时间,格式为Unix Timestamp + - **Type** (int) - (Required) 时间粒度(0表示按照5分钟粒度,1表示按照1小时粒度,2表示按照一天的粒度, 3=按1分钟) + - **Areacode** (str) - 查询区域 cn代表国内 abroad代表海外,只支持国内 + - **DomainId** (list) - 域名id,创建域名时生成的id。默认全部域名 + - **IsDcdn** (bool) - 是否全站加速 默认false + + **Response** + + - **RequestList** (list) - 见 **RequestInfoV2** 模型定义 + + **Response Model** + + **RequestInfoV2** + - **CdnRequest** (float) - 返回值返回指定时间区间内的cdn收到的请求次数之和 + - **Time** (int) - 带宽获取的时间点。格式:时间戳 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUcdnDomainOriginRequestNumRequestSchema().dumps(d) + + resp = self.invoke("GetUcdnDomainOriginRequestNum", d, **kwargs) + return apis.GetUcdnDomainOriginRequestNumResponseSchema().loads(resp) + + def get_ucdn_domain_prefetch_enable( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUcdnDomainPrefetchEnable - + + **Request** + + - **ProjectId** (str) - (Config) + - **DomainId** (str) - (Required) + + **Response** + + - **Enable** (int) - + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUcdnDomainPrefetchEnableRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("GetUcdnDomainPrefetchEnable", d, **kwargs) + return apis.GetUcdnDomainPrefetchEnableResponseSchema().loads(resp) + + def get_ucdn_domain_prefetch_refresh_state( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUcdnDomainPrefetchRefreshState - 获取域名预取刷新配额信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **DomainId** (str) - (Required) 域名ID,创建加速域名时生成。 + + **Response** + + - **PrefetchQuota** (int) - 预热配额 + - **RefreshDirQuota** (int) - 目录刷新配额 + - **RefreshFileQuota** (int) - 文件刷新配额 + - **SubmitPrefetchCount** (int) - 已提交预热个数 + - **SubmitRefreshDir** (int) - 已提交的目录刷新个数 + - **SubmitRefreshFile** (int) - 已提交的文件刷新个数 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUcdnDomainPrefetchRefreshStateRequestSchema().dumps(d) + + resp = self.invoke("GetUcdnDomainPrefetchRefreshState", d, **kwargs) + return apis.GetUcdnDomainPrefetchRefreshStateResponseSchema().loads( + resp + ) + + def get_ucdn_domain_request_num_v2( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUcdnDomainRequestNumV2 - 获取域名请求数 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **BeginTime** (int) - (Required) 查询的起始时间,格式为Unix Timestamp + - **EndTime** (int) - (Required) 查询的结束时间,格式为Unix Timestamp + - **Type** (int) - (Required) 时间粒度(0表示按照5分钟粒度,1表示按照1小时粒度,2表示按照一天的粒度, 3=按1分钟) + - **Areacode** (str) - 查询区域 cn代表国内 abroad代表海外,只支持国内 + - **DomainId** (list) - 域名id,创建域名时生成的id。默认全部域名 + + **Response** + + - **RequestList** (list) - 见 **RequestInfo** 模型定义 + + **Response Model** + + **RequestInfo** + - **CdnRequest** (float) - 返回值返回指定时间区间内的cdn收到的请求次数之和 + - **OriginRequest** (float) - 返回值返回指定时间区间内的cdn回源的请求次数之和 + - **Time** (int) - 带宽获取的时间点。格式:时间戳 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUcdnDomainRequestNumV2RequestSchema().dumps(d) + + resp = self.invoke("GetUcdnDomainRequestNumV2", d, **kwargs) + return apis.GetUcdnDomainRequestNumV2ResponseSchema().loads(resp) + + def get_ucdn_domain_request_num_v3( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUcdnDomainRequestNumV3 - 获取域名请求数 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **BeginTime** (int) - (Required) 查询的起始时间,格式为Unix Timestamp + - **EndTime** (int) - (Required) 查询的结束时间,格式为Unix Timestamp + - **Type** (int) - (Required) 时间粒度(0表示按照5分钟粒度,1表示按照1小时粒度,2表示按照一天的粒度, 3=按1分钟) + - **Areacode** (str) - 查询区域 cn代表国内 abroad代表海外,只支持国内 + - **DomainId** (list) - 域名id,创建域名时生成的id。默认全部域名 + - **IsDcdn** (bool) - 是否全站加速,默认false + - **Protocol** (str) - 协议,IsDcdn=false时,可传http、https不传则查所有协议的带宽。如果IsDcdn=true,这里可传http_dynamic、http_static、https_dynamic、https_static、quic_dynamic、quic_static、websocket 并支持同时查询多个协议用逗号隔开 + + **Response** + + - **RequestList** (list) - 见 **RequestInfoV2** 模型定义 + + **Response Model** + + **RequestInfoV2** + - **CdnRequest** (float) - 返回值返回指定时间区间内的cdn收到的请求次数之和 + - **Time** (int) - 带宽获取的时间点。格式:时间戳 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUcdnDomainRequestNumV3RequestSchema().dumps(d) + + resp = self.invoke("GetUcdnDomainRequestNumV3", d, **kwargs) + return apis.GetUcdnDomainRequestNumV3ResponseSchema().loads(resp) + + def get_ucdn_domain_traffic( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUcdnDomainTraffic - 获取加速域名流量使用信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **AccountType** (str) - 指定按项目查询,还是按整个账户查询 取值 top 表示按整个账户查询,取值org表示按项目查询 + - **Areacode** (str) - 查询流量区域 cn代表国内 abroad代表海外,默认全部区域 + - **BeginTime** (int) - 查询的起始日期,格式为Unix Timestamp。如果有EndTime,BeginTime必须赋值 + - **DomainId** (list) - 域名ID,创建加速域名时生成,n从自然数0开始。默认全部域名 + - **EndTime** (int) - 查询的结束日期,格式为Unix Timestamp。EndTime默认为当前时间,BeginTime默认为当前时间前一天 + + **Response** + + - **TrafficSet** (list) - 见 **UcdnDomainTrafficSet** 模型定义 + + **Response Model** + + **UcdnDomainTrafficSet** + - **Time** (int) - 流量获取的时间点,格式为Unix Timestamp + - **Value** (float) - 查询每日流量总值,单位:GB + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUcdnDomainTrafficRequestSchema().dumps(d) + + resp = self.invoke("GetUcdnDomainTraffic", d, **kwargs) + return apis.GetUcdnDomainTrafficResponseSchema().loads(resp) + + def get_ucdn_pass_bandwidth( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUcdnPassBandwidth - 获取回源带宽数据(cdn回客户源站部分) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Type** (int) - (Required) 时间粒度(0表示按照5分钟粒度,1表示按照1小时粒度,2表示按照一天的粒度) + - **Areacode** (str) - 查询带宽区域 cn代表国内 abroad代表海外,只支持国内 + - **BeginTime** (int) - 查询的起始时间,格式为Unix Timestamp。如果有EndTime,BeginTime必须赋值。如没有赋值,则返回缺少参 数错误,如果没有EndTime,BeginTime也可以不赋值,EndTime默认当前时间,BeginTime 默认前一天的当前时间。 + - **DomainId** (list) - 域名id,创建域名时生成的id。默认全部域名 + - **EndTime** (int) - 查询的结束时间,格式为Unix Timestamp。EndTime默认为当前时间,BeginTime默认为当前时间前一天时间。 + + **Response** + + - **BandwidthDetail** (list) - 见 **BandwidthInfoDetail** 模型定义 + + **Response Model** + + **BandwidthInfoDetail** + - **Bandwidth** (float) - 返回值带宽值数据。 + - **Time** (int) - 宽获取的时间点。格式:时间戳 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUcdnPassBandwidthRequestSchema().dumps(d) + + resp = self.invoke("GetUcdnPassBandwidth", d, **kwargs) + return apis.GetUcdnPassBandwidthResponseSchema().loads(resp) + + def get_ucdn_pass_bandwidth_v2( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUcdnPassBandwidthV2 - 获取回源带宽数据(cdn回客户源站部分) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Type** (int) - (Required) 时间粒度(0表示按照5分钟粒度,1表示按照1小时粒度,2表示按照一天的粒度,3表示按照1分钟粒度) + - **Areacode** (str) - 查询带宽区域 cn代表国内 abroad代表海外,只支持国内 + - **BeginTime** (int) - 查询的起始时间,格式为Unix Timestamp。如果有EndTime,BeginTime必须赋值。如没有赋值,则返回缺少参 数错误,如果没有EndTime,BeginTime也可以不赋值,EndTime默认当前时间,BeginTime 默认前一天的当前时间。 + - **DomainId** (list) - 域名id,创建域名时生成的id。默认全部域名 + - **EndTime** (int) - 查询的结束时间,格式为Unix Timestamp。EndTime默认为当前时间,BeginTime默认为当前时间前一天时间。 + - **IsDcdn** (bool) - 是否全站加速 默认false + + **Response** + + - **BandwidthList** (list) - 见 **BandwidthInfoDetail** 模型定义 + + **Response Model** + + **BandwidthInfoDetail** + - **Bandwidth** (float) - 返回值带宽值数据。 + - **Time** (int) - 宽获取的时间点。格式:时间戳 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUcdnPassBandwidthV2RequestSchema().dumps(d) + + resp = self.invoke("GetUcdnPassBandwidthV2", d, **kwargs) + return apis.GetUcdnPassBandwidthV2ResponseSchema().loads(resp) + + def get_ucdn_pro_isp_bandwidth_v2( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUcdnProIspBandwidthV2 - 按省份运营商获取域名带宽数据 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **BeginTime** (int) - (Required) 查询的起始日期,格式为Unix Timestamp + - **EndTime** (int) - (Required) 查询的结束日期,格式为Unix Timestamp + - **Type** (int) - (Required) 时间粒度0 (按5分钟粒度)1 (按小时粒度)2(按天粒度)3(按分钟粒度) + - **DomainId** (list) - 域名id,创建域名时生成的id。默认全部域名 + - **Isp** (str) - 运营商代码(运营商拼音),一次只能查询一个运营商,不传递默认取所有运营商 + - **Province** (list) - 省份代码(省份拼音),可以传多个,不传则查询所有省份 + + **Response** + + - **BandwidthSet** (list) - 见 **ProIspBandwidthSet** 模型定义 + + **Response Model** + + **ProIspBandwidthSet** + - **BandwidthTrafficList** (list) - 见 **ProIspBandwidthList** 模型定义 + - **Province** (str) - 省份代码 + + + **ProIspBandwidthList** + - **CdnBandwidth** (float) - 返回值返回指定时间区间内CDN的带宽峰值,单位Mbps + - **Time** (int) - 带宽获取的时间点。格式:时间戳 + - **Traffic** (float) - 对应时间粒度的流量,单位字节 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUcdnProIspBandwidthV2RequestSchema().dumps(d) + + resp = self.invoke("GetUcdnProIspBandwidthV2", d, **kwargs) + return apis.GetUcdnProIspBandwidthV2ResponseSchema().loads(resp) + + def get_ucdn_pro_isp_request_num_v2( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUcdnProIspRequestNumV2 - 按省份运营商获取域名请求数 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **BeginTime** (int) - (Required) 查询的起始日期,格式为Unix Timestamp 忽略时间部分 + - **EndTime** (int) - (Required) 查询的结束日期,格式为Unix Timestamp 忽略时间部分 + - **DomainId** (list) - 域名id,创建域名时生成的id。默认全部域名 + - **Isp** (str) - 运营商代码,一次只能查询一个运营商,不传递默认取所有运营商 + - **Province** (list) - 省份代码,可以传多个,不传则查询所有省份 + - **Type** (int) - 时间粒度(0表示按照5分钟粒度,1表示按照1小时粒度,2表示按照一天粒度,3表示按照一分钟粒度) + + **Response** + + - **RequestNumSet** (list) - 见 **ProIspRequestNumSetV2** 模型定义 + + **Response Model** + + **ProIspRequestNumSetV2** + - **Province** (str) - 省份代码 + - **RequestList** (list) - 见 **ProIspRequestListV2** 模型定义 + + + **ProIspRequestListV2** + - **CdnRequest** (float) - 返回值返回指定时间区间内的请求数 + - **Time** (int) - 带宽获取的时间点。格式:时间戳 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUcdnProIspRequestNumV2RequestSchema().dumps(d) + + resp = self.invoke("GetUcdnProIspRequestNumV2", d, **kwargs) + return apis.GetUcdnProIspRequestNumV2ResponseSchema().loads(resp) + + def get_ucdn_traffic( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUcdnTraffic - 获取流量信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + + **Response** + + - **TrafficSet** (list) - 见 **TrafficSet** 模型定义 + + **Response Model** + + **TrafficSet** + - **Areacode** (str) - 购买流量的区域, cn: 国内; abroad: 国外 + - **TrafficLeft** (float) - Areacode区域内总剩余流量, 单位GB + - **TrafficTotal** (float) - Areacode区域内总购买流量, 单位GB + - **TrafficUsed** (float) - Areacode区域内总使用流量, 单位GB + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUcdnTrafficRequestSchema().dumps(d) + + resp = self.invoke("GetUcdnTraffic", d, **kwargs) + return apis.GetUcdnTrafficResponseSchema().loads(resp) + + def get_ucdn_traffic_v2( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUcdnTrafficV2 - 获取流量信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **IsDcdn** (bool) - 是否dcdn域名 + + **Response** + + - **TrafficSet** (list) - 见 **TrafficSet** 模型定义 + + **Response Model** + + **TrafficSet** + - **Areacode** (str) - 购买流量的区域, cn: 国内; abroad: 国外 + - **TrafficLeft** (float) - Areacode区域内总剩余流量, 单位GB + - **TrafficTotal** (float) - Areacode区域内总购买流量, 单位GB + - **TrafficUsed** (float) - Areacode区域内总使用流量, 单位GB + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUcdnTrafficV2RequestSchema().dumps(d) + + resp = self.invoke("GetUcdnTrafficV2", d, **kwargs) + return apis.GetUcdnTrafficV2ResponseSchema().loads(resp) + + def prefetch_new_ucdn_domain_cache( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """PrefetchNewUcdnDomainCache - 提交预取任务 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **UrlList** (list) - (Required) 预热URL列表,n从自然数0开始。UrlList.n字段必须以”http://域名/”开始。如刷新文件目录a下面img.png文件, 格式为http://abc.ucloud.cn/a/img.png。请正确提交需要刷新的域名,一次性可提交1000条,最少每10S调用一次 + + **Response** + + - **TaskId** (str) - 本次提交url对应的任务id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) d = apis.PrefetchNewUcdnDomainCacheRequestSchema().dumps(d) resp = self.invoke("PrefetchNewUcdnDomainCache", d, **kwargs) return apis.PrefetchNewUcdnDomainCacheResponseSchema().loads(resp) + def query_ip_location( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """QueryIpLocation - 查询IP信息 + + **Request** + + - **Ip** (list) - (Required) ip列表 + + **Response** + + - **Data** (list) - 见 **IpLocationInfo** 模型定义 + + **Response Model** + + **IpLocationInfo** + - **Area** (str) - 地区 + - **City** (str) - 城市 + - **Exist** (bool) - ip是否存在 + - **Ip** (str) - 客户端请求的ip + - **Isp** (str) - 运营商 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.QueryIpLocationRequestSchema().dumps(d) + + resp = self.invoke("QueryIpLocation", d, **kwargs) + return apis.QueryIpLocationResponseSchema().loads(resp) + def refresh_new_ucdn_domain_cache( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ RefreshNewUcdnDomainCache - 刷新缓存 + """RefreshNewUcdnDomainCache - 刷新缓存 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Type** (str) - (Required) 刷新类型,file代表文件刷新,dir 代表路径刷新 - - **UrlList** (list) - (Required) 刷新多个URL列表时,一次最多提交30个。必须以”http://域名/”开始。目录要以”/”结尾, 如刷新目录a下所有文件,格式为:http://abc.ucloud.cn/a/;如刷新文件目录a下面img.png文件, 格式为http://abc.ucloud.cn/a/img.png。请正确提交需要刷新的域名 - + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Type** (str) - (Required) 刷新类型,file代表文件刷新,dir 代表路径刷新,m3u8带表m3u8刷新 + - **UrlList** (list) - (Required) 需要刷新的URL,n 从自然数0开始,刷新多个URL列表时,一次最多提交100个。必须以”http://域名/”开始。目录要以”/”结尾, 如刷新目录a下所有文件,格式为:http://abc.ucloud.cn/a/;如刷新文件目录a下面img.png文件, 格式为http://abc.ucloud.cn/a/img.png。请正确提交需要刷新的域名 + **Response** - **TaskId** (str) - 本次提交url对应的任务id - + """ # build request - d = {"ProjectId": self.config.project_id} + d = { + "ProjectId": self.config.project_id, + } req and d.update(req) d = apis.RefreshNewUcdnDomainCacheRequestSchema().dumps(d) @@ -661,21 +1890,75 @@ def refresh_new_ucdn_domain_cache( def switch_ucdn_charge_type( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ SwitchUcdnChargeType - 切换账号计费方式 + """SwitchUcdnChargeType - 切换账号计费方式 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **ChargeType** (str) - (Required) 计费方式。traffic代表按流量包计费,bandwidth按带宽付费 - + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id} + d = { + "ProjectId": self.config.project_id, + } req and d.update(req) d = apis.SwitchUcdnChargeTypeRequestSchema().dumps(d) resp = self.invoke("SwitchUcdnChargeType", d, **kwargs) return apis.SwitchUcdnChargeTypeResponseSchema().loads(resp) + + def update_ucdn_domain_https_config_v2( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateUcdnDomainHttpsConfigV2 - https加速配置,国内,国外一起配置(兼容全站加速域名) + + **Request** + + - **DomainId** (str) - (Required) 域名对应的资源Id + - **CertId** (int) - 证书id(可能是ucdn的id,也可能是ussl的id) + - **CertName** (str) - 证书名称,开启加速必传 + - **CertType** (str) - 证书类型 ucdn/ussl + - **HttpsStatusAbroad** (str) - 开启或关闭加速 enable或disable 当加速区域含国外的时候,此参数为必传 + - **HttpsStatusCn** (str) - 开启或关闭加速 enable或disable 当加速区域含国内的时候,此参数为必传 + + **Response** + + + """ + # build request + d = {} + req and d.update(req) + d = apis.UpdateUcdnDomainHttpsConfigV2RequestSchema().dumps(d) + + resp = self.invoke("UpdateUcdnDomainHttpsConfigV2", d, **kwargs) + return apis.UpdateUcdnDomainHttpsConfigV2ResponseSchema().loads(resp) + + def update_ucdn_domain_status( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateUcdnDomainStatus - 更新加速域名状态 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **DomainId** (str) - (Required) 域名ID,创建加速域名时生成。 + - **Status** (str) - (Required) 域名状态,enable代表加速中,disable代表停止加速,delete代表删除。 + - **IsDcdn** (bool) - 是否全站加速,默认false + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.UpdateUcdnDomainStatusRequestSchema().dumps(d) + + resp = self.invoke("UpdateUcdnDomainStatus", d, **kwargs) + return apis.UpdateUcdnDomainStatusResponseSchema().loads(resp) diff --git a/ucloud/services/ucdn/schemas/apis.py b/ucloud/services/ucdn/schemas/apis.py index 251aac78..9a52e70a 100644 --- a/ucloud/services/ucdn/schemas/apis.py +++ b/ucloud/services/ucdn/schemas/apis.py @@ -3,11 +3,35 @@ from ucloud.core.typesystem import schema, fields from ucloud.services.ucdn.schemas import models - """ UCDN API Schema """ +""" +API: AddCertificate + +添加证书 +""" + + +class AddCertificateRequestSchema(schema.RequestSchema): + """AddCertificate - 添加证书""" + + fields = { + "CaCert": fields.Str(required=False, dump_to="CaCert"), + "CertName": fields.Str(required=True, dump_to="CertName"), + "PrivateKey": fields.Str(required=True, dump_to="PrivateKey"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UserCert": fields.Str(required=True, dump_to="UserCert"), + } + + +class AddCertificateResponseSchema(schema.ResponseSchema): + """AddCertificate - 添加证书""" + + fields = {} + + """ API: BatchDescribeNewUcdnDomain @@ -16,8 +40,7 @@ class BatchDescribeNewUcdnDomainRequestSchema(schema.RequestSchema): - """ BatchDescribeNewUcdnDomain - 批量获取加速域名配置 - """ + """BatchDescribeNewUcdnDomain - 批量获取加速域名配置""" fields = { "ChannelType": fields.Str(required=False, dump_to="ChannelType"), @@ -29,8 +52,7 @@ class BatchDescribeNewUcdnDomainRequestSchema(schema.RequestSchema): class BatchDescribeNewUcdnDomainResponseSchema(schema.ResponseSchema): - """ BatchDescribeNewUcdnDomain - 批量获取加速域名配置 - """ + """BatchDescribeNewUcdnDomain - 批量获取加速域名配置""" fields = { "Arrearage": fields.List( @@ -49,6 +71,76 @@ class BatchDescribeNewUcdnDomainResponseSchema(schema.ResponseSchema): } +""" +API: BatchRefreshNewUcdnDomainCache + +批量刷新缓存 +""" + + +class BatchRefreshNewUcdnDomainCacheRequestSchema(schema.RequestSchema): + """BatchRefreshNewUcdnDomainCache - 批量刷新缓存""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Type": fields.Str(required=True, dump_to="Type"), + "UrlList": fields.Str(required=True, dump_to="UrlList"), + } + + +class BatchRefreshNewUcdnDomainCacheResponseSchema(schema.ResponseSchema): + """BatchRefreshNewUcdnDomainCache - 批量刷新缓存""" + + fields = { + "TaskId": fields.Str(required=False, load_from="TaskId"), + } + + +""" +API: ControlUcdnDomainCacheAccess + + +""" + + +class ControlUcdnDomainCacheAccessRequestSchema(schema.RequestSchema): + """ControlUcdnDomainCacheAccess -""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Type": fields.Str(required=True, dump_to="Type"), + "UrlList": fields.List(fields.Str()), + } + + +class ControlUcdnDomainCacheAccessResponseSchema(schema.ResponseSchema): + """ControlUcdnDomainCacheAccess -""" + + fields = {} + + +""" +API: DeleteCertificate + +删除证书 +""" + + +class DeleteCertificateRequestSchema(schema.RequestSchema): + """DeleteCertificate - 删除证书""" + + fields = { + "CertName": fields.Str(required=True, dump_to="CertName"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class DeleteCertificateResponseSchema(schema.ResponseSchema): + """DeleteCertificate - 删除证书""" + + fields = {} + + """ API: DescribeNewUcdnPrefetchCacheTask @@ -57,12 +149,12 @@ class BatchDescribeNewUcdnDomainResponseSchema(schema.ResponseSchema): class DescribeNewUcdnPrefetchCacheTaskRequestSchema(schema.RequestSchema): - """ DescribeNewUcdnPrefetchCacheTask - 获取预取任务状态 - """ + """DescribeNewUcdnPrefetchCacheTask - 获取预取任务状态""" fields = { "BeginTime": fields.Int(required=False, dump_to="BeginTime"), "EndTime": fields.Int(required=False, dump_to="EndTime"), + "IsDcdn": fields.Bool(required=False, dump_to="IsDcdn"), "Limit": fields.Int(required=False, dump_to="Limit"), "Offset": fields.Int(required=False, dump_to="Offset"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -72,8 +164,7 @@ class DescribeNewUcdnPrefetchCacheTaskRequestSchema(schema.RequestSchema): class DescribeNewUcdnPrefetchCacheTaskResponseSchema(schema.ResponseSchema): - """ DescribeNewUcdnPrefetchCacheTask - 获取预取任务状态 - """ + """DescribeNewUcdnPrefetchCacheTask - 获取预取任务状态""" fields = { "TaskList": fields.List( @@ -91,12 +182,12 @@ class DescribeNewUcdnPrefetchCacheTaskResponseSchema(schema.ResponseSchema): class DescribeNewUcdnRefreshCacheTaskRequestSchema(schema.RequestSchema): - """ DescribeNewUcdnRefreshCacheTask - 获取域名刷新任务状态 - """ + """DescribeNewUcdnRefreshCacheTask - 获取域名刷新任务状态""" fields = { "BeginTime": fields.Int(required=False, dump_to="BeginTime"), "EndTime": fields.Int(required=False, dump_to="EndTime"), + "IsDcdn": fields.Bool(required=False, dump_to="IsDcdn"), "Limit": fields.Int(required=False, dump_to="Limit"), "Offset": fields.Int(required=False, dump_to="Offset"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -106,8 +197,7 @@ class DescribeNewUcdnRefreshCacheTaskRequestSchema(schema.RequestSchema): class DescribeNewUcdnRefreshCacheTaskResponseSchema(schema.ResponseSchema): - """ DescribeNewUcdnRefreshCacheTask - 获取域名刷新任务状态 - """ + """DescribeNewUcdnRefreshCacheTask - 获取域名刷新任务状态""" fields = { "TaskList": fields.List( @@ -117,6 +207,65 @@ class DescribeNewUcdnRefreshCacheTaskResponseSchema(schema.ResponseSchema): } +""" +API: GetAuthConfig + +接口获取鉴权信息(非标使用) +""" + + +class GetAuthConfigRequestSchema(schema.RequestSchema): + """GetAuthConfig - 接口获取鉴权信息(非标使用)""" + + fields = { + "Domain": fields.Str(required=False, dump_to="Domain"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetAuthConfigResponseSchema(schema.ResponseSchema): + """GetAuthConfig - 接口获取鉴权信息(非标使用)""" + + fields = { + "AuthConfigs": fields.List( + models.KwaiDomainAuthConfigSchema(), + required=False, + load_from="AuthConfigs", + ), + } + + +""" +API: GetCertificateV2 + +获取证书列表(新) +""" + + +class GetCertificateV2RequestSchema(schema.RequestSchema): + """GetCertificateV2 - 获取证书列表(新)""" + + fields = { + "CdnDomain": fields.Str(required=False, dump_to="CdnDomain"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class GetCertificateV2ResponseSchema(schema.ResponseSchema): + """GetCertificateV2 - 获取证书列表(新)""" + + fields = { + "CertList": fields.List( + models.CertListSchema(), required=True, load_from="CertList" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + """ API: GetNewUcdnDomainBandwidth @@ -125,8 +274,7 @@ class DescribeNewUcdnRefreshCacheTaskResponseSchema(schema.ResponseSchema): class GetNewUcdnDomainBandwidthRequestSchema(schema.RequestSchema): - """ GetNewUcdnDomainBandwidth - 获取域名带宽数据 - """ + """GetNewUcdnDomainBandwidth - 获取域名带宽数据""" fields = { "Areacode": fields.Str(required=False, dump_to="Areacode"), @@ -139,8 +287,7 @@ class GetNewUcdnDomainBandwidthRequestSchema(schema.RequestSchema): class GetNewUcdnDomainBandwidthResponseSchema(schema.ResponseSchema): - """ GetNewUcdnDomainBandwidth - 获取域名带宽数据 - """ + """GetNewUcdnDomainBandwidth - 获取域名带宽数据""" fields = { "BandwidthList": fields.List( @@ -148,7 +295,7 @@ class GetNewUcdnDomainBandwidthResponseSchema(schema.ResponseSchema): required=False, load_from="BandwidthList", ), - "Traffic": fields.Str(required=False, load_from="Traffic"), + "Traffic": fields.Float(required=False, load_from="Traffic"), } @@ -160,8 +307,7 @@ class GetNewUcdnDomainBandwidthResponseSchema(schema.ResponseSchema): class GetNewUcdnDomainHitRateRequestSchema(schema.RequestSchema): - """ GetNewUcdnDomainHitRate - 获取域名命中率 - """ + """GetNewUcdnDomainHitRate - 获取域名命中率""" fields = { "Areacode": fields.Str(required=False, dump_to="Areacode"), @@ -169,18 +315,17 @@ class GetNewUcdnDomainHitRateRequestSchema(schema.RequestSchema): "DomainId": fields.List(fields.Str()), "EndTime": fields.Int(required=False, dump_to="EndTime"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), - "Type": fields.Int(required=True, dump_to="Type"), + "Type": fields.Int(required=False, dump_to="Type"), } class GetNewUcdnDomainHitRateResponseSchema(schema.ResponseSchema): - """ GetNewUcdnDomainHitRate - 获取域名命中率 - """ + """GetNewUcdnDomainHitRate - 获取域名命中率""" fields = { "HitRateList": fields.List( models.HitRateInfoSchema(), required=False, load_from="HitRateList" - ) + ), } @@ -192,8 +337,7 @@ class GetNewUcdnDomainHitRateResponseSchema(schema.ResponseSchema): class GetNewUcdnDomainHttpCodeRequestSchema(schema.RequestSchema): - """ GetNewUcdnDomainHttpCode - 获取域名状态码监控 - """ + """GetNewUcdnDomainHttpCode - 获取域名状态码监控""" fields = { "Areacode": fields.Str(required=False, dump_to="Areacode"), @@ -206,15 +350,14 @@ class GetNewUcdnDomainHttpCodeRequestSchema(schema.RequestSchema): class GetNewUcdnDomainHttpCodeResponseSchema(schema.ResponseSchema): - """ GetNewUcdnDomainHttpCode - 获取域名状态码监控 - """ + """GetNewUcdnDomainHttpCode - 获取域名状态码监控""" fields = { "HttpCodeDetail": fields.List( models.HttpCodeInfoSchema(), required=False, load_from="HttpCodeDetail", - ) + ), } @@ -226,8 +369,7 @@ class GetNewUcdnDomainHttpCodeResponseSchema(schema.ResponseSchema): class GetNewUcdnDomainHttpCodeV2RequestSchema(schema.RequestSchema): - """ GetNewUcdnDomainHttpCodeV2 - 获取域名详细状态码监控 - """ + """GetNewUcdnDomainHttpCodeV2 - 获取域名详细状态码监控""" fields = { "Areacode": fields.Str(required=False, dump_to="Areacode"), @@ -240,15 +382,14 @@ class GetNewUcdnDomainHttpCodeV2RequestSchema(schema.RequestSchema): class GetNewUcdnDomainHttpCodeV2ResponseSchema(schema.ResponseSchema): - """ GetNewUcdnDomainHttpCodeV2 - 获取域名详细状态码监控 - """ + """GetNewUcdnDomainHttpCodeV2 - 获取域名详细状态码监控""" fields = { "HttpCodeV2Detail": fields.List( models.HttpCodeV2DetailSchema(), required=False, load_from="HttpCodeV2Detail", - ) + ), } @@ -260,8 +401,7 @@ class GetNewUcdnDomainHttpCodeV2ResponseSchema(schema.ResponseSchema): class GetNewUcdnDomainRequestNumRequestSchema(schema.RequestSchema): - """ GetNewUcdnDomainRequestNum - 获取域名请求数 - """ + """GetNewUcdnDomainRequestNum - 获取域名请求数""" fields = { "Areacode": fields.Str(required=False, dump_to="Areacode"), @@ -274,263 +414,982 @@ class GetNewUcdnDomainRequestNumRequestSchema(schema.RequestSchema): class GetNewUcdnDomainRequestNumResponseSchema(schema.ResponseSchema): - """ GetNewUcdnDomainRequestNum - 获取域名请求数 - """ + """GetNewUcdnDomainRequestNum - 获取域名请求数""" fields = { "RequestList": fields.List( models.RequestInfoSchema(), required=False, load_from="RequestList" - ) + ), } """ -API: GetUcdnDomainLog +API: GetNewUcdnLogClientIpStatistics -获取加速域名原始日志 +获取日志客户端ip统计 """ -class GetUcdnDomainLogRequestSchema(schema.RequestSchema): - """ GetUcdnDomainLog - 获取加速域名原始日志 - """ +class GetNewUcdnLogClientIpStatisticsRequestSchema(schema.RequestSchema): + """GetNewUcdnLogClientIpStatistics - 获取日志客户端ip统计""" fields = { "BeginTime": fields.Int(required=False, dump_to="BeginTime"), - "DomainId": fields.List(fields.Str()), - "EndTime": fields.Int(required=False, dump_to="EndTime"), + "DomainId": fields.Str(required=True, dump_to="DomainId"), + "Limit": fields.Str(required=False, dump_to="Limit"), + "OrderBy": fields.Int(required=False, dump_to="OrderBy"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Type": fields.Int(required=False, dump_to="Type"), } -class GetUcdnDomainLogResponseSchema(schema.ResponseSchema): - """ GetUcdnDomainLog - 获取加速域名原始日志 - """ +class GetNewUcdnLogClientIpStatisticsResponseSchema(schema.ResponseSchema): + """GetNewUcdnLogClientIpStatistics - 获取日志客户端ip统计""" fields = { - "LogSet": fields.List( - models.LogSetListSchema(), required=False, load_from="LogSet" - ) + "Action": fields.Str(required=True, load_from="Action"), + "ClientIpStatisticsList": fields.List( + models.ClientIpStatisticsListSchema(), + required=False, + load_from="ClientIpStatisticsList", + ), + "RetCode": fields.Int(required=True, load_from="RetCode"), } """ -API: GetUcdnDomainPrefetchEnable +API: GetNewUcdnLogRefererStatistics -获取域名预取开启状态 +获取热点referer统计 """ -class GetUcdnDomainPrefetchEnableRequestSchema(schema.RequestSchema): - """ GetUcdnDomainPrefetchEnable - 获取域名预取开启状态 - """ +class GetNewUcdnLogRefererStatisticsRequestSchema(schema.RequestSchema): + """GetNewUcdnLogRefererStatistics - 获取热点referer统计""" + + fields = { + "Areacode": fields.Str(required=False, dump_to="Areacode"), + "BeginTime": fields.Int(required=False, dump_to="BeginTime"), + "DomainId": fields.Str(required=False, dump_to="DomainId"), + "EndTime": fields.Int(required=False, dump_to="EndTime"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "OrderBy": fields.Int(required=False, dump_to="OrderBy"), + } + + +class GetNewUcdnLogRefererStatisticsResponseSchema(schema.ResponseSchema): + """GetNewUcdnLogRefererStatistics - 获取热点referer统计""" + + fields = { + "RefererStatistics": fields.List( + models.RefererStatisticsSchema(), + required=False, + load_from="RefererStatistics", + ), + } + + +""" +API: GetNewUcdnLogUrlStatistics + +获取日志url统计 +""" + + +class GetNewUcdnLogUrlStatisticsRequestSchema(schema.RequestSchema): + """GetNewUcdnLogUrlStatistics - 获取日志url统计""" fields = { + "Areacode": fields.Str(required=False, dump_to="Areacode"), + "BeginTime": fields.Int(required=False, dump_to="BeginTime"), "DomainId": fields.Str(required=True, dump_to="DomainId"), + "EndTime": fields.Int(required=False, dump_to="EndTime"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "OrderBy": fields.Int(required=False, dump_to="OrderBy"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), } -class GetUcdnDomainPrefetchEnableResponseSchema(schema.ResponseSchema): - """ GetUcdnDomainPrefetchEnable - 获取域名预取开启状态 - """ +class GetNewUcdnLogUrlStatisticsResponseSchema(schema.ResponseSchema): + """GetNewUcdnLogUrlStatistics - 获取日志url统计""" - fields = {"Enable": fields.Int(required=False, load_from="Enable")} + fields = { + "UrlStatisticsList": fields.List( + models.UrlStatisticsSchema(), + required=False, + load_from="UrlStatisticsList", + ), + } """ -API: GetUcdnDomainRequestNumV2 +API: GetUcdnDomain95BandwidthV2 -获取域名请求数 +获取域名九五峰值带宽数据 """ -class GetUcdnDomainRequestNumV2RequestSchema(schema.RequestSchema): - """ GetUcdnDomainRequestNumV2 - 获取域名请求数 - """ +class GetUcdnDomain95BandwidthV2RequestSchema(schema.RequestSchema): + """GetUcdnDomain95BandwidthV2 - 获取域名九五峰值带宽数据""" fields = { "Areacode": fields.Str(required=False, dump_to="Areacode"), "BeginTime": fields.Int(required=True, dump_to="BeginTime"), "DomainId": fields.List(fields.Str()), "EndTime": fields.Int(required=True, dump_to="EndTime"), + "IsDcdn": fields.Bool(required=False, dump_to="IsDcdn"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), - "Type": fields.Int(required=True, dump_to="Type"), } -class GetUcdnDomainRequestNumV2ResponseSchema(schema.ResponseSchema): - """ GetUcdnDomainRequestNumV2 - 获取域名请求数 - """ +class GetUcdnDomain95BandwidthV2ResponseSchema(schema.ResponseSchema): + """GetUcdnDomain95BandwidthV2 - 获取域名九五峰值带宽数据""" fields = { - "RequestList": fields.List( - models.RequestInfoSchema(), required=False, load_from="RequestList" - ) + "CdnBandwidth": fields.Float(required=False, load_from="CdnBandwidth"), + "Time": fields.Int(required=True, load_from="Time"), } """ -API: GetUcdnDomainTraffic +API: GetUcdnDomainBandwidthByIpProtocol -获取加速域名流量使用信息 +获取域名带宽数据按ip协议(新) """ -class GetUcdnDomainTrafficRequestSchema(schema.RequestSchema): - """ GetUcdnDomainTraffic - 获取加速域名流量使用信息 - """ +class GetUcdnDomainBandwidthByIpProtocolRequestSchema(schema.RequestSchema): + """GetUcdnDomainBandwidthByIpProtocol - 获取域名带宽数据按ip协议(新)""" fields = { "Areacode": fields.Str(required=False, dump_to="Areacode"), "BeginTime": fields.Int(required=False, dump_to="BeginTime"), "DomainId": fields.List(fields.Str()), "EndTime": fields.Int(required=False, dump_to="EndTime"), + "IpProtocol": fields.Str(required=True, dump_to="IpProtocol"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Type": fields.Int(required=True, dump_to="Type"), } -class GetUcdnDomainTrafficResponseSchema(schema.ResponseSchema): - """ GetUcdnDomainTraffic - 获取加速域名流量使用信息 - """ +class GetUcdnDomainBandwidthByIpProtocolResponseSchema(schema.ResponseSchema): + """GetUcdnDomainBandwidthByIpProtocol - 获取域名带宽数据按ip协议(新)""" fields = { - "TrafficSet": fields.List( - models.UcdnDomainTrafficSetSchema(), + "BandwidthTrafficList": fields.List( + models.BandwidthTrafficInfoSchema(), required=False, - load_from="TrafficSet", - ) + load_from="BandwidthTrafficList", + ), } """ -API: GetUcdnPassBandwidth +API: GetUcdnDomainBandwidthV2 -获取回源带宽数据(cdn回客户源站部分) +获取域名带宽数据(新) """ -class GetUcdnPassBandwidthRequestSchema(schema.RequestSchema): - """ GetUcdnPassBandwidth - 获取回源带宽数据(cdn回客户源站部分) - """ +class GetUcdnDomainBandwidthV2RequestSchema(schema.RequestSchema): + """GetUcdnDomainBandwidthV2 - 获取域名带宽数据(新)""" fields = { "Areacode": fields.Str(required=False, dump_to="Areacode"), "BeginTime": fields.Int(required=False, dump_to="BeginTime"), "DomainId": fields.List(fields.Str()), "EndTime": fields.Int(required=False, dump_to="EndTime"), + "IsDcdn": fields.Bool(required=False, dump_to="IsDcdn"), + "Primeval": fields.Int(required=False, dump_to="Primeval"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), - "Type": fields.Int(required=True, dump_to="Type"), + "Protocol": fields.Str(required=False, dump_to="Protocol"), + "Type": fields.Int(required=False, dump_to="Type"), } -class GetUcdnPassBandwidthResponseSchema(schema.ResponseSchema): - """ GetUcdnPassBandwidth - 获取回源带宽数据(cdn回客户源站部分) - """ +class GetUcdnDomainBandwidthV2ResponseSchema(schema.ResponseSchema): + """GetUcdnDomainBandwidthV2 - 获取域名带宽数据(新)""" fields = { - "BandwidthDetail": fields.List( - models.BandwidthInfoDetailSchema(), + "BandwidthTrafficList": fields.List( + models.BandwidthTrafficInfoSchema(), required=False, - load_from="BandwidthDetail", - ) + load_from="BandwidthTrafficList", + ), } """ -API: GetUcdnTraffic +API: GetUcdnDomainConfig -获取流量信息 +批量获取加速域名配置 """ -class GetUcdnTrafficRequestSchema(schema.RequestSchema): - """ GetUcdnTraffic - 获取流量信息 - """ +class GetUcdnDomainConfigRequestSchema(schema.RequestSchema): + """GetUcdnDomainConfig - 批量获取加速域名配置""" - fields = {"ProjectId": fields.Str(required=False, dump_to="ProjectId")} + fields = { + "ChannelType": fields.Str(required=False, dump_to="ChannelType"), + "Domain": fields.List(fields.Str()), + "DomainId": fields.List(fields.Str()), + "IsDcdn": fields.Bool(required=False, dump_to="IsDcdn"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } -class GetUcdnTrafficResponseSchema(schema.ResponseSchema): - """ GetUcdnTraffic - 获取流量信息 - """ +class GetUcdnDomainConfigResponseSchema(schema.ResponseSchema): + """GetUcdnDomainConfig - 批量获取加速域名配置""" fields = { - "TrafficSet": fields.List( - models.TrafficSetSchema(), required=False, load_from="TrafficSet" - ) + "DomainList": fields.List( + models.DomainConfigInfoSchema(), + required=True, + load_from="DomainList", + ), } """ -API: PrefetchNewUcdnDomainCache +API: GetUcdnDomainHitRate -提交预取任务 +获取域名命中率 """ -class PrefetchNewUcdnDomainCacheRequestSchema(schema.RequestSchema): - """ PrefetchNewUcdnDomainCache - 提交预取任务 - """ +class GetUcdnDomainHitRateRequestSchema(schema.RequestSchema): + """GetUcdnDomainHitRate - 获取域名命中率""" fields = { + "Areacode": fields.Str(required=False, dump_to="Areacode"), + "BeginTime": fields.Int(required=False, dump_to="BeginTime"), + "DomainId": fields.List(fields.Str()), + "EndTime": fields.Int(required=False, dump_to="EndTime"), + "HitType": fields.Int(required=False, dump_to="HitType"), + "IsDcdn": fields.Bool(required=False, dump_to="IsDcdn"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), - "UrlList": fields.List(fields.Str()), + "Type": fields.Int(required=True, dump_to="Type"), } -class PrefetchNewUcdnDomainCacheResponseSchema(schema.ResponseSchema): - """ PrefetchNewUcdnDomainCache - 提交预取任务 - """ +class GetUcdnDomainHitRateResponseSchema(schema.ResponseSchema): + """GetUcdnDomainHitRate - 获取域名命中率""" - fields = {"TaskId": fields.Str(required=False, load_from="TaskId")} + fields = { + "HitRateList": fields.List( + models.HitRateInfoV2Schema(), + required=False, + load_from="HitRateList", + ), + } """ -API: RefreshNewUcdnDomainCache +API: GetUcdnDomainHttpCodeV2 -刷新缓存 +获取域名状态码信息 """ -class RefreshNewUcdnDomainCacheRequestSchema(schema.RequestSchema): - """ RefreshNewUcdnDomainCache - 刷新缓存 - """ +class GetUcdnDomainHttpCodeV2RequestSchema(schema.RequestSchema): + """GetUcdnDomainHttpCodeV2 - 获取域名状态码信息""" fields = { + "Areacode": fields.Str(required=False, dump_to="Areacode"), + "BeginTime": fields.Int(required=False, dump_to="BeginTime"), + "DomainId": fields.List(fields.Str()), + "EndTime": fields.Int(required=False, dump_to="EndTime"), + "IsDcdn": fields.Bool(required=False, dump_to="IsDcdn"), + "Layer": fields.Str(required=False, dump_to="Layer"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), - "Type": fields.Str(required=True, dump_to="Type"), - "UrlList": fields.List(fields.Str()), + "Type": fields.Int(required=True, dump_to="Type"), } -class RefreshNewUcdnDomainCacheResponseSchema(schema.ResponseSchema): - """ RefreshNewUcdnDomainCache - 刷新缓存 - """ +class GetUcdnDomainHttpCodeV2ResponseSchema(schema.ResponseSchema): + """GetUcdnDomainHttpCodeV2 - 获取域名状态码信息""" + + fields = { + "HttpCodeDetail": fields.List( + models.HttpCodeInfoV2Schema(), + required=False, + load_from="HttpCodeDetail", + ), + } - fields = {"TaskId": fields.Str(required=False, load_from="TaskId")} +""" +API: GetUcdnDomainInfoList +获取域名基本信息 """ -API: SwitchUcdnChargeType -切换账号计费方式 + +class GetUcdnDomainInfoListRequestSchema(schema.RequestSchema): + """GetUcdnDomainInfoList - 获取域名基本信息""" + + fields = { + "PageIndex": fields.Int(required=False, dump_to="PageIndex"), + "PageSize": fields.Int(required=False, dump_to="PageSize"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "QueryByProject": fields.Bool(required=False, dump_to="QueryByProject"), + } + + +class GetUcdnDomainInfoListResponseSchema(schema.ResponseSchema): + """GetUcdnDomainInfoList - 获取域名基本信息""" + + fields = { + "DomainInfoList": fields.List( + models.DomainBaseInfoSchema(), + required=True, + load_from="DomainInfoList", + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + """ +API: GetUcdnDomainLog -class SwitchUcdnChargeTypeRequestSchema(schema.RequestSchema): - """ SwitchUcdnChargeType - 切换账号计费方式 - """ +""" + + +class GetUcdnDomainLogRequestSchema(schema.RequestSchema): + """GetUcdnDomainLog -""" fields = { - "ChargeType": fields.Str(required=True, dump_to="ChargeType"), + "BeginTime": fields.Int(required=False, dump_to="BeginTime"), + "DomainId": fields.List(fields.Str()), + "EndTime": fields.Int(required=False, dump_to="EndTime"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Type": fields.Int(required=False, dump_to="Type"), } -class SwitchUcdnChargeTypeResponseSchema(schema.ResponseSchema): - """ SwitchUcdnChargeType - 切换账号计费方式 - """ +class GetUcdnDomainLogResponseSchema(schema.ResponseSchema): + """GetUcdnDomainLog -""" + + fields = { + "LogSet": fields.List( + models.LogSetListSchema(), required=False, load_from="LogSet" + ), + } + + +""" +API: GetUcdnDomainLogV2 + +获取域名5分钟日志 +""" + + +class GetUcdnDomainLogV2RequestSchema(schema.RequestSchema): + """GetUcdnDomainLogV2 - 获取域名5分钟日志""" + + fields = { + "BeginTime": fields.Int(required=True, dump_to="BeginTime"), + "DomainId": fields.List(fields.Str()), + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "IsDcdn": fields.Bool(required=False, dump_to="IsDcdn"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class GetUcdnDomainLogV2ResponseSchema(schema.ResponseSchema): + """GetUcdnDomainLogV2 - 获取域名5分钟日志""" + + fields = { + "DomainLogSet": fields.List( + models.DomanLogListSchema(), required=True, load_from="DomainLogSet" + ), + } + + +""" +API: GetUcdnDomainOriginHttpCode + + +""" + + +class GetUcdnDomainOriginHttpCodeRequestSchema(schema.RequestSchema): + """GetUcdnDomainOriginHttpCode -""" + + fields = { + "Areacode": fields.Str(required=False, dump_to="Areacode"), + "BeginTime": fields.Int(required=False, dump_to="BeginTime"), + "DomainId": fields.List(fields.Str()), + "EndTime": fields.Int(required=False, dump_to="EndTime"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Type": fields.Int(required=True, dump_to="Type"), + } + + +class GetUcdnDomainOriginHttpCodeResponseSchema(schema.ResponseSchema): + """GetUcdnDomainOriginHttpCode -""" + + fields = { + "HttpCodeDetail": fields.List( + models.HttpCodeInfoSchema(), + required=False, + load_from="HttpCodeDetail", + ), + } + + +""" +API: GetUcdnDomainOriginHttpCodeDetail + + +""" + + +class GetUcdnDomainOriginHttpCodeDetailRequestSchema(schema.RequestSchema): + """GetUcdnDomainOriginHttpCodeDetail -""" + + fields = { + "Areacode": fields.Str(required=False, dump_to="Areacode"), + "BeginTime": fields.Int(required=True, dump_to="BeginTime"), + "DomainId": fields.List(fields.Str()), + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Type": fields.Int(required=True, dump_to="Type"), + } + + +class GetUcdnDomainOriginHttpCodeDetailResponseSchema(schema.ResponseSchema): + """GetUcdnDomainOriginHttpCodeDetail -""" + + fields = { + "HttpCodeV2Detail": fields.List( + models.HttpCodeV2DetailSchema(), + required=False, + load_from="HttpCodeV2Detail", + ), + } + + +""" +API: GetUcdnDomainOriginRequestNum + +获取域名回源请求数 +""" + + +class GetUcdnDomainOriginRequestNumRequestSchema(schema.RequestSchema): + """GetUcdnDomainOriginRequestNum - 获取域名回源请求数""" + + fields = { + "Areacode": fields.Str(required=False, dump_to="Areacode"), + "BeginTime": fields.Int(required=True, dump_to="BeginTime"), + "DomainId": fields.List(fields.Str()), + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "IsDcdn": fields.Bool(required=False, dump_to="IsDcdn"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Type": fields.Int(required=True, dump_to="Type"), + } + + +class GetUcdnDomainOriginRequestNumResponseSchema(schema.ResponseSchema): + """GetUcdnDomainOriginRequestNum - 获取域名回源请求数""" + + fields = { + "RequestList": fields.List( + models.RequestInfoV2Schema(), + required=False, + load_from="RequestList", + ), + } + + +""" +API: GetUcdnDomainPrefetchEnable + + +""" + + +class GetUcdnDomainPrefetchEnableRequestSchema(schema.RequestSchema): + """GetUcdnDomainPrefetchEnable -""" + + fields = { + "DomainId": fields.Str(required=True, dump_to="DomainId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class GetUcdnDomainPrefetchEnableResponseSchema(schema.ResponseSchema): + """GetUcdnDomainPrefetchEnable -""" + + fields = { + "Enable": fields.Int(required=False, load_from="Enable"), + } + + +""" +API: GetUcdnDomainPrefetchRefreshState + +获取域名预取刷新配额信息 +""" + + +class GetUcdnDomainPrefetchRefreshStateRequestSchema(schema.RequestSchema): + """GetUcdnDomainPrefetchRefreshState - 获取域名预取刷新配额信息""" + + fields = { + "DomainId": fields.Str(required=True, dump_to="DomainId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class GetUcdnDomainPrefetchRefreshStateResponseSchema(schema.ResponseSchema): + """GetUcdnDomainPrefetchRefreshState - 获取域名预取刷新配额信息""" + + fields = { + "PrefetchQuota": fields.Int(required=False, load_from="PrefetchQuota"), + "RefreshDirQuota": fields.Int( + required=False, load_from="RefreshDirQuota" + ), + "RefreshFileQuota": fields.Int( + required=False, load_from="RefreshFileQuota" + ), + "SubmitPrefetchCount": fields.Int( + required=False, load_from="SubmitPrefetchCount" + ), + "SubmitRefreshDir": fields.Int( + required=False, load_from="SubmitRefreshDir" + ), + "SubmitRefreshFile": fields.Int( + required=False, load_from="SubmitRefreshFile" + ), + } + + +""" +API: GetUcdnDomainRequestNumV2 + +获取域名请求数 +""" + + +class GetUcdnDomainRequestNumV2RequestSchema(schema.RequestSchema): + """GetUcdnDomainRequestNumV2 - 获取域名请求数""" + + fields = { + "Areacode": fields.Str(required=False, dump_to="Areacode"), + "BeginTime": fields.Int(required=True, dump_to="BeginTime"), + "DomainId": fields.List(fields.Str()), + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Type": fields.Int(required=True, dump_to="Type"), + } + + +class GetUcdnDomainRequestNumV2ResponseSchema(schema.ResponseSchema): + """GetUcdnDomainRequestNumV2 - 获取域名请求数""" + + fields = { + "RequestList": fields.List( + models.RequestInfoSchema(), required=False, load_from="RequestList" + ), + } + + +""" +API: GetUcdnDomainRequestNumV3 + +获取域名请求数 +""" + + +class GetUcdnDomainRequestNumV3RequestSchema(schema.RequestSchema): + """GetUcdnDomainRequestNumV3 - 获取域名请求数""" + + fields = { + "Areacode": fields.Str(required=False, dump_to="Areacode"), + "BeginTime": fields.Int(required=True, dump_to="BeginTime"), + "DomainId": fields.List(fields.Str()), + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "IsDcdn": fields.Bool(required=False, dump_to="IsDcdn"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Protocol": fields.Str(required=False, dump_to="Protocol"), + "Type": fields.Int(required=True, dump_to="Type"), + } + + +class GetUcdnDomainRequestNumV3ResponseSchema(schema.ResponseSchema): + """GetUcdnDomainRequestNumV3 - 获取域名请求数""" + + fields = { + "RequestList": fields.List( + models.RequestInfoV2Schema(), + required=False, + load_from="RequestList", + ), + } + + +""" +API: GetUcdnDomainTraffic + +获取加速域名流量使用信息 +""" + + +class GetUcdnDomainTrafficRequestSchema(schema.RequestSchema): + """GetUcdnDomainTraffic - 获取加速域名流量使用信息""" + + fields = { + "AccountType": fields.Str(required=False, dump_to="AccountType"), + "Areacode": fields.Str(required=False, dump_to="Areacode"), + "BeginTime": fields.Int(required=False, dump_to="BeginTime"), + "DomainId": fields.List(fields.Str()), + "EndTime": fields.Int(required=False, dump_to="EndTime"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class GetUcdnDomainTrafficResponseSchema(schema.ResponseSchema): + """GetUcdnDomainTraffic - 获取加速域名流量使用信息""" + + fields = { + "TrafficSet": fields.List( + models.UcdnDomainTrafficSetSchema(), + required=False, + load_from="TrafficSet", + ), + } + + +""" +API: GetUcdnPassBandwidth + +获取回源带宽数据(cdn回客户源站部分) +""" + + +class GetUcdnPassBandwidthRequestSchema(schema.RequestSchema): + """GetUcdnPassBandwidth - 获取回源带宽数据(cdn回客户源站部分)""" + + fields = { + "Areacode": fields.Str(required=False, dump_to="Areacode"), + "BeginTime": fields.Int(required=False, dump_to="BeginTime"), + "DomainId": fields.List(fields.Str()), + "EndTime": fields.Int(required=False, dump_to="EndTime"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Type": fields.Int(required=True, dump_to="Type"), + } + + +class GetUcdnPassBandwidthResponseSchema(schema.ResponseSchema): + """GetUcdnPassBandwidth - 获取回源带宽数据(cdn回客户源站部分)""" + + fields = { + "BandwidthDetail": fields.List( + models.BandwidthInfoDetailSchema(), + required=False, + load_from="BandwidthDetail", + ), + } + + +""" +API: GetUcdnPassBandwidthV2 + +获取回源带宽数据(cdn回客户源站部分) +""" + + +class GetUcdnPassBandwidthV2RequestSchema(schema.RequestSchema): + """GetUcdnPassBandwidthV2 - 获取回源带宽数据(cdn回客户源站部分)""" + + fields = { + "Areacode": fields.Str(required=False, dump_to="Areacode"), + "BeginTime": fields.Int(required=False, dump_to="BeginTime"), + "DomainId": fields.List(fields.Str()), + "EndTime": fields.Int(required=False, dump_to="EndTime"), + "IsDcdn": fields.Bool(required=False, dump_to="IsDcdn"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Type": fields.Int(required=True, dump_to="Type"), + } + + +class GetUcdnPassBandwidthV2ResponseSchema(schema.ResponseSchema): + """GetUcdnPassBandwidthV2 - 获取回源带宽数据(cdn回客户源站部分)""" + + fields = { + "BandwidthList": fields.List( + models.BandwidthInfoDetailSchema(), + required=False, + load_from="BandwidthList", + ), + } + + +""" +API: GetUcdnProIspBandwidthV2 + +按省份运营商获取域名带宽数据 +""" + + +class GetUcdnProIspBandwidthV2RequestSchema(schema.RequestSchema): + """GetUcdnProIspBandwidthV2 - 按省份运营商获取域名带宽数据""" + + fields = { + "BeginTime": fields.Int(required=True, dump_to="BeginTime"), + "DomainId": fields.List(fields.Str()), + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "Isp": fields.Str(required=False, dump_to="Isp"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Province": fields.List(fields.Str()), + "Type": fields.Int(required=True, dump_to="Type"), + } + + +class GetUcdnProIspBandwidthV2ResponseSchema(schema.ResponseSchema): + """GetUcdnProIspBandwidthV2 - 按省份运营商获取域名带宽数据""" + + fields = { + "BandwidthSet": fields.List( + models.ProIspBandwidthSetSchema(), + required=True, + load_from="BandwidthSet", + ), + } + + +""" +API: GetUcdnProIspRequestNumV2 + +按省份运营商获取域名请求数 +""" + + +class GetUcdnProIspRequestNumV2RequestSchema(schema.RequestSchema): + """GetUcdnProIspRequestNumV2 - 按省份运营商获取域名请求数""" + + fields = { + "BeginTime": fields.Int(required=True, dump_to="BeginTime"), + "DomainId": fields.List(fields.Str()), + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "Isp": fields.Str(required=False, dump_to="Isp"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Province": fields.List(fields.Str()), + "Type": fields.Int(required=False, dump_to="Type"), + } + + +class GetUcdnProIspRequestNumV2ResponseSchema(schema.ResponseSchema): + """GetUcdnProIspRequestNumV2 - 按省份运营商获取域名请求数""" + + fields = { + "RequestNumSet": fields.List( + models.ProIspRequestNumSetV2Schema(), + required=True, + load_from="RequestNumSet", + ), + } + + +""" +API: GetUcdnTraffic + +获取流量信息 +""" + + +class GetUcdnTrafficRequestSchema(schema.RequestSchema): + """GetUcdnTraffic - 获取流量信息""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class GetUcdnTrafficResponseSchema(schema.ResponseSchema): + """GetUcdnTraffic - 获取流量信息""" + + fields = { + "TrafficSet": fields.List( + models.TrafficSetSchema(), required=False, load_from="TrafficSet" + ), + } + + +""" +API: GetUcdnTrafficV2 + +获取流量信息 +""" + + +class GetUcdnTrafficV2RequestSchema(schema.RequestSchema): + """GetUcdnTrafficV2 - 获取流量信息""" + + fields = { + "IsDcdn": fields.Bool(required=False, dump_to="IsDcdn"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class GetUcdnTrafficV2ResponseSchema(schema.ResponseSchema): + """GetUcdnTrafficV2 - 获取流量信息""" + + fields = { + "TrafficSet": fields.List( + models.TrafficSetSchema(), required=False, load_from="TrafficSet" + ), + } + + +""" +API: PrefetchNewUcdnDomainCache + +提交预取任务 +""" + + +class PrefetchNewUcdnDomainCacheRequestSchema(schema.RequestSchema): + """PrefetchNewUcdnDomainCache - 提交预取任务""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UrlList": fields.List(fields.Str()), + } + + +class PrefetchNewUcdnDomainCacheResponseSchema(schema.ResponseSchema): + """PrefetchNewUcdnDomainCache - 提交预取任务""" + + fields = { + "TaskId": fields.Str(required=False, load_from="TaskId"), + } + + +""" +API: QueryIpLocation + +查询IP信息 +""" + + +class QueryIpLocationRequestSchema(schema.RequestSchema): + """QueryIpLocation - 查询IP信息""" + + fields = { + "Ip": fields.List(fields.Str()), + } + + +class QueryIpLocationResponseSchema(schema.ResponseSchema): + """QueryIpLocation - 查询IP信息""" + + fields = { + "Data": fields.List( + models.IpLocationInfoSchema(), required=True, load_from="Data" + ), + } + + +""" +API: RefreshNewUcdnDomainCache + +刷新缓存 +""" + + +class RefreshNewUcdnDomainCacheRequestSchema(schema.RequestSchema): + """RefreshNewUcdnDomainCache - 刷新缓存""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Type": fields.Str(required=True, dump_to="Type"), + "UrlList": fields.List(fields.Str()), + } + + +class RefreshNewUcdnDomainCacheResponseSchema(schema.ResponseSchema): + """RefreshNewUcdnDomainCache - 刷新缓存""" + + fields = { + "TaskId": fields.Str(required=False, load_from="TaskId"), + } + + +""" +API: SwitchUcdnChargeType + +切换账号计费方式 +""" + + +class SwitchUcdnChargeTypeRequestSchema(schema.RequestSchema): + """SwitchUcdnChargeType - 切换账号计费方式""" + + fields = { + "ChargeType": fields.Str(required=True, dump_to="ChargeType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class SwitchUcdnChargeTypeResponseSchema(schema.ResponseSchema): + """SwitchUcdnChargeType - 切换账号计费方式""" + + fields = {} + + +""" +API: UpdateUcdnDomainHttpsConfigV2 + +https加速配置,国内,国外一起配置(兼容全站加速域名) +""" + + +class UpdateUcdnDomainHttpsConfigV2RequestSchema(schema.RequestSchema): + """UpdateUcdnDomainHttpsConfigV2 - https加速配置,国内,国外一起配置(兼容全站加速域名)""" + + fields = { + "CertId": fields.Int(required=False, dump_to="CertId"), + "CertName": fields.Str(required=False, dump_to="CertName"), + "CertType": fields.Str(required=False, dump_to="CertType"), + "DomainId": fields.Str(required=True, dump_to="DomainId"), + "HttpsStatusAbroad": fields.Str( + required=False, dump_to="HttpsStatusAbroad" + ), + "HttpsStatusCn": fields.Str(required=False, dump_to="HttpsStatusCn"), + } + + +class UpdateUcdnDomainHttpsConfigV2ResponseSchema(schema.ResponseSchema): + """UpdateUcdnDomainHttpsConfigV2 - https加速配置,国内,国外一起配置(兼容全站加速域名)""" + + fields = {} + + +""" +API: UpdateUcdnDomainStatus + +更新加速域名状态 +""" + + +class UpdateUcdnDomainStatusRequestSchema(schema.RequestSchema): + """UpdateUcdnDomainStatus - 更新加速域名状态""" + + fields = { + "DomainId": fields.Str(required=True, dump_to="DomainId"), + "IsDcdn": fields.Bool(required=False, dump_to="IsDcdn"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Status": fields.Str(required=True, dump_to="Status"), + } + + +class UpdateUcdnDomainStatusResponseSchema(schema.ResponseSchema): + """UpdateUcdnDomainStatus - 更新加速域名状态""" fields = {} diff --git a/ucloud/services/ucdn/schemas/models.py b/ucloud/services/ucdn/schemas/models.py index b62f9760..c13c5aae 100644 --- a/ucloud/services/ucdn/schemas/models.py +++ b/ucloud/services/ucdn/schemas/models.py @@ -4,39 +4,33 @@ class CacheConfSchema(schema.ResponseSchema): - """ CacheConf - 缓存配置 - """ + """CacheConf - 缓存配置""" fields = { - "CacheBehavior": fields.Int(required=False, load_from="CacheBehavior"), - "CacheTTL": fields.Int(required=False, load_from="CacheTTL"), - "CacheUnit": fields.Str(required=False, load_from="CacheUnit"), + "CacheBehavior": fields.Bool(required=True, load_from="CacheBehavior"), + "CacheTTL": fields.Int(required=True, load_from="CacheTTL"), + "CacheUnit": fields.Str(required=True, load_from="CacheUnit"), "Description": fields.Str(required=False, load_from="Description"), - "FollowOriginRule": fields.Int( + "FollowOriginRule": fields.Bool( required=False, load_from="FollowOriginRule" ), "HttpCodePattern": fields.Str( required=False, load_from="HttpCodePattern" ), - "IgnoreQueryString": fields.Int( - required=False, load_from="IgnoreQueryString" - ), - "PathPattern": fields.Str(required=False, load_from="PathPattern"), + "PathPattern": fields.Str(required=True, load_from="PathPattern"), } class AccessConfSchema(schema.ResponseSchema): - """ AccessConf - 访问控制 - """ + """AccessConf - 访问控制""" fields = { - "IpBlacklist": fields.Str(required=False, load_from="IpBlacklist") + "IpBlacklist": fields.Str(required=False, load_from="IpBlacklist"), } class DomainInfoSchema(schema.ResponseSchema): - """ DomainInfo - 域名配置 - """ + """DomainInfo - 域名配置""" fields = { "AccessConf": AccessConfSchema(), @@ -72,8 +66,7 @@ class DomainInfoSchema(schema.ResponseSchema): class UrlProgressInfoSchema(schema.ResponseSchema): - """ UrlProgressInfo - UrlProgressInfo - """ + """UrlProgressInfo - UrlProgressInfo""" fields = { "CreateTime": fields.Int(required=False, load_from="CreateTime"), @@ -85,31 +78,73 @@ class UrlProgressInfoSchema(schema.ResponseSchema): class TaskInfoSchema(schema.ResponseSchema): - """ TaskInfo - 预取刷新的任务信息 - """ + """TaskInfo - 预取刷新的任务信息""" fields = { "CreateTime": fields.Int(required=False, load_from="CreateTime"), "Status": fields.Str(required=False, load_from="Status"), "TaskId": fields.Str(required=False, load_from="TaskId"), - "Type": fields.Str(required=False, load_from="Type"), + "Type": fields.Str( + required=False, load_from="Type" + ), # Deprecated, will be removed at 1.0 "UrlLists": fields.List(UrlProgressInfoSchema()), } +class KwaiAuthKvSchema(schema.ResponseSchema): + """KwaiAuthKv - 快手鉴权键值信息""" + + fields = { + "Iv": fields.Str(required=True, load_from="Iv"), + "Key": fields.Str(required=True, load_from="Key"), + } + + +class KwaiAuthConfigSchema(schema.ResponseSchema): + """KwaiAuthConfig - 鉴权信息""" + + fields = { + "Keys": fields.List(KwaiAuthKvSchema()), + "Type": fields.Str(required=True, load_from="Type"), + } + + +class KwaiDomainAuthConfigSchema(schema.ResponseSchema): + """KwaiDomainAuthConfig - 快手域名鉴权信息""" + + fields = { + "Config": fields.List(KwaiAuthConfigSchema()), + "Domain": fields.Str(required=True, load_from="Domain"), + } + + +class CertListSchema(schema.ResponseSchema): + """CertList - 证书信息""" + + fields = { + "BeginTime": fields.Int(required=True, load_from="BeginTime"), + "CaCert": fields.Str(required=True, load_from="CaCert"), + "CertName": fields.Str(required=True, load_from="CertName"), + "CommonName": fields.Str(required=True, load_from="CommonName"), + "DnsName": fields.Str(required=True, load_from="DnsName"), + "DomainCount": fields.Int(required=True, load_from="DomainCount"), + "Domains": fields.List(fields.Str()), + "EndTime": fields.Int(required=True, load_from="EndTime"), + "UserCert": fields.Str(required=True, load_from="UserCert"), + } + + class BandwidthInfoSchema(schema.ResponseSchema): - """ BandwidthInfo - BandwidthInfo - """ + """BandwidthInfo - BandwidthInfo""" fields = { - "CdnBandwidth": fields.Str(required=False, load_from="CdnBandwidth"), + "CdnBandwidth": fields.Float(required=False, load_from="CdnBandwidth"), "Time": fields.Int(required=False, load_from="Time"), } class HitRateInfoSchema(schema.ResponseSchema): - """ HitRateInfo - HitRateInfo - """ + """HitRateInfo - HitRateInfo""" fields = { "FlowHitRate": fields.Float(required=False, load_from="FlowHitRate"), @@ -121,8 +156,7 @@ class HitRateInfoSchema(schema.ResponseSchema): class HttpCodeInfoSchema(schema.ResponseSchema): - """ HttpCodeInfo - HttpCodeInfo - """ + """HttpCodeInfo -""" fields = { "HttpFiveXX": fields.Int(required=False, load_from="HttpFiveXX"), @@ -135,8 +169,7 @@ class HttpCodeInfoSchema(schema.ResponseSchema): class HttpCodeV2DetailSchema(schema.ResponseSchema): - """ HttpCodeV2Detail - HTTP状态码详细信息 - """ + """HttpCodeV2Detail -""" fields = { "Http100": fields.Int(required=False, load_from="Http100"), @@ -195,13 +228,13 @@ class HttpCodeV2DetailSchema(schema.ResponseSchema): "Http507": fields.Int(required=False, load_from="Http507"), "Http509": fields.Int(required=False, load_from="Http509"), "Http510": fields.Int(required=False, load_from="Http510"), - "Time": fields.Int(required=True, load_from="Time"), + "Time": fields.Int(required=False, load_from="Time"), + "Total": fields.Int(required=False, load_from="Total"), } class RequestInfoSchema(schema.ResponseSchema): - """ RequestInfo - RequestInfo - """ + """RequestInfo - RequestInfo""" fields = { "CdnRequest": fields.Float(required=False, load_from="CdnRequest"), @@ -212,9 +245,215 @@ class RequestInfoSchema(schema.ResponseSchema): } +class ClientIpStatisticsListSchema(schema.ResponseSchema): + """ClientIpStatisticsList - ClientIpStatisticsList""" + + fields = { + "Flow": fields.Int(required=False, load_from="Flow"), + "FlowPercent": fields.Float(required=False, load_from="FlowPercent"), + "IP": fields.Str(required=False, load_from="IP"), + "RequestPercent": fields.Float( + required=False, load_from="RequestPercent" + ), + "Requst": fields.Int(required=False, load_from="Requst"), + } + + +class RefererListSchema(schema.ResponseSchema): + """RefererList - RefererList""" + + fields = { + "Percent": fields.Float(required=False, load_from="Percent"), + "Referer": fields.Str(required=False, load_from="Referer"), + "RequestTimes": fields.Int(required=False, load_from="RequestTimes"), + } + + +class RefererStatisticsSchema(schema.ResponseSchema): + """RefererStatistics - RefererStatistics""" + + fields = { + "Date": fields.Str(required=False, load_from="Date"), + "RefererList": fields.List(RefererListSchema()), + } + + +class DownloadStatisticInfoSchema(schema.ResponseSchema): + """DownloadStatisticInfo - DownloadStatisticInfo""" + + fields = { + "DownloadTimes": fields.Int(required=False, load_from="DownloadTimes"), + "Percent": fields.Float(required=False, load_from="Percent"), + "Traffic": fields.Float(required=False, load_from="Traffic"), + "Url": fields.Str(required=False, load_from="Url"), + } + + +class UrlStatisticsSchema(schema.ResponseSchema): + """UrlStatistics - UrlStatistics""" + + fields = { + "Date": fields.Str(required=False, load_from="Date"), + "UrlList": fields.List(DownloadStatisticInfoSchema()), + } + + +class BandwidthTrafficInfoSchema(schema.ResponseSchema): + """BandwidthTrafficInfo - BandwidthTrafficInfo""" + + fields = { + "CdnBandwidth": fields.Float(required=True, load_from="CdnBandwidth"), + "Time": fields.Int(required=True, load_from="Time"), + "Traffic": fields.Float(required=True, load_from="Traffic"), + } + + +class CacheKeyInfoSchema(schema.ResponseSchema): + """CacheKeyInfo - 忽略参数缓存配置""" + + fields = { + "Ignore": fields.Bool(required=False, load_from="Ignore"), + "PathPattern": fields.Str(required=False, load_from="PathPattern"), + "QueryString": fields.Str(required=False, load_from="QueryString"), + } + + +class ReferConfSchema(schema.ResponseSchema): + """ReferConf - refer配置""" + + fields = { + "NullRefer": fields.Int(required=False, load_from="NullRefer"), + "ReferList": fields.List(fields.Str()), + "ReferType": fields.Int(required=False, load_from="ReferType"), + } + + +class CacheAllConfigSchema(schema.ResponseSchema): + """CacheAllConfig - 缓存相关的配置""" + + fields = { + "CacheHost": fields.Str(required=False, load_from="CacheHost"), + "CacheKeyList": fields.List(CacheKeyInfoSchema()), + "CacheList": fields.List(CacheConfSchema()), + "HttpCodeCacheList": fields.List(CacheConfSchema()), + } + + +class OriginConfSchema(schema.ResponseSchema): + """OriginConf - 回源配置""" + + fields = { + "BackupOriginEnable": fields.Bool( + required=False, load_from="BackupOriginEnable" + ), + "BackupOriginHost": fields.Str( + required=False, load_from="BackupOriginHost" + ), + "BackupOriginIpList": fields.List(fields.Str()), + "OriginErrorCode": fields.Str( + required=False, load_from="OriginErrorCode" + ), + "OriginErrorNum": fields.Int( + required=False, load_from="OriginErrorNum" + ), + "OriginFollow301": fields.Int( + required=False, load_from="OriginFollow301" + ), + "OriginHost": fields.Str(required=False, load_from="OriginHost"), + "OriginIpList": fields.List(fields.Str()), + "OriginPort": fields.Int(required=False, load_from="OriginPort"), + "OriginProtocol": fields.Str( + required=False, load_from="OriginProtocol" + ), + } + + +class AdvancedConfSchema(schema.ResponseSchema): + """AdvancedConf - 域名高级配置""" + + fields = { + "Http2Https": fields.Bool(required=False, load_from="Http2Https"), + "HttpClientHeader": fields.List(fields.Str()), + "HttpOriginHeader": fields.List(fields.Str()), + "QuicEnable": fields.Bool(required=False, load_from="QuicEnable"), + "WebSocketEnable": fields.Bool( + required=False, load_from="WebSocketEnable" + ), + } + + +class AccessControlConfSchema(schema.ResponseSchema): + """AccessControlConf - 访问控制配置参数""" + + fields = { + "IpBlackList": fields.List(fields.Str()), + "ReferConf": ReferConfSchema(), + } + + +class DomainConfigInfoSchema(schema.ResponseSchema): + """DomainConfigInfo - 更新域名配置""" + + fields = { + "AccessControlConf": AccessControlConfSchema(), + "AdvancedConf": AdvancedConfSchema(), + "AreaCode": fields.Str(required=True, load_from="AreaCode"), + "CacheConf": CacheAllConfigSchema(), + "CdnType": fields.Str(required=True, load_from="CdnType"), + "CertNameAbroad": fields.Str(required=True, load_from="CertNameAbroad"), + "CertNameCn": fields.Str(required=True, load_from="CertNameCn"), + "Cname": fields.Str(required=True, load_from="Cname"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "Domain": fields.Str(required=False, load_from="Domain"), + "DomainId": fields.Str(required=False, load_from="DomainId"), + "HttpsStatusAbroad": fields.Str( + required=True, load_from="HttpsStatusAbroad" + ), + "HttpsStatusCn": fields.Str(required=True, load_from="HttpsStatusCn"), + "OriginConf": OriginConfSchema(), + "Status": fields.Str(required=True, load_from="Status"), + "Tag": fields.Str(required=True, load_from="Tag"), + "TestUrl": fields.Str(required=True, load_from="TestUrl"), + } + + +class HitRateInfoV2Schema(schema.ResponseSchema): + """HitRateInfoV2 - HitRateInfoV2""" + + fields = { + "FlowHitRate": fields.Float(required=False, load_from="FlowHitRate"), + "RequestHitRate": fields.Float( + required=False, load_from="RequestHitRate" + ), + "Time": fields.Int(required=False, load_from="Time"), + } + + +class HttpCodeInfoV2Schema(schema.ResponseSchema): + """HttpCodeInfoV2 - HttpCodeInfoV2""" + + fields = { + "Http1XX": HttpCodeV2DetailSchema(), + "Http2XX": HttpCodeV2DetailSchema(), + "Http3XX": HttpCodeV2DetailSchema(), + "Http4XX": HttpCodeV2DetailSchema(), + "Http5XX": HttpCodeV2DetailSchema(), + "Http6XX": HttpCodeV2DetailSchema(), + "Time": fields.Int(required=False, load_from="Time"), + } + + +class DomainBaseInfoSchema(schema.ResponseSchema): + """DomainBaseInfo - 域名基本信息""" + + fields = { + "Domain": fields.Str(required=True, load_from="Domain"), + "DomainId": fields.Str(required=True, load_from="DomainId"), + } + + class LogSetInfoSchema(schema.ResponseSchema): - """ LogSetInfo - 日志信息 - """ + """LogSetInfo -""" fields = { "AbroadLog": fields.List(fields.Str()), @@ -224,8 +463,7 @@ class LogSetInfoSchema(schema.ResponseSchema): class LogSetListSchema(schema.ResponseSchema): - """ LogSetList - 日志信息列表 - """ + """LogSetList -""" fields = { "Domain": fields.Str(required=False, load_from="Domain"), @@ -233,9 +471,35 @@ class LogSetListSchema(schema.ResponseSchema): } +class LogInfoSchema(schema.ResponseSchema): + """LogInfo - 日志信息""" + + fields = { + "LogTime": fields.Int(required=True, load_from="LogTime"), + "LogUrl": fields.Str(required=True, load_from="LogUrl"), + } + + +class DomanLogListSchema(schema.ResponseSchema): + """DomanLogList - 域名日志列表""" + + fields = { + "Domain": fields.Str(required=False, load_from="Domain"), + "LogList": fields.List(LogInfoSchema()), + } + + +class RequestInfoV2Schema(schema.ResponseSchema): + """RequestInfoV2 - RequestInfoV2""" + + fields = { + "CdnRequest": fields.Float(required=False, load_from="CdnRequest"), + "Time": fields.Int(required=False, load_from="Time"), + } + + class UcdnDomainTrafficSetSchema(schema.ResponseSchema): - """ UcdnDomainTrafficSet - GetUcdnDomainTraffic - """ + """UcdnDomainTrafficSet - GetUcdnDomainTraffic""" fields = { "Time": fields.Int(required=False, load_from="Time"), @@ -244,8 +508,7 @@ class UcdnDomainTrafficSetSchema(schema.ResponseSchema): class BandwidthInfoDetailSchema(schema.ResponseSchema): - """ BandwidthInfoDetail - 带宽值信息模型(时间-带宽) - """ + """BandwidthInfoDetail - 带宽值信息模型(时间-带宽)""" fields = { "Bandwidth": fields.Float(required=True, load_from="Bandwidth"), @@ -253,13 +516,61 @@ class BandwidthInfoDetailSchema(schema.ResponseSchema): } +class ProIspBandwidthListSchema(schema.ResponseSchema): + """ProIspBandwidthList - 省份带宽流量实例表""" + + fields = { + "CdnBandwidth": fields.Float(required=False, load_from="CdnBandwidth"), + "Time": fields.Int(required=False, load_from="Time"), + "Traffic": fields.Float(required=False, load_from="Traffic"), + } + + +class ProIspBandwidthSetSchema(schema.ResponseSchema): + """ProIspBandwidthSet - 按省份的带宽流量实例表""" + + fields = { + "BandwidthTrafficList": fields.List(ProIspBandwidthListSchema()), + "Province": fields.Str(required=True, load_from="Province"), + } + + +class ProIspRequestListV2Schema(schema.ResponseSchema): + """ProIspRequestListV2 - 省份请求数实例表""" + + fields = { + "CdnRequest": fields.Float(required=False, load_from="CdnRequest"), + "Time": fields.Int(required=False, load_from="Time"), + } + + +class ProIspRequestNumSetV2Schema(schema.ResponseSchema): + """ProIspRequestNumSetV2 - 按省份的请求数实例表""" + + fields = { + "Province": fields.Str(required=True, load_from="Province"), + "RequestList": fields.List(ProIspRequestListV2Schema()), + } + + class TrafficSetSchema(schema.ResponseSchema): - """ TrafficSet - GetUcdnTraffic - """ + """TrafficSet - GetUcdnTraffic""" fields = { "Areacode": fields.Str(required=False, load_from="Areacode"), - "TrafficLeft": fields.Str(required=False, load_from="TrafficLeft"), - "TrafficTotal": fields.Str(required=False, load_from="TrafficTotal"), - "TrafficUsed": fields.Str(required=False, load_from="TrafficUsed"), + "TrafficLeft": fields.Float(required=False, load_from="TrafficLeft"), + "TrafficTotal": fields.Float(required=False, load_from="TrafficTotal"), + "TrafficUsed": fields.Float(required=False, load_from="TrafficUsed"), + } + + +class IpLocationInfoSchema(schema.ResponseSchema): + """IpLocationInfo - ip详细信息""" + + fields = { + "Area": fields.Str(required=False, load_from="Area"), + "City": fields.Str(required=False, load_from="City"), + "Exist": fields.Bool(required=False, load_from="Exist"), + "Ip": fields.Str(required=False, load_from="Ip"), + "Isp": fields.Str(required=False, load_from="Isp"), } diff --git a/ucloud/services/uclickhouse/__init__.py b/ucloud/services/uclickhouse/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/uclickhouse/client.py b/ucloud/services/uclickhouse/client.py new file mode 100644 index 00000000..2ff64b64 --- /dev/null +++ b/ucloud/services/uclickhouse/client.py @@ -0,0 +1,447 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.uclickhouse.schemas import apis + + +class UClickhouseClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UClickhouseClient, self).__init__( + config, transport, middleware, logger + ) + + def create_u_clickhouse_cluster( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUClickhouseCluster - 创建UClickhouse集群 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **AdminPassword** (str) - (Required) 集群管理员密码,密码规则:1.密码长度限8-32个字符2.不能包含[A-Z],[a-z],[0-9]和[@#%^*+=_;:,?!&()-]之外的字符3.需要同时包含两项或以上(大写字母/小写字母/数字/特殊符号) + - **ClickhouseMachineTypeId** (str) - (Required) 集群机型,可通过GetUClickhouseClusterCreateOption接口获取具体值 + - **ClickhouseVersion** (str) - (Required) Clickhouse版本,可通过GetUClickhouseClusterCreateOption接口获取具体版本 + - **DataDiskType** (str) - (Required) 数据盘类型,可通过GetUClickhouseClusterCreateOption接口获取具体值 + - **SubnetId** (str) - (Required) 子网ID + - **VPCId** (str) - (Required) VPC ID + - **BackupId** (str) - 备份任务ID,从备份恢复时,该字段必传,此值为备份任务ID,可以从原集群备份任务列表(ListUClickhouseBackups)获取 + - **ChargeType** (str) - 付费类型,枚举值:Year(年付),Month(月付),Dynamic(时付),默认值为Month,月付 + - **ClusterName** (str) - 实例名称名称规则:1.长度为1-50位的字符2.不能包含_,中文,[A-Z],[a-z],[0-9]之外的非法字符,集群名称默认为clickhouse + - **DataDiskSize** (int) - 数据盘大小,最小100,步长为50,默认值为100,单位GB + - **IsMultiZone** (str) - 是否多可用区,默认为false + - **IsSecGroup** (str) - 是否开启安全组,true为开启,false为不开启,默认为false,不开启安全组 + - **IsZookeeperHA** (bool) - 是否Zookeeper高可用,true为zookeeper高可用,false为非高可用,默认为true,高可用 + - **Labels** (list) - 见 **CreateUClickhouseClusterParamLabels** 模型定义 + - **MultiZones** (list) - 【数组】可用区名称,IsMultiZone为true时,必传,可通过ListUClickhouseAvailableZone获取支持的可用区 + - **Quantity** (int) - 购买时长,默认值为1。月付时,此参数传0,代表购买至月末 + - **ReplicateCount** (int) - 副本数量,取值为1或2,1为单副本(非高可用),2为双副本(高可用),默认值为高可用(即为2) + - **SecGroupIds** (str) - 安全组ID,IsSecGroup为true时,必传 + - **ShardCount** (int) - 分片数量,若传递,则至少1个分片,默认值为1 + - **ZookeeperDataDiskSize** (str) - Zookeeper数据盘大小,IsZookeeperHA为true时,必传,最小100,步长为50 + - **ZookeeperDataDiskType** (str) - Zookeeper数据盘类型,IsZookeeperHA为true时,必传,可通过GetUClickhouseClusterCreateOption接口获取具体值 + - **ZookeeperMachineTypeId** (str) - Zookeeper机型ID,IsZookeeperHA为true时,必传,可通过GetUClickhouseClusterCreateOption接口获取具体值 + + **Response** + + - **Data** (dict) - 见 **CreateUClickhouseClusterResponseData** 模型定义 + - **Message** (str) - 返回信息 + + **Request Model** + + **CreateUClickhouseClusterParamLabels** + - **Key** (str) - 标签的key + - **Value** (str) - 标签的value + + + **Response Model** + + **CreateUClickhouseClusterResponseData** + - **ClusterId** (str) - 集群ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateUClickhouseClusterRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUClickhouseCluster", d, **kwargs) + return apis.CreateUClickhouseClusterResponseSchema().loads(resp) + + def describe_u_clickhouse_cluster( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUClickhouseCluster - 获取集群信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) 集群ID + + **Response** + + - **Data** (dict) - 见 **DescribeUClickhouseClusterResponseData** 模型定义 + - **Message** (str) - 返回信息 + + **Response Model** + + **ZookeeperNode** + - **CPU** (int) - CPU + - **ClusterId** (str) - 集群ID + - **CreateTimestamp** (int) - 创建时间 + - **DataDiskSize** (int) - 数据盘大小 + - **DataDiskType** (str) - 数据盘类型 + - **MachineType** (str) - 机型 + - **Memory** (int) - 内存 + - **NodeId** (str) - 节点ID + - **NodeName** (str) - 节点名称 + - **ResourceId** (str) - 资源ID + - **ServiceStatus** (str) - 服务状态:RUNNING(运行中)、STARTING(启动中)、STOPPED(已停止)、RESTARTING(重启中) + - **SysDiskSize** (int) - 系统盘大小 + - **SysDiskType** (str) - 系统盘类型 + - **Zone** (str) - 可用区名称 + - **ZookeeperMyId** (str) - zookeeper的myid + + + **ClickhouseNode** + - **CPU** (int) - CPU大小 + - **ClusterId** (str) - 集群ID + - **CreateTimestamp** (int) - 创建时间 + - **DataDiskSize** (int) - 数据盘大小,GB + - **DataDiskType** (str) - 数据盘类型 + - **IPv4** (str) - ipv4 + - **MachineType** (str) - 机型 + - **Memory** (int) - 内存,GB + - **NodeId** (str) - 节点ID + - **NodeName** (str) - 节点名称 + - **ResourceId** (str) - 资源ID + - **ServiceStatus** (str) - 服务状态:RUNNING(运行中)、STARTING(启动中)、STOPPED(已停止)、RESTARTING(重启中) + - **ShardGroup** (str) - 分片组 + - **SysDiskSize** (int) - 系统盘大小,GB + - **SysDiskType** (str) - 系统盘类型 + - **Zone** (str) - 可用区名称 + + + **Payment** + - **ChargeType** (str) - 支付类型 + - **CreateTimestamp** (int) - 创建时间 + - **ExpireTimestamp** (int) - 过期时间 + - **OriginalPrice** (int) - 原始价格 + - **Price** (int) - 价格 + - **ResourceId** (str) - 资源ID + + + **ClickhouseCluster** + - **ClickhouseDataDiskSize** (int) - Clickhouse数据盘大小 + - **ClickhouseDataDiskType** (str) - Clickhouse数据盘类型 + - **ClickhouseMachineTypeId** (str) - Clickhouse机型ID + - **ClickhouseMachineTypeName** (str) - Clickhouse机型名称 + - **ClickhouseNodeCPU** (int) - Clickhouse节点CPU + - **ClickhouseNodeMemory** (int) - Clickhouse内存 + - **ClickhouseVersion** (str) - 集群版本 + - **ClusterId** (str) - 集群ID + - **ClusterName** (str) - 集群名称 + - **CreateTimestamp** (int) - 集群创建时间 + - **ExpireTimestamp** (float) - 实例过期时间 + - **IsBackup** (str) - 实例是否开启备份 + - **IsSecgroup** (str) - 实例是否开启安全组 + - **IsTieredStorage** (str) - 实例是否开启冷热分层 + - **IsZookeeperHA** (str) - Zookeeper是否高可用 + - **MachineType** (str) - 机型 + - **MultiZones** (list) - 实例所在可用区 + - **OrganizationId** (int) - 项目ID + - **RegionId** (int) - 地域ID + - **ReplicateCount** (int) - 副本数 + - **ShardCount** (int) - 分片数 + - **Status** (str) - 集群状态:CREATING(创建中)、RUNNING(运行中)、RESIZING(变配中)、RESTARTING(重启中)、UPGRADING(升级中)、DESTROYING(销毁中)、DESTROYED(已删除)、CREATE_FAILED(创建失败)、RESTART_FAILED(重启失败)、DESTROY_FAILED(删除失败)、RESIZE_FAILED(变配失败)、BACKUP_RESTORING(备份恢复中)、BACKUP_RESTORE_FAILED(备份恢复失败)、EXPANDING(扩容中)、EXPAND_FAILED(扩容失败) + - **SubnetId** (str) - 子网ID + - **TopOrganizationId** (int) - 公司ID + - **VPCId** (str) - VPCID + - **ZookeeperDataDiskSize** (int) - Zookeeper数据盘大小 + - **ZookeeperDataDiskType** (str) - Zookeeper数据盘类型 + - **ZookeeperMachineTypeId** (str) - Zookeeper机型ID + - **ZookeeperMachineTypeName** (str) - Zookeeper机型名称 + - **ZookeeperNodeCPU** (int) - Zookeeper节点CPU + - **ZookeeperNodeMemory** (int) - Zookeeper节点内存 + - **ZookeeperVersion** (str) - Zookeeper版本 + + + **DescribeUClickhouseClusterResponseData** + - **ClickhouseNodes** (list) - 见 **ClickhouseNode** 模型定义 + - **Cluster** (dict) - 见 **ClickhouseCluster** 模型定义 + - **Payment** (dict) - 见 **Payment** 模型定义 + - **ZookeeperNodes** (list) - 见 **ZookeeperNode** 模型定义 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUClickhouseClusterRequestSchema().dumps(d) + + resp = self.invoke("DescribeUClickhouseCluster", d, **kwargs) + return apis.DescribeUClickhouseClusterResponseSchema().loads(resp) + + def destroy_u_clickhouse_cluster( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DestroyUClickhouseCluster - 删除CK集群 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) 集群ID + + **Response** + + - **Message** (str) - 返回信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DestroyUClickhouseClusterRequestSchema().dumps(d) + + resp = self.invoke("DestroyUClickhouseCluster", d, **kwargs) + return apis.DestroyUClickhouseClusterResponseSchema().loads(resp) + + def expand_u_clickhouse_cluster( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ExpandUClickhouseCluster - 集群水平扩容 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) 集群ID + - **TotalNodeCount** (int) - (Required) 扩容后集群的节点数量,集群为高可用时,需要传入偶数个节点 + - **SyncNodeId** (str) - 水平扩容时,选择某一个原节点的ID,用于同步表结构/用户信息。不传递时,表示不同步表结构/用户信息,仅水平扩容节点数量 + + **Response** + + - **Message** (str) - 返回信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ExpandUClickhouseClusterRequestSchema().dumps(d) + + resp = self.invoke("ExpandUClickhouseCluster", d, **kwargs) + return apis.ExpandUClickhouseClusterResponseSchema().loads(resp) + + def get_u_clickhouse_cluster_create_option( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUClickhouseClusterCreateOption - 获取Clickhouse的创建配置项 + + **Request** + + - **ProjectId** (str) - (Config) 项目Id + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + + **Response** + + - **Data** (dict) - 见 **GetCreateUClickhouseClusterOptionResponseData** 模型定义 + - **Message** (str) - 返回信息 + + **Response Model** + + **ClickhouseDataDisk** + - **DefaultDataDiskSize** (int) - 默认大小,GB + - **DiskType** (str) - 磁盘类型 + - **MaxDiskSize** (int) - 最大值,GB + - **MinDiskSize** (int) - 最小值,GB + - **Step** (int) - 步长,GB + + + **ClickhouseMachineTypeOption** + - **CPU** (int) - CPU大小 + - **ClickhouseMachineTypeId** (str) - Clickhouse机型ID + - **DataDisks** (list) - 见 **ClickhouseDataDisk** 模型定义 + - **MachineType** (str) - 机型 + - **Memory** (int) - 内存大小,GB + - **NodeCounts** (list) - 允许创建的节点个数 + + + **ClickhouseMachineType** + - **ClickhouseMachineTypeName** (str) - CK机型名称 + - **ClickhouseMachineTypeOptions** (list) - 见 **ClickhouseMachineTypeOption** 模型定义 + - **IsSecgroupMachineType** (str) - 机型是否支持安全组 + + + **ClickhouseVersion** + - **Version** (str) - 版本号 + - **VersionName** (str) - 版本名称 + + + **GetCreateUClickhouseClusterOptionResponseData** + - **ClickhouseMachineTypes** (list) - 见 **ClickhouseMachineType** 模型定义 + - **ClickhouseVersions** (list) - 见 **ClickhouseVersion** 模型定义 + - **MaxNodeCount** (int) - 实例可创建的最大节点数量 + - **ZookeeperMachineTypes** (list) - 见 **ClickhouseMachineType** 模型定义 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUClickhouseClusterCreateOptionRequestSchema().dumps(d) + + resp = self.invoke("GetUClickhouseClusterCreateOption", d, **kwargs) + return apis.GetUClickhouseClusterCreateOptionResponseSchema().loads( + resp + ) + + def list_u_clickhouse_cluster( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUClickhouseCluster - 获取UClickhouse集群列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + + **Response** + + - **Data** (dict) - 见 **ListUClickhouseClusterResponseData** 模型定义 + - **Message** (str) - 返回信息 + + **Response Model** + + **ClickhouseCluster** + - **ClickhouseDataDiskSize** (int) - Clickhouse数据盘大小 + - **ClickhouseDataDiskType** (str) - Clickhouse数据盘类型 + - **ClickhouseMachineTypeId** (str) - Clickhouse机型ID + - **ClickhouseMachineTypeName** (str) - Clickhouse机型名称 + - **ClickhouseNodeCPU** (int) - Clickhouse节点CPU + - **ClickhouseNodeMemory** (int) - Clickhouse内存 + - **ClickhouseVersion** (str) - 集群版本 + - **ClusterId** (str) - 集群ID + - **ClusterName** (str) - 集群名称 + - **CreateTimestamp** (int) - 集群创建时间 + - **ExpireTimestamp** (float) - 实例过期时间 + - **IsBackup** (str) - 实例是否开启备份 + - **IsSecgroup** (str) - 实例是否开启安全组 + - **IsTieredStorage** (str) - 实例是否开启冷热分层 + - **IsZookeeperHA** (str) - Zookeeper是否高可用 + - **MachineType** (str) - 机型 + - **MultiZones** (list) - 实例所在可用区 + - **OrganizationId** (int) - 项目ID + - **RegionId** (int) - 地域ID + - **ReplicateCount** (int) - 副本数 + - **ShardCount** (int) - 分片数 + - **Status** (str) - 集群状态:CREATING(创建中)、RUNNING(运行中)、RESIZING(变配中)、RESTARTING(重启中)、UPGRADING(升级中)、DESTROYING(销毁中)、DESTROYED(已删除)、CREATE_FAILED(创建失败)、RESTART_FAILED(重启失败)、DESTROY_FAILED(删除失败)、RESIZE_FAILED(变配失败)、BACKUP_RESTORING(备份恢复中)、BACKUP_RESTORE_FAILED(备份恢复失败)、EXPANDING(扩容中)、EXPAND_FAILED(扩容失败) + - **SubnetId** (str) - 子网ID + - **TopOrganizationId** (int) - 公司ID + - **VPCId** (str) - VPCID + - **ZookeeperDataDiskSize** (int) - Zookeeper数据盘大小 + - **ZookeeperDataDiskType** (str) - Zookeeper数据盘类型 + - **ZookeeperMachineTypeId** (str) - Zookeeper机型ID + - **ZookeeperMachineTypeName** (str) - Zookeeper机型名称 + - **ZookeeperNodeCPU** (int) - Zookeeper节点CPU + - **ZookeeperNodeMemory** (int) - Zookeeper节点内存 + - **ZookeeperVersion** (str) - Zookeeper版本 + + + **ListUClickhouseClusterResponseData** + - **Clusters** (dict) - 见 **ClickhouseCluster** 模型定义 + - **TotalCount** (int) - 集群总数 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUClickhouseClusterRequestSchema().dumps(d) + + resp = self.invoke("ListUClickhouseCluster", d, **kwargs) + return apis.ListUClickhouseClusterResponseSchema().loads(resp) + + def resize_u_clickhouse_cluster( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ResizeUClickhouseCluster - 集群改配 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) 集群ID + - **IsZooKeeperNode** (bool) - 是否为zookeeper节点,为true时表示升级zookeeper节点规格,为false时表示升级clickhouse节点规格,默认为false + - **TargetDataDiskSize** (int) - 目标磁盘大小,单位GB,只能扩容,与TargetMachineTypeId不能同时为空 + - **TargetMachineTypeId** (str) - 目标机型ID,可通过GetUClickhouseClusterCreateOption接口获取具体值,与TargetDataDiskSize不能同时为空 + + **Response** + + - **Message** (str) - 返回信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ResizeUClickhouseClusterRequestSchema().dumps(d) + + resp = self.invoke("ResizeUClickhouseCluster", d, **kwargs) + return apis.ResizeUClickhouseClusterResponseSchema().loads(resp) + + def restart_u_clickhouse_cluster_service( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RestartUClickhouseClusterService - 重启集群的UClickhouse服务 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) 集群ID + + **Response** + + - **Message** (str) - 返回信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.RestartUClickhouseClusterServiceRequestSchema().dumps(d) + + resp = self.invoke("RestartUClickhouseClusterService", d, **kwargs) + return apis.RestartUClickhouseClusterServiceResponseSchema().loads(resp) diff --git a/ucloud/services/uclickhouse/schemas/__init__.py b/ucloud/services/uclickhouse/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/uclickhouse/schemas/apis.py b/ucloud/services/uclickhouse/schemas/apis.py new file mode 100644 index 00000000..0808ee63 --- /dev/null +++ b/ucloud/services/uclickhouse/schemas/apis.py @@ -0,0 +1,260 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.uclickhouse.schemas import models + +""" UClickhouse API Schema +""" + + +""" +API: CreateUClickhouseCluster + +创建UClickhouse集群 +""" + + +class CreateUClickhouseClusterParamLabelsSchema(schema.RequestSchema): + """CreateUClickhouseClusterParamLabels -""" + + fields = { + "Key": fields.Str(required=False, dump_to="Key"), + "Value": fields.Str(required=False, dump_to="Value"), + } + + +class CreateUClickhouseClusterRequestSchema(schema.RequestSchema): + """CreateUClickhouseCluster - 创建UClickhouse集群""" + + fields = { + "AdminPassword": fields.Str(required=True, dump_to="AdminPassword"), + "BackupId": fields.Str(required=False, dump_to="BackupId"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "ClickhouseMachineTypeId": fields.Str( + required=True, dump_to="ClickhouseMachineTypeId" + ), + "ClickhouseVersion": fields.Str( + required=True, dump_to="ClickhouseVersion" + ), + "ClusterName": fields.Str(required=False, dump_to="ClusterName"), + "DataDiskSize": fields.Int(required=False, dump_to="DataDiskSize"), + "DataDiskType": fields.Str(required=True, dump_to="DataDiskType"), + "IsMultiZone": fields.Str(required=False, dump_to="IsMultiZone"), + "IsSecGroup": fields.Str(required=False, dump_to="IsSecGroup"), + "IsZookeeperHA": fields.Bool(required=False, dump_to="IsZookeeperHA"), + "Labels": fields.List(CreateUClickhouseClusterParamLabelsSchema()), + "MultiZones": fields.List(fields.Str()), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "ReplicateCount": fields.Int(required=False, dump_to="ReplicateCount"), + "SecGroupIds": fields.Str(required=False, dump_to="SecGroupIds"), + "ShardCount": fields.Int(required=False, dump_to="ShardCount"), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + "ZookeeperDataDiskSize": fields.Str( + required=False, dump_to="ZookeeperDataDiskSize" + ), + "ZookeeperDataDiskType": fields.Str( + required=False, dump_to="ZookeeperDataDiskType" + ), + "ZookeeperMachineTypeId": fields.Str( + required=False, dump_to="ZookeeperMachineTypeId" + ), + } + + +class CreateUClickhouseClusterResponseSchema(schema.ResponseSchema): + """CreateUClickhouseCluster - 创建UClickhouse集群""" + + fields = { + "Data": models.CreateUClickhouseClusterResponseDataSchema(), + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: DescribeUClickhouseCluster + +获取集群信息 +""" + + +class DescribeUClickhouseClusterRequestSchema(schema.RequestSchema): + """DescribeUClickhouseCluster - 获取集群信息""" + + fields = { + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DescribeUClickhouseClusterResponseSchema(schema.ResponseSchema): + """DescribeUClickhouseCluster - 获取集群信息""" + + fields = { + "Data": models.DescribeUClickhouseClusterResponseDataSchema(), + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: DestroyUClickhouseCluster + +删除CK集群 +""" + + +class DestroyUClickhouseClusterRequestSchema(schema.RequestSchema): + """DestroyUClickhouseCluster - 删除CK集群""" + + fields = { + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DestroyUClickhouseClusterResponseSchema(schema.ResponseSchema): + """DestroyUClickhouseCluster - 删除CK集群""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: ExpandUClickhouseCluster + +集群水平扩容 +""" + + +class ExpandUClickhouseClusterRequestSchema(schema.RequestSchema): + """ExpandUClickhouseCluster - 集群水平扩容""" + + fields = { + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SyncNodeId": fields.Str(required=False, dump_to="SyncNodeId"), + "TotalNodeCount": fields.Int(required=True, dump_to="TotalNodeCount"), + } + + +class ExpandUClickhouseClusterResponseSchema(schema.ResponseSchema): + """ExpandUClickhouseCluster - 集群水平扩容""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: GetUClickhouseClusterCreateOption + +获取Clickhouse的创建配置项 +""" + + +class GetUClickhouseClusterCreateOptionRequestSchema(schema.RequestSchema): + """GetUClickhouseClusterCreateOption - 获取Clickhouse的创建配置项""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class GetUClickhouseClusterCreateOptionResponseSchema(schema.ResponseSchema): + """GetUClickhouseClusterCreateOption - 获取Clickhouse的创建配置项""" + + fields = { + "Data": models.GetCreateUClickhouseClusterOptionResponseDataSchema(), + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: ListUClickhouseCluster + +获取UClickhouse集群列表 +""" + + +class ListUClickhouseClusterRequestSchema(schema.RequestSchema): + """ListUClickhouseCluster - 获取UClickhouse集群列表""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class ListUClickhouseClusterResponseSchema(schema.ResponseSchema): + """ListUClickhouseCluster - 获取UClickhouse集群列表""" + + fields = { + "Data": models.ListUClickhouseClusterResponseDataSchema(), + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: ResizeUClickhouseCluster + +集群改配 +""" + + +class ResizeUClickhouseClusterRequestSchema(schema.RequestSchema): + """ResizeUClickhouseCluster - 集群改配""" + + fields = { + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "IsZooKeeperNode": fields.Bool( + required=False, dump_to="IsZooKeeperNode" + ), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "TargetDataDiskSize": fields.Int( + required=False, dump_to="TargetDataDiskSize" + ), + "TargetMachineTypeId": fields.Str( + required=False, dump_to="TargetMachineTypeId" + ), + } + + +class ResizeUClickhouseClusterResponseSchema(schema.ResponseSchema): + """ResizeUClickhouseCluster - 集群改配""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: RestartUClickhouseClusterService + +重启集群的UClickhouse服务 +""" + + +class RestartUClickhouseClusterServiceRequestSchema(schema.RequestSchema): + """RestartUClickhouseClusterService - 重启集群的UClickhouse服务""" + + fields = { + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class RestartUClickhouseClusterServiceResponseSchema(schema.ResponseSchema): + """RestartUClickhouseClusterService - 重启集群的UClickhouse服务""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } diff --git a/ucloud/services/uclickhouse/schemas/models.py b/ucloud/services/uclickhouse/schemas/models.py new file mode 100644 index 00000000..307d250c --- /dev/null +++ b/ucloud/services/uclickhouse/schemas/models.py @@ -0,0 +1,239 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class CreateUClickhouseClusterResponseDataSchema(schema.ResponseSchema): + """CreateUClickhouseClusterResponseData -""" + + fields = { + "ClusterId": fields.Str(required=True, load_from="ClusterId"), + } + + +class ClickhouseNodeSchema(schema.ResponseSchema): + """ClickhouseNode -""" + + fields = { + "CPU": fields.Int(required=True, load_from="CPU"), + "ClusterId": fields.Str(required=True, load_from="ClusterId"), + "CreateTimestamp": fields.Int( + required=True, load_from="CreateTimestamp" + ), + "DataDiskSize": fields.Int(required=True, load_from="DataDiskSize"), + "DataDiskType": fields.Str(required=True, load_from="DataDiskType"), + "IPv4": fields.Str(required=True, load_from="IPv4"), + "MachineType": fields.Str(required=True, load_from="MachineType"), + "Memory": fields.Int(required=True, load_from="Memory"), + "NodeId": fields.Str(required=True, load_from="NodeId"), + "NodeName": fields.Str(required=True, load_from="NodeName"), + "ResourceId": fields.Str(required=True, load_from="ResourceId"), + "ServiceStatus": fields.Str(required=True, load_from="ServiceStatus"), + "ShardGroup": fields.Str(required=True, load_from="ShardGroup"), + "SysDiskSize": fields.Int(required=True, load_from="SysDiskSize"), + "SysDiskType": fields.Str(required=True, load_from="SysDiskType"), + "Zone": fields.Str(required=True, load_from="Zone"), + } + + +class ClickhouseClusterSchema(schema.ResponseSchema): + """ClickhouseCluster -""" + + fields = { + "ClickhouseDataDiskSize": fields.Int( + required=True, load_from="ClickhouseDataDiskSize" + ), + "ClickhouseDataDiskType": fields.Str( + required=True, load_from="ClickhouseDataDiskType" + ), + "ClickhouseMachineTypeId": fields.Str( + required=True, load_from="ClickhouseMachineTypeId" + ), + "ClickhouseMachineTypeName": fields.Str( + required=True, load_from="ClickhouseMachineTypeName" + ), + "ClickhouseNodeCPU": fields.Int( + required=True, load_from="ClickhouseNodeCPU" + ), + "ClickhouseNodeMemory": fields.Int( + required=True, load_from="ClickhouseNodeMemory" + ), + "ClickhouseVersion": fields.Str( + required=True, load_from="ClickhouseVersion" + ), + "ClusterId": fields.Str(required=True, load_from="ClusterId"), + "ClusterName": fields.Str(required=True, load_from="ClusterName"), + "CreateTimestamp": fields.Int( + required=True, load_from="CreateTimestamp" + ), + "ExpireTimestamp": fields.Float( + required=True, load_from="ExpireTimestamp" + ), + "IsBackup": fields.Str(required=True, load_from="IsBackup"), + "IsSecgroup": fields.Str(required=True, load_from="IsSecgroup"), + "IsTieredStorage": fields.Str( + required=True, load_from="IsTieredStorage" + ), + "IsZookeeperHA": fields.Str(required=True, load_from="IsZookeeperHA"), + "MachineType": fields.Str(required=True, load_from="MachineType"), + "MultiZones": fields.List(fields.Str()), + "OrganizationId": fields.Int(required=True, load_from="OrganizationId"), + "RegionId": fields.Int(required=True, load_from="RegionId"), + "ReplicateCount": fields.Int(required=True, load_from="ReplicateCount"), + "ShardCount": fields.Int(required=True, load_from="ShardCount"), + "Status": fields.Str(required=True, load_from="Status"), + "SubnetId": fields.Str(required=True, load_from="SubnetId"), + "TopOrganizationId": fields.Int( + required=True, load_from="TopOrganizationId" + ), + "VPCId": fields.Str(required=True, load_from="VPCId"), + "ZookeeperDataDiskSize": fields.Int( + required=True, load_from="ZookeeperDataDiskSize" + ), + "ZookeeperDataDiskType": fields.Str( + required=True, load_from="ZookeeperDataDiskType" + ), + "ZookeeperMachineTypeId": fields.Str( + required=True, load_from="ZookeeperMachineTypeId" + ), + "ZookeeperMachineTypeName": fields.Str( + required=True, load_from="ZookeeperMachineTypeName" + ), + "ZookeeperNodeCPU": fields.Int( + required=True, load_from="ZookeeperNodeCPU" + ), + "ZookeeperNodeMemory": fields.Int( + required=True, load_from="ZookeeperNodeMemory" + ), + "ZookeeperVersion": fields.Str( + required=True, load_from="ZookeeperVersion" + ), + } + + +class PaymentSchema(schema.ResponseSchema): + """Payment -""" + + fields = { + "ChargeType": fields.Str(required=True, load_from="ChargeType"), + "CreateTimestamp": fields.Int( + required=True, load_from="CreateTimestamp" + ), + "ExpireTimestamp": fields.Int( + required=True, load_from="ExpireTimestamp" + ), + "OriginalPrice": fields.Int(required=True, load_from="OriginalPrice"), + "Price": fields.Int(required=True, load_from="Price"), + "ResourceId": fields.Str(required=True, load_from="ResourceId"), + } + + +class ZookeeperNodeSchema(schema.ResponseSchema): + """ZookeeperNode -""" + + fields = { + "CPU": fields.Int(required=True, load_from="CPU"), + "ClusterId": fields.Str(required=True, load_from="ClusterId"), + "CreateTimestamp": fields.Int( + required=True, load_from="CreateTimestamp" + ), + "DataDiskSize": fields.Int(required=True, load_from="DataDiskSize"), + "DataDiskType": fields.Str(required=True, load_from="DataDiskType"), + "MachineType": fields.Str(required=True, load_from="MachineType"), + "Memory": fields.Int(required=True, load_from="Memory"), + "NodeId": fields.Str(required=True, load_from="NodeId"), + "NodeName": fields.Str(required=True, load_from="NodeName"), + "ResourceId": fields.Str(required=True, load_from="ResourceId"), + "ServiceStatus": fields.Str(required=True, load_from="ServiceStatus"), + "SysDiskSize": fields.Int(required=True, load_from="SysDiskSize"), + "SysDiskType": fields.Str(required=True, load_from="SysDiskType"), + "Zone": fields.Str(required=True, load_from="Zone"), + "ZookeeperMyId": fields.Str(required=True, load_from="ZookeeperMyId"), + } + + +class DescribeUClickhouseClusterResponseDataSchema(schema.ResponseSchema): + """DescribeUClickhouseClusterResponseData -""" + + fields = { + "ClickhouseNodes": fields.List(ClickhouseNodeSchema()), + "Cluster": ClickhouseClusterSchema(), + "Payment": PaymentSchema(), + "ZookeeperNodes": fields.List(ZookeeperNodeSchema()), + } + + +class ClickhouseDataDiskSchema(schema.ResponseSchema): + """ClickhouseDataDisk -""" + + fields = { + "DefaultDataDiskSize": fields.Int( + required=True, load_from="DefaultDataDiskSize" + ), + "DiskType": fields.Str(required=True, load_from="DiskType"), + "MaxDiskSize": fields.Int(required=True, load_from="MaxDiskSize"), + "MinDiskSize": fields.Int(required=True, load_from="MinDiskSize"), + "Step": fields.Int(required=True, load_from="Step"), + } + + +class ClickhouseVersionSchema(schema.ResponseSchema): + """ClickhouseVersion -""" + + fields = { + "Version": fields.Str(required=True, load_from="Version"), + "VersionName": fields.Str(required=True, load_from="VersionName"), + } + + +class ClickhouseMachineTypeOptionSchema(schema.ResponseSchema): + """ClickhouseMachineTypeOption -""" + + fields = { + "CPU": fields.Int(required=True, load_from="CPU"), + "ClickhouseMachineTypeId": fields.Str( + required=True, load_from="ClickhouseMachineTypeId" + ), + "DataDisks": fields.List(ClickhouseDataDiskSchema()), + "MachineType": fields.Str(required=True, load_from="MachineType"), + "Memory": fields.Int(required=True, load_from="Memory"), + "NodeCounts": fields.List(fields.Int()), + } + + +class ClickhouseMachineTypeSchema(schema.ResponseSchema): + """ClickhouseMachineType -""" + + fields = { + "ClickhouseMachineTypeName": fields.Str( + required=True, load_from="ClickhouseMachineTypeName" + ), + "ClickhouseMachineTypeOptions": fields.List( + ClickhouseMachineTypeOptionSchema() + ), + "IsSecgroupMachineType": fields.Str( + required=True, load_from="IsSecgroupMachineType" + ), + } + + +class GetCreateUClickhouseClusterOptionResponseDataSchema( + schema.ResponseSchema +): + """GetCreateUClickhouseClusterOptionResponseData -""" + + fields = { + "ClickhouseMachineTypes": fields.List(ClickhouseMachineTypeSchema()), + "ClickhouseVersions": fields.List(ClickhouseVersionSchema()), + "MaxNodeCount": fields.Int(required=True, load_from="MaxNodeCount"), + "ZookeeperMachineTypes": fields.List(ClickhouseMachineTypeSchema()), + } + + +class ListUClickhouseClusterResponseDataSchema(schema.ResponseSchema): + """ListUClickhouseClusterResponseData -""" + + fields = { + "Clusters": ClickhouseClusterSchema(), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } diff --git a/ucloud/services/ucloudstack/client.py b/ucloud/services/ucloudstack/client.py index f5f3d20a..3ddc0331 100644 --- a/ucloud/services/ucloudstack/client.py +++ b/ucloud/services/ucloudstack/client.py @@ -16,7 +16,7 @@ def __init__( ) def allocate_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ AllocateEIP - 申请外网IP + """AllocateEIP - 申请外网IP **Request** @@ -26,13 +26,15 @@ def allocate_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **Name** (str) - (Required) 名称 - **OperatorName** (str) - (Required) 线路。目前支持Bgp - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; + - **IP** (str) - 指定IP + - **IPVersion** (str) - IP版本,默认值IPv4,支持值:IPv4\IPv6 - **Quantity** (int) - 购买时长。默认值1。小时不生效,月范围【1,11】,年范围【1,5】。 - + **Response** - **EIPID** (str) - 申请的EIP的ID - **Message** (str) - 返回信息描述。 - + """ # build request d = { @@ -45,7 +47,7 @@ def allocate_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: return apis.AllocateEIPResponseSchema().loads(resp) def attach_disk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ AttachDisk - 绑定硬盘 + """AttachDisk - 绑定硬盘 **Request** @@ -54,11 +56,11 @@ def attach_disk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **ResourceID** (str) - (Required) 绑定的资源ID - **ResourceType** (str) - (Required) 绑定的资源类型,枚举值:VM,标识虚拟机 - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述。 - + """ # build request d = { @@ -70,10 +72,35 @@ def attach_disk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: resp = self.invoke("AttachDisk", d, **kwargs) return apis.AttachDiskResponseSchema().loads(resp) + def attach_nic(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """AttachNIC - 绑定UCloudStack网卡 + + **Request** + + - **Region** (str) - (Config) 地域。枚举值:cn,表示中国; + - **NICID** (str) - (Required) 网卡ID + - **ResourceID** (str) - (Required) 绑定的资源ID + - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; + + **Response** + + - **Message** (str) - 返回信息描述。 + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.AttachNICRequestSchema().dumps(d) + + resp = self.invoke("AttachNIC", d, **kwargs) + return apis.AttachNICResponseSchema().loads(resp) + def bind_alarm_template( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ BindAlarmTemplate - 绑定告警模板 + """BindAlarmTemplate - 绑定告警模板 **Request** @@ -82,11 +109,11 @@ def bind_alarm_template( - **ResourceIDs** (list) - (Required) 【数组】告警模板ID。调用方式举例:ResourceIDs.0=“one-id”、ResourceIDs.1=“two-id”。 - **ResourceType** (str) - (Required) 资源类型。VM:虚拟机, LB:负载均衡, NATGW:nat网关;EIP:弹性IP - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述 - + """ # build request d = { @@ -99,7 +126,7 @@ def bind_alarm_template( return apis.BindAlarmTemplateResponseSchema().loads(resp) def bind_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ BindEIP - 绑定UCoudStack外网IP + """BindEIP - 绑定外网 IP **Request** @@ -108,11 +135,11 @@ def bind_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **ResourceID** (str) - (Required) 资源ID - **ResourceType** (str) - (Required) 资源类型。VM:虚拟机, LB:负载均衡, NATGW:nat网关 - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回描述 - + """ # build request d = { @@ -127,7 +154,7 @@ def bind_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def bind_physical_ip( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ BindPhysicalIP - 绑定物理 IP ,被绑定的资源必须处于运行中或有效状态。 + """BindPhysicalIP - 绑定物理 IP ,被绑定的资源必须处于运行中或有效状态。 **Request** @@ -136,11 +163,11 @@ def bind_physical_ip( - **ResourceID** (str) - (Required) 资源ID - **ResourceType** (str) - (Required) 资源类型。VM:虚拟机 - **Zone** (str) - (Required) 可用区。 - + **Response** - **Message** (str) - 返回描述 - + """ # build request d = { @@ -155,7 +182,7 @@ def bind_physical_ip( def bind_security_group( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ BindSecurityGroup - 绑定安全组 + """BindSecurityGroup - 绑定安全组 **Request** @@ -163,12 +190,12 @@ def bind_security_group( - **ResourceID** (str) - (Required) 绑定的资源ID。调用方式举例:ResourceID=“one-id”。 - **SGID** (str) - (Required) 安全组ID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - - **NICID** (str) - 网卡ID - + - **NICType** (str) - 网卡类型,玫举值:WAN,外网;LAN,内网,默认为WAN + **Response** - **Message** (str) - 返回信息描述 - + """ # build request d = { @@ -181,7 +208,7 @@ def bind_security_group( return apis.BindSecurityGroupResponseSchema().loads(resp) def clone_disk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ CloneDisk - 克隆硬盘 + """CloneDisk - 克隆硬盘 **Request** @@ -191,12 +218,12 @@ def clone_disk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **SrcID** (str) - (Required) 源硬盘ID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - **Quantity** (int) - 购买时长。默认值1。小时不生效,月范围【1,11】,年范围【1,5】。 - + **Response** - **DiskID** (str) - 克隆出的硬盘ID - **Message** (str) - 返回信息描述。 - + """ # build request d = { @@ -211,23 +238,23 @@ def clone_disk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def create_certificate( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateCertificate - 创建证书 + """CreateCertificate - 创建证书 **Request** - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Certificate** (str) - (Required) 证书内容 - **CertificateType** (str) - (Required) 证书类型,枚举值["ServerCrt","CACrt"]。分别表示服务器证书和CA证书。只有在双向认证的时候才需要CA证书 - **Name** (str) - (Required) 证书名称 - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - **PrivateKey** (str) - 私钥内容,服务器证书必传,CA证书不用传递 - **Remark** (str) - 证书描述 - + **Response** - **CertificateID** (str) - 证书ID - **Message** (str) - 错误描述 - + """ # build request d = { @@ -242,7 +269,7 @@ def create_certificate( def create_custom_image( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateCustomImage - 创建自制镜像 + """CreateCustomImage - 创建自制镜像 **Request** @@ -251,12 +278,12 @@ def create_custom_image( - **VMID** (str) - (Required) 虚拟机ID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - **ImageDescription** (str) - 镜像描述。 - + **Response** - **ImageID** (str) - 创建的自制镜像ID - **Message** (str) - 返回信息描述。 - + """ # build request d = { @@ -269,7 +296,7 @@ def create_custom_image( return apis.CreateCustomImageResponseSchema().loads(resp) def create_disk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ CreateDisk - 创建硬盘 + """CreateDisk - 创建硬盘 **Request** @@ -280,12 +307,12 @@ def create_disk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **SetType** (str) - (Required) 磁盘类型。例如:Normal,SSD - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - **Quantity** (int) - 购买时长。默认值1。小时不生效,月范围【1,11】,年范围【1,5】。 - + **Response** - **DiskID** (str) - 创建的磁盘ID - **Message** (str) - 返回信息描述。 - + """ # build request d = { @@ -298,7 +325,7 @@ def create_disk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: return apis.CreateDiskResponseSchema().loads(resp) def create_lb(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ CreateLB - 创建负载均衡 + """CreateLB - 创建负载均衡 **Request** @@ -314,12 +341,12 @@ def create_lb(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **Quantity** (int) - 购买时长。默认值1。小时不生效,月范围【1,11】,年范围【1,5】。 - **Remark** (str) - 描述。 - **SGID** (str) - 安全组ID,创建外网LB时为必需 - + **Response** - **LBID** (str) - 返回创建的负载均衡ID - **Message** (str) - 返回信息描述。 - + """ # build request d = { @@ -332,7 +359,7 @@ def create_lb(self, req: typing.Optional[dict] = None, **kwargs) -> dict: return apis.CreateLBResponseSchema().loads(resp) def create_natgw(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ CreateNATGW - 创建NAT网关 + """CreateNATGW - 创建NAT网关 **Request** @@ -347,12 +374,12 @@ def create_natgw(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - **Quantity** (int) - 购买时长。默认值1。小时不生效,月范围【1,11】,年范围【1,5】。 - **Remark** (str) - 描述 - + **Response** - **Message** (str) - 返回信息描述。 - **NATGWID** (str) - 返回创建的NAT网关ID - + """ # build request d = { @@ -367,7 +394,7 @@ def create_natgw(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def create_natgw_rule( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateNATGWRule - 添加NAT网关白名单 + """CreateNATGWRule - 添加NAT网关白名单 **Request** @@ -376,12 +403,12 @@ def create_natgw_rule( - **NATGWID** (str) - (Required) NAT网关ID - **NATGWType** (str) - (Required) NAT的类型。枚举值:SNAT,DNAT - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述。 - **RuleID** (str) - 白名单ID - + """ # build request d = { @@ -393,10 +420,39 @@ def create_natgw_rule( resp = self.invoke("CreateNATGWRule", d, **kwargs) return apis.CreateNATGWRuleResponseSchema().loads(resp) + def create_nic(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """CreateNIC - 创建网卡 + + **Request** + + - **Region** (str) - (Config) 地域。枚举值:cn,表示中国; + - **Name** (str) - (Required) 名称 + - **SubnetID** (str) - (Required) Subnet ID + - **VPCID** (str) - (Required) VPC ID + - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; + - **IP** (str) - 指定IP + - **SGID** (str) - 安全组 ID + + **Response** + + - **Message** (str) - 返回信息描述。 + - **NICID** (str) - 创建的网卡 ID + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateNICRequestSchema().dumps(d) + + resp = self.invoke("CreateNIC", d, **kwargs) + return apis.CreateNICResponseSchema().loads(resp) + def create_physical_ip( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreatePhysicalIP - 创建物理 IP ,需确保平台已配置物理 IP 线路相关信息及物理网络联通性。 + """CreatePhysicalIP - 创建物理 IP ,需确保平台已配置物理 IP 线路相关信息及物理网络联通性。 **Request** @@ -405,12 +461,12 @@ def create_physical_ip( - **OperatorName** (str) - (Required) 物理IP线路 - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - **Remark** (str) - 描述 - + **Response** - **Message** (str) - 返回信息描述 - **PhysicalIPID** (str) - 返回创建的物理IP的ID - + """ # build request d = { @@ -423,7 +479,7 @@ def create_physical_ip( return apis.CreatePhysicalIPResponseSchema().loads(resp) def create_rs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ CreateRS - 为负载均衡的 VServer 添加后端服务节点。 + """CreateRS - 为负载均衡的 VServer 添加后端服务节点。 **Request** @@ -434,12 +490,12 @@ def create_rs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **VSID** (str) - (Required) VServer的ID - **Weight** (int) - (Required) 服务节点的权重 - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述。 - **RSID** (str) - 返回创建的RSID - + """ # build request d = { @@ -454,7 +510,7 @@ def create_rs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def create_security_group( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateSecurityGroup - 创建安全组 + """CreateSecurityGroup - 创建安全组 **Request** @@ -463,12 +519,12 @@ def create_security_group( - **Rule** (list) - (Required) 【数组】安全组规则。输入有效的规则,调用方式举例:Rule.0=“TCP|23|0.0.0.0/0|ACCEPT|HIGH|1”、Rule.1=“TCP|55|0.0.0.0/0|ACCEPT|HIGH|1” - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - **Remark** (str) - 描述; - + **Response** - **Message** (str) - 返回信息描述; - **SGID** (str) - 创建的安全组ID - + """ # build request d = { @@ -483,7 +539,7 @@ def create_security_group( def create_security_group_rule( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateSecurityGroupRule - 创建安全组规则 + """CreateSecurityGroupRule - 创建安全组规则 **Request** @@ -491,12 +547,12 @@ def create_security_group_rule( - **Rules** (list) - (Required) 【数组】安全组规则。输入有效的规则,调用方式举例:Rule.0=“TCP|23|0.0.0.0/0|ACCEPT|HIGH|1”、Rule.1=“TCP|55|0.0.0.0/0|ACCEPT|HIGH|1” - **SGID** (str) - (Required) 安全组ID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述; - **SGRuleID** (str) - 创建的安全组规则ID - + """ # build request d = { @@ -511,7 +567,7 @@ def create_security_group_rule( def create_snapshot( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateSnapshot - 创建硬盘快照 + """CreateSnapshot - 创建硬盘快照 **Request** @@ -520,12 +576,12 @@ def create_snapshot( - **Name** (str) - (Required) 快照名称,限制字符长度30 - **Zone** (str) - (Required) 可用区。枚举值:如 zone-01,表示可用区1。 - **Remark** (str) - 描述,限制字符长度100 - + **Response** - **Message** (str) - 返回信息描述 - **SnapshotID** (str) - 创建的快照ID - + """ # build request d = { @@ -540,7 +596,7 @@ def create_snapshot( def create_subnet( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateSubnet - 创建子网 + """CreateSubnet - 创建子网 **Request** @@ -550,12 +606,12 @@ def create_subnet( - **VPCID** (str) - (Required) 所属VPCID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - **Remark** (str) - 描述; - + **Response** - **Message** (str) - 返回信息描述; - **SubnetID** (str) - 创建Subnet的ID; - + """ # build request d = { @@ -568,18 +624,18 @@ def create_subnet( return apis.CreateSubnetResponseSchema().loads(resp) def create_user(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ CreateUser - 管理员添加账号 + """CreateUser - 管理员添加账号 **Request** - **PassWord** (str) - (Required) 账号密码。 - **UserEmail** (str) - (Required) 账号邮箱。 - + **Response** - **Message** (str) - 返回信息描述。 - **UserID** (int) - 账户ID - + """ # build request d = {} @@ -592,11 +648,11 @@ def create_user(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def create_vm_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateVMInstance - 创建虚拟机 + """CreateVMInstance - 创建虚拟机 **Request** - - **Region** (str) - (Config) 地域。枚举值:cn,表示中国; + - **Region** (str) - (Config) 地域或数据中心。枚举值:cn,表示中国; - **BootDiskSetType** (str) - (Required) 系统盘类型。枚举值:Normal,表示普通;SSD,表示SSD; - **CPU** (int) - (Required) CPU个数,如1,2,4,8,16,32,64等。 - **ChargeType** (str) - (Required) 计费模式。枚举值:Dynamic,表示小时;Month,表示月;Year,表示年; @@ -605,28 +661,28 @@ def create_vm_instance( - **Memory** (int) - (Required) 内存容量,如1024,2048,4096,8192,16384,32768,65535等。 - **Name** (str) - (Required) 虚拟机名称。可输入如:myVM。名称只能包含中英文、数字以及- _ .且1-30个字符。 - **Password** (str) - (Required) 密码。可输入如:ucloud.cn。密码长度限6-30个字符;需要同时包含两项或以上(大写字母/小写字母/数字/特殊符号);windows不能包含用户名(administrator)中超过2个连续字符的部分。 - - **SubnetID** (str) - (Required) 子网 ID。 - - **VMType** (str) - (Required) 机型。枚举值:Normal,表示普通;SSD,表示SSD; - - **VPCID** (str) - (Required) VPC ID。 + - **SubnetID** (str) - (Required) 虚拟机所属子网 ID。 + - **VMType** (str) - (Required) 虚拟机所在宿主机的集群类型,代表不同架构、不同型号的 CPU 或硬件特征。枚举值:Normal,表示普通;SSD,表示SSD。 + - **VPCID** (str) - (Required) 虚拟机所属 VPC ID。 - **WANSGID** (str) - (Required) 外网安全组 ID。输入“有效”状态的安全组的ID。 - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - - **Bandwidth** (str) - 带宽 + - **Bandwidth** (str) - 创建虚拟机同时绑定外网 IP 的带宽。 - **DataDiskSpace** (int) - 数据盘大小,单位 GB。默认值为0。范围:【0,8000】,步长10。 - **GPU** (int) - GPU 卡核心的占用个数。枚举值:【1,2,4】。GPU与CPU、内存大小关系:CPU个数>=4*GPU个数,同时内存与CPU规格匹配. - - **IPVersion** (str) - 外网IP版本,默认IPv4 - - **InternalIP** (str) - 指定内网IP。输入有效的指定内网 IP。默认为系统自动分配内网 IP。 - - **InternetIP** (str) - 指定外网IP + - **IPVersion** (str) - 创建虚拟机同时绑定外网 IP 的 IP 版本。枚举值:IPv4 & IPv6,默认为 IPv4 + - **InternalIP** (str) - 指定内网IP。输入有效的指定内网 IP,不指定时系统将自动从子网分配 IP 地址。 + - **InternetIP** (str) - 手动指定虚拟机绑定外网 IP 的地址,IP地址必须包含在网段内。 - **LANSGID** (str) - 内网安全组 ID。输入“有效”状态的安全组的ID。 - - **OperatorName** (str) - 线路 + - **OperatorName** (str) - 创建虚拟机同时绑定外网 IP 的网段,可由管理员自定义。 - **Quantity** (int) - 购买时长。默认值1。小时不生效,月范围【1,11】,年范围【1,5】。 - + **Response** - - **DiskID** (str) - 返回创建数据盘的 ID - - **EIPID** (str) - 返回创建外网IP的 ID + - **DiskID** (str) - 返回同时创建的数据盘 ID + - **EIPID** (str) - 返回同时创建的外网IP ID - **Message** (str) - 返回信息描述。 - - **VMID** (str) - 返回创建虚拟机的 ID - + - **VMID** (str) - 返回创建的虚拟机 ID + """ # build request d = { @@ -639,7 +695,7 @@ def create_vm_instance( return apis.CreateVMInstanceResponseSchema().loads(resp) def create_vpc(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ CreateVPC - 创建VPC + """CreateVPC - 创建VPC **Request** @@ -648,12 +704,12 @@ def create_vpc(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **Network** (str) - (Required) 网段。例如:10.0.0.0/16; - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - **Remark** (str) - 描述; - + **Response** - **Message** (str) - 返回信息描述; - **VPCID** (str) - 创建的VPCID; - + """ # build request d = { @@ -666,7 +722,7 @@ def create_vpc(self, req: typing.Optional[dict] = None, **kwargs) -> dict: return apis.CreateVPCResponseSchema().loads(resp) def create_vs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ CreateVS - 创建负载均衡VServer + """CreateVS - 创建负载均衡VServer **Request** @@ -685,12 +741,14 @@ def create_vs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **PersistenceType** (str) - 会话保持类型。枚举值:None:关闭;Auto:自动生成;Manual:手动生成 。当协议为 TCP 时,该值不生效,会话保持和选择的调度算法相关;当协议为 UDP 时 Auto 表示开启会话保持 。 - **SSLMode** (str) - SSL认证模式,HTTPS协议下必传,取值范围["simplex","duplex"]分别表示单向认证和双向认证。 - **ServerCertificateID** (str) - 服务器证书ID,用于证明服务器的身份,仅当 VServer监听协议为 HTTPS时有效。 - + **Response** + - **Action** (str) - 操作名称 - **Message** (str) - 返回信息描述。 + - **RetCode** (int) - 返回码 - **VSID** (str) - 返回创建的VSID - + """ # build request d = { @@ -705,7 +763,7 @@ def create_vs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def create_vs_policy( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateVSPolicy - 创建七层负载均衡内容转发规则,仅当 VServer 的监听协议为 HTTP 时有效。 + """CreateVSPolicy - 创建七层负载均衡内容转发规则,仅当 VServer 的监听协议为 HTTP 时有效。 **Request** @@ -716,12 +774,12 @@ def create_vs_policy( - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - **Domain** (str) - 内容转发规则关联的请求域名,值可为空,即代表仅匹配路径。域名和路径至少需要指定一项,且域名和路径的组合在一个 VServer 中必须唯一。 - **Path** (str) - 内容转发规则关联的请求访问路径,如 "/" 。域名和路径至少需要指定一项,且域名和路径的组合在一个 VServer 中必须唯一。 - + **Response** - **Message** (str) - 返回信息描述。 - **PolicyID** (str) - 返回创建的内容转发规则ID - + """ # build request d = { @@ -736,18 +794,18 @@ def create_vs_policy( def delete_certificate( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeleteCertificate - 删除证书 + """DeleteCertificate - 删除证书 **Request** - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **CertificateID** (str) - (Required) 证书ID - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + **Response** - **Message** (str) - 返回信息描述 - + """ # build request d = { @@ -762,18 +820,18 @@ def delete_certificate( def delete_custom_image( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeleteCustomImage - 删除自制镜像 + """DeleteCustomImage - 删除自制镜像 **Request** - **Region** (str) - (Config) 地域。枚举值:cn,表示中国; - **ImageID** (str) - (Required) 自制镜像ID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述。 - + """ # build request d = { @@ -786,18 +844,18 @@ def delete_custom_image( return apis.DeleteCustomImageResponseSchema().loads(resp) def delete_disk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ DeleteDisk - 删除硬盘 + """DeleteDisk - 删除硬盘 **Request** - **Region** (str) - (Config) 地域。枚举值:cn,表示中国; - **DiskID** (str) - (Required) 被删除的硬盘ID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述。 - + """ # build request d = { @@ -810,18 +868,18 @@ def delete_disk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: return apis.DeleteDiskResponseSchema().loads(resp) def delete_lb(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ DeleteLB - 删除负载均衡 + """DeleteLB - 删除负载均衡 **Request** - **Region** (str) - (Config) 地域。枚举值:cn,表示中国; - **LBID** (str) - (Required) 负载均衡ID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述。 - + """ # build request d = { @@ -834,18 +892,18 @@ def delete_lb(self, req: typing.Optional[dict] = None, **kwargs) -> dict: return apis.DeleteLBResponseSchema().loads(resp) def delete_natgw(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ DeleteNATGW - 删除NAT网关 + """DeleteNATGW - 删除NAT网关 **Request** - **Region** (str) - (Config) 地域。枚举值:cn,表示中国; - **NATGWID** (str) - (Required) NAT网关ID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述。 - + """ # build request d = { @@ -860,7 +918,7 @@ def delete_natgw(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def delete_natgw_rule( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeleteNATGWRule - 删除NAT网关白名单 + """DeleteNATGWRule - 删除NAT网关白名单 **Request** @@ -868,11 +926,11 @@ def delete_natgw_rule( - **NATGWID** (str) - (Required) nat网关ID - **RuleID** (str) - (Required) 白名单ID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述。 - + """ # build request d = { @@ -884,21 +942,45 @@ def delete_natgw_rule( resp = self.invoke("DeleteNATGWRule", d, **kwargs) return apis.DeleteNATGWRuleResponseSchema().loads(resp) + def delete_nic(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """DeleteNIC - 删除网卡 + + **Request** + + - **Region** (str) - (Config) 地域。枚举值:cn,表示中国; + - **NICID** (str) - (Required) 被删除的网卡 ID + - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; + + **Response** + + - **Message** (str) - 返回信息描述。 + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteNICRequestSchema().dumps(d) + + resp = self.invoke("DeleteNIC", d, **kwargs) + return apis.DeleteNICResponseSchema().loads(resp) + def delete_physical_ip( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeletePhysicalIP - 删除物理IP + """DeletePhysicalIP - 删除物理IP **Request** - **Region** (str) - (Config) 地域。 - **PhysicalIPID** (str) - (Required) 物理IP的ID - **Zone** (str) - (Required) 可用区。 - + **Response** - **Message** (str) - 返回状态描述 - + """ # build request d = { @@ -911,7 +993,7 @@ def delete_physical_ip( return apis.DeletePhysicalIPResponseSchema().loads(resp) def delete_rs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ DeleteRS - 移除负载均衡的单个服务节点 + """DeleteRS - 移除负载均衡的单个服务节点 **Request** @@ -920,11 +1002,11 @@ def delete_rs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **RSID** (str) - (Required) RServer的ID - **VSID** (str) - (Required) VServer的ID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述。 - + """ # build request d = { @@ -939,18 +1021,18 @@ def delete_rs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def delete_security_group( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeleteSecurityGroup - 删除安全组 + """DeleteSecurityGroup - 删除安全组 **Request** - **Region** (str) - (Config) 地域。枚举值: cn,表示中国; - **SGID** (str) - (Required) 安全组ID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述; - + """ # build request d = { @@ -965,7 +1047,7 @@ def delete_security_group( def delete_security_group_rule( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeleteSecurityGroupRule - 删除安全组规则 + """DeleteSecurityGroupRule - 删除安全组规则 **Request** @@ -973,11 +1055,11 @@ def delete_security_group_rule( - **SGID** (str) - (Required) 安全组ID - **SGRuleID** (str) - (Required) 安全组规则ID - **Zone** (str) - (Required) 可用区。 - + **Response** - **Message** (str) - 返回信息描述; - + """ # build request d = { @@ -992,18 +1074,18 @@ def delete_security_group_rule( def delete_snapshot( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeleteSnapshot - 删除快照,仅支持状态为正常的快照进行删除操作。 + """DeleteSnapshot - 删除快照,仅支持状态为正常的快照进行删除操作。 **Request** - **Region** (str) - (Config) 地域。枚举值:如 cn,表示中国。 - **SnapshotID** (str) - (Required) 快照ID - **Zone** (str) - (Required) 可用区。枚举值:如 zone-01,表示可用区1。 - + **Response** - **Message** (str) - 返回信息描述 - + """ # build request d = { @@ -1018,18 +1100,18 @@ def delete_snapshot( def delete_subnet( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeleteSubnet - 删除子网 + """DeleteSubnet - 删除子网 **Request** - **Region** (str) - (Config) 地域。 - **SubnetID** (str) - (Required) SubnetID - **Zone** (str) - (Required) 可用区。 - + **Response** - **Message** (str) - 返回信息描述; - + """ # build request d = { @@ -1044,18 +1126,18 @@ def delete_subnet( def delete_vm_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeleteVMInstance - 删除虚拟机 + """DeleteVMInstance - 删除虚拟机 **Request** - **Region** (str) - (Config) 地域。 枚举值:cn,表示中国; - **VMID** (str) - (Required) 虚拟机 ID。输入有效的虚拟机 ID。 - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述。 - + """ # build request d = { @@ -1068,18 +1150,18 @@ def delete_vm_instance( return apis.DeleteVMInstanceResponseSchema().loads(resp) def delete_vpc(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ DeleteVPC - 删除VPC + """DeleteVPC - 删除VPC **Request** - **Region** (str) - (Config) 地域。 - **VPCID** (str) - (Required) ID - **Zone** (str) - (Required) 可用区。 - + **Response** - **Message** (str) - 返回信息描述; - + """ # build request d = { @@ -1092,7 +1174,7 @@ def delete_vpc(self, req: typing.Optional[dict] = None, **kwargs) -> dict: return apis.DeleteVPCResponseSchema().loads(resp) def delete_vs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ DeleteVS - 删除VServer + """DeleteVS - 删除VServer **Request** @@ -1100,11 +1182,11 @@ def delete_vs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **LBID** (str) - (Required) VServer 监听器所属的负载均衡 ID - **VSID** (str) - (Required) 负载均衡VServer监听器ID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述。 - + """ # build request d = { @@ -1119,7 +1201,7 @@ def delete_vs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def delete_vs_policy( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeleteVSPolicy - 删除七层负载均衡内容转发规则,仅当 VServer 的监听协议为 HTTP 时有效。 + """DeleteVSPolicy - 删除七层负载均衡内容转发规则,仅当 VServer 的监听协议为 HTTP 时有效。 **Request** @@ -1128,11 +1210,11 @@ def delete_vs_policy( - **PolicyID** (str) - (Required) 内容转发规则ID - **VSID** (str) - (Required) VServer的ID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述。 - + """ # build request d = { @@ -1147,35 +1229,35 @@ def delete_vs_policy( def describe_certificate( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeCertificate - 查询证书 + """DescribeCertificate - 查询证书 **Request** - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - **CertificateIDs** (list) - 证书ID列表 - **CertificateType** (str) - 证书类型,枚举值["ServerCrt","CACrt"]。分别表示服务器证书和CA证书。 - **Limit** (int) - 返回数据长度,默认为20,最大100 - **Offset** (int) - 列表起始位置偏移量,默认为0 - + **Response** - **Infos** (list) - 见 **CertificateInfo** 模型定义 - **Message** (str) - 返回信息描述 - **TotalCount** (int) - 证书总个数 - + **Response Model** - - **BindVSInfo** - + + **BindVSInfo** + - **LBID** (str) - LB ID - **LBName** (str) - LB名称 - **Port** (int) - VS的端口 - **Protocol** (str) - VS的协议 - **VSID** (str) - VS ID - **CertificateInfo** - + **CertificateInfo** + - **CertificateContent** (str) - 证书内容 - **CertificateID** (str) - 证书ID - **CertificateType** (str) - 证书类型,枚举值["ServerCrt","CACrt"] @@ -1205,31 +1287,33 @@ def describe_certificate( def describe_disk( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeDisk - 获取硬盘信息 + """DescribeDisk - 获取硬盘信息 **Request** - **Region** (str) - (Config) 地域。枚举值: cn,表示中国; - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - **DiskIDs** (list) - 【数组】磁盘的 ID。输入有效的 ID。调用方式举例:DiskIDs.0=“one-id”、DiskIDs.1=“two-id”。 + - **DiskType** (str) - 硬盘用途类型,默认空返回虚拟机所有硬盘,支持值:Boot(系统盘)、Data(数据盘) - **Limit** (int) - 返回数据长度,默认为20,最大100。 - **Offset** (int) - 列表起始位置偏移量,默认为0。 - + **Response** - **Infos** (list) - 见 **DiskInfo** 模型定义 - **Message** (str) - 返回信息描述。 - **TotalCount** (int) - 返回磁盘总个数。 - + **Response Model** - - **DiskInfo** - + + **DiskInfo** + - **AttachResourceID** (str) - 绑定资源ID - **ChargeType** (str) - 硬盘计费模式。枚举值:Dynamic,表示小时;Month,表示月;Year,表示年; - **CreateTime** (int) - 创建时间。时间戳 - **DiskID** (str) - 硬盘ID - - **DiskStatus** (str) - 硬盘状态。Creating:创建中,BeingCloned:正在被克隆中,Unbound:已解绑,Unbounding:解绑中,Bounding:绑定中,Bound:已绑定,Upgrading:升级中,Deleting:删除中,Deleted:已删除,Releasing:销毁中,Released:已销毁 + - **DiskStatus** (str) - 硬盘状态。Creating:创建中,BeingCloned:正在被克隆中,Unbound:已解绑,Unbounding:解绑中,Bounding:绑定中,Bound:已绑定,Upgrading:升级中,Deleting:删除中,Deleted:已删除,Releasing:销毁中,Released:已销毁;Snapshoting(快照中);Rollbacking(回滚中) + - **DiskType** (str) - 硬盘用途类型,Boot(系统盘)、Data(数据盘) - **ExpireTime** (int) - 过期时间。时间戳 - **Name** (str) - 名称 - **Region** (str) - 地域 @@ -1250,34 +1334,39 @@ def describe_disk( return apis.DescribeDiskResponseSchema().loads(resp) def describe_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ DescribeEIP - 获取外网IP的信息 + """DescribeEIP - 获取外网IP的信息 **Request** - **Region** (str) - (Config) 地域。枚举值:cn,表示中国; - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; + - **BindResourceID** (str) - 绑定资源ID,查询该资源绑定的所有 EIP - **EIPIDs** (list) - 【数组】外网的 ID。输入有效的 ID。调用方式举例:EIPIDs.0=“one-id”、EIPIDs.1=“two-id” + - **IPVersion** (str) - 版本,支持IPv4、IPv6 - **Limit** (str) - 返回数据长度,默认为20,最大100。 - **Offset** (str) - 列表起始位置偏移量,默认为0。 - + **Response** - **Infos** (list) - 见 **EIPInfo** 模型定义 - **Message** (str) - 返回信息描述 - **Totalcount** (int) - 返回现有外网IP总数 - + **Response Model** - - **EIPInfo** - + + **EIPInfo** + - **Bandwidth** (int) - 带宽大小 - **BindResourceID** (str) - 绑定资源ID - **BindResourceType** (str) - 绑定资源类型 + - **CanDefaultGW** (int) - 所处线路是否为默认路由,1代表所处线路是默认路由;默认路由的可以设置成出口 - **ChargeType** (str) - 计费模式。枚举值:Dynamic,表示小时;Month,表示月;Year,表示年; - **CreateTime** (int) - 创建时间。时间戳 - **EIPID** (str) - ID - **ExpireTime** (int) - 过期时间。时间戳 - **IP** (str) - 外网IP + - **IPVersion** (str) - IP版本,支持值:IPv4\IPv6 + - **ISDefaultGW** (int) - 是否为默认出口,1代表该IP地址为默认出口 - **Name** (str) - 名称 - **OperatorName** (str) - 线路 - **Region** (str) - 地域 @@ -1299,7 +1388,7 @@ def describe_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def describe_image( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeImage - 获取镜像信息,包括默认镜像和自制镜像。 + """DescribeImage - 获取镜像信息,包括默认镜像和自制镜像。 **Request** @@ -1309,7 +1398,7 @@ def describe_image( - **ImageType** (str) - 镜像类型。枚举值:Base(基础镜像,平台默认提供的镜像),Custom(自制镜像,通过虚拟机导出的镜像) 。若该值为空,默认查询所有镜像。 - **Limit** (int) - 返回数据长度,默认为20,最大100。 - **Offset** (int) - 列表起始位置偏移量,默认为0。 - + **Response** - **Action** (str) - 操作名称 @@ -1317,14 +1406,14 @@ def describe_image( - **Message** (str) - 返回信息描述。 - **RetCode** (int) - 返回码 - **TotalCount** (int) - 返回镜像的总个数。 - + **Response Model** - - **ImageInfo** - + + **ImageInfo** + - **CreateTime** (int) - 创建时间。时间戳。 - **ImageID** (str) - 镜像ID - - **ImageStatus** (str) - 镜像状态。枚举类型:Making(创建中),Available(可用),Unavailable(不可用),Terminating(销毁中),Used(被使用中),Deleting(删除中),Deleted(已删除), Uploading(导入中) + - **ImageStatus** (str) - 镜像状态。枚举类型:Making(创建中),Terminating(销毁中),Used(可用),Deleting(删除中),Deleted(已删除), Uploading(导入中), Failed(导入失败) - **ImageType** (str) - 镜像类型。枚举类型:Base(基础镜像),Custom(自制镜像)。 - **Name** (str) - 镜像名称 - **OSDistribution** (str) - 镜像系统发行版本。例如:Centos, Ubuntu, Windows等 @@ -1346,7 +1435,7 @@ def describe_image( return apis.DescribeImageResponseSchema().loads(resp) def describe_lb(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ DescribeLB - 获取负载均衡信息 + """DescribeLB - 获取负载均衡信息 **Request** @@ -1357,17 +1446,17 @@ def describe_lb(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **Offset** (int) - 列表起始位置偏移量,默认为0。 - **SubnetID** (str) - 子网ID - **VPCID** (str) - VPCID - + **Response** - **Infos** (list) - 见 **LBInfo** 模型定义 - **Message** (str) - 返回信息描述。 - **TotalCount** (int) - 返回负载均衡总个数。 - + **Response Model** - - **LBInfo** - + + **LBInfo** + - **AlarmTemplateID** (str) - 告警模板ID - **ChargeType** (str) - 虚拟机计费模式。枚举值:Dynamic,表示小时;Month,表示月;Year,表示年; - **CreateTime** (int) - 创建时间,时间戳 @@ -1400,7 +1489,7 @@ def describe_lb(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def describe_metric( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeMetric - 获取资源监控信息 + """DescribeMetric - 获取资源监控信息 **Request** @@ -1411,22 +1500,22 @@ def describe_metric( - **ResourceID** (str) - (Required) 资源ID - **ResourceType** (str) - (Required) 资源类型。VM:虚拟机;EIP:弹性IP - **Zone** (str) - (Required) 可用区。枚举值:zone-01,中国; - + **Response** - **Infos** (list) - 见 **MetricInfo** 模型定义 - **Message** (str) - 返回信息描述 - **TotalCount** (int) - 返回监控信息条数 - + **Response Model** - - **MetricSet** - + + **MetricSet** + - **Timestamp** (int) - 监控时间 - **Value** (float) - 监控值 - **MetricInfo** - + **MetricInfo** + - **Infos** (list) - 见 **MetricSet** 模型定义 - **MetricName** (str) - 监控指标。虚拟机的监控指标枚举值为:BlockProcessCount,表示阻塞进程数;CPUUtilization,表示CPU使用率;DiskReadOps,表示磁盘读次数;DiskWriteOps,表示磁盘写次数;IORead,表示磁盘读吞吐;IOWrite,表示磁盘写吞吐;LoadAvg,表示平均负载1分钟;MemUsage,表示内存使用率;NetPacketIn,表示网卡入包量;NetPacketOut,表示网卡出包量;NICIn,表示网卡入带宽;NICOut,表示网卡出带宽;SpaceUsage,表示空间使用率;TCPConnectCount,表示TCP连接数; @@ -1444,7 +1533,7 @@ def describe_metric( def describe_natgw( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeNATGW - 获取NAT网关信息 + """DescribeNATGW - 获取NAT网关信息 **Request** @@ -1453,17 +1542,17 @@ def describe_natgw( - **Limit** (int) - 返回数据长度,默认为20,最大100。 - **NATGWIDs** (list) - 【数组】NAT网关的 ID。调用方式举例:NATGWIDs.0=“one-id”、NATGWIDs.1=“two-id”。 - **Offset** (int) - 列表起始位置偏移量,默认为0。 - + **Response** - **Infos** (list) - 见 **NATGWInfo** 模型定义 - **Message** (str) - 返回信息描述。 - **TotalCount** (int) - 返回NAT网关总个数 - + **Response Model** - - **NATGWInfo** - + + **NATGWInfo** + - **AlarmTemplateID** (str) - 告警模板ID - **ChargeType** (str) - 计费模式。枚举值:Dynamic,表示小时;Month,表示月;Year,表示年; - **CreateTime** (int) - 创建时间,时间戳 @@ -1493,7 +1582,7 @@ def describe_natgw( def describe_natgw_rule( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeNATGWRule - 获取NAT网关白名单信息 + """DescribeNATGWRule - 获取NAT网关白名单信息 **Request** @@ -1505,17 +1594,17 @@ def describe_natgw_rule( - **Limit** (int) - 返回数据长度,默认为20,最大100。 - **Offset** (int) - 列表起始位置偏移量,默认为0。 - **RuleIDs** (list) - 【数组】NAT网关白名单ID。调用方式举例:NATGWRules.0=“one-id”、NATGWRules.1=“two-id”。 - + **Response** - **Infos** (list) - 见 **NATGWRuleInfo** 模型定义 - **Message** (str) - 返回信息描述。 - **TotalCount** (int) - 返回NAT网关白名单资源总个数。 - + **Response Model** - - **NATGWRuleInfo** - + + **NATGWRuleInfo** + - **BindResourceID** (str) - 绑定的资源ID - **BindResourceType** (str) - 绑定资源的类型 - **CreateTime** (int) - 创建时间,时间戳。 @@ -1537,45 +1626,91 @@ def describe_natgw_rule( resp = self.invoke("DescribeNATGWRule", d, **kwargs) return apis.DescribeNATGWRuleResponseSchema().loads(resp) + def describe_nic(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """DescribeNIC - 获取网卡信息 + + **Request** + + - **Region** (str) - (Config) 地域。枚举值: cn,表示中国; + - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; + - **Limit** (int) - 返回数据长度,默认为20,最大100。 + - **NICIDs** (list) - 【数组】网卡的 ID。输入有效的 ID。调用方式举例:NICIDs.0=“one-id”、NICIDs.1=“two-id”。 + - **Offset** (int) - 列表起始位置偏移量,默认为0。 + + **Response** + + - **Infos** (list) - 见 **NICInfo** 模型定义 + - **Message** (str) - 返回信息描述。 + - **TotalCount** (int) - 返回网卡总个数。 + + **Response Model** + + **NICInfo** + + - **BindResourceID** (str) - 绑定资源ID + - **CreateTime** (int) - 创建时间。时间戳 + - **IP** (str) - IP + - **MAC** (str) - mac 地址 + - **NICID** (str) - 网卡ID + - **NICStatus** (str) - 网卡状态。枚举值。Creating:创建中,Free:未绑定,Unbounding:解绑中,Bounding:绑定中,Bound:已绑定,BindSGing:绑定安全组中,UnbindSGing:解绑安全组中,UpdateSGing:更新安全组中,Deleting:删除中,Deleted:已删除,Releasing:销毁中,Released:已销毁 + - **Name** (str) - 名称 + - **Region** (str) - 地域 + - **Remark** (str) - 备注 + - **SGID** (str) - 安全组ID + - **SubnetID** (str) - Subnet ID + - **VPCID** (str) - VPC ID + - **Zone** (str) - 可用区 + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeNICRequestSchema().dumps(d) + + resp = self.invoke("DescribeNIC", d, **kwargs) + return apis.DescribeNICResponseSchema().loads(resp) + def describe_op_logs( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeOPLogs - 查询操作日志 + """DescribeOPLogs - 查询操作日志 **Request** - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **BeginTime** (int) - (Required) 开始时间 - **EndTime** (int) - (Required) 结束时间 - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - **IsSuccess** (str) - 是否操作成功 - - **Limit** (int) - - - **Offset** (int) - + - **Limit** (int) - + - **Offset** (int) - - **ResourceID** (str) - 资源ID - **ResourceType** (str) - 资源类型 - + **Response** - **Infos** (list) - 见 **OPLogInfo** 模型定义 - **Message** (str) - 错误信息 - **TotalCount** (int) - 总数 - + **Response Model** - - **OPLogInfo** - + + **OPLogInfo** + - **CreateTime** (int) - 创建时间 - **IsSuccess** (str) - 是否操作成功, Yes, No - **OPLogsID** (str) - 日志ID - **OPName** (str) - API - **OPTime** (int) - 操作时间 - **OpMessage** (str) - 错误信息 - - **Region** (str) - + - **Region** (str) - - **ResourceID** (str) - 资源ID - **ResourceType** (int) - 资源类型 - **RetCode** (int) - 状态码 - **UserEmail** (str) - 账号邮箱 - - **Zone** (str) - + - **Zone** (str) - """ # build request @@ -1591,7 +1726,7 @@ def describe_op_logs( def describe_physical_ip( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribePhysicalIP - 获取物理IP信息 + """DescribePhysicalIP - 获取物理IP信息 **Request** @@ -1600,17 +1735,17 @@ def describe_physical_ip( - **Limit** (str) - 返回数据长度,默认为20,最大100。 - **Offset** (str) - 列表起始位置偏移量,默认为0。 - **PhysicalIPIDs** (list) - 【数组】物理IP的 ID。输入有效的 ID。调用方式举例:PhysicalIPIDs.0=“one-id”、PhysicalIPIDs.1=“two-id” - + **Response** - **Infos** (list) - 见 **PhysicalIPInfo** 模型定义 - **Message** (str) - 返回信息描述 - **TotalCount** (int) - 返回现有物理IP总数 - + **Response Model** - - **PhysicalIPInfo** - + + **PhysicalIPInfo** + - **BindResourceID** (str) - 绑定资源ID - **BindResourceType** (str) - 绑定资源类型 - **CreateTime** (int) - 创建时间。时间戳 @@ -1636,7 +1771,7 @@ def describe_physical_ip( return apis.DescribePhysicalIPResponseSchema().loads(resp) def describe_rs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ DescribeRS - 获取负载均衡服务的服务节点信息 + """DescribeRS - 获取负载均衡服务的服务节点信息 **Request** @@ -1647,17 +1782,17 @@ def describe_rs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **Offset** (int) - 列表起始位置偏移量,默认为0。 - **RSIDs** (list) - 【数组】RServer的 ID。调用方式举例:RSIDs.0=“one-id”、RSIDs.1=“two-id”。 - **VSID** (str) - VServer的ID - + **Response** - **Infos** (list) - 见 **RSInfo** 模型定义 - **Message** (str) - 返回信息描述。 - **TotalCount** (int) - 返回该负载均衡下VServer的总个数。 - + **Response Model** - - **RSInfo** - + + **RSInfo** + - **BindResourceID** (str) - 绑定的资源ID - **CreateTime** (int) - 创建时间,时间戳 - **IP** (str) - 服务节点的内网 IP 地址 @@ -1685,7 +1820,7 @@ def describe_rs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def describe_recycled_resource( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeRecycledResource - 查询回收站资源 + """DescribeRecycledResource - 查询回收站资源 **Request** @@ -1694,16 +1829,16 @@ def describe_recycled_resource( - **Limit** (int) - 返回数据长度,默认为20,最大100。 - **Offset** (int) - 列表起始位置偏移量,默认为0。 - **ResourceIDs** (list) - 【数组】资源ID,输入“有效”的ID。调用方式举例:ResourceIDs.0=“one-id”、ResourceIDs.1=“two-id”。 - + **Response** - **Infos** (list) - 见 **RecycledResourceInfo** 模型定义 - **TotalCount** (int) - 返回回收站资源的总个数 - + **Response Model** - - **RecycledResourceInfo** - + + **RecycledResourceInfo** + - **CreateTime** (int) - 创建时间 - **DeleteTime** (int) - 删除时间 - **Description** (str) - 描述 @@ -1731,7 +1866,7 @@ def describe_recycled_resource( def describe_security_group( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeSecurityGroup - 查询安全组信息 + """DescribeSecurityGroup - 查询安全组信息 **Request** @@ -1740,17 +1875,17 @@ def describe_security_group( - **Limit** (int) - 返回数据长度,默认为20,最大100。 - **Offset** (int) - 列表起始位置偏移量,默认为0。 - **SGIDs** (list) - 【数组】安全组的 ID。输入有效的 ID。调用方式举例:SGIDs.0=“one-id”、SGIDs.1=“two-id” - + **Response** - **Infos** (list) - 见 **SGInfo** 模型定义 - **Message** (str) - 返回信息描述; - **TotalCount** (int) - 安全组的总数 - + **Response Model** - - **SGRuleInfo** - + + **SGRuleInfo** + - **DstPort** (str) - 端口号 - **IsIn** (str) - 方向。1:入,0:出 - **Priority** (str) - 优先级。HIGH:高,MEDIUM:中,LOW:低 @@ -1759,8 +1894,8 @@ def describe_security_group( - **RuleID** (str) - 规则ID - **SrcIP** (str) - IP或者掩码/段形式。10.0.0.2,10.0.10.10/16 - **SGInfo** - + **SGInfo** + - **CreateTime** (int) - 创建时间,时间戳 - **Name** (str) - 名称 - **Region** (str) - 地域 @@ -1784,26 +1919,111 @@ def describe_security_group( resp = self.invoke("DescribeSecurityGroup", d, **kwargs) return apis.DescribeSecurityGroupResponseSchema().loads(resp) + def describe_security_group_resource( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeSecurityGroupResource - 查询安全组绑定的资源信息 + + **Request** + + - **Region** (str) - (Config) 地域。枚举值: cn,表示中国; + - **SGID** (str) - (Required) 安全组ID + - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; + - **Limit** (int) - 返回数据长度,默认为20,最大100。 + - **Offset** (int) - 列表起始位置偏移量,默认为0。 + + **Response** + + - **Infos** (list) - 见 **SGResourceInfo** 模型定义 + - **Message** (str) - 返回信息描述。 + - **TotalCount** (int) - 返回资源总个数。 + + **Response Model** + + **SGResourceInfo** + + - **Name** (str) - 资源名称 + - **Region** (str) - 地域 + - **ResourceID** (str) - 资源ID + - **ResourceType** (str) - 资源类型 + - **Zone** (str) - 可用区 + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeSecurityGroupResourceRequestSchema().dumps(d) + + resp = self.invoke("DescribeSecurityGroupResource", d, **kwargs) + return apis.DescribeSecurityGroupResourceResponseSchema().loads(resp) + + def describe_snapshot( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeSnapshot - 查询硬盘快照信息 + + **Request** + + - **Region** (str) - (Config) 地域。枚举值: cn,表示中国; + - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; + - **DiskID** (str) - 硬盘ID,输入“有效”状态的ID + - **Limit** (int) - 返回数据长度,默认为20,最大100。 + - **Offset** (int) - 列表起始位置偏移量,默认为0。 + - **SnapshotIDs** (list) - 【数组】快照ID,输入“有效”的ID。调用方式举例:SnapshotIDs.0=“one-id”、SnapshotIDs.1=“two-id”。 + + **Response** + + - **Infos** (list) - 见 **SnapshotInfo** 模型定义 + - **Message** (str) - 返回信息描述 + - **TotalCount** (int) - 返回快照总个数 + + **Response Model** + + **SnapshotInfo** + + - **CreateTime** (int) - 快照创建时间 + - **DiskID** (str) - 快照对应的硬盘 ID + - **DiskType** (str) - 硬盘类型。枚举值:Boot,表示系统盘;Data,表示数据盘; + - **Name** (str) - 快照名称 + - **Region** (str) - 地域。枚举值: cn,表示中国; + - **Remark** (str) - 描述 + - **SnapshotID** (str) - 快照ID + - **SnapshotStatus** (str) - 快照状态。枚举值:Createing,表示制作中;Normal,表示正常;RollBacking,表示回滚中;Deleting,表示删除中;Deleted,表示已删除; + - **Zone** (str) - 可用区。枚举值:zone-01,表示中国; + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeSnapshotRequestSchema().dumps(d) + + resp = self.invoke("DescribeSnapshot", d, **kwargs) + return apis.DescribeSnapshotResponseSchema().loads(resp) + def describe_storage_type( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeStorageType - 查询存储类型 + """DescribeStorageType - 查询存储类型 **Request** - **Region** (str) - (Config) 地域。 - **Zone** (str) - (Required) 可用区。 - + **Response** - **Infos** (list) - 见 **StorageTypeInfo** 模型定义 - **Message** (str) - 返回信息描述; - **TotalCount** (int) - 存储类型的总数 - + **Response Model** - - **StorageTypeInfo** - + + **StorageTypeInfo** + - **Region** (str) - 地域 - **SetArch** (str) - 架构 - **StorageType** (str) - 存储类型 @@ -1824,7 +2044,7 @@ def describe_storage_type( def describe_subnet( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeSubnet - 查询子网信息 + """DescribeSubnet - 查询子网信息 **Request** @@ -1834,17 +2054,17 @@ def describe_subnet( - **Offset** (int) - 列表起始位置偏移量,默认为0。 - **SubnetIDs** (list) - 【数组】子网 ID。调用方式举例:SubnetIDs.0=“one-id”、SubnetIDs.1=“two-id” - **VPCID** (str) - VPCID - + **Response** - **Infos** (list) - 见 **SubnetInfo** 模型定义 - **Message** (str) - 返回信息描述; - **TotalCount** (int) - 子网的总数 - + **Response Model** - - **SubnetInfo** - + + **SubnetInfo** + - **CreateTime** (int) - 创建时间,时间戳 - **Name** (str) - 名称 - **Network** (str) - 网段 @@ -1869,24 +2089,24 @@ def describe_subnet( def describe_user( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUser - 查询租户信息 + """DescribeUser - 查询租户信息 **Request** - **Limit** (int) - 返回数据长度,默认为20,最大100。 - **Offset** (int) - 列表起始位置偏移量,默认为0。 - **UserIDs** (list) - 【数组】租户的 ID。输入有效的 ID。调用方式举例:UserIDs.0=123”、UserIDs.1=456 - + **Response** - **Infos** (list) - 见 **UserInfo** 模型定义 - **Message** (str) - 返回信息描述 - **TotalCount** (int) - 返回现有租户总数 - + **Response Model** - - **UserInfo** - + + **UserInfo** + - **Amount** (float) - 账户余额 - **CreateTime** (int) - 账户创建时间。时间戳 - **Email** (str) - 租户名称 @@ -1908,43 +2128,28 @@ def describe_user( def describe_vm_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeVMInstance - 查询虚拟机 + """DescribeVMInstance - 查询虚拟机 **Request** - - **Region** (str) - (Config) 地域。枚举值: cn,表示中国; + - **Region** (str) - (Config) 地域或数据中心。枚举值: cn,表示中国; - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - **Limit** (int) - 返回数据长度,默认为20,最大100。 - - **Offset** (str) - 列表起始位置偏移量,默认为0。 + - **Offset** (int) - 列表起始位置偏移量,默认为0。 - **SubnetID** (str) - 子网 ID。输入“有效”状态的子网 ID。 - **VMIDs** (list) - 【数组】虚拟机的 ID。输入有效的 ID。调用方式举例:PrivateIp.0=“one-id”、PrivateIp.1=“two-id”。 - **VPCID** (str) - VPC ID。输入“有效”状态的VPC ID。 - + **Response** - **Infos** (list) - 见 **VMInstanceInfo** 模型定义 - **Message** (str) - 返回信息描述 - **TotalCount** (int) - 返回虚拟机总个数 - + **Response Model** - - **VMIPInfo** - - - **IP** (str) - IP 值 - - **IPVersion** (str) - IP版本,支持值:IPv4\IPv6 - - **InterfaceID** (str) - 网卡 ID - - **IsElastic** (str) - 是否是弹性网卡。枚举值:Y,表示是;N,表示否; - - **MAC** (str) - MAC 地址值 - - **SGID** (str) - 安全组 ID - - **SGName** (str) - 安全组名称 - - **SubnetID** (str) - 子网 ID - - **SubnetName** (str) - 子网名称 - - **Type** (str) - IP 类型。枚举值:Private,表示内网;Public,表示外网;Physical,表示物理网; - - **VPCID** (str) - VPC ID - - **VPCName** (str) - VPC 名称 - **VMDiskInfo** - + **VMDiskInfo** + - **DiskID** (str) - 磁盘 ID - **Drive** (str) - 磁盘盘符 - **IsElastic** (str) - 是否是弹性磁盘。枚举值为:Y,表示是;N,表示否; @@ -1952,8 +2157,23 @@ def describe_vm_instance( - **Size** (int) - 磁盘大小,单位 GB - **Type** (str) - 磁盘类型。枚举值:Boot,表示系统盘;Data,表示数据盘; - **VMInstanceInfo** - + **VMIPInfo** + + - **IP** (str) - IP 值 + - **IPVersion** (str) - IP版本,支持值:IPv4\IPv6 + - **InterfaceID** (str) - 网卡 ID,IP 地址绑定的网卡 ID + - **IsElastic** (str) - 是否是弹性网卡。枚举值:Y,表示是;N,表示否; + - **MAC** (str) - MAC 地址值 + - **SGID** (str) - 安全组 ID + - **SGName** (str) - 安全组名称 + - **SubnetID** (str) - 子网 ID,IP 为外网 IP 时为空; + - **SubnetName** (str) - 子网名称,IP 为外网 IP 时为空; + - **Type** (str) - IP 类型。枚举值:Private,表示内网;Public,表示外网。 + - **VPCID** (str) - VPC ID,IP 为外网 IP 时为空; + - **VPCName** (str) - VPC 名称,IP 为外网 IP 时为空; + + **VMInstanceInfo** + - **CPU** (int) - CPU 个数 - **ChargeType** (str) - 虚拟机计费模式。枚举值:Dynamic,表示小时;Month,表示月;Year,表示年; - **CreateTime** (int) - 虚拟机创建时间 @@ -1966,18 +2186,16 @@ def describe_vm_instance( - **OSName** (str) - 操作系统名称 - **OSType** (str) - 操作系统类型 - **Region** (str) - Region - - **RegionAlias** (str) - Region 别名 - **Remark** (str) - 备注 - **State** (str) - 虚拟机状态。枚举值:Initializing,表示初始化;Starting,表示启动中;Restarting,表示重启中;Running,表示运行;Stopping,表示关机中;Stopped,表示关机;Deleted,表示已删除;Resizing,表示修改配置中;Terminating,表示销毁中;Terminated,表示已销毁;Migrating,表示迁移中;WaitReinstall,表示等待重装系统;Reinstalling,表示重装中;Poweroffing,表示断电中;ChangeSGing,表示修改防火墙中; - **SubnetID** (str) - 子网 ID - **SubnetName** (str) - 子网 名称 - **VMID** (str) - 虚拟机 ID - - **VMType** (str) - 虚拟机类型 - - **VMTypeAlias** (str) - 虚拟机类型别名 + - **VMType** (str) - 虚拟机所在宿主机的集群类型 ID + - **VMTypeAlias** (str) - 虚拟机所在宿主机的集群类型名称 - **VPCID** (str) - VPC ID - **VPCName** (str) - VPC 名称 - **Zone** (str) - Zone - - **ZoneAlias** (str) - Zone 别名 """ # build request @@ -1993,23 +2211,23 @@ def describe_vm_instance( def describe_vm_type( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeVMType - 查询主机机型 + """DescribeVMType - 查询主机机型 **Request** - **Region** (str) - (Config) 地域。 - **Zone** (str) - (Required) 可用区。 - + **Response** - **Infos** (list) - 见 **VMTypeInfo** 模型定义 - **Message** (str) - 返回信息描述; - **TotalCount** (int) - 主机机型的总数 - + **Response Model** - - **VMTypeInfo** - + + **VMTypeInfo** + - **Region** (str) - 地域 - **SetArch** (str) - 架构 - **VMType** (str) - 机型 @@ -2028,7 +2246,7 @@ def describe_vm_type( return apis.DescribeVMTypeResponseSchema().loads(resp) def describe_vpc(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ DescribeVPC - 查询VPC信息 + """DescribeVPC - 查询VPC信息 **Request** @@ -2037,17 +2255,17 @@ def describe_vpc(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **Limit** (int) - 返回数据长度,默认为20,最大100。 - **Offset** (int) - 列表起始位置偏移量,默认为0。 - **VPCIDs** (list) - 【数组】VPC的 ID。调用方式举例:VPCIDs.0=“one-id”、VPCIDs.1=“two-id” - + **Response** - **Infos** (list) - 见 **VPCInfo** 模型定义 - **Message** (str) - 返回信息描述; - **TotalCount** (int) - VPC的总数 - + **Response Model** - - **SubnetInfo** - + + **SubnetInfo** + - **CreateTime** (int) - 创建时间,时间戳 - **Name** (str) - 名称 - **Network** (str) - 网段 @@ -2058,8 +2276,8 @@ def describe_vpc(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **UpdateTime** (int) - 更新时间,时间戳 - **Zone** (str) - 可用区 - **VPCInfo** - + **VPCInfo** + - **CreateTime** (int) - 创建时间,时间戳 - **Name** (str) - 名称 - **Network** (str) - 网段,比如10.0.0.0/16 @@ -2084,7 +2302,7 @@ def describe_vpc(self, req: typing.Optional[dict] = None, **kwargs) -> dict: return apis.DescribeVPCResponseSchema().loads(resp) def describe_vs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ DescribeVS - 获取负载均衡 VServer 信息 + """DescribeVS - 获取负载均衡 VServer 信息 **Request** @@ -2094,17 +2312,17 @@ def describe_vs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **Limit** (int) - 返回数据长度,默认为20,最大100。 - **Offset** (int) - 列表起始位置偏移量,默认为0。 - **VSIDs** (list) - 【数组】VServer的 ID。调用方式举例:VSIDs.0=“one-id”、VSIDs.1=“two-id”。 - + **Response** - **Infos** (list) - 见 **VSInfo** 模型定义 - **Message** (str) - 返回信息描述。 - **TotalCount** (int) - 返回当前负载均衡 VServer 总个数。 - + **Response Model** - - **VSPolicyInfo** - + + **VSPolicyInfo** + - **CreateTime** (int) - 创建时间,时间戳 - **Domain** (str) - 内容转发规则关联的请求域名,值可为空,即代表仅匹配路径。 - **LBID** (str) - 负载均衡ID @@ -2115,8 +2333,8 @@ def describe_vs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **UpdateTime** (int) - 更新时间,时间戳 - **VSID** (str) - VServerID - **RSInfo** - + **RSInfo** + - **BindResourceID** (str) - 绑定的资源ID - **CreateTime** (int) - 创建时间,时间戳 - **IP** (str) - 服务节点的内网 IP 地址 @@ -2130,9 +2348,10 @@ def describe_vs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **VSID** (str) - 服务节点所属的 VServer ID - **Weight** (int) - 服务节点的权重 - **VSInfo** - + **VSInfo** + - **AlarmTemplateID** (str) - 告警模板ID + - **CACertificateID** (str) - CA证书ID,用于验证客户端证书的签名。仅当VServer监听协议为 HTTPS 且 SSLMode 为双向认证时有效。 - **CreateTime** (int) - 创建时间,时间戳 - **Domain** (str) - HTTP 健康检查时校验请求的 HOST 字段中的域名。当健康检查类型为端口检查时,该值为空。 - **HealthcheckType** (str) - 负载均衡的健康检查类型。枚举值:Port:端口检查;Path: HTTP检查 。 @@ -2145,6 +2364,9 @@ def describe_vs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **Protocol** (str) - 协议 - **RSHealthStatus** (str) - 健康检查状态,枚举值,Empty:全部异常,Parts:部分异常,All:正常 - **RSInfos** (list) - 见 **RSInfo** 模型定义 + - **SSLMode** (str) - SSL认证模式,取值范围["simplex","duplex"]分别表示单向认证和双向认证。 + - **Scheduler** (str) - 负载均衡的调度算法。枚举值:wrr:加权轮训;least_conn:最小连接数;hash:原地址,四层lb使用。ip_hash:七层lb使用 + - **ServerCertificateID** (str) - 服务器证书ID,用于证明服务器的身份。仅当 VServer监听协议为 HTTPS 时有效。 - **UpdateTime** (int) - 更新时间,时间戳 - **VSID** (str) - VServer的ID - **VSPolicyInfos** (list) - 见 **VSPolicyInfo** 模型定义 @@ -2164,7 +2386,7 @@ def describe_vs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def describe_vs_policy( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeVSPolicy - 获取七层负载均衡内容转发规则信息,仅当 VServer 的监听协议为 HTTP 时有效。 + """DescribeVSPolicy - 获取七层负载均衡内容转发规则信息,仅当 VServer 的监听协议为 HTTP 时有效。 **Request** @@ -2175,17 +2397,17 @@ def describe_vs_policy( - **Offset** (int) - 列表起始位置偏移量,默认为0。 - **PolicyIDs** (list) - 【数组】七层负载均衡内容转发规则的 ID。调用方式举例:PolicyIDs.0=“one-id”、PolicyIDs.1=“two-id” - **VSID** (str) - VServerID - + **Response** - **Infos** (list) - 见 **VSPolicyInfo** 模型定义 - **Message** (str) - 返回信息描述。 - **TotalCount** (int) - 返回内容转发规则的总个数。 - + **Response Model** - - **RSInfo** - + + **RSInfo** + - **BindResourceID** (str) - 绑定的资源ID - **CreateTime** (int) - 创建时间,时间戳 - **IP** (str) - 服务节点的内网 IP 地址 @@ -2199,8 +2421,8 @@ def describe_vs_policy( - **VSID** (str) - 服务节点所属的 VServer ID - **Weight** (int) - 服务节点的权重 - **VSPolicyInfo** - + **VSPolicyInfo** + - **CreateTime** (int) - 创建时间,时间戳 - **Domain** (str) - 内容转发规则关联的请求域名,值可为空,即代表仅匹配路径。 - **LBID** (str) - 负载均衡ID @@ -2223,7 +2445,7 @@ def describe_vs_policy( return apis.DescribeVSPolicyResponseSchema().loads(resp) def detach_disk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ DetachDisk - 解绑UClouStack硬盘 + """DetachDisk - 解绑硬盘 **Request** @@ -2231,11 +2453,11 @@ def detach_disk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **DiskID** (str) - (Required) 硬盘ID - **ResourceID** (str) - (Required) 绑定的资源ID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述。 - + """ # build request d = { @@ -2247,8 +2469,33 @@ def detach_disk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: resp = self.invoke("DetachDisk", d, **kwargs) return apis.DetachDiskResponseSchema().loads(resp) + def detach_nic(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """DetachNIC - 解绑UClouStack网卡 + + **Request** + + - **Region** (str) - (Config) 地域。枚举值:cn,表示中国; + - **NICID** (str) - (Required) 网卡ID + - **ResourceID** (str) - (Required) 绑定的资源ID + - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; + + **Response** + + - **Message** (str) - 返回信息描述。 + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.DetachNICRequestSchema().dumps(d) + + resp = self.invoke("DetachNIC", d, **kwargs) + return apis.DetachNICResponseSchema().loads(resp) + def disable_rs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ DisableRS - 禁用负载均衡的单个服务节点 + """DisableRS - 禁用负载均衡的单个服务节点 **Request** @@ -2257,11 +2504,11 @@ def disable_rs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **RSID** (str) - (Required) RServer的ID - **VSID** (str) - (Required) VServer的ID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述。 - + """ # build request d = { @@ -2274,7 +2521,7 @@ def disable_rs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: return apis.DisableRSResponseSchema().loads(resp) def enable_rs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ EnableRS - 启用负载均衡的单个服务节点 + """EnableRS - 启用负载均衡的单个服务节点 **Request** @@ -2283,11 +2530,11 @@ def enable_rs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **RSID** (str) - (Required) RServer的ID - **VSID** (str) - (Required) VServer的ID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述。 - + """ # build request d = { @@ -2302,7 +2549,7 @@ def enable_rs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def get_disk_price( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetDiskPrice - 获取硬盘价格 + """GetDiskPrice - 获取硬盘价格 **Request** @@ -2312,16 +2559,16 @@ def get_disk_price( - **SetType** (str) - (Required) 磁盘类型 - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - **Quantity** (int) - 购买时长。默认值1。小时不生效,月范围【1,11】,年范围【1,5】。 - + **Response** - **Infos** (list) - 见 **PriceInfo** 模型定义 - **Message** (str) - 返回信息描述。 - + **Response Model** - - **PriceInfo** - + + **PriceInfo** + - **ChargeType** (str) - 计费模式。枚举值:Dynamic,表示小时;Month,表示月;Year,表示年; - **Price** (float) - 价格 @@ -2339,7 +2586,7 @@ def get_disk_price( def get_eip_price( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetEIPPrice - 获取外网IP价格 + """GetEIPPrice - 获取外网IP价格 **Request** @@ -2349,16 +2596,16 @@ def get_eip_price( - **OpertatorName** (str) - (Required) 线路。目前支持Bgp - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - **Quantity** (int) - 购买时长。默认值1。小时不生效,月范围【1,11】,年范围【1,5】。 - + **Response** - **Infos** (list) - 见 **PriceInfo** 模型定义 - **Message** (str) - 返回信息描述 - + **Response Model** - - **PriceInfo** - + + **PriceInfo** + - **ChargeType** (str) - 计费模式。枚举值:Dynamic,表示小时;Month,表示月;Year,表示年; - **Price** (float) - 价格 @@ -2376,7 +2623,7 @@ def get_eip_price( def get_vm_instance_price( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetVMInstancePrice - 获取虚拟机价格 + """GetVMInstancePrice - 获取虚拟机价格 **Request** @@ -2393,16 +2640,16 @@ def get_vm_instance_price( - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - **GPU** (int) - GPU 卡核心的占用个数。枚举值:【1,2,4】。GPU与CPU、内存大小关系:CPU个数>=4*GPU个数,同时内存与CPU规格匹配. - **Quantity** (int) - 购买时长。默认值1。小时不生效,月范围【1,11】,年范围【1,5】。 - + **Response** - **Infos** (list) - 见 **PriceInfo** 模型定义 - **Message** (str) - 返回信息描述。 - + **Response Model** - - **PriceInfo** - + + **PriceInfo** + - **ChargeType** (str) - 计费模式。枚举值:Dynamic,表示小时;Month,表示月;Year,表示年; - **Price** (float) - 价格 @@ -2420,7 +2667,7 @@ def get_vm_instance_price( def modify_eip_bandwidth( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ModifyEIPBandwidth - 调整外网IP带宽 + """ModifyEIPBandwidth - 调整外网IP带宽 **Request** @@ -2428,11 +2675,11 @@ def modify_eip_bandwidth( - **Bandwidth** (int) - (Required) 调整后的带宽 - **EIPID** (str) - (Required) 外网IP的ID - **Zone** (str) - (Required) 可用区。 - + **Response** - **Message** (str) - 返回信息描述; - + """ # build request d = { @@ -2447,7 +2694,7 @@ def modify_eip_bandwidth( def modify_name_and_remark( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ModifyNameAndRemark - 修改资源名称和备注 + """ModifyNameAndRemark - 修改资源名称和备注 **Request** @@ -2456,11 +2703,11 @@ def modify_name_and_remark( - **ResourceID** (str) - (Required) 资源ID; - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - **Remark** (str) - 描述; - + **Response** - **Message** (str) - 返回信息描述 - + """ # build request d = { @@ -2475,18 +2722,18 @@ def modify_name_and_remark( def poweroff_vm_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ PoweroffVMInstance - 断电虚拟机,可能导致丢失数据甚至损坏操作系统,仅适用于虚拟机死机及级端测试场景。 + """PoweroffVMInstance - 断电虚拟机,可能导致丢失数据甚至损坏操作系统,仅适用于虚拟机死机及级端测试场景。 **Request** - **Region** (str) - (Config) 地域。枚举值:如 cn,表示中国。 - **VMID** (str) - (Required) 虚拟机ID - **Zone** (str) - (Required) 可用区。枚举值:如 zone-01,表示可用区1。 - + **Response** - **Message** (str) - 返回信息描述 - + """ # build request d = { @@ -2499,7 +2746,7 @@ def poweroff_vm_instance( return apis.PoweroffVMInstanceResponseSchema().loads(resp) def recharge(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ Recharge - 管理员给租户充值 + """Recharge - 管理员给租户充值 **Request** @@ -2507,11 +2754,11 @@ def recharge(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **FromType** (str) - (Required) 充值来源。INPOUR_FROM_ALIPAY:支付宝,INPOUR_FROM_OFFLINE:银行转账,INPOUR_FROM_SINPAY:新浪支付,INPOUR_FROM_WECHAT_PAY:微信转账。 - **SerialNo** (str) - (Required) 充值单号。充值方式为“账户余额”时为必要参数。 - **UserID** (int) - (Required) 租户的账户ID。 - + **Response** - **Message** (str) - 返回信息描述。 - + """ # build request d = {} @@ -2524,7 +2771,7 @@ def recharge(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def reinstall_vm_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ReinstallVMInstance - 重装系统,关机的虚拟机才可以重装系统 + """ReinstallVMInstance - 重装系统,关机的虚拟机才可以重装系统 **Request** @@ -2532,11 +2779,11 @@ def reinstall_vm_instance( - **ImageID** (str) - (Required) 镜像ID - **VMID** (str) - (Required) 虚拟机ID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述 - + """ # build request d = { @@ -2549,18 +2796,18 @@ def reinstall_vm_instance( return apis.ReinstallVMInstanceResponseSchema().loads(resp) def release_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ ReleaseEIP - 删除外网IP + """ReleaseEIP - 删除外网IP **Request** - **Region** (str) - (Config) 地域。枚举值:cn,表示中国;中国 - **EIPID** (str) - (Required) 外网IP的ID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国 - + **Response** - **Message** (str) - 返回状态描述 - + """ # build request d = { @@ -2575,7 +2822,7 @@ def release_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def renew_resource( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ RenewResource - 续费回收站资源 + """RenewResource - 续费回收站资源 **Request** @@ -2583,11 +2830,11 @@ def renew_resource( - **ResourceID** (str) - (Required) 待续续的资源ID - **Zone** (str) - (Required) 可用区。枚举值:如 zone-01,表示可用区1。 - **Quantity** (int) - 购买时长,默认为 1。按小时(Dynamic)付费的资源无需此参数,按月付费的资源传 0 时,代表购买至月末。 - + **Response** - **Message** (str) - 返回描述信息 - + """ # build request d = { @@ -2602,7 +2849,7 @@ def renew_resource( def reset_vm_instance_password( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ResetVMInstancePassword - 重置虚拟机密码,主机必须开机才可以重置密码 + """ResetVMInstancePassword - 重置虚拟机密码,主机必须开机才可以重置密码 **Request** @@ -2610,11 +2857,11 @@ def reset_vm_instance_password( - **Password** (str) - (Required) 密码 - **VMID** (str) - (Required) 虚拟机ID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述 - + """ # build request d = { @@ -2629,7 +2876,7 @@ def reset_vm_instance_password( def resize_vm_config( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ResizeVMConfig - 修改虚拟机配置 + """ResizeVMConfig - 修改虚拟机配置 **Request** @@ -2638,11 +2885,11 @@ def resize_vm_config( - **Memory** (int) - (Required) 内存容量,如 2048、4096、8192、16384、32768、65536、131072。 - **VMID** (str) - (Required) 虚拟机ID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述 - + """ # build request d = { @@ -2657,18 +2904,18 @@ def resize_vm_config( def restart_vm_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ RestartVMInstance - 重启虚拟机 + """RestartVMInstance - 重启虚拟机 **Request** - **Region** (str) - (Config) 地域。枚举值:cn,表示中国; - **VMID** (str) - (Required) 虚拟机ID; - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述 - + """ # build request d = { @@ -2683,18 +2930,18 @@ def restart_vm_instance( def rollback_resource( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ RollbackResource - 恢复回收站资源 + """RollbackResource - 恢复回收站资源 **Request** - **Region** (str) - (Config) 地域。枚举值:如 cn,表示中国。 - **ResourceID** (str) - (Required) 待恢复的资源ID - **Zone** (str) - (Required) 可用区。枚举值:如 zone-01,表示可用区1。 - + **Response** - **Message** (str) - 返回描述信息 - + """ # build request d = { @@ -2709,7 +2956,7 @@ def rollback_resource( def rollback_snapshot( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ RollbackSnapshot - 将某个快照内的数据回滚到原云硬盘,仅支持正常状态的快照进行回滚操作,回滚时硬盘必须处于未绑定或其挂载的主机为关机状态。 + """RollbackSnapshot - 将某个快照内的数据回滚到原云硬盘,仅支持正常状态的快照进行回滚操作,回滚时硬盘必须处于未绑定或其挂载的主机为关机状态。 **Request** @@ -2717,11 +2964,11 @@ def rollback_snapshot( - **DiskID** (str) - (Required) 对应的云硬盘 ID; - **SnapshotID** (str) - (Required) 快照ID - **Zone** (str) - (Required) 可用区。枚举值:如 zone-01,表示可用区1。 - + **Response** - **Message** (str) - 返回信息描述 - + """ # build request d = { @@ -2736,18 +2983,18 @@ def rollback_snapshot( def start_vm_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ StartVMInstance - 开启虚拟机 + """StartVMInstance - 开启虚拟机 **Request** - **Region** (str) - (Config) 地域。枚举值:cn,表示中国; - **VMID** (str) - (Required) 虚拟机 ID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述 - + """ # build request d = { @@ -2762,19 +3009,19 @@ def start_vm_instance( def stop_vm_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ StopVMInstance - 关闭虚拟机 + """StopVMInstance - 关闭虚拟机 **Request** - **Region** (str) - (Config) 地域。枚举值:cn,表示中国; - **VMID** (str) - (Required) 虚拟机 ID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述 - **VMID** (str) - 虚拟机 ID - + """ # build request d = { @@ -2789,18 +3036,18 @@ def stop_vm_instance( def terminate_resource( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ TerminateResource - 销毁资源 + """TerminateResource - 销毁资源 **Request** - **Region** (str) - (Config) 地域。 - **ResourceID** (str) - (Required) 资源id - **Zone** (str) - (Required) 可用区。 - + **Response** - **Message** (str) - 返回描述信息 - + """ # build request d = { @@ -2813,7 +3060,7 @@ def terminate_resource( return apis.TerminateResourceResponseSchema().loads(resp) def un_bind_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ UnBindEIP - 解绑外网IP + """UnBindEIP - 解绑外网IP **Request** @@ -2822,11 +3069,11 @@ def un_bind_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **ResourceID** (str) - (Required) 资源ID - **ResourceType** (str) - (Required) 资源类型。VM:虚拟机, LB:负载均衡, NATGW:nat网关 - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述。 - + """ # build request d = { @@ -2841,7 +3088,7 @@ def un_bind_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def un_bind_security_group( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ UnBindSecurityGroup - 解绑安全组 + """UnBindSecurityGroup - 解绑安全组 **Request** @@ -2849,11 +3096,11 @@ def un_bind_security_group( - **ResourceID** (str) - (Required) 解绑的资源ID。调用方式举例:ResourceID=“one-id”。 - **SGID** (str) - (Required) 安全组ID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述 - + """ # build request d = { @@ -2868,7 +3115,7 @@ def un_bind_security_group( def unbind_alarm_template( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ UnbindAlarmTemplate - 解绑告警模板 + """UnbindAlarmTemplate - 解绑告警模板 **Request** @@ -2877,11 +3124,11 @@ def unbind_alarm_template( - **ResourceIDs** (list) - (Required) 【数组】资源的 ID。调用方式举例:ResourceIDs.0=“one-id”、ResourceIDs.1=“two-id”。 - **ResourceType** (str) - (Required) 资源类型。VM:虚拟机, LB:负载均衡, NATGW:nat网关;EIP:弹性网卡 - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述 - + """ # build request d = { @@ -2896,7 +3143,7 @@ def unbind_alarm_template( def unbind_physical_ip( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ UnbindPhysicalIP - 解绑物理IP + """UnbindPhysicalIP - 解绑物理IP **Request** @@ -2905,11 +3152,11 @@ def unbind_physical_ip( - **ResourceID** (str) - (Required) 资源ID - **ResourceType** (str) - (Required) 资源类型。VM:虚拟机 - **Zone** (str) - (Required) 可用区。 - + **Response** - **Message** (str) - 返回信息描述。 - + """ # build request d = { @@ -2924,7 +3171,7 @@ def unbind_physical_ip( def update_alarm_template_rule( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ UpdateAlarmTemplateRule - 更新告警模板规则 + """UpdateAlarmTemplateRule - 更新告警模板规则 **Request** @@ -2939,11 +3186,11 @@ def update_alarm_template_rule( - **Threshold** (str) - (Required) 告警阈值 - **TriggerCount** (str) - (Required) 连续触发次数 - **Zone** (str) - (Required) 可用区 - + **Response** - **Message** (str) - 返回描述信息 - + """ # build request d = { @@ -2956,7 +3203,7 @@ def update_alarm_template_rule( return apis.UpdateAlarmTemplateRuleResponseSchema().loads(resp) def update_rs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ UpdateRS - 修改负载均衡的服务节点 + """UpdateRS - 修改负载均衡的服务节点 **Request** @@ -2967,11 +3214,11 @@ def update_rs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - **Port** (int) - 端口号 - **Weight** (int) - 权重 - + **Response** - **Message** (str) - 返回信息描述。 - + """ # build request d = { @@ -2986,19 +3233,19 @@ def update_rs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def update_security_group_rule( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ UpdateSecurityGroupRule - 修改安全组规则 + """UpdateSecurityGroupRule - 修改安全组规则 **Request** - **Region** (str) - (Config) 地域。枚举值: cn,表示中国; - - **Rules** (list) - (Required) 【数组】规则。输入有效的 规则。调用方式举例:Rules.0=“TCP|23|0.0.0.0/0|ACCEPT|HIGH|1”、Rules.1=“TCP|55|0.0.0.0/0|ACCEPT|HIGH|1” + - **Rules** (list) - (Required) 【数组】规则。输入有效的 规则。调用方式举例:Rules.0=“TCP|23|0.0.0.0/0|ACCEPT|HIGH|1|sg_rule-wefvg34f”、Rules.1=“TCP|55|0.0.0.0/0|ACCEPT|HIGH|1|sg_rule-wefvggf” - **SGID** (str) - (Required) 安全组ID - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** - **Message** (str) - 返回信息描述; - + """ # build request d = { @@ -3011,7 +3258,7 @@ def update_security_group_rule( return apis.UpdateSecurityGroupRuleResponseSchema().loads(resp) def update_vs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ UpdateVS - 修改负载均衡VServer + """UpdateVS - 修改负载均衡VServer **Request** @@ -3030,11 +3277,11 @@ def update_vs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **SSLMode** (str) - SSL认证模式,HTTPS协议下必传,取值范围["simplex","duplex"]分别表示单向认证和双向认证。 - **Scheduler** (str) - 负载均衡的调度算法。枚举值:wrr:加权轮训;least_conn:最小连接数;hash:原地址,四层lb使用。ip_hash:七层lb使用 - **ServerCertificateID** (str) - 服务器证书ID,用于证明服务器的身份,仅当 VServer监听协议为 HTTPS 时有效。 - + **Response** - **Message** (str) - 返回信息描述。 - + """ # build request d = { @@ -3049,7 +3296,7 @@ def update_vs(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def update_vs_policy( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ UpdateVSPolicy - 更新七层负载均衡内容转发规则,仅当 VServer 的监听协议为 HTTP 时有效。 + """UpdateVSPolicy - 更新七层负载均衡内容转发规则,仅当 VServer 的监听协议为 HTTP 时有效。 **Request** @@ -3061,11 +3308,11 @@ def update_vs_policy( - **Domain** (str) - 内容转发规则关联的请求域名,值可为空,即代表仅匹配路径。 - **Path** (str) - 内容转发规则关联的请求访问路径,如 "/" 。 - **RSIDs** (list) - 【数组】RServer的 ID。调用方式举例:RSIDs.0=“one-id”、RSIDs.1=“two-id”。 - + **Response** - **Message** (str) - 返回信息描述。 - + """ # build request d = { @@ -3078,7 +3325,7 @@ def update_vs_policy( return apis.UpdateVSPolicyResponseSchema().loads(resp) def upgrade_disk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ UpgradeDisk - 升级硬盘 + """UpgradeDisk - 扩容硬盘,为保证数据完整性,容量扩容前建议暂停对当前硬盘的所有文件系统读写操作,并进入操作系统进行 `umount ` 或`脱机` 操作。 **Request** @@ -3086,11 +3333,13 @@ def upgrade_disk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **DiskID** (str) - (Required) 硬盘ID - **DiskSpace** (int) - (Required) 硬盘升级后的容量, 不能小于原硬盘容量,单位为 GB 。 - **Zone** (str) - (Required) 可用区。枚举值:zone-01,表示中国; - + **Response** + - **Action** (str) - 操作名称 - **Message** (str) - 返回信息描述。 - + - **RetCode** (int) - 返回码 + """ # build request d = { diff --git a/ucloud/services/ucloudstack/schemas/apis.py b/ucloud/services/ucloudstack/schemas/apis.py index eabd8202..678107b8 100644 --- a/ucloud/services/ucloudstack/schemas/apis.py +++ b/ucloud/services/ucloudstack/schemas/apis.py @@ -1,6 +1,5 @@ """ Code is generated by ucloud-model, DO NOT EDIT IT. """ - from ucloud.core.typesystem import schema, fields from ucloud.services.ucloudstack.schemas import models @@ -16,12 +15,13 @@ class AllocateEIPRequestSchema(schema.RequestSchema): - """ AllocateEIP - 申请外网IP - """ + """AllocateEIP - 申请外网IP""" fields = { "Bandwidth": fields.Int(required=True, dump_to="Bandwidth"), "ChargeType": fields.Str(required=True, dump_to="ChargeType"), + "IP": fields.Str(required=False, dump_to="IP"), + "IPVersion": fields.Str(required=False, dump_to="IPVersion"), "Name": fields.Str(required=True, dump_to="Name"), "OperatorName": fields.Str(required=True, dump_to="OperatorName"), "Quantity": fields.Int(required=False, dump_to="Quantity"), @@ -31,8 +31,7 @@ class AllocateEIPRequestSchema(schema.RequestSchema): class AllocateEIPResponseSchema(schema.ResponseSchema): - """ AllocateEIP - 申请外网IP - """ + """AllocateEIP - 申请外网IP""" fields = { "EIPID": fields.Str(required=True, load_from="EIPID"), @@ -48,8 +47,7 @@ class AllocateEIPResponseSchema(schema.ResponseSchema): class AttachDiskRequestSchema(schema.RequestSchema): - """ AttachDisk - 绑定硬盘 - """ + """AttachDisk - 绑定硬盘""" fields = { "DiskID": fields.Str(required=True, dump_to="DiskID"), @@ -61,8 +59,33 @@ class AttachDiskRequestSchema(schema.RequestSchema): class AttachDiskResponseSchema(schema.ResponseSchema): - """ AttachDisk - 绑定硬盘 - """ + """AttachDisk - 绑定硬盘""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: AttachNIC + +绑定UCloudStack网卡 +""" + + +class AttachNICRequestSchema(schema.RequestSchema): + """AttachNIC - 绑定UCloudStack网卡""" + + fields = { + "NICID": fields.Str(required=True, dump_to="NICID"), + "Region": fields.Str(required=True, dump_to="Region"), + "ResourceID": fields.Str(required=True, dump_to="ResourceID"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class AttachNICResponseSchema(schema.ResponseSchema): + """AttachNIC - 绑定UCloudStack网卡""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -77,8 +100,7 @@ class AttachDiskResponseSchema(schema.ResponseSchema): class BindAlarmTemplateRequestSchema(schema.RequestSchema): - """ BindAlarmTemplate - 绑定告警模板 - """ + """BindAlarmTemplate - 绑定告警模板""" fields = { "AlarmTemplateID": fields.Str(required=True, dump_to="AlarmTemplateID"), @@ -90,8 +112,7 @@ class BindAlarmTemplateRequestSchema(schema.RequestSchema): class BindAlarmTemplateResponseSchema(schema.ResponseSchema): - """ BindAlarmTemplate - 绑定告警模板 - """ + """BindAlarmTemplate - 绑定告警模板""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -101,13 +122,12 @@ class BindAlarmTemplateResponseSchema(schema.ResponseSchema): """ API: BindEIP -绑定UCoudStack外网IP +绑定外网 IP """ class BindEIPRequestSchema(schema.RequestSchema): - """ BindEIP - 绑定UCoudStack外网IP - """ + """BindEIP - 绑定外网 IP""" fields = { "EIPID": fields.Str(required=True, dump_to="EIPID"), @@ -119,8 +139,7 @@ class BindEIPRequestSchema(schema.RequestSchema): class BindEIPResponseSchema(schema.ResponseSchema): - """ BindEIP - 绑定UCoudStack外网IP - """ + """BindEIP - 绑定外网 IP""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -135,8 +154,7 @@ class BindEIPResponseSchema(schema.ResponseSchema): class BindPhysicalIPRequestSchema(schema.RequestSchema): - """ BindPhysicalIP - 绑定物理 IP ,被绑定的资源必须处于运行中或有效状态。 - """ + """BindPhysicalIP - 绑定物理 IP ,被绑定的资源必须处于运行中或有效状态。""" fields = { "PhysicalIPID": fields.Str(required=True, dump_to="PhysicalIPID"), @@ -148,8 +166,7 @@ class BindPhysicalIPRequestSchema(schema.RequestSchema): class BindPhysicalIPResponseSchema(schema.ResponseSchema): - """ BindPhysicalIP - 绑定物理 IP ,被绑定的资源必须处于运行中或有效状态。 - """ + """BindPhysicalIP - 绑定物理 IP ,被绑定的资源必须处于运行中或有效状态。""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -164,11 +181,10 @@ class BindPhysicalIPResponseSchema(schema.ResponseSchema): class BindSecurityGroupRequestSchema(schema.RequestSchema): - """ BindSecurityGroup - 绑定安全组 - """ + """BindSecurityGroup - 绑定安全组""" fields = { - "NICID": fields.Str(required=False, dump_to="NICID"), + "NICType": fields.Str(required=False, dump_to="NICType"), "Region": fields.Str(required=True, dump_to="Region"), "ResourceID": fields.Str(required=True, dump_to="ResourceID"), "SGID": fields.Str(required=True, dump_to="SGID"), @@ -177,8 +193,7 @@ class BindSecurityGroupRequestSchema(schema.RequestSchema): class BindSecurityGroupResponseSchema(schema.ResponseSchema): - """ BindSecurityGroup - 绑定安全组 - """ + """BindSecurityGroup - 绑定安全组""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -193,8 +208,7 @@ class BindSecurityGroupResponseSchema(schema.ResponseSchema): class CloneDiskRequestSchema(schema.RequestSchema): - """ CloneDisk - 克隆硬盘 - """ + """CloneDisk - 克隆硬盘""" fields = { "ChargeType": fields.Str(required=True, dump_to="ChargeType"), @@ -207,8 +221,7 @@ class CloneDiskRequestSchema(schema.RequestSchema): class CloneDiskResponseSchema(schema.ResponseSchema): - """ CloneDisk - 克隆硬盘 - """ + """CloneDisk - 克隆硬盘""" fields = { "DiskID": fields.Str(required=True, load_from="DiskID"), @@ -224,8 +237,7 @@ class CloneDiskResponseSchema(schema.ResponseSchema): class CreateCertificateRequestSchema(schema.RequestSchema): - """ CreateCertificate - 创建证书 - """ + """CreateCertificate - 创建证书""" fields = { "Certificate": fields.Str(required=True, dump_to="Certificate"), @@ -239,8 +251,7 @@ class CreateCertificateRequestSchema(schema.RequestSchema): class CreateCertificateResponseSchema(schema.ResponseSchema): - """ CreateCertificate - 创建证书 - """ + """CreateCertificate - 创建证书""" fields = { "CertificateID": fields.Str(required=True, load_from="CertificateID"), @@ -256,8 +267,7 @@ class CreateCertificateResponseSchema(schema.ResponseSchema): class CreateCustomImageRequestSchema(schema.RequestSchema): - """ CreateCustomImage - 创建自制镜像 - """ + """CreateCustomImage - 创建自制镜像""" fields = { "ImageDescription": fields.Str( @@ -271,8 +281,7 @@ class CreateCustomImageRequestSchema(schema.RequestSchema): class CreateCustomImageResponseSchema(schema.ResponseSchema): - """ CreateCustomImage - 创建自制镜像 - """ + """CreateCustomImage - 创建自制镜像""" fields = { "ImageID": fields.Str(required=True, load_from="ImageID"), @@ -288,8 +297,7 @@ class CreateCustomImageResponseSchema(schema.ResponseSchema): class CreateDiskRequestSchema(schema.RequestSchema): - """ CreateDisk - 创建硬盘 - """ + """CreateDisk - 创建硬盘""" fields = { "ChargeType": fields.Str(required=True, dump_to="ChargeType"), @@ -303,8 +311,7 @@ class CreateDiskRequestSchema(schema.RequestSchema): class CreateDiskResponseSchema(schema.ResponseSchema): - """ CreateDisk - 创建硬盘 - """ + """CreateDisk - 创建硬盘""" fields = { "DiskID": fields.Str(required=True, load_from="DiskID"), @@ -320,8 +327,7 @@ class CreateDiskResponseSchema(schema.ResponseSchema): class CreateLBRequestSchema(schema.RequestSchema): - """ CreateLB - 创建负载均衡 - """ + """CreateLB - 创建负载均衡""" fields = { "ChargeType": fields.Str(required=True, dump_to="ChargeType"), @@ -340,8 +346,7 @@ class CreateLBRequestSchema(schema.RequestSchema): class CreateLBResponseSchema(schema.ResponseSchema): - """ CreateLB - 创建负载均衡 - """ + """CreateLB - 创建负载均衡""" fields = { "LBID": fields.Str(required=False, load_from="LBID"), @@ -357,8 +362,7 @@ class CreateLBResponseSchema(schema.ResponseSchema): class CreateNATGWRequestSchema(schema.RequestSchema): - """ CreateNATGW - 创建NAT网关 - """ + """CreateNATGW - 创建NAT网关""" fields = { "ChargeType": fields.Str(required=True, dump_to="ChargeType"), @@ -376,8 +380,7 @@ class CreateNATGWRequestSchema(schema.RequestSchema): class CreateNATGWResponseSchema(schema.ResponseSchema): - """ CreateNATGW - 创建NAT网关 - """ + """CreateNATGW - 创建NAT网关""" fields = { "Message": fields.Str(required=False, load_from="Message"), @@ -393,8 +396,7 @@ class CreateNATGWResponseSchema(schema.ResponseSchema): class CreateNATGWRuleRequestSchema(schema.RequestSchema): - """ CreateNATGWRule - 添加NAT网关白名单 - """ + """CreateNATGWRule - 添加NAT网关白名单""" fields = { "BindResourceID": fields.Str(required=True, dump_to="BindResourceID"), @@ -406,8 +408,7 @@ class CreateNATGWRuleRequestSchema(schema.RequestSchema): class CreateNATGWRuleResponseSchema(schema.ResponseSchema): - """ CreateNATGWRule - 添加NAT网关白名单 - """ + """CreateNATGWRule - 添加NAT网关白名单""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -415,6 +416,36 @@ class CreateNATGWRuleResponseSchema(schema.ResponseSchema): } +""" +API: CreateNIC + +创建网卡 +""" + + +class CreateNICRequestSchema(schema.RequestSchema): + """CreateNIC - 创建网卡""" + + fields = { + "IP": fields.Str(required=False, dump_to="IP"), + "Name": fields.Str(required=True, dump_to="Name"), + "Region": fields.Str(required=True, dump_to="Region"), + "SGID": fields.Str(required=False, dump_to="SGID"), + "SubnetID": fields.Str(required=True, dump_to="SubnetID"), + "VPCID": fields.Str(required=True, dump_to="VPCID"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateNICResponseSchema(schema.ResponseSchema): + """CreateNIC - 创建网卡""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "NICID": fields.Str(required=True, load_from="NICID"), + } + + """ API: CreatePhysicalIP @@ -423,8 +454,7 @@ class CreateNATGWRuleResponseSchema(schema.ResponseSchema): class CreatePhysicalIPRequestSchema(schema.RequestSchema): - """ CreatePhysicalIP - 创建物理 IP ,需确保平台已配置物理 IP 线路相关信息及物理网络联通性。 - """ + """CreatePhysicalIP - 创建物理 IP ,需确保平台已配置物理 IP 线路相关信息及物理网络联通性。""" fields = { "Name": fields.Str(required=True, dump_to="Name"), @@ -436,8 +466,7 @@ class CreatePhysicalIPRequestSchema(schema.RequestSchema): class CreatePhysicalIPResponseSchema(schema.ResponseSchema): - """ CreatePhysicalIP - 创建物理 IP ,需确保平台已配置物理 IP 线路相关信息及物理网络联通性。 - """ + """CreatePhysicalIP - 创建物理 IP ,需确保平台已配置物理 IP 线路相关信息及物理网络联通性。""" fields = { "Message": fields.Str(required=False, load_from="Message"), @@ -453,8 +482,7 @@ class CreatePhysicalIPResponseSchema(schema.ResponseSchema): class CreateRSRequestSchema(schema.RequestSchema): - """ CreateRS - 为负载均衡的 VServer 添加后端服务节点。 - """ + """CreateRS - 为负载均衡的 VServer 添加后端服务节点。""" fields = { "BindResourceID": fields.Str(required=True, dump_to="BindResourceID"), @@ -468,8 +496,7 @@ class CreateRSRequestSchema(schema.RequestSchema): class CreateRSResponseSchema(schema.ResponseSchema): - """ CreateRS - 为负载均衡的 VServer 添加后端服务节点。 - """ + """CreateRS - 为负载均衡的 VServer 添加后端服务节点。""" fields = { "Message": fields.Str(required=False, load_from="Message"), @@ -485,8 +512,7 @@ class CreateRSResponseSchema(schema.ResponseSchema): class CreateSecurityGroupRequestSchema(schema.RequestSchema): - """ CreateSecurityGroup - 创建安全组 - """ + """CreateSecurityGroup - 创建安全组""" fields = { "Name": fields.Str(required=True, dump_to="Name"), @@ -498,8 +524,7 @@ class CreateSecurityGroupRequestSchema(schema.RequestSchema): class CreateSecurityGroupResponseSchema(schema.ResponseSchema): - """ CreateSecurityGroup - 创建安全组 - """ + """CreateSecurityGroup - 创建安全组""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -515,8 +540,7 @@ class CreateSecurityGroupResponseSchema(schema.ResponseSchema): class CreateSecurityGroupRuleRequestSchema(schema.RequestSchema): - """ CreateSecurityGroupRule - 创建安全组规则 - """ + """CreateSecurityGroupRule - 创建安全组规则""" fields = { "Region": fields.Str(required=True, dump_to="Region"), @@ -527,8 +551,7 @@ class CreateSecurityGroupRuleRequestSchema(schema.RequestSchema): class CreateSecurityGroupRuleResponseSchema(schema.ResponseSchema): - """ CreateSecurityGroupRule - 创建安全组规则 - """ + """CreateSecurityGroupRule - 创建安全组规则""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -544,8 +567,7 @@ class CreateSecurityGroupRuleResponseSchema(schema.ResponseSchema): class CreateSnapshotRequestSchema(schema.RequestSchema): - """ CreateSnapshot - 创建硬盘快照 - """ + """CreateSnapshot - 创建硬盘快照""" fields = { "DiskID": fields.Str(required=True, dump_to="DiskID"), @@ -557,8 +579,7 @@ class CreateSnapshotRequestSchema(schema.RequestSchema): class CreateSnapshotResponseSchema(schema.ResponseSchema): - """ CreateSnapshot - 创建硬盘快照 - """ + """CreateSnapshot - 创建硬盘快照""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -574,8 +595,7 @@ class CreateSnapshotResponseSchema(schema.ResponseSchema): class CreateSubnetRequestSchema(schema.RequestSchema): - """ CreateSubnet - 创建子网 - """ + """CreateSubnet - 创建子网""" fields = { "Name": fields.Str(required=True, dump_to="Name"), @@ -588,8 +608,7 @@ class CreateSubnetRequestSchema(schema.RequestSchema): class CreateSubnetResponseSchema(schema.ResponseSchema): - """ CreateSubnet - 创建子网 - """ + """CreateSubnet - 创建子网""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -605,8 +624,7 @@ class CreateSubnetResponseSchema(schema.ResponseSchema): class CreateUserRequestSchema(schema.RequestSchema): - """ CreateUser - 管理员添加账号 - """ + """CreateUser - 管理员添加账号""" fields = { "PassWord": fields.Str(required=True, dump_to="PassWord"), @@ -615,8 +633,7 @@ class CreateUserRequestSchema(schema.RequestSchema): class CreateUserResponseSchema(schema.ResponseSchema): - """ CreateUser - 管理员添加账号 - """ + """CreateUser - 管理员添加账号""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -632,8 +649,7 @@ class CreateUserResponseSchema(schema.ResponseSchema): class CreateVMInstanceRequestSchema(schema.RequestSchema): - """ CreateVMInstance - 创建虚拟机 - """ + """CreateVMInstance - 创建虚拟机""" fields = { "Bandwidth": fields.Str(required=False, dump_to="Bandwidth"), @@ -663,8 +679,7 @@ class CreateVMInstanceRequestSchema(schema.RequestSchema): class CreateVMInstanceResponseSchema(schema.ResponseSchema): - """ CreateVMInstance - 创建虚拟机 - """ + """CreateVMInstance - 创建虚拟机""" fields = { "DiskID": fields.Str(required=False, load_from="DiskID"), @@ -682,8 +697,7 @@ class CreateVMInstanceResponseSchema(schema.ResponseSchema): class CreateVPCRequestSchema(schema.RequestSchema): - """ CreateVPC - 创建VPC - """ + """CreateVPC - 创建VPC""" fields = { "Name": fields.Str(required=True, dump_to="Name"), @@ -695,8 +709,7 @@ class CreateVPCRequestSchema(schema.RequestSchema): class CreateVPCResponseSchema(schema.ResponseSchema): - """ CreateVPC - 创建VPC - """ + """CreateVPC - 创建VPC""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -712,8 +725,7 @@ class CreateVPCResponseSchema(schema.ResponseSchema): class CreateVSRequestSchema(schema.RequestSchema): - """ CreateVS - 创建负载均衡VServer - """ + """CreateVS - 创建负载均衡VServer""" fields = { "CACertificateID": fields.Str( @@ -743,11 +755,12 @@ class CreateVSRequestSchema(schema.RequestSchema): class CreateVSResponseSchema(schema.ResponseSchema): - """ CreateVS - 创建负载均衡VServer - """ + """CreateVS - 创建负载均衡VServer""" fields = { + "Action": fields.Str(required=True, load_from="Action"), "Message": fields.Str(required=False, load_from="Message"), + "RetCode": fields.Int(required=True, load_from="RetCode"), "VSID": fields.Str(required=False, load_from="VSID"), } @@ -760,8 +773,7 @@ class CreateVSResponseSchema(schema.ResponseSchema): class CreateVSPolicyRequestSchema(schema.RequestSchema): - """ CreateVSPolicy - 创建七层负载均衡内容转发规则,仅当 VServer 的监听协议为 HTTP 时有效。 - """ + """CreateVSPolicy - 创建七层负载均衡内容转发规则,仅当 VServer 的监听协议为 HTTP 时有效。""" fields = { "Domain": fields.Str(required=False, dump_to="Domain"), @@ -775,8 +787,7 @@ class CreateVSPolicyRequestSchema(schema.RequestSchema): class CreateVSPolicyResponseSchema(schema.ResponseSchema): - """ CreateVSPolicy - 创建七层负载均衡内容转发规则,仅当 VServer 的监听协议为 HTTP 时有效。 - """ + """CreateVSPolicy - 创建七层负载均衡内容转发规则,仅当 VServer 的监听协议为 HTTP 时有效。""" fields = { "Message": fields.Str(required=False, load_from="Message"), @@ -792,8 +803,7 @@ class CreateVSPolicyResponseSchema(schema.ResponseSchema): class DeleteCertificateRequestSchema(schema.RequestSchema): - """ DeleteCertificate - 删除证书 - """ + """DeleteCertificate - 删除证书""" fields = { "CertificateID": fields.Str(required=True, dump_to="CertificateID"), @@ -803,8 +813,7 @@ class DeleteCertificateRequestSchema(schema.RequestSchema): class DeleteCertificateResponseSchema(schema.ResponseSchema): - """ DeleteCertificate - 删除证书 - """ + """DeleteCertificate - 删除证书""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -819,8 +828,7 @@ class DeleteCertificateResponseSchema(schema.ResponseSchema): class DeleteCustomImageRequestSchema(schema.RequestSchema): - """ DeleteCustomImage - 删除自制镜像 - """ + """DeleteCustomImage - 删除自制镜像""" fields = { "ImageID": fields.Str(required=True, dump_to="ImageID"), @@ -830,8 +838,7 @@ class DeleteCustomImageRequestSchema(schema.RequestSchema): class DeleteCustomImageResponseSchema(schema.ResponseSchema): - """ DeleteCustomImage - 删除自制镜像 - """ + """DeleteCustomImage - 删除自制镜像""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -846,8 +853,7 @@ class DeleteCustomImageResponseSchema(schema.ResponseSchema): class DeleteDiskRequestSchema(schema.RequestSchema): - """ DeleteDisk - 删除硬盘 - """ + """DeleteDisk - 删除硬盘""" fields = { "DiskID": fields.Str(required=True, dump_to="DiskID"), @@ -857,8 +863,7 @@ class DeleteDiskRequestSchema(schema.RequestSchema): class DeleteDiskResponseSchema(schema.ResponseSchema): - """ DeleteDisk - 删除硬盘 - """ + """DeleteDisk - 删除硬盘""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -873,8 +878,7 @@ class DeleteDiskResponseSchema(schema.ResponseSchema): class DeleteLBRequestSchema(schema.RequestSchema): - """ DeleteLB - 删除负载均衡 - """ + """DeleteLB - 删除负载均衡""" fields = { "LBID": fields.Str(required=True, dump_to="LBID"), @@ -884,8 +888,7 @@ class DeleteLBRequestSchema(schema.RequestSchema): class DeleteLBResponseSchema(schema.ResponseSchema): - """ DeleteLB - 删除负载均衡 - """ + """DeleteLB - 删除负载均衡""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -900,8 +903,7 @@ class DeleteLBResponseSchema(schema.ResponseSchema): class DeleteNATGWRequestSchema(schema.RequestSchema): - """ DeleteNATGW - 删除NAT网关 - """ + """DeleteNATGW - 删除NAT网关""" fields = { "NATGWID": fields.Str(required=True, dump_to="NATGWID"), @@ -911,8 +913,7 @@ class DeleteNATGWRequestSchema(schema.RequestSchema): class DeleteNATGWResponseSchema(schema.ResponseSchema): - """ DeleteNATGW - 删除NAT网关 - """ + """DeleteNATGW - 删除NAT网关""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -927,8 +928,7 @@ class DeleteNATGWResponseSchema(schema.ResponseSchema): class DeleteNATGWRuleRequestSchema(schema.RequestSchema): - """ DeleteNATGWRule - 删除NAT网关白名单 - """ + """DeleteNATGWRule - 删除NAT网关白名单""" fields = { "NATGWID": fields.Str(required=True, dump_to="NATGWID"), @@ -939,8 +939,32 @@ class DeleteNATGWRuleRequestSchema(schema.RequestSchema): class DeleteNATGWRuleResponseSchema(schema.ResponseSchema): - """ DeleteNATGWRule - 删除NAT网关白名单 - """ + """DeleteNATGWRule - 删除NAT网关白名单""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DeleteNIC + +删除网卡 +""" + + +class DeleteNICRequestSchema(schema.RequestSchema): + """DeleteNIC - 删除网卡""" + + fields = { + "NICID": fields.Str(required=True, dump_to="NICID"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DeleteNICResponseSchema(schema.ResponseSchema): + """DeleteNIC - 删除网卡""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -955,8 +979,7 @@ class DeleteNATGWRuleResponseSchema(schema.ResponseSchema): class DeletePhysicalIPRequestSchema(schema.RequestSchema): - """ DeletePhysicalIP - 删除物理IP - """ + """DeletePhysicalIP - 删除物理IP""" fields = { "PhysicalIPID": fields.Str(required=True, dump_to="PhysicalIPID"), @@ -966,8 +989,7 @@ class DeletePhysicalIPRequestSchema(schema.RequestSchema): class DeletePhysicalIPResponseSchema(schema.ResponseSchema): - """ DeletePhysicalIP - 删除物理IP - """ + """DeletePhysicalIP - 删除物理IP""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -982,8 +1004,7 @@ class DeletePhysicalIPResponseSchema(schema.ResponseSchema): class DeleteRSRequestSchema(schema.RequestSchema): - """ DeleteRS - 移除负载均衡的单个服务节点 - """ + """DeleteRS - 移除负载均衡的单个服务节点""" fields = { "LBID": fields.Str(required=True, dump_to="LBID"), @@ -995,8 +1016,7 @@ class DeleteRSRequestSchema(schema.RequestSchema): class DeleteRSResponseSchema(schema.ResponseSchema): - """ DeleteRS - 移除负载均衡的单个服务节点 - """ + """DeleteRS - 移除负载均衡的单个服务节点""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -1011,8 +1031,7 @@ class DeleteRSResponseSchema(schema.ResponseSchema): class DeleteSecurityGroupRequestSchema(schema.RequestSchema): - """ DeleteSecurityGroup - 删除安全组 - """ + """DeleteSecurityGroup - 删除安全组""" fields = { "Region": fields.Str(required=True, dump_to="Region"), @@ -1022,8 +1041,7 @@ class DeleteSecurityGroupRequestSchema(schema.RequestSchema): class DeleteSecurityGroupResponseSchema(schema.ResponseSchema): - """ DeleteSecurityGroup - 删除安全组 - """ + """DeleteSecurityGroup - 删除安全组""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -1038,8 +1056,7 @@ class DeleteSecurityGroupResponseSchema(schema.ResponseSchema): class DeleteSecurityGroupRuleRequestSchema(schema.RequestSchema): - """ DeleteSecurityGroupRule - 删除安全组规则 - """ + """DeleteSecurityGroupRule - 删除安全组规则""" fields = { "Region": fields.Str(required=True, dump_to="Region"), @@ -1050,8 +1067,7 @@ class DeleteSecurityGroupRuleRequestSchema(schema.RequestSchema): class DeleteSecurityGroupRuleResponseSchema(schema.ResponseSchema): - """ DeleteSecurityGroupRule - 删除安全组规则 - """ + """DeleteSecurityGroupRule - 删除安全组规则""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -1066,8 +1082,7 @@ class DeleteSecurityGroupRuleResponseSchema(schema.ResponseSchema): class DeleteSnapshotRequestSchema(schema.RequestSchema): - """ DeleteSnapshot - 删除快照,仅支持状态为正常的快照进行删除操作。 - """ + """DeleteSnapshot - 删除快照,仅支持状态为正常的快照进行删除操作。""" fields = { "Region": fields.Str(required=True, dump_to="Region"), @@ -1077,8 +1092,7 @@ class DeleteSnapshotRequestSchema(schema.RequestSchema): class DeleteSnapshotResponseSchema(schema.ResponseSchema): - """ DeleteSnapshot - 删除快照,仅支持状态为正常的快照进行删除操作。 - """ + """DeleteSnapshot - 删除快照,仅支持状态为正常的快照进行删除操作。""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -1093,8 +1107,7 @@ class DeleteSnapshotResponseSchema(schema.ResponseSchema): class DeleteSubnetRequestSchema(schema.RequestSchema): - """ DeleteSubnet - 删除子网 - """ + """DeleteSubnet - 删除子网""" fields = { "Region": fields.Str(required=True, dump_to="Region"), @@ -1104,8 +1117,7 @@ class DeleteSubnetRequestSchema(schema.RequestSchema): class DeleteSubnetResponseSchema(schema.ResponseSchema): - """ DeleteSubnet - 删除子网 - """ + """DeleteSubnet - 删除子网""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -1120,8 +1132,7 @@ class DeleteSubnetResponseSchema(schema.ResponseSchema): class DeleteVMInstanceRequestSchema(schema.RequestSchema): - """ DeleteVMInstance - 删除虚拟机 - """ + """DeleteVMInstance - 删除虚拟机""" fields = { "Region": fields.Str(required=True, dump_to="Region"), @@ -1131,8 +1142,7 @@ class DeleteVMInstanceRequestSchema(schema.RequestSchema): class DeleteVMInstanceResponseSchema(schema.ResponseSchema): - """ DeleteVMInstance - 删除虚拟机 - """ + """DeleteVMInstance - 删除虚拟机""" fields = { "Message": fields.Str(required=False, load_from="Message"), @@ -1147,8 +1157,7 @@ class DeleteVMInstanceResponseSchema(schema.ResponseSchema): class DeleteVPCRequestSchema(schema.RequestSchema): - """ DeleteVPC - 删除VPC - """ + """DeleteVPC - 删除VPC""" fields = { "Region": fields.Str(required=True, dump_to="Region"), @@ -1158,8 +1167,7 @@ class DeleteVPCRequestSchema(schema.RequestSchema): class DeleteVPCResponseSchema(schema.ResponseSchema): - """ DeleteVPC - 删除VPC - """ + """DeleteVPC - 删除VPC""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -1174,8 +1182,7 @@ class DeleteVPCResponseSchema(schema.ResponseSchema): class DeleteVSRequestSchema(schema.RequestSchema): - """ DeleteVS - 删除VServer - """ + """DeleteVS - 删除VServer""" fields = { "LBID": fields.Str(required=True, dump_to="LBID"), @@ -1186,8 +1193,7 @@ class DeleteVSRequestSchema(schema.RequestSchema): class DeleteVSResponseSchema(schema.ResponseSchema): - """ DeleteVS - 删除VServer - """ + """DeleteVS - 删除VServer""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -1202,8 +1208,7 @@ class DeleteVSResponseSchema(schema.ResponseSchema): class DeleteVSPolicyRequestSchema(schema.RequestSchema): - """ DeleteVSPolicy - 删除七层负载均衡内容转发规则,仅当 VServer 的监听协议为 HTTP 时有效。 - """ + """DeleteVSPolicy - 删除七层负载均衡内容转发规则,仅当 VServer 的监听协议为 HTTP 时有效。""" fields = { "LBID": fields.Str(required=True, dump_to="LBID"), @@ -1215,8 +1220,7 @@ class DeleteVSPolicyRequestSchema(schema.RequestSchema): class DeleteVSPolicyResponseSchema(schema.ResponseSchema): - """ DeleteVSPolicy - 删除七层负载均衡内容转发规则,仅当 VServer 的监听协议为 HTTP 时有效。 - """ + """DeleteVSPolicy - 删除七层负载均衡内容转发规则,仅当 VServer 的监听协议为 HTTP 时有效。""" fields = { "Message": fields.Str(required=False, load_from="Message"), @@ -1231,8 +1235,7 @@ class DeleteVSPolicyResponseSchema(schema.ResponseSchema): class DescribeCertificateRequestSchema(schema.RequestSchema): - """ DescribeCertificate - 查询证书 - """ + """DescribeCertificate - 查询证书""" fields = { "CertificateIDs": fields.List(fields.Str()), @@ -1247,8 +1250,7 @@ class DescribeCertificateRequestSchema(schema.RequestSchema): class DescribeCertificateResponseSchema(schema.ResponseSchema): - """ DescribeCertificate - 查询证书 - """ + """DescribeCertificate - 查询证书""" fields = { "Infos": fields.List( @@ -1267,11 +1269,11 @@ class DescribeCertificateResponseSchema(schema.ResponseSchema): class DescribeDiskRequestSchema(schema.RequestSchema): - """ DescribeDisk - 获取硬盘信息 - """ + """DescribeDisk - 获取硬盘信息""" fields = { "DiskIDs": fields.List(fields.Str()), + "DiskType": fields.Str(required=False, dump_to="DiskType"), "Limit": fields.Int(required=False, dump_to="Limit"), "Offset": fields.Int(required=False, dump_to="Offset"), "Region": fields.Str(required=True, dump_to="Region"), @@ -1280,8 +1282,7 @@ class DescribeDiskRequestSchema(schema.RequestSchema): class DescribeDiskResponseSchema(schema.ResponseSchema): - """ DescribeDisk - 获取硬盘信息 - """ + """DescribeDisk - 获取硬盘信息""" fields = { "Infos": fields.List( @@ -1300,11 +1301,12 @@ class DescribeDiskResponseSchema(schema.ResponseSchema): class DescribeEIPRequestSchema(schema.RequestSchema): - """ DescribeEIP - 获取外网IP的信息 - """ + """DescribeEIP - 获取外网IP的信息""" fields = { + "BindResourceID": fields.Str(required=False, dump_to="BindResourceID"), "EIPIDs": fields.List(fields.Str()), + "IPVersion": fields.Str(required=False, dump_to="IPVersion"), "Limit": fields.Str(required=False, dump_to="Limit"), "Offset": fields.Str(required=False, dump_to="Offset"), "Region": fields.Str(required=True, dump_to="Region"), @@ -1313,8 +1315,7 @@ class DescribeEIPRequestSchema(schema.RequestSchema): class DescribeEIPResponseSchema(schema.ResponseSchema): - """ DescribeEIP - 获取外网IP的信息 - """ + """DescribeEIP - 获取外网IP的信息""" fields = { "Infos": fields.List( @@ -1333,8 +1334,7 @@ class DescribeEIPResponseSchema(schema.ResponseSchema): class DescribeImageRequestSchema(schema.RequestSchema): - """ DescribeImage - 获取镜像信息,包括默认镜像和自制镜像。 - """ + """DescribeImage - 获取镜像信息,包括默认镜像和自制镜像。""" fields = { "ImageIDs": fields.List(fields.Str()), @@ -1347,8 +1347,7 @@ class DescribeImageRequestSchema(schema.RequestSchema): class DescribeImageResponseSchema(schema.ResponseSchema): - """ DescribeImage - 获取镜像信息,包括默认镜像和自制镜像。 - """ + """DescribeImage - 获取镜像信息,包括默认镜像和自制镜像。""" fields = { "Action": fields.Str(required=True, load_from="Action"), @@ -1369,8 +1368,7 @@ class DescribeImageResponseSchema(schema.ResponseSchema): class DescribeLBRequestSchema(schema.RequestSchema): - """ DescribeLB - 获取负载均衡信息 - """ + """DescribeLB - 获取负载均衡信息""" fields = { "LBIDs": fields.List(fields.Str()), @@ -1384,8 +1382,7 @@ class DescribeLBRequestSchema(schema.RequestSchema): class DescribeLBResponseSchema(schema.ResponseSchema): - """ DescribeLB - 获取负载均衡信息 - """ + """DescribeLB - 获取负载均衡信息""" fields = { "Infos": fields.List( @@ -1404,8 +1401,7 @@ class DescribeLBResponseSchema(schema.ResponseSchema): class DescribeMetricRequestSchema(schema.RequestSchema): - """ DescribeMetric - 获取资源监控信息 - """ + """DescribeMetric - 获取资源监控信息""" fields = { "BeginTime": fields.Str(required=True, dump_to="BeginTime"), @@ -1419,8 +1415,7 @@ class DescribeMetricRequestSchema(schema.RequestSchema): class DescribeMetricResponseSchema(schema.ResponseSchema): - """ DescribeMetric - 获取资源监控信息 - """ + """DescribeMetric - 获取资源监控信息""" fields = { "Infos": fields.List( @@ -1439,8 +1434,7 @@ class DescribeMetricResponseSchema(schema.ResponseSchema): class DescribeNATGWRequestSchema(schema.RequestSchema): - """ DescribeNATGW - 获取NAT网关信息 - """ + """DescribeNATGW - 获取NAT网关信息""" fields = { "Limit": fields.Int(required=False, dump_to="Limit"), @@ -1452,8 +1446,7 @@ class DescribeNATGWRequestSchema(schema.RequestSchema): class DescribeNATGWResponseSchema(schema.ResponseSchema): - """ DescribeNATGW - 获取NAT网关信息 - """ + """DescribeNATGW - 获取NAT网关信息""" fields = { "Infos": fields.List( @@ -1472,8 +1465,7 @@ class DescribeNATGWResponseSchema(schema.ResponseSchema): class DescribeNATGWRuleRequestSchema(schema.RequestSchema): - """ DescribeNATGWRule - 获取NAT网关白名单信息 - """ + """DescribeNATGWRule - 获取NAT网关白名单信息""" fields = { "BindResourceIDs": fields.List(fields.Str()), @@ -1488,8 +1480,7 @@ class DescribeNATGWRuleRequestSchema(schema.RequestSchema): class DescribeNATGWRuleResponseSchema(schema.ResponseSchema): - """ DescribeNATGWRule - 获取NAT网关白名单信息 - """ + """DescribeNATGWRule - 获取NAT网关白名单信息""" fields = { "Infos": fields.List( @@ -1500,6 +1491,37 @@ class DescribeNATGWRuleResponseSchema(schema.ResponseSchema): } +""" +API: DescribeNIC + +获取网卡信息 +""" + + +class DescribeNICRequestSchema(schema.RequestSchema): + """DescribeNIC - 获取网卡信息""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "NICIDs": fields.List(fields.Str()), + "Offset": fields.Int(required=False, dump_to="Offset"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeNICResponseSchema(schema.ResponseSchema): + """DescribeNIC - 获取网卡信息""" + + fields = { + "Infos": fields.List( + models.NICInfoSchema(), required=True, load_from="Infos" + ), + "Message": fields.Str(required=True, load_from="Message"), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + """ API: DescribeOPLogs @@ -1508,8 +1530,7 @@ class DescribeNATGWRuleResponseSchema(schema.ResponseSchema): class DescribeOPLogsRequestSchema(schema.RequestSchema): - """ DescribeOPLogs - 查询操作日志 - """ + """DescribeOPLogs - 查询操作日志""" fields = { "BeginTime": fields.Int(required=True, dump_to="BeginTime"), @@ -1525,8 +1546,7 @@ class DescribeOPLogsRequestSchema(schema.RequestSchema): class DescribeOPLogsResponseSchema(schema.ResponseSchema): - """ DescribeOPLogs - 查询操作日志 - """ + """DescribeOPLogs - 查询操作日志""" fields = { "Infos": fields.List( @@ -1545,8 +1565,7 @@ class DescribeOPLogsResponseSchema(schema.ResponseSchema): class DescribePhysicalIPRequestSchema(schema.RequestSchema): - """ DescribePhysicalIP - 获取物理IP信息 - """ + """DescribePhysicalIP - 获取物理IP信息""" fields = { "Limit": fields.Str(required=False, dump_to="Limit"), @@ -1558,8 +1577,7 @@ class DescribePhysicalIPRequestSchema(schema.RequestSchema): class DescribePhysicalIPResponseSchema(schema.ResponseSchema): - """ DescribePhysicalIP - 获取物理IP信息 - """ + """DescribePhysicalIP - 获取物理IP信息""" fields = { "Infos": fields.List( @@ -1578,8 +1596,7 @@ class DescribePhysicalIPResponseSchema(schema.ResponseSchema): class DescribeRSRequestSchema(schema.RequestSchema): - """ DescribeRS - 获取负载均衡服务的服务节点信息 - """ + """DescribeRS - 获取负载均衡服务的服务节点信息""" fields = { "LBID": fields.Str(required=True, dump_to="LBID"), @@ -1593,8 +1610,7 @@ class DescribeRSRequestSchema(schema.RequestSchema): class DescribeRSResponseSchema(schema.ResponseSchema): - """ DescribeRS - 获取负载均衡服务的服务节点信息 - """ + """DescribeRS - 获取负载均衡服务的服务节点信息""" fields = { "Infos": fields.List( @@ -1613,8 +1629,7 @@ class DescribeRSResponseSchema(schema.ResponseSchema): class DescribeRecycledResourceRequestSchema(schema.RequestSchema): - """ DescribeRecycledResource - 查询回收站资源 - """ + """DescribeRecycledResource - 查询回收站资源""" fields = { "Limit": fields.Int(required=False, dump_to="Limit"), @@ -1626,8 +1641,7 @@ class DescribeRecycledResourceRequestSchema(schema.RequestSchema): class DescribeRecycledResourceResponseSchema(schema.ResponseSchema): - """ DescribeRecycledResource - 查询回收站资源 - """ + """DescribeRecycledResource - 查询回收站资源""" fields = { "Infos": fields.List( @@ -1647,8 +1661,7 @@ class DescribeRecycledResourceResponseSchema(schema.ResponseSchema): class DescribeSecurityGroupRequestSchema(schema.RequestSchema): - """ DescribeSecurityGroup - 查询安全组信息 - """ + """DescribeSecurityGroup - 查询安全组信息""" fields = { "Limit": fields.Int(required=False, dump_to="Limit"), @@ -1660,8 +1673,7 @@ class DescribeSecurityGroupRequestSchema(schema.RequestSchema): class DescribeSecurityGroupResponseSchema(schema.ResponseSchema): - """ DescribeSecurityGroup - 查询安全组信息 - """ + """DescribeSecurityGroup - 查询安全组信息""" fields = { "Infos": fields.List( @@ -1672,6 +1684,69 @@ class DescribeSecurityGroupResponseSchema(schema.ResponseSchema): } +""" +API: DescribeSecurityGroupResource + +查询安全组绑定的资源信息 +""" + + +class DescribeSecurityGroupResourceRequestSchema(schema.RequestSchema): + """DescribeSecurityGroupResource - 查询安全组绑定的资源信息""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "Region": fields.Str(required=True, dump_to="Region"), + "SGID": fields.Str(required=True, dump_to="SGID"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeSecurityGroupResourceResponseSchema(schema.ResponseSchema): + """DescribeSecurityGroupResource - 查询安全组绑定的资源信息""" + + fields = { + "Infos": fields.List( + models.SGResourceInfoSchema(), required=True, load_from="Infos" + ), + "Message": fields.Str(required=True, load_from="Message"), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeSnapshot + +查询硬盘快照信息 +""" + + +class DescribeSnapshotRequestSchema(schema.RequestSchema): + """DescribeSnapshot - 查询硬盘快照信息""" + + fields = { + "DiskID": fields.Str(required=False, dump_to="DiskID"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "Region": fields.Str(required=True, dump_to="Region"), + "SnapshotIDs": fields.List(fields.Str()), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeSnapshotResponseSchema(schema.ResponseSchema): + """DescribeSnapshot - 查询硬盘快照信息""" + + fields = { + "Infos": fields.List( + models.SnapshotInfoSchema(), required=True, load_from="Infos" + ), + "Message": fields.Str(required=True, load_from="Message"), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + """ API: DescribeStorageType @@ -1680,8 +1755,7 @@ class DescribeSecurityGroupResponseSchema(schema.ResponseSchema): class DescribeStorageTypeRequestSchema(schema.RequestSchema): - """ DescribeStorageType - 查询存储类型 - """ + """DescribeStorageType - 查询存储类型""" fields = { "Region": fields.Str(required=True, dump_to="Region"), @@ -1690,8 +1764,7 @@ class DescribeStorageTypeRequestSchema(schema.RequestSchema): class DescribeStorageTypeResponseSchema(schema.ResponseSchema): - """ DescribeStorageType - 查询存储类型 - """ + """DescribeStorageType - 查询存储类型""" fields = { "Infos": fields.List( @@ -1710,8 +1783,7 @@ class DescribeStorageTypeResponseSchema(schema.ResponseSchema): class DescribeSubnetRequestSchema(schema.RequestSchema): - """ DescribeSubnet - 查询子网信息 - """ + """DescribeSubnet - 查询子网信息""" fields = { "Limit": fields.Int(required=False, dump_to="Limit"), @@ -1724,8 +1796,7 @@ class DescribeSubnetRequestSchema(schema.RequestSchema): class DescribeSubnetResponseSchema(schema.ResponseSchema): - """ DescribeSubnet - 查询子网信息 - """ + """DescribeSubnet - 查询子网信息""" fields = { "Infos": fields.List( @@ -1744,8 +1815,7 @@ class DescribeSubnetResponseSchema(schema.ResponseSchema): class DescribeUserRequestSchema(schema.RequestSchema): - """ DescribeUser - 查询租户信息 - """ + """DescribeUser - 查询租户信息""" fields = { "Limit": fields.Int(required=False, dump_to="Limit"), @@ -1755,8 +1825,7 @@ class DescribeUserRequestSchema(schema.RequestSchema): class DescribeUserResponseSchema(schema.ResponseSchema): - """ DescribeUser - 查询租户信息 - """ + """DescribeUser - 查询租户信息""" fields = { "Infos": fields.List( @@ -1775,12 +1844,11 @@ class DescribeUserResponseSchema(schema.ResponseSchema): class DescribeVMInstanceRequestSchema(schema.RequestSchema): - """ DescribeVMInstance - 查询虚拟机 - """ + """DescribeVMInstance - 查询虚拟机""" fields = { "Limit": fields.Int(required=False, dump_to="Limit"), - "Offset": fields.Str(required=False, dump_to="Offset"), + "Offset": fields.Int(required=False, dump_to="Offset"), "Region": fields.Str(required=True, dump_to="Region"), "SubnetID": fields.Str(required=False, dump_to="SubnetID"), "VMIDs": fields.List(fields.Str()), @@ -1790,8 +1858,7 @@ class DescribeVMInstanceRequestSchema(schema.RequestSchema): class DescribeVMInstanceResponseSchema(schema.ResponseSchema): - """ DescribeVMInstance - 查询虚拟机 - """ + """DescribeVMInstance - 查询虚拟机""" fields = { "Infos": fields.List( @@ -1810,8 +1877,7 @@ class DescribeVMInstanceResponseSchema(schema.ResponseSchema): class DescribeVMTypeRequestSchema(schema.RequestSchema): - """ DescribeVMType - 查询主机机型 - """ + """DescribeVMType - 查询主机机型""" fields = { "Region": fields.Str(required=True, dump_to="Region"), @@ -1820,8 +1886,7 @@ class DescribeVMTypeRequestSchema(schema.RequestSchema): class DescribeVMTypeResponseSchema(schema.ResponseSchema): - """ DescribeVMType - 查询主机机型 - """ + """DescribeVMType - 查询主机机型""" fields = { "Infos": fields.List( @@ -1840,8 +1905,7 @@ class DescribeVMTypeResponseSchema(schema.ResponseSchema): class DescribeVPCRequestSchema(schema.RequestSchema): - """ DescribeVPC - 查询VPC信息 - """ + """DescribeVPC - 查询VPC信息""" fields = { "Limit": fields.Int(required=False, dump_to="Limit"), @@ -1853,8 +1917,7 @@ class DescribeVPCRequestSchema(schema.RequestSchema): class DescribeVPCResponseSchema(schema.ResponseSchema): - """ DescribeVPC - 查询VPC信息 - """ + """DescribeVPC - 查询VPC信息""" fields = { "Infos": fields.List( @@ -1873,8 +1936,7 @@ class DescribeVPCResponseSchema(schema.ResponseSchema): class DescribeVSRequestSchema(schema.RequestSchema): - """ DescribeVS - 获取负载均衡 VServer 信息 - """ + """DescribeVS - 获取负载均衡 VServer 信息""" fields = { "LBID": fields.Str(required=True, dump_to="LBID"), @@ -1887,8 +1949,7 @@ class DescribeVSRequestSchema(schema.RequestSchema): class DescribeVSResponseSchema(schema.ResponseSchema): - """ DescribeVS - 获取负载均衡 VServer 信息 - """ + """DescribeVS - 获取负载均衡 VServer 信息""" fields = { "Infos": fields.List( @@ -1907,8 +1968,7 @@ class DescribeVSResponseSchema(schema.ResponseSchema): class DescribeVSPolicyRequestSchema(schema.RequestSchema): - """ DescribeVSPolicy - 获取七层负载均衡内容转发规则信息,仅当 VServer 的监听协议为 HTTP 时有效。 - """ + """DescribeVSPolicy - 获取七层负载均衡内容转发规则信息,仅当 VServer 的监听协议为 HTTP 时有效。""" fields = { "LBID": fields.Str(required=True, dump_to="LBID"), @@ -1922,8 +1982,7 @@ class DescribeVSPolicyRequestSchema(schema.RequestSchema): class DescribeVSPolicyResponseSchema(schema.ResponseSchema): - """ DescribeVSPolicy - 获取七层负载均衡内容转发规则信息,仅当 VServer 的监听协议为 HTTP 时有效。 - """ + """DescribeVSPolicy - 获取七层负载均衡内容转发规则信息,仅当 VServer 的监听协议为 HTTP 时有效。""" fields = { "Infos": fields.List( @@ -1937,13 +1996,12 @@ class DescribeVSPolicyResponseSchema(schema.ResponseSchema): """ API: DetachDisk -解绑UClouStack硬盘 +解绑硬盘 """ class DetachDiskRequestSchema(schema.RequestSchema): - """ DetachDisk - 解绑UClouStack硬盘 - """ + """DetachDisk - 解绑硬盘""" fields = { "DiskID": fields.Str(required=True, dump_to="DiskID"), @@ -1954,8 +2012,33 @@ class DetachDiskRequestSchema(schema.RequestSchema): class DetachDiskResponseSchema(schema.ResponseSchema): - """ DetachDisk - 解绑UClouStack硬盘 - """ + """DetachDisk - 解绑硬盘""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DetachNIC + +解绑UClouStack网卡 +""" + + +class DetachNICRequestSchema(schema.RequestSchema): + """DetachNIC - 解绑UClouStack网卡""" + + fields = { + "NICID": fields.Str(required=True, dump_to="NICID"), + "Region": fields.Str(required=True, dump_to="Region"), + "ResourceID": fields.Str(required=True, dump_to="ResourceID"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DetachNICResponseSchema(schema.ResponseSchema): + """DetachNIC - 解绑UClouStack网卡""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -1970,8 +2053,7 @@ class DetachDiskResponseSchema(schema.ResponseSchema): class DisableRSRequestSchema(schema.RequestSchema): - """ DisableRS - 禁用负载均衡的单个服务节点 - """ + """DisableRS - 禁用负载均衡的单个服务节点""" fields = { "LBID": fields.Str(required=True, dump_to="LBID"), @@ -1983,8 +2065,7 @@ class DisableRSRequestSchema(schema.RequestSchema): class DisableRSResponseSchema(schema.ResponseSchema): - """ DisableRS - 禁用负载均衡的单个服务节点 - """ + """DisableRS - 禁用负载均衡的单个服务节点""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -1999,8 +2080,7 @@ class DisableRSResponseSchema(schema.ResponseSchema): class EnableRSRequestSchema(schema.RequestSchema): - """ EnableRS - 启用负载均衡的单个服务节点 - """ + """EnableRS - 启用负载均衡的单个服务节点""" fields = { "LBID": fields.Str(required=True, dump_to="LBID"), @@ -2012,8 +2092,7 @@ class EnableRSRequestSchema(schema.RequestSchema): class EnableRSResponseSchema(schema.ResponseSchema): - """ EnableRS - 启用负载均衡的单个服务节点 - """ + """EnableRS - 启用负载均衡的单个服务节点""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -2028,8 +2107,7 @@ class EnableRSResponseSchema(schema.ResponseSchema): class GetDiskPriceRequestSchema(schema.RequestSchema): - """ GetDiskPrice - 获取硬盘价格 - """ + """GetDiskPrice - 获取硬盘价格""" fields = { "ChargeType": fields.Str(required=True, dump_to="ChargeType"), @@ -2042,8 +2120,7 @@ class GetDiskPriceRequestSchema(schema.RequestSchema): class GetDiskPriceResponseSchema(schema.ResponseSchema): - """ GetDiskPrice - 获取硬盘价格 - """ + """GetDiskPrice - 获取硬盘价格""" fields = { "Infos": fields.List( @@ -2061,8 +2138,7 @@ class GetDiskPriceResponseSchema(schema.ResponseSchema): class GetEIPPriceRequestSchema(schema.RequestSchema): - """ GetEIPPrice - 获取外网IP价格 - """ + """GetEIPPrice - 获取外网IP价格""" fields = { "Bandwidth": fields.Int(required=True, dump_to="Bandwidth"), @@ -2075,8 +2151,7 @@ class GetEIPPriceRequestSchema(schema.RequestSchema): class GetEIPPriceResponseSchema(schema.ResponseSchema): - """ GetEIPPrice - 获取外网IP价格 - """ + """GetEIPPrice - 获取外网IP价格""" fields = { "Infos": fields.List( @@ -2094,8 +2169,7 @@ class GetEIPPriceResponseSchema(schema.ResponseSchema): class GetVMInstancePriceRequestSchema(schema.RequestSchema): - """ GetVMInstancePrice - 获取虚拟机价格 - """ + """GetVMInstancePrice - 获取虚拟机价格""" fields = { "BootDiskSetType": fields.Str(required=True, dump_to="BootDiskSetType"), @@ -2115,8 +2189,7 @@ class GetVMInstancePriceRequestSchema(schema.RequestSchema): class GetVMInstancePriceResponseSchema(schema.ResponseSchema): - """ GetVMInstancePrice - 获取虚拟机价格 - """ + """GetVMInstancePrice - 获取虚拟机价格""" fields = { "Infos": fields.List( @@ -2134,8 +2207,7 @@ class GetVMInstancePriceResponseSchema(schema.ResponseSchema): class ModifyEIPBandwidthRequestSchema(schema.RequestSchema): - """ ModifyEIPBandwidth - 调整外网IP带宽 - """ + """ModifyEIPBandwidth - 调整外网IP带宽""" fields = { "Bandwidth": fields.Int(required=True, dump_to="Bandwidth"), @@ -2146,8 +2218,7 @@ class ModifyEIPBandwidthRequestSchema(schema.RequestSchema): class ModifyEIPBandwidthResponseSchema(schema.ResponseSchema): - """ ModifyEIPBandwidth - 调整外网IP带宽 - """ + """ModifyEIPBandwidth - 调整外网IP带宽""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -2162,8 +2233,7 @@ class ModifyEIPBandwidthResponseSchema(schema.ResponseSchema): class ModifyNameAndRemarkRequestSchema(schema.RequestSchema): - """ ModifyNameAndRemark - 修改资源名称和备注 - """ + """ModifyNameAndRemark - 修改资源名称和备注""" fields = { "Name": fields.Str(required=True, dump_to="Name"), @@ -2175,8 +2245,7 @@ class ModifyNameAndRemarkRequestSchema(schema.RequestSchema): class ModifyNameAndRemarkResponseSchema(schema.ResponseSchema): - """ ModifyNameAndRemark - 修改资源名称和备注 - """ + """ModifyNameAndRemark - 修改资源名称和备注""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -2191,8 +2260,7 @@ class ModifyNameAndRemarkResponseSchema(schema.ResponseSchema): class PoweroffVMInstanceRequestSchema(schema.RequestSchema): - """ PoweroffVMInstance - 断电虚拟机,可能导致丢失数据甚至损坏操作系统,仅适用于虚拟机死机及级端测试场景。 - """ + """PoweroffVMInstance - 断电虚拟机,可能导致丢失数据甚至损坏操作系统,仅适用于虚拟机死机及级端测试场景。""" fields = { "Region": fields.Str(required=True, dump_to="Region"), @@ -2202,8 +2270,7 @@ class PoweroffVMInstanceRequestSchema(schema.RequestSchema): class PoweroffVMInstanceResponseSchema(schema.ResponseSchema): - """ PoweroffVMInstance - 断电虚拟机,可能导致丢失数据甚至损坏操作系统,仅适用于虚拟机死机及级端测试场景。 - """ + """PoweroffVMInstance - 断电虚拟机,可能导致丢失数据甚至损坏操作系统,仅适用于虚拟机死机及级端测试场景。""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -2218,8 +2285,7 @@ class PoweroffVMInstanceResponseSchema(schema.ResponseSchema): class RechargeRequestSchema(schema.RequestSchema): - """ Recharge - 管理员给租户充值 - """ + """Recharge - 管理员给租户充值""" fields = { "Amount": fields.Int(required=True, dump_to="Amount"), @@ -2230,8 +2296,7 @@ class RechargeRequestSchema(schema.RequestSchema): class RechargeResponseSchema(schema.ResponseSchema): - """ Recharge - 管理员给租户充值 - """ + """Recharge - 管理员给租户充值""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -2246,8 +2311,7 @@ class RechargeResponseSchema(schema.ResponseSchema): class ReinstallVMInstanceRequestSchema(schema.RequestSchema): - """ ReinstallVMInstance - 重装系统,关机的虚拟机才可以重装系统 - """ + """ReinstallVMInstance - 重装系统,关机的虚拟机才可以重装系统""" fields = { "ImageID": fields.Str(required=True, dump_to="ImageID"), @@ -2258,8 +2322,7 @@ class ReinstallVMInstanceRequestSchema(schema.RequestSchema): class ReinstallVMInstanceResponseSchema(schema.ResponseSchema): - """ ReinstallVMInstance - 重装系统,关机的虚拟机才可以重装系统 - """ + """ReinstallVMInstance - 重装系统,关机的虚拟机才可以重装系统""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -2274,8 +2337,7 @@ class ReinstallVMInstanceResponseSchema(schema.ResponseSchema): class ReleaseEIPRequestSchema(schema.RequestSchema): - """ ReleaseEIP - 删除外网IP - """ + """ReleaseEIP - 删除外网IP""" fields = { "EIPID": fields.Str(required=True, dump_to="EIPID"), @@ -2285,8 +2347,7 @@ class ReleaseEIPRequestSchema(schema.RequestSchema): class ReleaseEIPResponseSchema(schema.ResponseSchema): - """ ReleaseEIP - 删除外网IP - """ + """ReleaseEIP - 删除外网IP""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -2301,8 +2362,7 @@ class ReleaseEIPResponseSchema(schema.ResponseSchema): class RenewResourceRequestSchema(schema.RequestSchema): - """ RenewResource - 续费回收站资源 - """ + """RenewResource - 续费回收站资源""" fields = { "Quantity": fields.Int(required=False, dump_to="Quantity"), @@ -2313,8 +2373,7 @@ class RenewResourceRequestSchema(schema.RequestSchema): class RenewResourceResponseSchema(schema.ResponseSchema): - """ RenewResource - 续费回收站资源 - """ + """RenewResource - 续费回收站资源""" fields = { "Message": fields.Str(required=False, load_from="Message"), @@ -2329,8 +2388,7 @@ class RenewResourceResponseSchema(schema.ResponseSchema): class ResetVMInstancePasswordRequestSchema(schema.RequestSchema): - """ ResetVMInstancePassword - 重置虚拟机密码,主机必须开机才可以重置密码 - """ + """ResetVMInstancePassword - 重置虚拟机密码,主机必须开机才可以重置密码""" fields = { "Password": fields.Str(required=True, dump_to="Password"), @@ -2341,8 +2399,7 @@ class ResetVMInstancePasswordRequestSchema(schema.RequestSchema): class ResetVMInstancePasswordResponseSchema(schema.ResponseSchema): - """ ResetVMInstancePassword - 重置虚拟机密码,主机必须开机才可以重置密码 - """ + """ResetVMInstancePassword - 重置虚拟机密码,主机必须开机才可以重置密码""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -2357,8 +2414,7 @@ class ResetVMInstancePasswordResponseSchema(schema.ResponseSchema): class ResizeVMConfigRequestSchema(schema.RequestSchema): - """ ResizeVMConfig - 修改虚拟机配置 - """ + """ResizeVMConfig - 修改虚拟机配置""" fields = { "CPU": fields.Int(required=True, dump_to="CPU"), @@ -2370,8 +2426,7 @@ class ResizeVMConfigRequestSchema(schema.RequestSchema): class ResizeVMConfigResponseSchema(schema.ResponseSchema): - """ ResizeVMConfig - 修改虚拟机配置 - """ + """ResizeVMConfig - 修改虚拟机配置""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -2386,8 +2441,7 @@ class ResizeVMConfigResponseSchema(schema.ResponseSchema): class RestartVMInstanceRequestSchema(schema.RequestSchema): - """ RestartVMInstance - 重启虚拟机 - """ + """RestartVMInstance - 重启虚拟机""" fields = { "Region": fields.Str(required=True, dump_to="Region"), @@ -2397,8 +2451,7 @@ class RestartVMInstanceRequestSchema(schema.RequestSchema): class RestartVMInstanceResponseSchema(schema.ResponseSchema): - """ RestartVMInstance - 重启虚拟机 - """ + """RestartVMInstance - 重启虚拟机""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -2413,8 +2466,7 @@ class RestartVMInstanceResponseSchema(schema.ResponseSchema): class RollbackResourceRequestSchema(schema.RequestSchema): - """ RollbackResource - 恢复回收站资源 - """ + """RollbackResource - 恢复回收站资源""" fields = { "Region": fields.Str(required=True, dump_to="Region"), @@ -2424,8 +2476,7 @@ class RollbackResourceRequestSchema(schema.RequestSchema): class RollbackResourceResponseSchema(schema.ResponseSchema): - """ RollbackResource - 恢复回收站资源 - """ + """RollbackResource - 恢复回收站资源""" fields = { "Message": fields.Str(required=False, load_from="Message"), @@ -2440,8 +2491,7 @@ class RollbackResourceResponseSchema(schema.ResponseSchema): class RollbackSnapshotRequestSchema(schema.RequestSchema): - """ RollbackSnapshot - 将某个快照内的数据回滚到原云硬盘,仅支持正常状态的快照进行回滚操作,回滚时硬盘必须处于未绑定或其挂载的主机为关机状态。 - """ + """RollbackSnapshot - 将某个快照内的数据回滚到原云硬盘,仅支持正常状态的快照进行回滚操作,回滚时硬盘必须处于未绑定或其挂载的主机为关机状态。""" fields = { "DiskID": fields.Str(required=True, dump_to="DiskID"), @@ -2452,8 +2502,7 @@ class RollbackSnapshotRequestSchema(schema.RequestSchema): class RollbackSnapshotResponseSchema(schema.ResponseSchema): - """ RollbackSnapshot - 将某个快照内的数据回滚到原云硬盘,仅支持正常状态的快照进行回滚操作,回滚时硬盘必须处于未绑定或其挂载的主机为关机状态。 - """ + """RollbackSnapshot - 将某个快照内的数据回滚到原云硬盘,仅支持正常状态的快照进行回滚操作,回滚时硬盘必须处于未绑定或其挂载的主机为关机状态。""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -2468,8 +2517,7 @@ class RollbackSnapshotResponseSchema(schema.ResponseSchema): class StartVMInstanceRequestSchema(schema.RequestSchema): - """ StartVMInstance - 开启虚拟机 - """ + """StartVMInstance - 开启虚拟机""" fields = { "Region": fields.Str(required=True, dump_to="Region"), @@ -2479,8 +2527,7 @@ class StartVMInstanceRequestSchema(schema.RequestSchema): class StartVMInstanceResponseSchema(schema.ResponseSchema): - """ StartVMInstance - 开启虚拟机 - """ + """StartVMInstance - 开启虚拟机""" fields = { "Message": fields.Str(required=False, load_from="Message"), @@ -2495,8 +2542,7 @@ class StartVMInstanceResponseSchema(schema.ResponseSchema): class StopVMInstanceRequestSchema(schema.RequestSchema): - """ StopVMInstance - 关闭虚拟机 - """ + """StopVMInstance - 关闭虚拟机""" fields = { "Region": fields.Str(required=True, dump_to="Region"), @@ -2506,8 +2552,7 @@ class StopVMInstanceRequestSchema(schema.RequestSchema): class StopVMInstanceResponseSchema(schema.ResponseSchema): - """ StopVMInstance - 关闭虚拟机 - """ + """StopVMInstance - 关闭虚拟机""" fields = { "Message": fields.Str(required=False, load_from="Message"), @@ -2523,8 +2568,7 @@ class StopVMInstanceResponseSchema(schema.ResponseSchema): class TerminateResourceRequestSchema(schema.RequestSchema): - """ TerminateResource - 销毁资源 - """ + """TerminateResource - 销毁资源""" fields = { "Region": fields.Str(required=True, dump_to="Region"), @@ -2534,8 +2578,7 @@ class TerminateResourceRequestSchema(schema.RequestSchema): class TerminateResourceResponseSchema(schema.ResponseSchema): - """ TerminateResource - 销毁资源 - """ + """TerminateResource - 销毁资源""" fields = { "Message": fields.Str(required=False, load_from="Message"), @@ -2550,8 +2593,7 @@ class TerminateResourceResponseSchema(schema.ResponseSchema): class UnBindEIPRequestSchema(schema.RequestSchema): - """ UnBindEIP - 解绑外网IP - """ + """UnBindEIP - 解绑外网IP""" fields = { "EIPID": fields.Str(required=True, dump_to="EIPID"), @@ -2563,8 +2605,7 @@ class UnBindEIPRequestSchema(schema.RequestSchema): class UnBindEIPResponseSchema(schema.ResponseSchema): - """ UnBindEIP - 解绑外网IP - """ + """UnBindEIP - 解绑外网IP""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -2579,8 +2620,7 @@ class UnBindEIPResponseSchema(schema.ResponseSchema): class UnBindSecurityGroupRequestSchema(schema.RequestSchema): - """ UnBindSecurityGroup - 解绑安全组 - """ + """UnBindSecurityGroup - 解绑安全组""" fields = { "Region": fields.Str(required=True, dump_to="Region"), @@ -2591,8 +2631,7 @@ class UnBindSecurityGroupRequestSchema(schema.RequestSchema): class UnBindSecurityGroupResponseSchema(schema.ResponseSchema): - """ UnBindSecurityGroup - 解绑安全组 - """ + """UnBindSecurityGroup - 解绑安全组""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -2607,8 +2646,7 @@ class UnBindSecurityGroupResponseSchema(schema.ResponseSchema): class UnbindAlarmTemplateRequestSchema(schema.RequestSchema): - """ UnbindAlarmTemplate - 解绑告警模板 - """ + """UnbindAlarmTemplate - 解绑告警模板""" fields = { "AlarmTemplateID": fields.Str(required=True, dump_to="AlarmTemplateID"), @@ -2620,8 +2658,7 @@ class UnbindAlarmTemplateRequestSchema(schema.RequestSchema): class UnbindAlarmTemplateResponseSchema(schema.ResponseSchema): - """ UnbindAlarmTemplate - 解绑告警模板 - """ + """UnbindAlarmTemplate - 解绑告警模板""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -2636,8 +2673,7 @@ class UnbindAlarmTemplateResponseSchema(schema.ResponseSchema): class UnbindPhysicalIPRequestSchema(schema.RequestSchema): - """ UnbindPhysicalIP - 解绑物理IP - """ + """UnbindPhysicalIP - 解绑物理IP""" fields = { "PhysicalIPID": fields.Str(required=True, dump_to="PhysicalIPID"), @@ -2649,8 +2685,7 @@ class UnbindPhysicalIPRequestSchema(schema.RequestSchema): class UnbindPhysicalIPResponseSchema(schema.ResponseSchema): - """ UnbindPhysicalIP - 解绑物理IP - """ + """UnbindPhysicalIP - 解绑物理IP""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -2665,8 +2700,7 @@ class UnbindPhysicalIPResponseSchema(schema.ResponseSchema): class UpdateAlarmTemplateRuleRequestSchema(schema.RequestSchema): - """ UpdateAlarmTemplateRule - 更新告警模板规则 - """ + """UpdateAlarmTemplateRule - 更新告警模板规则""" fields = { "AlarmStrategy": fields.Str(required=True, dump_to="AlarmStrategy"), @@ -2686,8 +2720,7 @@ class UpdateAlarmTemplateRuleRequestSchema(schema.RequestSchema): class UpdateAlarmTemplateRuleResponseSchema(schema.ResponseSchema): - """ UpdateAlarmTemplateRule - 更新告警模板规则 - """ + """UpdateAlarmTemplateRule - 更新告警模板规则""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -2702,8 +2735,7 @@ class UpdateAlarmTemplateRuleResponseSchema(schema.ResponseSchema): class UpdateRSRequestSchema(schema.RequestSchema): - """ UpdateRS - 修改负载均衡的服务节点 - """ + """UpdateRS - 修改负载均衡的服务节点""" fields = { "LBID": fields.Str(required=True, dump_to="LBID"), @@ -2717,8 +2749,7 @@ class UpdateRSRequestSchema(schema.RequestSchema): class UpdateRSResponseSchema(schema.ResponseSchema): - """ UpdateRS - 修改负载均衡的服务节点 - """ + """UpdateRS - 修改负载均衡的服务节点""" fields = { "Message": fields.Str(required=False, load_from="Message"), @@ -2733,8 +2764,7 @@ class UpdateRSResponseSchema(schema.ResponseSchema): class UpdateSecurityGroupRuleRequestSchema(schema.RequestSchema): - """ UpdateSecurityGroupRule - 修改安全组规则 - """ + """UpdateSecurityGroupRule - 修改安全组规则""" fields = { "Region": fields.Str(required=True, dump_to="Region"), @@ -2745,8 +2775,7 @@ class UpdateSecurityGroupRuleRequestSchema(schema.RequestSchema): class UpdateSecurityGroupRuleResponseSchema(schema.ResponseSchema): - """ UpdateSecurityGroupRule - 修改安全组规则 - """ + """UpdateSecurityGroupRule - 修改安全组规则""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -2761,8 +2790,7 @@ class UpdateSecurityGroupRuleResponseSchema(schema.ResponseSchema): class UpdateVSRequestSchema(schema.RequestSchema): - """ UpdateVS - 修改负载均衡VServer - """ + """UpdateVS - 修改负载均衡VServer""" fields = { "CACertificateID": fields.Str( @@ -2794,8 +2822,7 @@ class UpdateVSRequestSchema(schema.RequestSchema): class UpdateVSResponseSchema(schema.ResponseSchema): - """ UpdateVS - 修改负载均衡VServer - """ + """UpdateVS - 修改负载均衡VServer""" fields = { "Message": fields.Str(required=False, load_from="Message"), @@ -2810,8 +2837,7 @@ class UpdateVSResponseSchema(schema.ResponseSchema): class UpdateVSPolicyRequestSchema(schema.RequestSchema): - """ UpdateVSPolicy - 更新七层负载均衡内容转发规则,仅当 VServer 的监听协议为 HTTP 时有效。 - """ + """UpdateVSPolicy - 更新七层负载均衡内容转发规则,仅当 VServer 的监听协议为 HTTP 时有效。""" fields = { "Domain": fields.Str(required=False, dump_to="Domain"), @@ -2826,8 +2852,7 @@ class UpdateVSPolicyRequestSchema(schema.RequestSchema): class UpdateVSPolicyResponseSchema(schema.ResponseSchema): - """ UpdateVSPolicy - 更新七层负载均衡内容转发规则,仅当 VServer 的监听协议为 HTTP 时有效。 - """ + """UpdateVSPolicy - 更新七层负载均衡内容转发规则,仅当 VServer 的监听协议为 HTTP 时有效。""" fields = { "Message": fields.Str(required=False, load_from="Message"), @@ -2837,13 +2862,12 @@ class UpdateVSPolicyResponseSchema(schema.ResponseSchema): """ API: UpgradeDisk -升级硬盘 +扩容硬盘,为保证数据完整性,容量扩容前建议暂停对当前硬盘的所有文件系统读写操作,并进入操作系统进行 `umount ` 或`脱机` 操作。 """ class UpgradeDiskRequestSchema(schema.RequestSchema): - """ UpgradeDisk - 升级硬盘 - """ + """UpgradeDisk - 扩容硬盘,为保证数据完整性,容量扩容前建议暂停对当前硬盘的所有文件系统读写操作,并进入操作系统进行 `umount ` 或`脱机` 操作。""" fields = { "DiskID": fields.Str(required=True, dump_to="DiskID"), @@ -2854,9 +2878,10 @@ class UpgradeDiskRequestSchema(schema.RequestSchema): class UpgradeDiskResponseSchema(schema.ResponseSchema): - """ UpgradeDisk - 升级硬盘 - """ + """UpgradeDisk - 扩容硬盘,为保证数据完整性,容量扩容前建议暂停对当前硬盘的所有文件系统读写操作,并进入操作系统进行 `umount ` 或`脱机` 操作。""" fields = { + "Action": fields.Str(required=True, load_from="Action"), "Message": fields.Str(required=True, load_from="Message"), + "RetCode": fields.Int(required=True, load_from="RetCode"), } diff --git a/ucloud/services/ucloudstack/schemas/models.py b/ucloud/services/ucloudstack/schemas/models.py index 38c9bd30..e6a26d17 100644 --- a/ucloud/services/ucloudstack/schemas/models.py +++ b/ucloud/services/ucloudstack/schemas/models.py @@ -4,8 +4,7 @@ class BindVSInfoSchema(schema.ResponseSchema): - """ BindVSInfo - 证书绑定的vs信息 - """ + """BindVSInfo - 证书绑定的vs信息""" fields = { "LBID": fields.Str(required=False, load_from="LBID"), @@ -17,8 +16,7 @@ class BindVSInfoSchema(schema.ResponseSchema): class CertificateInfoSchema(schema.ResponseSchema): - """ CertificateInfo - 证书信息 - """ + """CertificateInfo - 证书信息""" fields = { "CertificateContent": fields.Str( @@ -43,30 +41,29 @@ class CertificateInfoSchema(schema.ResponseSchema): class DiskInfoSchema(schema.ResponseSchema): - """ DiskInfo - 磁盘信息 - """ + """DiskInfo - 磁盘信息""" fields = { "AttachResourceID": fields.Str( - required=False, load_from="AttachResourceID" + required=True, load_from="AttachResourceID" ), - "ChargeType": fields.Str(required=False, load_from="ChargeType"), - "CreateTime": fields.Int(required=False, load_from="CreateTime"), - "DiskID": fields.Str(required=False, load_from="DiskID"), - "DiskStatus": fields.Str(required=False, load_from="DiskStatus"), - "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), - "Name": fields.Str(required=False, load_from="Name"), - "Region": fields.Str(required=False, load_from="Region"), + "ChargeType": fields.Str(required=True, load_from="ChargeType"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "DiskID": fields.Str(required=True, load_from="DiskID"), + "DiskStatus": fields.Str(required=True, load_from="DiskStatus"), + "DiskType": fields.Str(required=True, load_from="DiskType"), + "ExpireTime": fields.Int(required=True, load_from="ExpireTime"), + "Name": fields.Str(required=True, load_from="Name"), + "Region": fields.Str(required=True, load_from="Region"), "Remark": fields.Str(required=False, load_from="Remark"), - "SetType": fields.Str(required=False, load_from="SetType"), - "Size": fields.Int(required=False, load_from="Size"), - "Zone": fields.Str(required=False, load_from="Zone"), + "SetType": fields.Str(required=True, load_from="SetType"), + "Size": fields.Int(required=True, load_from="Size"), + "Zone": fields.Str(required=True, load_from="Zone"), } class EIPInfoSchema(schema.ResponseSchema): - """ EIPInfo - 外网IP信息 - """ + """EIPInfo - 外网IP信息""" fields = { "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), @@ -76,11 +73,14 @@ class EIPInfoSchema(schema.ResponseSchema): "BindResourceType": fields.Str( required=False, load_from="BindResourceType" ), + "CanDefaultGW": fields.Int(required=False, load_from="CanDefaultGW"), "ChargeType": fields.Str(required=False, load_from="ChargeType"), "CreateTime": fields.Int(required=False, load_from="CreateTime"), "EIPID": fields.Str(required=False, load_from="EIPID"), "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), "IP": fields.Str(required=False, load_from="IP"), + "IPVersion": fields.Str(required=False, load_from="IPVersion"), + "ISDefaultGW": fields.Int(required=False, load_from="ISDefaultGW"), "Name": fields.Str(required=False, load_from="Name"), "OperatorName": fields.Str(required=False, load_from="OperatorName"), "Region": fields.Str(required=False, load_from="Region"), @@ -91,8 +91,7 @@ class EIPInfoSchema(schema.ResponseSchema): class ImageInfoSchema(schema.ResponseSchema): - """ ImageInfo - 镜像信息 - """ + """ImageInfo - 镜像信息""" fields = { "CreateTime": fields.Int(required=True, load_from="CreateTime"), @@ -110,8 +109,7 @@ class ImageInfoSchema(schema.ResponseSchema): class LBInfoSchema(schema.ResponseSchema): - """ LBInfo - 负载均衡信息 - """ + """LBInfo - 负载均衡信息""" fields = { "AlarmTemplateID": fields.Str( @@ -137,8 +135,7 @@ class LBInfoSchema(schema.ResponseSchema): class MetricSetSchema(schema.ResponseSchema): - """ MetricSet - 监控值 - """ + """MetricSet - 监控值""" fields = { "Timestamp": fields.Int(required=False, load_from="Timestamp"), @@ -147,8 +144,7 @@ class MetricSetSchema(schema.ResponseSchema): class MetricInfoSchema(schema.ResponseSchema): - """ MetricInfo - 监控信息 - """ + """MetricInfo - 监控信息""" fields = { "Infos": fields.List(MetricSetSchema()), @@ -157,8 +153,7 @@ class MetricInfoSchema(schema.ResponseSchema): class NATGWInfoSchema(schema.ResponseSchema): - """ NATGWInfo - NAT网关信息 - """ + """NATGWInfo - NAT网关信息""" fields = { "AlarmTemplateID": fields.Str( @@ -181,8 +176,7 @@ class NATGWInfoSchema(schema.ResponseSchema): class NATGWRuleInfoSchema(schema.ResponseSchema): - """ NATGWRuleInfo - NAT网关关联的白名单资源信息 - """ + """NATGWRuleInfo - NAT网关关联的白名单资源信息""" fields = { "BindResourceID": fields.Str(required=True, load_from="BindResourceID"), @@ -199,9 +193,28 @@ class NATGWRuleInfoSchema(schema.ResponseSchema): } +class NICInfoSchema(schema.ResponseSchema): + """NICInfo - 网卡信息""" + + fields = { + "BindResourceID": fields.Str(required=True, load_from="BindResourceID"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "IP": fields.Str(required=True, load_from="IP"), + "MAC": fields.Str(required=True, load_from="MAC"), + "NICID": fields.Str(required=True, load_from="NICID"), + "NICStatus": fields.Str(required=True, load_from="NICStatus"), + "Name": fields.Str(required=True, load_from="Name"), + "Region": fields.Str(required=True, load_from="Region"), + "Remark": fields.Str(required=True, load_from="Remark"), + "SGID": fields.Str(required=True, load_from="SGID"), + "SubnetID": fields.Str(required=True, load_from="SubnetID"), + "VPCID": fields.Str(required=True, load_from="VPCID"), + "Zone": fields.Str(required=True, load_from="Zone"), + } + + class OPLogInfoSchema(schema.ResponseSchema): - """ OPLogInfo - 操作日志 - """ + """OPLogInfo - 操作日志""" fields = { "CreateTime": fields.Int(required=False, load_from="CreateTime"), @@ -220,8 +233,7 @@ class OPLogInfoSchema(schema.ResponseSchema): class PhysicalIPInfoSchema(schema.ResponseSchema): - """ PhysicalIPInfo - 物理IP信息 - """ + """PhysicalIPInfo - 物理IP信息""" fields = { "BindResourceID": fields.Str(required=True, load_from="BindResourceID"), @@ -242,8 +254,7 @@ class PhysicalIPInfoSchema(schema.ResponseSchema): class RSInfoSchema(schema.ResponseSchema): - """ RSInfo - 转发规则关联的服务节点信息 - """ + """RSInfo - 转发规则关联的服务节点信息""" fields = { "BindResourceID": fields.Str(required=True, load_from="BindResourceID"), @@ -262,8 +273,7 @@ class RSInfoSchema(schema.ResponseSchema): class RecycledResourceInfoSchema(schema.ResponseSchema): - """ RecycledResourceInfo - 回收站资源信息 - """ + """RecycledResourceInfo - 回收站资源信息""" fields = { "CreateTime": fields.Int(required=True, load_from="CreateTime"), @@ -286,8 +296,7 @@ class RecycledResourceInfoSchema(schema.ResponseSchema): class SGRuleInfoSchema(schema.ResponseSchema): - """ SGRuleInfo - 安全组规则信息 - """ + """SGRuleInfo - 安全组规则信息""" fields = { "DstPort": fields.Str(required=False, load_from="DstPort"), @@ -301,8 +310,7 @@ class SGRuleInfoSchema(schema.ResponseSchema): class SGInfoSchema(schema.ResponseSchema): - """ SGInfo - 安全组信息 - """ + """SGInfo - 安全组信息""" fields = { "CreateTime": fields.Int(required=False, load_from="CreateTime"), @@ -319,9 +327,38 @@ class SGInfoSchema(schema.ResponseSchema): } +class SGResourceInfoSchema(schema.ResponseSchema): + """SGResourceInfo - 安全组绑定的资源信息""" + + fields = { + "Name": fields.Str(required=True, load_from="Name"), + "Region": fields.Str(required=True, load_from="Region"), + "ResourceID": fields.Str(required=True, load_from="ResourceID"), + "ResourceType": fields.Str(required=True, load_from="ResourceType"), + "Zone": fields.Str(required=True, load_from="Zone"), + } + + +class SnapshotInfoSchema(schema.ResponseSchema): + """SnapshotInfo - 快照的详细信息""" + + fields = { + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DiskID": fields.Str(required=False, load_from="DiskID"), + "DiskType": fields.Str(required=False, load_from="DiskType"), + "Name": fields.Str(required=False, load_from="Name"), + "Region": fields.Str(required=False, load_from="Region"), + "Remark": fields.Str(required=False, load_from="Remark"), + "SnapshotID": fields.Str(required=False, load_from="SnapshotID"), + "SnapshotStatus": fields.Str( + required=False, load_from="SnapshotStatus" + ), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + class StorageTypeInfoSchema(schema.ResponseSchema): - """ StorageTypeInfo - 存储类型信息 - """ + """StorageTypeInfo - 存储类型信息""" fields = { "Region": fields.Str(required=True, load_from="Region"), @@ -335,8 +372,7 @@ class StorageTypeInfoSchema(schema.ResponseSchema): class SubnetInfoSchema(schema.ResponseSchema): - """ SubnetInfo - 子网信息 - """ + """SubnetInfo - 子网信息""" fields = { "CreateTime": fields.Int(required=False, load_from="CreateTime"), @@ -352,8 +388,7 @@ class SubnetInfoSchema(schema.ResponseSchema): class UserInfoSchema(schema.ResponseSchema): - """ UserInfo - 租户信息 - """ + """UserInfo - 租户信息""" fields = { "Amount": fields.Float(required=False, load_from="Amount"), @@ -368,8 +403,7 @@ class UserInfoSchema(schema.ResponseSchema): class VMDiskInfoSchema(schema.ResponseSchema): - """ VMDiskInfo - UCloudStack虚拟机磁盘信息 - """ + """VMDiskInfo - 虚拟机磁盘信息""" fields = { "DiskID": fields.Str(required=False, load_from="DiskID"), @@ -382,8 +416,7 @@ class VMDiskInfoSchema(schema.ResponseSchema): class VMIPInfoSchema(schema.ResponseSchema): - """ VMIPInfo - UCloudStack虚拟机IP信息 - """ + """VMIPInfo - 虚拟机IP信息""" fields = { "IP": fields.Str(required=False, load_from="IP"), @@ -402,8 +435,7 @@ class VMIPInfoSchema(schema.ResponseSchema): class VMInstanceInfoSchema(schema.ResponseSchema): - """ VMInstanceInfo - UCloudStack虚拟机信息 - """ + """VMInstanceInfo - UCloudStack虚拟机信息""" fields = { "CPU": fields.Int(required=False, load_from="CPU"), @@ -418,7 +450,6 @@ class VMInstanceInfoSchema(schema.ResponseSchema): "OSName": fields.Str(required=False, load_from="OSName"), "OSType": fields.Str(required=False, load_from="OSType"), "Region": fields.Str(required=False, load_from="Region"), - "RegionAlias": fields.Str(required=False, load_from="RegionAlias"), "Remark": fields.Str(required=False, load_from="Remark"), "State": fields.Str(required=False, load_from="State"), "SubnetID": fields.Str(required=False, load_from="SubnetID"), @@ -429,13 +460,11 @@ class VMInstanceInfoSchema(schema.ResponseSchema): "VPCID": fields.Str(required=False, load_from="VPCID"), "VPCName": fields.Str(required=False, load_from="VPCName"), "Zone": fields.Str(required=False, load_from="Zone"), - "ZoneAlias": fields.Str(required=False, load_from="ZoneAlias"), } class VMTypeInfoSchema(schema.ResponseSchema): - """ VMTypeInfo - 主机机型信息 - """ + """VMTypeInfo - 主机机型信息""" fields = { "Region": fields.Str(required=True, load_from="Region"), @@ -447,8 +476,7 @@ class VMTypeInfoSchema(schema.ResponseSchema): class VPCInfoSchema(schema.ResponseSchema): - """ VPCInfo - VPC信息 - """ + """VPCInfo - VPC信息""" fields = { "CreateTime": fields.Int(required=False, load_from="CreateTime"), @@ -466,8 +494,7 @@ class VPCInfoSchema(schema.ResponseSchema): class VSPolicyInfoSchema(schema.ResponseSchema): - """ VSPolicyInfo - 内容转发规则信息 - """ + """VSPolicyInfo - 内容转发规则信息""" fields = { "CreateTime": fields.Int(required=True, load_from="CreateTime"), @@ -483,13 +510,15 @@ class VSPolicyInfoSchema(schema.ResponseSchema): class VSInfoSchema(schema.ResponseSchema): - """ VSInfo - RServer信息 - """ + """VSInfo - VServer信息""" fields = { "AlarmTemplateID": fields.Str( required=True, load_from="AlarmTemplateID" ), + "CACertificateID": fields.Str( + required=False, load_from="CACertificateID" + ), "CreateTime": fields.Int(required=True, load_from="CreateTime"), "Domain": fields.Str(required=False, load_from="Domain"), "HealthcheckType": fields.Str( @@ -510,6 +539,11 @@ class VSInfoSchema(schema.ResponseSchema): "Protocol": fields.Str(required=True, load_from="Protocol"), "RSHealthStatus": fields.Str(required=True, load_from="RSHealthStatus"), "RSInfos": fields.List(RSInfoSchema()), + "SSLMode": fields.Str(required=False, load_from="SSLMode"), + "Scheduler": fields.Str(required=True, load_from="Scheduler"), + "ServerCertificateID": fields.Str( + required=False, load_from="ServerCertificateID" + ), "UpdateTime": fields.Int(required=True, load_from="UpdateTime"), "VSID": fields.Str(required=True, load_from="VSID"), "VSPolicyInfos": fields.List(VSPolicyInfoSchema()), @@ -518,8 +552,7 @@ class VSInfoSchema(schema.ResponseSchema): class PriceInfoSchema(schema.ResponseSchema): - """ PriceInfo - 价格信息 - """ + """PriceInfo - 价格信息""" fields = { "ChargeType": fields.Str(required=True, load_from="ChargeType"), diff --git a/ucloud/services/ucompshare/__init__.py b/ucloud/services/ucompshare/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/ucompshare/client.py b/ucloud/services/ucompshare/client.py new file mode 100644 index 00000000..671d1006 --- /dev/null +++ b/ucloud/services/ucompshare/client.py @@ -0,0 +1,3297 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.ucompshare.schemas import apis + + +class UCompShareClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UCompShareClient, self).__init__( + config, transport, middleware, logger + ) + + def attach_compshare_disk( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AttachCompshareDisk - 将一个可用的UDisk挂载到某台主机上 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UDiskId** (str) - (Required) 需要挂载的UDisk实例ID. + - **EnableCrossPodAttach** (str) - 是否允许跨pod挂载(Yes:允许跨pod挂载,No:不允许跨pod挂载,不填默认No) + - **UHostId** (str) - UHost实例ID。【UHostId和HostId必须选填一个,本字段即将废弃,建议使用HostId】 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.AttachCompshareDiskRequestSchema().dumps(d) + + resp = self.invoke("AttachCompshareDisk", d, **kwargs) + return apis.AttachCompshareDiskResponseSchema().loads(resp) + + def attach_us_33(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """AttachUS3 - 挂载us3 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UHostId** (str) - (Required) 实例Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.AttachUS3RequestSchema().dumps(d) + + resp = self.invoke("AttachUS3", d, **kwargs) + return apis.AttachUS3ResponseSchema().loads(resp) + + def check_comp_share_net_optimizer( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CheckCompShareNetOptimizer - 检查算力平台账号是否开通访问加速 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Optimized** (bool) - 是否已开通 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CheckCompShareNetOptimizerRequestSchema().dumps(d) + + resp = self.invoke("CheckCompShareNetOptimizer", d, **kwargs) + return apis.CheckCompShareNetOptimizerResponseSchema().loads(resp) + + def check_ul_host_resource_capacity( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CheckULHostResourceCapacity - 检查轻量应用云主机资源余量 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BundleId** (str) - (Required) 套餐ID。如:"ulh.c1m1s40b30t800" + - **ImageId** (str) - (Required) 镜像ID。 请通过 `DescribeImage `_ 获取 + - **ChargeType** (str) - 计费模式。枚举值: \\ > Year,按年付费; \\ > Month,按月付费;\\ > ThirtyDay,30天期付费,跨境电商相关套餐使用此计费方式;默认:Month + - **CouponId** (str) - 主机代金券ID。请通过DescribeCoupon接口查询,或登录用户中心查看 + - **Name** (str) - 轻量应用主机名称。默认:套餐ID。请遵照 `字段规范 `_ 设定实例名称。 + - **Quantity** (int) - 购买时长。默认:1。不支持购买到月末 + - **SecurityGroupId** (str) - 防火墙ID,默认:Web推荐防火墙。如何查询SecurityGroupId请参见 `DescribeFirewall `_ 。 + - **SubnetId** (str) - 子网 ID。默认为当前地域的默认子网。 + - **VPCId** (str) - VPC ID。默认为当前地域的默认VPC。 + + **Response** + + - **Message** (str) - 错误信息 + - **ResourceEnough** (bool) - 资源是否充足 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CheckULHostResourceCapacityRequestSchema().dumps(d) + + resp = self.invoke("CheckULHostResourceCapacity", d, **kwargs) + return apis.CheckULHostResourceCapacityResponseSchema().loads(resp) + + def copy_comp_share_custom_image( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CopyCompShareCustomImage - 复制算力平台镜像 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **CompShareImageId** (str) - (Required) 镜像Id + - **TargetImageName** (str) - 目标镜像名称 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **NewCompShareImageId** (str) - 复制后的镜像Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CopyCompShareCustomImageRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CopyCompShareCustomImage", d, **kwargs) + return apis.CopyCompShareCustomImageResponseSchema().loads(resp) + + def create_comp_share_custom_image( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateCompShareCustomImage - 制作算力平台实例自制镜像 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Name** (str) - (Required) 镜像名称。不允许与账号下其他镜像名称重复 + - **UHostId** (str) - (Required) 实例Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Description** (str) - 镜像描述信息 + - **Softwares** (dict) - 见 **CreateCompShareCustomImageParamSoftwares** 模型定义 + + **Response** + + - **CompShareImageId** (str) - 镜像Id + + **Request Model** + + **CreateCompShareCustomImageParamSoftwares** + - **Application** (list) - 【array of string】镜像的应用列表 + - **CUDAVersion** (str) - 镜像CUDA版本 + - **Framework** (str) - 镜像框架名称 + - **FrameworkVersion** (str) - 镜像框架版本 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateCompShareCustomImageRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateCompShareCustomImage", d, **kwargs) + return apis.CreateCompShareCustomImageResponseSchema().loads(resp) + + def create_comp_share_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateCompShareInstance - 创建轻量级算力平台主机资源 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **CPU** (int) - (Required) 虚拟CPU核数。可选参数:1-64(具体机型与CPU的对应关系参照控制台)。默认值: 4。 + - **CompShareImageId** (str) - (Required) 镜像ID + - **GPU** (int) - (Required) GPU卡核心数。仅GPU机型支持此字段(可选范围与MachineType+GpuType相关) + - **GpuType** (str) - (Required) GPU类型,枚举值["K80", "P40", "V100", "T4","T4A", "T4S","2080Ti","2080Ti-4C","1080Ti", "T4/4", "MI100", "V100S",2080","2080TiS","2080TiPro","3090","A100"],MachineType为G时必填 + - **MachineType** (str) - (Required) 云主机机型(V2.0),在本字段和字段UHostType中,仅需要其中1个字段即可。枚举值["N", "C", "G", "O", "OS", "OM", "OPRO", "OMAX", "O.BM", "O.EPC"]。参考 `云主机机型说明 `_ 。 + - **Memory** (int) - (Required) 内存大小。单位:MB。范围 :[1024, 262144],取值为1024的倍数(可选范围参考控制台)。默认值:8192 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ChargeType** (str) - 计费模式。枚举值为: \\ > Month,按月付费;\\ > Day,按天付费;\\ > Dynamic,按小时预付费 \\ > Postpay,按小时后付费(支持关机不收费,目前仅部分可用区支持,请联系您的客户经理) \\ > Spot计费为抢占式实例(内测阶段) \\ 默认为月付 + - **Disks** (list) - 见 **CreateCompShareInstanceParamDisks** 模型定义 + - **EnableUS3** (bool) - 是否挂载云存储(仅容器实例支持此操作) + - **LoginMode** (str) - 主机登陆模式。密码(默认选项): Password + - **MinimalCpuPlatform** (str) - 最低cpu平台,枚举值["Intel/Auto", "Intel/IvyBridge", "Intel/Haswell", "Intel/Broadwell", "Intel/Skylake", "Intel/Cascadelake", "Intel/CascadelakeR", "Intel/IceLake", "Amd/Epyc2", "Amd/Auto","Ampere/Auto","Ampere/Altra", "Auto"],默认值是"Intel/Auto", "Auto" 自动分配Amd或者Intel cpu平台。 + - **Name** (str) - 实例名称 + - **Password** (str) - UHost密码。请遵照 `字段规范 `_ 设定密码。密码需使用base64进行编码,举例如下:# echo -n Password1 | base64UGFzc3dvcmQx。 + - **Quantity** (int) - 购买时长。默认:值 1。按小时购买(Dynamic/Postpay)时无需此参数。 月付时,此参数传0,代表购买至月末。 + - **SecurityGroupId** (str) - 防火墙Id + + **Response** + + - **UHostIds** (list) - UHost实例Id集合 + + **Request Model** + + **CreateCompShareInstanceParamDisks** + - **IsBoot** (bool) - 是否是系统盘。枚举值:\\ > True,是系统盘 \\ > False,是数据盘(默认)。Disks数组中有且只能有一块盘是系统盘。 + - **Size** (int) - 磁盘大小,单位GB。请参考 `磁盘类型 `_ 。 + - **Type** (str) - 磁盘类型。请参考 `磁盘类型 `_ 。 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateCompShareInstanceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateCompShareInstance", d, **kwargs) + return apis.CreateCompShareInstanceResponseSchema().loads(resp) + + def create_comp_share_team( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateCompShareTeam - 创建团队 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Name** (str) - (Required) 团队名称 + - **Description** (str) - 团队简介 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateCompShareTeamRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateCompShareTeam", d, **kwargs) + return apis.CreateCompShareTeamResponseSchema().loads(resp) + + def create_comp_share_team_relation( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateCompShareTeamRelation - 发送团队邀请 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **TeamId** (int) - (Required) 团队Id + - **UserInfo** (list) - 见 **CreateCompShareTeamRelationParamUserInfo** 模型定义 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **ErrorMap** (dict) - 错误信息Map:key:被邀请成员的公司Id ,value :报错信息ErrorInfo(object),ErrorInfo.Message 报错信息,ErrorInfo.Code 报错Code + + **Request Model** + + **CreateCompShareTeamRelationParamUserInfo** + - **RemarkName** (str) - 被邀请成员的备注名称 + - **UserCompanyId** (int) - 被邀请成员的公司Id + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateCompShareTeamRelationRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateCompShareTeamRelation", d, **kwargs) + return apis.CreateCompShareTeamRelationResponseSchema().loads(resp) + + def create_ul_host_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateULHostInstance - 创建轻量应用云主机 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BundleId** (str) - (Required) 套餐ID。如:"ulh.c1m1s40b30t800" + - **ImageId** (str) - (Required) 镜像ID。 请通过 `DescribeImage `_ 获取 + - **Password** (str) - (Required) ULHost密码。请遵照 `字段规范 `_ 设定密码。密码需使用base64进行编码,举例如下:# echo -n Password1 | base64 + - **ChargeType** (str) - 计费模式。枚举值: \\ > Year,按年付费; \\ > Month,按月付费;\\ > ThirtyDay,30天期付费,跨境电商相关套餐使用此计费方式;默认:Month + - **CouponId** (str) - 主机代金券ID。请通过DescribeCoupon接口查询,或登录用户中心查看 + - **Name** (str) - 轻量应用主机名称。默认:套餐ID。请遵照 `字段规范 `_ 设定实例名称。 + - **Quantity** (int) - 购买时长。默认:1。不支持购买到月末 + - **SecurityGroupId** (str) - 防火墙ID,默认:Web推荐防火墙。如何查询SecurityGroupId请参见 `DescribeFirewall `_ 。 + - **SubnetId** (str) - 子网 ID。默认为当前地域的默认子网。 + - **VPCId** (str) - VPC ID。默认为当前地域的默认VPC。 + + **Response** + + - **Message** (str) - 错误信息 + - **ULHostId** (str) - 实例ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateULHostInstanceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateULHostInstance", d, **kwargs) + return apis.CreateULHostInstanceResponseSchema().loads(resp) + + def delete_comp_share_stop_scheduler( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteCompShareStopScheduler - 删除实例定时关机任务 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UHostId** (str) - (Required) UHost实例ID。【UHostId和HostId必须选填一个,本字段即将废弃,建议使用HostId】 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteCompShareStopSchedulerRequestSchema().dumps(d) + + resp = self.invoke("DeleteCompShareStopScheduler", d, **kwargs) + return apis.DeleteCompShareStopSchedulerResponseSchema().loads(resp) + + def delete_comp_share_team( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteCompShareTeam - 删除团队 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **TeamId** (int) - (Required) 团队Id + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteCompShareTeamRequestSchema().dumps(d) + + resp = self.invoke("DeleteCompShareTeam", d, **kwargs) + return apis.DeleteCompShareTeamResponseSchema().loads(resp) + + def delete_compshare_disk( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteCompshareDisk - 卸载并删除算力磁盘 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **OrganizationID** (int) - (Required) 项目id + - **TopOrganizationID** (int) - (Required) 公司id + - **UDiskId** (str) - (Required) 磁盘ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **UHostId** (str) - 主机ID + + **Response** + + - **UDiskId** (str) - 已删除磁盘id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteCompshareDiskRequestSchema().dumps(d) + + resp = self.invoke("DeleteCompshareDisk", d, **kwargs) + return apis.DeleteCompshareDiskResponseSchema().loads(resp) + + def describe_available_comp_share_instance_types( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeAvailableCompShareInstanceTypes - 获取某个地域下可售/售罄的所有机型信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **MachineTypes** (list) - 指定机型列表 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **AvailableInstanceTypes** (list) - 见 **AvailableInstanceTypes** 模型定义 + - **Status** (str) - 当前区域是否可售 + + **Response Model** + + **Performance** + - **Rate** (int) - 交互展示参数,可忽略 + - **Value** (float) - 值,单位是TFlops + + + **FeatureModes** + - **MinimalCpuPlatform** (list) - 这个特性必须是列出来的CPU平台及以上的CPU才支持 + - **Name** (str) - 模式|特性名称 + - **RelatedToImageFeature** (list) - 为镜像上支持这个特性的标签。例如DescribeImage返回的字段Features包含HotPlug,说明该镜像支持热升级。 + + + **Features** + - **Modes** (list) - 见 **FeatureModes** 模型定义 + - **Name** (str) - 可支持的特性名称。目前支持的特性网络增强|NetCapability、热升级|Hotplug + + + **GraphicsMemory** + - **Rate** (int) - 交互展示参数,可忽略 + - **Value** (int) - 值,单位是GB + + + **Collection** + - **Cpu** (int) - CPU规格 + - **Memory** (list) - 内存规格 + - **MinimalCpuPlatform** (list) - CPU和内存规格只能在列出来的CPU平台支持 + + + **MachineSizes** + - **Collection** (list) - 见 **Collection** 模型定义 + - **Gpu** (int) - Gpu为GPU可支持的规格即GPU颗数,非GPU机型,Gpu为0 + + + **CpuPlatforms** + - **Amd** (list) - 返回AMD的CPU平台信息,例如:AMD: ['Amd/Epyc2'] + - **Ampere** (list) - 返回Arm的CPU平台信息,例如:Ampere: ['Ampere/Altra'] + - **Intel** (list) - 返回Intel的CPU平台信息,例如:Intel: ['Intel/CascadeLake','Intel/CascadelakeR','Intel/IceLake'] + + + **BootDiskInfo** + - **Features** (list) - 磁盘可支持的服务 + - **InstantResize** (bool) - 系统盘是否允许扩容,如果是本地盘,则不允许扩容,InstantResize为false。 + - **MaximalSize** (int) - MaximalSize为磁盘最大值 + - **Name** (str) - 系统盘类别,包含普通云盘|CLOUD_NORMAL、SSD云盘|CLOUD_SSD和RSSD云盘|CLOUD_RSSD。普通本地盘只包含普通本地盘|LOCAL_NORMAL一种。SSD本地盘只包含SSD本地盘|LOCAL_SSD一种。 + + + **DataDiskInfo** + - **Features** (list) - 数据盘可支持的服务 + - **MaximalSize** (int) - MaximalSize为磁盘最大值 + - **MinimalSize** (int) - 磁盘最小值,如果没有该字段,最小值取基础镜像Size值即可(linux为20G,windows为40G)。 + - **Name** (str) - 数据盘类别,包含普通云盘|CLOUD_NORMAL、SSD云盘|CLOUD_SSD和RSSD云盘|CLOUD_RSSD。普通本地盘只包含普通本地盘|LOCAL_NORMAL一种。SSD本地盘只包含SSD本地盘|LOCAL_SSD一种。 + + + **Disks** + - **BootDisk** (list) - 见 **BootDiskInfo** 模型定义 + - **DataDisk** (list) - 见 **DataDiskInfo** 模型定义 + - **Name** (str) - 磁盘介质类别信息,磁盘主要分类如下:云盘|cloudDisk、普通本地盘|normalLocalDisk和SSD本地盘|ssdLocalDisk。 + + + **AvailableInstanceTypes** + - **CpuPlatforms** (dict) - 见 **CpuPlatforms** 模型定义 + - **Disks** (list) - 见 **Disks** 模型定义 + - **Features** (list) - 见 **Features** 模型定义 + - **GraphicsMemory** (dict) - 见 **GraphicsMemory** 模型定义 + - **InstanceType** (str) - 实例类型,枚举值["uhost", "spot"] + - **MachineClass** (str) - 区分是否是GPU机型:GPU机型|GPU,非GPU机型|Normal。 + - **MachineSizes** (list) - 见 **MachineSizes** 模型定义 + - **Name** (str) - 机型名称:快杰O型|O 、快杰共享型|OM 、快杰内存型|OMEM 、 快杰PRO型|OPRO、通用N型|N、高主频C型|C和GPU G型|G等 + - **ParentType** (str) - 父机型 + - **Performance** (dict) - 见 **Performance** 模型定义 + - **Status** (str) - 机型状态:可售|Normal 、 公测|Beta、售罄|Soldout、隐藏|Hidden + - **Zone** (str) - 可用区信息 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeAvailableCompShareInstanceTypesRequestSchema().dumps(d) + + resp = self.invoke( + "DescribeAvailableCompShareInstanceTypes", d, **kwargs + ) + return ( + apis.DescribeAvailableCompShareInstanceTypesResponseSchema().loads( + resp + ) + ) + + def describe_community_images( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeCommunityImages - 获取社区镜像列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Author** (str) - 搜索指定作者发布的镜像 + - **CompShareImageId** (str) - 镜像Id。支持指定镜像Id查询 + - **Limit** (str) - 返回数据长度,默认为20,最大100 + - **Name** (str) - 镜像名称。模糊搜索 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **SortCondition** (dict) - 见 **DescribeCommunityImagesParamSortCondition** 模型定义 + - **Tag** (str) - 按标签名称搜索,精确匹配 + + **Response** + + - **ImageSet** (list) - 见 **CompShareImage** 模型定义 + - **TotalCount** (int) - 总数量 + + **Request Model** + + **DescribeCommunityImagesParamSortCondition** + - **ASC** (str) - 是否升序排列 + - **Field** (str) - 排序条件。- Favor:按热度排序,获取热点镜像;- PubTime:按发布时间排序,获取最新社区镜像;- Price 按价格排序;- CreatedCount 按使用量排序;默认:"PubTime" + + + **Response Model** + + **Software** + - **Applications** (list) - 【array of string】应用列表 + - **CUDAVersion** (str) - CUDA版本 + - **Framework** (str) - 框架名称 + - **FrameworkVersion** (str) - 框架版本 + + + **Projects** + - **AccountId** (str) - 账号Id + - **AccountName** (str) - 账号昵称 + + + **CompShareImage** + - **AuthInfo** (int) - 镜像作者认证信息 + - **Author** (str) - 镜像作者昵称 + - **CompShareImageId** (str) - 镜像Id + - **Container** (str) - 是否为容器镜像。- True 容器镜像- False 虚机镜像 + - **Cover** (str) - 镜像封面URL + - **CreateTime** (str) - 创建时间戳 + - **CreatedCount** (str) - 镜像引用创建计数 + - **Description** (str) - 镜像描述信息 + - **FailedReason** (str) - 镜像制作失败错误原因 + - **FavoritesCount** (str) - 镜像收藏计数 + - **ImageOwnerAlias** (str) - 镜像来源。- Official 平台镜像;- Community 社区镜像 + - **ImageType** (str) - 镜像类型。- System 平台提供的公共镜像;- App 平台提供的应用镜像;- Custom 自制镜像;- Community 社区镜像 + - **IsOfficial** (bool) - 来源是否为官方镜像【仅自制镜像信息返回该字段】 + - **Name** (str) - 镜像名称 + - **Owner** (dict) - 见 **Projects** 模型定义 + - **Price** (float) - 镜像价格。单位:元 + - **PubTime** (str) - 发布时间戳 + - **Readme** (str) - 镜像详细描述。仅指定镜像Id查询时返回 + - **Size** (int) - 镜像大小。单位MB + - **Softwares** (dict) - 见 **Software** 模型定义 + - **Status** (str) - 镜像状态。- Making 制作中;- Available 可用;- UnAvailable 不可用;- Reviewing 审核中;- Offline 已下线 + - **Tags** (list) - 【array of string】镜像标签 + - **Visibility** (int) - 可见性。0:私密镜像;1:公开至镜像社区 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeCommunityImagesRequestSchema().dumps(d) + + resp = self.invoke("DescribeCommunityImages", d, **kwargs) + return apis.DescribeCommunityImagesResponseSchema().loads(resp) + + def describe_comp_share_custom_images( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeCompShareCustomImages - 获取自制镜像列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **CompShareImageId** (str) - 指定镜像Id查询 + - **Limit** (int) - 返回数据长度,默认为20,最大100 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + + **Response** + + - **ImageSet** (list) - 见 **CompShareImage** 模型定义 + - **TotalCount** (int) - 总数量 + + **Response Model** + + **Software** + - **Applications** (list) - 【array of string】应用列表 + - **CUDAVersion** (str) - CUDA版本 + - **Framework** (str) - 框架名称 + - **FrameworkVersion** (str) - 框架版本 + + + **Projects** + - **AccountId** (str) - 账号Id + - **AccountName** (str) - 账号昵称 + + + **CompShareImage** + - **AuthInfo** (int) - 镜像作者认证信息 + - **Author** (str) - 镜像作者昵称 + - **CompShareImageId** (str) - 镜像Id + - **Container** (str) - 是否为容器镜像。- True 容器镜像- False 虚机镜像 + - **Cover** (str) - 镜像封面URL + - **CreateTime** (int) - 创建时间戳 + - **CreatedCount** (int) - 镜像引用创建计数 + - **Description** (str) - 镜像描述信息 + - **FailedReason** (str) - 镜像制作失败错误原因 + - **FavoritesCount** (int) - 镜像收藏计数 + - **GroupId** (str) - 镜像组id + - **ImageOwnerAlias** (str) - 镜像来源。- Official 平台镜像;- Community 社区镜像 + - **ImageType** (str) - 镜像类型。- System 平台提供的公共镜像;- App 平台提供的应用镜像;- Custom 自制镜像;- Community 社区镜像 + - **IsOfficial** (bool) - 来源是否为官方镜像【仅自制镜像信息返回该字段】 + - **Name** (str) - 镜像名称 + - **Owner** (dict) - 见 **Projects** 模型定义 + - **Price** (float) - 镜像价格。单位:元 + - **PubTime** (int) - 发布时间戳 + - **Readme** (str) - 镜像详细描述。仅指定镜像Id查询时返回 + - **Size** (int) - 镜像大小。单位MB + - **Softwares** (dict) - 见 **Software** 模型定义 + - **Status** (str) - 镜像状态。- Making 制作中;- Available 可用;- UnAvailable 不可用;- Reviewing 审核中;- Offline 已下线 + - **Tags** (list) - 【array of string】镜像标签 + - **VersionDesc** (str) - 版本描述 + - **VersionName** (str) - 版本名称 + - **Visibility** (int) - 可见性。0:私密镜像;1:公开至镜像社区 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeCompShareCustomImagesRequestSchema().dumps(d) + + resp = self.invoke("DescribeCompShareCustomImages", d, **kwargs) + return apis.DescribeCompShareCustomImagesResponseSchema().loads(resp) + + def describe_comp_share_gpu_inventory( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeCompShareGpuInventory - 查询GPU卡余量库存 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **GpuInventoryByZone** (dict) - 返回为嵌套map:,key为池子名称 (Exclusive:独占,Spot :抢占) value : 库存余量信息map {key 可用区ID,value:GPU卡余量map (key:GPU机型,value:余量GPU卡数量),举例:{"Exclusive":{10027:{"2080":10}}}} + - **SpotUnsupportedGpuTypes** (list) - 不支持抢占的GPU机型 + - **UpdateTime** (int) - 缓存更新时间(5min更新一次) + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeCompShareGpuInventoryRequestSchema().dumps(d) + + resp = self.invoke("DescribeCompShareGpuInventory", d, **kwargs) + return apis.DescribeCompShareGpuInventoryResponseSchema().loads(resp) + + def describe_comp_share_image_share_accounts( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeCompShareImageShareAccounts - 获取镜像共享的账号列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **CompShareImageId** (str) - (Required) 镜像Id + + **Response** + + - **AccountSet** (list) - 见 **Projects** 模型定义 + + **Response Model** + + **Projects** + - **AccountId** (str) - 账号Id + - **AccountName** (str) - 账号昵称 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeCompShareImageShareAccountsRequestSchema().dumps(d) + + resp = self.invoke("DescribeCompShareImageShareAccounts", d, **kwargs) + return apis.DescribeCompShareImageShareAccountsResponseSchema().loads( + resp + ) + + def describe_comp_share_image_tags( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeCompShareImageTags - 获取镜像标签列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **Tags** (list) - 【Array of string】镜像标签列表 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeCompShareImageTagsRequestSchema().dumps(d) + + resp = self.invoke("DescribeCompShareImageTags", d, **kwargs) + return apis.DescribeCompShareImageTagsResponseSchema().loads(resp) + + def describe_comp_share_images( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeCompShareImages - 可获取平台、应用镜像信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Author** (str) - 镜像作者昵称 + - **CompShareImageId** (str) - 镜像Id。支持指定Id查询 + - **ImageType** (str) - 镜像类型。枚举值- System 平台镜像- App 应用镜像默认:System + - **Limit** (int) - 返回数据长度,默认为20,最大100 + - **Name** (str) - 镜像名称。支持模糊搜索 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **Tag** (str) - 镜像标签 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **ImageSet** (list) - 见 **CompShareImage** 模型定义 + - **TotalCount** (int) - 总数量 + + **Response Model** + + **Software** + - **Applications** (list) - 【array of string】应用列表 + - **CUDAVersion** (str) - CUDA版本 + - **Framework** (str) - 框架名称 + - **FrameworkVersion** (str) - 框架版本 + + + **Projects** + - **AccountId** (str) - 账号Id + - **AccountName** (str) - 账号昵称 + + + **CompShareImage** + - **AuthInfo** (int) - 镜像作者认证信息 + - **Author** (str) - 镜像作者昵称 + - **CompShareImageId** (str) - 镜像Id + - **Container** (str) - 是否为容器镜像。- True 容器镜像- False 虚机镜像 + - **Cover** (str) - 镜像封面URL + - **CreateTime** (str) - 创建时间戳 + - **CreatedCount** (str) - 镜像引用创建计数 + - **Description** (str) - 镜像描述信息 + - **FailedReason** (str) - 镜像制作失败错误原因 + - **FavoritesCount** (str) - 镜像收藏计数 + - **ImageOwnerAlias** (str) - 镜像来源。- Official 平台镜像;- Community 社区镜像 + - **ImageType** (str) - 镜像类型。- System 平台提供的公共镜像;- App 平台提供的应用镜像;- Custom 自制镜像;- Community 社区镜像 + - **IsOfficial** (bool) - 来源是否为官方镜像【仅自制镜像信息返回该字段】 + - **Name** (str) - 镜像名称 + - **Owner** (dict) - 见 **Projects** 模型定义 + - **Price** (float) - 镜像价格。单位:元 + - **PubTime** (str) - 发布时间戳 + - **Readme** (str) - 镜像详细描述。仅指定镜像Id查询时返回 + - **Size** (int) - 镜像大小。单位MB + - **Softwares** (dict) - 见 **Software** 模型定义 + - **Status** (str) - 镜像状态。- Making 制作中;- Available 可用;- UnAvailable 不可用;- Reviewing 审核中;- Offline 已下线 + - **Tags** (list) - 【array of string】镜像标签 + - **Visibility** (int) - 可见性。0:私密镜像;1:公开至镜像社区 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeCompShareImagesRequestSchema().dumps(d) + + resp = self.invoke("DescribeCompShareImages", d, **kwargs) + return apis.DescribeCompShareImagesResponseSchema().loads(resp) + + def describe_comp_share_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeCompShareInstance - 获取用户所有地域下主机资源信息列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - 返回数据长度,默认为20,最大100 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **UHostIds** (list) - 【数组】UHost主机的资源ID,例如UHostIds.0代表希望获取信息 的主机1,UHostIds.1代表主机2。 如果不传入,则返回当前Region 所有符合条件的UHost实例。 + - **WithoutGpu** (bool) - 无卡GPU + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **TotalCount** (int) - UHostInstance总数 + - **UHostSet** (list) - 见 **CompShareInstanceSet** 模型定义 + + **Response Model** + + **GpuMonitorInfo** + - **GPU** (str) - GPU卡名称 + - **GpuUsageRate** (str) - GPU卡使用率 + - **MemoryUsageRate** (str) - GPU显存使用率 + + + **MonitorMessage** + - **CpuUsageRate** (str) - CPU使用率 + - **GpuInfo** (list) - 见 **GpuMonitorInfo** 模型定义 + - **MemUsageRate** (str) - 内存使用率 + + + **WithoutGpuSpec** + - **Cpu** (int) - cpu + - **Gpu** (int) - gpu + - **Memory** (int) - 内存 + + + **UHostIPSet** + - **Bandwidth** (int) - IP对应的带宽, 单位: Mb (内网IP不显示带宽信息) + - **Default** (str) - 内网 Private 类型下,表示是否为默认网卡。true: 是默认网卡;其他值:不是。 + - **IP** (str) - IP地址 + - **IPId** (str) - 外网IP资源ID 。(内网IP无对应的资源ID) + - **IPMode** (str) - IPv4/IPv6; + - **Mac** (str) - 内网 Private 类型下,当前网卡的Mac。 + - **NetworkInterfaceId** (str) - 弹性网卡为默认网卡时,返回对应的 ID 值 + - **SubnetId** (str) - IP地址对应的子网 ID。(北京一不支持,字段返回为空) + - **Type** (str) - 国际: Internation,BGP: Bgp,内网: Private + - **VPCId** (str) - IP地址对应的VPC ID。(北京一不支持,字段返回为空) + - **Weight** (int) - 当前EIP的权重。权重最大的为当前的出口IP。 + + + **UHostDiskSet** + - **DiskId** (str) - 磁盘ID + - **DiskType** (str) - 磁盘类型。请参考 `磁盘类型 `_ 。 + - **Drive** (str) - 磁盘盘符 + - **Encrypted** (str) - "true": 加密盘 "false":非加密盘 + - **IsBoot** (str) - 是否是系统盘。枚举值:\\ > True,是系统盘 \\ > False,是数据盘(默认)。Disks数组中有且只能有一块盘是系统盘。 + - **Name** (str) - UDisk名字(仅当磁盘是UDisk时返回) + - **Size** (int) - 磁盘大小,单位: GB + - **Type** (str) - 【建议不再使用】磁盘类型。系统盘: Boot,数据盘: Data,网络盘:Udisk + + + **SoftwareAddr** + - **Name** (str) - 软件名称 + - **URL** (str) - 软件地址 + + + **DiskPriceInfo** + - **ChargeType** (str) - 计费类型 + - **IsBoot** (bool) - 是否为系统盘 + - **Price** (float) - 磁盘价格 + + + **GraphicsMemory** + - **Rate** (int) - 交互展示参数,可忽略 + - **Value** (int) - 值,单位是GB + + + **CompShareInstanceSet** + - **AutoRenew** (str) - 是否自动续费,自动续费:“Yes”,不自动续费:“No” + - **CPU** (int) - 虚拟CPU核数,单位: 个 + - **ChargeType** (str) - 计费模式,枚举值为: Year,按年付费; Month,按月付费; Dynamic,按时付费;Postpay,按需付费 + - **CompShareImageBillId** (str) - 用于镜像计费的Id + - **CompShareImageId** (str) - 镜像Id + - **CompShareImageName** (str) - 镜像名称 + - **CompShareImageOwnerAlias** (str) - 镜像来源 + - **CompShareImagePrice** (float) - 镜像价格 + - **CompShareImageStatus** (str) - 镜像状态 + - **CompShareImageType** (str) - 镜像类型- System 系统镜像- App 应用镜像- Custom 自制镜像- Community 社区镜像 + - **CpuArch** (str) - CPU架构。"x86_64"/"i386"等 + - **CpuPlatform** (str) - CPU平台。如"Intel/Auto"、"Amd/Auto"等等 + - **CreateTime** (int) - 创建时间 + - **DiscountType** (int) - 主机折扣类型 1:夜间折扣 2:节日折扣 + - **DiskPriceInfo** (list) - 见 **DiskPriceInfo** 模型定义 + - **DiskSet** (list) - 见 **UHostDiskSet** 模型定义 + - **ExpireTime** (int) - 过期时间 + - **GPU** (int) - GPU个数 + - **GpuType** (str) - GPU类型。如: "4090" + - **GraphicsMemory** (dict) - 见 **GraphicsMemory** 模型定义 + - **IPSet** (list) - 见 **UHostIPSet** 模型定义 + - **InstancePrice** (float) - 主机价格 + - **InstanceType** (str) - 实例类型。"UHost": 普通主机;"Container": 容器主机 + - **IsExpire** (str) - 是否过期。Yes:已过期;No:未过期 + - **MachineType** (str) - 机型信息 + - **Memory** (int) - 内存大小,单位:MB + - **MonitorMessages** (dict) - 见 **MonitorMessage** 模型定义 + - **Name** (str) - 实例名称 + - **OsName** (str) - 虚机镜像的名称 + - **OsType** (str) - 虚机镜像操作系统类型。"Linux"\"Windows" + - **Password** (str) - 主机密码。由Base64编码 + - **PostPayPowerOffBillingResource** (list) - 见 **DiskPriceInfo** 模型定义 + - **ReleaseTime** (int) - 释放时间(关机时候返回) + - **Remark** (str) - 实例备注 + - **Softwares** (list) - 见 **SoftwareAddr** 模型定义 + - **SshLoginCommand** (str) - SSH登录命令 + - **StartTime** (int) - 主机启动时间 + - **State** (str) - 实例状态,枚举值:\\ >初始化: Initializing; \\ >启动中: Starting; \\> 运行中: Running; \\> 关机中: Stopping; \\ >关机: Stopped \\ >安装失败: Install Fail; \\ >重启中: Rebooting; \\ >升级改配中: Resizing; \\ > 未知(空字符串,获取状态超时或出错): + - **StopSchedulerTime** (int) - 计划关机时间 + - **StopTime** (int) - 定时关机时间 + - **SupportWithoutGpuStart** (bool) - 此实例是否支持无卡开机 + - **Tag** (str) - 实例业务组 + - **TotalDiskSpace** (int) - 总的数据盘存储空间 + - **UHostId** (str) - 实例Id + - **UpdateTime** (int) - 虚机状态更新时间 + - **WithoutGpuSpec** (dict) - 见 **WithoutGpuSpec** 模型定义 + - **Zone** (str) - 可用区 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeCompShareInstanceRequestSchema().dumps(d) + + resp = self.invoke("DescribeCompShareInstance", d, **kwargs) + return apis.DescribeCompShareInstanceResponseSchema().loads(resp) + + def describe_comp_share_machine_type_families( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeCompShareMachineTypeFamilies - 获取实例规格族列表(所有机型的信息) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。因为子账号要iam鉴权而填写 + + **Response** + + - **MachineTypes** (list) - 机型配置列表 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeCompShareMachineTypeFamiliesRequestSchema().dumps(d) + + resp = self.invoke("DescribeCompShareMachineTypeFamilies", d, **kwargs) + return apis.DescribeCompShareMachineTypeFamiliesResponseSchema().loads( + resp + ) + + def describe_comp_share_sharing_images( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeCompShareSharingImages - 获取算力平台共享镜像列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **CompShareImageId** (str) - 镜像Id + - **Limit** (int) - 返回数据长度,默认为20,最大100 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **ImageSet** (list) - 见 **CompShareImage** 模型定义 + - **TotalCount** (int) - 总数 + + **Response Model** + + **Software** + - **Applications** (list) - 【array of string】应用列表 + - **CUDAVersion** (str) - CUDA版本 + - **Framework** (str) - 框架名称 + - **FrameworkVersion** (str) - 框架版本 + + + **Projects** + - **AccountId** (str) - 账号Id + - **AccountName** (str) - 账号昵称 + + + **CompShareImage** + - **AuthInfo** (int) - 镜像作者认证信息 + - **Author** (str) - 镜像作者昵称 + - **AutoStart** (bool) - 是否支持自启动 default:false + - **CompShareImageId** (str) - 镜像Id + - **Container** (str) - 是否为容器镜像。- True 容器镜像- False 虚机镜像 + - **Cover** (str) - 镜像封面URL + - **CreateTime** (int) - 创建时间戳 + - **CreatedCount** (int) - 镜像引用创建计数 + - **Description** (str) - 镜像描述信息 + - **FailedReason** (str) - 镜像制作失败错误原因 + - **FavoritesCount** (int) - 镜像收藏计数 + - **GroupId** (str) - 镜像组id + - **ImageCharge** (bool) - 是否镜像收费 default: false + - **ImageOwnerAlias** (str) - 镜像来源。- Official 平台镜像;- Community 社区镜像 + - **ImageType** (str) - 镜像类型。- System 平台提供的公共镜像;- App 平台提供的应用镜像;- Custom 自制镜像;- Community 社区镜像 + - **ImageUseTime** (int) - 镜像使用时长 + - **IsOfficial** (bool) - 来源是否为官方镜像【仅自制镜像信息返回该字段】 + - **Name** (str) - 镜像名称 + - **Owner** (dict) - 见 **Projects** 模型定义 + - **Price** (float) - 镜像价格。单位:元 + - **PubTime** (int) - 发布时间戳 + - **Readme** (str) - 镜像详细描述。仅指定镜像Id查询时返回 + - **Size** (int) - 镜像大小。单位MB + - **Softwares** (dict) - 见 **Software** 模型定义 + - **SourceGpuType** (str) - 自制镜像来源机型 + - **Status** (str) - 镜像状态。- Making 制作中;- Available 可用;- UnAvailable 不可用;- Reviewing 审核中;- Offline 已下线 + - **Tags** (list) - 【array of string】镜像标签 + - **VersionDesc** (str) - 版本描述 + - **VersionName** (str) - 版本名称 + - **Visibility** (int) - 可见性。0:私密镜像;1:公开至镜像社区 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeCompShareSharingImagesRequestSchema().dumps(d) + + resp = self.invoke("DescribeCompShareSharingImages", d, **kwargs) + return apis.DescribeCompShareSharingImagesResponseSchema().loads(resp) + + def describe_comp_share_software_port( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeCompShareSoftwarePort - 获取算力平台应用及端口号列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + + **Response** + + - **SoftwarePort** (list) - 见 **SoftwarePort** 模型定义 + + **Response Model** + + **SoftwarePort** + - **Port** (int) - 端口号。范围: [1, 65535] + - **Software** (str) - 应用名称 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeCompShareSoftwarePortRequestSchema().dumps(d) + + resp = self.invoke("DescribeCompShareSoftwarePort", d, **kwargs) + return apis.DescribeCompShareSoftwarePortResponseSchema().loads(resp) + + def describe_comp_share_support_zone( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeCompShareSupportZone - 获取支持的可用区信息列表 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + + **Response** + + - **ZoneInfo** (list) - 见 **SupportZone** 模型定义 + + **Response Model** + + **SupportZone** + - **Describe** (str) - 可用区显示名称 + - **Region** (str) - 地域名称 + - **RegionId** (int) - 地域ID + - **Zone** (str) - 可用区名称 + - **ZoneId** (int) - 可用区ID + + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeCompShareSupportZoneRequestSchema().dumps(d) + + resp = self.invoke("DescribeCompShareSupportZone", d, **kwargs) + return apis.DescribeCompShareSupportZoneResponseSchema().loads(resp) + + def describe_model_repository_models( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeModelRepositoryModels - 模型仓库模型列表 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Name** (str) - 模型名称 + - **Tags** (str) - 模型标签列表, 标签之间英文逗号:"," 相连接 + + **Response** + + - **Models** (list) - 见 **ModelRepositoryModel** 模型定义 + + **Response Model** + + **ModelRepositoryModel** + - **CreateTime** (int) - 创建时间 + - **Name** (str) - 模型名称 + - **Path** (str) - 模型路径 + - **Size** (str) - 模型大小 + - **Tag** (str) - 模型标签 + + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeModelRepositoryModelsRequestSchema().dumps(d) + + resp = self.invoke("DescribeModelRepositoryModels", d, **kwargs) + return apis.DescribeModelRepositoryModelsResponseSchema().loads(resp) + + def describe_model_repository_tags( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeModelRepositoryTags - 模型仓库标签列表 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Tags** (list) - 标签列表 + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeModelRepositoryTagsRequestSchema().dumps(d) + + resp = self.invoke("DescribeModelRepositoryTags", d, **kwargs) + return apis.DescribeModelRepositoryTagsResponseSchema().loads(resp) + + def describe_self_community_images( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeSelfCommunityImages - 个人中心社区镜像查询 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **CompShareImageId** (str) - 镜像ID + - **GroupId** (str) - 版本组ID + + **Response** + + - **AvailableTotalCount** (int) - 仅计算当前ImageSetGroup中已发布的镜像信息,若某个Group中不存在已上线,则不统计 + - **ImageSetGroup** (list) - 见 **CompshareImageGroup** 模型定义 + - **TotalCount** (int) - 镜像总数 + + **Response Model** + + **Projects** + - **AccountId** (str) - 账号Id + - **AccountName** (str) - 账号昵称 + + + **Software** + - **Applications** (list) - 【array of string】应用列表 + - **CUDAVersion** (str) - CUDA版本 + - **Framework** (str) - 框架名称 + - **FrameworkVersion** (str) - 框架版本 + + + **CompShareImage** + - **AuthInfo** (int) - 镜像作者认证信息 + - **Author** (str) - 镜像作者昵称 + - **AutoStart** (bool) - 是否支持自启动 default:false + - **CompShareImageId** (str) - 镜像Id + - **Container** (str) - 是否为容器镜像。- True 容器镜像- False 虚机镜像 + - **Cover** (str) - 镜像封面URL + - **CreateTime** (int) - 创建时间戳 + - **CreatedCount** (int) - 镜像引用创建计数 + - **Description** (str) - 镜像描述信息 + - **FailedReason** (str) - 镜像制作失败错误原因 + - **FavoritesCount** (int) - 镜像收藏计数 + - **GroupId** (str) - 镜像组id + - **ImageCharge** (bool) - 是否镜像收费 default: false + - **ImageOwnerAlias** (str) - 镜像来源。- Official 平台镜像;- Community 社区镜像 + - **ImageType** (str) - 镜像类型。- System 平台提供的公共镜像;- App 平台提供的应用镜像;- Custom 自制镜像;- Community 社区镜像 + - **ImageUseTime** (int) - 镜像使用时长 + - **IsOfficial** (bool) - 来源是否为官方镜像【仅自制镜像信息返回该字段】 + - **Name** (str) - 镜像名称 + - **Owner** (dict) - 见 **Projects** 模型定义 + - **Price** (float) - 镜像价格。单位:元 + - **PubTime** (int) - 发布时间戳 + - **Readme** (str) - 镜像详细描述。仅指定镜像Id查询时返回 + - **Size** (int) - 镜像大小。单位MB + - **Softwares** (dict) - 见 **Software** 模型定义 + - **SourceGpuType** (str) - 自制镜像来源机型 + - **Status** (str) - 镜像状态。- Making 制作中;- Available 可用;- UnAvailable 不可用;- Reviewing 审核中;- Offline 已下线 + - **Tags** (list) - 【array of string】镜像标签 + - **VersionDesc** (str) - 版本描述 + - **VersionName** (str) - 版本名称 + - **Visibility** (int) - 可见性。0:私密镜像;1:公开至镜像社区 + + + **CompshareImageGroup** + - **CreatedCount** (int) - 引用创建次数 + - **Data** (list) - 见 **CompShareImage** 模型定义 + - **FavoritesCount** (int) - 收藏数 + - **GroupId** (str) - 版本组ID + - **ImageDesc** (str) - 镜像描述 + - **ImageName** (str) - 镜像名称 + - **ImageUseTime** (int) - 镜像使用时长 , 单位:小时 + - **IsFavorite** (bool) - 是否被收藏 + - **RecommendCount** (int) - 推荐数 + - **Status** (str) - 镜像组状态 Available 可用;UnAvailable 不可用 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeSelfCommunityImagesRequestSchema().dumps(d) + + resp = self.invoke("DescribeSelfCommunityImages", d, **kwargs) + return apis.DescribeSelfCommunityImagesResponseSchema().loads(resp) + + def describe_team_member_order( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeTeamMemberOrder - 获取团队订单 + + **Request** + + - **BeginTime** (int) - (Required) 起始时间,需使用时间戳 + - **EndTime** (int) - (Required) 结束时间,需使用时间戳,结束时间需大于起始时间 + - **TeamId** (int) - (Required) 团队ID + - **VirtualCompanyId** (int) - (Required) 团队虚拟账号ID + - **ChargeTypes** (list) - 付费方式 + - **Limit** (int) - 返回数据长度,默认为25,最大100 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **OrderBy** (str) - 排序参数 + - **OrderDir** (str) - 排序方式 + - **OrderNos** (list) - 订单号 + - **OrderStates** (list) - 订单状态 + - **OrderTypes** (list) - 订单类型 + - **Regions** (list) - 可用区 + - **ResourceIds** (list) - 资源ID + - **ResourceTypes** (list) - 产品类型 + + **Response** + + - **Limit** (int) - 分页大小 + - **Offset** (int) - 分页偏移 + - **OrderInfos** (list) - 见 **OrderInfo** 模型定义 + - **Total** (int) - 总条数 + + **Response Model** + + **OrderDetailItem** + - **ProductName** (str) - 产品名 + - **Value** (str) - 配置 + + + **ResourceTagItem** + - **KeyId** (str) - 标识名称 + - **Value** (str) - 标识信息 + + + **OrderInfo** + - **Amount** (str) - 订单金额 + - **AmountCoupon** (str) - 优惠券金额 + - **AmountFree** (str) - 赠金 + - **AmountReal** (str) - 真实金额 + - **ChargeType** (str) - 付费方式 + - **Count** (int) - 购买数量 + - **CreateTime** (int) - 创建时间 + - **EndTime** (int) - 订单结束时间 + - **OrderDetail** (list) - 见 **OrderDetailItem** 模型定义 + - **OrderDetailOld** (list) - 见 **OrderDetailItem** 模型定义 + - **OrderNo** (str) - 订单号 + - **OrderState** (str) - 订单状态 + - **OrderType** (str) - 订单类型 + - **OriginalPrice** (str) - 折扣率 + - **ProjectName** (str) - 项目名称 + - **Quantity** (str) - 购买量 + - **RegionId** (str) - 可用区 + - **ResourceId** (str) - 资源ID + - **ResourceTag** (list) - 见 **ResourceTagItem** 模型定义 + - **ResourceType** (str) - 产品类型 + - **SpotDiscount** (str) - 抢占式折扣,仅抢占式才展示 + - **StartTime** (int) - 订单起始时间 + - **TradeNo** (str) - 交易号 + - **UpdateTime** (int) - 更新时间 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.DescribeTeamMemberOrderRequestSchema().dumps(d) + + resp = self.invoke("DescribeTeamMemberOrder", d, **kwargs) + return apis.DescribeTeamMemberOrderResponseSchema().loads(resp) + + def describe_team_member_order_count( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeTeamMemberOrderCount - 获取团队成员订单总览 + + **Request** + + - **BeginTime** (int) - (Required) 起始时间,需使用时间戳 + - **EndTime** (int) - (Required) 结束时间,需使用时间戳,结束时间需大于起始时间 + - **TeamId** (int) - (Required) 团队ID + - **VirtualCompanyId** (int) - (Required) 团队虚拟账号ID + - **ChargeTypes** (str) - 付费方式 + - **OrderStates** (str) - 订单状态 + - **OrderTypes** (str) - 订单类型 + - **Regions** (str) - 可用区 + - **ResourceTypes** (str) - 产品类型 + + **Response** + + - **Amount** (str) - 订单总金额 + - **AmountCoupon** (str) - 代金券 + - **AmountFree** (str) - 赠送金额 + - **AmountReal** (str) - 真实金额 + - **TotalCount** (int) - 订单数量 + + """ + # build request + d = {} + req and d.update(req) + d = apis.DescribeTeamMemberOrderCountRequestSchema().dumps(d) + + resp = self.invoke("DescribeTeamMemberOrderCount", d, **kwargs) + return apis.DescribeTeamMemberOrderCountResponseSchema().loads(resp) + + def describe_team_member_unpaid_order( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeTeamMemberUnpaidOrder - 获取团队队员未支付订单 + + **Request** + + - **BeginTime** (int) - (Required) 起始时间,需使用时间戳 + - **EndTime** (int) - (Required) 结束时间,需使用时间戳,结束时间需大于起始时间 + - **TeamId** (int) - (Required) 团队ID + - **VirtualCompanyId** (int) - (Required) 团队虚拟账号ID + - **ChargeTypes** (list) - 付费方式 + - **Limit** (int) - 返回数据长度,默认为25,最大100 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **OrderBy** (str) - 排序参数 + - **OrderDir** (str) - 排序方式 + - **OrderNos** (list) - 订单号 + - **OrderStates** (list) - 订单状态 + - **OrderTypes** (list) - 订单类型 + - **Regions** (list) - 可用区 + - **ResourceIds** (list) - 资源ID + - **ResourceTypes** (list) - 产品类型 + + **Response** + + - **Limit** (int) - 分页大小 + - **Offset** (int) - 分页偏移 + - **OrderInfos** (list) - 见 **UnpaidOrderInfo** 模型定义 + - **Total** (int) - 总条数 + + **Response Model** + + **UnpaidOrderDetail** + - **BillItemId** (str) - 计费对象的资源ID + - **Multiple** (int) - 配置大小 + - **ProductId** (int) - 产品子类 + - **PurchaseValue** (int) - 资源有效期 + + + **UnpaidOrderInfo** + - **Amount** (int) - 金额 + - **ChargeType** (str) - 付费方式 + - **CreateTime** (int) - 创建时间 + - **EndTime** (int) - 订单结束时间 + - **OrderDetail** (list) - 见 **UnpaidOrderDetail** 模型定义 + - **OrderNo** (str) - 订单号 + - **OrderState** (str) - 订单状态 + - **OrderType** (str) - 订单类型 + - **OriginalPrice** (str) - 折扣率 + - **Quantity** (str) - 购买量 + - **RegionId** (str) - 可用区 + - **ResourceId** (str) - 资源短ID + - **ResourceType** (str) - 产品类型 + - **StartTime** (int) - 订单起始时间 + - **TradeNo** (str) - 交易号 + - **UpdateTime** (int) - 更新时间 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.DescribeTeamMemberUnpaidOrderRequestSchema().dumps(d) + + resp = self.invoke("DescribeTeamMemberUnpaidOrder", d, **kwargs) + return apis.DescribeTeamMemberUnpaidOrderResponseSchema().loads(resp) + + def describe_team_member_unpaid_order_count( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeTeamMemberUnpaidOrderCount - 获取团队成员未支付订单总览 + + **Request** + + - **BeginTime** (int) - (Required) 起始时间,需使用时间戳 + - **EndTime** (int) - (Required) 结束时间,需使用时间戳,结束时间需大于起始时间 + - **TeamId** (int) - (Required) 团队ID + - **VirtualCompanyId** (int) - (Required) 虚拟账号公司ID + - **ChargeTypes** (list) - 付费方式 + - **OrderStates** (list) - 订单状态 + - **OrderTypes** (list) - 订单类型 + - **OrganizationId** (int) - 组织ID + - **Regions** (list) - 可用区 + - **ResourceIds** (str) - 资源ID + - **ResourceTypes** (int) - 产品类型 + - **TransactionNos** (list) - 交易流水号 + + **Response** + + - **Amount** (str) - 欠费订单总金额 + - **TotalCount** (int) - 欠费订单数 + + """ + # build request + d = {} + req and d.update(req) + d = apis.DescribeTeamMemberUnpaidOrderCountRequestSchema().dumps(d) + + resp = self.invoke("DescribeTeamMemberUnpaidOrderCount", d, **kwargs) + return apis.DescribeTeamMemberUnpaidOrderCountResponseSchema().loads( + resp + ) + + def describe_ul_host_bundles( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeULHostBundles - 获取轻量应用云主机套餐列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + + **Response** + + - **Bundles** (list) - 见 **Bundle** 模型定义 + - **Message** (str) - 错误信息 + + **Response Model** + + **Bundle** + - **Bandwidth** (int) - 外网带宽。单位:Mbps。 + - **BundleId** (str) - 套餐ID。 + - **CPU** (int) - CPU核数。 + - **Memory** (int) - 内存大小。单位:MB。 + - **SysDiskSpace** (int) - 系统盘大小。单位:GB。 + - **TrafficPacket** (int) - 流量包大小。单位:GB。 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeULHostBundlesRequestSchema().dumps(d) + + resp = self.invoke("DescribeULHostBundles", d, **kwargs) + return apis.DescribeULHostBundlesResponseSchema().loads(resp) + + def describe_ul_host_image( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeULHostImage - 获取指定数据中心镜像列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ImageId** (str) - 镜像Id + - **ImageIds** (list) - 镜像Id列表 + - **ImageType** (str) - 镜像类型。标准镜像:Base,应用镜像:App, 自定义镜像:Custom,默认返回所有类型 + - **Limit** (int) - 返回数据长度,默认为20 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **OsType** (str) - 操作系统类型:Linux, Windows 默认返回所有类型 + - **Scene** (str) - 使用场景,当ImageType为"App"时生效。- Normal 常规专区- CrossBorder 跨境专区默认返回所有 + - **Tag** (str) - 业务组Id。默认:Default + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **ImageSet** (list) - 见 **ULHostImageSet** 模型定义 + - **TotalCount** (int) - 满足条件的镜像总数 + + **Response Model** + + **ULHostImageSet** + - **CreateTime** (int) - 创建时间,格式为Unix时间戳 + - **DisplayName** (str) - 用于控制台显示的名称 + - **Features** (list) - 特殊状态标识,目前包含NetEnhnced(网络增强1.0), NetEnhanced_Ultra(网络增强2.0), NetEnhanced_Extreme(网络增强3.0), HotPlug(热升级), GPU(GPU镜像),CloudInit, IPv6(支持IPv6网络),RssdAttachable(支持RSSD云盘),Vgpu_AMD(支持AMD的vgpu),Vgpu_NVIDIA(支持NVIDIA的vgpu),Aarch64_Type(支持arm64架构) + - **ImageDescription** (str) - 镜像描述 + - **ImageId** (str) - 镜像ID + - **ImageLogoLink** (str) - 应用镜像图标url + - **ImageName** (str) - 镜像名称 + - **ImageSize** (int) - 镜像大小 + - **ImageType** (str) - 镜像类型 标准镜像:Base, 行业镜像:Business,自定义镜像:Custom + - **IntegratedSoftware** (str) - 集成软件名称(仅行业镜像将返回这个值) + - **MaintainEol** (str) - 系统EOL的时间,格式:YYYY/MM/DD + - **MinimalCPU** (str) - 默认值为空'''。当CentOS 7.3/7.4/7.5等镜像会标记为“Broadwell” + - **OsName** (str) - 操作系统名称 + - **OsType** (str) - 操作系统类型:Linux,Windows + - **SceneCategories** (list) - 场景分类,目前包含Featured(精选),PreInstalledDrivers(预装驱动),AIPainting(AI绘画),AIModels(AI模型),HPC(高性能计算) + - **State** (str) - 镜像状态, 可用:Available,制作中:Making, 不可用:Unavailable,复制中:Copying + - **Tag** (str) - 业务组 + - **Zone** (str) - 可用区,参见 `可用区列表 `_ + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeULHostImageRequestSchema().dumps(d) + + resp = self.invoke("DescribeULHostImage", d, **kwargs) + return apis.DescribeULHostImageResponseSchema().loads(resp) + + def describe_ul_host_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeULHostInstance - 获取轻量应用云主机列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - 返回数据长度,默认为20,最大100 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **ULHostIds** (list) - 【数组】轻量应用云主机ID。 + + **Response** + + - **Message** (str) - 错误信息 + - **ULHostInstanceSets** (list) - 见 **ULHostInstanceSet** 模型定义 + + **Response Model** + + **ExclusiveUTPInfo** + - **AvailableSize** (int) - 当前周期剩余流量 + - **CreateTime** (int) - 创建时间 + - **ExcessSize** (int) - 当前周期超出限额的流量 + - **LastResetTime** (int) - 上次重置时间 + - **NextResetTime** (int) - 下次重置时间 + - **TotalSize** (int) - 当前周期总流量 + - **UsedSize** (int) - 当前周期已使用流量 + + + **UHostIPSet** + - **Bandwidth** (int) - IP对应的带宽, 单位: Mb (内网IP不显示带宽信息) + - **Default** (str) - 内网 Private 类型下,表示是否为默认网卡。true: 是默认网卡;其他值:不是。 + - **IP** (str) - IP地址 + - **IPId** (str) - 外网IP资源ID 。(内网IP无对应的资源ID) + - **IPMode** (str) - IPv4/IPv6; + - **Mac** (str) - 内网 Private 类型下,当前网卡的Mac。 + - **NetworkInterfaceId** (str) - 弹性网卡为默认网卡时,返回对应的 ID 值 + - **SubnetId** (str) - IP地址对应的子网 ID。(北京一不支持,字段返回为空) + - **Type** (str) - 国际: Internation,BGP: Bgp,内网: Private + - **VPCId** (str) - IP地址对应的VPC ID。(北京一不支持,字段返回为空) + - **Weight** (int) - 当前EIP的权重。权重最大的为当前的出口IP。 + + + **ULHostDiskSet** + - **DiskId** (str) - 磁盘Id + - **DiskType** (str) - 磁盘类型。如:"CLOUD_RSSD"、"CLOUD_SSD" + - **Drive** (str) - 磁盘盘符。系统盘:"vda" + - **IsBoot** (str) - 是否为系统盘。是:"True";否:"False" + - **Size** (int) - 磁盘大小。单位:GB + - **Type** (str) - 磁盘类型。系统盘:"Boot";数据盘:"Data" + + + **ULHostInstanceSet** + - **Apps** (list) - 【数组】镜像包含的应用列表。 + - **AutoRenew** (str) - 是否自动续费。枚举值:Yes/No + - **CPU** (int) - CPU核数。 + - **ChargeType** (str) - 计费模式。枚举值:Month/Year + - **CreateTime** (int) - 创建时间。Unix时间戳 + - **DiskSet** (list) - 见 **ULHostDiskSet** 模型定义 + - **EIPExclusiveUTPInfo** (dict) - 见 **ExclusiveUTPInfo** 模型定义 + - **ExpireTime** (int) - 过期时间。Unix时间戳 + - **IPSet** (list) - 见 **UHostIPSet** 模型定义 + - **ImageId** (str) - 镜像Id。 + - **ImageName** (str) - 镜像名称。 + - **IsExpire** (str) - 是否过期。枚举值:Yes/No + - **Memory** (int) - 内存。单位:MB + - **Name** (str) - 实例名称。默认套餐Id + - **Remark** (str) - 备注。 + - **State** (str) - 实例状态。枚举值:\\ >初始化: Initializing; \\ >启动中: Starting; \\> 运行中: Running; \\> 关机中: Stopping; \\ >关机: Stopped \\ >安装失败: Install Fail; \\ >重启中: Rebooting; \\ > 未知(空字符串,获取状态超时或出错):"" + - **Tag** (str) - 业务组。 + - **ULHostId** (str) - 实例Id。 + - **Zone** (str) - 可用区。 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeULHostInstanceRequestSchema().dumps(d) + + resp = self.invoke("DescribeULHostInstance", d, **kwargs) + return apis.DescribeULHostInstanceResponseSchema().loads(resp) + + def describe_user_community_images( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUserCommunityImages - 获取社区镜像列表(登录状态) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Author** (str) - 搜索指定作者发布的镜像 + - **CompShareImageId** (str) - 镜像Id。支持指定镜像Id查询 + - **FuzzySearch** (str) - 模糊搜索,支持 镜像名称、作者名称 + - **IsFree** (bool) - 是否只筛选免费镜像 + - **IsOfficial** (bool) - 是否只筛选官方镜像 + - **Limit** (str) - 返回数据长度,默认为20,最大100 + - **Name** (str) - 镜像名称。模糊搜索 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **SortCondition** (dict) - 见 **DescribeUserCommunityImagesParamSortCondition** 模型定义 + - **Tag** (str) - 按标签名称搜索,精确匹配 + + **Response** + + - **AvailableTotalCount** (int) - 版本组可用数量 + - **ImageSetGroup** (list) - 见 **CompshareImageGroup** 模型定义 + - **TotalCount** (int) - 总数量 + + **Request Model** + + **DescribeUserCommunityImagesParamSortCondition** + - **ASC** (str) - 是否升序排列 + - **Field** (str) - 排序条件。- Favor:按热度排序,获取热点镜像;- PubTime:按发布时间排序,获取最新社区镜像;- Price 按价格排序;- CreatedCount 按使用量排序;- ImageUseTime 镜像使用时长排序- FavoritesCount 收藏数排序默认:"PubTime" + + + **Response Model** + + **Software** + - **Applications** (list) - 【array of string】应用列表 + - **CUDAVersion** (str) - CUDA版本 + - **Framework** (str) - 框架名称 + - **FrameworkVersion** (str) - 框架版本 + + + **Projects** + - **AccountId** (str) - 账号Id + - **AccountName** (str) - 账号昵称 + + + **CompShareImage** + - **AuthInfo** (int) - 镜像作者认证信息 + - **Author** (str) - 镜像作者昵称 + - **AutoStart** (bool) - 是否支持自启动 default:false + - **CompShareImageId** (str) - 镜像Id + - **Container** (str) - 是否为容器镜像。- True 容器镜像- False 虚机镜像 + - **Cover** (str) - 镜像封面URL + - **CreateTime** (int) - 创建时间戳 + - **CreatedCount** (int) - 镜像引用创建计数 + - **Description** (str) - 镜像描述信息 + - **FailedReason** (str) - 镜像制作失败错误原因 + - **FavoritesCount** (int) - 镜像收藏计数 + - **GroupId** (str) - 镜像组id + - **ImageCharge** (bool) - 是否镜像收费 default: false + - **ImageOwnerAlias** (str) - 镜像来源。- Official 平台镜像;- Community 社区镜像 + - **ImageType** (str) - 镜像类型。- System 平台提供的公共镜像;- App 平台提供的应用镜像;- Custom 自制镜像;- Community 社区镜像 + - **ImageUseTime** (int) - 镜像使用时长 + - **IsOfficial** (bool) - 来源是否为官方镜像【仅自制镜像信息返回该字段】 + - **Name** (str) - 镜像名称 + - **Owner** (dict) - 见 **Projects** 模型定义 + - **Price** (float) - 镜像价格。单位:元 + - **PubTime** (int) - 发布时间戳 + - **Readme** (str) - 镜像详细描述。仅指定镜像Id查询时返回 + - **Size** (int) - 镜像大小。单位MB + - **Softwares** (dict) - 见 **Software** 模型定义 + - **SourceGpuType** (str) - 自制镜像来源机型 + - **Status** (str) - 镜像状态。- Making 制作中;- Available 可用;- UnAvailable 不可用;- Reviewing 审核中;- Offline 已下线 + - **Tags** (list) - 【array of string】镜像标签 + - **VersionDesc** (str) - 版本描述 + - **VersionName** (str) - 版本名称 + - **Visibility** (int) - 可见性。0:私密镜像;1:公开至镜像社区 + + + **CompshareImageGroup** + - **CreatedCount** (int) - 引用创建次数 + - **Data** (list) - 见 **CompShareImage** 模型定义 + - **FavoritesCount** (int) - 收藏数 + - **GroupId** (str) - 版本组ID + - **ImageDesc** (str) - 镜像描述 + - **ImageName** (str) - 镜像名称 + - **ImageUseTime** (int) - 镜像使用时长 , 单位:小时 + - **IsFavorite** (bool) - 是否被收藏 + - **RecommendCount** (int) - 推荐数 + - **Status** (str) - 镜像组状态 Available 可用;UnAvailable 不可用 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUserCommunityImagesRequestSchema().dumps(d) + + resp = self.invoke("DescribeUserCommunityImages", d, **kwargs) + return apis.DescribeUserCommunityImagesResponseSchema().loads(resp) + + def detach_compshare_disk( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DetachCompshareDisk - 卸载某个已经挂载在指定UHost实例上的UDisk + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UDiskId** (str) - (Required) 需要卸载的UDisk实例ID + - **UHostId** (str) - UHost实例ID。【UHostId和HostId必须选填一个,本字段即将废弃,建议使用HostId】 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DetachCompshareDiskRequestSchema().dumps(d) + + resp = self.invoke("DetachCompshareDisk", d, **kwargs) + return apis.DetachCompshareDiskResponseSchema().loads(resp) + + def download_team_order( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DownloadTeamOrder - 下载团队订单 + + **Request** + + - **TeamId** (int) - (Required) 团队ID + - **BeginTime** (int) - 起始时间,需使用时间戳 + - **EndTime** (int) - 结束时间,需使用时间戳,结束时间需大于起始时间 + - **OrderStates** (list) - 订单状态 + - **VirtualCompanyId** (int) - 团队虚拟账号ID + + **Response** + + - **Amount** (str) - 总金额 + - **AmountCoupon** (str) - 代金券 + - **AmountFree** (str) - 赠金 + - **AmountReal** (str) - 现金 + - **ChargeType** (str) - 计费方式 + - **CreateTime** (int) - 创建时间 + - **EndTime** (int) - 结束时间 + - **OrderNo** (str) - 订单号 + - **OrderType** (str) - 订单类型 + - **RemarkName** (str) - 成员备注 + - **ResourceId** (str) - 资源ID + - **ResourceType** (str) - 产品类型 + - **StartTime** (int) - 开始时间 + - **VirtualCompanyId** (int) - 成员ID + + """ + # build request + d = {} + req and d.update(req) + d = apis.DownloadTeamOrderRequestSchema().dumps(d) + + resp = self.invoke("DownloadTeamOrder", d, **kwargs) + return apis.DownloadTeamOrderResponseSchema().loads(resp) + + def get_comp_share_attached_disk_upgrade_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetCompShareAttachedDiskUpgradePrice - 获取算力平台实例磁盘升级价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DiskId** (str) - (Required) 磁盘Id + - **DiskSpace** (str) - (Required) 目标大小。单位:GB + - **UHostId** (str) - (Required) 实例Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **ListPrice** (float) - 列表价 + - **ListPriceDetail** (dict) - 见 **DiskUpgradePriceDetail** 模型定义 + - **OriginalPrice** (float) - 原价 + - **OriginalPriceDetail** (dict) - 见 **DiskUpgradePriceDetail** 模型定义 + - **Price** (float) - 升级价格 + - **PriceDetail** (dict) - 见 **DiskUpgradePriceDetail** 模型定义 + + **Response Model** + + **DiskUpgradePriceDetail** + - **Snapshot** (float) - 快照价格 + - **UDisk** (float) - 磁盘价格 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetCompShareAttachedDiskUpgradePriceRequestSchema().dumps(d) + + resp = self.invoke("GetCompShareAttachedDiskUpgradePrice", d, **kwargs) + return apis.GetCompShareAttachedDiskUpgradePriceResponseSchema().loads( + resp + ) + + def get_comp_share_image_create_progress( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetCompShareImageCreateProgress - 获取算力平台镜像制作进度 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **CompShareImageId** (str) - (Required) 镜像Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Process** (float) - 处理进度 0 ~ 100 + - **RemainingDuration** (str) - 预估剩余总时间 单位秒 + - **TotalDuration** (str) - 预估处理总时间 单位秒 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetCompShareImageCreateProgressRequestSchema().dumps(d) + + resp = self.invoke("GetCompShareImageCreateProgress", d, **kwargs) + return apis.GetCompShareImageCreateProgressResponseSchema().loads(resp) + + def get_comp_share_instance_monitor( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetCompShareInstanceMonitor - 获取实例监控指标 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UHostIds** (list) - 【数组】UHost主机的资源ID,例如UHostIds.0代表希望获取信息 的主机1,UHostIds.1代表主机2。 如果不传入,则返回当前Region 所有符合条件的UHost实例。 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetCompShareInstanceMonitorRequestSchema().dumps(d) + + resp = self.invoke("GetCompShareInstanceMonitor", d, **kwargs) + return apis.GetCompShareInstanceMonitorResponseSchema().loads(resp) + + def get_comp_share_instance_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetCompShareInstancePrice - 获取算力平台实例价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ChargeType** (str) - 计费模式。枚举值为: \\ > Year,按年付费; \\ > Month,按月付费;\\ > Dynamic,按小时付费;\\ Day,按天付费\\ 如果不传某个枚举值,默认返回月付价格 + - **CompShareImageId** (str) - 镜像Id + - **Cpu** (str) - CPU核数。可选范围参照控制台。默认值: 16 + - **Disks** (list) - 见 **GetCompShareInstancePriceParamDisks** 模型定义 + - **Gpu** (str) - GPU卡核心数。默认值:1 + - **GpuType** (str) - GpuType。枚举值:["4090"] + - **Memory** (str) - 内存大小。单位:MB。取值为1024的倍数(可选范围参照好控制台)。默认值:32768 + + **Response** + + - **ListPriceDetail** (list) - 见 **CompSharePriceDetail** 模型定义 + - **OriginalPriceDetail** (list) - 见 **CompSharePriceDetail** 模型定义 + - **PriceDetail** (list) - 见 **CompSharePriceDetail** 模型定义 + + **Request Model** + + **GetCompShareInstancePriceParamDisks** + - **IsBoot** (bool) - 是否是系统盘。枚举值:\\ > True,是系统盘 \\ > False,是数据盘(默认)。Disks数组中有且只能有一块盘是系统盘。 + - **Size** (int) - 磁盘大小,单位GB。请参考 `磁盘类型 `_ 。 + - **Type** (str) - 磁盘类型。请参考 `磁盘类型 `_ 。 + + + **Response Model** + + **CompSharePriceDetail** + - **ChargeType** (str) - 计费类型 + - **CompShareImage** (float) - 镜像价格/Gpu/小时 + - **Disks** (float) - 磁盘价格 + - **Instance** (float) - 实例价格 + - **InstanceDiscountType** (int) - 主机折扣类型 1:夜间折扣 2:节日折扣 + - **ListPrice** (str) - 列表价 + - **OriginalPrice** (float) - 原价 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetCompShareInstancePriceRequestSchema().dumps(d) + + resp = self.invoke("GetCompShareInstancePrice", d, **kwargs) + return apis.GetCompShareInstancePriceResponseSchema().loads(resp) + + def get_comp_share_instance_upgrade_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetCompShareInstanceUpgradePrice - 获取算力平台实例升降级价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UHostId** (str) - (Required) UHost Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **CompShareImageId** (str) - 镜像Id + - **Cpu** (int) - 目标Cpu核心数。默认原配置 + - **Gpu** (int) - 目标Gpu卡数。默认原配置 + - **Memory** (int) - 目标内存大小。单位:MB。默认原配置 + + **Response** + + - **ListPrice** (float) - 列表价 + - **OriginalPrice** (float) - 原价 + - **Price** (float) - 价格 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetCompShareInstanceUpgradePriceRequestSchema().dumps(d) + + resp = self.invoke("GetCompShareInstanceUpgradePrice", d, **kwargs) + return apis.GetCompShareInstanceUpgradePriceResponseSchema().loads(resp) + + def get_comp_share_instance_user_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetCompShareInstanceUserPrice - 获取算力平台实例用户价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ChargeType** (str) - 计费模式。枚举值为: \\ > Year,按年付费; \\ > Month,按月付费;\\ > Dynamic,按小时付费;\\ Day,按天付费\\ 如果不传某个枚举值,默认返回月付价格 + - **CompShareImageId** (str) - 镜像Id + - **Cpu** (str) - CPU核数。可选范围参照控制台。默认值: 16 + - **Disks** (list) - 见 **GetCompShareInstanceUserPriceParamDisks** 模型定义 + - **Gpu** (str) - GPU卡核心数。默认值:1 + - **GpuType** (str) - GpuType。枚举值:["4090"] + - **Memory** (str) - 内存大小。单位:MB。取值为1024的倍数(可选范围参照好控制台)。默认值:32768 + + **Response** + + - **ListPriceDetail** (list) - 见 **CompSharePriceDetail** 模型定义 + - **OriginalPriceDetail** (list) - 见 **CompSharePriceDetail** 模型定义 + - **PriceDetail** (list) - 见 **CompSharePriceDetail** 模型定义 + + **Request Model** + + **GetCompShareInstanceUserPriceParamDisks** + - **IsBoot** (bool) - 是否是系统盘。枚举值:\\ > True,是系统盘 \\ > False,是数据盘(默认)。Disks数组中有且只能有一块盘是系统盘。 + - **Size** (int) - 磁盘大小,单位GB。请参考 `磁盘类型 `_ 。 + - **Type** (str) - 磁盘类型。请参考 `磁盘类型 `_ 。 + + + **Response Model** + + **CompSharePriceDetail** + - **ChargeType** (str) - 计费类型 + - **CompShareImage** (float) - 镜像价格/Gpu/小时 + - **Disks** (float) - 磁盘价格 + - **Instance** (float) - 实例价格 + - **InstanceDiscountType** (int) - 主机折扣类型 1:夜间折扣 2:节日折扣 + - **ListPrice** (str) - 列表价 + - **OriginalPrice** (float) - 原价 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetCompShareInstanceUserPriceRequestSchema().dumps(d) + + resp = self.invoke("GetCompShareInstanceUserPrice", d, **kwargs) + return apis.GetCompShareInstanceUserPriceResponseSchema().loads(resp) + + def get_comp_share_refund_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetCompShareRefundPrice - 获取算力平台实例删除扣除费用。包括主机、磁盘等资源的费用 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UHostIds** (list) - (Required) 【数组】UHost实例ID。参见 `DescribeUHostInstance `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **RefundPriceSet** (list) - 见 **UHostRefundPriceSet** 模型定义 + + **Response Model** + + **UHostRefundPriceSet** + - **Code** (int) - 实例操作结果的错误码。0为成功 + - **ErrMessage** (str) - 当 Code 非 0 时提供详细的描述信息 + - **RefundPrice** (float) - 实例的删除退费金额 + - **UHostId** (str) - UHost实例ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetCompShareRefundPriceRequestSchema().dumps(d) + + resp = self.invoke("GetCompShareRefundPrice", d, **kwargs) + return apis.GetCompShareRefundPriceResponseSchema().loads(resp) + + def get_comp_share_team_info( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetCompShareTeamInfo - 获取团队详细信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **TeamId** (int) - (Required) 团队Id + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 错误信息 + - **Team** (dict) - 见 **CompShareTeamDetailInfo** 模型定义 + - **TeamRelation** (list) - 见 **TeamRelation** 模型定义 + + **Response Model** + + **CompShareTeamDetailInfo** + - **CompanyId** (int) - 管理者公司Id + - **Deleted** (int) - 删除状态 0: 未删除 1: 已删除 + - **Description** (str) - 团队简介 + - **Id** (int) - 团队Id + - **Name** (str) - 团队名称 + + + **TeamRelation** + - **AllocateAmount** (int) - 已分配金额 + - **AvailableAmount** (int) - 余额 + - **CreateTime** (int) - 邀请时间 + - **RemarkName** (str) - 备注名称 + - **Status** (str) - 邀请状态:Pending(待同意)、Joined(已加入)、Rejected(拒绝)、Canceled(取消) + - **TeamId** (int) - 团队ID + - **TeamName** (str) - 团队名称 + - **UserCompanyId** (int) - 成员公司Id + - **VirtualCompanyId** (int) - 虚拟账号公司Id + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetCompShareTeamInfoRequestSchema().dumps(d) + + resp = self.invoke("GetCompShareTeamInfo", d, **kwargs) + return apis.GetCompShareTeamInfoResponseSchema().loads(resp) + + def get_open_claw_model_list( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetOpenClawModelList - 获取OpenClaw模型列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + + **Response** + + - **Models** (dict) - 见 **OpenClawModelInfo** 模型定义 + + **Response Model** + + **OpenClawModelInfo** + - **Id** (str) - 模型Id + - **Name** (str) - 模型名称 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetOpenClawModelListRequestSchema().dumps(d) + + resp = self.invoke("GetOpenClawModelList", d, **kwargs) + return apis.GetOpenClawModelListResponseSchema().loads(resp) + + def get_software_url( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetSoftwareURL - 获取算力平台实例应用URL + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Software** (str) - (Required) 应用名称 + - **UHostId** (str) - (Required) 实例Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **URL** (str) - 应用的URL + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetSoftwareURLRequestSchema().dumps(d) + + resp = self.invoke("GetSoftwareURL", d, **kwargs) + return apis.GetSoftwareURLResponseSchema().loads(resp) + + def get_ul_host_instance_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetULHostInstancePrice - 获取轻量应用云主机套餐价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BundleId** (str) - (Required) 套餐ID + - **ChargeType** (str) - 获取指定计费模式的价格。枚举值:\\ > Year,按年付费; \\ > Month。未指定时,返回所有计费模式价格 + - **Count** (int) - 购买台数,范围[1,5]。默认:1 + - **Quantity** (int) - 购买时长。默认: 1。不支持购买到月末 + + **Response** + + - **Message** (str) - 错误信息 + - **PriceSet** (list) - 见 **ULHostPriceSet** 模型定义 + + **Response Model** + + **ULHostPriceSet** + - **ChargeType** (str) - 计费模式 + - **OriginalPrice** (float) - 原价 + - **Price** (float) - 价格 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetULHostInstancePriceRequestSchema().dumps(d) + + resp = self.invoke("GetULHostInstancePrice", d, **kwargs) + return apis.GetULHostInstancePriceResponseSchema().loads(resp) + + def get_ul_host_renew_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetULHostRenewPrice - 获取主机续费价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ULHostId** (str) - (Required) ULHost实例ID + - **ChargeType** (str) - 计费类型。支持:Year/Month;默认:Month + + **Response** + + - **PriceSet** (list) - 见 **ULHostPriceSet** 模型定义 + + **Response Model** + + **ULHostPriceSet** + - **ChargeType** (str) - 计费模式 + - **OriginalPrice** (float) - 原价 + - **Price** (float) - 价格 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetULHostRenewPriceRequestSchema().dumps(d) + + resp = self.invoke("GetULHostRenewPrice", d, **kwargs) + return apis.GetULHostRenewPriceResponseSchema().loads(resp) + + def list_comp_share_team( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListCompShareTeam - 获取团队列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **Teams** (list) - 见 **CompShareTeamInfo** 模型定义 + + **Response Model** + + **CompShareTeamInfo** + - **CompanyId** (int) - 管理者公司Id + - **Description** (str) - 团队简介 + - **Id** (int) - 团队Id + - **MemberCount** (int) - 成员数量 + - **Name** (str) - 团队名称 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListCompShareTeamRequestSchema().dumps(d) + + resp = self.invoke("ListCompShareTeam", d, **kwargs) + return apis.ListCompShareTeamResponseSchema().loads(resp) + + def list_comp_share_team_invite( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListCompShareTeamInvite - 获取邀请成员的列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **TeamId** (int) - 团队ID + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **Invites** (list) - 见 **CompShareTeamInviteInfo** 模型定义 + - **Message** (str) - 错误信息 + + **Response Model** + + **CompShareTeamInviteInfo** + - **CreateTime** (int) - 邀请时间 + - **RemarkName** (str) - 备注名称 + - **Status** (str) - 邀请状态:Pending(待同意)、Joined(已加入)、Rejected(拒绝)、Canceled(取消) + - **TeamId** (int) - 团队ID + - **TeamName** (str) - 团队名称 + - **UserCompanyId** (int) - 成员公司Id + - **VirtualCompanyId** (int) - 虚拟账号公司Id + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListCompShareTeamInviteRequestSchema().dumps(d) + + resp = self.invoke("ListCompShareTeamInvite", d, **kwargs) + return apis.ListCompShareTeamInviteResponseSchema().loads(resp) + + def list_comp_share_team_joined( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListCompShareTeamJoined - 获取加入团队信息列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Status** (str) - 邀请状态:Pending(待同意)、Joined(已加入)、Rejected(拒绝)、Canceled(取消) + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **JoinedTeams** (list) - 见 **CompShareTeamJoinedInfo** 模型定义 + + **Response Model** + + **CompShareTeamJoinedInfo** + - **CreateTime** (int) - 邀请时间 + - **IsPersonalAccount** (bool) - 当前是否为个人账号 + - **RemarkName** (str) - 备注名称 + - **Status** (str) - 邀请状态:Pending(待同意)、Joined(已加入)、Rejected(拒绝)、Canceled(取消) + - **TeamId** (int) - 团队ID + - **TeamName** (str) - 团队名称 + - **UserCompanyId** (int) - 成员公司Id + - **VirtualCompanyId** (int) - 虚拟账号公司Id + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListCompShareTeamJoinedRequestSchema().dumps(d) + + resp = self.invoke("ListCompShareTeamJoined", d, **kwargs) + return apis.ListCompShareTeamJoinedResponseSchema().loads(resp) + + def list_comp_share_team_operate_log( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListCompShareTeamOperateLog - 获取团队操作日志列表 + + **Request** + + - **BeginTime** (int) - (Required) 起始时间,需使用时间戳 + - **EndTime** (int) - (Required) 结束时间,需使用时间戳,结束时间需大于起始时间 + - **TeamId** (int) - (Required) 团队ID + - **Limit** (int) - 返回数据长度,默认为25,最大100 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **OperateType** (list) - 操作类型,详细参考返回值 + - **OrderByASC** (bool) - 排序方式:true表示按创建时间升序,false表示降序(默认) + - **Status** (list) - 操作状态,详细参考返回值 + + **Response** + + - **Logs** (list) - 见 **CompShareTeamOperateLogInfo** 模型定义 + - **OperateTypeList** (list) - 操作类型枚举列表 + - **StatusList** (list) - 状态枚举列表 + - **Total** (int) - 总条目数 + + **Response Model** + + **CompShareTeamOperateLogInfo** + - **Content** (str) - 操作内容 + - **CreateTime** (int) - 操作日志的创建时间 + - **OperateType** (str) - 操作类型 + - **Status** (str) - 操作状态 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.ListCompShareTeamOperateLogRequestSchema().dumps(d) + + resp = self.invoke("ListCompShareTeamOperateLog", d, **kwargs) + return apis.ListCompShareTeamOperateLogResponseSchema().loads(resp) + + def list_member_product_type( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListMemberProductType - 获取成员订单产品类型 + + **Request** + + - **BeginTime** (int) - (Required) 起始时间,需使用时间戳 + - **EndTime** (int) - (Required) 结束时间,需使用时间戳,结束时间需大于起始时间 + - **TeamId** (int) - (Required) 团队ID + - **OrderStates** (list) - 订单状态 + - **VirtualCompanyId** (int) - 成员虚拟ID + + **Response** + + - **ProductTypeList** (list) - 产品类型列表 + + """ + # build request + d = {} + req and d.update(req) + d = apis.ListMemberProductTypeRequestSchema().dumps(d) + + resp = self.invoke("ListMemberProductType", d, **kwargs) + return apis.ListMemberProductTypeResponseSchema().loads(resp) + + def modify_comp_share_image_share_account( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyCompShareImageShareAccount - 管理镜像的共享账号列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **CompShareImageId** (str) - (Required) 镜像Id + - **AddAccounts** (list) - 添加被共享的账号Id,每次最多10个。与RemoveAccounts.N不能同时为空 + - **RemoveAccounts** (list) - 移除被共享的账号Id,每次最多10个。与AddAccounts.N不能同时为空 + + **Response** + + - **InvalidAccounts** (list) - 无效的账号Id列表 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyCompShareImageShareAccountRequestSchema().dumps(d) + + resp = self.invoke("ModifyCompShareImageShareAccount", d, **kwargs) + return apis.ModifyCompShareImageShareAccountResponseSchema().loads(resp) + + def modify_comp_share_instance_name( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyCompShareInstanceName - 修改算力平台实例名称 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Name** (str) - (Required) 名称 + - **UHostId** (str) - (Required) 实例Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **UHostId** (str) - 实例Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyCompShareInstanceNameRequestSchema().dumps(d) + + resp = self.invoke("ModifyCompShareInstanceName", d, **kwargs) + return apis.ModifyCompShareInstanceNameResponseSchema().loads(resp) + + def modify_ul_host_attribute( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyULHostAttribute - 修改指定ULHost实例属性信息,包含名称和备注 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ULHostId** (str) - (Required) ULHost实例Id + - **Name** (str) - 名称。和Remark至少选择一个进行修改 + - **Remark** (str) - 备注。和Name至少选择一个进行修改 + + **Response** + + - **Message** (str) - 错误信息 + - **ULHostId** (str) - ULHost实例Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyULHostAttributeRequestSchema().dumps(d) + + resp = self.invoke("ModifyULHostAttribute", d, **kwargs) + return apis.ModifyULHostAttributeResponseSchema().loads(resp) + + def poweroff_ul_host_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """PoweroffULHostInstance - 直接关闭UHost实例电源,无需等待实例正常关闭。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ULHostId** (str) - (Required) ULHost实例ID + + **Response** + + - **ULHostId** (str) - ULHost实例ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.PoweroffULHostInstanceRequestSchema().dumps(d) + + resp = self.invoke("PoweroffULHostInstance", d, **kwargs) + return apis.PoweroffULHostInstanceResponseSchema().loads(resp) + + def publish_comp_share_image( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """PublishCompShareImage - 将自制镜像发布到镜像社区 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **CompShareImageId** (str) - (Required) 镜像Id + - **Price** (float) - (Required) 镜像价格。单位:元,支持00.00 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **AutoStart** (str) - 是否支持自启动 false: 不支持 true:支持 + - **CommunityImageName** (str) - 发布社区镜像名称 + - **Cover** (str) - 封面。base64编码的图片 + - **Description** (str) - 镜像描述信息 + - **Readme** (str) - 镜像详情描述【富文本】 + - **Softwares** (dict) - 见 **PublishCompShareImageParamSoftwares** 模型定义 + - **Tags** (list) - 【array of string】镜像标签。最多支持3个标签 + + **Response** + + + **Request Model** + + **PublishCompShareImageParamSoftwares** + - **Applications** (list) - 镜像应用列表 + - **CUDAVersion** (str) - 镜像CUDA版本 + - **Framework** (str) - 镜像框架名称 + - **FrameworkVersion** (str) - 镜像框架版本 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.PublishCompShareImageRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("PublishCompShareImage", d, **kwargs) + return apis.PublishCompShareImageResponseSchema().loads(resp) + + def reboot_comp_share_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RebootCompShareInstance - 重启轻量算力平台实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UHostId** (str) - (Required) 实例Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **UHostId** (str) - 实例Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.RebootCompShareInstanceRequestSchema().dumps(d) + + resp = self.invoke("RebootCompShareInstance", d, **kwargs) + return apis.RebootCompShareInstanceResponseSchema().loads(resp) + + def reboot_ul_host_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RebootULHostInstance - 重新启动UHost实例。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ULHostId** (str) - (Required) ULHost实例ID + + **Response** + + - **ULHostId** (str) - ULHost实例ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.RebootULHostInstanceRequestSchema().dumps(d) + + resp = self.invoke("RebootULHostInstance", d, **kwargs) + return apis.RebootULHostInstanceResponseSchema().loads(resp) + + def reinstall_comp_share_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ReinstallCompShareInstance - 重装算力平台实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **CompShareImageId** (str) - (Required) 镜像Id + - **UHostId** (str) - (Required) 实例Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Password** (str) - 实例的新密码 + + **Response** + + - **UHostId** (str) - 实例Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ReinstallCompShareInstanceRequestSchema().dumps(d) + + resp = self.invoke("ReinstallCompShareInstance", d, **kwargs) + return apis.ReinstallCompShareInstanceResponseSchema().loads(resp) + + def reinstall_ul_host_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ReinstallULHostInstance - 重装轻量应用云主机 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ImageId** (str) - (Required) 镜像Id。暂不支持使用自定义镜像重装 + - **Password** (str) - (Required) 登陆密码。密码需使用base64进行编码,举例如下:# echo -n Password1 | base64 UGFzc3dvcmQx + - **ULHostId** (str) - (Required) 实例Id + + **Response** + + - **Message** (str) - 错误信息 + - **ULHostId** (str) - 实例Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ReinstallULHostInstanceRequestSchema().dumps(d) + + resp = self.invoke("ReinstallULHostInstance", d, **kwargs) + return apis.ReinstallULHostInstanceResponseSchema().loads(resp) + + def reset_comp_share_instance_password( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ResetCompShareInstancePassword - 重置算力平台实例密码 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Password** (str) - (Required) 新密码。需经Base64编码 + - **UHostId** (str) - (Required) 实例Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **UHostId** (str) - 实例Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ResetCompShareInstancePasswordRequestSchema().dumps(d) + + resp = self.invoke("ResetCompShareInstancePassword", d, **kwargs) + return apis.ResetCompShareInstancePasswordResponseSchema().loads(resp) + + def reset_ul_host_instance_password( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ResetULHostInstancePassword - 重置轻量应用云主机管理员密码。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Password** (str) - (Required) ULHost新密码(密码格式使用BASE64编码) + - **ULHostId** (str) - (Required) ULHost实例ID + + **Response** + + - **ULHostId** (str) - ULHost实例ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ResetULHostInstancePasswordRequestSchema().dumps(d) + + resp = self.invoke("ResetULHostInstancePassword", d, **kwargs) + return apis.ResetULHostInstancePasswordResponseSchema().loads(resp) + + def resize_comp_share_disk( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ResizeCompShareDisk - 修改磁盘 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Size** (int) - (Required) 大小 + - **UDiskId** (str) - (Required) 磁盘id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **UDiskId** (str) - 磁盘id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ResizeCompShareDiskRequestSchema().dumps(d) + + resp = self.invoke("ResizeCompShareDisk", d, **kwargs) + return apis.ResizeCompShareDiskResponseSchema().loads(resp) + + def resize_comp_share_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ResizeCompShareInstance - 修改算力平台实例配置 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UHostId** (str) - (Required) 实例Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Cpu** (int) - 目标Cpu核心数 + - **DiskId** (str) - 磁盘Id + - **DiskSpace** (str) - 目标磁盘大小 + - **Gpu** (int) - 目标Gpu卡数 + - **Memory** (int) - 目标内存大小 + + **Response** + + - **UHostId** (str) - 实例Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ResizeCompShareInstanceRequestSchema().dumps(d) + + resp = self.invoke("ResizeCompShareInstance", d, **kwargs) + return apis.ResizeCompShareInstanceResponseSchema().loads(resp) + + def set_comp_share_team_relation( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """SetCompShareTeamRelation - 设置邀请信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Status** (str) - (Required) 发送邀请操作:Agree(同意)、Reject(拒绝)、Cancel(取消)、UpdateRemarkName(更改备注) + - **TeamId** (str) - (Required) 团队Id + - **RemarkName** (str) - 备注名称 + - **UserCompanyId** (str) - 取消邀请的成员公司Id + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.SetCompShareTeamRelationRequestSchema().dumps(d) + + resp = self.invoke("SetCompShareTeamRelation", d, **kwargs) + return apis.SetCompShareTeamRelationResponseSchema().loads(resp) + + def start_comp_share_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """StartCompShareInstance - 启动算力平台实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UHostId** (str) - (Required) 实例Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **UHostId** (str) - 实例Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.StartCompShareInstanceRequestSchema().dumps(d) + + resp = self.invoke("StartCompShareInstance", d, **kwargs) + return apis.StartCompShareInstanceResponseSchema().loads(resp) + + def start_ul_host_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """StartULHostInstance - 启动处于关闭状态的UHost实例。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ULHostId** (str) - (Required) ULHost实例ID + + **Response** + + - **ULHostId** (str) - ULHost实例ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.StartULHostInstanceRequestSchema().dumps(d) + + resp = self.invoke("StartULHostInstance", d, **kwargs) + return apis.StartULHostInstanceResponseSchema().loads(resp) + + def stop_comp_share_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """StopCompShareInstance - 关闭算力平台实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UHostId** (str) - (Required) 实例Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **UHostId** (str) - 实例Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.StopCompShareInstanceRequestSchema().dumps(d) + + resp = self.invoke("StopCompShareInstance", d, **kwargs) + return apis.StopCompShareInstanceResponseSchema().loads(resp) + + def stop_ul_host_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """StopULHostInstance - 指停止处于运行状态的ULHost实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ULHostId** (str) - (Required) ULHost实例ID。 + + **Response** + + - **ULHostId** (str) - ULHost实例ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.StopULHostInstanceRequestSchema().dumps(d) + + resp = self.invoke("StopULHostInstance", d, **kwargs) + return apis.StopULHostInstanceResponseSchema().loads(resp) + + def terminate_comp_share_custom_image( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """TerminateCompShareCustomImage - 删除算力平台自制镜像 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **CompShareImageId** (str) - (Required) 镜像Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.TerminateCompShareCustomImageRequestSchema().dumps(d) + + resp = self.invoke("TerminateCompShareCustomImage", d, **kwargs) + return apis.TerminateCompShareCustomImageResponseSchema().loads(resp) + + def terminate_comp_share_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """TerminateCompShareInstance - 删除轻量算力共享平台虚机实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UHostId** (str) - (Required) 虚机资源id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **UHostId** (str) - 虚机资源id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.TerminateCompShareInstanceRequestSchema().dumps(d) + + resp = self.invoke("TerminateCompShareInstance", d, **kwargs) + return apis.TerminateCompShareInstanceResponseSchema().loads(resp) + + def terminate_ul_host_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """TerminateULHostInstance - 删除指定数据中心的ULHost实例。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ULHostId** (str) - (Required) ULHost资源Id + - **ReleaseUDisk** (bool) - 删除主机时是否同时删除挂载的数据盘。默认为false。 + + **Response** + + - **InRecycle** (str) - 用于判断主机删除时是否进入回收站。放入回收站:"Yes", 彻底删除:“No”。 + - **ULHostId** (str) - ULHost 实例 Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.TerminateULHostInstanceRequestSchema().dumps(d) + + resp = self.invoke("TerminateULHostInstance", d, **kwargs) + return apis.TerminateULHostInstanceResponseSchema().loads(resp) + + def update_comp_share_image( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateCompShareImage - 编辑算力平台自制镜像信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **CompShareImageId** (str) - (Required) 镜像Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Cover** (str) - 镜像封面图。Base64编码后的字符串 + - **Description** (str) - 镜像描述信息 + - **Framework** (str) - 镜像框架信息 + - **Readme** (str) - 镜像详情描述信息,支持富文本 + - **Softwares** (str) - 镜像软件信息 + - **Tags** (list) - 镜像标签列表,最多支持3个标签 + - **Visibility** (int) - 可见性 0:私密;1:公开 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateCompShareImageRequestSchema().dumps(d) + + resp = self.invoke("UpdateCompShareImage", d, **kwargs) + return apis.UpdateCompShareImageResponseSchema().loads(resp) + + def update_comp_share_stop_scheduler( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateCompShareStopScheduler - 更新实例定时关机时间,若不存在则新建此定时任务 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **StopTime** (int) - (Required) 定时关机时间 + - **UHostId** (str) - (Required) UHost实例ID。【UHostId和HostId必须选填一个,本字段即将废弃,建议使用HostId】 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateCompShareStopSchedulerRequestSchema().dumps(d) + + resp = self.invoke("UpdateCompShareStopScheduler", d, **kwargs) + return apis.UpdateCompShareStopSchedulerResponseSchema().loads(resp) + + def update_comp_share_team( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateCompShareTeam - 更改团队信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Description** (str) - 团队简介 + - **Name** (str) - 团队名称 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateCompShareTeamRequestSchema().dumps(d) + + resp = self.invoke("UpdateCompShareTeam", d, **kwargs) + return apis.UpdateCompShareTeamResponseSchema().loads(resp) diff --git a/ucloud/services/ucompshare/schemas/__init__.py b/ucloud/services/ucompshare/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/ucompshare/schemas/apis.py b/ucloud/services/ucompshare/schemas/apis.py new file mode 100644 index 00000000..8703af5c --- /dev/null +++ b/ucloud/services/ucompshare/schemas/apis.py @@ -0,0 +1,2542 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.ucompshare.schemas import models + +""" UCompShare API Schema +""" + + +""" +API: AttachCompshareDisk + +将一个可用的UDisk挂载到某台主机上 +""" + + +class AttachCompshareDiskRequestSchema(schema.RequestSchema): + """AttachCompshareDisk - 将一个可用的UDisk挂载到某台主机上""" + + fields = { + "EnableCrossPodAttach": fields.Str( + required=False, dump_to="EnableCrossPodAttach" + ), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UDiskId": fields.Str(required=True, dump_to="UDiskId"), + "UHostId": fields.Str(required=False, dump_to="UHostId"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class AttachCompshareDiskResponseSchema(schema.ResponseSchema): + """AttachCompshareDisk - 将一个可用的UDisk挂载到某台主机上""" + + fields = {} + + +""" +API: AttachUS3 + +挂载us3 +""" + + +class AttachUS3RequestSchema(schema.RequestSchema): + """AttachUS3 - 挂载us3""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UHostId": fields.Str(required=True, dump_to="UHostId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class AttachUS3ResponseSchema(schema.ResponseSchema): + """AttachUS3 - 挂载us3""" + + fields = {} + + +""" +API: CheckCompShareNetOptimizer + +检查算力平台账号是否开通访问加速 +""" + + +class CheckCompShareNetOptimizerRequestSchema(schema.RequestSchema): + """CheckCompShareNetOptimizer - 检查算力平台账号是否开通访问加速""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CheckCompShareNetOptimizerResponseSchema(schema.ResponseSchema): + """CheckCompShareNetOptimizer - 检查算力平台账号是否开通访问加速""" + + fields = { + "Optimized": fields.Bool(required=True, load_from="Optimized"), + } + + +""" +API: CheckULHostResourceCapacity + +检查轻量应用云主机资源余量 +""" + + +class CheckULHostResourceCapacityRequestSchema(schema.RequestSchema): + """CheckULHostResourceCapacity - 检查轻量应用云主机资源余量""" + + fields = { + "BundleId": fields.Str(required=True, dump_to="BundleId"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "ImageId": fields.Str(required=True, dump_to="ImageId"), + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "SecurityGroupId": fields.Str( + required=False, dump_to="SecurityGroupId" + ), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + } + + +class CheckULHostResourceCapacityResponseSchema(schema.ResponseSchema): + """CheckULHostResourceCapacity - 检查轻量应用云主机资源余量""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "ResourceEnough": fields.Bool( + required=True, load_from="ResourceEnough" + ), + } + + +""" +API: CopyCompShareCustomImage + +复制算力平台镜像 +""" + + +class CopyCompShareCustomImageRequestSchema(schema.RequestSchema): + """CopyCompShareCustomImage - 复制算力平台镜像""" + + fields = { + "CompShareImageId": fields.Str( + required=True, dump_to="CompShareImageId" + ), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "TargetImageName": fields.Str( + required=False, dump_to="TargetImageName" + ), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class CopyCompShareCustomImageResponseSchema(schema.ResponseSchema): + """CopyCompShareCustomImage - 复制算力平台镜像""" + + fields = { + "NewCompShareImageId": fields.Str( + required=True, load_from="NewCompShareImageId" + ), + } + + +""" +API: CreateCompShareCustomImage + +制作算力平台实例自制镜像 +""" + + +class CreateCompShareCustomImageParamSoftwaresSchema(schema.RequestSchema): + """CreateCompShareCustomImageParamSoftwares -""" + + fields = { + "Application": fields.List(fields.Str()), + "CUDAVersion": fields.Str(required=False, dump_to="CUDAVersion"), + "Framework": fields.Str(required=False, dump_to="Framework"), + "FrameworkVersion": fields.Str( + required=False, dump_to="FrameworkVersion" + ), + } + + +class CreateCompShareCustomImageRequestSchema(schema.RequestSchema): + """CreateCompShareCustomImage - 制作算力平台实例自制镜像""" + + fields = { + "Description": fields.Str(required=False, dump_to="Description"), + "Name": fields.Str(required=True, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Softwares": CreateCompShareCustomImageParamSoftwaresSchema( + required=False, dump_to="Softwares" + ), + "UHostId": fields.Str(required=True, dump_to="UHostId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateCompShareCustomImageResponseSchema(schema.ResponseSchema): + """CreateCompShareCustomImage - 制作算力平台实例自制镜像""" + + fields = { + "CompShareImageId": fields.Str( + required=True, load_from="CompShareImageId" + ), + } + + +""" +API: CreateCompShareInstance + +创建轻量级算力平台主机资源 +""" + + +class CreateCompShareInstanceParamDisksSchema(schema.RequestSchema): + """CreateCompShareInstanceParamDisks -""" + + fields = { + "IsBoot": fields.Bool(required=True, dump_to="IsBoot"), + "Size": fields.Int(required=True, dump_to="Size"), + "Type": fields.Str(required=True, dump_to="Type"), + } + + +class CreateCompShareInstanceRequestSchema(schema.RequestSchema): + """CreateCompShareInstance - 创建轻量级算力平台主机资源""" + + fields = { + "CPU": fields.Int(required=True, dump_to="CPU"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CompShareImageId": fields.Str( + required=True, dump_to="CompShareImageId" + ), + "Disks": fields.List(CreateCompShareInstanceParamDisksSchema()), + "EnableUS3": fields.Bool(required=False, dump_to="EnableUS3"), + "GPU": fields.Int(required=True, dump_to="GPU"), + "GpuType": fields.Str(required=True, dump_to="GpuType"), + "LoginMode": fields.Str(required=False, dump_to="LoginMode"), + "MachineType": fields.Str(required=True, dump_to="MachineType"), + "Memory": fields.Int(required=True, dump_to="Memory"), + "MinimalCpuPlatform": fields.Str( + required=False, dump_to="MinimalCpuPlatform" + ), + "Name": fields.Str(required=False, dump_to="Name"), + "Password": fields.Str(required=False, dump_to="Password"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "SecurityGroupId": fields.Str( + required=False, dump_to="SecurityGroupId" + ), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateCompShareInstanceResponseSchema(schema.ResponseSchema): + """CreateCompShareInstance - 创建轻量级算力平台主机资源""" + + fields = { + "UHostIds": fields.List( + fields.Str(), required=True, load_from="UHostIds" + ), + } + + +""" +API: CreateCompShareTeam + +创建团队 +""" + + +class CreateCompShareTeamRequestSchema(schema.RequestSchema): + """CreateCompShareTeam - 创建团队""" + + fields = { + "Description": fields.Str(required=False, dump_to="Description"), + "Name": fields.Str(required=True, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class CreateCompShareTeamResponseSchema(schema.ResponseSchema): + """CreateCompShareTeam - 创建团队""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: CreateCompShareTeamRelation + +发送团队邀请 +""" + + +class CreateCompShareTeamRelationParamUserInfoSchema(schema.RequestSchema): + """CreateCompShareTeamRelationParamUserInfo -""" + + fields = { + "RemarkName": fields.Str(required=False, dump_to="RemarkName"), + "UserCompanyId": fields.Int(required=True, dump_to="UserCompanyId"), + } + + +class CreateCompShareTeamRelationRequestSchema(schema.RequestSchema): + """CreateCompShareTeamRelation - 发送团队邀请""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "TeamId": fields.Int(required=True, dump_to="TeamId"), + "UserInfo": fields.List( + CreateCompShareTeamRelationParamUserInfoSchema() + ), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class CreateCompShareTeamRelationResponseSchema(schema.ResponseSchema): + """CreateCompShareTeamRelation - 发送团队邀请""" + + fields = { + "ErrorMap": fields.Str(), + } + + +""" +API: CreateULHostInstance + +创建轻量应用云主机 +""" + + +class CreateULHostInstanceRequestSchema(schema.RequestSchema): + """CreateULHostInstance - 创建轻量应用云主机""" + + fields = { + "BundleId": fields.Str(required=True, dump_to="BundleId"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "ImageId": fields.Str(required=True, dump_to="ImageId"), + "Name": fields.Str(required=False, dump_to="Name"), + "Password": fields.Str(required=True, dump_to="Password"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "SecurityGroupId": fields.Str( + required=False, dump_to="SecurityGroupId" + ), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + } + + +class CreateULHostInstanceResponseSchema(schema.ResponseSchema): + """CreateULHostInstance - 创建轻量应用云主机""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "ULHostId": fields.Str(required=True, load_from="ULHostId"), + } + + +""" +API: DeleteCompShareStopScheduler + +删除实例定时关机任务 +""" + + +class DeleteCompShareStopSchedulerRequestSchema(schema.RequestSchema): + """DeleteCompShareStopScheduler - 删除实例定时关机任务""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UHostId": fields.Str(required=True, dump_to="UHostId"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DeleteCompShareStopSchedulerResponseSchema(schema.ResponseSchema): + """DeleteCompShareStopScheduler - 删除实例定时关机任务""" + + fields = {} + + +""" +API: DeleteCompShareTeam + +删除团队 +""" + + +class DeleteCompShareTeamRequestSchema(schema.RequestSchema): + """DeleteCompShareTeam - 删除团队""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "TeamId": fields.Int(required=True, dump_to="TeamId"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DeleteCompShareTeamResponseSchema(schema.ResponseSchema): + """DeleteCompShareTeam - 删除团队""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DeleteCompshareDisk + +卸载并删除算力磁盘 +""" + + +class DeleteCompshareDiskRequestSchema(schema.RequestSchema): + """DeleteCompshareDisk - 卸载并删除算力磁盘""" + + fields = { + "OrganizationID": fields.Int(required=True, dump_to="OrganizationID"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "TopOrganizationID": fields.Int( + required=True, dump_to="TopOrganizationID" + ), + "UDiskId": fields.Str(required=True, dump_to="UDiskId"), + "UHostId": fields.Str(required=False, dump_to="UHostId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DeleteCompshareDiskResponseSchema(schema.ResponseSchema): + """DeleteCompshareDisk - 卸载并删除算力磁盘""" + + fields = { + "UDiskId": fields.Str(required=True, load_from="UDiskId"), + } + + +""" +API: DescribeAvailableCompShareInstanceTypes + +获取某个地域下可售/售罄的所有机型信息 +""" + + +class DescribeAvailableCompShareInstanceTypesRequestSchema( + schema.RequestSchema +): + """DescribeAvailableCompShareInstanceTypes - 获取某个地域下可售/售罄的所有机型信息""" + + fields = { + "MachineTypes": fields.List(fields.Str()), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DescribeAvailableCompShareInstanceTypesResponseSchema( + schema.ResponseSchema +): + """DescribeAvailableCompShareInstanceTypes - 获取某个地域下可售/售罄的所有机型信息""" + + fields = { + "AvailableInstanceTypes": fields.List( + models.AvailableInstanceTypesSchema(), + required=True, + load_from="AvailableInstanceTypes", + ), + "Status": fields.Str(required=False, load_from="Status"), + } + + +""" +API: DescribeCommunityImages + +获取社区镜像列表 +""" + + +class DescribeCommunityImagesParamSortConditionSchema(schema.RequestSchema): + """DescribeCommunityImagesParamSortCondition -""" + + fields = { + "ASC": fields.Str(required=False, dump_to="ASC"), + "Field": fields.Str(required=False, dump_to="Field"), + } + + +class DescribeCommunityImagesRequestSchema(schema.RequestSchema): + """DescribeCommunityImages - 获取社区镜像列表""" + + fields = { + "Author": fields.Str(required=False, dump_to="Author"), + "CompShareImageId": fields.Str( + required=False, dump_to="CompShareImageId" + ), + "Limit": fields.Str(required=False, dump_to="Limit"), + "Name": fields.Str(required=False, dump_to="Name"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SortCondition": DescribeCommunityImagesParamSortConditionSchema( + required=False, dump_to="SortCondition" + ), + "Tag": fields.Str(required=False, dump_to="Tag"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeCommunityImagesResponseSchema(schema.ResponseSchema): + """DescribeCommunityImages - 获取社区镜像列表""" + + fields = { + "ImageSet": fields.List( + models.CompShareImageSchema(), required=False, load_from="ImageSet" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeCompShareCustomImages + +获取自制镜像列表 +""" + + +class DescribeCompShareCustomImagesRequestSchema(schema.RequestSchema): + """DescribeCompShareCustomImages - 获取自制镜像列表""" + + fields = { + "CompShareImageId": fields.Str( + required=False, dump_to="CompShareImageId" + ), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeCompShareCustomImagesResponseSchema(schema.ResponseSchema): + """DescribeCompShareCustomImages - 获取自制镜像列表""" + + fields = { + "ImageSet": fields.List( + models.CompShareImageSchema(), required=True, load_from="ImageSet" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeCompShareGpuInventory + +查询GPU卡余量库存 +""" + + +class DescribeCompShareGpuInventoryRequestSchema(schema.RequestSchema): + """DescribeCompShareGpuInventory - 查询GPU卡余量库存""" + + fields = { + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DescribeCompShareGpuInventoryResponseSchema(schema.ResponseSchema): + """DescribeCompShareGpuInventory - 查询GPU卡余量库存""" + + fields = { + "GpuInventoryByZone": fields.Str(), + "SpotUnsupportedGpuTypes": fields.List( + fields.Str(), required=False, load_from="SpotUnsupportedGpuTypes" + ), + "UpdateTime": fields.Int(required=False, load_from="UpdateTime"), + } + + +""" +API: DescribeCompShareImageShareAccounts + +获取镜像共享的账号列表 +""" + + +class DescribeCompShareImageShareAccountsRequestSchema(schema.RequestSchema): + """DescribeCompShareImageShareAccounts - 获取镜像共享的账号列表""" + + fields = { + "CompShareImageId": fields.Str( + required=True, dump_to="CompShareImageId" + ), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DescribeCompShareImageShareAccountsResponseSchema(schema.ResponseSchema): + """DescribeCompShareImageShareAccounts - 获取镜像共享的账号列表""" + + fields = { + "AccountSet": fields.List( + models.ProjectsSchema(), required=True, load_from="AccountSet" + ), + } + + +""" +API: DescribeCompShareImageTags + +获取镜像标签列表 +""" + + +class DescribeCompShareImageTagsRequestSchema(schema.RequestSchema): + """DescribeCompShareImageTags - 获取镜像标签列表""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DescribeCompShareImageTagsResponseSchema(schema.ResponseSchema): + """DescribeCompShareImageTags - 获取镜像标签列表""" + + fields = { + "Tags": fields.List(fields.Str(), required=True, load_from="Tags"), + } + + +""" +API: DescribeCompShareImages + +可获取平台、应用镜像信息 +""" + + +class DescribeCompShareImagesRequestSchema(schema.RequestSchema): + """DescribeCompShareImages - 可获取平台、应用镜像信息""" + + fields = { + "Author": fields.Str(required=False, dump_to="Author"), + "CompShareImageId": fields.Str( + required=False, dump_to="CompShareImageId" + ), + "ImageType": fields.Str(required=False, dump_to="ImageType"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Name": fields.Str(required=False, dump_to="Name"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DescribeCompShareImagesResponseSchema(schema.ResponseSchema): + """DescribeCompShareImages - 可获取平台、应用镜像信息""" + + fields = { + "ImageSet": fields.List( + models.CompShareImageSchema(), required=True, load_from="ImageSet" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeCompShareInstance + +获取用户所有地域下主机资源信息列表 +""" + + +class DescribeCompShareInstanceRequestSchema(schema.RequestSchema): + """DescribeCompShareInstance - 获取用户所有地域下主机资源信息列表""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "UHostIds": fields.List(fields.Str()), + "WithoutGpu": fields.Bool(required=False, dump_to="WithoutGpu"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DescribeCompShareInstanceResponseSchema(schema.ResponseSchema): + """DescribeCompShareInstance - 获取用户所有地域下主机资源信息列表""" + + fields = { + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + "UHostSet": fields.List( + models.CompShareInstanceSetSchema(), + required=True, + load_from="UHostSet", + ), + } + + +""" +API: DescribeCompShareMachineTypeFamilies + +获取实例规格族列表(所有机型的信息) +""" + + +class DescribeCompShareMachineTypeFamiliesRequestSchema(schema.RequestSchema): + """DescribeCompShareMachineTypeFamilies - 获取实例规格族列表(所有机型的信息)""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class DescribeCompShareMachineTypeFamiliesResponseSchema(schema.ResponseSchema): + """DescribeCompShareMachineTypeFamilies - 获取实例规格族列表(所有机型的信息)""" + + fields = { + "MachineTypes": fields.List( + fields.Str(), required=True, load_from="MachineTypes" + ), + } + + +""" +API: DescribeCompShareSharingImages + +获取算力平台共享镜像列表 +""" + + +class DescribeCompShareSharingImagesRequestSchema(schema.RequestSchema): + """DescribeCompShareSharingImages - 获取算力平台共享镜像列表""" + + fields = { + "CompShareImageId": fields.Str( + required=False, dump_to="CompShareImageId" + ), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DescribeCompShareSharingImagesResponseSchema(schema.ResponseSchema): + """DescribeCompShareSharingImages - 获取算力平台共享镜像列表""" + + fields = { + "ImageSet": fields.List( + models.CompShareImageSchema(), required=True, load_from="ImageSet" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeCompShareSoftwarePort + +获取算力平台应用及端口号列表 +""" + + +class DescribeCompShareSoftwarePortRequestSchema(schema.RequestSchema): + """DescribeCompShareSoftwarePort - 获取算力平台应用及端口号列表""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DescribeCompShareSoftwarePortResponseSchema(schema.ResponseSchema): + """DescribeCompShareSoftwarePort - 获取算力平台应用及端口号列表""" + + fields = { + "SoftwarePort": fields.List( + models.SoftwarePortSchema(), required=True, load_from="SoftwarePort" + ), + } + + +""" +API: DescribeCompShareSupportZone + +获取支持的可用区信息列表 +""" + + +class DescribeCompShareSupportZoneRequestSchema(schema.RequestSchema): + """DescribeCompShareSupportZone - 获取支持的可用区信息列表""" + + fields = { + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DescribeCompShareSupportZoneResponseSchema(schema.ResponseSchema): + """DescribeCompShareSupportZone - 获取支持的可用区信息列表""" + + fields = { + "ZoneInfo": fields.List( + models.SupportZoneSchema(), required=True, load_from="ZoneInfo" + ), + } + + +""" +API: DescribeModelRepositoryModels + +模型仓库模型列表 +""" + + +class DescribeModelRepositoryModelsRequestSchema(schema.RequestSchema): + """DescribeModelRepositoryModels - 模型仓库模型列表""" + + fields = { + "Name": fields.Str(required=False, dump_to="Name"), + "Region": fields.Str(required=True, dump_to="Region"), + "Tags": fields.Str(required=False, dump_to="Tags"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeModelRepositoryModelsResponseSchema(schema.ResponseSchema): + """DescribeModelRepositoryModels - 模型仓库模型列表""" + + fields = { + "Models": fields.List( + models.ModelRepositoryModelSchema(), + required=True, + load_from="Models", + ), + } + + +""" +API: DescribeModelRepositoryTags + +模型仓库标签列表 +""" + + +class DescribeModelRepositoryTagsRequestSchema(schema.RequestSchema): + """DescribeModelRepositoryTags - 模型仓库标签列表""" + + fields = { + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeModelRepositoryTagsResponseSchema(schema.ResponseSchema): + """DescribeModelRepositoryTags - 模型仓库标签列表""" + + fields = { + "Tags": fields.List(fields.Str(), required=True, load_from="Tags"), + } + + +""" +API: DescribeSelfCommunityImages + +个人中心社区镜像查询 +""" + + +class DescribeSelfCommunityImagesRequestSchema(schema.RequestSchema): + """DescribeSelfCommunityImages - 个人中心社区镜像查询""" + + fields = { + "CompShareImageId": fields.Str( + required=False, dump_to="CompShareImageId" + ), + "GroupId": fields.Str(required=False, dump_to="GroupId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeSelfCommunityImagesResponseSchema(schema.ResponseSchema): + """DescribeSelfCommunityImages - 个人中心社区镜像查询""" + + fields = { + "AvailableTotalCount": fields.Int( + required=True, load_from="AvailableTotalCount" + ), + "ImageSetGroup": fields.List( + models.CompshareImageGroupSchema(), + required=True, + load_from="ImageSetGroup", + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeTeamMemberOrder + +获取团队订单 +""" + + +class DescribeTeamMemberOrderRequestSchema(schema.RequestSchema): + """DescribeTeamMemberOrder - 获取团队订单""" + + fields = { + "BeginTime": fields.Int(required=True, dump_to="BeginTime"), + "ChargeTypes": fields.List(fields.Str()), + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "OrderBy": fields.Str(required=False, dump_to="OrderBy"), + "OrderDir": fields.Str(required=False, dump_to="OrderDir"), + "OrderNos": fields.List(fields.Str()), + "OrderStates": fields.List(fields.Str()), + "OrderTypes": fields.List(fields.Str()), + "Regions": fields.List(fields.Int()), + "ResourceIds": fields.List(fields.Str()), + "ResourceTypes": fields.List(fields.Int()), + "TeamId": fields.Int(required=True, dump_to="TeamId"), + "VirtualCompanyId": fields.Int( + required=True, dump_to="VirtualCompanyId" + ), + } + + +class DescribeTeamMemberOrderResponseSchema(schema.ResponseSchema): + """DescribeTeamMemberOrder - 获取团队订单""" + + fields = { + "Limit": fields.Int(required=True, load_from="Limit"), + "Offset": fields.Int(required=True, load_from="Offset"), + "OrderInfos": fields.List( + models.OrderInfoSchema(), required=True, load_from="OrderInfos" + ), + "Total": fields.Int(required=True, load_from="Total"), + } + + +""" +API: DescribeTeamMemberOrderCount + +获取团队成员订单总览 +""" + + +class DescribeTeamMemberOrderCountRequestSchema(schema.RequestSchema): + """DescribeTeamMemberOrderCount - 获取团队成员订单总览""" + + fields = { + "BeginTime": fields.Int(required=True, dump_to="BeginTime"), + "ChargeTypes": fields.Str(required=False, dump_to="ChargeTypes"), + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "OrderStates": fields.Str(required=False, dump_to="OrderStates"), + "OrderTypes": fields.Str(required=False, dump_to="OrderTypes"), + "Regions": fields.Str(required=False, dump_to="Regions"), + "ResourceTypes": fields.Str(required=False, dump_to="ResourceTypes"), + "TeamId": fields.Int(required=True, dump_to="TeamId"), + "VirtualCompanyId": fields.Int( + required=True, dump_to="VirtualCompanyId" + ), + } + + +class DescribeTeamMemberOrderCountResponseSchema(schema.ResponseSchema): + """DescribeTeamMemberOrderCount - 获取团队成员订单总览""" + + fields = { + "Amount": fields.Str(required=True, load_from="Amount"), + "AmountCoupon": fields.Str(required=True, load_from="AmountCoupon"), + "AmountFree": fields.Str(required=True, load_from="AmountFree"), + "AmountReal": fields.Str(required=True, load_from="AmountReal"), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeTeamMemberUnpaidOrder + +获取团队队员未支付订单 +""" + + +class DescribeTeamMemberUnpaidOrderRequestSchema(schema.RequestSchema): + """DescribeTeamMemberUnpaidOrder - 获取团队队员未支付订单""" + + fields = { + "BeginTime": fields.Int(required=True, dump_to="BeginTime"), + "ChargeTypes": fields.List(fields.Str()), + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "OrderBy": fields.Str(required=False, dump_to="OrderBy"), + "OrderDir": fields.Str(required=False, dump_to="OrderDir"), + "OrderNos": fields.List(fields.Str()), + "OrderStates": fields.List(fields.Str()), + "OrderTypes": fields.List(fields.Str()), + "Regions": fields.List(fields.Int()), + "ResourceIds": fields.List(fields.Str()), + "ResourceTypes": fields.List(fields.Int()), + "TeamId": fields.Int(required=True, dump_to="TeamId"), + "VirtualCompanyId": fields.Int( + required=True, dump_to="VirtualCompanyId" + ), + } + + +class DescribeTeamMemberUnpaidOrderResponseSchema(schema.ResponseSchema): + """DescribeTeamMemberUnpaidOrder - 获取团队队员未支付订单""" + + fields = { + "Limit": fields.Int(required=True, load_from="Limit"), + "Offset": fields.Int(required=True, load_from="Offset"), + "OrderInfos": fields.List( + models.UnpaidOrderInfoSchema(), + required=True, + load_from="OrderInfos", + ), + "Total": fields.Int(required=True, load_from="Total"), + } + + +""" +API: DescribeTeamMemberUnpaidOrderCount + +获取团队成员未支付订单总览 +""" + + +class DescribeTeamMemberUnpaidOrderCountRequestSchema(schema.RequestSchema): + """DescribeTeamMemberUnpaidOrderCount - 获取团队成员未支付订单总览""" + + fields = { + "BeginTime": fields.Int(required=True, dump_to="BeginTime"), + "ChargeTypes": fields.List(fields.Str()), + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "OrderStates": fields.List(fields.Str()), + "OrderTypes": fields.List(fields.Str()), + "OrganizationId": fields.Int(required=False, dump_to="OrganizationId"), + "Regions": fields.List(fields.Int()), + "ResourceIds": fields.Str(required=False, dump_to="ResourceIds"), + "ResourceTypes": fields.Int(required=False, dump_to="ResourceTypes"), + "TeamId": fields.Int(required=True, dump_to="TeamId"), + "TransactionNos": fields.List(fields.Str()), + "VirtualCompanyId": fields.Int( + required=True, dump_to="VirtualCompanyId" + ), + } + + +class DescribeTeamMemberUnpaidOrderCountResponseSchema(schema.ResponseSchema): + """DescribeTeamMemberUnpaidOrderCount - 获取团队成员未支付订单总览""" + + fields = { + "Amount": fields.Str(required=True, load_from="Amount"), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeULHostBundles + +获取轻量应用云主机套餐列表 +""" + + +class DescribeULHostBundlesRequestSchema(schema.RequestSchema): + """DescribeULHostBundles - 获取轻量应用云主机套餐列表""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DescribeULHostBundlesResponseSchema(schema.ResponseSchema): + """DescribeULHostBundles - 获取轻量应用云主机套餐列表""" + + fields = { + "Bundles": fields.List( + models.BundleSchema(), required=True, load_from="Bundles" + ), + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: DescribeULHostImage + +获取指定数据中心镜像列表 +""" + + +class DescribeULHostImageRequestSchema(schema.RequestSchema): + """DescribeULHostImage - 获取指定数据中心镜像列表""" + + fields = { + "ImageId": fields.Str(required=False, dump_to="ImageId"), + "ImageIds": fields.List(fields.Str()), + "ImageType": fields.Str(required=False, dump_to="ImageType"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "OsType": fields.Str(required=False, dump_to="OsType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Scene": fields.Str(required=False, dump_to="Scene"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DescribeULHostImageResponseSchema(schema.ResponseSchema): + """DescribeULHostImage - 获取指定数据中心镜像列表""" + + fields = { + "ImageSet": fields.List( + models.ULHostImageSetSchema(), required=False, load_from="ImageSet" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeULHostInstance + +获取轻量应用云主机列表 +""" + + +class DescribeULHostInstanceRequestSchema(schema.RequestSchema): + """DescribeULHostInstance - 获取轻量应用云主机列表""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ULHostIds": fields.List(fields.Str()), + } + + +class DescribeULHostInstanceResponseSchema(schema.ResponseSchema): + """DescribeULHostInstance - 获取轻量应用云主机列表""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "ULHostInstanceSets": fields.List( + models.ULHostInstanceSetSchema(), + required=True, + load_from="ULHostInstanceSets", + ), + } + + +""" +API: DescribeUserCommunityImages + +获取社区镜像列表(登录状态) +""" + + +class DescribeUserCommunityImagesParamSortConditionSchema(schema.RequestSchema): + """DescribeUserCommunityImagesParamSortCondition -""" + + fields = { + "ASC": fields.Str(required=False, dump_to="ASC"), + "Field": fields.Str(required=False, dump_to="Field"), + } + + +class DescribeUserCommunityImagesRequestSchema(schema.RequestSchema): + """DescribeUserCommunityImages - 获取社区镜像列表(登录状态)""" + + fields = { + "Author": fields.Str(required=False, dump_to="Author"), + "CompShareImageId": fields.Str( + required=False, dump_to="CompShareImageId" + ), + "FuzzySearch": fields.Str(required=False, dump_to="FuzzySearch"), + "IsFree": fields.Bool(required=False, dump_to="IsFree"), + "IsOfficial": fields.Bool(required=False, dump_to="IsOfficial"), + "Limit": fields.Str(required=False, dump_to="Limit"), + "Name": fields.Str(required=False, dump_to="Name"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SortCondition": DescribeUserCommunityImagesParamSortConditionSchema( + required=False, dump_to="SortCondition" + ), + "Tag": fields.Str(required=False, dump_to="Tag"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeUserCommunityImagesResponseSchema(schema.ResponseSchema): + """DescribeUserCommunityImages - 获取社区镜像列表(登录状态)""" + + fields = { + "AvailableTotalCount": fields.Int( + required=False, load_from="AvailableTotalCount" + ), + "ImageSetGroup": fields.List( + models.CompshareImageGroupSchema(), + required=False, + load_from="ImageSetGroup", + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DetachCompshareDisk + +卸载某个已经挂载在指定UHost实例上的UDisk +""" + + +class DetachCompshareDiskRequestSchema(schema.RequestSchema): + """DetachCompshareDisk - 卸载某个已经挂载在指定UHost实例上的UDisk""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UDiskId": fields.Str(required=True, dump_to="UDiskId"), + "UHostId": fields.Str(required=False, dump_to="UHostId"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DetachCompshareDiskResponseSchema(schema.ResponseSchema): + """DetachCompshareDisk - 卸载某个已经挂载在指定UHost实例上的UDisk""" + + fields = {} + + +""" +API: DownloadTeamOrder + +下载团队订单 +""" + + +class DownloadTeamOrderRequestSchema(schema.RequestSchema): + """DownloadTeamOrder - 下载团队订单""" + + fields = { + "BeginTime": fields.Int(required=False, dump_to="BeginTime"), + "EndTime": fields.Int(required=False, dump_to="EndTime"), + "OrderStates": fields.List(fields.Str()), + "TeamId": fields.Int(required=True, dump_to="TeamId"), + "VirtualCompanyId": fields.Int( + required=False, dump_to="VirtualCompanyId" + ), + } + + +class DownloadTeamOrderResponseSchema(schema.ResponseSchema): + """DownloadTeamOrder - 下载团队订单""" + + fields = { + "Amount": fields.Str(required=True, load_from="Amount"), + "AmountCoupon": fields.Str(required=True, load_from="AmountCoupon"), + "AmountFree": fields.Str(required=True, load_from="AmountFree"), + "AmountReal": fields.Str(required=True, load_from="AmountReal"), + "ChargeType": fields.Str(required=True, load_from="ChargeType"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "EndTime": fields.Int(required=True, load_from="EndTime"), + "OrderNo": fields.Str(required=True, load_from="OrderNo"), + "OrderType": fields.Str(required=True, load_from="OrderType"), + "RemarkName": fields.Str(required=True, load_from="RemarkName"), + "ResourceId": fields.Str(required=True, load_from="ResourceId"), + "ResourceType": fields.Str(required=True, load_from="ResourceType"), + "StartTime": fields.Int(required=True, load_from="StartTime"), + "VirtualCompanyId": fields.Int( + required=True, load_from="VirtualCompanyId" + ), + } + + +""" +API: GetCompShareAttachedDiskUpgradePrice + +获取算力平台实例磁盘升级价格 +""" + + +class GetCompShareAttachedDiskUpgradePriceRequestSchema(schema.RequestSchema): + """GetCompShareAttachedDiskUpgradePrice - 获取算力平台实例磁盘升级价格""" + + fields = { + "DiskId": fields.Str(required=True, dump_to="DiskId"), + "DiskSpace": fields.Str(required=True, dump_to="DiskSpace"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UHostId": fields.Str(required=True, dump_to="UHostId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetCompShareAttachedDiskUpgradePriceResponseSchema(schema.ResponseSchema): + """GetCompShareAttachedDiskUpgradePrice - 获取算力平台实例磁盘升级价格""" + + fields = { + "ListPrice": fields.Float(required=True, load_from="ListPrice"), + "ListPriceDetail": models.DiskUpgradePriceDetailSchema(), + "OriginalPrice": fields.Float(required=True, load_from="OriginalPrice"), + "OriginalPriceDetail": models.DiskUpgradePriceDetailSchema(), + "Price": fields.Float(required=True, load_from="Price"), + "PriceDetail": models.DiskUpgradePriceDetailSchema(), + } + + +""" +API: GetCompShareImageCreateProgress + +获取算力平台镜像制作进度 +""" + + +class GetCompShareImageCreateProgressRequestSchema(schema.RequestSchema): + """GetCompShareImageCreateProgress - 获取算力平台镜像制作进度""" + + fields = { + "CompShareImageId": fields.Str( + required=True, dump_to="CompShareImageId" + ), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetCompShareImageCreateProgressResponseSchema(schema.ResponseSchema): + """GetCompShareImageCreateProgress - 获取算力平台镜像制作进度""" + + fields = { + "Process": fields.Float(required=True, load_from="Process"), + "RemainingDuration": fields.Str( + required=True, load_from="RemainingDuration" + ), + "TotalDuration": fields.Str(required=True, load_from="TotalDuration"), + } + + +""" +API: GetCompShareInstanceMonitor + +获取实例监控指标 +""" + + +class GetCompShareInstanceMonitorRequestSchema(schema.RequestSchema): + """GetCompShareInstanceMonitor - 获取实例监控指标""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UHostIds": fields.List(fields.Str()), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class GetCompShareInstanceMonitorResponseSchema(schema.ResponseSchema): + """GetCompShareInstanceMonitor - 获取实例监控指标""" + + fields = {} + + +""" +API: GetCompShareInstancePrice + +获取算力平台实例价格 +""" + + +class GetCompShareInstancePriceParamDisksSchema(schema.RequestSchema): + """GetCompShareInstancePriceParamDisks -""" + + fields = { + "IsBoot": fields.Bool(required=False, dump_to="IsBoot"), + "Size": fields.Int(required=False, dump_to="Size"), + "Type": fields.Str(required=False, dump_to="Type"), + } + + +class GetCompShareInstancePriceRequestSchema(schema.RequestSchema): + """GetCompShareInstancePrice - 获取算力平台实例价格""" + + fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CompShareImageId": fields.Str( + required=False, dump_to="CompShareImageId" + ), + "Cpu": fields.Str(required=False, dump_to="Cpu"), + "Disks": fields.List(GetCompShareInstancePriceParamDisksSchema()), + "Gpu": fields.Str(required=False, dump_to="Gpu"), + "GpuType": fields.Str(required=False, dump_to="GpuType"), + "Memory": fields.Str(required=False, dump_to="Memory"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetCompShareInstancePriceResponseSchema(schema.ResponseSchema): + """GetCompShareInstancePrice - 获取算力平台实例价格""" + + fields = { + "ListPriceDetail": fields.List( + models.CompSharePriceDetailSchema(), + required=False, + load_from="ListPriceDetail", + ), + "OriginalPriceDetail": fields.List( + models.CompSharePriceDetailSchema(), + required=False, + load_from="OriginalPriceDetail", + ), + "PriceDetail": fields.List( + models.CompSharePriceDetailSchema(), + required=False, + load_from="PriceDetail", + ), + } + + +""" +API: GetCompShareInstanceUpgradePrice + +获取算力平台实例升降级价格 +""" + + +class GetCompShareInstanceUpgradePriceRequestSchema(schema.RequestSchema): + """GetCompShareInstanceUpgradePrice - 获取算力平台实例升降级价格""" + + fields = { + "CompShareImageId": fields.Str( + required=False, dump_to="CompShareImageId" + ), + "Cpu": fields.Int(required=False, dump_to="Cpu"), + "Gpu": fields.Int(required=False, dump_to="Gpu"), + "Memory": fields.Int(required=False, dump_to="Memory"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UHostId": fields.Str(required=True, dump_to="UHostId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetCompShareInstanceUpgradePriceResponseSchema(schema.ResponseSchema): + """GetCompShareInstanceUpgradePrice - 获取算力平台实例升降级价格""" + + fields = { + "ListPrice": fields.Float(required=True, load_from="ListPrice"), + "OriginalPrice": fields.Float(required=True, load_from="OriginalPrice"), + "Price": fields.Float(required=True, load_from="Price"), + } + + +""" +API: GetCompShareInstanceUserPrice + +获取算力平台实例用户价格 +""" + + +class GetCompShareInstanceUserPriceParamDisksSchema(schema.RequestSchema): + """GetCompShareInstanceUserPriceParamDisks -""" + + fields = { + "IsBoot": fields.Bool(required=False, dump_to="IsBoot"), + "Size": fields.Int(required=False, dump_to="Size"), + "Type": fields.Str(required=False, dump_to="Type"), + } + + +class GetCompShareInstanceUserPriceRequestSchema(schema.RequestSchema): + """GetCompShareInstanceUserPrice - 获取算力平台实例用户价格""" + + fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CompShareImageId": fields.Str( + required=False, dump_to="CompShareImageId" + ), + "Cpu": fields.Str(required=False, dump_to="Cpu"), + "Disks": fields.List(GetCompShareInstanceUserPriceParamDisksSchema()), + "Gpu": fields.Str(required=False, dump_to="Gpu"), + "GpuType": fields.Str(required=False, dump_to="GpuType"), + "Memory": fields.Str(required=False, dump_to="Memory"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetCompShareInstanceUserPriceResponseSchema(schema.ResponseSchema): + """GetCompShareInstanceUserPrice - 获取算力平台实例用户价格""" + + fields = { + "ListPriceDetail": fields.List( + models.CompSharePriceDetailSchema(), + required=False, + load_from="ListPriceDetail", + ), + "OriginalPriceDetail": fields.List( + models.CompSharePriceDetailSchema(), + required=False, + load_from="OriginalPriceDetail", + ), + "PriceDetail": fields.List( + models.CompSharePriceDetailSchema(), + required=False, + load_from="PriceDetail", + ), + } + + +""" +API: GetCompShareRefundPrice + +获取算力平台实例删除扣除费用。包括主机、磁盘等资源的费用 +""" + + +class GetCompShareRefundPriceRequestSchema(schema.RequestSchema): + """GetCompShareRefundPrice - 获取算力平台实例删除扣除费用。包括主机、磁盘等资源的费用""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UHostIds": fields.List(fields.Str()), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetCompShareRefundPriceResponseSchema(schema.ResponseSchema): + """GetCompShareRefundPrice - 获取算力平台实例删除扣除费用。包括主机、磁盘等资源的费用""" + + fields = { + "RefundPriceSet": fields.List( + models.UHostRefundPriceSetSchema(), + required=True, + load_from="RefundPriceSet", + ), + } + + +""" +API: GetCompShareTeamInfo + +获取团队详细信息 +""" + + +class GetCompShareTeamInfoRequestSchema(schema.RequestSchema): + """GetCompShareTeamInfo - 获取团队详细信息""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "TeamId": fields.Int(required=True, dump_to="TeamId"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class GetCompShareTeamInfoResponseSchema(schema.ResponseSchema): + """GetCompShareTeamInfo - 获取团队详细信息""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "Team": models.CompShareTeamDetailInfoSchema(), + "TeamRelation": fields.List( + models.TeamRelationSchema(), + required=False, + load_from="TeamRelation", + ), + } + + +""" +API: GetOpenClawModelList + +获取OpenClaw模型列表 +""" + + +class GetOpenClawModelListRequestSchema(schema.RequestSchema): + """GetOpenClawModelList - 获取OpenClaw模型列表""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class GetOpenClawModelListResponseSchema(schema.ResponseSchema): + """GetOpenClawModelList - 获取OpenClaw模型列表""" + + fields = { + "Models": models.OpenClawModelInfoSchema(), + } + + +""" +API: GetSoftwareURL + +获取算力平台实例应用URL +""" + + +class GetSoftwareURLRequestSchema(schema.RequestSchema): + """GetSoftwareURL - 获取算力平台实例应用URL""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Software": fields.Str(required=True, dump_to="Software"), + "UHostId": fields.Str(required=True, dump_to="UHostId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetSoftwareURLResponseSchema(schema.ResponseSchema): + """GetSoftwareURL - 获取算力平台实例应用URL""" + + fields = { + "URL": fields.Str(required=True, load_from="URL"), + } + + +""" +API: GetULHostInstancePrice + +获取轻量应用云主机套餐价格 +""" + + +class GetULHostInstancePriceRequestSchema(schema.RequestSchema): + """GetULHostInstancePrice - 获取轻量应用云主机套餐价格""" + + fields = { + "BundleId": fields.Str(required=True, dump_to="BundleId"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "Count": fields.Int(required=False, dump_to="Count"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class GetULHostInstancePriceResponseSchema(schema.ResponseSchema): + """GetULHostInstancePrice - 获取轻量应用云主机套餐价格""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "PriceSet": fields.List( + models.ULHostPriceSetSchema(), required=True, load_from="PriceSet" + ), + } + + +""" +API: GetULHostRenewPrice + +获取主机续费价格 +""" + + +class GetULHostRenewPriceRequestSchema(schema.RequestSchema): + """GetULHostRenewPrice - 获取主机续费价格""" + + fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ULHostId": fields.Str(required=True, dump_to="ULHostId"), + } + + +class GetULHostRenewPriceResponseSchema(schema.ResponseSchema): + """GetULHostRenewPrice - 获取主机续费价格""" + + fields = { + "PriceSet": fields.List( + models.ULHostPriceSetSchema(), required=True, load_from="PriceSet" + ), + } + + +""" +API: ListCompShareTeam + +获取团队列表 +""" + + +class ListCompShareTeamRequestSchema(schema.RequestSchema): + """ListCompShareTeam - 获取团队列表""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class ListCompShareTeamResponseSchema(schema.ResponseSchema): + """ListCompShareTeam - 获取团队列表""" + + fields = { + "Teams": fields.List( + models.CompShareTeamInfoSchema(), required=False, load_from="Teams" + ), + } + + +""" +API: ListCompShareTeamInvite + +获取邀请成员的列表 +""" + + +class ListCompShareTeamInviteRequestSchema(schema.RequestSchema): + """ListCompShareTeamInvite - 获取邀请成员的列表""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "TeamId": fields.Int(required=False, dump_to="TeamId"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class ListCompShareTeamInviteResponseSchema(schema.ResponseSchema): + """ListCompShareTeamInvite - 获取邀请成员的列表""" + + fields = { + "Invites": fields.List( + models.CompShareTeamInviteInfoSchema(), + required=True, + load_from="Invites", + ), + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: ListCompShareTeamJoined + +获取加入团队信息列表 +""" + + +class ListCompShareTeamJoinedRequestSchema(schema.RequestSchema): + """ListCompShareTeamJoined - 获取加入团队信息列表""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "Status": fields.Str(required=False, dump_to="Status"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class ListCompShareTeamJoinedResponseSchema(schema.ResponseSchema): + """ListCompShareTeamJoined - 获取加入团队信息列表""" + + fields = { + "JoinedTeams": fields.List( + models.CompShareTeamJoinedInfoSchema(), + required=True, + load_from="JoinedTeams", + ), + } + + +""" +API: ListCompShareTeamOperateLog + +获取团队操作日志列表 +""" + + +class ListCompShareTeamOperateLogRequestSchema(schema.RequestSchema): + """ListCompShareTeamOperateLog - 获取团队操作日志列表""" + + fields = { + "BeginTime": fields.Int(required=True, dump_to="BeginTime"), + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "OperateType": fields.List(fields.Str()), + "OrderByASC": fields.Bool(required=False, dump_to="OrderByASC"), + "Status": fields.List(fields.Str()), + "TeamId": fields.Int(required=True, dump_to="TeamId"), + } + + +class ListCompShareTeamOperateLogResponseSchema(schema.ResponseSchema): + """ListCompShareTeamOperateLog - 获取团队操作日志列表""" + + fields = { + "Logs": fields.List( + models.CompShareTeamOperateLogInfoSchema(), + required=True, + load_from="Logs", + ), + "OperateTypeList": fields.List( + fields.Str(), required=False, load_from="OperateTypeList" + ), + "StatusList": fields.List( + fields.Str(), required=False, load_from="StatusList" + ), + "Total": fields.Int(required=True, load_from="Total"), + } + + +""" +API: ListMemberProductType + +获取成员订单产品类型 +""" + + +class ListMemberProductTypeRequestSchema(schema.RequestSchema): + """ListMemberProductType - 获取成员订单产品类型""" + + fields = { + "BeginTime": fields.Int(required=True, dump_to="BeginTime"), + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "OrderStates": fields.List(fields.Str()), + "TeamId": fields.Int(required=True, dump_to="TeamId"), + "VirtualCompanyId": fields.Int( + required=False, dump_to="VirtualCompanyId" + ), + } + + +class ListMemberProductTypeResponseSchema(schema.ResponseSchema): + """ListMemberProductType - 获取成员订单产品类型""" + + fields = { + "ProductTypeList": fields.List( + fields.Str(), required=True, load_from="ProductTypeList" + ), + } + + +""" +API: ModifyCompShareImageShareAccount + +管理镜像的共享账号列表 +""" + + +class ModifyCompShareImageShareAccountRequestSchema(schema.RequestSchema): + """ModifyCompShareImageShareAccount - 管理镜像的共享账号列表""" + + fields = { + "AddAccounts": fields.List(fields.Int()), + "CompShareImageId": fields.Str( + required=True, dump_to="CompShareImageId" + ), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "RemoveAccounts": fields.List(fields.Int()), + } + + +class ModifyCompShareImageShareAccountResponseSchema(schema.ResponseSchema): + """ModifyCompShareImageShareAccount - 管理镜像的共享账号列表""" + + fields = { + "InvalidAccounts": fields.List( + fields.Int(), required=False, load_from="InvalidAccounts" + ), + } + + +""" +API: ModifyCompShareInstanceName + +修改算力平台实例名称 +""" + + +class ModifyCompShareInstanceNameRequestSchema(schema.RequestSchema): + """ModifyCompShareInstanceName - 修改算力平台实例名称""" + + fields = { + "Name": fields.Str(required=True, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UHostId": fields.Str(required=True, dump_to="UHostId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ModifyCompShareInstanceNameResponseSchema(schema.ResponseSchema): + """ModifyCompShareInstanceName - 修改算力平台实例名称""" + + fields = { + "UHostId": fields.Str(required=True, load_from="UHostId"), + } + + +""" +API: ModifyULHostAttribute + +修改指定ULHost实例属性信息,包含名称和备注 +""" + + +class ModifyULHostAttributeRequestSchema(schema.RequestSchema): + """ModifyULHostAttribute - 修改指定ULHost实例属性信息,包含名称和备注""" + + fields = { + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "ULHostId": fields.Str(required=True, dump_to="ULHostId"), + } + + +class ModifyULHostAttributeResponseSchema(schema.ResponseSchema): + """ModifyULHostAttribute - 修改指定ULHost实例属性信息,包含名称和备注""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "ULHostId": fields.Str(required=True, load_from="ULHostId"), + } + + +""" +API: PoweroffULHostInstance + +直接关闭UHost实例电源,无需等待实例正常关闭。 +""" + + +class PoweroffULHostInstanceRequestSchema(schema.RequestSchema): + """PoweroffULHostInstance - 直接关闭UHost实例电源,无需等待实例正常关闭。""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ULHostId": fields.Str(required=True, dump_to="ULHostId"), + } + + +class PoweroffULHostInstanceResponseSchema(schema.ResponseSchema): + """PoweroffULHostInstance - 直接关闭UHost实例电源,无需等待实例正常关闭。""" + + fields = { + "ULHostId": fields.Str(required=True, load_from="ULHostId"), + } + + +""" +API: PublishCompShareImage + +将自制镜像发布到镜像社区 +""" + + +class PublishCompShareImageParamSoftwaresSchema(schema.RequestSchema): + """PublishCompShareImageParamSoftwares -""" + + fields = { + "Applications": fields.List(fields.Str()), + "CUDAVersion": fields.Str(required=False, dump_to="CUDAVersion"), + "Framework": fields.Str(required=False, dump_to="Framework"), + "FrameworkVersion": fields.Str( + required=False, dump_to="FrameworkVersion" + ), + } + + +class PublishCompShareImageRequestSchema(schema.RequestSchema): + """PublishCompShareImage - 将自制镜像发布到镜像社区""" + + fields = { + "AutoStart": fields.Str(required=False, dump_to="AutoStart"), + "CommunityImageName": fields.Str( + required=False, dump_to="CommunityImageName" + ), + "CompShareImageId": fields.Str( + required=True, dump_to="CompShareImageId" + ), + "Cover": fields.Str(required=False, dump_to="Cover"), + "Description": fields.Str(required=False, dump_to="Description"), + "Price": fields.Float(required=True, dump_to="Price"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Readme": fields.Str(required=False, dump_to="Readme"), + "Region": fields.Str(required=True, dump_to="Region"), + "Softwares": PublishCompShareImageParamSoftwaresSchema( + required=False, dump_to="Softwares" + ), + "Tags": fields.List(fields.Str()), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class PublishCompShareImageResponseSchema(schema.ResponseSchema): + """PublishCompShareImage - 将自制镜像发布到镜像社区""" + + fields = {} + + +""" +API: RebootCompShareInstance + +重启轻量算力平台实例 +""" + + +class RebootCompShareInstanceRequestSchema(schema.RequestSchema): + """RebootCompShareInstance - 重启轻量算力平台实例""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UHostId": fields.Str(required=True, dump_to="UHostId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class RebootCompShareInstanceResponseSchema(schema.ResponseSchema): + """RebootCompShareInstance - 重启轻量算力平台实例""" + + fields = { + "UHostId": fields.Str(required=True, load_from="UHostId"), + } + + +""" +API: RebootULHostInstance + +重新启动UHost实例。 +""" + + +class RebootULHostInstanceRequestSchema(schema.RequestSchema): + """RebootULHostInstance - 重新启动UHost实例。""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ULHostId": fields.Str(required=True, dump_to="ULHostId"), + } + + +class RebootULHostInstanceResponseSchema(schema.ResponseSchema): + """RebootULHostInstance - 重新启动UHost实例。""" + + fields = { + "ULHostId": fields.Str(required=False, load_from="ULHostId"), + } + + +""" +API: ReinstallCompShareInstance + +重装算力平台实例 +""" + + +class ReinstallCompShareInstanceRequestSchema(schema.RequestSchema): + """ReinstallCompShareInstance - 重装算力平台实例""" + + fields = { + "CompShareImageId": fields.Str( + required=True, dump_to="CompShareImageId" + ), + "Password": fields.Str(required=False, dump_to="Password"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UHostId": fields.Str(required=True, dump_to="UHostId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ReinstallCompShareInstanceResponseSchema(schema.ResponseSchema): + """ReinstallCompShareInstance - 重装算力平台实例""" + + fields = { + "UHostId": fields.Str(required=True, load_from="UHostId"), + } + + +""" +API: ReinstallULHostInstance + +重装轻量应用云主机 +""" + + +class ReinstallULHostInstanceRequestSchema(schema.RequestSchema): + """ReinstallULHostInstance - 重装轻量应用云主机""" + + fields = { + "ImageId": fields.Str(required=True, dump_to="ImageId"), + "Password": fields.Str(required=True, dump_to="Password"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ULHostId": fields.Str(required=True, dump_to="ULHostId"), + } + + +class ReinstallULHostInstanceResponseSchema(schema.ResponseSchema): + """ReinstallULHostInstance - 重装轻量应用云主机""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "ULHostId": fields.Str(required=True, load_from="ULHostId"), + } + + +""" +API: ResetCompShareInstancePassword + +重置算力平台实例密码 +""" + + +class ResetCompShareInstancePasswordRequestSchema(schema.RequestSchema): + """ResetCompShareInstancePassword - 重置算力平台实例密码""" + + fields = { + "Password": fields.Str(required=True, dump_to="Password"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UHostId": fields.Str(required=True, dump_to="UHostId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ResetCompShareInstancePasswordResponseSchema(schema.ResponseSchema): + """ResetCompShareInstancePassword - 重置算力平台实例密码""" + + fields = { + "UHostId": fields.Str(required=True, load_from="UHostId"), + } + + +""" +API: ResetULHostInstancePassword + +重置轻量应用云主机管理员密码。 +""" + + +class ResetULHostInstancePasswordRequestSchema(schema.RequestSchema): + """ResetULHostInstancePassword - 重置轻量应用云主机管理员密码。""" + + fields = { + "Password": fields.Str(required=True, dump_to="Password"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ULHostId": fields.Str(required=True, dump_to="ULHostId"), + } + + +class ResetULHostInstancePasswordResponseSchema(schema.ResponseSchema): + """ResetULHostInstancePassword - 重置轻量应用云主机管理员密码。""" + + fields = { + "ULHostId": fields.Str(required=True, load_from="ULHostId"), + } + + +""" +API: ResizeCompShareDisk + +修改磁盘 +""" + + +class ResizeCompShareDiskRequestSchema(schema.RequestSchema): + """ResizeCompShareDisk - 修改磁盘""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Size": fields.Int(required=True, dump_to="Size"), + "UDiskId": fields.Str(required=True, dump_to="UDiskId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ResizeCompShareDiskResponseSchema(schema.ResponseSchema): + """ResizeCompShareDisk - 修改磁盘""" + + fields = { + "UDiskId": fields.Str(required=True, load_from="UDiskId"), + } + + +""" +API: ResizeCompShareInstance + +修改算力平台实例配置 +""" + + +class ResizeCompShareInstanceRequestSchema(schema.RequestSchema): + """ResizeCompShareInstance - 修改算力平台实例配置""" + + fields = { + "Cpu": fields.Int(required=False, dump_to="Cpu"), + "DiskId": fields.Str(required=False, dump_to="DiskId"), + "DiskSpace": fields.Str(required=False, dump_to="DiskSpace"), + "Gpu": fields.Int(required=False, dump_to="Gpu"), + "Memory": fields.Int(required=False, dump_to="Memory"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UHostId": fields.Str(required=True, dump_to="UHostId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ResizeCompShareInstanceResponseSchema(schema.ResponseSchema): + """ResizeCompShareInstance - 修改算力平台实例配置""" + + fields = { + "UHostId": fields.Str(required=True, load_from="UHostId"), + } + + +""" +API: SetCompShareTeamRelation + +设置邀请信息 +""" + + +class SetCompShareTeamRelationRequestSchema(schema.RequestSchema): + """SetCompShareTeamRelation - 设置邀请信息""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "RemarkName": fields.Str(required=False, dump_to="RemarkName"), + "Status": fields.Str(required=True, dump_to="Status"), + "TeamId": fields.Str(required=True, dump_to="TeamId"), + "UserCompanyId": fields.Str(required=False, dump_to="UserCompanyId"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class SetCompShareTeamRelationResponseSchema(schema.ResponseSchema): + """SetCompShareTeamRelation - 设置邀请信息""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: StartCompShareInstance + +启动算力平台实例 +""" + + +class StartCompShareInstanceRequestSchema(schema.RequestSchema): + """StartCompShareInstance - 启动算力平台实例""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UHostId": fields.Str(required=True, dump_to="UHostId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class StartCompShareInstanceResponseSchema(schema.ResponseSchema): + """StartCompShareInstance - 启动算力平台实例""" + + fields = { + "UHostId": fields.Str(required=True, load_from="UHostId"), + } + + +""" +API: StartULHostInstance + +启动处于关闭状态的UHost实例。 +""" + + +class StartULHostInstanceRequestSchema(schema.RequestSchema): + """StartULHostInstance - 启动处于关闭状态的UHost实例。""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ULHostId": fields.Str(required=True, dump_to="ULHostId"), + } + + +class StartULHostInstanceResponseSchema(schema.ResponseSchema): + """StartULHostInstance - 启动处于关闭状态的UHost实例。""" + + fields = { + "ULHostId": fields.Str(required=False, load_from="ULHostId"), + } + + +""" +API: StopCompShareInstance + +关闭算力平台实例 +""" + + +class StopCompShareInstanceRequestSchema(schema.RequestSchema): + """StopCompShareInstance - 关闭算力平台实例""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UHostId": fields.Str(required=True, dump_to="UHostId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class StopCompShareInstanceResponseSchema(schema.ResponseSchema): + """StopCompShareInstance - 关闭算力平台实例""" + + fields = { + "UHostId": fields.Str(required=True, load_from="UHostId"), + } + + +""" +API: StopULHostInstance + +指停止处于运行状态的ULHost实例 +""" + + +class StopULHostInstanceRequestSchema(schema.RequestSchema): + """StopULHostInstance - 指停止处于运行状态的ULHost实例""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ULHostId": fields.Str(required=True, dump_to="ULHostId"), + } + + +class StopULHostInstanceResponseSchema(schema.ResponseSchema): + """StopULHostInstance - 指停止处于运行状态的ULHost实例""" + + fields = { + "ULHostId": fields.Str(required=False, load_from="ULHostId"), + } + + +""" +API: TerminateCompShareCustomImage + +删除算力平台自制镜像 +""" + + +class TerminateCompShareCustomImageRequestSchema(schema.RequestSchema): + """TerminateCompShareCustomImage - 删除算力平台自制镜像""" + + fields = { + "CompShareImageId": fields.Str( + required=True, dump_to="CompShareImageId" + ), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class TerminateCompShareCustomImageResponseSchema(schema.ResponseSchema): + """TerminateCompShareCustomImage - 删除算力平台自制镜像""" + + fields = {} + + +""" +API: TerminateCompShareInstance + +删除轻量算力共享平台虚机实例 +""" + + +class TerminateCompShareInstanceRequestSchema(schema.RequestSchema): + """TerminateCompShareInstance - 删除轻量算力共享平台虚机实例""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UHostId": fields.Str(required=True, dump_to="UHostId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class TerminateCompShareInstanceResponseSchema(schema.ResponseSchema): + """TerminateCompShareInstance - 删除轻量算力共享平台虚机实例""" + + fields = { + "UHostId": fields.Str(required=True, load_from="UHostId"), + } + + +""" +API: TerminateULHostInstance + +删除指定数据中心的ULHost实例。 +""" + + +class TerminateULHostInstanceRequestSchema(schema.RequestSchema): + """TerminateULHostInstance - 删除指定数据中心的ULHost实例。""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ReleaseUDisk": fields.Bool(required=False, dump_to="ReleaseUDisk"), + "ULHostId": fields.Str(required=True, dump_to="ULHostId"), + } + + +class TerminateULHostInstanceResponseSchema(schema.ResponseSchema): + """TerminateULHostInstance - 删除指定数据中心的ULHost实例。""" + + fields = { + "InRecycle": fields.Str(required=True, load_from="InRecycle"), + "ULHostId": fields.Str(required=False, load_from="ULHostId"), + } + + +""" +API: UpdateCompShareImage + +编辑算力平台自制镜像信息 +""" + + +class UpdateCompShareImageRequestSchema(schema.RequestSchema): + """UpdateCompShareImage - 编辑算力平台自制镜像信息""" + + fields = { + "CompShareImageId": fields.Str( + required=True, dump_to="CompShareImageId" + ), + "Cover": fields.Str(required=False, dump_to="Cover"), + "Description": fields.Str(required=False, dump_to="Description"), + "Framework": fields.Str(required=False, dump_to="Framework"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Readme": fields.Str(required=False, dump_to="Readme"), + "Region": fields.Str(required=True, dump_to="Region"), + "Softwares": fields.Str(required=False, dump_to="Softwares"), + "Tags": fields.List(fields.Str()), + "Visibility": fields.Int(required=False, dump_to="Visibility"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class UpdateCompShareImageResponseSchema(schema.ResponseSchema): + """UpdateCompShareImage - 编辑算力平台自制镜像信息""" + + fields = {} + + +""" +API: UpdateCompShareStopScheduler + +更新实例定时关机时间,若不存在则新建此定时任务 +""" + + +class UpdateCompShareStopSchedulerRequestSchema(schema.RequestSchema): + """UpdateCompShareStopScheduler - 更新实例定时关机时间,若不存在则新建此定时任务""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "StopTime": fields.Int(required=True, dump_to="StopTime"), + "UHostId": fields.Str(required=True, dump_to="UHostId"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class UpdateCompShareStopSchedulerResponseSchema(schema.ResponseSchema): + """UpdateCompShareStopScheduler - 更新实例定时关机时间,若不存在则新建此定时任务""" + + fields = {} + + +""" +API: UpdateCompShareTeam + +更改团队信息 +""" + + +class UpdateCompShareTeamRequestSchema(schema.RequestSchema): + """UpdateCompShareTeam - 更改团队信息""" + + fields = { + "Description": fields.Str(required=False, dump_to="Description"), + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class UpdateCompShareTeamResponseSchema(schema.ResponseSchema): + """UpdateCompShareTeam - 更改团队信息""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } diff --git a/ucloud/services/ucompshare/schemas/models.py b/ucloud/services/ucompshare/schemas/models.py new file mode 100644 index 00000000..5cbd9758 --- /dev/null +++ b/ucloud/services/ucompshare/schemas/models.py @@ -0,0 +1,764 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class CpuPlatformsSchema(schema.ResponseSchema): + """CpuPlatforms - CPU平台信息""" + + fields = { + "Amd": fields.List(fields.Str()), + "Ampere": fields.List(fields.Str()), + "Intel": fields.List(fields.Str()), + } + + +class BootDiskInfoSchema(schema.ResponseSchema): + """BootDiskInfo - 系统盘信息""" + + fields = { + "Features": fields.List(fields.Str()), + "InstantResize": fields.Bool(required=False, load_from="InstantResize"), + "MaximalSize": fields.Int(required=False, load_from="MaximalSize"), + "Name": fields.Str(required=False, load_from="Name"), + } + + +class DataDiskInfoSchema(schema.ResponseSchema): + """DataDiskInfo - 数据盘信息""" + + fields = { + "Features": fields.List(fields.Str()), + "MaximalSize": fields.Int(required=False, load_from="MaximalSize"), + "MinimalSize": fields.Int(required=False, load_from="MinimalSize"), + "Name": fields.Str(required=False, load_from="Name"), + } + + +class DisksSchema(schema.ResponseSchema): + """Disks - 磁盘信息""" + + fields = { + "BootDisk": fields.List(BootDiskInfoSchema()), + "DataDisk": fields.List(DataDiskInfoSchema()), + "Name": fields.Str(required=False, load_from="Name"), + } + + +class CollectionSchema(schema.ResponseSchema): + """Collection - CPU和内存可支持的规格""" + + fields = { + "Cpu": fields.Int(required=False, load_from="Cpu"), + "Memory": fields.List(fields.Int()), + "MinimalCpuPlatform": fields.List(fields.Str()), + } + + +class MachineSizesSchema(schema.ResponseSchema): + """MachineSizes - GPU、CPU和内存信息""" + + fields = { + "Collection": fields.List(CollectionSchema()), + "Gpu": fields.Int(required=False, load_from="Gpu"), + } + + +class PerformanceSchema(schema.ResponseSchema): + """Performance - GPU的性能指标""" + + fields = { + "Rate": fields.Int(required=False, load_from="Rate"), + "Value": fields.Float(required=False, load_from="Value"), + } + + +class FeatureModesSchema(schema.ResponseSchema): + """FeatureModes - 可以支持的模式类别""" + + fields = { + "MinimalCpuPlatform": fields.List(fields.Str()), + "Name": fields.Str(required=False, load_from="Name"), + "RelatedToImageFeature": fields.List(fields.Str()), + } + + +class FeaturesSchema(schema.ResponseSchema): + """Features - 虚机可支持的特性""" + + fields = { + "Modes": fields.List(FeatureModesSchema()), + "Name": fields.Str(required=False, load_from="Name"), + } + + +class GraphicsMemorySchema(schema.ResponseSchema): + """GraphicsMemory - GPU的显存指标""" + + fields = { + "Rate": fields.Int(required=False, load_from="Rate"), + "Value": fields.Int(required=False, load_from="Value"), + } + + +class AvailableInstanceTypesSchema(schema.ResponseSchema): + """AvailableInstanceTypes - https://ushare.ucloudadmin.com/pages/viewpage.action?pageId=104662646""" + + fields = { + "CpuPlatforms": CpuPlatformsSchema(), + "Disks": fields.List(DisksSchema()), + "Features": fields.List(FeaturesSchema()), + "GraphicsMemory": GraphicsMemorySchema(), + "InstanceType": fields.Str(required=True, load_from="InstanceType"), + "MachineClass": fields.Str(required=False, load_from="MachineClass"), + "MachineSizes": fields.List(MachineSizesSchema()), + "Name": fields.Str(required=False, load_from="Name"), + "ParentType": fields.Str(required=False, load_from="ParentType"), + "Performance": PerformanceSchema(), + "Status": fields.Str(required=False, load_from="Status"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class ProjectsSchema(schema.ResponseSchema): + """Projects - 项目详情""" + + fields = { + "AccountId": fields.Str(required=False, load_from="AccountId"), + "AccountName": fields.Str(required=False, load_from="AccountName"), + } + + +class SoftwareSchema(schema.ResponseSchema): + """Software -""" + + fields = { + "Applications": fields.List(fields.Str()), + "CUDAVersion": fields.Str(required=False, load_from="CUDAVersion"), + "Framework": fields.Str(required=False, load_from="Framework"), + "FrameworkVersion": fields.Str( + required=False, load_from="FrameworkVersion" + ), + } + + +class CompShareImageSchema(schema.ResponseSchema): + """CompShareImage - 算力共享平台镜像详情""" + + fields = { + "AuthInfo": fields.Int(required=False, load_from="AuthInfo"), + "Author": fields.Str(required=False, load_from="Author"), + "AutoStart": fields.Bool(required=False, load_from="AutoStart"), + "CompShareImageId": fields.Str( + required=False, load_from="CompShareImageId" + ), + "Container": fields.Str(required=False, load_from="Container"), + "Cover": fields.Str(required=False, load_from="Cover"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "CreatedCount": fields.Int(required=False, load_from="CreatedCount"), + "Description": fields.Str(required=False, load_from="Description"), + "FailedReason": fields.Str(required=False, load_from="FailedReason"), + "FavoritesCount": fields.Int( + required=False, load_from="FavoritesCount" + ), + "GroupId": fields.Str(required=False, load_from="GroupId"), + "ImageCharge": fields.Bool(required=False, load_from="ImageCharge"), + "ImageOwnerAlias": fields.Str( + required=False, load_from="ImageOwnerAlias" + ), + "ImageType": fields.Str(required=False, load_from="ImageType"), + "ImageUseTime": fields.Int(required=False, load_from="ImageUseTime"), + "IsOfficial": fields.Bool(required=False, load_from="IsOfficial"), + "Name": fields.Str(required=False, load_from="Name"), + "Owner": ProjectsSchema(), + "Price": fields.Float(required=False, load_from="Price"), + "PubTime": fields.Int(required=False, load_from="PubTime"), + "Readme": fields.Str(required=False, load_from="Readme"), + "Size": fields.Int(required=False, load_from="Size"), + "Softwares": SoftwareSchema(), + "SourceGpuType": fields.Str(required=False, load_from="SourceGpuType"), + "Status": fields.Str(required=False, load_from="Status"), + "Tags": fields.List(fields.Str()), + "VersionDesc": fields.Str(required=False, load_from="VersionDesc"), + "VersionName": fields.Str(required=False, load_from="VersionName"), + "Visibility": fields.Int(required=False, load_from="Visibility"), + } + + +class UHostIPSetSchema(schema.ResponseSchema): + """UHostIPSet -""" + + fields = { + "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), + "Default": fields.Str(required=False, load_from="Default"), + "IP": fields.Str(required=False, load_from="IP"), + "IPId": fields.Str(required=False, load_from="IPId"), + "IPMode": fields.Str(required=True, load_from="IPMode"), + "Mac": fields.Str(required=False, load_from="Mac"), + "NetworkInterfaceId": fields.Str( + required=False, load_from="NetworkInterfaceId" + ), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "Type": fields.Str(required=False, load_from="Type"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + "Weight": fields.Int(required=False, load_from="Weight"), + } + + +class GpuMonitorInfoSchema(schema.ResponseSchema): + """GpuMonitorInfo - GPU卡监控信息""" + + fields = { + "GPU": fields.Str(required=False, load_from="GPU"), + "GpuUsageRate": fields.Str(required=False, load_from="GpuUsageRate"), + "MemoryUsageRate": fields.Str( + required=False, load_from="MemoryUsageRate" + ), + } + + +class MonitorMessageSchema(schema.ResponseSchema): + """MonitorMessage - 监控信息""" + + fields = { + "CpuUsageRate": fields.Str(required=False, load_from="CpuUsageRate"), + "GpuInfo": fields.List(GpuMonitorInfoSchema()), + "MemUsageRate": fields.Str(required=False, load_from="MemUsageRate"), + } + + +class DiskPriceInfoSchema(schema.ResponseSchema): + """DiskPriceInfo - 磁盘价格信息列表""" + + fields = { + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "IsBoot": fields.Bool(required=False, load_from="IsBoot"), + "Price": fields.Float(required=False, load_from="Price"), + } + + +class WithoutGpuSpecSchema(schema.ResponseSchema): + """WithoutGpuSpec - 无卡云主机规格信息""" + + fields = { + "Cpu": fields.Int(required=False, load_from="Cpu"), + "Gpu": fields.Int(required=False, load_from="Gpu"), + "Memory": fields.Int(required=False, load_from="Memory"), + } + + +class SoftwareAddrSchema(schema.ResponseSchema): + """SoftwareAddr -""" + + fields = { + "Name": fields.Str(required=False, load_from="Name"), + "URL": fields.Str(required=False, load_from="URL"), + } + + +class UHostDiskSetSchema(schema.ResponseSchema): + """UHostDiskSet -""" + + fields = { + "BackupType": fields.Str( + required=False, load_from="BackupType" + ), # Deprecated, will be removed at 1.0 + "DiskId": fields.Str(required=False, load_from="DiskId"), + "DiskType": fields.Str(required=True, load_from="DiskType"), + "Drive": fields.Str(required=False, load_from="Drive"), + "Encrypted": fields.Str(required=False, load_from="Encrypted"), + "IsBoot": fields.Str(required=True, load_from="IsBoot"), + "Name": fields.Str(required=False, load_from="Name"), + "Size": fields.Int(required=False, load_from="Size"), + "Type": fields.Str(required=False, load_from="Type"), + } + + +class CompShareInstanceSetSchema(schema.ResponseSchema): + """CompShareInstanceSet - 算力平台实例详情""" + + fields = { + "AutoRenew": fields.Str(required=False, load_from="AutoRenew"), + "CPU": fields.Int(required=False, load_from="CPU"), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "CompShareImageBillId": fields.Str( + required=False, load_from="CompShareImageBillId" + ), + "CompShareImageId": fields.Str( + required=False, load_from="CompShareImageId" + ), + "CompShareImageName": fields.Str( + required=False, load_from="CompShareImageName" + ), + "CompShareImageOwnerAlias": fields.Str( + required=False, load_from="CompShareImageOwnerAlias" + ), + "CompShareImagePrice": fields.Float( + required=False, load_from="CompShareImagePrice" + ), + "CompShareImageStatus": fields.Str( + required=False, load_from="CompShareImageStatus" + ), + "CompShareImageType": fields.Str( + required=False, load_from="CompShareImageType" + ), + "CpuArch": fields.Str(required=False, load_from="CpuArch"), + "CpuPlatform": fields.Str(required=False, load_from="CpuPlatform"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DiscountType": fields.Int(required=False, load_from="DiscountType"), + "DiskPriceInfo": fields.List(DiskPriceInfoSchema()), + "DiskSet": fields.List(UHostDiskSetSchema()), + "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "GPU": fields.Int(required=False, load_from="GPU"), + "GpuType": fields.Str(required=False, load_from="GpuType"), + "GraphicsMemory": GraphicsMemorySchema(), + "HostIp": fields.Str( + required=False, load_from="HostIp" + ), # Deprecated, will be removed at 1.0 + "HugepageCfg": fields.Str( + required=False, load_from="HugepageCfg" + ), # Deprecated, will be removed at 1.0 + "IPSet": fields.List(UHostIPSetSchema()), + "InstancePrice": fields.Float( + required=False, load_from="InstancePrice" + ), + "InstanceType": fields.Str(required=False, load_from="InstanceType"), + "IsExpire": fields.Str(required=False, load_from="IsExpire"), + "MachineType": fields.Str(required=False, load_from="MachineType"), + "Memory": fields.Int(required=False, load_from="Memory"), + "MonitorMessages": MonitorMessageSchema(), + "Name": fields.Str(required=False, load_from="Name"), + "OsName": fields.Str(required=False, load_from="OsName"), + "OsType": fields.Str(required=False, load_from="OsType"), + "Password": fields.Str(required=False, load_from="Password"), + "PodId": fields.Str( + required=False, load_from="PodId" + ), # Deprecated, will be removed at 1.0 + "PostPayPowerOffBillingResource": fields.List(DiskPriceInfoSchema()), + "PostPayShutdown": fields.Bool( + required=False, load_from="PostPayShutdown" + ), # Deprecated, will be removed at 1.0 + "QemuFullVersion": fields.Str( + required=False, load_from="QemuFullVersion" + ), # Deprecated, will be removed at 1.0 + "QemuVersion": fields.Str( + required=False, load_from="QemuVersion" + ), # Deprecated, will be removed at 1.0 + "ReleaseTime": fields.Int(required=False, load_from="ReleaseTime"), + "Remark": fields.Str(required=False, load_from="Remark"), + "SetId": fields.Int( + required=False, load_from="SetId" + ), # Deprecated, will be removed at 1.0 + "Softwares": fields.List(SoftwareAddrSchema()), + "SshLoginCommand": fields.Str( + required=False, load_from="SshLoginCommand" + ), + "StartTime": fields.Int(required=False, load_from="StartTime"), + "State": fields.Str(required=False, load_from="State"), + "StopSchedulerTime": fields.Int( + required=False, load_from="StopSchedulerTime" + ), + "StopTime": fields.Int(required=False, load_from="StopTime"), + "SupportWithoutGpuStart": fields.Bool( + required=False, load_from="SupportWithoutGpuStart" + ), + "Tag": fields.Str(required=False, load_from="Tag"), + "TotalDiskSpace": fields.Int( + required=False, load_from="TotalDiskSpace" + ), + "UHostId": fields.Str(required=False, load_from="UHostId"), + "UUID": fields.Str( + required=False, load_from="UUID" + ), # Deprecated, will be removed at 1.0 + "UpdateTime": fields.Int(required=False, load_from="UpdateTime"), + "WithoutGpuSpec": WithoutGpuSpecSchema(), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class SoftwarePortSchema(schema.ResponseSchema): + """SoftwarePort - 应用端口信息""" + + fields = { + "Port": fields.Int(required=False, load_from="Port"), + "Software": fields.Str(required=False, load_from="Software"), + } + + +class SupportZoneSchema(schema.ResponseSchema): + """SupportZone - compshare支持的可用区信息列表""" + + fields = { + "Describe": fields.Str(required=False, load_from="Describe"), + "Region": fields.Str(required=False, load_from="Region"), + "RegionId": fields.Int(required=False, load_from="RegionId"), + "Zone": fields.Str(required=False, load_from="Zone"), + "ZoneId": fields.Int(required=False, load_from="ZoneId"), + } + + +class ModelRepositoryModelSchema(schema.ResponseSchema): + """ModelRepositoryModel - 模型库模型信息""" + + fields = { + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "Name": fields.Str(required=False, load_from="Name"), + "Path": fields.Str(required=False, load_from="Path"), + "Size": fields.Str(required=False, load_from="Size"), + "Tag": fields.Str(required=False, load_from="Tag"), + } + + +class CompshareImageGroupSchema(schema.ResponseSchema): + """CompshareImageGroup - 镜像组信息""" + + fields = { + "CreatedCount": fields.Int(required=False, load_from="CreatedCount"), + "Data": fields.List(CompShareImageSchema()), + "FavoritesCount": fields.Int( + required=False, load_from="FavoritesCount" + ), + "GroupId": fields.Str(required=False, load_from="GroupId"), + "ImageDesc": fields.Str(required=False, load_from="ImageDesc"), + "ImageName": fields.Str(required=False, load_from="ImageName"), + "ImageUseTime": fields.Int(required=False, load_from="ImageUseTime"), + "IsFavorite": fields.Bool(required=False, load_from="IsFavorite"), + "RecommendCount": fields.Int( + required=False, load_from="RecommendCount" + ), + "Status": fields.Str(required=False, load_from="Status"), + } + + +class ResourceTagItemSchema(schema.ResponseSchema): + """ResourceTagItem - 资源标识""" + + fields = { + "KeyId": fields.Str(required=False, load_from="KeyId"), + "Value": fields.Str(required=False, load_from="Value"), + } + + +class OrderDetailItemSchema(schema.ResponseSchema): + """OrderDetailItem - 配置详情""" + + fields = { + "ProductName": fields.Str(required=False, load_from="ProductName"), + "Value": fields.Str(required=False, load_from="Value"), + } + + +class OrderInfoSchema(schema.ResponseSchema): + """OrderInfo - 订单信息""" + + fields = { + "Amount": fields.Str(required=False, load_from="Amount"), + "AmountCoupon": fields.Str(required=False, load_from="AmountCoupon"), + "AmountFree": fields.Str(required=False, load_from="AmountFree"), + "AmountReal": fields.Str(required=False, load_from="AmountReal"), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "Count": fields.Int(required=False, load_from="Count"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "EndTime": fields.Int(required=False, load_from="EndTime"), + "OrderDetail": fields.List(OrderDetailItemSchema()), + "OrderDetailOld": fields.List(OrderDetailItemSchema()), + "OrderNo": fields.Str(required=False, load_from="OrderNo"), + "OrderState": fields.Str(required=False, load_from="OrderState"), + "OrderType": fields.Str(required=False, load_from="OrderType"), + "OriginalPrice": fields.Str(required=False, load_from="OriginalPrice"), + "ProjectName": fields.Str(required=False, load_from="ProjectName"), + "Quantity": fields.Str(required=False, load_from="Quantity"), + "RegionId": fields.Str(required=False, load_from="RegionId"), + "ResourceId": fields.Str(required=False, load_from="ResourceId"), + "ResourceTag": fields.List(ResourceTagItemSchema()), + "ResourceType": fields.Str(required=False, load_from="ResourceType"), + "SpotDiscount": fields.Str(required=False, load_from="SpotDiscount"), + "StartTime": fields.Int(required=False, load_from="StartTime"), + "TradeNo": fields.Str(required=False, load_from="TradeNo"), + "UpdateTime": fields.Int(required=False, load_from="UpdateTime"), + } + + +class UnpaidOrderDetailSchema(schema.ResponseSchema): + """UnpaidOrderDetail - 未支付订单详情""" + + fields = { + "BillItemId": fields.Str(required=False, load_from="BillItemId"), + "Multiple": fields.Int(required=False, load_from="Multiple"), + "ProductId": fields.Int(required=False, load_from="ProductId"), + "PurchaseValue": fields.Int(required=False, load_from="PurchaseValue"), + } + + +class UnpaidOrderInfoSchema(schema.ResponseSchema): + """UnpaidOrderInfo - 未支付订单信息""" + + fields = { + "Amount": fields.Int(required=False, load_from="Amount"), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "EndTime": fields.Int(required=False, load_from="EndTime"), + "OrderDetail": fields.List(UnpaidOrderDetailSchema()), + "OrderNo": fields.Str(required=False, load_from="OrderNo"), + "OrderState": fields.Str(required=False, load_from="OrderState"), + "OrderType": fields.Str(required=False, load_from="OrderType"), + "OriginalPrice": fields.Str(required=False, load_from="OriginalPrice"), + "Quantity": fields.Str(required=False, load_from="Quantity"), + "RegionId": fields.Str(required=False, load_from="RegionId"), + "ResourceId": fields.Str(required=False, load_from="ResourceId"), + "ResourceType": fields.Str(required=False, load_from="ResourceType"), + "StartTime": fields.Int(required=False, load_from="StartTime"), + "TradeNo": fields.Str(required=False, load_from="TradeNo"), + "UpdateTime": fields.Int(required=False, load_from="UpdateTime"), + } + + +class BundleSchema(schema.ResponseSchema): + """Bundle - 轻量应用云主机套餐""" + + fields = { + "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), + "BundleId": fields.Str(required=False, load_from="BundleId"), + "CPU": fields.Int(required=False, load_from="CPU"), + "Memory": fields.Int(required=False, load_from="Memory"), + "SysDiskSpace": fields.Int(required=False, load_from="SysDiskSpace"), + "TrafficPacket": fields.Int(required=False, load_from="TrafficPacket"), + } + + +class ULHostImageSetSchema(schema.ResponseSchema): + """ULHostImageSet - DescribeULHostImage""" + + fields = { + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DisplayName": fields.Str(required=False, load_from="DisplayName"), + "Features": fields.List(fields.Str()), + "ImageDescription": fields.Str( + required=False, load_from="ImageDescription" + ), + "ImageId": fields.Str(required=False, load_from="ImageId"), + "ImageLogoLink": fields.Str(required=False, load_from="ImageLogoLink"), + "ImageName": fields.Str(required=False, load_from="ImageName"), + "ImageSize": fields.Int(required=False, load_from="ImageSize"), + "ImageType": fields.Str(required=False, load_from="ImageType"), + "IntegratedSoftware": fields.Str( + required=False, load_from="IntegratedSoftware" + ), + "MaintainEol": fields.Str(required=False, load_from="MaintainEol"), + "MinimalCPU": fields.Str(required=False, load_from="MinimalCPU"), + "OsName": fields.Str(required=False, load_from="OsName"), + "OsType": fields.Str(required=False, load_from="OsType"), + "SceneCategories": fields.List(fields.Str()), + "State": fields.Str(required=False, load_from="State"), + "Tag": fields.Str(required=False, load_from="Tag"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class ULHostDiskSetSchema(schema.ResponseSchema): + """ULHostDiskSet - 轻量应用主机的磁盘信息""" + + fields = { + "DiskId": fields.Str(required=False, load_from="DiskId"), + "DiskType": fields.Str(required=False, load_from="DiskType"), + "Drive": fields.Str(required=False, load_from="Drive"), + "IsBoot": fields.Str(required=False, load_from="IsBoot"), + "Size": fields.Int(required=False, load_from="Size"), + "Type": fields.Str(required=False, load_from="Type"), + } + + +class ExclusiveUTPInfoSchema(schema.ResponseSchema): + """ExclusiveUTPInfo - 流量包详情""" + + fields = { + "AvailableSize": fields.Int(required=False, load_from="AvailableSize"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "ExcessSize": fields.Int(required=False, load_from="ExcessSize"), + "LastResetTime": fields.Int(required=False, load_from="LastResetTime"), + "NextResetTime": fields.Int(required=False, load_from="NextResetTime"), + "TotalSize": fields.Int(required=False, load_from="TotalSize"), + "UsedSize": fields.Int(required=False, load_from="UsedSize"), + } + + +class ULHostInstanceSetSchema(schema.ResponseSchema): + """ULHostInstanceSet - 轻量应用云主机详情""" + + fields = { + "Apps": fields.List(fields.Str()), + "AutoRenew": fields.Str(required=False, load_from="AutoRenew"), + "CPU": fields.Int(required=False, load_from="CPU"), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DiskSet": fields.List(ULHostDiskSetSchema()), + "EIPExclusiveUTPInfo": ExclusiveUTPInfoSchema(), + "ExclusiveUTPInfo": ExclusiveUTPInfoSchema( + required=False, load_from="ExclusiveUTPInfo" + ), # Deprecated, will be removed at 1.0 + "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "IPSet": fields.List(UHostIPSetSchema()), + "ImageId": fields.Str(required=False, load_from="ImageId"), + "ImageName": fields.Str(required=False, load_from="ImageName"), + "IsExpire": fields.Str(required=False, load_from="IsExpire"), + "Memory": fields.Int(required=False, load_from="Memory"), + "Name": fields.Str(required=False, load_from="Name"), + "Remark": fields.Str(required=False, load_from="Remark"), + "State": fields.Str(required=False, load_from="State"), + "Tag": fields.Str(required=False, load_from="Tag"), + "ULHostId": fields.Str(required=False, load_from="ULHostId"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class DiskUpgradePriceDetailSchema(schema.ResponseSchema): + """DiskUpgradePriceDetail -""" + + fields = { + "Snapshot": fields.Float(required=False, load_from="Snapshot"), + "UDisk": fields.Float(required=False, load_from="UDisk"), + } + + +class CompSharePriceDetailSchema(schema.ResponseSchema): + """CompSharePriceDetail - 算力平台实例询价详情""" + + fields = { + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "CompShareImage": fields.Float( + required=False, load_from="CompShareImage" + ), + "Disks": fields.Float(required=False, load_from="Disks"), + "Instance": fields.Float(required=False, load_from="Instance"), + "InstanceDiscountType": fields.Int( + required=False, load_from="InstanceDiscountType" + ), + "ListPrice": fields.Str(required=False, load_from="ListPrice"), + "OriginalPrice": fields.Float( + required=False, load_from="OriginalPrice" + ), + } + + +class UHostRefundPriceSetSchema(schema.ResponseSchema): + """UHostRefundPriceSet - 删除退费详情""" + + fields = { + "Code": fields.Int(required=True, load_from="Code"), + "ErrMessage": fields.Str(required=False, load_from="ErrMessage"), + "RefundPrice": fields.Float(required=False, load_from="RefundPrice"), + "UHostId": fields.Str(required=True, load_from="UHostId"), + } + + +class CompShareTeamDetailInfoSchema(schema.ResponseSchema): + """CompShareTeamDetailInfo - 团队信息""" + + fields = { + "CompanyId": fields.Int(required=False, load_from="CompanyId"), + "Deleted": fields.Int(required=False, load_from="Deleted"), + "Description": fields.Str(required=False, load_from="Description"), + "Id": fields.Int(required=False, load_from="Id"), + "Name": fields.Str(required=False, load_from="Name"), + } + + +class TeamRelationSchema(schema.ResponseSchema): + """TeamRelation - 团队关系信息""" + + fields = { + "AllocateAmount": fields.Int( + required=False, load_from="AllocateAmount" + ), + "AvailableAmount": fields.Int( + required=False, load_from="AvailableAmount" + ), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "RemarkName": fields.Str(required=False, load_from="RemarkName"), + "Status": fields.Str(required=False, load_from="Status"), + "TeamId": fields.Int(required=False, load_from="TeamId"), + "TeamName": fields.Str(required=False, load_from="TeamName"), + "UserCompanyId": fields.Int(required=False, load_from="UserCompanyId"), + "VirtualCompanyId": fields.Int( + required=False, load_from="VirtualCompanyId" + ), + } + + +class OpenClawModelInfoSchema(schema.ResponseSchema): + """OpenClawModelInfo - OpenClaw 模型信息""" + + fields = { + "Id": fields.Str(required=False, load_from="Id"), + "Name": fields.Str(required=False, load_from="Name"), + } + + +class ULHostPriceSetSchema(schema.ResponseSchema): + """ULHostPriceSet - 轻量应用主机价格详情""" + + fields = { + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "OriginalPrice": fields.Float( + required=False, load_from="OriginalPrice" + ), + "Price": fields.Float(required=False, load_from="Price"), + } + + +class CompShareTeamInfoSchema(schema.ResponseSchema): + """CompShareTeamInfo - 团队列表信息Detail""" + + fields = { + "CompanyId": fields.Int(required=False, load_from="CompanyId"), + "Description": fields.Str(required=False, load_from="Description"), + "Id": fields.Int(required=False, load_from="Id"), + "MemberCount": fields.Int(required=False, load_from="MemberCount"), + "Name": fields.Str(required=False, load_from="Name"), + } + + +class CompShareTeamInviteInfoSchema(schema.ResponseSchema): + """CompShareTeamInviteInfo - 邀请成员信息""" + + fields = { + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "RemarkName": fields.Str(required=False, load_from="RemarkName"), + "Status": fields.Str(required=False, load_from="Status"), + "TeamId": fields.Int(required=False, load_from="TeamId"), + "TeamName": fields.Str(required=False, load_from="TeamName"), + "UserCompanyId": fields.Int(required=False, load_from="UserCompanyId"), + "VirtualCompanyId": fields.Int( + required=False, load_from="VirtualCompanyId" + ), + } + + +class CompShareTeamJoinedInfoSchema(schema.ResponseSchema): + """CompShareTeamJoinedInfo - 加入成员信息""" + + fields = { + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "IsPersonalAccount": fields.Bool( + required=False, load_from="IsPersonalAccount" + ), + "RemarkName": fields.Str(required=False, load_from="RemarkName"), + "Status": fields.Str(required=False, load_from="Status"), + "TeamId": fields.Int(required=False, load_from="TeamId"), + "TeamName": fields.Str(required=False, load_from="TeamName"), + "UserCompanyId": fields.Int(required=False, load_from="UserCompanyId"), + "VirtualCompanyId": fields.Int( + required=False, load_from="VirtualCompanyId" + ), + } + + +class CompShareTeamOperateLogInfoSchema(schema.ResponseSchema): + """CompShareTeamOperateLogInfo - 算力团队操作日志信息""" + + fields = { + "Content": fields.Str(required=False, load_from="Content"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "OperateType": fields.Str(required=False, load_from="OperateType"), + "Status": fields.Str(required=False, load_from="Status"), + } diff --git a/ucloud/services/udb/client.py b/ucloud/services/udb/client.py index 591eed6f..9d345750 100644 --- a/ucloud/services/udb/client.py +++ b/ucloud/services/udb/client.py @@ -16,55 +16,58 @@ def __init__( def backup_udb_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ BackupUDBInstance - 备份UDB实例 + """BackupUDBInstance - 备份UDB实例 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **BackupName** (str) - (Required) 备份名称 - **DBId** (str) - (Required) DB实例Id,该值可以通过DescribeUDBInstance获取 - - **BackupMethod** (str) - 使用的备份方式。(快照备份即物理备份。注意只有SSD版本的mysql实例支持设置为snapshot) + - **BackupMethod** (str) - 使用的备份方式。默认使用逻辑备份(快照备份即物理备份。SSD版本的mysql/mongodb实例支持设置为snapshot,NVMe版本的mysql实例支持设置为xtrabackup) - **Blacklist** (str) - 备份黑名单列表,以 ; 分隔。注意:只有逻辑备份下备份黑名单才生效,快照备份备份黑名单下无效 - **ForceBackup** (bool) - true表示逻辑备份时是使用 --force 参数,false表示不使用 --force 参数。物理备份此参数无效。 - **UseBlacklist** (bool) - 是否使用黑名单备份,默认false - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.BackupUDBInstanceRequestSchema().dumps(d) - # build options - kwargs["max_retries"] = 0 # ignore retry when api is not idempotent - resp = self.invoke("BackupUDBInstance", d, **kwargs) return apis.BackupUDBInstanceResponseSchema().loads(resp) def backup_udb_instance_binlog( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ BackupUDBInstanceBinlog - 备份UDB指定时间段的binlog列表 + """BackupUDBInstanceBinlog - 备份UDB指定时间段的binlog列表 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **BackupFile** (str) - (Required) 需要备份文件,可通过DescribeUDBInstanceBinlog获得 如果要传入多个文件名,以空格键分割,用单引号包含. - **DBId** (str) - (Required) DB实例Id,该值可以通过DescribeUDBInstance获取 - **BackupName** (str) - DB备份文件名称 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.BackupUDBInstanceBinlogRequestSchema().dumps(d) @@ -74,22 +77,25 @@ def backup_udb_instance_binlog( def backup_udb_instance_error_log( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ BackupUDBInstanceErrorLog - 备份UDB指定时间段的errorlog + """BackupUDBInstanceErrorLog - 备份UDB指定时间段的errorlog **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **BackupName** (str) - (Required) 备份名称 - **DBId** (str) - (Required) DB实例Id,该值可以通过DescribeUDBInstance获取 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.BackupUDBInstanceErrorLogRequestSchema().dumps(d) @@ -99,48 +105,82 @@ def backup_udb_instance_error_log( def backup_udb_instance_slow_log( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ BackupUDBInstanceSlowLog - 备份UDB指定时间段的slowlog分析结果 + """BackupUDBInstanceSlowLog - 备份UDB指定时间段的slowlog分析结果 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **BackupName** (str) - (Required) 备份文件名称 - **BeginTime** (int) - (Required) 过滤条件:起始时间(时间戳) - **DBId** (str) - (Required) DB实例Id,该值可以通过DescribeUDBInstance获取 - **EndTime** (int) - (Required) 过滤条件:结束时间(时间戳) - + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.BackupUDBInstanceSlowLogRequestSchema().dumps(d) resp = self.invoke("BackupUDBInstanceSlowLog", d, **kwargs) return apis.BackupUDBInstanceSlowLogResponseSchema().loads(resp) + def change_udb_param_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ChangeUDBParamGroup - 修改配置文件 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DBId** (str) - (Required) DB实例Id + - **GroupId** (str) - (Required) 参数组Id + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ChangeUDBParamGroupRequestSchema().dumps(d) + + resp = self.invoke("ChangeUDBParamGroup", d, **kwargs) + return apis.ChangeUDBParamGroupResponseSchema().loads(resp) + def check_recover_udb_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CheckRecoverUDBInstance - 核查db是否可以使用回档功能 + """CheckRecoverUDBInstance - 核查db是否可以使用回档功能 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **SrcDBId** (str) - (Required) 源实例的Id(只支持普通版DB不支持高可用) - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **LastestTime** (int) - 核查成功返回值为可以回档到的最近时刻,核查失败不返回 - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.CheckRecoverUDBInstanceRequestSchema().dumps(d) @@ -150,21 +190,24 @@ def check_recover_udb_instance( def check_udb_instance_to_ha_allowance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CheckUDBInstanceToHAAllowance - 核查db是否可以升级为高可用 + """CheckUDBInstanceToHAAllowance - 核查db是否可以升级为高可用 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **DBId** (str) - (Required) 实例的Id,该值可以通过DescribeUDBInstance获取 - + **Response** - **Allowance** (str) - Yes ,No ,Yes即可以升级,No为不可以升级 - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.CheckUDBInstanceToHAAllowanceRequestSchema().dumps(d) @@ -174,75 +217,143 @@ def check_udb_instance_to_ha_allowance( def clear_udb_log( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ClearUDBLog - 清除UDB实例的log + """ClearUDBLog - 清除UDB实例的log **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **DBId** (str) - (Required) DB实例的id,该值可以通过DescribeUDBInstance获取 - **LogType** (int) - (Required) 日志类型,10-error(暂不支持)、20-slow(暂不支持 )、30-binlog - **BeforeTime** (int) - 删除时间点(至少前一天)之前log,采用时间戳(秒),默认当 前时间点前一天 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.ClearUDBLogRequestSchema().dumps(d) resp = self.invoke("ClearUDBLog", d, **kwargs) return apis.ClearUDBLogResponseSchema().loads(resp) - def create_udb_instance( + def create_mongo_db_replica_set( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateUDBInstance - 创建UDB实例(包括创建mysql master节点、mongodb primary/configsvr节点和从备份恢复实例) + """CreateMongoDBReplicaSet - 一键创建DB副本集 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **AdminPassword** (str) - (Required) 管理员密码 - - **DBTypeId** (str) - (Required) DB类型id,mysql/mongodb/postgesql按版本细分 1:mysql-5.1,2:mysql-5.5,3:percona-5.5,4:mysql-5.6,5:percona-5.6,6:mysql-5.7,7:percona-5.7,8:mariadb-10.0,9:mongodb-2.4,10:mongodb-2.6,11:mongodb-3.0,12:mongodb-3.2,13:postgresql-9.4,14:postgresql-9.6,14:postgresql-10.4 + - **DBTypeId** (str) - (Required) DB类型id对应的字符串形式 mongodb-3.4,mongodb-3.6,mongodb-4.0 - **DiskSpace** (int) - (Required) 磁盘空间(GB), 暂时支持20G - 3000G - - **MemoryLimit** (int) - (Required) 内存限制(MB),目前支持以下几档 1000M/2000M/4000M/ 6000M/8000M/12000M/16000M/ 24000M/32000M/48000M/ 64000M/96000M + - **MemoryLimit** (int) - (Required) 内存限制(MB),目前支持以下几档 2000M/4000M/ 6000M/8000M/12000M/16000M/ 24000M/32000M/48000M/ 64000M/96000M + - **Name** (str) - (Required) PrimaryDB实例名称,至少6位 + - **ParamGroupId** (int) - (Required) DB实例使用的配置参数组id + - **Port** (int) - (Required) 端口号 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **AdminUser** (str) - 管理员帐户名,默认root + - **BackupCount** (int) - 备份策略,每周备份数量,默认7次 + - **BackupDuration** (int) - 备份策略,备份时间间隔,单位小时计,默认24小时 + - **BackupTime** (int) - 备份策略,备份开始时间,单位小时计,默认1点 + - **CPU** (int) - cpu核数 + - **ChargeType** (str) - Year, Month, Dynamic,Trial,默认: Month + - **ClusterId** (str) - 所属分片集群的ID + - **CouponId** (list) - CouponId.0 代表第一个代金券id,对于传入多个代金券id,后面为 CouponId.1, CouponId.2 以此类推 + - **Quantity** (int) - 购买时长(N个月),默认值1个月。如果为0,代表购买到月底。 + - **SubnetId** (str) - 子网ID + - **VPCId** (str) - VPC的ID + + **Response** + + - **DBIds** (list) - 返回所有副本集成员的Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateMongoDBReplicaSetRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateMongoDBReplicaSet", d, **kwargs) + return apis.CreateMongoDBReplicaSetResponseSchema().loads(resp) + + def create_udb_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUDBInstance - 创建UDB实例(包括创建mysql master节点、mongodb primary/configsvr节点和从备份恢复实例) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **AdminPassword** (str) - (Required) 管理员密码 + - **DBTypeId** (str) - (Required) DB类型,mysql/sqlserver按版本细分 mysql-8.0, mysql-5.6, percona-5.6, mysql-5.7, percona-5.7, sqlserver-2017 + - **DiskSpace** (int) - (Required) 磁盘空间(GB), 暂时支持20G - 32T - **Name** (str) - (Required) 实例名称,至少6位 - **ParamGroupId** (int) - (Required) DB实例使用的配置参数组id - - **Port** (int) - (Required) 端口号,mysql默认3306,mongodb默认27017,postgresql默认5432 - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Port** (int) - (Required) 端口号,mysql默认3306,sqlserver默认1433 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - **AdminUser** (str) - 管理员帐户名,默认root + - **AlarmTemplateId** (str) - 告警模版id - **BackupCount** (int) - 备份策略,每周备份数量,默认7次 - **BackupDuration** (int) - 备份策略,备份时间间隔,单位小时计,默认24小时 - **BackupId** (int) - 备份id,如果指定,则表明从备份恢复实例 - **BackupTime** (int) - 备份策略,备份开始时间,单位小时计,默认1点 - - **BackupZone** (str) - 跨可用区高可用备库所在可用区,参见 `可用区列表 `_ - - **CPU** (int) - cpu核数 + - **BackupURL** (str) - 备份文件的US3内网下载地址 + - **BackupZone** (str) - 跨可用区高可用备库所在可用区,参见 `可用区列表 `_ + - **CPU** (int) - cpu核数,如果db类型为sqlserver,必传参数 + - **CaseSensitivityParam** (int) - mysql大小写参数, 0 为大小写敏感, 1 为大小写不敏感, 目前只针对mysql8.0有效 - **ChargeType** (str) - Year, Month, Dynamic,Trial,默认: Month - - **ClusterRole** (str) - 当DB类型(DBTypeId)为mongodb时,需要指定mongo的角色,可选值为configsrv (配置节点),shardsrv (数据节点) + - **ClusterRole** (str) - 已废弃 - **CouponId** (str) - 使用的代金券id + - **DBSubVersion** (str) - MySQL 小版本号,支持指定小版本进行创建,请通过 DescribeUDBType 接口获取可用版本。 - **DisableSemisync** (bool) - 是否开启异步高可用,默认不填,可置为true - - **HAArch** (str) - 高可用架构:1) haproxy(默认): 当前仅支持mysql。2) sentinel: 基于vip和哨兵节点的架构,当前支持mysql和pg。 - **InstanceMode** (str) - UDB实例模式类型, 可选值如下: "Normal": 普通版UDB实例 "HA": 高可用版UDB实例 默认是"Normal" - - **InstanceType** (str) - UDB数据库机型 + - **InstanceType** (str) - 对于快杰机型,请使用最新的 SpecificationClass 和 StorageClass 字段进行创建。目前仅有少量地域支持 SATA_SSD 存储类型;若创建的是 SATA_SSD 机型,可通过该字段指定。字段说明:SATA_SSD:SATA SSD 机型(仅部分地域支持)NVMe_SSD:快杰机型 + - **Labels** (list) - 见 **CreateUDBInstanceParamLabels** 模型定义 + - **MachineType** (str) - 规格类型 ID,当 SpecificationType = 1 时生效,请通过 ListUDBMachineType 接口获取。 + - **MemoryLimit** (int) - 内存限制(MB)(待废弃,请通过指定MachineType和SpecificationType创建),目前支持以下几档 2000M/4000M/ 6000M/8000M/12000M/16000M/ 24000M/32000M/48000M/ 64000M/96000M/128000M/192000M/256000M/320000M - **Quantity** (int) - 购买时长,默认值1 - - **SSDType** (str) - SSD类型,可选值为"SATA"、"PCI-E",如果UseSSD为true ,则必选 + - **SSDType** (str) - 已废弃 + - **SemisyncFlag** (int) - 半同步开启开关 1:表示开启半同步,2:表示关闭半同步,0:表示默认值,默认也是开启半同步 + - **SpecificationClass** (str) - 规格类型 O: NVMe型, OM: 共享型,N: 通用型 + - **SpecificationType** (str) - 实例计算规格类型,0或不传代表使用内存方式购买,1代表使用内存-cpu可选配比方式购买,需要填写MachineType + - **StorageClass** (str) - 存储类型 CLOUD_SSD: SSD云盘, CLOUD_RSSD: RSSD 云盘, CLOUD_SSD_ESSENTIAL: SSD Essential云盘 ,该字段和SpecificationClass组合优先级比InstanceType字段高 - **SubnetId** (str) - 子网ID - **Tag** (str) - 实例所在的业务组名称 - - **UDBCId** (str) - 专区ID信息(如果这个参数存在这说明是在专区中创建DB) - - **UseSSD** (bool) - 是否使用SSD,默认为false。目前主要可用区、海外机房、新机房只提供SSD资源,非SSD资源不再提供。 - **VPCId** (str) - VPC的ID - + **Response** - **DBId** (str) - BD实例id - + + **Request Model** + + **CreateUDBInstanceParamLabels** + - **Key** (str) - 用户资源标签的键值 + - **Value** (str) - 用户资源标签值 + + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.CreateUDBInstanceRequestSchema().dumps(d) @@ -255,31 +366,39 @@ def create_udb_instance( def create_udb_instance_by_recovery( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateUDBInstanceByRecovery - 创建db,将新创建的db恢复到指定db某个指定时间点 + """CreateUDBInstanceByRecovery - 创建db,将新创建的db恢复到指定db某个指定时间点 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Name** (str) - (Required) 实例名称,至少6位 - **RecoveryTime** (int) - (Required) 恢复到某个时间点的时间戳(UTC时间格式,默认单位秒) - **SrcDBId** (str) - (Required) 源实例的Id + - **AdminPassword** (str) - 管理员密码 (指定库表回档到新实例时有效) - **ChargeType** (str) - Year, Month, Dynamic,Trial,默认: Dynamic - **CouponId** (str) - 使用的代金券id + - **EnableIpV6** (bool) - 是否创建使用ipv6 资源, 默认为false, 或者不填, 创建ipv6为true + - **MachineType** (str) - 规格类型ID,当SpecificationType为1时有效 - **Quantity** (int) - 购买时长,默认值1 + - **SpecificationType** (int) - 实例计算规格类型,0或不传代表使用内存方式购买,1代表使用内存-cpu可选配比方式购买,需要填写MachineType - **SubnetId** (str) - 子网ID + - **Tables** (str) - 指定需要恢复的表, 如果指定该字段则回档实例只有指定的表数据,格式为(库名.表名), 指定多个用逗号隔开,eg: [ udb.test, mysql_school.my_student] - **UDBCId** (str) - 专区的Id - **UseSSD** (bool) - 指定是否是否使用SSD,默认使用主库的配置 - **VPCId** (str) - VPC的ID - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **DBId** (str) - db实例id - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.CreateUDBInstanceByRecoveryRequestSchema().dumps(d) @@ -289,29 +408,97 @@ def create_udb_instance_by_recovery( resp = self.invoke("CreateUDBInstanceByRecovery", d, **kwargs) return apis.CreateUDBInstanceByRecoveryResponseSchema().loads(resp) + def create_udb_my_sql_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUDBMySQLInstance - 创建UDB实例(包括创建mysql NVMe、共享型和O2实例以及从备份恢复实例) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **AdminPassword** (str) - (Required) 管理员密码 + - **DBTypeId** (str) - (Required) DB类型,mysql按版本细分 mysql-8.4, mysql-8.0, mysql-5.7, percona-5.7, mysql-5.6, percona-5.6、mysql-5.5 + - **DiskSpace** (int) - (Required) 磁盘空间(GB), 暂时支持20G - 32T + - **MachineType** (str) - (Required) 规格类型 ID,请通过 ListUDBMachineType 接口获取,返回体中的ID字段为MachineType的值。 + - **Name** (str) - (Required) 实例名称,至少6位 + - **ParamGroupId** (int) - (Required) DB实例使用的配置参数组id + - **Port** (int) - (Required) 端口号,mysql默认3306 + - **SpecificationClass** (str) - (Required) 规格类型 O: NVMe型, O2: O2 ,OM: 共享型 + - **StorageClass** (str) - (Required) 存储类型 CLOUD_RSSD: RSSD 云盘, CLOUD_SSD_ESSENTIAL: SSD Essential云盘 ,该字段和SpecificationClass组合使用,CLOUD_RSSD对应O型,CLOUD_SSD_ESSENTIAL对应OM型(北京2、乌兰察布支持),注:圣保罗、丹佛、哈萨克斯坦地域仅支持O2机型,CLOUD_RSSD对应O2型 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **AlarmTemplateId** (str) - 告警模版id + - **BackupCount** (int) - 备份策略,每周备份数量,默认7次 + - **BackupDuration** (int) - 备份策略,备份时间间隔,单位小时计,默认24小时 + - **BackupId** (int) - 备份id,如果指定,则表明从备份恢复实例 + - **BackupTime** (int) - 备份策略,备份开始时间,单位小时计,默认1点 + - **BackupURL** (str) - 备份文件的US3内网下载地址 + - **BackupZone** (str) - 跨可用区高可用备库所在可用区,参见 `可用区列表 `_ + - **CaseSensitivityParam** (int) - mysql大小写参数, 0 为大小写敏感, 1 为大小写不敏感, 目前只针对mysql8.0有效 + - **ChargeType** (str) - Year, Month, Dynamic,Trial,默认: Month + - **CouponId** (str) - 使用的代金券id + - **DBSubVersion** (str) - MySQL 小版本号,支持指定小版本进行创建,请通过 DescribeUDBType 接口获取可用版本。 + - **DisableSemisync** (bool) - 是否开启异步高可用,默认不填,可置为true + - **InstanceMode** (str) - UDB实例模式类型, 可选值如下: "Normal": 普通版UDB实例 "HA": 高可用版UDB实例 默认是"Normal" + - **Labels** (list) - 见 **CreateUDBMySQLInstanceParamLabels** 模型定义 + - **Quantity** (int) - 购买时长,默认值1 + - **SemisyncFlag** (int) - 半同步开启开关 1:表示开启半同步,2:表示关闭半同步,0:表示默认值,默认也是开启半同步 + - **SubnetId** (str) - 子网ID + - **Tag** (str) - 实例所在的业务组名称 + - **VPCId** (str) - VPC的ID + + **Response** + + - **DBId** (str) - BD实例id + + **Request Model** + + **CreateUDBMySQLInstanceParamLabels** + - **Key** (str) - 用户资源标签的键值 + - **Value** (str) - 用户资源标签值 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateUDBMySQLInstanceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUDBMySQLInstance", d, **kwargs) + return apis.CreateUDBMySQLInstanceResponseSchema().loads(resp) + def create_udb_param_group( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateUDBParamGroup - 从已有配置文件创建新配置文件 + """CreateUDBParamGroup - 从已有配置文件创建新配置文件 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **DBTypeId** (str) - (Required) DB类型id,mysql/mongodb/postgesql按版本细分 1:mysql-5.1,2:mysql-5.5,3:percona-5.5,4:mysql-5.6,5:percona-5.6,6:mysql-5.7,7:percona-5.7,8:mariadb-10.0,9:mongodb-2.4,10:mongodb-2.6,11:mongodb-3.0,12:mongodb-3.2,13:postgresql-9.4,14:postgresql-9.6 - **Description** (str) - (Required) 参数组描述 - **GroupName** (str) - (Required) 新配置参数组名称 - **SrcGroupId** (int) - (Required) 源参数组id - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - **RegionFlag** (bool) - 是否是地域级别的配置文件,默认是false - + **Response** - **GroupId** (int) - 新配置参数组id - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.CreateUDBParamGroupRequestSchema().dumps(d) @@ -324,27 +511,33 @@ def create_udb_param_group( def create_udb_replication_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateUDBReplicationInstance - 创建MongoDB的副本节点(包括仲裁) + """CreateUDBReplicationInstance - 创建MongoDB的副本节点(包括仲裁) **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Name** (str) - (Required) 实例名称,至少6位 - **SrcId** (str) - (Required) primary节点的DBId,该值可以通过DescribeUDBInstance获取 + - **ChargeType** (str) - Year, Month, Dynamic,Trial,默认和主库保持一致 - **CouponId** (str) - 使用的代金券id + - **InstanceType** (str) - UDB数据库机型: "Normal": "标准机型" , "SATA_SSD": "SSD机型" , "PCIE_SSD": "SSD高性能机型" , "Normal_Volume": "标准大容量机型", "SATA_SSD_Volume": "SSD大容量机型" , "PCIE_SSD_Volume": "SSD高性能大容量机型", "NVMe_SSD": "快杰机型" - **IsArbiter** (bool) - 是否是仲裁节点,默认false,仲裁节点按最小机型创建 - **Port** (int) - 端口号,默认27017,取值范围3306至65535。 - - **UseSSD** (bool) - 是否使用SSD,默认不使用 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Quantity** (str) - 购买时长,默认默认和主库保持一致 + - **UseSSD** (bool) - 是否使用SSD,默认为true。目前主要可用区、海外机房、新机房只提供SSD资源,非SSD资源不再提供。 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **DBId** (str) - 创建从节点的DBId - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.CreateUDBReplicationInstanceRequestSchema().dumps(d) @@ -357,12 +550,12 @@ def create_udb_replication_instance( def create_udb_route_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateUDBRouteInstance - 创建mongos实例 + """CreateUDBRouteInstance - 创建mongos实例 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **ConfigsvrId** (list) - (Required) 配置服务器的dbid,允许一个或者三个。 - **DBTypeId** (str) - (Required) DB类型id,mongodb按版本细分有1:mongodb-2.4,2:mongodb-2.6,3:mongodb-3.0,4:mongodb-3.2 - **DiskSpace** (int) - (Required) 磁盘空间(GB), 暂时支持20G - 500G @@ -373,16 +566,19 @@ def create_udb_route_instance( - **ChargeType** (str) - Year, Month, Dynamic,Trial,默认: Month - **CouponId** (str) - 使用的代金券id - **Quantity** (int) - 购买时长,默认值1 - - **UseSSD** (bool) - 是否使用SSD,默认为false - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **UseSSD** (bool) - 是否使用SSD,默认为ture + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **DBId** (str) - db实例id - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.CreateUDBRouteInstanceRequestSchema().dumps(d) @@ -392,35 +588,105 @@ def create_udb_route_instance( resp = self.invoke("CreateUDBRouteInstance", d, **kwargs) return apis.CreateUDBRouteInstanceResponseSchema().loads(resp) + def create_udb_sql_server_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUDBSQLServerInstance - 创建UDB实例(包括创建SQLServer实例以及从备份恢复实例) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **AdminPassword** (str) - (Required) 管理员密码 + - **DBTypeId** (str) - (Required) DB类型,SQL Server按版本细分 sqlserver-2017、sqlserver-2019、sqlserver-2022 + - **DiskSpace** (int) - (Required) 磁盘空间(GB), 暂时支持20G - 32T + - **Name** (str) - (Required) 实例名称,至少6位 + - **Port** (int) - (Required) 端口号,sqlserver默认1433 + - **SpecificationClass** (str) - (Required) 规格类型 O: NVMe型 + - **StorageClass** (str) - (Required) 存储类型 CLOUD_RSSD: RSSD 云盘,该字段和SpecificationClass组合使用,CLOUD_RSSD对应O型 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **AlarmTemplateId** (str) - 告警模版id + - **BackupCount** (int) - 备份策略,每周备份数量,默认7次 + - **BackupDuration** (int) - 备份策略,备份时间间隔,单位小时计,默认24小时 + - **BackupId** (int) - 备份id,如果指定,则表明从备份恢复实例 + - **BackupTime** (int) - 备份策略,备份开始时间,单位小时计,默认1点 + - **BackupURL** (str) - 备份文件的US3内网下载地址 + - **CPU** (int) - CPU核,如果是创建的SQL Server普通版,该参数必传,目前支持2/4/8/16/32/64 + - **ChargeType** (str) - Year, Month, Dynamic,Trial,默认: Month + - **CouponId** (str) - 使用的代金券id + - **InstanceMode** (str) - UDB实例模式类型, 可选值如下: "Normal": SQL Server普通版实例 "HA": SQL Server集群版实例 默认是"Normal" + - **Labels** (list) - 见 **CreateUDBSQLServerInstanceParamLabels** 模型定义 + - **MachineType** (str) - 规格类型 ID,如果创建的是SQL Server集群版,该参数必填,请通过 ListUDBMachineType 接口获取,返回体中的ID字段为MachineType的值。 + - **MemoryLimit** (int) - 内存限制(MB),如果是创建的SQL Server普通版,该参数必传,目前支持以下几档 2000M/4000M/ 6000M/8000M/12000M/16000M/ 24000M/32000M/48000M/ 64000M/96000M/128000M/192000M/256000M/320000M + - **Quantity** (int) - 购买时长,默认值1 + - **SubnetId** (str) - 子网ID,如果创建的是SQL Server集群版,该参数必填 + - **Tag** (str) - 实例所在的业务组名称 + - **VPCId** (str) - VPC的ID,如果创建的是SQL Server集群版,该参数必填 + + **Response** + + - **DBId** (str) - BD实例id + + **Request Model** + + **CreateUDBSQLServerInstanceParamLabels** + - **Key** (str) - 用户资源标签的键值 + - **Value** (str) - 用户资源标签值 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateUDBSQLServerInstanceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUDBSQLServerInstance", d, **kwargs) + return apis.CreateUDBSQLServerInstanceResponseSchema().loads(resp) + def create_udb_slave( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateUDBSlave - 创建UDB实例的slave + """CreateUDBSlave - 创建UDB实例的slave **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Name** (str) - (Required) 实例名称,至少6位 - **SrcId** (str) - (Required) master实例的DBId,该值可以通过DescribeUDBInstance获取 + - **ChargeType** (str) - Year, Month, Dynamic,Trial,默认和主库保持一致 - **CouponId** (str) - 使用的代金券id + - **DelaySeconds** (int) - 设置从库的延时复制时长(单位秒) - **DiskSpace** (int) - 磁盘空间(GB), 暂时支持20G - 3000G(API支持,前端暂时只开放内存定制) - - **InstanceMode** (str) - UDB实例部署模式,可选值如下:Normal: 普通单点实例HA: 高可用部署实例 - - **InstanceType** (str) - UDB实例类型:Normal和SATA_SSD + - **IsCreatePhysically** (bool) - 使用物理方式创建从库,目前仅限创建快杰从库,默认为false - **IsLock** (bool) - 是否锁主库,默认为true - - **MemoryLimit** (int) - 内存限制(MB),目前支持以下几档 1000M/2000M/4000M/ 6000M/8000M/12000M/16000M/ 24000M/32000M/48000M/ 64000M/96000M - - **Port** (int) - 端口号,mysql默认3306 - - **SSDType** (str) - SSD类型,可选值为"SATA"、"PCI-E",如果UseSSD为true ,则必选 - - **UseSSD** (bool) - 是否使用SSD,默认为false - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **MachineType** (str) - 规格类型ID,当SpecificationType为1时有效 + - **MemoryLimit** (int) - 内存限制(MB),目前支持以下几档 2000M/4000M/ 6000M/8000M/12000M/16000M/ 24000M/32000M/48000M/ 64000M/96000M/128000M/192000M/256000M/320000M + - **ParamGroupId** (int) - DB实例使用的配置参数组id,默认和主库保持一致 + - **Port** (int) - 端口号 + - **Quantity** (int) - 购买时长,默认默认和主库保持一致 + - **SSDType** (str) - 仅对主为SSD型实例有效。 可选值"SATA","NVMe" + - **SpecificationType** (int) - 实例计算规格类型,0或不传代表使用内存方式购买,1代表使用内存-cpu可选配比方式购买,需要填写MachineType + - **SubnetId** (str) - 子网ID(如果不传用默认子网) + - **VPCId** (str) - VPCID(如果不传用默认的VPC) + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **DBId** (str) - 创建slave的DBId - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.CreateUDBSlaveRequestSchema().dumps(d) @@ -433,47 +699,56 @@ def create_udb_slave( def delete_udb_backup( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeleteUDBBackup - 删除UDB实例备份 + """DeleteUDBBackup - **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **BackupId** (int) - (Required) 备份id,可通过DescribeUDBBackup获得 - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - - **BackupZone** (str) - 跨可用区高可用备库所在可用区,参见[可用区列表] - + - **ProjectId** (str) - (Config) + - **Region** (str) - (Config) + - **BackupId** (int) - (Required) + - **Zone** (str) - (Required) + - **BackupZone** (str) - + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DeleteUDBBackupRequestSchema().dumps(d) + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + resp = self.invoke("DeleteUDBBackup", d, **kwargs) return apis.DeleteUDBBackupResponseSchema().loads(resp) def delete_udb_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeleteUDBInstance - 删除UDB实例 + """DeleteUDBInstance - 删除UDB实例 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **DBId** (str) - (Required) DB实例的id,该值可以通过DescribeUDBInstance获取 - **UDBCId** (str) - 专区ID - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DeleteUDBInstanceRequestSchema().dumps(d) @@ -483,22 +758,25 @@ def delete_udb_instance( def delete_udb_log_package( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeleteUDBLogPackage - 删除UDB日志包 + """DeleteUDBLogPackage - 删除UDB日志包 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **BackupId** (int) - (Required) 日志包id,可通过DescribeUDBLogPackage获得 - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - **BackupZone** (str) - 跨可用区高可用备库所在可用区 - + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DeleteUDBLogPackageRequestSchema().dumps(d) @@ -508,56 +786,210 @@ def delete_udb_log_package( def delete_udb_param_group( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeleteUDBParamGroup - 删除配置参数组 + """DeleteUDBParamGroup - 删除配置参数组 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **GroupId** (int) - (Required) 参数组id,可通过DescribeUDBParamGroup获取 - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - **RegionFlag** (bool) - 是否属于地域级别 - + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DeleteUDBParamGroupRequestSchema().dumps(d) resp = self.invoke("DeleteUDBParamGroup", d, **kwargs) return apis.DeleteUDBParamGroupResponseSchema().loads(resp) + def describe_mongo_db_sharded_cluster( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeMongoDBShardedCluster - + + **Request** + + - **ProjectId** (str) - (Config) + - **Region** (str) - (Config) + - **Limit** (int) - (Required) + - **Offset** (int) - (Required) + - **Zone** (str) - (Required) + - **ClusterRole** (str) - + - **ShardedCluster** (str) - + + **Response** + + - **DataSet** (list) - 见 **UDBInstanceSet** 模型定义 + - **ShardedClusterSet** (list) - 见 **MongoDBShardedClusterSet** 模型定义 + - **TotalCount** (int) - + + **Response Model** + + **UFileDataSet** + - **Bucket** (str) - + - **TokenID** (str) - + + + **UDBSlaveInstanceSet** + - **AdminUser** (str) - + - **BackupBeginTime** (int) - + - **BackupBlacklist** (str) - + - **BackupCount** (int) - + - **BackupDate** (str) - + - **BackupDuration** (int) - + - **CaseSensitivityParam** (int) - + - **ChargeType** (str) - + - **ClusterRole** (str) - + - **CreateTime** (int) - + - **DBId** (str) - + - **DBTypeId** (str) - + - **DataFileSize** (float) - + - **DiskSpace** (int) - + - **DiskUsedSize** (float) - + - **ExpiredTime** (int) - + - **IPv6Address** (str) - + - **InstanceMode** (str) - + - **InstanceType** (str) - + - **InstanceTypeId** (int) - + - **LogFileSize** (float) - + - **MachineType** (str) - + - **MemoryLimit** (int) - + - **ModifyTime** (int) - + - **Name** (str) - + - **ParamGroupId** (int) - + - **Port** (int) - + - **ReplicationDelaySeconds** (int) - + - **Role** (str) - + - **SSDType** (str) - + - **SpecificationType** (int) - + - **SrcDBId** (str) - + - **State** (str) - + - **SubnetId** (str) - + - **SystemFileSize** (float) - + - **Tag** (str) - + - **UseSSD** (bool) - + - **VPCId** (str) - + - **VirtualIP** (str) - + - **VirtualIPMac** (str) - + - **Zone** (str) - + + + **UDBInstanceSet** + - **AdminUser** (str) - + - **BackupBeginTime** (int) - + - **BackupBlacklist** (str) - + - **BackupCount** (int) - + - **BackupDate** (str) - + - **BackupDuration** (int) - + - **BackupMethod** (str) - + - **BackupZone** (str) - + - **CPU** (int) - + - **CaseSensitivityParam** (int) - + - **ChargeType** (str) - + - **CluserRole** (str) - + - **ClusterRole** (str) - + - **CreateTime** (int) - + - **DBId** (str) - + - **DBSubVersion** (str) - + - **DBTypeId** (str) - + - **DataFileSize** (float) - + - **DataSet** (list) - 见 **UDBSlaveInstanceSet** 模型定义 + - **DiskSpace** (int) - + - **DiskUsedSize** (float) - + - **EnableSSL** (int) - + - **ExpiredTime** (int) - + - **IPv6Address** (str) - + - **InstanceMode** (str) - + - **InstanceType** (str) - + - **InstanceTypeId** (int) - + - **LogFileSize** (float) - + - **MachineType** (str) - + - **MemoryLimit** (int) - + - **ModifyTime** (int) - + - **Name** (str) - + - **ParamGroupId** (int) - + - **Port** (int) - + - **Role** (str) - + - **SSDType** (str) - + - **SSLExpirationTime** (int) - + - **SpecificationType** (int) - + - **SrcDBId** (str) - + - **State** (str) - + - **SubnetId** (str) - + - **SystemFileSize** (float) - + - **Tag** (str) - + - **UseSSD** (bool) - + - **UserUFileData** (dict) - 见 **UFileDataSet** 模型定义 + - **VPCId** (str) - + - **VirtualIP** (str) - + - **VirtualIPMac** (str) - + - **Zone** (str) - + + + **MongoDBShardedClusterSet** + - **CreateTime** (int) - + - **DBId** (str) - + - **DBTypeId** (str) - + - **MongosCount** (int) - + - **Name** (str) - + - **ShardsrvCount** (int) - + - **SubnetId** (str) - + - **Tag** (str) - + - **VPCId** (str) - + - **VirtualIPs** (list) - + - **Zone** (str) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeMongoDBShardedClusterRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("DescribeMongoDBShardedCluster", d, **kwargs) + return apis.DescribeMongoDBShardedClusterResponseSchema().loads(resp) + def describe_udb_backup( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUDBBackup - 列表UDB实例备份信息.Zone不填表示多可用区,填代表单可用区 + """DescribeUDBBackup - 列表UDB实例备份信息.Zone不填表示多可用区,填代表单可用区 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Limit** (int) - (Required) 分页显示的条目数,列表操作则指定 - **Offset** (int) - (Required) 分页显示的起始偏移,列表操作则指定 - - **BackupId** (int) - 如果填了BackupId, 那么只拉取这个备份的记录 - **BackupType** (int) - 备份类型,取值为0或1,0表示自动,1表示手动 - **BeginTime** (int) - 过滤条件:起始时间(Unix时间戳) - **ClassType** (str) - 如果未指定GroupId,则可选是否选取特定DB类型的配置(sql, nosql, postgresql, sqlserver) - **DBId** (str) - DB实例Id,如果指定,则只获取该db的备份信息 该值可以通过DescribeUDBInstance获取 - **EndTime** (int) - 过滤条件:结束时间(Unix时间戳) - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **DataSet** (list) - 见 **UDBBackupSet** 模型定义 - **TotalCount** (int) - 满足条件备份总数,如果指定dbid,则是该db备份总数 - + **Response Model** - - **UDBBackupSet** - + + **UDBBackupSet** - **BackupEndTime** (int) - 备份完成时间(Unix时间戳) - **BackupId** (int) - 备份id - **BackupName** (str) - 备份名称 @@ -568,12 +1000,17 @@ def describe_udb_backup( - **DBId** (str) - dbid - **DBName** (str) - 对应的db名称 - **ErrorInfo** (str) - 备份错误信息 + - **MD5** (str) - 备份文件的MD5值,备份完成后显示,备份中或备份失败时为空,目前只支持Mysql NVMe机型与Mongo - **State** (str) - 备份状态 Backuping // 备份中 Success // 备份成功 Failed // 备份失败 Expired // 备份过期 - **Zone** (str) - 备份所在可用区 + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUDBBackupRequestSchema().dumps(d) @@ -583,48 +1020,102 @@ def describe_udb_backup( def describe_udb_backup_blacklist( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUDBBackupBlacklist - 获取UDB实例的备份黑名单 + """DescribeUDBBackupBlacklist - 获取UDB实例的备份黑名单 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **DBId** (str) - (Required) DB实例Id,该值可以通过DescribeUDBInstance获取 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **Blacklist** (str) - DB的黑名单列表, db.%为指定库 dbname.tablename为指定表 - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUDBBackupBlacklistRequestSchema().dumps(d) resp = self.invoke("DescribeUDBBackupBlacklist", d, **kwargs) return apis.DescribeUDBBackupBlacklistResponseSchema().loads(resp) + def describe_udb_binlog_backup( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUDBBinlogBackup - 列表UDB实例Binlog自动备份信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - (Required) 分页显示的条目数,列表操作则指定 + - **Offset** (int) - (Required) 分页显示的起始偏移,列表操作则指定 + - **BeginTime** (int) - 过滤条件:起始时间(时间戳) + - **DBId** (str) - DB实例Id,如果指定,则只获取该db的备份信息; 当Type为2时必填 + - **EndTime** (int) - 过滤条件:结束时间(时间戳) + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **DataSet** (list) - 见 **BinlogBackupSet** 模型定义 + - **TotalCount** (int) - 备份总数,如果指定dbid,则是该db备份总数 + + **Response Model** + + **BinlogBackupSet** + - **BackupId** (int) - 备份id + - **BackupName** (str) - 备份名称 + - **BackupSize** (int) - 备份文件大小 + - **BackupTime** (int) - 备份时间 + - **BinlogType** (str) - binlog备份类型 Manual:手动备份 ,Auto:自动备份 + - **DBId** (str) - dbid + - **LogEndTime** (int) - 日志结束时间 + - **LogStartTime** (int) - 日志开始时间 + - **ServerId** (str) - 节点标识ID + - **State** (str) - 备份状态 Backuping // 备份中 Success // 备份成功 Failed // 备份失败 Expired // 备份过期 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUDBBinlogBackupRequestSchema().dumps(d) + + resp = self.invoke("DescribeUDBBinlogBackup", d, **kwargs) + return apis.DescribeUDBBinlogBackupResponseSchema().loads(resp) + def describe_udb_binlog_backup_url( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUDBBinlogBackupURL - 获取UDB的Binlog备份地址 + """DescribeUDBBinlogBackupURL - 获取UDB的Binlog或者错误日志或者慢查询日志的备份地址 **Request** - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **BackupId** (int) - (Required) DB实例binlog备份ID,可以从DescribeUDBLogPackage结果当中获得 + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BackupId** (int) - (Required) DB实例日志备份ID,可以从DescribeUDBLogPackage结果当中获得 + - **BinlogType** (str) - (Required) binlog备份类型 Manual:手动备份 ,Auto:自动备份 - **DBId** (str) - (Required) DB实例Id - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **BackupPath** (str) - DB实例备份文件的公网地址 - **InnerBackupPath** (str) - DB实例备份文件的内网地址 - + """ # build request - d = {"Region": self.config.region} + d = { + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUDBBinlogBackupURLRequestSchema().dumps(d) @@ -634,36 +1125,38 @@ def describe_udb_binlog_backup_url( def describe_udb_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUDBInstance - 获取UDB实例信息,支持两类操作:(1)指定DBId用于获取该db的信息;(2)指定ClassType、Offset、Limit用于列表操作,查询某一个类型db。 + """DescribeUDBInstance - 获取UDB实例信息,支持两类操作:(1)指定DBId用于获取该db的信息;(2)指定ClassType、Offset、Limit用于列表操作,查询某一个类型db。 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **ClassType** (str) - DB种类,如果是列表操作,则需要指定,不区分大小写,其取值如下:mysql: SQL;mongo: NOSQL;postgresql: postgresql - **DBId** (str) - DB实例id,如果指定则获取单个db实例的描述,否则为列表操作。 指定DBId时无需填写ClassType、Offset、Limit - **IncludeSlaves** (bool) - 当只获取这个特定DBId的信息时,如果有该选项,那么把这个DBId实例的所有从库信息一起拉取并返回 - **IsInUDBC** (bool) - 是否查看专区里面DB - **Limit** (int) - 分页显示数量,列表操作时必填 - **Offset** (int) - 分页显示起始偏移位置,列表操作时必填 + - **Tag** (str) - 根据 业务组 筛选DB - **UDBCId** (str) - IsInUDBC为True,UDBCId为空,说明查看整个可用区的专区的db,如果UDBId不为空则只查看此专区下面的db - - **Zone** (str) - 可用区,不填时默认全部可用区。参见 `可用区列表 `_ - + - **VPCId** (str) - 根据VPCId筛选DB + - **Zone** (str) - 可用区,不填时默认全部可用区。参见 `可用区列表 `_ + **Response** - **DataSet** (list) - 见 **UDBInstanceSet** 模型定义 - **TotalCount** (int) - 用户db组的数量,对于 mysql: 主从结对数量,没有slave,则只有master mongodb: 副本集数量 - + **Response Model** - - **UDBSlaveInstanceSet** - + + **UDBSlaveInstanceSet** - **AdminUser** (str) - 管理员帐户名,默认root - **BackupBeginTime** (int) - 备份策略,不可修改,开始时间,单位小时计,默认3点 - **BackupBlacklist** (str) - 备份策略,备份黑名单,mongodb则不适用 - **BackupCount** (int) - 备份策略,不可修改,备份文件保留的数量,默认7次 - **BackupDate** (str) - 备份日期标记位。共7位,每一位为一周中一天的备份情况 0表示关闭当天备份,1表示打开当天备份。最右边的一位 为星期天的备份开关,其余从右到左依次为星期一到星期 六的备份配置开关,每周必须至少设置两天备份。 例如:1100000 表示打开星期六和星期五的自动备份功能 - **BackupDuration** (int) - 备份策略,一天内备份时间间隔,单位小时,默认24小时 + - **CaseSensitivityParam** (int) - 0 区分大小写, 1不区分, 只针对mysql8.0 - **ChargeType** (str) - Year, Month, Dynamic,Trial,默认: Dynamic - **ClusterRole** (str) - 当DB类型为mongodb时,返回该实例所在集群中的角色,包括:mongos、configsrv_sccc、configsrv_csrs、shardsrv_datanode、shardsrv_arbiter,其中congfigsrv分为sccc和csrs两种模式,shardsrv分为datanode和arbiter两种模式 - **CreateTime** (int) - DB实例创建时间,采用UTC计时时间戳 @@ -677,15 +1170,18 @@ def describe_udb_instance( - **InstanceType** (str) - UDB数据库机型 - **InstanceTypeId** (int) - UDB数据库机型ID - **LogFileSize** (float) - DB实例日志文件大小,单位GB + - **MachineType** (str) - 规格类型ID,当SpecificationType为1时有效 - **MemoryLimit** (int) - 内存限制(MB),默认根据配置机型 - **ModifyTime** (int) - DB实例修改时间,采用UTC计时时间戳 - **Name** (str) - 实例名称,至少6位 - **ParamGroupId** (int) - DB实例使用的配置参数组id - **Port** (int) - 端口号,mysql默认3306,mongodb默认27017 + - **ReplicationDelaySeconds** (int) - 延时从库时长 - **Role** (str) - DB实例角色,mysql区分master/slave,mongodb多种角色 - **SSDType** (str) - SSD类型,SATA/PCI-E + - **SpecificationType** (int) - 实例计算规格类型,0或不传代表使用内存方式购买,1代表使用内存-cpu可选配比方式购买,需要填写MachineType - **SrcDBId** (str) - 对mysql的slave而言是master的DBId,对master则为空, 对mongodb则是副本集id - - **State** (str) - DB状态标记 Init:初始化中,Fail:安装失败,Starting:启动中,Running:运行,Shutdown:关闭中,Shutoff:已关闭,Delete:已删除,Upgrading:升级中,Promoting:提升为独库进行中,Recovering:恢复中,Recover fail:恢复失败 + - **State** (str) - DB状态标记 Init:初始化中,Fail:安装失败,Starting:启动中,Running:运行,Shutdown:关闭中,Shutoff:已关闭,Delete:已删除,Upgrading:升级中,Promoting:提升为独库进行中,Recovering:恢复中,Recover fail:恢复失败,Remakeing:重做中,RemakeFail:重做失败, MajorVersionUpgrading:小版本升级中,MajorVersionUpgradeWaitForSwitch:高可用等待切换,MajorVersionUpgradeFail - **SubnetId** (str) - 子网ID - **SystemFileSize** (float) - DB实例系统文件大小,单位GB - **Tag** (str) - 获取资源其他信息 @@ -695,50 +1191,69 @@ def describe_udb_instance( - **VirtualIPMac** (str) - DB实例虚ip的mac地址 - **Zone** (str) - 可用区 - **UDBInstanceSet** - + + **UFileDataSet** + - **Bucket** (str) - bucket名称 + - **TokenID** (str) - Ufile的令牌tokenid + + + **UDBInstanceSet** - **AdminUser** (str) - 管理员帐户名,默认root - **BackupBeginTime** (int) - 备份策略,不可修改,开始时间,单位小时计,默认3点 - **BackupBlacklist** (str) - 备份策略,备份黑名单,mongodb则不适用 - **BackupCount** (int) - 备份策略,不可修改,备份文件保留的数量,默认7次 - **BackupDate** (str) - 备份日期标记位。共7位,每一位为一周中一天的备份情况 0表示关闭当天备份,1表示打开当天备份。最右边的一位 为星期天的备份开关,其余从右到左依次为星期一到星期 六的备份配置开关,每周必须至少设置两天备份。 例如:1100000 表示打开星期六和星期五的自动备份功能 - **BackupDuration** (int) - 备份策略,一天内备份时间间隔,单位小时,默认24小时 + - **BackupMethod** (str) - 默认的备份方式,nobackup表示不备份, snapshot 表示使用快照备份,logic 表示使用逻辑备份,xtrabackup表示使用物理备份。 - **BackupZone** (str) - 跨可用区高可用备库所在可用区 + - **CPU** (int) - CPU核数 + - **CaseSensitivityParam** (int) - 0区分大小写, 1不分区 - **ChargeType** (str) - Year, Month, Dynamic,Trial,默认: Dynamic - - **CluserRole** (str) - 当DB类型为mongodb时,返回该实例所在集群中的角色,包括:mongos、configsrv_sccc、configsrv_csrs、shardsrv_datanode、shardsrv_arbiter,其中congfigsrv分为sccc和csrs两种模式,shardsrv分为datanode和arbiter两种模式 + - **ClusterRole** (str) - 当DB类型为mongodb时,返回该实例所在集群中的角色,包括:mongos、configsrv_sccc、configsrv_csrs、shardsrv_datanode、shardsrv_arbiter,其中congfigsrv分为sccc和csrs两种模式,shardsrv分为datanode和arbiter两种模式 - **CreateTime** (int) - DB实例创建时间,采用UTC计时时间戳 - **DBId** (str) - DB实例id + - **DBSubVersion** (str) - mysql实例提供具体小版本信息 - **DBTypeId** (str) - DB类型id,mysql/mongodb按版本细分各有一个id 目前id的取值范围为[1,7],数值对应的版本如下: 1:mysql-5.5,2:mysql-5.1,3:percona-5.5 4:mongodb-2.4,5:mongodb-2.6,6:mysql-5.6, 7:percona-5.6 - **DataFileSize** (float) - DB实例数据文件大小,单位GB - **DataSet** (list) - 见 **UDBSlaveInstanceSet** 模型定义 - **DiskSpace** (int) - 磁盘空间(GB), 默认根据配置机型 - **DiskUsedSize** (float) - DB实例磁盘已使用空间,单位GB + - **EnableSSL** (int) - mysql是否开启了SSL;1->未开启 2->开启 - **ExpiredTime** (int) - DB实例过期时间,采用UTC计时时间戳 + - **IPv6Address** (str) - 该实例的ipv6地址 - **InstanceMode** (str) - UDB实例模式类型, 可选值如下: “Normal”: 普通版UDB实例 “HA”: 高可用版UDB实例 - **InstanceType** (str) - UDB数据库机型 - - **InstanceTypeId** (int) - UDB数据库机型ID + - **InstanceTypeId** (int) - UDB数据库机型ID (已弃用) - **LogFileSize** (float) - DB实例日志文件大小,单位GB + - **MachineType** (str) - 数据库机型规格 - **MemoryLimit** (int) - 内存限制(MB),默认根据配置机型 - **ModifyTime** (int) - DB实例修改时间,采用UTC计时时间戳 - **Name** (str) - 实例名称,至少6位 - **ParamGroupId** (int) - DB实例使用的配置参数组id - **Port** (int) - 端口号,mysql默认3306,mongodb默认27017 - **Role** (str) - DB实例角色,mysql区分master/slave,mongodb多种角色 - - **SSDType** (str) - SSD类型,SATA/PCI-E + - **SSDType** (str) - SSD类型,SATA/PCI-E/NVMe + - **SSLExpirationTime** (int) - SSL到期时间 + - **SpecificationType** (int) - 是否使用可选cpu类型规格 - **SrcDBId** (str) - 对mysql的slave而言是master的DBId,对master则为空, 对mongodb则是副本集id - - **State** (str) - DB状态标记 Init:初始化中,Fail:安装失败,Starting:启动中,Running:运行,Shutdown:关闭中,Shutoff:已关闭,Delete:已删除,Upgrading:升级中,Promoting:提升为独库进行中,Recovering:恢复中,Recover fail:恢复失败 + - **State** (str) - DB状态标记 Init:初始化中,Fail:安装失败,Starting:启动中,Running:运行,Shutdown:关闭中,Shutoff:已关闭,Delete:已删除,Upgrading:升级中,Promoting:提升为独库进行中,Recovering:恢复中,Recover fail:恢复失败, Remakeing:重做中,RemakeFail:重做失败,VersionUpgrading:小版本升级中,VersionUpgradeWaitForSwitch:高可用等待切换,VersionUpgradeFail:小版本升级失败,UpdatingSSL:修改SSL中,UpdateSSLFail:修改SSL失败,MajorVersionUpgrading:小版本升级中,MajorVersionUpgradeWaitForSwitch:高可用等待切换,MajorVersionUpgradeFail - **SubnetId** (str) - 子网ID - **SystemFileSize** (float) - DB实例系统文件大小,单位GB - **Tag** (str) - 获取资源其他信息 - **UseSSD** (bool) - 是否使用SSD + - **UserUFileData** (dict) - 见 **UFileDataSet** 模型定义 - **VPCId** (str) - VPC的ID - **VirtualIP** (str) - DB实例虚ip - **VirtualIPMac** (str) - DB实例虚ip的mac地址 - **Zone** (str) - DB实例所在可用区 + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUDBInstanceRequestSchema().dumps(d) @@ -748,25 +1263,28 @@ def describe_udb_instance( def describe_udb_instance_backup_state( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUDBInstanceBackupState - 获取UDB实例备份状态 + """DescribeUDBInstanceBackupState - 获取UDB实例备份状态 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **BackupId** (int) - (Required) 备份记录ID - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - **BackupZone** (str) - 跨可用区高可用备库所在可用区,参见[可用区列表] - + **Response** - - **BackupEndTime** (int) - - - **BackupSize** (int) - + - **BackupEndTime** (int) - + - **BackupSize** (int) - - **State** (str) - 备份状态 0 Backuping // 备份中 1 Success // 备份成功 2 Failed // 备份失败 3 Expired // 备份过期 - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUDBInstanceBackupStateRequestSchema().dumps(d) @@ -776,24 +1294,29 @@ def describe_udb_instance_backup_state( def describe_udb_instance_backup_url( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUDBInstanceBackupURL - 获取UDB备份下载地址 + """DescribeUDBInstanceBackupURL - 获取UDB备份下载地址 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **BackupId** (int) - (Required) DB实例备份ID,该值可以通过DescribeUDBBackup获取 - **DBId** (str) - (Required) DB实例Id,该值可通过DescribeUDBInstance获取 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **ValidTime** (int) - DB响应中URL的过期时间,该值最小默认4小时,最大7天。不填默认为四小时。(单位/秒) + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **BackupPath** (str) - DB实例备份文件公网的地址 - **InnerBackupPath** (str) - DB实例备份文件内网的地址 - + - **MD5** (str) - 备份文件的md5值 + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUDBInstanceBackupURLRequestSchema().dumps(d) @@ -803,33 +1326,36 @@ def describe_udb_instance_backup_url( def describe_udb_instance_binlog( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUDBInstanceBinlog - 获取UDB指定时间段的binlog列表 + """DescribeUDBInstanceBinlog - 获取UDB指定时间段的binlog列表 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **BeginTime** (int) - (Required) 过滤条件:起始时间(时间戳) - **DBId** (str) - (Required) DB实例Id - **EndTime** (int) - (Required) 过滤条件:结束时间(时间戳) - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **DataSet** (list) - 见 **UDBInstanceBinlogSet** 模型定义 - + **Response Model** - - **UDBInstanceBinlogSet** - + + **UDBInstanceBinlogSet** - **BeginTime** (int) - Binlog文件生成时间(时间戳) - **EndTime** (int) - Binlog文件结束时间(时间戳) - **Name** (str) - Binlog文件名 - **Size** (int) - Binlog文件大小 + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUDBInstanceBinlogRequestSchema().dumps(d) @@ -839,24 +1365,26 @@ def describe_udb_instance_binlog( def describe_udb_instance_binlog_backup_state( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUDBInstanceBinlogBackupState - 获取udb实例备份状态 + """DescribeUDBInstanceBinlogBackupState - 获取udb实例备份状态 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **BackupId** (int) - (Required) 备份记录ID - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - **BackupZone** (str) - 跨可用区高可用备库所在可用区 - + **Response** - - **BackupSize** (int) - 备份文件大小(字节) - **State** (str) - 备份状态 0 Backuping // 备份中 1 Success // 备份成功 2 Failed // 备份失败 3 Expired // 备份过期 - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUDBInstanceBinlogBackupStateRequestSchema().dumps(d) @@ -865,39 +1393,78 @@ def describe_udb_instance_binlog_backup_state( resp ) + def describe_udb_instance_log( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUDBInstanceLog - 查询某一段时间内UDB的错误日志或慢查询日志 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BeginTime** (int) - (Required) 查询的日志开始的时间戳(Unix Timestamp)。对于实时查询,这个参数应该是上次轮询请求时的时间戳,后台会返回从该值到当前时间的日志内容。 + - **DBId** (str) - (Required) 实例ID + - **EndTime** (int) - (Required) 查询日志的结束时间戳(Unix Timestamp),对于实时查询不传该值,与BeginTime的差值不超过24小时:(EndTime-BeginTime) < 24*60*60 + - **LogType** (str) - (Required) 查询日志的类型error:错误日志;slow:慢日志 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **Log** (str) - 查询到的日志内容,一段纯文本 + - **NextTime** (str) - 此次查询到的日志的下一个时间,用于下一次轮询时的BeginTime参数;如果日志查询结束则返回为空,前端结束查询 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUDBInstanceLogRequestSchema().dumps(d) + + resp = self.invoke("DescribeUDBInstanceLog", d, **kwargs) + return apis.DescribeUDBInstanceLogResponseSchema().loads(resp) + def describe_udb_instance_price( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUDBInstancePrice - 获取UDB实例价格信息 + """DescribeUDBInstancePrice - 获取UDB实例价格信息 **Request** - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **DBTypeId** (str) - (Required) UDB实例的DB版本字符串 - **DiskSpace** (int) - (Required) 磁盘空间(GB),暂时支持20(GB) - 3000(GB), 输入不带单位 - - **MemoryLimit** (int) - (Required) 内存限制(MB),单位为MB.目前支持:1000-96000 - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **MemoryLimit** (int) - (Required) 内存限制(MB),单位为MB.目前支持:2000-96000 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **CPU** (int) - CPU个数,如果db类型为sqlserver,则为必填参数 - **ChargeType** (str) - Year,按年付费; Month,按月付费 Dynamic,按需付费(需开启权限) Trial,试用(需开启权限)默认为月付 - **Count** (int) - 购买DB实例数量,最大数量为10台, 默认为1台 - - **InstanceMode** (str) - 实例的部署类型。可选值为:Normal: 普通单点实例,Slave: 从库实例,HA: 高可用部署实例,默认是Normal + - **InstanceMode** (str) - 实例的部署类型。可选值为:Normal: 普通单点实例,Slave: 从库实例,HA: 高可用部署实例,默认是Normal + - **InstanceType** (str) - 对于快杰机型,请使用最新的 SpecificationClass 和 StorageClass 字段进行创建。目前仅有少量地域支持 SATA_SSD 存储类型;若创建的是 SATA_SSD 机型,可通过该字段指定。字段说明:SATA_SSD:SATA SSD 机型(仅部分地域支持)NVMe_SSD:快杰机型 + - **MachineType** (str) - 规格类型ID,当SpecificationType为1时有效 - **Quantity** (int) - DB购买多少个"计费时间单位",默认值为1。比如:买2个月,Quantity就是2。如果计费单位是“按月”,并且Quantity为0,表示“购买到月底” - - **SSDType** (str) - SSD类型,可选值为"SATA"、"PCI-E",如果UseSSD为true ,则必填 - - **UseSSD** (str) - 是否使用SSD,只能填true或false,默认为false - + - **SSDType** (str) - 该字段已废弃。 + - **SpecificationClass** (str) - 规格类型 O: NVME, OM: 共享型,N: 通用型 + - **SpecificationType** (int) - 实例计算规格类型,0或不传代表使用内存方式购买,1代表使用内存-cpu可选配比方式购买,需要填写MachineType + - **StorageClass** (str) - 存储类型 CLOUD_SSD: SSD云盘, CLOUD_RSSD: RSSD 云盘, CLOUD_SSD_ESSENTIAL: SSD Essential云盘 ,该字段和SpecificationClass组合优先级比InstanceType字段高 + **Response** - **DataSet** (list) - 见 **UDBInstancePriceSet** 模型定义 - + **Response Model** - - **UDBInstancePriceSet** - + + **UDBInstancePriceSet** - **ChargeType** (str) - Year, Month, Dynamic,Trial - **Price** (int) - 价格,单位为分 + """ # build request - d = {"Region": self.config.region} + d = { + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUDBInstancePriceRequestSchema().dumps(d) @@ -907,22 +1474,25 @@ def describe_udb_instance_price( def describe_udb_instance_state( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUDBInstanceState - 获取UDB实例状态 + """DescribeUDBInstanceState - 获取UDB实例状态 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **DBId** (str) - (Required) 实例的Id,该值可以通过DescribeUDBInstance获取 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **State** (str) - DB状态标记 Init:初始化中;Fail:安装失败; Starting:启动中; Running : 运行 ;Shutdown:关闭中; Shutoff :已关闭; Delete:已删除; Upgrading:升级中; Promoting: 提升为独库进行中; Recovering: 恢复中; Recover fail:恢复失败。 - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUDBInstanceStateRequestSchema().dumps(d) @@ -932,26 +1502,33 @@ def describe_udb_instance_state( def describe_udb_instance_upgrade_price( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUDBInstanceUpgradePrice - 获取UDB实例升降级价格信息 + """DescribeUDBInstanceUpgradePrice - 获取UDB实例升降级价格信息 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **DBId** (str) - (Required) 实例的Id - **DiskSpace** (int) - (Required) 磁盘空间(GB), 暂时支持20G - 500G - **MemoryLimit** (int) - (Required) 内存限制(MB) - - **SSDType** (str) - SSD类型,可选值为"SATA"、"PCI-E",如果UseSSD为true ,则必选 - - **UseSSD** (bool) - 是否使用SSD,默认为false - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **CPU** (int) - CPU核数 快杰SQLServer升降级必传 + - **InstanceType** (str) - "SATA_SSD", "NVMe_SSD" + - **MachineType** (str) - 规格类型ID,当SpecificationType为1时有效 + - **OrderStartTime** (int) - 获取指定时间开始后面的升级价格, 不填的话 是默认当前时间 + - **SSDType** (str) - "SATA", "NVMe" + - **SpecificationType** (int) - 实例计算规格类型,0或不传代表使用内存方式购买,1代表使用内存-cpu可选配比方式购买,需要填写MachineType + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **Price** (int) - 价格,单位为分 - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUDBInstanceUpgradePriceRequestSchema().dumps(d) @@ -961,23 +1538,27 @@ def describe_udb_instance_upgrade_price( def describe_udb_log_backup_url( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUDBLogBackupURL - 获取UDB的slowlog备份地址 + """DescribeUDBLogBackupURL - 获取UDB的错误日志或者慢查询日志备份地址 **Request** - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **BackupId** (int) - (Required) DB实例备份ID + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BackupId** (int) - (Required) DB实例日志备份ID, 可以从DescribeUDBLogPackage结果当中获得。 - **DBId** (str) - (Required) DB实例Id - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **BackupPath** (str) - 备份外网URL - **UsernetPath** (str) - 备份用户网URL - + """ # build request - d = {"Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUDBLogBackupURLRequestSchema().dumps(d) @@ -987,44 +1568,48 @@ def describe_udb_log_backup_url( def describe_udb_log_package( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUDBLogPackage - 列表UDB实例binlog或slowlog或errorlog备份信息 + """DescribeUDBLogPackage - 列表UDB实例binlog或slowlog或errorlog备份信息 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Limit** (int) - (Required) 分页显示的条目数,列表操作则指定 - **Offset** (int) - (Required) 分页显示的起始偏移,列表操作则指定 - **BeginTime** (int) - 过滤条件:起始时间(时间戳) - - **DBId** (str) - DB实例Id,如果指定,则只获取该db的备份信息 + - **DBId** (str) - DB实例Id,如果指定,则只获取该db的备份信息; 当Type为2时必填 - **EndTime** (int) - 过滤条件:结束时间(时间戳) - - **Type** (int) - 需要列出的备份文件类型,每种文件的值如下 2 : BINLOG\_BACKUP 3 : SLOW\_QUERY\_BACKUP 4 : ERRORLOG\_BACKUP + - **Type** (int) - 需要列出的备份文件类型,每种类型的值如下: 2 代表 BINLOG_BACKUP; 3 代表 SLOW_QUERY_BACKUP; 4 代表 ERRORLOG_BACKUP; - **Types** (list) - Types作为Type的补充,支持多值传入,可以获取多个类型的日志记录,如:Types.0=2&Types.1=3 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **DataSet** (list) - 见 **LogPackageDataSet** 模型定义 - **TotalCount** (int) - 备份总数,如果指定dbid,则是该db备份总数 - + **Response Model** - - **LogPackageDataSet** - + + **LogPackageDataSet** - **BackupId** (int) - 备份id - **BackupName** (str) - 备份名称 - **BackupSize** (int) - 备份文件大小 - **BackupTime** (int) - 备份时间 - **BackupType** (int) - 备份类型,包括2-binlog备份,3-slowlog备份 - **BackupZone** (str) - 跨可用区高可用备库所在可用区 + - **BinlogType** (str) - binlog备份类型 Manual //手动备份 Auto //自动备份 - **DBId** (str) - dbid - **DBName** (str) - 对应的db名称 - **State** (str) - 备份状态 Backuping // 备份中 Success // 备份成功 Failed // 备份失败 Expired // 备份过期 - **Zone** (str) - 所在可用区 + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUDBLogPackageRequestSchema().dumps(d) @@ -1034,29 +1619,28 @@ def describe_udb_log_package( def describe_udb_param_group( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUDBParamGroup - 获取参数组详细参数信息 + """DescribeUDBParamGroup - 获取参数组详细参数信息 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Limit** (int) - (Required) 分页显示的条目数,列表操作则指定 - **Offset** (int) - (Required) 分页显示的起始偏移,列表操作则指定 - **ClassType** (str) - 如果未指定GroupId,则可选是否选取特定DB类型的配置(sql, nosql, postgresql, sqlserver) - **GroupId** (int) - 参数组id,如果指定则获取描述,否则是列表操作,需要 指定Offset/Limit - **IsInUDBC** (bool) - 是否选取专区中配置 - **RegionFlag** (bool) - 当请求没有填写Zone时,如果指定为true,表示只拉取跨可用区的相关配置文件,否则,拉取所有机房的配置文件(包括每个单可用区和跨可用区) - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **DataSet** (list) - 见 **UDBParamGroupSet** 模型定义 - **TotalCount** (int) - 参数组总数,列表操作时才会有该参数 - + **Response Model** - - **UDBParamMemberSet** - + + **UDBParamMemberSet** - **AllowedVal** (str) - 允许的值(根据参数类型,用分隔符表示) - **ApplyType** (int) - 参数值应用类型,取值范围为{0,10,20},各值代表 意义为0-unknown、10-static、20-dynamic - **FormatType** (int) - 允许值的格式类型,取值范围为{0,10,20},意义分 别为PVFT_UNKOWN=0,PVFT_RANGE=10, PVFT_ENUM=20 @@ -1065,105 +1649,243 @@ def describe_udb_param_group( - **Value** (str) - 参数值 - **ValueType** (int) - 参数值应用类型,取值范围为{0,10,20,30},各值 代表意义为 0-unknown、10-int、20-string、 30-bool - **UDBParamGroupSet** - + + **UDBParamGroupSet** - **DBTypeId** (str) - DB类型id,mysql/mongodb按版本细分各有一个id 目前id的取值范围为[1,7],数值对应的版本如下 1:mysql-5.5,2:mysql-5.1,3:percona-5.5 4:mongodb-2.4,5:mongodb-2.6,6:mysql-5.6 7:percona-5.6 - **Description** (str) - 参数组描述 - **GroupId** (int) - 参数组id - **GroupName** (str) - 参数组名称 + - **GroupType** (int) - 参数组类型:1:稳定版参数组,2:高性能版参数组。默认是稳定版参数组 - **Modifiable** (bool) - 参数组是否可修改 - **ParamMember** (list) - 见 **UDBParamMemberSet** 模型定义 - - **RegionFlag** (bool) - - - **Zone** (str) - + - **RegionFlag** (bool) - + - **Zone** (str) - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUDBParamGroupRequestSchema().dumps(d) resp = self.invoke("DescribeUDBParamGroup", d, **kwargs) return apis.DescribeUDBParamGroupResponseSchema().loads(resp) + def describe_udb_splitting_info( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUDBSplittingInfo - 描述读写分离功能的详细信息 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **MasterDBId** (str) - (Required) DB实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **DBTypeId** (str) - 数据库版本 + - **DataSet** (list) - 见 **UDBRWSplittingSet** 模型定义 + - **DelayThreshold** (int) - 时间阈值 + - **MasterDBId** (str) - DB实例ID + - **Port** (int) - 端口号 + - **RWIP** (str) - 读写分离IP + - **RWState** (str) - 读写分离状态 + - **ReadModel** (str) - 读写分离策略 + - **Zone** (str) - 可用区 + + **Response Model** + + **UDBRWSplittingSet** + - **DBId** (str) - DB实例ID + - **ReadWeight** (int) - 读写分离比重 + - **Role** (str) - 主库/从库 + - **State** (str) - DB状态 + - **VirtualIP** (str) - DBIP + + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUDBSplittingInfoRequestSchema().dumps(d) + + resp = self.invoke("DescribeUDBSplittingInfo", d, **kwargs) + return apis.DescribeUDBSplittingInfoResponseSchema().loads(resp) + def describe_udb_type( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUDBType - 获取UDB支持的类型信息 + """DescribeUDBType - 获取UDB支持的类型信息 **Request** - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - - **BackupZone** (str) - 跨可用区高可用DB的备库所在区域,仅当该可用区支持跨可用区高可用时填入。参见 `可用区列表 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **BackupZone** (str) - 跨可用区高可用DB的备库所在区域,仅当该可用区支持跨可用区高可用时填入。参见 `可用区列表 `_ + - **CompatibleWithDBType** (str) - 返回从备份创建实例时,该版本号所支持的备份创建版本。如果没传,则表示不是从备份创建。 - **DBClusterType** (str) - DB实例类型,如mysql,sqlserver,mongo,postgresql - - **DiskType** (str) - 返回支持某种磁盘类型的DB类型。如果没传,则表示任何磁盘类型均可。 + - **DBSubVersion** (str) - 返回从备份创建实例时,该小版本号所支持的备份创建小版本。如果没传,则表示不是从备份创建。 + - **DiskType** (str) - 返回支持某种磁盘类型的DB类型,如Normal、SSD、NVMe_SSD。如果没传,则表示任何磁盘类型均可。 - **InstanceMode** (str) - 返回支持某种实例类型的DB类型。如果没传,则表示任何实例类型均可。normal:单点,ha:高可用,sharded_cluster:分片集群 - + **Response** - - **Action** (str) - 操作名称 - **DataSet** (list) - 见 **UDBTypeSet** 模型定义 - - **RetCode** (int) - 返回码 - + **Response Model** - - **UDBTypeSet** - + + **UDBTypeSet** + - **DBSubVersion** (str) - mysql子版本,如mysql-8.0.25,mysql-8.0.16 - **DBTypeId** (str) - DB类型id,mysql/mongodb按版本细分各有一个id, 目前id的取值范围为[1,7],数值对应的版本如下: 1:mysql-5.5,2:mysql-5.1,3:percona-5.5 4:mongodb-2.4,5:mongodb-2.6,6:mysql-5.6, 7:percona-5.6 + """ # build request - d = {"Region": self.config.region} + d = { + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUDBTypeRequestSchema().dumps(d) resp = self.invoke("DescribeUDBType", d, **kwargs) return apis.DescribeUDBTypeResponseSchema().loads(resp) + def disable_udb_rw_splitting( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DisableUDBRWSplitting - 关闭DB的读写分离功能 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **MasterDBId** (str) - (Required) DB实例ID(master) + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.DisableUDBRWSplittingRequestSchema().dumps(d) + + resp = self.invoke("DisableUDBRWSplitting", d, **kwargs) + return apis.DisableUDBRWSplittingResponseSchema().loads(resp) + def edit_udb_backup_blacklist( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ EditUDBBackupBlacklist - 编辑UDB实例的备份黑名单 + """EditUDBBackupBlacklist - 编辑UDB实例的备份黑名单 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Blacklist** (str) - (Required) 黑名单,规范示例,指定库mysql.%;test.%; 指定表city.address; - **DBId** (str) - (Required) DB实例Id,该值可以通过DescribeUDBInstance获取 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.EditUDBBackupBlacklistRequestSchema().dumps(d) resp = self.invoke("EditUDBBackupBlacklist", d, **kwargs) return apis.EditUDBBackupBlacklistResponseSchema().loads(resp) + def enable_udb_rw_splitting( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """EnableUDBRWSplitting - 开启DB的读写分离功能 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **MasterDBId** (str) - (Required) DB实例ID(主库) + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **BackupZone** (str) - 备份的可用区。用于创建跨可用区读写分离的一个节点,跨机房的读写分离必须有这个参数 + + **Response** + + - **MasterDBId** (str) - DB实例ID(主库) + - **RWIp** (str) - 读写分离访问IP + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.EnableUDBRWSplittingRequestSchema().dumps(d) + + resp = self.invoke("EnableUDBRWSplitting", d, **kwargs) + return apis.EnableUDBRWSplittingResponseSchema().loads(resp) + + def extract_udb_param_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ExtractUDBParamGroup - 获取配置文件内容 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **GroupId** (int) - (Required) 配置id + - **RegionFlag** (bool) - 是否跨可用区,RegionFlag为true时表示跨可用区配置文件。如果RegionFlag=true,Zone可以不传,否则Zone必须传。 + - **Zone** (str) - 可用区。如果RegionFlag=false,必须传,反之,可不传。参见 `可用区列表 `_ + + **Response** + + - **Content** (str) - 配置文件内容 + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.ExtractUDBParamGroupRequestSchema().dumps(d) + + resp = self.invoke("ExtractUDBParamGroup", d, **kwargs) + return apis.ExtractUDBParamGroupResponseSchema().loads(resp) + def fetch_udb_instance_earliest_recover_time( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ FetchUDBInstanceEarliestRecoverTime - 获取UDB最早可回档的时间点 + """FetchUDBInstanceEarliestRecoverTime - 获取UDB最早可回档的时间点 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **DBId** (str) - (Required) DB实例Id - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **EarliestTime** (int) - 获取最早可回档时间点 - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.FetchUDBInstanceEarliestRecoverTimeRequestSchema().dumps(d) @@ -1172,25 +1894,172 @@ def fetch_udb_instance_earliest_recover_time( resp ) + def get_udb_client_conn_num( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUDBClientConnNum - 输入一个DBID,能够获取客户端来源IP以及对应的连接数 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DBId** (str) - (Required) DB实例id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **DataSet** (list) - 见 **ConnNumMap** 模型定义 + + **Response Model** + + **ConnNumMap** + - **Ip** (str) - 客户端IP + - **Num** (int) - 该Ip连接数 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUDBClientConnNumRequestSchema().dumps(d) + + resp = self.invoke("GetUDBClientConnNum", d, **kwargs) + return apis.GetUDBClientConnNumResponseSchema().loads(resp) + + def get_udb_instance_ssl_cert_url( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUDBInstanceSSLCertURL - 获取SSL证书下载地址 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DBId** (str) - (Required) 实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ExpireTime** (int) - URL的过期时间,该值最小默认1小时,最大7天。(单位/秒) + + **Response** + + - **InnerUrl** (str) - 内网链接 + - **InternetUrl** (str) - 外网链接 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUDBInstanceSSLCertURLRequestSchema().dumps(d) + + resp = self.invoke("GetUDBInstanceSSLCertURL", d, **kwargs) + return apis.GetUDBInstanceSSLCertURLResponseSchema().loads(resp) + + def list_udb_machine_type( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUDBMachineType - 获取UDB云数据库支持的计算规格列表,暂不支持获取跨可用区实例的计算规格,目前支持的数据库品类包括:NVMe版和SSD云盘版MySQL + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **InstanceMode** (str) - UDB实例模式类型, 可选值如下: "Normal": 普通版UDB实例 "HA": 高可用版UDB实例 默认是"Normal" + + **Response** + + - **DataSet** (list) - 见 **MachineType** 模型定义 + - **DefaultMachineType** (dict) - 见 **MachineType** 模型定义 + - **Message** (str) - 接口返回信息 + + **Response Model** + + **MachineType** + - **Cpu** (int) - 规格cpu核数 + - **Description** (str) - 计算规格描述,格式为"nCmG",表示n核mG内存实例 + - **Group** (str) - 内存/cpu配比 + - **ID** (str) - 计算规格id, 目前支持CPU和内存比1:2、1:4、1:8三类配比规格;规格的格式为:"机型.配比.CPU核数规格";机型支持o和n两种机型,分别代表快杰NVMe和SSD云盘机型;配比映射关系如下:2m代表CPU内存配比1比2,4m代表CPU内存配比1比4,8m代表CPU内存配比1比8,CPU核数规格射关系如下:small代表1C,medium代表2C,xlarge代表4C,2xlarge代表8C,4xlarge代表16C,8xlarge代表32C,16xlarge代表64C,例如 "o.mysql4m.medium"表示创建快杰NVMe机型2C8G的实例,"o.mysql8m.4xlarge"表示创建快杰NVMe机型16C128G的实例 + - **Memory** (int) - 规格内存大小,单位(GB) + - **Os** (str) - 内部云主机机型,可选"o/n" + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUDBMachineTypeRequestSchema().dumps(d) + + resp = self.invoke("ListUDBMachineType", d, **kwargs) + return apis.ListUDBMachineTypeResponseSchema().loads(resp) + + def list_udb_user_tables( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUDBUserTables - 查看udb实例所有的用户表集合 (只包括引擎为innodb和myisam的表) + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DBId** (str) - (Required) udb实例的ID + + **Response** + + - **Tables** (list) - 见 **UDBDatabaseData** 模型定义 + + **Response Model** + + **TableData** + - **DBName** (str) - 表所属的库名称 + - **Engine** (str) - 表的引擎(innodb, myisam) + - **TableName** (str) - 表名称 + + + **UDBDatabaseData** + - **DBName** (str) - 数据库名称 + - **TableDataSet** (list) - 见 **TableData** 模型定义 + + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUDBUserTablesRequestSchema().dumps(d) + + resp = self.invoke("ListUDBUserTables", d, **kwargs) + return apis.ListUDBUserTablesResponseSchema().loads(resp) + def modify_udb_instance_name( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ModifyUDBInstanceName - 重命名UDB实例 + """ModifyUDBInstanceName - 重命名UDB实例 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **DBId** (str) - (Required) 实例的Id,该值可以通过DescribeUDBInstance获取 - **Name** (str) - (Required) 实例的新名字, 长度要求为6~63位 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.ModifyUDBInstanceNameRequestSchema().dumps(d) @@ -1200,46 +2069,109 @@ def modify_udb_instance_name( def modify_udb_instance_password( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ModifyUDBInstancePassword - 修改DB实例的管理员密码 + """ModifyUDBInstancePassword - 修改DB实例的管理员密码 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **DBId** (str) - (Required) 实例的ID,该值可以通过DescribeUDBInstance获取 - **Password** (str) - (Required) 实例的新密码 - **AccountName** (str) - sqlserver帐号,仅在sqlserver的情况下填该参数 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.ModifyUDBInstancePasswordRequestSchema().dumps(d) resp = self.invoke("ModifyUDBInstancePassword", d, **kwargs) return apis.ModifyUDBInstancePasswordResponseSchema().loads(resp) + def modify_udb_instance_remark_name( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUDBInstanceRemarkName - 修改UDB实例备注信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DBId** (str) - (Required) 实例的Id,该值可以通过DescribeUDBInstance获取 + - **Name** (str) - (Required) 实例的新备注 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyUDBInstanceRemarkNameRequestSchema().dumps(d) + + resp = self.invoke("ModifyUDBInstanceRemarkName", d, **kwargs) + return apis.ModifyUDBInstanceRemarkNameResponseSchema().loads(resp) + + def modify_udb_instance_ssl( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUDBInstanceSSL - 调整SSL的信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DBId** (str) - (Required) 实例ID + - **EnableSSL** (int) - (Required) 是否开启SSL 1->关闭 2->开启 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ValidTime** (int) - SSL证书有效时间,1-5年,默认为1年 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyUDBInstanceSSLRequestSchema().dumps(d) + + resp = self.invoke("ModifyUDBInstanceSSL", d, **kwargs) + return apis.ModifyUDBInstanceSSLResponseSchema().loads(resp) + def promote_udb_instance_to_ha( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ PromoteUDBInstanceToHA - 普通db升级为高可用(只针对mysql5.5及以上版本) + """PromoteUDBInstanceToHA - 普通db升级为高可用(只针对mysql5.5及以上版本SSD机型的实例) ,对于NVMe机型的单点升级高可用,虽然也能使用该操作再加上SwitchUDBInstanceToHA,但是更建议直接调用新的API接口(UpgradeUDBInstanceToHA) **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **DBId** (str) - (Required) 实例的Id,该值可以通过DescribeUDBInstance获取 - + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.PromoteUDBInstanceToHARequestSchema().dumps(d) @@ -1249,22 +2181,25 @@ def promote_udb_instance_to_ha( def promote_udb_slave( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ PromoteUDBSlave - 从库提升为独立库 + """PromoteUDBSlave - 从库提升为独立库 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **DBId** (str) - (Required) 实例的Id,该值可以通过DescribeUDBInstance获取 - **IsForce** (bool) - 是否强制(如果从库落后可能会禁止提升),默认false 如果落后情况下,强制提升丢失数据 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.PromoteUDBSlaveRequestSchema().dumps(d) @@ -1274,78 +2209,169 @@ def promote_udb_slave( def resize_udb_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ResizeUDBInstance - 修改(升级和降级)UDB实例的配置,包括内存和磁盘的配置,对于内存升级无需关闭实例,其他场景需要事先关闭实例。两套参数可以配置升降机:1.配置UseSSD和SSDType 2.配置InstanceType,不需要配置InstanceMode。这两套第二套参数的优先级更高 + """ResizeUDBInstance - 修改(升级和降级)UDB实例的配置,包括内存和磁盘的配置,对于内存升级无需关闭实例,其他场景需要事先关闭实例。两套参数可以配置升降机:1.配置UseSSD和SSDType 2.配置InstanceType,不需要配置InstanceMode。这两套第二套参数的优先级更高 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **DBId** (str) - (Required) 实例的Id - - **DiskSpace** (int) - (Required) 磁盘空间(GB), 暂时支持20G-3000G - - **MemoryLimit** (int) - (Required) 内存限制(MB),目前支持以下几档 1000M/2000M/4000M/ 6000M/8000M/ 12000M/16000M/ 24000M/32000M/ 48000M/64000M/96000M。 + - **DiskSpace** (int) - (Required) 磁盘空间(GB), 暂时支持20G-32T + - **MemoryLimit** (int) - (Required) 内存限制(MB),目前支持以下几档 2000M/4000M/ 6000M/8000M/ 12000M/16000M/ 24000M/32000M/ 48000M/64000M/96000M/128000M/192000M/256000M/320000M。 + - **CPU** (int) - 数据库的CPU核数(只对普通版的SQLServer有用) - **CouponId** (str) - 使用的代金券id - **InstanceMode** (str) - UDB实例模式类型, 可选值如下: "Normal": 普通版UDB实例 "HA": 高可用版UDB实例 默认是"Normal" - - **InstanceType** (str) - UDB数据库机型: "Normal": "标准机型" , "SATA_SSD": "SSD机型" , "PCIE_SSD": "SSD高性能机型" , "Normal_Volume": "标准大容量机型", "SATA_SSD_Volume": "SSD大容量机型" , "PCIE_SSD_Volume": "SSD高性能大容量机型" - - **SSDType** (str) - SSD类型,可选值为"SATA"、"PCI-E",如果UseSSD为true ,则必选 + - **InstanceType** (str) - UDB数据库机型: "Normal": "标准机型" , "SATA_SSD": "SSD机型" , "PCIE_SSD": "SSD高性能机型" , "Normal_Volume": "标准大容量机型", "SATA_SSD_Volume": "SSD大容量机型" , "PCIE_SSD_Volume": "SSD高性能大容量机型",“NVMe_SSD”:“快杰机型” + - **MachineType** (str) - 规格类型ID,当SpecificationType为1时有效 + - **SSDType** (str) - SSD类型,可选值为"SATA"、“NVMe” + - **SpecificationType** (str) - 实例计算规格类型,0或不传代表使用内存方式购买,1代表使用内存-cpu可选配比方式购买,需要填写MachineType - **StartAfterUpgrade** (bool) - DB关闭状态下升降级,升降级后是否启动DB,默认为false - - **UDBCId** (str) - 专区的ID,如果有值表示专区中的DB配置升降级 - - **UseSSD** (bool) - 是否使用SSD,默认为false - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.ResizeUDBInstanceRequestSchema().dumps(d) resp = self.invoke("ResizeUDBInstance", d, **kwargs) return apis.ResizeUDBInstanceResponseSchema().loads(resp) + def restart_rw_splitting( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RestartRWSplitting - 读写分离中间件重启,对应docker重启,但是ip不变 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **MasterDBId** (str) - (Required) 待关闭读写分离中间键ProxyId + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.RestartRWSplittingRequestSchema().dumps(d) + + resp = self.invoke("RestartRWSplitting", d, **kwargs) + return apis.RestartRWSplittingResponseSchema().loads(resp) + def restart_udb_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ RestartUDBInstance - 重启UDB实例 + """RestartUDBInstance - 重启UDB实例 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **DBId** (str) - (Required) 实例的Id,该值可以通过DescribeUDBInstance获取 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.RestartUDBInstanceRequestSchema().dumps(d) resp = self.invoke("RestartUDBInstance", d, **kwargs) return apis.RestartUDBInstanceResponseSchema().loads(resp) + def rollback_udb_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RollbackUDBInstance - 在原实例回档指定库表 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **RecoveryTime** (str) - (Required) 恢复到某个时间点的时间戳(UTC时间格式,默认单位秒) + - **SrcDBId** (str) - (Required) 源实例的Id + - **Tables** (str) - (Required) 指定需要恢复的表,格式为(库名.表名), 指定多个用逗号隔开,eg: [ udb.test, mysql_school.my_student] + + **Response** + + - **DBId** (str) - 源实例的Id + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.RollbackUDBInstanceRequestSchema().dumps(d) + + resp = self.invoke("RollbackUDBInstance", d, **kwargs) + return apis.RollbackUDBInstanceResponseSchema().loads(resp) + + def set_udb_rw_splitting( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """SetUDBRWSplitting - 设置读写分离的模式 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DBIds** (list) - (Required) DBIds.0 代表UDB主节点, DBIds.1 到DBIds.n 代表1到N个从节点 + - **MasterDBId** (str) - (Required) DB实例ID(master) + - **ReadModel** (str) - (Required) 读写分离策略 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **DelayThreshold** (int) - 时间阙值 + - **ReadPercents** (list) - udb主从节点的只读比例。ReadPercents.0代表主节点的只读比例,ReadPercents.1代表从节点1的读写比例, 以此类推 + + **Response** + + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.SetUDBRWSplittingRequestSchema().dumps(d) + + resp = self.invoke("SetUDBRWSplitting", d, **kwargs) + return apis.SetUDBRWSplittingResponseSchema().loads(resp) + def start_udb_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ StartUDBInstance - 启动UDB实例 + """StartUDBInstance - 启动UDB实例 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **DBId** (str) - (Required) 实例的Id,该值可以通过DescribeUDBInstance获取 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.StartUDBInstanceRequestSchema().dumps(d) @@ -1355,49 +2381,83 @@ def start_udb_instance( def stop_udb_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ StopUDBInstance - 关闭UDB实例 + """StopUDBInstance - 关闭UDB实例 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **DBId** (str) - (Required) 实例的Id,该值可以通过DescribeUDBInstance获取 - **ForceToKill** (bool) - 是否使用强制手段关闭DB,默认是false - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.StopUDBInstanceRequestSchema().dumps(d) resp = self.invoke("StopUDBInstance", d, **kwargs) return apis.StopUDBInstanceResponseSchema().loads(resp) + def switch_udb_ha_to_sentinel( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """SwitchUDBHAToSentinel - UDB高可用实例从HAProxy版本升级为Sentinel版本(不带HAProxy)升级耗时5-10秒 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DBId** (str) - (Required) UDB的实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ForceSwitch** (bool) - 是否跳过预检查强制升级。 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.SwitchUDBHAToSentinelRequestSchema().dumps(d) + + resp = self.invoke("SwitchUDBHAToSentinel", d, **kwargs) + return apis.SwitchUDBHAToSentinelResponseSchema().loads(resp) + def switch_udb_instance_to_ha( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ SwitchUDBInstanceToHA - 普通UDB切换为高可用,原db状态为WaitForSwitch时,调用该api + """SwitchUDBInstanceToHA - 普通UDB切换为高可用(只针对mysql5.5及以上版本SSD机型的实例) ,原db状态为WaitForSwitch时,调用该api; 对于NVMe机型的单点升级高可用,虽然也能使用PromoteUDBInstanceToHA再加上该操作,但是更建议直接调用新的API接口(UpgradeUDBInstanceToHA) **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **DBId** (str) - (Required) 实例的Id,该值可以通过DescribeUDBInstance获取 - **ChargeType** (str) - Year, Month, Dynamic,Trial,不填则按现在单点计费执行 - **Quantity** (str) - 购买时长,需要和 ChargeType 搭配使用,否则使用单点计费策略的值 - **Tag** (str) - 业务组 - + **Response** - **DBId** (str) - 切换后高可用db实例的Id - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.SwitchUDBInstanceToHARequestSchema().dumps(d) @@ -1407,25 +2467,32 @@ def switch_udb_instance_to_ha( def update_udb_instance_backup_strategy( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ UpdateUDBInstanceBackupStrategy - 修改UDB自动备份策略 + """UpdateUDBInstanceBackupStrategy - 修改UDB自动备份策略 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **DBId** (str) - (Required) 主节点的Id - **BackupDate** (str) - 备份时期标记位。共7位,每一位为一周中一天的备份情况,0表示关闭当天备份,1表示打开当天备份。最右边的一位为星期天的备份开关,其余从右到左依次为星期一到星期六的备份配置开关,每周必须至少设置两天备份。例如:1100000表示打开星期六和星期五的备份功能 - - **BackupMethod** (str) - 选择默认的备份方式,可选 snapshot 表示使用快照/物理备份,填 logic 表示使用逻辑备份。需要同时设置BackupDate字段。(注意现在只有SSD 版本的 MySQL实例支持物理备份) + - **BackupMethod** (str) - 选择默认的备份方式,可选nobackup表示不备份, snapshot 表示使用快照备份,logic 表示使用逻辑备份。需要同时设置BackupDate字段。(快照备份即物理备份。SSD版本的mysql实例支持设置为snapshot,NVMe版本的mysql实例支持设置为xtrabackup) - **BackupTime** (int) - 备份的整点时间,范围[0,23] + - **BinlogRemoteSaveDays** (int) - 远端binlog保存时长(天) + - **EnableBinlogBackup** (bool) - 是否开启binlog备份, 默认为未开启 - **ForceDump** (bool) - 当导出某些数据遇到问题后,是否强制导出其他剩余数据默认是false需要同时设置BackupDate字段 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **UserBucket** (str) - 自动备份转存到用户自己的bucket名称,要包含到对应的token id里 + - **UserTokenID** (str) - 自动备份转存到用户自己的bucket 的tokenid, 需要用户自己自己设置权限 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.UpdateUDBInstanceBackupStrategyRequestSchema().dumps(d) @@ -1435,23 +2502,26 @@ def update_udb_instance_backup_strategy( def update_udb_instance_slave_backup_switch( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ UpdateUDBInstanceSlaveBackupSwitch - 开启或者关闭UDB从库备份 + """UpdateUDBInstanceSlaveBackupSwitch - 开启或者关闭UDB从库备份 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **BackupSwitch** (int) - (Required) 从库的备份开关,范围[0,1],0表示从库备份功能关闭,1 表示从库备份开关打开。 - **MasterDBId** (str) - (Required) 主库的Id - **SlaveDBId** (str) - 从库的Id,如果从库备份开关设定为打开,则必须赋值。 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.UpdateUDBInstanceSlaveBackupSwitchRequestSchema().dumps(d) @@ -1463,61 +2533,122 @@ def update_udb_instance_slave_backup_switch( def update_udb_param_group( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ UpdateUDBParamGroup - 更新UDB配置参数项 + """UpdateUDBParamGroup - 更新UDB配置参数项 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **GroupId** (int) - (Required) 配置参数组id,使用DescribeUDBParamGroup获得 - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - **Description** (str) - 配置文件的描述,不传时认为不修改 - **Key** (str) - 参数名称(与Value配合使用) - **Name** (str) - 配置文件的名字,不传时认为不修改名字,传了则不能为空 - **RegionFlag** (bool) - 该配置文件是否是地域级别配置文件,默认是false - **Value** (str) - 参数值(与Key配合使用) - + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.UpdateUDBParamGroupRequestSchema().dumps(d) resp = self.invoke("UpdateUDBParamGroup", d, **kwargs) return apis.UpdateUDBParamGroupResponseSchema().loads(resp) + def upgrade_udb_instance_to_ha( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpgradeUDBInstanceToHA - 快杰普通db升级为高可用(只针对mysql5.5及以上版本Nvme机型的实例) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DBId** (str) - (Required) 实例的Id,该值可以通过DescribeUDBInstance获取 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpgradeUDBInstanceToHARequestSchema().dumps(d) + + resp = self.invoke("UpgradeUDBInstanceToHA", d, **kwargs) + return apis.UpgradeUDBInstanceToHAResponseSchema().loads(resp) + + def upgrade_udb_version( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpgradeUDBVersion - 升级db实例版本 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DBId** (str) - (Required) db实例资源id + - **DBSubVersion** (str) - (Required) db需要升级的小版本 + - **SwitchType** (str) - (Required) 切换类型,可选值为"immediately"和"customize",分别代表立即切换和自定义切换时间,自定义切换时间需要填写SwitchStartTime和SwitchEndTime + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **SwitchEndTime** (int) - 该值为一个unix时间戳,代表开始预期切换实例结束的时间 + - **SwitchStartTime** (int) - 该值为一个unix时间戳,代表开始切换实例的时间 + + **Response** + + - **Message** (str) - 返回信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpgradeUDBVersionRequestSchema().dumps(d) + + resp = self.invoke("UpgradeUDBVersion", d, **kwargs) + return apis.UpgradeUDBVersionResponseSchema().loads(resp) + def upload_udb_param_group( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ UploadUDBParamGroup - 导入UDB配置 + """UploadUDBParamGroup - 导入UDB配置 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Content** (str) - (Required) 配置内容,导入的配置内容采用base64编码 - **DBTypeId** (str) - (Required) DB类型id,DB类型id,mysql/mongodb/postgesql按版本细分 1:mysql-5.1,2:mysql-5.5,3:percona-5.5,4:mysql-5.6,5:percona-5.6,6:mysql-5.7,7:percona-5.7,8:mariadb-10.0,9:mongodb-2.4,10:mongodb-2.6,11:mongodb-3.0,12:mongodb-3.2,13:postgresql-9.4,14:postgresql-9.6 - **Description** (str) - (Required) 参数组描述 - **GroupName** (str) - (Required) 配置参数组名称 - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - - **ParamGroupTypeId** (int) - 配置文件子类型 0-未知, 1-Shardsvr-MMAPv1, 2-Shardsvr-WiredTiger, 3-Configsvr-MMAPv1, 4-Configsvr-WiredTiger, 5-Mongos + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - **RegionFlag** (bool) - 该配置文件是否是地域级别配置文件,默认是false - + **Response** - **GroupId** (int) - 配置参数组id - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.UploadUDBParamGroupRequestSchema().dumps(d) - # build options - kwargs["max_retries"] = 0 # ignore retry when api is not idempotent - resp = self.invoke("UploadUDBParamGroup", d, **kwargs) return apis.UploadUDBParamGroupResponseSchema().loads(resp) diff --git a/ucloud/services/udb/schemas/apis.py b/ucloud/services/udb/schemas/apis.py index ed921a47..b30e8b7c 100644 --- a/ucloud/services/udb/schemas/apis.py +++ b/ucloud/services/udb/schemas/apis.py @@ -3,7 +3,6 @@ from ucloud.core.typesystem import schema, fields from ucloud.services.udb.schemas import models - """ UDB API Schema """ @@ -16,8 +15,7 @@ class BackupUDBInstanceRequestSchema(schema.RequestSchema): - """ BackupUDBInstance - 备份UDB实例 - """ + """BackupUDBInstance - 备份UDB实例""" fields = { "BackupMethod": fields.Str(required=False, dump_to="BackupMethod"), @@ -33,8 +31,7 @@ class BackupUDBInstanceRequestSchema(schema.RequestSchema): class BackupUDBInstanceResponseSchema(schema.ResponseSchema): - """ BackupUDBInstance - 备份UDB实例 - """ + """BackupUDBInstance - 备份UDB实例""" fields = {} @@ -47,8 +44,7 @@ class BackupUDBInstanceResponseSchema(schema.ResponseSchema): class BackupUDBInstanceBinlogRequestSchema(schema.RequestSchema): - """ BackupUDBInstanceBinlog - 备份UDB指定时间段的binlog列表 - """ + """BackupUDBInstanceBinlog - 备份UDB指定时间段的binlog列表""" fields = { "BackupFile": fields.Str(required=True, dump_to="BackupFile"), @@ -61,8 +57,7 @@ class BackupUDBInstanceBinlogRequestSchema(schema.RequestSchema): class BackupUDBInstanceBinlogResponseSchema(schema.ResponseSchema): - """ BackupUDBInstanceBinlog - 备份UDB指定时间段的binlog列表 - """ + """BackupUDBInstanceBinlog - 备份UDB指定时间段的binlog列表""" fields = {} @@ -75,8 +70,7 @@ class BackupUDBInstanceBinlogResponseSchema(schema.ResponseSchema): class BackupUDBInstanceErrorLogRequestSchema(schema.RequestSchema): - """ BackupUDBInstanceErrorLog - 备份UDB指定时间段的errorlog - """ + """BackupUDBInstanceErrorLog - 备份UDB指定时间段的errorlog""" fields = { "BackupName": fields.Str(required=True, dump_to="BackupName"), @@ -88,8 +82,7 @@ class BackupUDBInstanceErrorLogRequestSchema(schema.RequestSchema): class BackupUDBInstanceErrorLogResponseSchema(schema.ResponseSchema): - """ BackupUDBInstanceErrorLog - 备份UDB指定时间段的errorlog - """ + """BackupUDBInstanceErrorLog - 备份UDB指定时间段的errorlog""" fields = {} @@ -102,8 +95,7 @@ class BackupUDBInstanceErrorLogResponseSchema(schema.ResponseSchema): class BackupUDBInstanceSlowLogRequestSchema(schema.RequestSchema): - """ BackupUDBInstanceSlowLog - 备份UDB指定时间段的slowlog分析结果 - """ + """BackupUDBInstanceSlowLog - 备份UDB指定时间段的slowlog分析结果""" fields = { "BackupName": fields.Str(required=True, dump_to="BackupName"), @@ -116,8 +108,32 @@ class BackupUDBInstanceSlowLogRequestSchema(schema.RequestSchema): class BackupUDBInstanceSlowLogResponseSchema(schema.ResponseSchema): - """ BackupUDBInstanceSlowLog - 备份UDB指定时间段的slowlog分析结果 - """ + """BackupUDBInstanceSlowLog - 备份UDB指定时间段的slowlog分析结果""" + + fields = {} + + +""" +API: ChangeUDBParamGroup + +修改配置文件 +""" + + +class ChangeUDBParamGroupRequestSchema(schema.RequestSchema): + """ChangeUDBParamGroup - 修改配置文件""" + + fields = { + "DBId": fields.Str(required=True, dump_to="DBId"), + "GroupId": fields.Str(required=True, dump_to="GroupId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class ChangeUDBParamGroupResponseSchema(schema.ResponseSchema): + """ChangeUDBParamGroup - 修改配置文件""" fields = {} @@ -130,8 +146,7 @@ class BackupUDBInstanceSlowLogResponseSchema(schema.ResponseSchema): class CheckRecoverUDBInstanceRequestSchema(schema.RequestSchema): - """ CheckRecoverUDBInstance - 核查db是否可以使用回档功能 - """ + """CheckRecoverUDBInstance - 核查db是否可以使用回档功能""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -142,11 +157,10 @@ class CheckRecoverUDBInstanceRequestSchema(schema.RequestSchema): class CheckRecoverUDBInstanceResponseSchema(schema.ResponseSchema): - """ CheckRecoverUDBInstance - 核查db是否可以使用回档功能 - """ + """CheckRecoverUDBInstance - 核查db是否可以使用回档功能""" fields = { - "LastestTime": fields.Int(required=False, load_from="LastestTime") + "LastestTime": fields.Int(required=False, load_from="LastestTime"), } @@ -158,8 +172,7 @@ class CheckRecoverUDBInstanceResponseSchema(schema.ResponseSchema): class CheckUDBInstanceToHAAllowanceRequestSchema(schema.RequestSchema): - """ CheckUDBInstanceToHAAllowance - 核查db是否可以升级为高可用 - """ + """CheckUDBInstanceToHAAllowance - 核查db是否可以升级为高可用""" fields = { "DBId": fields.Str(required=True, dump_to="DBId"), @@ -169,10 +182,11 @@ class CheckUDBInstanceToHAAllowanceRequestSchema(schema.RequestSchema): class CheckUDBInstanceToHAAllowanceResponseSchema(schema.ResponseSchema): - """ CheckUDBInstanceToHAAllowance - 核查db是否可以升级为高可用 - """ + """CheckUDBInstanceToHAAllowance - 核查db是否可以升级为高可用""" - fields = {"Allowance": fields.Str(required=False, load_from="Allowance")} + fields = { + "Allowance": fields.Str(required=False, load_from="Allowance"), + } """ @@ -183,8 +197,7 @@ class CheckUDBInstanceToHAAllowanceResponseSchema(schema.ResponseSchema): class ClearUDBLogRequestSchema(schema.RequestSchema): - """ ClearUDBLog - 清除UDB实例的log - """ + """ClearUDBLog - 清除UDB实例的log""" fields = { "BeforeTime": fields.Int(required=False, dump_to="BeforeTime"), @@ -197,12 +210,63 @@ class ClearUDBLogRequestSchema(schema.RequestSchema): class ClearUDBLogResponseSchema(schema.ResponseSchema): - """ ClearUDBLog - 清除UDB实例的log - """ + """ClearUDBLog - 清除UDB实例的log""" fields = {} +""" +API: CreateMongoDBReplicaSet + +一键创建DB副本集 +""" + + +class CreateMongoDBReplicaSetRequestSchema(schema.RequestSchema): + """CreateMongoDBReplicaSet - 一键创建DB副本集""" + + fields = { + "AdminPassword": fields.Str(required=True, dump_to="AdminPassword"), + "AdminUser": fields.Str(required=False, dump_to="AdminUser"), + "BackupCount": fields.Int(required=False, dump_to="BackupCount"), + "BackupDuration": fields.Int(required=False, dump_to="BackupDuration"), + "BackupTime": fields.Int(required=False, dump_to="BackupTime"), + "CPU": fields.Int(required=False, dump_to="CPU"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "ClusterId": fields.Str(required=False, dump_to="ClusterId"), + "CouponId": fields.List(fields.Str()), + "DBTypeId": fields.Str(required=True, dump_to="DBTypeId"), + "DiskSpace": fields.Int(required=True, dump_to="DiskSpace"), + "InstanceType": fields.Str( + required=False, dump_to="InstanceType" + ), # Deprecated, will be removed at 1.0 + "MemoryLimit": fields.Int(required=True, dump_to="MemoryLimit"), + "Name": fields.Str(required=True, dump_to="Name"), + "ParamGroupId": fields.Int(required=True, dump_to="ParamGroupId"), + "Port": fields.Int(required=True, dump_to="Port"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "SSDType": fields.Str( + required=False, dump_to="SSDType" + ), # Deprecated, will be removed at 1.0 + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "UseSSD": fields.Bool( + required=False, dump_to="UseSSD" + ), # Deprecated, will be removed at 1.0 + "VPCId": fields.Str(required=False, dump_to="VPCId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateMongoDBReplicaSetResponseSchema(schema.ResponseSchema): + """CreateMongoDBReplicaSet - 一键创建DB副本集""" + + fields = { + "DBIds": fields.List(fields.Str(), required=False, load_from="DBIds"), + } + + """ API: CreateUDBInstance @@ -210,31 +274,54 @@ class ClearUDBLogResponseSchema(schema.ResponseSchema): """ +class CreateUDBInstanceParamLabelsSchema(schema.RequestSchema): + """CreateUDBInstanceParamLabels -""" + + fields = { + "Key": fields.Str(required=False, dump_to="Key"), + "Value": fields.Str(required=False, dump_to="Value"), + } + + class CreateUDBInstanceRequestSchema(schema.RequestSchema): - """ CreateUDBInstance - 创建UDB实例(包括创建mysql master节点、mongodb primary/configsvr节点和从备份恢复实例) - """ + """CreateUDBInstance - 创建UDB实例(包括创建mysql master节点、mongodb primary/configsvr节点和从备份恢复实例)""" fields = { "AdminPassword": fields.Str(required=True, dump_to="AdminPassword"), "AdminUser": fields.Str(required=False, dump_to="AdminUser"), + "AlarmTemplateId": fields.Str( + required=False, dump_to="AlarmTemplateId" + ), "BackupCount": fields.Int(required=False, dump_to="BackupCount"), "BackupDuration": fields.Int(required=False, dump_to="BackupDuration"), "BackupId": fields.Int(required=False, dump_to="BackupId"), "BackupTime": fields.Int(required=False, dump_to="BackupTime"), + "BackupURL": fields.Str(required=False, dump_to="BackupURL"), "BackupZone": fields.Str(required=False, dump_to="BackupZone"), "CPU": fields.Int(required=False, dump_to="CPU"), + "CaseSensitivityParam": fields.Int( + required=False, dump_to="CaseSensitivityParam" + ), "ChargeType": fields.Str(required=False, dump_to="ChargeType"), "ClusterRole": fields.Str(required=False, dump_to="ClusterRole"), "CouponId": fields.Str(required=False, dump_to="CouponId"), + "DBSubVersion": fields.Str(required=False, dump_to="DBSubVersion"), "DBTypeId": fields.Str(required=True, dump_to="DBTypeId"), "DisableSemisync": fields.Bool( required=False, dump_to="DisableSemisync" ), "DiskSpace": fields.Int(required=True, dump_to="DiskSpace"), - "HAArch": fields.Str(required=False, dump_to="HAArch"), + "EnableIpV6": fields.Bool( + required=False, dump_to="EnableIpV6" + ), # Deprecated, will be removed at 1.0 + "HAArch": fields.Str( + required=False, dump_to="HAArch" + ), # Deprecated, will be removed at 1.0 "InstanceMode": fields.Str(required=False, dump_to="InstanceMode"), "InstanceType": fields.Str(required=False, dump_to="InstanceType"), - "MemoryLimit": fields.Int(required=True, dump_to="MemoryLimit"), + "Labels": fields.List(CreateUDBInstanceParamLabelsSchema()), + "MachineType": fields.Str(required=False, dump_to="MachineType"), + "MemoryLimit": fields.Int(required=False, dump_to="MemoryLimit"), "Name": fields.Str(required=True, dump_to="Name"), "ParamGroupId": fields.Int(required=True, dump_to="ParamGroupId"), "Port": fields.Int(required=True, dump_to="Port"), @@ -242,20 +329,33 @@ class CreateUDBInstanceRequestSchema(schema.RequestSchema): "Quantity": fields.Int(required=False, dump_to="Quantity"), "Region": fields.Str(required=True, dump_to="Region"), "SSDType": fields.Str(required=False, dump_to="SSDType"), + "SemisyncFlag": fields.Int(required=False, dump_to="SemisyncFlag"), + "SpecificationClass": fields.Str( + required=False, dump_to="SpecificationClass" + ), + "SpecificationType": fields.Str( + required=False, dump_to="SpecificationType" + ), + "StorageClass": fields.Str(required=False, dump_to="StorageClass"), "SubnetId": fields.Str(required=False, dump_to="SubnetId"), "Tag": fields.Str(required=False, dump_to="Tag"), - "UDBCId": fields.Str(required=False, dump_to="UDBCId"), - "UseSSD": fields.Bool(required=False, dump_to="UseSSD"), + "UDBCId": fields.Str( + required=False, dump_to="UDBCId" + ), # Deprecated, will be removed at 1.0 + "UseSSD": fields.Bool( + required=False, dump_to="UseSSD" + ), # Deprecated, will be removed at 1.0 "VPCId": fields.Str(required=False, dump_to="VPCId"), "Zone": fields.Str(required=True, dump_to="Zone"), } class CreateUDBInstanceResponseSchema(schema.ResponseSchema): - """ CreateUDBInstance - 创建UDB实例(包括创建mysql master节点、mongodb primary/configsvr节点和从备份恢复实例) - """ + """CreateUDBInstance - 创建UDB实例(包括创建mysql master节点、mongodb primary/configsvr节点和从备份恢复实例)""" - fields = {"DBId": fields.Str(required=False, load_from="DBId")} + fields = { + "DBId": fields.Str(required=False, load_from="DBId"), + } """ @@ -266,19 +366,25 @@ class CreateUDBInstanceResponseSchema(schema.ResponseSchema): class CreateUDBInstanceByRecoveryRequestSchema(schema.RequestSchema): - """ CreateUDBInstanceByRecovery - 创建db,将新创建的db恢复到指定db某个指定时间点 - """ + """CreateUDBInstanceByRecovery - 创建db,将新创建的db恢复到指定db某个指定时间点""" fields = { + "AdminPassword": fields.Str(required=False, dump_to="AdminPassword"), "ChargeType": fields.Str(required=False, dump_to="ChargeType"), "CouponId": fields.Str(required=False, dump_to="CouponId"), + "EnableIpV6": fields.Bool(required=False, dump_to="EnableIpV6"), + "MachineType": fields.Str(required=False, dump_to="MachineType"), "Name": fields.Str(required=True, dump_to="Name"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Quantity": fields.Int(required=False, dump_to="Quantity"), "RecoveryTime": fields.Int(required=True, dump_to="RecoveryTime"), "Region": fields.Str(required=True, dump_to="Region"), + "SpecificationType": fields.Int( + required=False, dump_to="SpecificationType" + ), "SrcDBId": fields.Str(required=True, dump_to="SrcDBId"), "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "Tables": fields.Str(required=False, dump_to="Tables"), "UDBCId": fields.Str(required=False, dump_to="UDBCId"), "UseSSD": fields.Bool(required=False, dump_to="UseSSD"), "VPCId": fields.Str(required=False, dump_to="VPCId"), @@ -287,10 +393,81 @@ class CreateUDBInstanceByRecoveryRequestSchema(schema.RequestSchema): class CreateUDBInstanceByRecoveryResponseSchema(schema.ResponseSchema): - """ CreateUDBInstanceByRecovery - 创建db,将新创建的db恢复到指定db某个指定时间点 - """ + """CreateUDBInstanceByRecovery - 创建db,将新创建的db恢复到指定db某个指定时间点""" + + fields = { + "DBId": fields.Str(required=False, load_from="DBId"), + } + + +""" +API: CreateUDBMySQLInstance + +创建UDB实例(包括创建mysql NVMe、共享型和O2实例以及从备份恢复实例) +""" + + +class CreateUDBMySQLInstanceParamLabelsSchema(schema.RequestSchema): + """CreateUDBMySQLInstanceParamLabels -""" + + fields = { + "Key": fields.Str(required=False, dump_to="Key"), + "Value": fields.Str(required=False, dump_to="Value"), + } + + +class CreateUDBMySQLInstanceRequestSchema(schema.RequestSchema): + """CreateUDBMySQLInstance - 创建UDB实例(包括创建mysql NVMe、共享型和O2实例以及从备份恢复实例)""" + + fields = { + "AdminPassword": fields.Str(required=True, dump_to="AdminPassword"), + "AlarmTemplateId": fields.Str( + required=False, dump_to="AlarmTemplateId" + ), + "BackupCount": fields.Int(required=False, dump_to="BackupCount"), + "BackupDuration": fields.Int(required=False, dump_to="BackupDuration"), + "BackupId": fields.Int(required=False, dump_to="BackupId"), + "BackupTime": fields.Int(required=False, dump_to="BackupTime"), + "BackupURL": fields.Str(required=False, dump_to="BackupURL"), + "BackupZone": fields.Str(required=False, dump_to="BackupZone"), + "CaseSensitivityParam": fields.Int( + required=False, dump_to="CaseSensitivityParam" + ), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "DBSubVersion": fields.Str(required=False, dump_to="DBSubVersion"), + "DBTypeId": fields.Str(required=True, dump_to="DBTypeId"), + "DisableSemisync": fields.Bool( + required=False, dump_to="DisableSemisync" + ), + "DiskSpace": fields.Int(required=True, dump_to="DiskSpace"), + "InstanceMode": fields.Str(required=False, dump_to="InstanceMode"), + "Labels": fields.List(CreateUDBMySQLInstanceParamLabelsSchema()), + "MachineType": fields.Str(required=True, dump_to="MachineType"), + "Name": fields.Str(required=True, dump_to="Name"), + "ParamGroupId": fields.Int(required=True, dump_to="ParamGroupId"), + "Port": fields.Int(required=True, dump_to="Port"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "SemisyncFlag": fields.Int(required=False, dump_to="SemisyncFlag"), + "SpecificationClass": fields.Str( + required=True, dump_to="SpecificationClass" + ), + "StorageClass": fields.Str(required=True, dump_to="StorageClass"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } - fields = {"DBId": fields.Str(required=False, load_from="DBId")} + +class CreateUDBMySQLInstanceResponseSchema(schema.ResponseSchema): + """CreateUDBMySQLInstance - 创建UDB实例(包括创建mysql NVMe、共享型和O2实例以及从备份恢复实例)""" + + fields = { + "DBId": fields.Str(required=False, load_from="DBId"), + } """ @@ -301,8 +478,7 @@ class CreateUDBInstanceByRecoveryResponseSchema(schema.ResponseSchema): class CreateUDBParamGroupRequestSchema(schema.RequestSchema): - """ CreateUDBParamGroup - 从已有配置文件创建新配置文件 - """ + """CreateUDBParamGroup - 从已有配置文件创建新配置文件""" fields = { "DBTypeId": fields.Str(required=True, dump_to="DBTypeId"), @@ -317,10 +493,11 @@ class CreateUDBParamGroupRequestSchema(schema.RequestSchema): class CreateUDBParamGroupResponseSchema(schema.ResponseSchema): - """ CreateUDBParamGroup - 从已有配置文件创建新配置文件 - """ + """CreateUDBParamGroup - 从已有配置文件创建新配置文件""" - fields = {"GroupId": fields.Int(required=False, load_from="GroupId")} + fields = { + "GroupId": fields.Int(required=False, load_from="GroupId"), + } """ @@ -331,15 +508,17 @@ class CreateUDBParamGroupResponseSchema(schema.ResponseSchema): class CreateUDBReplicationInstanceRequestSchema(schema.RequestSchema): - """ CreateUDBReplicationInstance - 创建MongoDB的副本节点(包括仲裁) - """ + """CreateUDBReplicationInstance - 创建MongoDB的副本节点(包括仲裁)""" fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), "CouponId": fields.Str(required=False, dump_to="CouponId"), + "InstanceType": fields.Str(required=False, dump_to="InstanceType"), "IsArbiter": fields.Bool(required=False, dump_to="IsArbiter"), "Name": fields.Str(required=True, dump_to="Name"), "Port": fields.Int(required=False, dump_to="Port"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Str(required=False, dump_to="Quantity"), "Region": fields.Str(required=True, dump_to="Region"), "SrcId": fields.Str(required=True, dump_to="SrcId"), "UseSSD": fields.Bool(required=False, dump_to="UseSSD"), @@ -348,10 +527,11 @@ class CreateUDBReplicationInstanceRequestSchema(schema.RequestSchema): class CreateUDBReplicationInstanceResponseSchema(schema.ResponseSchema): - """ CreateUDBReplicationInstance - 创建MongoDB的副本节点(包括仲裁) - """ + """CreateUDBReplicationInstance - 创建MongoDB的副本节点(包括仲裁)""" - fields = {"DBId": fields.Str(required=False, load_from="DBId")} + fields = { + "DBId": fields.Str(required=False, load_from="DBId"), + } """ @@ -362,8 +542,7 @@ class CreateUDBReplicationInstanceResponseSchema(schema.ResponseSchema): class CreateUDBRouteInstanceRequestSchema(schema.RequestSchema): - """ CreateUDBRouteInstance - 创建mongos实例 - """ + """CreateUDBRouteInstance - 创建mongos实例""" fields = { "ChargeType": fields.Str(required=False, dump_to="ChargeType"), @@ -384,10 +563,73 @@ class CreateUDBRouteInstanceRequestSchema(schema.RequestSchema): class CreateUDBRouteInstanceResponseSchema(schema.ResponseSchema): - """ CreateUDBRouteInstance - 创建mongos实例 - """ + """CreateUDBRouteInstance - 创建mongos实例""" + + fields = { + "DBId": fields.Str(required=False, load_from="DBId"), + } + + +""" +API: CreateUDBSQLServerInstance + +创建UDB实例(包括创建SQLServer实例以及从备份恢复实例) +""" + + +class CreateUDBSQLServerInstanceParamLabelsSchema(schema.RequestSchema): + """CreateUDBSQLServerInstanceParamLabels -""" + + fields = { + "Key": fields.Str(required=False, dump_to="Key"), + "Value": fields.Str(required=False, dump_to="Value"), + } + + +class CreateUDBSQLServerInstanceRequestSchema(schema.RequestSchema): + """CreateUDBSQLServerInstance - 创建UDB实例(包括创建SQLServer实例以及从备份恢复实例)""" + + fields = { + "AdminPassword": fields.Str(required=True, dump_to="AdminPassword"), + "AlarmTemplateId": fields.Str( + required=False, dump_to="AlarmTemplateId" + ), + "BackupCount": fields.Int(required=False, dump_to="BackupCount"), + "BackupDuration": fields.Int(required=False, dump_to="BackupDuration"), + "BackupId": fields.Int(required=False, dump_to="BackupId"), + "BackupTime": fields.Int(required=False, dump_to="BackupTime"), + "BackupURL": fields.Str(required=False, dump_to="BackupURL"), + "CPU": fields.Int(required=False, dump_to="CPU"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "DBTypeId": fields.Str(required=True, dump_to="DBTypeId"), + "DiskSpace": fields.Int(required=True, dump_to="DiskSpace"), + "InstanceMode": fields.Str(required=False, dump_to="InstanceMode"), + "Labels": fields.List(CreateUDBSQLServerInstanceParamLabelsSchema()), + "MachineType": fields.Str(required=False, dump_to="MachineType"), + "MemoryLimit": fields.Int(required=False, dump_to="MemoryLimit"), + "Name": fields.Str(required=True, dump_to="Name"), + "Port": fields.Int(required=True, dump_to="Port"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "SpecificationClass": fields.Str( + required=True, dump_to="SpecificationClass" + ), + "StorageClass": fields.Str(required=True, dump_to="StorageClass"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateUDBSQLServerInstanceResponseSchema(schema.ResponseSchema): + """CreateUDBSQLServerInstance - 创建UDB实例(包括创建SQLServer实例以及从备份恢复实例)""" - fields = {"DBId": fields.Str(required=False, load_from="DBId")} + fields = { + "DBId": fields.Str(required=False, load_from="DBId"), + } """ @@ -398,44 +640,62 @@ class CreateUDBRouteInstanceResponseSchema(schema.ResponseSchema): class CreateUDBSlaveRequestSchema(schema.RequestSchema): - """ CreateUDBSlave - 创建UDB实例的slave - """ + """CreateUDBSlave - 创建UDB实例的slave""" fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), "CouponId": fields.Str(required=False, dump_to="CouponId"), + "DelaySeconds": fields.Int(required=False, dump_to="DelaySeconds"), "DiskSpace": fields.Int(required=False, dump_to="DiskSpace"), - "InstanceMode": fields.Str(required=False, dump_to="InstanceMode"), - "InstanceType": fields.Str(required=False, dump_to="InstanceType"), + "InstanceMode": fields.Str( + required=False, dump_to="InstanceMode" + ), # Deprecated, will be removed at 1.0 + "InstanceType": fields.Str( + required=False, dump_to="InstanceType" + ), # Deprecated, will be removed at 1.0 + "IsCreatePhysically": fields.Bool( + required=False, dump_to="IsCreatePhysically" + ), "IsLock": fields.Bool(required=False, dump_to="IsLock"), + "MachineType": fields.Str(required=False, dump_to="MachineType"), "MemoryLimit": fields.Int(required=False, dump_to="MemoryLimit"), "Name": fields.Str(required=True, dump_to="Name"), + "ParamGroupId": fields.Int(required=False, dump_to="ParamGroupId"), "Port": fields.Int(required=False, dump_to="Port"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), "Region": fields.Str(required=True, dump_to="Region"), "SSDType": fields.Str(required=False, dump_to="SSDType"), + "SpecificationType": fields.Int( + required=False, dump_to="SpecificationType" + ), "SrcId": fields.Str(required=True, dump_to="SrcId"), - "UseSSD": fields.Bool(required=False, dump_to="UseSSD"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "UseSSD": fields.Bool( + required=False, dump_to="UseSSD" + ), # Deprecated, will be removed at 1.0 + "VPCId": fields.Str(required=False, dump_to="VPCId"), "Zone": fields.Str(required=False, dump_to="Zone"), } class CreateUDBSlaveResponseSchema(schema.ResponseSchema): - """ CreateUDBSlave - 创建UDB实例的slave - """ + """CreateUDBSlave - 创建UDB实例的slave""" - fields = {"DBId": fields.Str(required=False, load_from="DBId")} + fields = { + "DBId": fields.Str(required=False, load_from="DBId"), + } """ API: DeleteUDBBackup -删除UDB实例备份 + """ class DeleteUDBBackupRequestSchema(schema.RequestSchema): - """ DeleteUDBBackup - 删除UDB实例备份 - """ + """DeleteUDBBackup -""" fields = { "BackupId": fields.Int(required=True, dump_to="BackupId"), @@ -447,8 +707,7 @@ class DeleteUDBBackupRequestSchema(schema.RequestSchema): class DeleteUDBBackupResponseSchema(schema.ResponseSchema): - """ DeleteUDBBackup - 删除UDB实例备份 - """ + """DeleteUDBBackup -""" fields = {} @@ -461,8 +720,7 @@ class DeleteUDBBackupResponseSchema(schema.ResponseSchema): class DeleteUDBInstanceRequestSchema(schema.RequestSchema): - """ DeleteUDBInstance - 删除UDB实例 - """ + """DeleteUDBInstance - 删除UDB实例""" fields = { "DBId": fields.Str(required=True, dump_to="DBId"), @@ -474,8 +732,7 @@ class DeleteUDBInstanceRequestSchema(schema.RequestSchema): class DeleteUDBInstanceResponseSchema(schema.ResponseSchema): - """ DeleteUDBInstance - 删除UDB实例 - """ + """DeleteUDBInstance - 删除UDB实例""" fields = {} @@ -488,8 +745,7 @@ class DeleteUDBInstanceResponseSchema(schema.ResponseSchema): class DeleteUDBLogPackageRequestSchema(schema.RequestSchema): - """ DeleteUDBLogPackage - 删除UDB日志包 - """ + """DeleteUDBLogPackage - 删除UDB日志包""" fields = { "BackupId": fields.Int(required=True, dump_to="BackupId"), @@ -501,8 +757,7 @@ class DeleteUDBLogPackageRequestSchema(schema.RequestSchema): class DeleteUDBLogPackageResponseSchema(schema.ResponseSchema): - """ DeleteUDBLogPackage - 删除UDB日志包 - """ + """DeleteUDBLogPackage - 删除UDB日志包""" fields = {} @@ -515,8 +770,7 @@ class DeleteUDBLogPackageResponseSchema(schema.ResponseSchema): class DeleteUDBParamGroupRequestSchema(schema.RequestSchema): - """ DeleteUDBParamGroup - 删除配置参数组 - """ + """DeleteUDBParamGroup - 删除配置参数组""" fields = { "GroupId": fields.Int(required=True, dump_to="GroupId"), @@ -528,12 +782,48 @@ class DeleteUDBParamGroupRequestSchema(schema.RequestSchema): class DeleteUDBParamGroupResponseSchema(schema.ResponseSchema): - """ DeleteUDBParamGroup - 删除配置参数组 - """ + """DeleteUDBParamGroup - 删除配置参数组""" fields = {} +""" +API: DescribeMongoDBShardedCluster + + +""" + + +class DescribeMongoDBShardedClusterRequestSchema(schema.RequestSchema): + """DescribeMongoDBShardedCluster -""" + + fields = { + "ClusterRole": fields.Str(required=False, dump_to="ClusterRole"), + "Limit": fields.Int(required=True, dump_to="Limit"), + "Offset": fields.Int(required=True, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ShardedCluster": fields.Str(required=False, dump_to="ShardedCluster"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeMongoDBShardedClusterResponseSchema(schema.ResponseSchema): + """DescribeMongoDBShardedCluster -""" + + fields = { + "DataSet": fields.List( + models.UDBInstanceSetSchema(), required=False, load_from="DataSet" + ), + "ShardedClusterSet": fields.List( + models.MongoDBShardedClusterSetSchema(), + required=False, + load_from="ShardedClusterSet", + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + """ API: DescribeUDBBackup @@ -542,11 +832,12 @@ class DeleteUDBParamGroupResponseSchema(schema.ResponseSchema): class DescribeUDBBackupRequestSchema(schema.RequestSchema): - """ DescribeUDBBackup - 列表UDB实例备份信息.Zone不填表示多可用区,填代表单可用区 - """ + """DescribeUDBBackup - 列表UDB实例备份信息.Zone不填表示多可用区,填代表单可用区""" fields = { - "BackupId": fields.Int(required=False, dump_to="BackupId"), + "BackupId": fields.Int( + required=False, dump_to="BackupId" + ), # Deprecated, will be removed at 1.0 "BackupType": fields.Int(required=False, dump_to="BackupType"), "BeginTime": fields.Int(required=False, dump_to="BeginTime"), "ClassType": fields.Str(required=False, dump_to="ClassType"), @@ -561,8 +852,7 @@ class DescribeUDBBackupRequestSchema(schema.RequestSchema): class DescribeUDBBackupResponseSchema(schema.ResponseSchema): - """ DescribeUDBBackup - 列表UDB实例备份信息.Zone不填表示多可用区,填代表单可用区 - """ + """DescribeUDBBackup - 列表UDB实例备份信息.Zone不填表示多可用区,填代表单可用区""" fields = { "DataSet": fields.List( @@ -580,8 +870,7 @@ class DescribeUDBBackupResponseSchema(schema.ResponseSchema): class DescribeUDBBackupBlacklistRequestSchema(schema.RequestSchema): - """ DescribeUDBBackupBlacklist - 获取UDB实例的备份黑名单 - """ + """DescribeUDBBackupBlacklist - 获取UDB实例的备份黑名单""" fields = { "DBId": fields.Str(required=True, dump_to="DBId"), @@ -592,25 +881,59 @@ class DescribeUDBBackupBlacklistRequestSchema(schema.RequestSchema): class DescribeUDBBackupBlacklistResponseSchema(schema.ResponseSchema): - """ DescribeUDBBackupBlacklist - 获取UDB实例的备份黑名单 - """ + """DescribeUDBBackupBlacklist - 获取UDB实例的备份黑名单""" + + fields = { + "Blacklist": fields.Str(required=False, load_from="Blacklist"), + } + + +""" +API: DescribeUDBBinlogBackup + +列表UDB实例Binlog自动备份信息 +""" + + +class DescribeUDBBinlogBackupRequestSchema(schema.RequestSchema): + """DescribeUDBBinlogBackup - 列表UDB实例Binlog自动备份信息""" + + fields = { + "BeginTime": fields.Int(required=False, dump_to="BeginTime"), + "DBId": fields.Str(required=False, dump_to="DBId"), + "EndTime": fields.Int(required=False, dump_to="EndTime"), + "Limit": fields.Int(required=True, dump_to="Limit"), + "Offset": fields.Int(required=True, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } - fields = {"Blacklist": fields.Str(required=False, load_from="Blacklist")} + +class DescribeUDBBinlogBackupResponseSchema(schema.ResponseSchema): + """DescribeUDBBinlogBackup - 列表UDB实例Binlog自动备份信息""" + + fields = { + "DataSet": fields.List( + models.BinlogBackupSetSchema(), required=False, load_from="DataSet" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } """ API: DescribeUDBBinlogBackupURL -获取UDB的Binlog备份地址 +获取UDB的Binlog或者错误日志或者慢查询日志的备份地址 """ class DescribeUDBBinlogBackupURLRequestSchema(schema.RequestSchema): - """ DescribeUDBBinlogBackupURL - 获取UDB的Binlog备份地址 - """ + """DescribeUDBBinlogBackupURL - 获取UDB的Binlog或者错误日志或者慢查询日志的备份地址""" fields = { "BackupId": fields.Int(required=True, dump_to="BackupId"), + "BinlogType": fields.Str(required=True, dump_to="BinlogType"), "DBId": fields.Str(required=True, dump_to="DBId"), "Region": fields.Str(required=True, dump_to="Region"), "Zone": fields.Str(required=False, dump_to="Zone"), @@ -618,8 +941,7 @@ class DescribeUDBBinlogBackupURLRequestSchema(schema.RequestSchema): class DescribeUDBBinlogBackupURLResponseSchema(schema.ResponseSchema): - """ DescribeUDBBinlogBackupURL - 获取UDB的Binlog备份地址 - """ + """DescribeUDBBinlogBackupURL - 获取UDB的Binlog或者错误日志或者慢查询日志的备份地址""" fields = { "BackupPath": fields.Str(required=False, load_from="BackupPath"), @@ -637,8 +959,7 @@ class DescribeUDBBinlogBackupURLResponseSchema(schema.ResponseSchema): class DescribeUDBInstanceRequestSchema(schema.RequestSchema): - """ DescribeUDBInstance - 获取UDB实例信息,支持两类操作:(1)指定DBId用于获取该db的信息;(2)指定ClassType、Offset、Limit用于列表操作,查询某一个类型db。 - """ + """DescribeUDBInstance - 获取UDB实例信息,支持两类操作:(1)指定DBId用于获取该db的信息;(2)指定ClassType、Offset、Limit用于列表操作,查询某一个类型db。""" fields = { "ClassType": fields.Str(required=False, dump_to="ClassType"), @@ -649,14 +970,15 @@ class DescribeUDBInstanceRequestSchema(schema.RequestSchema): "Offset": fields.Int(required=False, dump_to="Offset"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), + "Tag": fields.Str(required=False, dump_to="Tag"), "UDBCId": fields.Str(required=False, dump_to="UDBCId"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), "Zone": fields.Str(required=False, dump_to="Zone"), } class DescribeUDBInstanceResponseSchema(schema.ResponseSchema): - """ DescribeUDBInstance - 获取UDB实例信息,支持两类操作:(1)指定DBId用于获取该db的信息;(2)指定ClassType、Offset、Limit用于列表操作,查询某一个类型db。 - """ + """DescribeUDBInstance - 获取UDB实例信息,支持两类操作:(1)指定DBId用于获取该db的信息;(2)指定ClassType、Offset、Limit用于列表操作,查询某一个类型db。""" fields = { "DataSet": fields.List( @@ -674,8 +996,7 @@ class DescribeUDBInstanceResponseSchema(schema.ResponseSchema): class DescribeUDBInstanceBackupStateRequestSchema(schema.RequestSchema): - """ DescribeUDBInstanceBackupState - 获取UDB实例备份状态 - """ + """DescribeUDBInstanceBackupState - 获取UDB实例备份状态""" fields = { "BackupId": fields.Int(required=True, dump_to="BackupId"), @@ -687,8 +1008,7 @@ class DescribeUDBInstanceBackupStateRequestSchema(schema.RequestSchema): class DescribeUDBInstanceBackupStateResponseSchema(schema.ResponseSchema): - """ DescribeUDBInstanceBackupState - 获取UDB实例备份状态 - """ + """DescribeUDBInstanceBackupState - 获取UDB实例备份状态""" fields = { "BackupEndTime": fields.Int(required=False, load_from="BackupEndTime"), @@ -705,27 +1025,27 @@ class DescribeUDBInstanceBackupStateResponseSchema(schema.ResponseSchema): class DescribeUDBInstanceBackupURLRequestSchema(schema.RequestSchema): - """ DescribeUDBInstanceBackupURL - 获取UDB备份下载地址 - """ + """DescribeUDBInstanceBackupURL - 获取UDB备份下载地址""" fields = { "BackupId": fields.Int(required=True, dump_to="BackupId"), "DBId": fields.Str(required=True, dump_to="DBId"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), + "ValidTime": fields.Int(required=False, dump_to="ValidTime"), "Zone": fields.Str(required=False, dump_to="Zone"), } class DescribeUDBInstanceBackupURLResponseSchema(schema.ResponseSchema): - """ DescribeUDBInstanceBackupURL - 获取UDB备份下载地址 - """ + """DescribeUDBInstanceBackupURL - 获取UDB备份下载地址""" fields = { "BackupPath": fields.Str(required=False, load_from="BackupPath"), "InnerBackupPath": fields.Str( required=False, load_from="InnerBackupPath" ), + "MD5": fields.Str(required=False, load_from="MD5"), } @@ -737,8 +1057,7 @@ class DescribeUDBInstanceBackupURLResponseSchema(schema.ResponseSchema): class DescribeUDBInstanceBinlogRequestSchema(schema.RequestSchema): - """ DescribeUDBInstanceBinlog - 获取UDB指定时间段的binlog列表 - """ + """DescribeUDBInstanceBinlog - 获取UDB指定时间段的binlog列表""" fields = { "BeginTime": fields.Int(required=True, dump_to="BeginTime"), @@ -751,15 +1070,14 @@ class DescribeUDBInstanceBinlogRequestSchema(schema.RequestSchema): class DescribeUDBInstanceBinlogResponseSchema(schema.ResponseSchema): - """ DescribeUDBInstanceBinlog - 获取UDB指定时间段的binlog列表 - """ + """DescribeUDBInstanceBinlog - 获取UDB指定时间段的binlog列表""" fields = { "DataSet": fields.List( models.UDBInstanceBinlogSetSchema(), required=False, load_from="DataSet", - ) + ), } @@ -771,8 +1089,7 @@ class DescribeUDBInstanceBinlogResponseSchema(schema.ResponseSchema): class DescribeUDBInstanceBinlogBackupStateRequestSchema(schema.RequestSchema): - """ DescribeUDBInstanceBinlogBackupState - 获取udb实例备份状态 - """ + """DescribeUDBInstanceBinlogBackupState - 获取udb实例备份状态""" fields = { "BackupId": fields.Int(required=True, dump_to="BackupId"), @@ -784,51 +1101,92 @@ class DescribeUDBInstanceBinlogBackupStateRequestSchema(schema.RequestSchema): class DescribeUDBInstanceBinlogBackupStateResponseSchema(schema.ResponseSchema): - """ DescribeUDBInstanceBinlogBackupState - 获取udb实例备份状态 - """ + """DescribeUDBInstanceBinlogBackupState - 获取udb实例备份状态""" fields = { - "BackupSize": fields.Int(required=False, load_from="BackupSize"), + "BackupSize": fields.Int( + required=False, load_from="BackupSize" + ), # Deprecated, will be removed at 1.0 "State": fields.Str(required=False, load_from="State"), } """ -API: DescribeUDBInstancePrice +API: DescribeUDBInstanceLog -获取UDB实例价格信息 +查询某一段时间内UDB的错误日志或慢查询日志 """ -class DescribeUDBInstancePriceRequestSchema(schema.RequestSchema): - """ DescribeUDBInstancePrice - 获取UDB实例价格信息 - """ +class DescribeUDBInstanceLogRequestSchema(schema.RequestSchema): + """DescribeUDBInstanceLog - 查询某一段时间内UDB的错误日志或慢查询日志""" fields = { - "ChargeType": fields.Str(required=False, dump_to="ChargeType"), - "Count": fields.Int(required=False, dump_to="Count"), + "BeginTime": fields.Int(required=True, dump_to="BeginTime"), + "DBId": fields.Str(required=True, dump_to="DBId"), + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "LogType": fields.Str(required=True, dump_to="LogType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DescribeUDBInstanceLogResponseSchema(schema.ResponseSchema): + """DescribeUDBInstanceLog - 查询某一段时间内UDB的错误日志或慢查询日志""" + + fields = { + "Log": fields.Str(required=False, load_from="Log"), + "NextTime": fields.Str(required=False, load_from="NextTime"), + } + + +""" +API: DescribeUDBInstancePrice + +获取UDB实例价格信息 +""" + + +class DescribeUDBInstancePriceRequestSchema(schema.RequestSchema): + """DescribeUDBInstancePrice - 获取UDB实例价格信息""" + + fields = { + "CPU": fields.Int(required=False, dump_to="CPU"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "Count": fields.Int(required=False, dump_to="Count"), "DBTypeId": fields.Str(required=True, dump_to="DBTypeId"), "DiskSpace": fields.Int(required=True, dump_to="DiskSpace"), "InstanceMode": fields.Str(required=False, dump_to="InstanceMode"), + "InstanceType": fields.Str(required=False, dump_to="InstanceType"), + "MachineType": fields.Str(required=False, dump_to="MachineType"), "MemoryLimit": fields.Int(required=True, dump_to="MemoryLimit"), "Quantity": fields.Int(required=False, dump_to="Quantity"), "Region": fields.Str(required=True, dump_to="Region"), "SSDType": fields.Str(required=False, dump_to="SSDType"), - "UseSSD": fields.Str(required=False, dump_to="UseSSD"), + "SpecificationClass": fields.Str( + required=False, dump_to="SpecificationClass" + ), + "SpecificationType": fields.Int( + required=False, dump_to="SpecificationType" + ), + "StorageClass": fields.Str(required=False, dump_to="StorageClass"), + "UseSSD": fields.Str( + required=False, dump_to="UseSSD" + ), # Deprecated, will be removed at 1.0 "Zone": fields.Str(required=True, dump_to="Zone"), } class DescribeUDBInstancePriceResponseSchema(schema.ResponseSchema): - """ DescribeUDBInstancePrice - 获取UDB实例价格信息 - """ + """DescribeUDBInstancePrice - 获取UDB实例价格信息""" fields = { "DataSet": fields.List( models.UDBInstancePriceSetSchema(), required=False, load_from="DataSet", - ) + ), } @@ -840,8 +1198,7 @@ class DescribeUDBInstancePriceResponseSchema(schema.ResponseSchema): class DescribeUDBInstanceStateRequestSchema(schema.RequestSchema): - """ DescribeUDBInstanceState - 获取UDB实例状态 - """ + """DescribeUDBInstanceState - 获取UDB实例状态""" fields = { "DBId": fields.Str(required=True, dump_to="DBId"), @@ -852,10 +1209,11 @@ class DescribeUDBInstanceStateRequestSchema(schema.RequestSchema): class DescribeUDBInstanceStateResponseSchema(schema.ResponseSchema): - """ DescribeUDBInstanceState - 获取UDB实例状态 - """ + """DescribeUDBInstanceState - 获取UDB实例状态""" - fields = {"State": fields.Str(required=False, load_from="State")} + fields = { + "State": fields.Str(required=False, load_from="State"), + } """ @@ -866,50 +1224,58 @@ class DescribeUDBInstanceStateResponseSchema(schema.ResponseSchema): class DescribeUDBInstanceUpgradePriceRequestSchema(schema.RequestSchema): - """ DescribeUDBInstanceUpgradePrice - 获取UDB实例升降级价格信息 - """ + """DescribeUDBInstanceUpgradePrice - 获取UDB实例升降级价格信息""" fields = { + "CPU": fields.Int(required=False, dump_to="CPU"), "DBId": fields.Str(required=True, dump_to="DBId"), "DiskSpace": fields.Int(required=True, dump_to="DiskSpace"), + "InstanceType": fields.Str(required=False, dump_to="InstanceType"), + "MachineType": fields.Str(required=False, dump_to="MachineType"), "MemoryLimit": fields.Int(required=True, dump_to="MemoryLimit"), + "OrderStartTime": fields.Int(required=False, dump_to="OrderStartTime"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "SSDType": fields.Str(required=False, dump_to="SSDType"), - "UseSSD": fields.Bool(required=False, dump_to="UseSSD"), + "SpecificationType": fields.Int( + required=False, dump_to="SpecificationType" + ), + "UseSSD": fields.Bool( + required=False, dump_to="UseSSD" + ), # Deprecated, will be removed at 1.0 "Zone": fields.Str(required=False, dump_to="Zone"), } class DescribeUDBInstanceUpgradePriceResponseSchema(schema.ResponseSchema): - """ DescribeUDBInstanceUpgradePrice - 获取UDB实例升降级价格信息 - """ + """DescribeUDBInstanceUpgradePrice - 获取UDB实例升降级价格信息""" - fields = {"Price": fields.Int(required=False, load_from="Price")} + fields = { + "Price": fields.Int(required=False, load_from="Price"), + } """ API: DescribeUDBLogBackupURL -获取UDB的slowlog备份地址 +获取UDB的错误日志或者慢查询日志备份地址 """ class DescribeUDBLogBackupURLRequestSchema(schema.RequestSchema): - """ DescribeUDBLogBackupURL - 获取UDB的slowlog备份地址 - """ + """DescribeUDBLogBackupURL - 获取UDB的错误日志或者慢查询日志备份地址""" fields = { "BackupId": fields.Int(required=True, dump_to="BackupId"), "DBId": fields.Str(required=True, dump_to="DBId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "Zone": fields.Str(required=False, dump_to="Zone"), } class DescribeUDBLogBackupURLResponseSchema(schema.ResponseSchema): - """ DescribeUDBLogBackupURL - 获取UDB的slowlog备份地址 - """ + """DescribeUDBLogBackupURL - 获取UDB的错误日志或者慢查询日志备份地址""" fields = { "BackupPath": fields.Str(required=False, load_from="BackupPath"), @@ -925,8 +1291,7 @@ class DescribeUDBLogBackupURLResponseSchema(schema.ResponseSchema): class DescribeUDBLogPackageRequestSchema(schema.RequestSchema): - """ DescribeUDBLogPackage - 列表UDB实例binlog或slowlog或errorlog备份信息 - """ + """DescribeUDBLogPackage - 列表UDB实例binlog或slowlog或errorlog备份信息""" fields = { "BeginTime": fields.Int(required=False, dump_to="BeginTime"), @@ -943,8 +1308,7 @@ class DescribeUDBLogPackageRequestSchema(schema.RequestSchema): class DescribeUDBLogPackageResponseSchema(schema.ResponseSchema): - """ DescribeUDBLogPackage - 列表UDB实例binlog或slowlog或errorlog备份信息 - """ + """DescribeUDBLogPackage - 列表UDB实例binlog或slowlog或errorlog备份信息""" fields = { "DataSet": fields.List( @@ -964,8 +1328,7 @@ class DescribeUDBLogPackageResponseSchema(schema.ResponseSchema): class DescribeUDBParamGroupRequestSchema(schema.RequestSchema): - """ DescribeUDBParamGroup - 获取参数组详细参数信息 - """ + """DescribeUDBParamGroup - 获取参数组详细参数信息""" fields = { "ClassType": fields.Str(required=False, dump_to="ClassType"), @@ -981,8 +1344,7 @@ class DescribeUDBParamGroupRequestSchema(schema.RequestSchema): class DescribeUDBParamGroupResponseSchema(schema.ResponseSchema): - """ DescribeUDBParamGroup - 获取参数组详细参数信息 - """ + """DescribeUDBParamGroup - 获取参数组详细参数信息""" fields = { "DataSet": fields.List( @@ -992,6 +1354,45 @@ class DescribeUDBParamGroupResponseSchema(schema.ResponseSchema): } +""" +API: DescribeUDBSplittingInfo + +描述读写分离功能的详细信息 +""" + + +class DescribeUDBSplittingInfoRequestSchema(schema.RequestSchema): + """DescribeUDBSplittingInfo - 描述读写分离功能的详细信息""" + + fields = { + "MasterDBId": fields.Str(required=True, dump_to="MasterDBId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeUDBSplittingInfoResponseSchema(schema.ResponseSchema): + """DescribeUDBSplittingInfo - 描述读写分离功能的详细信息""" + + fields = { + "DBTypeId": fields.Str(required=False, load_from="DBTypeId"), + "DataSet": fields.List( + models.UDBRWSplittingSetSchema(), + required=False, + load_from="DataSet", + ), + "DelayThreshold": fields.Int( + required=False, load_from="DelayThreshold" + ), + "MasterDBId": fields.Str(required=False, load_from="MasterDBId"), + "Port": fields.Int(required=False, load_from="Port"), + "RWIP": fields.Str(required=False, load_from="RWIP"), + "RWState": fields.Str(required=False, load_from="RWState"), + "ReadModel": fields.Str(required=False, load_from="ReadModel"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + """ API: DescribeUDBType @@ -1000,12 +1401,15 @@ class DescribeUDBParamGroupResponseSchema(schema.ResponseSchema): class DescribeUDBTypeRequestSchema(schema.RequestSchema): - """ DescribeUDBType - 获取UDB支持的类型信息 - """ + """DescribeUDBType - 获取UDB支持的类型信息""" fields = { "BackupZone": fields.Str(required=False, dump_to="BackupZone"), + "CompatibleWithDBType": fields.Str( + required=False, dump_to="CompatibleWithDBType" + ), "DBClusterType": fields.Str(required=False, dump_to="DBClusterType"), + "DBSubVersion": fields.Str(required=False, dump_to="DBSubVersion"), "DiskType": fields.Str(required=False, dump_to="DiskType"), "InstanceMode": fields.Str(required=False, dump_to="InstanceMode"), "Region": fields.Str(required=True, dump_to="Region"), @@ -1014,18 +1418,38 @@ class DescribeUDBTypeRequestSchema(schema.RequestSchema): class DescribeUDBTypeResponseSchema(schema.ResponseSchema): - """ DescribeUDBType - 获取UDB支持的类型信息 - """ + """DescribeUDBType - 获取UDB支持的类型信息""" fields = { - "Action": fields.Str(required=True, load_from="Action"), "DataSet": fields.List( models.UDBTypeSetSchema(), required=False, load_from="DataSet" ), - "RetCode": fields.Int(required=True, load_from="RetCode"), } +""" +API: DisableUDBRWSplitting + +关闭DB的读写分离功能 +""" + + +class DisableUDBRWSplittingRequestSchema(schema.RequestSchema): + """DisableUDBRWSplitting - 关闭DB的读写分离功能""" + + fields = { + "MasterDBId": fields.Str(required=True, dump_to="MasterDBId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DisableUDBRWSplittingResponseSchema(schema.ResponseSchema): + """DisableUDBRWSplitting - 关闭DB的读写分离功能""" + + fields = {} + + """ API: EditUDBBackupBlacklist @@ -1034,8 +1458,7 @@ class DescribeUDBTypeResponseSchema(schema.ResponseSchema): class EditUDBBackupBlacklistRequestSchema(schema.RequestSchema): - """ EditUDBBackupBlacklist - 编辑UDB实例的备份黑名单 - """ + """EditUDBBackupBlacklist - 编辑UDB实例的备份黑名单""" fields = { "Blacklist": fields.Str(required=True, dump_to="Blacklist"), @@ -1047,12 +1470,64 @@ class EditUDBBackupBlacklistRequestSchema(schema.RequestSchema): class EditUDBBackupBlacklistResponseSchema(schema.ResponseSchema): - """ EditUDBBackupBlacklist - 编辑UDB实例的备份黑名单 - """ + """EditUDBBackupBlacklist - 编辑UDB实例的备份黑名单""" fields = {} +""" +API: EnableUDBRWSplitting + +开启DB的读写分离功能 +""" + + +class EnableUDBRWSplittingRequestSchema(schema.RequestSchema): + """EnableUDBRWSplitting - 开启DB的读写分离功能""" + + fields = { + "BackupZone": fields.Str(required=False, dump_to="BackupZone"), + "MasterDBId": fields.Str(required=True, dump_to="MasterDBId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class EnableUDBRWSplittingResponseSchema(schema.ResponseSchema): + """EnableUDBRWSplitting - 开启DB的读写分离功能""" + + fields = { + "MasterDBId": fields.Str(required=False, load_from="MasterDBId"), + "RWIp": fields.Str(required=False, load_from="RWIp"), + } + + +""" +API: ExtractUDBParamGroup + +获取配置文件内容 +""" + + +class ExtractUDBParamGroupRequestSchema(schema.RequestSchema): + """ExtractUDBParamGroup - 获取配置文件内容""" + + fields = { + "GroupId": fields.Int(required=True, dump_to="GroupId"), + "Region": fields.Str(required=True, dump_to="Region"), + "RegionFlag": fields.Bool(required=False, dump_to="RegionFlag"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class ExtractUDBParamGroupResponseSchema(schema.ResponseSchema): + """ExtractUDBParamGroup - 获取配置文件内容""" + + fields = { + "Content": fields.Str(required=True, load_from="Content"), + } + + """ API: FetchUDBInstanceEarliestRecoverTime @@ -1061,8 +1536,7 @@ class EditUDBBackupBlacklistResponseSchema(schema.ResponseSchema): class FetchUDBInstanceEarliestRecoverTimeRequestSchema(schema.RequestSchema): - """ FetchUDBInstanceEarliestRecoverTime - 获取UDB最早可回档的时间点 - """ + """FetchUDBInstanceEarliestRecoverTime - 获取UDB最早可回档的时间点""" fields = { "DBId": fields.Str(required=True, dump_to="DBId"), @@ -1073,11 +1547,122 @@ class FetchUDBInstanceEarliestRecoverTimeRequestSchema(schema.RequestSchema): class FetchUDBInstanceEarliestRecoverTimeResponseSchema(schema.ResponseSchema): - """ FetchUDBInstanceEarliestRecoverTime - 获取UDB最早可回档的时间点 - """ + """FetchUDBInstanceEarliestRecoverTime - 获取UDB最早可回档的时间点""" + + fields = { + "EarliestTime": fields.Int(required=False, load_from="EarliestTime"), + } + + +""" +API: GetUDBClientConnNum + +输入一个DBID,能够获取客户端来源IP以及对应的连接数 +""" + + +class GetUDBClientConnNumRequestSchema(schema.RequestSchema): + """GetUDBClientConnNum - 输入一个DBID,能够获取客户端来源IP以及对应的连接数""" + + fields = { + "DBId": fields.Str(required=True, dump_to="DBId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetUDBClientConnNumResponseSchema(schema.ResponseSchema): + """GetUDBClientConnNum - 输入一个DBID,能够获取客户端来源IP以及对应的连接数""" + + fields = { + "DataSet": fields.List( + models.ConnNumMapSchema(), required=True, load_from="DataSet" + ), + } + + +""" +API: GetUDBInstanceSSLCertURL + +获取SSL证书下载地址 +""" + + +class GetUDBInstanceSSLCertURLRequestSchema(schema.RequestSchema): + """GetUDBInstanceSSLCertURL - 获取SSL证书下载地址""" + + fields = { + "DBId": fields.Str(required=True, dump_to="DBId"), + "ExpireTime": fields.Int(required=False, dump_to="ExpireTime"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetUDBInstanceSSLCertURLResponseSchema(schema.ResponseSchema): + """GetUDBInstanceSSLCertURL - 获取SSL证书下载地址""" + + fields = { + "InnerUrl": fields.Str(required=True, load_from="InnerUrl"), + "InternetUrl": fields.Str(required=True, load_from="InternetUrl"), + } + + +""" +API: ListUDBMachineType + +获取UDB云数据库支持的计算规格列表,暂不支持获取跨可用区实例的计算规格,目前支持的数据库品类包括:NVMe版和SSD云盘版MySQL +""" + + +class ListUDBMachineTypeRequestSchema(schema.RequestSchema): + """ListUDBMachineType - 获取UDB云数据库支持的计算规格列表,暂不支持获取跨可用区实例的计算规格,目前支持的数据库品类包括:NVMe版和SSD云盘版MySQL""" + + fields = { + "InstanceMode": fields.Str(required=False, dump_to="InstanceMode"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ListUDBMachineTypeResponseSchema(schema.ResponseSchema): + """ListUDBMachineType - 获取UDB云数据库支持的计算规格列表,暂不支持获取跨可用区实例的计算规格,目前支持的数据库品类包括:NVMe版和SSD云盘版MySQL""" fields = { - "EarliestTime": fields.Int(required=False, load_from="EarliestTime") + "DataSet": fields.List( + models.MachineTypeSchema(), required=True, load_from="DataSet" + ), + "DefaultMachineType": models.MachineTypeSchema(), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: ListUDBUserTables + +查看udb实例所有的用户表集合 (只包括引擎为innodb和myisam的表) +""" + + +class ListUDBUserTablesRequestSchema(schema.RequestSchema): + """ListUDBUserTables - 查看udb实例所有的用户表集合 (只包括引擎为innodb和myisam的表)""" + + fields = { + "DBId": fields.Str(required=True, dump_to="DBId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class ListUDBUserTablesResponseSchema(schema.ResponseSchema): + """ListUDBUserTables - 查看udb实例所有的用户表集合 (只包括引擎为innodb和myisam的表)""" + + fields = { + "Tables": fields.List( + models.UDBDatabaseDataSchema(), required=True, load_from="Tables" + ), } @@ -1089,8 +1674,7 @@ class FetchUDBInstanceEarliestRecoverTimeResponseSchema(schema.ResponseSchema): class ModifyUDBInstanceNameRequestSchema(schema.RequestSchema): - """ ModifyUDBInstanceName - 重命名UDB实例 - """ + """ModifyUDBInstanceName - 重命名UDB实例""" fields = { "DBId": fields.Str(required=True, dump_to="DBId"), @@ -1102,8 +1686,7 @@ class ModifyUDBInstanceNameRequestSchema(schema.RequestSchema): class ModifyUDBInstanceNameResponseSchema(schema.ResponseSchema): - """ ModifyUDBInstanceName - 重命名UDB实例 - """ + """ModifyUDBInstanceName - 重命名UDB实例""" fields = {} @@ -1116,8 +1699,7 @@ class ModifyUDBInstanceNameResponseSchema(schema.ResponseSchema): class ModifyUDBInstancePasswordRequestSchema(schema.RequestSchema): - """ ModifyUDBInstancePassword - 修改DB实例的管理员密码 - """ + """ModifyUDBInstancePassword - 修改DB实例的管理员密码""" fields = { "AccountName": fields.Str(required=False, dump_to="AccountName"), @@ -1130,8 +1712,58 @@ class ModifyUDBInstancePasswordRequestSchema(schema.RequestSchema): class ModifyUDBInstancePasswordResponseSchema(schema.ResponseSchema): - """ ModifyUDBInstancePassword - 修改DB实例的管理员密码 - """ + """ModifyUDBInstancePassword - 修改DB实例的管理员密码""" + + fields = {} + + +""" +API: ModifyUDBInstanceRemarkName + +修改UDB实例备注信息 +""" + + +class ModifyUDBInstanceRemarkNameRequestSchema(schema.RequestSchema): + """ModifyUDBInstanceRemarkName - 修改UDB实例备注信息""" + + fields = { + "DBId": fields.Str(required=True, dump_to="DBId"), + "Name": fields.Str(required=True, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ModifyUDBInstanceRemarkNameResponseSchema(schema.ResponseSchema): + """ModifyUDBInstanceRemarkName - 修改UDB实例备注信息""" + + fields = {} + + +""" +API: ModifyUDBInstanceSSL + +调整SSL的信息 +""" + + +class ModifyUDBInstanceSSLRequestSchema(schema.RequestSchema): + """ModifyUDBInstanceSSL - 调整SSL的信息""" + + fields = { + "DBId": fields.Str(required=True, dump_to="DBId"), + "EnableSSL": fields.Int(required=True, dump_to="EnableSSL"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ValidTime": fields.Int(required=False, dump_to="ValidTime"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ModifyUDBInstanceSSLResponseSchema(schema.ResponseSchema): + """ModifyUDBInstanceSSL - 调整SSL的信息""" fields = {} @@ -1139,13 +1771,12 @@ class ModifyUDBInstancePasswordResponseSchema(schema.ResponseSchema): """ API: PromoteUDBInstanceToHA -普通db升级为高可用(只针对mysql5.5及以上版本) +普通db升级为高可用(只针对mysql5.5及以上版本SSD机型的实例) ,对于NVMe机型的单点升级高可用,虽然也能使用该操作再加上SwitchUDBInstanceToHA,但是更建议直接调用新的API接口(UpgradeUDBInstanceToHA) """ class PromoteUDBInstanceToHARequestSchema(schema.RequestSchema): - """ PromoteUDBInstanceToHA - 普通db升级为高可用(只针对mysql5.5及以上版本) - """ + """PromoteUDBInstanceToHA - 普通db升级为高可用(只针对mysql5.5及以上版本SSD机型的实例) ,对于NVMe机型的单点升级高可用,虽然也能使用该操作再加上SwitchUDBInstanceToHA,但是更建议直接调用新的API接口(UpgradeUDBInstanceToHA)""" fields = { "DBId": fields.Str(required=True, dump_to="DBId"), @@ -1155,8 +1786,7 @@ class PromoteUDBInstanceToHARequestSchema(schema.RequestSchema): class PromoteUDBInstanceToHAResponseSchema(schema.ResponseSchema): - """ PromoteUDBInstanceToHA - 普通db升级为高可用(只针对mysql5.5及以上版本) - """ + """PromoteUDBInstanceToHA - 普通db升级为高可用(只针对mysql5.5及以上版本SSD机型的实例) ,对于NVMe机型的单点升级高可用,虽然也能使用该操作再加上SwitchUDBInstanceToHA,但是更建议直接调用新的API接口(UpgradeUDBInstanceToHA)""" fields = {} @@ -1169,8 +1799,7 @@ class PromoteUDBInstanceToHAResponseSchema(schema.ResponseSchema): class PromoteUDBSlaveRequestSchema(schema.RequestSchema): - """ PromoteUDBSlave - 从库提升为独立库 - """ + """PromoteUDBSlave - 从库提升为独立库""" fields = { "DBId": fields.Str(required=True, dump_to="DBId"), @@ -1182,8 +1811,7 @@ class PromoteUDBSlaveRequestSchema(schema.RequestSchema): class PromoteUDBSlaveResponseSchema(schema.ResponseSchema): - """ PromoteUDBSlave - 从库提升为独立库 - """ + """PromoteUDBSlave - 从库提升为独立库""" fields = {} @@ -1196,31 +1824,61 @@ class PromoteUDBSlaveResponseSchema(schema.ResponseSchema): class ResizeUDBInstanceRequestSchema(schema.RequestSchema): - """ ResizeUDBInstance - 修改(升级和降级)UDB实例的配置,包括内存和磁盘的配置,对于内存升级无需关闭实例,其他场景需要事先关闭实例。两套参数可以配置升降机:1.配置UseSSD和SSDType 2.配置InstanceType,不需要配置InstanceMode。这两套第二套参数的优先级更高 - """ + """ResizeUDBInstance - 修改(升级和降级)UDB实例的配置,包括内存和磁盘的配置,对于内存升级无需关闭实例,其他场景需要事先关闭实例。两套参数可以配置升降机:1.配置UseSSD和SSDType 2.配置InstanceType,不需要配置InstanceMode。这两套第二套参数的优先级更高""" fields = { + "CPU": fields.Int(required=False, dump_to="CPU"), "CouponId": fields.Str(required=False, dump_to="CouponId"), "DBId": fields.Str(required=True, dump_to="DBId"), "DiskSpace": fields.Int(required=True, dump_to="DiskSpace"), "InstanceMode": fields.Str(required=False, dump_to="InstanceMode"), "InstanceType": fields.Str(required=False, dump_to="InstanceType"), + "MachineType": fields.Str(required=False, dump_to="MachineType"), "MemoryLimit": fields.Int(required=True, dump_to="MemoryLimit"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "SSDType": fields.Str(required=False, dump_to="SSDType"), + "SpecificationType": fields.Str( + required=False, dump_to="SpecificationType" + ), "StartAfterUpgrade": fields.Bool( required=False, dump_to="StartAfterUpgrade" ), - "UDBCId": fields.Str(required=False, dump_to="UDBCId"), - "UseSSD": fields.Bool(required=False, dump_to="UseSSD"), + "UDBCId": fields.Str( + required=False, dump_to="UDBCId" + ), # Deprecated, will be removed at 1.0 + "UseSSD": fields.Bool( + required=False, dump_to="UseSSD" + ), # Deprecated, will be removed at 1.0 "Zone": fields.Str(required=False, dump_to="Zone"), } class ResizeUDBInstanceResponseSchema(schema.ResponseSchema): - """ ResizeUDBInstance - 修改(升级和降级)UDB实例的配置,包括内存和磁盘的配置,对于内存升级无需关闭实例,其他场景需要事先关闭实例。两套参数可以配置升降机:1.配置UseSSD和SSDType 2.配置InstanceType,不需要配置InstanceMode。这两套第二套参数的优先级更高 - """ + """ResizeUDBInstance - 修改(升级和降级)UDB实例的配置,包括内存和磁盘的配置,对于内存升级无需关闭实例,其他场景需要事先关闭实例。两套参数可以配置升降机:1.配置UseSSD和SSDType 2.配置InstanceType,不需要配置InstanceMode。这两套第二套参数的优先级更高""" + + fields = {} + + +""" +API: RestartRWSplitting + +读写分离中间件重启,对应docker重启,但是ip不变 +""" + + +class RestartRWSplittingRequestSchema(schema.RequestSchema): + """RestartRWSplitting - 读写分离中间件重启,对应docker重启,但是ip不变""" + + fields = { + "MasterDBId": fields.Str(required=True, dump_to="MasterDBId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class RestartRWSplittingResponseSchema(schema.ResponseSchema): + """RestartRWSplitting - 读写分离中间件重启,对应docker重启,但是ip不变""" fields = {} @@ -1233,8 +1891,7 @@ class ResizeUDBInstanceResponseSchema(schema.ResponseSchema): class RestartUDBInstanceRequestSchema(schema.RequestSchema): - """ RestartUDBInstance - 重启UDB实例 - """ + """RestartUDBInstance - 重启UDB实例""" fields = { "DBId": fields.Str(required=True, dump_to="DBId"), @@ -1245,8 +1902,60 @@ class RestartUDBInstanceRequestSchema(schema.RequestSchema): class RestartUDBInstanceResponseSchema(schema.ResponseSchema): - """ RestartUDBInstance - 重启UDB实例 - """ + """RestartUDBInstance - 重启UDB实例""" + + fields = {} + + +""" +API: RollbackUDBInstance + +在原实例回档指定库表 +""" + + +class RollbackUDBInstanceRequestSchema(schema.RequestSchema): + """RollbackUDBInstance - 在原实例回档指定库表""" + + fields = { + "RecoveryTime": fields.Str(required=True, dump_to="RecoveryTime"), + "Region": fields.Str(required=True, dump_to="Region"), + "SrcDBId": fields.Str(required=True, dump_to="SrcDBId"), + "Tables": fields.Str(required=True, dump_to="Tables"), + } + + +class RollbackUDBInstanceResponseSchema(schema.ResponseSchema): + """RollbackUDBInstance - 在原实例回档指定库表""" + + fields = { + "DBId": fields.Str(required=True, load_from="DBId"), + } + + +""" +API: SetUDBRWSplitting + +设置读写分离的模式 +""" + + +class SetUDBRWSplittingRequestSchema(schema.RequestSchema): + """SetUDBRWSplitting - 设置读写分离的模式""" + + fields = { + "DBIds": fields.List(fields.Str()), + "DelayThreshold": fields.Int(required=False, dump_to="DelayThreshold"), + "MasterDBId": fields.Str(required=True, dump_to="MasterDBId"), + "ReadModel": fields.Str(required=True, dump_to="ReadModel"), + "ReadPercents": fields.List(fields.Str()), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class SetUDBRWSplittingResponseSchema(schema.ResponseSchema): + """SetUDBRWSplitting - 设置读写分离的模式""" fields = {} @@ -1259,8 +1968,7 @@ class RestartUDBInstanceResponseSchema(schema.ResponseSchema): class StartUDBInstanceRequestSchema(schema.RequestSchema): - """ StartUDBInstance - 启动UDB实例 - """ + """StartUDBInstance - 启动UDB实例""" fields = { "DBId": fields.Str(required=True, dump_to="DBId"), @@ -1271,8 +1979,7 @@ class StartUDBInstanceRequestSchema(schema.RequestSchema): class StartUDBInstanceResponseSchema(schema.ResponseSchema): - """ StartUDBInstance - 启动UDB实例 - """ + """StartUDBInstance - 启动UDB实例""" fields = {} @@ -1285,8 +1992,7 @@ class StartUDBInstanceResponseSchema(schema.ResponseSchema): class StopUDBInstanceRequestSchema(schema.RequestSchema): - """ StopUDBInstance - 关闭UDB实例 - """ + """StopUDBInstance - 关闭UDB实例""" fields = { "DBId": fields.Str(required=True, dump_to="DBId"), @@ -1298,8 +2004,32 @@ class StopUDBInstanceRequestSchema(schema.RequestSchema): class StopUDBInstanceResponseSchema(schema.ResponseSchema): - """ StopUDBInstance - 关闭UDB实例 - """ + """StopUDBInstance - 关闭UDB实例""" + + fields = {} + + +""" +API: SwitchUDBHAToSentinel + +UDB高可用实例从HAProxy版本升级为Sentinel版本(不带HAProxy)升级耗时5-10秒 +""" + + +class SwitchUDBHAToSentinelRequestSchema(schema.RequestSchema): + """SwitchUDBHAToSentinel - UDB高可用实例从HAProxy版本升级为Sentinel版本(不带HAProxy)升级耗时5-10秒""" + + fields = { + "DBId": fields.Str(required=True, dump_to="DBId"), + "ForceSwitch": fields.Bool(required=False, dump_to="ForceSwitch"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class SwitchUDBHAToSentinelResponseSchema(schema.ResponseSchema): + """SwitchUDBHAToSentinel - UDB高可用实例从HAProxy版本升级为Sentinel版本(不带HAProxy)升级耗时5-10秒""" fields = {} @@ -1307,13 +2037,12 @@ class StopUDBInstanceResponseSchema(schema.ResponseSchema): """ API: SwitchUDBInstanceToHA -普通UDB切换为高可用,原db状态为WaitForSwitch时,调用该api +普通UDB切换为高可用(只针对mysql5.5及以上版本SSD机型的实例) ,原db状态为WaitForSwitch时,调用该api; 对于NVMe机型的单点升级高可用,虽然也能使用PromoteUDBInstanceToHA再加上该操作,但是更建议直接调用新的API接口(UpgradeUDBInstanceToHA) """ class SwitchUDBInstanceToHARequestSchema(schema.RequestSchema): - """ SwitchUDBInstanceToHA - 普通UDB切换为高可用,原db状态为WaitForSwitch时,调用该api - """ + """SwitchUDBInstanceToHA - 普通UDB切换为高可用(只针对mysql5.5及以上版本SSD机型的实例) ,原db状态为WaitForSwitch时,调用该api; 对于NVMe机型的单点升级高可用,虽然也能使用PromoteUDBInstanceToHA再加上该操作,但是更建议直接调用新的API接口(UpgradeUDBInstanceToHA)""" fields = { "ChargeType": fields.Str(required=False, dump_to="ChargeType"), @@ -1326,10 +2055,11 @@ class SwitchUDBInstanceToHARequestSchema(schema.RequestSchema): class SwitchUDBInstanceToHAResponseSchema(schema.ResponseSchema): - """ SwitchUDBInstanceToHA - 普通UDB切换为高可用,原db状态为WaitForSwitch时,调用该api - """ + """SwitchUDBInstanceToHA - 普通UDB切换为高可用(只针对mysql5.5及以上版本SSD机型的实例) ,原db状态为WaitForSwitch时,调用该api; 对于NVMe机型的单点升级高可用,虽然也能使用PromoteUDBInstanceToHA再加上该操作,但是更建议直接调用新的API接口(UpgradeUDBInstanceToHA)""" - fields = {"DBId": fields.Str(required=False, load_from="DBId")} + fields = { + "DBId": fields.Str(required=False, load_from="DBId"), + } """ @@ -1340,24 +2070,30 @@ class SwitchUDBInstanceToHAResponseSchema(schema.ResponseSchema): class UpdateUDBInstanceBackupStrategyRequestSchema(schema.RequestSchema): - """ UpdateUDBInstanceBackupStrategy - 修改UDB自动备份策略 - """ + """UpdateUDBInstanceBackupStrategy - 修改UDB自动备份策略""" fields = { "BackupDate": fields.Str(required=False, dump_to="BackupDate"), "BackupMethod": fields.Str(required=False, dump_to="BackupMethod"), "BackupTime": fields.Int(required=False, dump_to="BackupTime"), + "BinlogRemoteSaveDays": fields.Int( + required=False, dump_to="BinlogRemoteSaveDays" + ), "DBId": fields.Str(required=True, dump_to="DBId"), + "EnableBinlogBackup": fields.Bool( + required=False, dump_to="EnableBinlogBackup" + ), "ForceDump": fields.Bool(required=False, dump_to="ForceDump"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), + "UserBucket": fields.Str(required=False, dump_to="UserBucket"), + "UserTokenID": fields.Str(required=False, dump_to="UserTokenID"), "Zone": fields.Str(required=False, dump_to="Zone"), } class UpdateUDBInstanceBackupStrategyResponseSchema(schema.ResponseSchema): - """ UpdateUDBInstanceBackupStrategy - 修改UDB自动备份策略 - """ + """UpdateUDBInstanceBackupStrategy - 修改UDB自动备份策略""" fields = {} @@ -1370,8 +2106,7 @@ class UpdateUDBInstanceBackupStrategyResponseSchema(schema.ResponseSchema): class UpdateUDBInstanceSlaveBackupSwitchRequestSchema(schema.RequestSchema): - """ UpdateUDBInstanceSlaveBackupSwitch - 开启或者关闭UDB从库备份 - """ + """UpdateUDBInstanceSlaveBackupSwitch - 开启或者关闭UDB从库备份""" fields = { "BackupSwitch": fields.Int(required=True, dump_to="BackupSwitch"), @@ -1384,8 +2119,7 @@ class UpdateUDBInstanceSlaveBackupSwitchRequestSchema(schema.RequestSchema): class UpdateUDBInstanceSlaveBackupSwitchResponseSchema(schema.ResponseSchema): - """ UpdateUDBInstanceSlaveBackupSwitch - 开启或者关闭UDB从库备份 - """ + """UpdateUDBInstanceSlaveBackupSwitch - 开启或者关闭UDB从库备份""" fields = {} @@ -1398,8 +2132,7 @@ class UpdateUDBInstanceSlaveBackupSwitchResponseSchema(schema.ResponseSchema): class UpdateUDBParamGroupRequestSchema(schema.RequestSchema): - """ UpdateUDBParamGroup - 更新UDB配置参数项 - """ + """UpdateUDBParamGroup - 更新UDB配置参数项""" fields = { "Description": fields.Str(required=False, dump_to="Description"), @@ -1415,12 +2148,67 @@ class UpdateUDBParamGroupRequestSchema(schema.RequestSchema): class UpdateUDBParamGroupResponseSchema(schema.ResponseSchema): - """ UpdateUDBParamGroup - 更新UDB配置参数项 - """ + """UpdateUDBParamGroup - 更新UDB配置参数项""" + + fields = {} + + +""" +API: UpgradeUDBInstanceToHA + +快杰普通db升级为高可用(只针对mysql5.5及以上版本Nvme机型的实例) +""" + + +class UpgradeUDBInstanceToHARequestSchema(schema.RequestSchema): + """UpgradeUDBInstanceToHA - 快杰普通db升级为高可用(只针对mysql5.5及以上版本Nvme机型的实例)""" + + fields = { + "DBId": fields.Str(required=True, dump_to="DBId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class UpgradeUDBInstanceToHAResponseSchema(schema.ResponseSchema): + """UpgradeUDBInstanceToHA - 快杰普通db升级为高可用(只针对mysql5.5及以上版本Nvme机型的实例)""" fields = {} +""" +API: UpgradeUDBVersion + +升级db实例版本 +""" + + +class UpgradeUDBVersionRequestSchema(schema.RequestSchema): + """UpgradeUDBVersion - 升级db实例版本""" + + fields = { + "DBId": fields.Str(required=True, dump_to="DBId"), + "DBSubVersion": fields.Str(required=True, dump_to="DBSubVersion"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SwitchEndTime": fields.Int(required=False, dump_to="SwitchEndTime"), + "SwitchStartTime": fields.Int( + required=False, dump_to="SwitchStartTime" + ), + "SwitchType": fields.Str(required=True, dump_to="SwitchType"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class UpgradeUDBVersionResponseSchema(schema.ResponseSchema): + """UpgradeUDBVersion - 升级db实例版本""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + """ API: UploadUDBParamGroup @@ -1429,8 +2217,7 @@ class UpdateUDBParamGroupResponseSchema(schema.ResponseSchema): class UploadUDBParamGroupRequestSchema(schema.RequestSchema): - """ UploadUDBParamGroup - 导入UDB配置 - """ + """UploadUDBParamGroup - 导入UDB配置""" fields = { "Content": fields.Str(required=True, dump_to="Content"), @@ -1439,7 +2226,7 @@ class UploadUDBParamGroupRequestSchema(schema.RequestSchema): "GroupName": fields.Str(required=True, dump_to="GroupName"), "ParamGroupTypeId": fields.Int( required=False, dump_to="ParamGroupTypeId" - ), + ), # Deprecated, will be removed at 1.0 "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "RegionFlag": fields.Bool(required=False, dump_to="RegionFlag"), @@ -1448,7 +2235,8 @@ class UploadUDBParamGroupRequestSchema(schema.RequestSchema): class UploadUDBParamGroupResponseSchema(schema.ResponseSchema): - """ UploadUDBParamGroup - 导入UDB配置 - """ + """UploadUDBParamGroup - 导入UDB配置""" - fields = {"GroupId": fields.Int(required=False, load_from="GroupId")} + fields = { + "GroupId": fields.Int(required=False, load_from="GroupId"), + } diff --git a/ucloud/services/udb/schemas/models.py b/ucloud/services/udb/schemas/models.py index 49973c49..bac3f522 100644 --- a/ucloud/services/udb/schemas/models.py +++ b/ucloud/services/udb/schemas/models.py @@ -1,211 +1,337 @@ -""" Code is generated by ucloud-model, DO NOT EDIT IT. """ - -from ucloud.core.typesystem import schema, fields - - -class UDBBackupSetSchema(schema.ResponseSchema): - """ UDBBackupSet - DescribeUDBBackup - """ - - fields = { - "BackupEndTime": fields.Int(required=False, load_from="BackupEndTime"), - "BackupId": fields.Int(required=False, load_from="BackupId"), - "BackupName": fields.Str(required=False, load_from="BackupName"), - "BackupSize": fields.Int(required=False, load_from="BackupSize"), - "BackupTime": fields.Int(required=False, load_from="BackupTime"), - "BackupType": fields.Int(required=False, load_from="BackupType"), - "BackupZone": fields.Str(required=False, load_from="BackupZone"), - "DBId": fields.Str(required=False, load_from="DBId"), - "DBName": fields.Str(required=False, load_from="DBName"), - "ErrorInfo": fields.Str(required=False, load_from="ErrorInfo"), - "State": fields.Str(required=False, load_from="State"), - "Zone": fields.Str(required=False, load_from="Zone"), - } - - -class UDBSlaveInstanceSetSchema(schema.ResponseSchema): - """ UDBSlaveInstanceSet - DescribeUDBSlaveInstance - """ - - fields = { - "AdminUser": fields.Str(required=False, load_from="AdminUser"), - "BackupBeginTime": fields.Int( - required=False, load_from="BackupBeginTime" - ), - "BackupBlacklist": fields.Str( - required=False, load_from="BackupBlacklist" - ), - "BackupCount": fields.Int(required=False, load_from="BackupCount"), - "BackupDate": fields.Str(required=False, load_from="BackupDate"), - "BackupDuration": fields.Int( - required=False, load_from="BackupDuration" - ), - "ChargeType": fields.Str(required=False, load_from="ChargeType"), - "ClusterRole": fields.Str(required=False, load_from="ClusterRole"), - "CreateTime": fields.Int(required=False, load_from="CreateTime"), - "DBId": fields.Str(required=False, load_from="DBId"), - "DBTypeId": fields.Str(required=False, load_from="DBTypeId"), - "DataFileSize": fields.Float(required=False, load_from="DataFileSize"), - "DiskSpace": fields.Int(required=False, load_from="DiskSpace"), - "DiskUsedSize": fields.Float(required=False, load_from="DiskUsedSize"), - "ExpiredTime": fields.Int(required=False, load_from="ExpiredTime"), - "InstanceMode": fields.Str(required=False, load_from="InstanceMode"), - "InstanceType": fields.Str(required=False, load_from="InstanceType"), - "InstanceTypeId": fields.Int( - required=False, load_from="InstanceTypeId" - ), - "LogFileSize": fields.Float(required=False, load_from="LogFileSize"), - "MemoryLimit": fields.Int(required=False, load_from="MemoryLimit"), - "ModifyTime": fields.Int(required=False, load_from="ModifyTime"), - "Name": fields.Str(required=False, load_from="Name"), - "ParamGroupId": fields.Int(required=False, load_from="ParamGroupId"), - "Port": fields.Int(required=False, load_from="Port"), - "Role": fields.Str(required=False, load_from="Role"), - "SSDType": fields.Str(required=False, load_from="SSDType"), - "SrcDBId": fields.Str(required=False, load_from="SrcDBId"), - "State": fields.Str(required=False, load_from="State"), - "SubnetId": fields.Str(required=False, load_from="SubnetId"), - "SystemFileSize": fields.Float( - required=False, load_from="SystemFileSize" - ), - "Tag": fields.Str(required=False, load_from="Tag"), - "UseSSD": fields.Bool(required=False, load_from="UseSSD"), - "VPCId": fields.Str(required=False, load_from="VPCId"), - "VirtualIP": fields.Str(required=False, load_from="VirtualIP"), - "VirtualIPMac": fields.Str(required=False, load_from="VirtualIPMac"), - "Zone": fields.Str(required=False, load_from="Zone"), - } - - -class UDBInstanceSetSchema(schema.ResponseSchema): - """ UDBInstanceSet - DescribeUDBInstance - """ - - fields = { - "AdminUser": fields.Str(required=False, load_from="AdminUser"), - "BackupBeginTime": fields.Int( - required=False, load_from="BackupBeginTime" - ), - "BackupBlacklist": fields.Str( - required=False, load_from="BackupBlacklist" - ), - "BackupCount": fields.Int(required=False, load_from="BackupCount"), - "BackupDate": fields.Str(required=False, load_from="BackupDate"), - "BackupDuration": fields.Int( - required=False, load_from="BackupDuration" - ), - "BackupZone": fields.Str(required=False, load_from="BackupZone"), - "ChargeType": fields.Str(required=False, load_from="ChargeType"), - "CluserRole": fields.Str(required=False, load_from="CluserRole"), - "CreateTime": fields.Int(required=False, load_from="CreateTime"), - "DBId": fields.Str(required=False, load_from="DBId"), - "DBTypeId": fields.Str(required=False, load_from="DBTypeId"), - "DataFileSize": fields.Float(required=False, load_from="DataFileSize"), - "DataSet": fields.List(UDBSlaveInstanceSetSchema()), - "DiskSpace": fields.Int(required=False, load_from="DiskSpace"), - "DiskUsedSize": fields.Float(required=False, load_from="DiskUsedSize"), - "ExpiredTime": fields.Int(required=False, load_from="ExpiredTime"), - "InstanceMode": fields.Str(required=False, load_from="InstanceMode"), - "InstanceType": fields.Str(required=False, load_from="InstanceType"), - "InstanceTypeId": fields.Int( - required=False, load_from="InstanceTypeId" - ), - "LogFileSize": fields.Float(required=False, load_from="LogFileSize"), - "MemoryLimit": fields.Int(required=False, load_from="MemoryLimit"), - "ModifyTime": fields.Int(required=False, load_from="ModifyTime"), - "Name": fields.Str(required=False, load_from="Name"), - "ParamGroupId": fields.Int(required=False, load_from="ParamGroupId"), - "Port": fields.Int(required=False, load_from="Port"), - "Role": fields.Str(required=False, load_from="Role"), - "SSDType": fields.Str(required=False, load_from="SSDType"), - "SrcDBId": fields.Str(required=False, load_from="SrcDBId"), - "State": fields.Str(required=False, load_from="State"), - "SubnetId": fields.Str(required=False, load_from="SubnetId"), - "SystemFileSize": fields.Float( - required=False, load_from="SystemFileSize" - ), - "Tag": fields.Str(required=False, load_from="Tag"), - "UseSSD": fields.Bool(required=False, load_from="UseSSD"), - "VPCId": fields.Str(required=False, load_from="VPCId"), - "VirtualIP": fields.Str(required=False, load_from="VirtualIP"), - "VirtualIPMac": fields.Str(required=False, load_from="VirtualIPMac"), - "Zone": fields.Str(required=False, load_from="Zone"), - } - - -class UDBInstanceBinlogSetSchema(schema.ResponseSchema): - """ UDBInstanceBinlogSet - DescribeUDBInstanceBinlog - """ - - fields = { - "BeginTime": fields.Int(required=False, load_from="BeginTime"), - "EndTime": fields.Int(required=False, load_from="EndTime"), - "Name": fields.Str(required=False, load_from="Name"), - "Size": fields.Int(required=False, load_from="Size"), - } - - -class UDBInstancePriceSetSchema(schema.ResponseSchema): - """ UDBInstancePriceSet - DescribeUDBInstancePrice - """ - - fields = { - "ChargeType": fields.Str(required=False, load_from="ChargeType"), - "Price": fields.Int(required=False, load_from="Price"), - } - - -class LogPackageDataSetSchema(schema.ResponseSchema): - """ LogPackageDataSet - DescribeUDBLogPackage - """ - - fields = { - "BackupId": fields.Int(required=False, load_from="BackupId"), - "BackupName": fields.Str(required=False, load_from="BackupName"), - "BackupSize": fields.Int(required=False, load_from="BackupSize"), - "BackupTime": fields.Int(required=False, load_from="BackupTime"), - "BackupType": fields.Int(required=False, load_from="BackupType"), - "BackupZone": fields.Str(required=False, load_from="BackupZone"), - "DBId": fields.Str(required=False, load_from="DBId"), - "DBName": fields.Str(required=False, load_from="DBName"), - "State": fields.Str(required=False, load_from="State"), - "Zone": fields.Str(required=False, load_from="Zone"), - } - - -class UDBParamMemberSetSchema(schema.ResponseSchema): - """ UDBParamMemberSet - DescribeUDBParamGroup - """ - - fields = { - "AllowedVal": fields.Str(required=False, load_from="AllowedVal"), - "ApplyType": fields.Int(required=False, load_from="ApplyType"), - "FormatType": fields.Int(required=False, load_from="FormatType"), - "Key": fields.Str(required=False, load_from="Key"), - "Modifiable": fields.Bool(required=False, load_from="Modifiable"), - "Value": fields.Str(required=False, load_from="Value"), - "ValueType": fields.Int(required=False, load_from="ValueType"), - } - - -class UDBParamGroupSetSchema(schema.ResponseSchema): - """ UDBParamGroupSet - DescribeUDBParamGroup - """ - - fields = { - "DBTypeId": fields.Str(required=False, load_from="DBTypeId"), - "Description": fields.Str(required=False, load_from="Description"), - "GroupId": fields.Int(required=False, load_from="GroupId"), - "GroupName": fields.Str(required=False, load_from="GroupName"), - "Modifiable": fields.Bool(required=False, load_from="Modifiable"), - "ParamMember": fields.List(UDBParamMemberSetSchema()), - "RegionFlag": fields.Bool(required=False, load_from="RegionFlag"), - "Zone": fields.Str(required=False, load_from="Zone"), - } - - -class UDBTypeSetSchema(schema.ResponseSchema): - """ UDBTypeSet - DescribeUDBType - """ - - fields = {"DBTypeId": fields.Str(required=False, load_from="DBTypeId")} +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class UFileDataSetSchema(schema.ResponseSchema): + """UFileDataSet - 增加ufile的描述""" + + fields = { + "Bucket": fields.Str(required=False, load_from="Bucket"), + "TokenID": fields.Str(required=False, load_from="TokenID"), + } + + +class UDBSlaveInstanceSetSchema(schema.ResponseSchema): + """UDBSlaveInstanceSet - DescribeUDBSlaveInstance""" + + fields = { + "AdminUser": fields.Str(required=False, load_from="AdminUser"), + "BackupBeginTime": fields.Int( + required=False, load_from="BackupBeginTime" + ), + "BackupBlacklist": fields.Str( + required=False, load_from="BackupBlacklist" + ), + "BackupCount": fields.Int(required=False, load_from="BackupCount"), + "BackupDate": fields.Str(required=False, load_from="BackupDate"), + "BackupDuration": fields.Int( + required=False, load_from="BackupDuration" + ), + "CaseSensitivityParam": fields.Int( + required=False, load_from="CaseSensitivityParam" + ), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "ClusterRole": fields.Str(required=False, load_from="ClusterRole"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DBId": fields.Str(required=False, load_from="DBId"), + "DBTypeId": fields.Str(required=False, load_from="DBTypeId"), + "DataFileSize": fields.Float(required=False, load_from="DataFileSize"), + "DiskSpace": fields.Int(required=False, load_from="DiskSpace"), + "DiskUsedSize": fields.Float(required=False, load_from="DiskUsedSize"), + "ExpiredTime": fields.Int(required=False, load_from="ExpiredTime"), + "IPv6Address": fields.Str( + required=False, load_from="IPv6Address" + ), # Deprecated, will be removed at 1.0 + "InstanceMode": fields.Str(required=False, load_from="InstanceMode"), + "InstanceType": fields.Str(required=False, load_from="InstanceType"), + "InstanceTypeId": fields.Int( + required=False, load_from="InstanceTypeId" + ), + "LogFileSize": fields.Float(required=False, load_from="LogFileSize"), + "MachineType": fields.Str(required=False, load_from="MachineType"), + "MemoryLimit": fields.Int(required=False, load_from="MemoryLimit"), + "ModifyTime": fields.Int(required=False, load_from="ModifyTime"), + "Name": fields.Str(required=False, load_from="Name"), + "ParamGroupId": fields.Int(required=False, load_from="ParamGroupId"), + "Port": fields.Int(required=False, load_from="Port"), + "ReplicationDelaySeconds": fields.Int( + required=False, load_from="ReplicationDelaySeconds" + ), + "Role": fields.Str(required=False, load_from="Role"), + "SSDType": fields.Str(required=False, load_from="SSDType"), + "SpecificationType": fields.Int( + required=False, load_from="SpecificationType" + ), + "SrcDBId": fields.Str(required=False, load_from="SrcDBId"), + "State": fields.Str(required=False, load_from="State"), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "SystemFileSize": fields.Float( + required=False, load_from="SystemFileSize" + ), + "Tag": fields.Str(required=False, load_from="Tag"), + "UseSSD": fields.Bool(required=False, load_from="UseSSD"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + "VirtualIP": fields.Str(required=False, load_from="VirtualIP"), + "VirtualIPMac": fields.Str(required=False, load_from="VirtualIPMac"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class UDBInstanceSetSchema(schema.ResponseSchema): + """UDBInstanceSet - DescribeUDBInstance""" + + fields = { + "AdminUser": fields.Str(required=False, load_from="AdminUser"), + "BackupBeginTime": fields.Int( + required=False, load_from="BackupBeginTime" + ), + "BackupBlacklist": fields.Str( + required=False, load_from="BackupBlacklist" + ), + "BackupCount": fields.Int(required=False, load_from="BackupCount"), + "BackupDate": fields.Str(required=False, load_from="BackupDate"), + "BackupDuration": fields.Int( + required=False, load_from="BackupDuration" + ), + "BackupMethod": fields.Str(required=False, load_from="BackupMethod"), + "BackupZone": fields.Str(required=False, load_from="BackupZone"), + "CPU": fields.Int(required=False, load_from="CPU"), + "CaseSensitivityParam": fields.Int( + required=False, load_from="CaseSensitivityParam" + ), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "CluserRole": fields.Str( + required=False, load_from="CluserRole" + ), # Deprecated, will be removed at 1.0 + "ClusterRole": fields.Str(required=False, load_from="ClusterRole"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DBId": fields.Str(required=False, load_from="DBId"), + "DBSubVersion": fields.Str(required=False, load_from="DBSubVersion"), + "DBTypeId": fields.Str(required=False, load_from="DBTypeId"), + "DataFileSize": fields.Float(required=False, load_from="DataFileSize"), + "DataSet": fields.List(UDBSlaveInstanceSetSchema()), + "DiskSpace": fields.Int(required=False, load_from="DiskSpace"), + "DiskUsedSize": fields.Float(required=False, load_from="DiskUsedSize"), + "EnableSSL": fields.Int(required=False, load_from="EnableSSL"), + "ExpiredTime": fields.Int(required=False, load_from="ExpiredTime"), + "IPv6Address": fields.Str(required=False, load_from="IPv6Address"), + "InstanceMode": fields.Str(required=False, load_from="InstanceMode"), + "InstanceType": fields.Str(required=False, load_from="InstanceType"), + "InstanceTypeId": fields.Int( + required=False, load_from="InstanceTypeId" + ), + "LogFileSize": fields.Float(required=False, load_from="LogFileSize"), + "MachineType": fields.Str(required=False, load_from="MachineType"), + "MemoryLimit": fields.Int(required=False, load_from="MemoryLimit"), + "ModifyTime": fields.Int(required=False, load_from="ModifyTime"), + "Name": fields.Str(required=False, load_from="Name"), + "ParamGroupId": fields.Int(required=False, load_from="ParamGroupId"), + "Port": fields.Int(required=False, load_from="Port"), + "Role": fields.Str(required=False, load_from="Role"), + "SSDType": fields.Str(required=False, load_from="SSDType"), + "SSLExpirationTime": fields.Int( + required=False, load_from="SSLExpirationTime" + ), + "SpecificationType": fields.Int( + required=False, load_from="SpecificationType" + ), + "SrcDBId": fields.Str(required=False, load_from="SrcDBId"), + "State": fields.Str(required=False, load_from="State"), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "SystemFileSize": fields.Float( + required=False, load_from="SystemFileSize" + ), + "Tag": fields.Str(required=False, load_from="Tag"), + "UseSSD": fields.Bool(required=False, load_from="UseSSD"), + "UserUFileData": UFileDataSetSchema(), + "VPCId": fields.Str(required=False, load_from="VPCId"), + "VirtualIP": fields.Str(required=False, load_from="VirtualIP"), + "VirtualIPMac": fields.Str(required=False, load_from="VirtualIPMac"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class MongoDBShardedClusterSetSchema(schema.ResponseSchema): + """MongoDBShardedClusterSet -""" + + fields = { + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DBId": fields.Str(required=False, load_from="DBId"), + "DBTypeId": fields.Str(required=False, load_from="DBTypeId"), + "MongosCount": fields.Int(required=False, load_from="MongosCount"), + "Name": fields.Str(required=False, load_from="Name"), + "ShardsrvCount": fields.Int(required=False, load_from="ShardsrvCount"), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "Tag": fields.Str(required=False, load_from="Tag"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + "VirtualIPs": fields.List(fields.Str()), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class UDBBackupSetSchema(schema.ResponseSchema): + """UDBBackupSet - DescribeUDBBackup""" + + fields = { + "BackupEndTime": fields.Int(required=False, load_from="BackupEndTime"), + "BackupId": fields.Int(required=False, load_from="BackupId"), + "BackupName": fields.Str(required=False, load_from="BackupName"), + "BackupSize": fields.Int(required=False, load_from="BackupSize"), + "BackupTime": fields.Int(required=False, load_from="BackupTime"), + "BackupType": fields.Int(required=False, load_from="BackupType"), + "BackupZone": fields.Str(required=False, load_from="BackupZone"), + "DBId": fields.Str(required=False, load_from="DBId"), + "DBName": fields.Str(required=False, load_from="DBName"), + "ErrorInfo": fields.Str(required=False, load_from="ErrorInfo"), + "MD5": fields.Str(required=False, load_from="MD5"), + "State": fields.Str(required=False, load_from="State"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class BinlogBackupSetSchema(schema.ResponseSchema): + """BinlogBackupSet - DescribeUDBBinlogBackup""" + + fields = { + "BackupId": fields.Int(required=False, load_from="BackupId"), + "BackupName": fields.Str(required=False, load_from="BackupName"), + "BackupSize": fields.Int(required=False, load_from="BackupSize"), + "BackupTime": fields.Int(required=False, load_from="BackupTime"), + "BinlogType": fields.Str(required=False, load_from="BinlogType"), + "DBId": fields.Str(required=False, load_from="DBId"), + "LogEndTime": fields.Int(required=False, load_from="LogEndTime"), + "LogStartTime": fields.Int(required=False, load_from="LogStartTime"), + "ServerId": fields.Str(required=False, load_from="ServerId"), + "State": fields.Str(required=False, load_from="State"), + } + + +class UDBInstanceBinlogSetSchema(schema.ResponseSchema): + """UDBInstanceBinlogSet - DescribeUDBInstanceBinlog""" + + fields = { + "BeginTime": fields.Int(required=False, load_from="BeginTime"), + "EndTime": fields.Int(required=False, load_from="EndTime"), + "Name": fields.Str(required=False, load_from="Name"), + "Size": fields.Int(required=False, load_from="Size"), + } + + +class UDBInstancePriceSetSchema(schema.ResponseSchema): + """UDBInstancePriceSet - DescribeUDBInstancePrice""" + + fields = { + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "Price": fields.Int(required=False, load_from="Price"), + } + + +class LogPackageDataSetSchema(schema.ResponseSchema): + """LogPackageDataSet - DescribeUDBLogPackage""" + + fields = { + "BackupId": fields.Int(required=False, load_from="BackupId"), + "BackupName": fields.Str(required=False, load_from="BackupName"), + "BackupSize": fields.Int(required=False, load_from="BackupSize"), + "BackupTime": fields.Int(required=False, load_from="BackupTime"), + "BackupType": fields.Int(required=False, load_from="BackupType"), + "BackupZone": fields.Str(required=False, load_from="BackupZone"), + "BinlogType": fields.Str(required=False, load_from="BinlogType"), + "DBId": fields.Str(required=False, load_from="DBId"), + "DBName": fields.Str(required=False, load_from="DBName"), + "State": fields.Str(required=False, load_from="State"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class UDBParamMemberSetSchema(schema.ResponseSchema): + """UDBParamMemberSet - DescribeUDBParamGroup""" + + fields = { + "AllowedVal": fields.Str(required=False, load_from="AllowedVal"), + "ApplyType": fields.Int(required=False, load_from="ApplyType"), + "FormatType": fields.Int(required=False, load_from="FormatType"), + "Key": fields.Str(required=False, load_from="Key"), + "Modifiable": fields.Bool(required=False, load_from="Modifiable"), + "Value": fields.Str(required=False, load_from="Value"), + "ValueType": fields.Int(required=False, load_from="ValueType"), + } + + +class UDBParamGroupSetSchema(schema.ResponseSchema): + """UDBParamGroupSet - DescribeUDBParamGroup""" + + fields = { + "DBTypeId": fields.Str(required=False, load_from="DBTypeId"), + "Description": fields.Str(required=False, load_from="Description"), + "GroupId": fields.Int(required=False, load_from="GroupId"), + "GroupName": fields.Str(required=False, load_from="GroupName"), + "GroupType": fields.Int(required=False, load_from="GroupType"), + "Modifiable": fields.Bool(required=False, load_from="Modifiable"), + "ParamMember": fields.List(UDBParamMemberSetSchema()), + "RegionFlag": fields.Bool(required=False, load_from="RegionFlag"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class UDBRWSplittingSetSchema(schema.ResponseSchema): + """UDBRWSplittingSet - 读写分离""" + + fields = { + "DBId": fields.Str(required=False, load_from="DBId"), + "ReadWeight": fields.Int(required=False, load_from="ReadWeight"), + "Role": fields.Str(required=False, load_from="Role"), + "State": fields.Str(required=False, load_from="State"), + "VirtualIP": fields.Str(required=False, load_from="VirtualIP"), + } + + +class UDBTypeSetSchema(schema.ResponseSchema): + """UDBTypeSet - DescribeUDBType""" + + fields = { + "DBSubVersion": fields.Str(required=False, load_from="DBSubVersion"), + "DBTypeId": fields.Str(required=False, load_from="DBTypeId"), + } + + +class ConnNumMapSchema(schema.ResponseSchema): + """ConnNumMap - db实例ip和连接数信息""" + + fields = { + "Ip": fields.Str(required=False, load_from="Ip"), + "Num": fields.Int(required=False, load_from="Num"), + } + + +class MachineTypeSchema(schema.ResponseSchema): + """MachineType - mysql数据库机型""" + + fields = { + "Cpu": fields.Int(required=False, load_from="Cpu"), + "Description": fields.Str(required=False, load_from="Description"), + "Group": fields.Str(required=False, load_from="Group"), + "ID": fields.Str(required=False, load_from="ID"), + "Memory": fields.Int(required=False, load_from="Memory"), + "Os": fields.Str(required=False, load_from="Os"), + } + + +class TableDataSchema(schema.ResponseSchema): + """TableData - 用户表详情""" + + fields = { + "DBName": fields.Str(required=True, load_from="DBName"), + "Engine": fields.Str(required=True, load_from="Engine"), + "TableName": fields.Str(required=True, load_from="TableName"), + } + + +class UDBDatabaseDataSchema(schema.ResponseSchema): + """UDBDatabaseData - 某个库的详细信息""" + + fields = { + "DBName": fields.Str(required=True, load_from="DBName"), + "TableDataSet": fields.List(TableDataSchema()), + } diff --git a/ucloud/services/udbproxy/__init__.py b/ucloud/services/udbproxy/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/udbproxy/client.py b/ucloud/services/udbproxy/client.py new file mode 100644 index 00000000..fa673b3e --- /dev/null +++ b/ucloud/services/udbproxy/client.py @@ -0,0 +1,67 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.udbproxy.schemas import apis + + +class UDBProxyClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UDBProxyClient, self).__init__( + config, transport, middleware, logger + ) + + def list_udb_proxy_client( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUDBProxyClient - 查询代理客户端连接IP信息(实时) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UDBProxyID** (str) - (Required) 代理ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **NodeClientInfos** (list) - 见 **NodeClientInfo** 模型定义 + - **UDBProxyID** (str) - 代理ID + + **Response Model** + + **NodeClientInfo** + - **ID** (str) - 代理节点ID + - **IP** (str) - 代理节点IP + - **Records** (list) - 见 **ProxyProcesslist** 模型定义 + + + **ProxyProcesslist** + - **ClientHost** (str) - 代理连接DB地址 + - **Command** (str) - 显示当前连接的执行的命令 + - **DB** (str) - 当前执行的命令是在哪一个数据库上。如果没有指定数据库,则该值为 NULL + - **DBID** (str) - 数据库资源ID + - **Host** (str) - 代理连接DB地址 + - **ID** (int) - 当前连接DB进程ID + - **Info** (str) - 一般记录的是线程执行的语句 + - **Role** (str) - 数据库角色(主库/从库) + - **State** (str) - 线程的状态,和 Command 对应 + - **Time** (int) - 表示该线程处于当前状态的时间 + - **User** (str) - 启动这个线程的用户 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUDBProxyClientRequestSchema().dumps(d) + + resp = self.invoke("ListUDBProxyClient", d, **kwargs) + return apis.ListUDBProxyClientResponseSchema().loads(resp) diff --git a/ucloud/services/udbproxy/schemas/__init__.py b/ucloud/services/udbproxy/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/udbproxy/schemas/apis.py b/ucloud/services/udbproxy/schemas/apis.py new file mode 100644 index 00000000..6eb145cc --- /dev/null +++ b/ucloud/services/udbproxy/schemas/apis.py @@ -0,0 +1,38 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.udbproxy.schemas import models + +""" UDBProxy API Schema +""" + + +""" +API: ListUDBProxyClient + +查询代理客户端连接IP信息(实时) +""" + + +class ListUDBProxyClientRequestSchema(schema.RequestSchema): + """ListUDBProxyClient - 查询代理客户端连接IP信息(实时)""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UDBProxyID": fields.Str(required=True, dump_to="UDBProxyID"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ListUDBProxyClientResponseSchema(schema.ResponseSchema): + """ListUDBProxyClient - 查询代理客户端连接IP信息(实时)""" + + fields = { + "NodeClientInfos": fields.List( + models.NodeClientInfoSchema(), + required=True, + load_from="NodeClientInfos", + ), + "UDBProxyID": fields.Str(required=True, load_from="UDBProxyID"), + } diff --git a/ucloud/services/udbproxy/schemas/models.py b/ucloud/services/udbproxy/schemas/models.py new file mode 100644 index 00000000..a3d79e87 --- /dev/null +++ b/ucloud/services/udbproxy/schemas/models.py @@ -0,0 +1,31 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class ProxyProcesslistSchema(schema.ResponseSchema): + """ProxyProcesslist - 连接代理信息""" + + fields = { + "ClientHost": fields.Str(required=True, load_from="ClientHost"), + "Command": fields.Str(required=True, load_from="Command"), + "DB": fields.Str(required=True, load_from="DB"), + "DBID": fields.Str(required=True, load_from="DBID"), + "Host": fields.Str(required=True, load_from="Host"), + "ID": fields.Int(required=True, load_from="ID"), + "Info": fields.Str(required=True, load_from="Info"), + "Role": fields.Str(required=True, load_from="Role"), + "State": fields.Str(required=True, load_from="State"), + "Time": fields.Int(required=True, load_from="Time"), + "User": fields.Str(required=True, load_from="User"), + } + + +class NodeClientInfoSchema(schema.ResponseSchema): + """NodeClientInfo - 代理节点来源IP信息""" + + fields = { + "ID": fields.Str(required=False, load_from="ID"), + "IP": fields.Str(required=False, load_from="IP"), + "Records": fields.List(ProxyProcesslistSchema()), + } diff --git a/ucloud/services/uddb/__init__.py b/ucloud/services/uddb/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/uddb/client.py b/ucloud/services/uddb/client.py new file mode 100644 index 00000000..38ee6b14 --- /dev/null +++ b/ucloud/services/uddb/client.py @@ -0,0 +1,456 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.uddb.schemas import apis + + +class UDDBClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UDDBClient, self).__init__(config, transport, middleware, logger) + + def change_uddb_instance_name( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ChangeUDDBInstanceName - 修改分布式数据库中间件名称 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **NewName** (str) - (Required) 名称 + - **UDDBId** (str) - (Required) UDDB实例Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ChangeUDDBInstanceNameRequestSchema().dumps(d) + + resp = self.invoke("ChangeUDDBInstanceName", d, **kwargs) + return apis.ChangeUDDBInstanceNameResponseSchema().loads(resp) + + def change_uddb_slave_count( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ChangeUDDBSlaveCount - 改变分布式数据库数据节点的只读实例个数每一个UDDB的数据节点负责处理所有的写入请求。与此同时,每一个数据节点可以配置若干个该节点的只读实例。当主节点的数据写入完毕后,只读实例把这次的写入操作进行更新,从而和数据节点保持一致。只读实例可以使得数据由多份复制,在数据节点和只读实例之间,可以做请求的读写分离, 也就是说, 主节点写入数据之后, 数据的读操作可以由数据只读实例进行分担, 这样减少主节点的压力, 增加性能当改变了数据节点的只读实例个数之后,对于现有的和以后的每一个数据节点都采用这个配置。如果UDDB实例有现有的数据节点, 那么它会根据新配置的参数,自动创建或删除数据节点的只读实例如下状态的UDDB实例可以进行这个操作:Running: 系统正常运行中当请求返回成功之后,UDDB实例的状态变成"ChangingSlaveCount"; 如果返回失败, UDDB实例状态保持不变 当UDDB更改数据分区的只读实例个数成功之后, UDDB实例的状态变成"Running"(正常运行中); 如果更改过程中出现异常, 状态变成"Abnormal"(异常运行中)或者"Error"(运行错误) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SlaveCount** (str) - (Required) 每个数据节点的只读实例个数, 取值必须>=0 + - **UDDBId** (str) - (Required) UDDB资源id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ChangeUDDBSlaveCountRequestSchema().dumps(d) + + resp = self.invoke("ChangeUDDBSlaveCount", d, **kwargs) + return apis.ChangeUDDBSlaveCountResponseSchema().loads(resp) + + def create_uddb_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUDDBInstance - 创建创建分布式数据库UDDB实例, 简称UDDB实例。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **AdminPassword** (str) - (Required) 管理员密码, 密码需要使用base64加密 + - **DBTypeId** (str) - (Required) UDDB的数据库版本,支持版本如下:mysql-5.6 mysql-5.7. 如果不填,则默认为mysql-5.6 + - **DataNodeCount** (int) - (Required) 初始的数据节点个数 取值必须>0. + - **DataNodeDiskSpace** (int) - (Required) 新的数据节点的磁盘大小配置. 单位: GB 具体数值参考UDB的磁盘大小取值. + - **DataNodeMemory** (int) - (Required) 新的数据节点的内存配置, 单位:MB 具体数值参考UDB的内存取值. + - **Name** (str) - (Required) 实例名称,至少6位 + - **RouterNodeNum** (int) - (Required) 其他版本:该参数可不填;专享版:物理机台数 + - **RouterVersion** (str) - (Required) UDDB路由节点的版本。分为三种: Trival(免费版): 2中间件节点; QPS:1.5W FellFree(标准版): 固定为4中间件节点,后续将根据业务请求量自动扩展,最多扩展到12个节点,QPS为3w - 10w; EnjoyAlone(物理机版):专享物理机,节点数让客户可选 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **AdminUser** (str) - 管理员帐户名,默认root + - **ChargeType** (str) - 付费类型,可选值如下:Year: 按年付费 Month: 按月付费 Dynamic: 按需付费(单位: 小时) Trial: 免费试用 默认值为: Dynamic + - **CouponId** (str) - 使用的代金券id + - **DataNodeSlaveCount** (int) - 每个数据节点的只读实例个数, 取值必须>=0. 默认取值为0. + - **InstanceMode** (str) - 存储节点的高可用模式, 分为高可用UDB(HA)和普通UDB(Normal),如果不填, 则默认为HA + - **InstanceType** (str) - 存储节点和只读实例的磁盘类型。分为:SSD磁盘(SATA_SSD)或普通磁盘(Normal)。 如果不填,则默认为SATA_SSD + - **Port** (int) - 端口号,mysql默认端口为3306 + - **Quantity** (int) - 购买时长,默认值1 + - **SubnetId** (str) - 子网ID + - **VPCId** (str) - VPC的ID + + **Response** + + - **Message** (str) - 如果执行失败, 失败的错误消息 + - **UDDBId** (str) - UDDB实例ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateUDDBInstanceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUDDBInstance", d, **kwargs) + return apis.CreateUDDBInstanceResponseSchema().loads(resp) + + def delete_uddb_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUDDBInstance - 删除UDDB实例。如下状态的UDDB实例可以进行这个操作:InitFail: 初始化失败Shutoff: 已关闭当请求返回成功之后,UDDB实例就已经被删除, 列表上看不到对应的UDDB实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UDDBId** (str) - (Required) UDDB实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 如果执行失败, 失败的错误消息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteUDDBInstanceRequestSchema().dumps(d) + + resp = self.invoke("DeleteUDDBInstance", d, **kwargs) + return apis.DeleteUDDBInstanceResponseSchema().loads(resp) + + def describe_uddb_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUDDBInstance - 获取分布式数据库UDDB的详细信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UDDBId** (str) - (Required) UDDB实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **DataSet** (list) - 见 **DataSetUDDB** 模型定义 + - **Message** (str) - 如果执行失败, 失败的错误消息 + + **Response Model** + + **DataSetUDDB** + - **AdminUser** (str) - 管理员帐户名,默认root + - **ChargeType** (str) - 付费类型,可选值如下: Year: 按年付费 Month: 按月付费 Dynamic: 按需付费(单位: 小时) Trial: 免费试用 + - **CreateTime** (str) - UDDB实例创建时间,采用UTC计时时间戳 + - **DBTypeId** (str) - UDDB的数据库版本 + - **DataNodeCount** (str) - 数据节点个数 + - **DataNodeDiskSpace** (str) - 数据节点的磁盘大小配置. 单位: GB + - **DataNodeList** (list) - 见 **DataNodeInfo** 模型定义 + - **DataNodeMemory** (str) - 数据节点的内存配置, 单位:MB + - **DataNodeSlaveCount** (str) - 每个数据节点的只读实例个数. + - **ExpiredTime** (str) - UDDB实例过期时间,采用UTC计时时间戳 + - **InstanceMode** (str) - 存储节点的高可用模式, 分为高可用UDB(HA)和普通UDB(Normal),如果不填, 则默认为HA + - **InstanceType** (str) - 存储节点和只读实例的磁盘类型。分为:SSD磁盘(SATA_SSD)或普通磁盘(Normal)。 如果不填,则默认为SATA_SSD + - **Name** (str) - UDDB实例名称 + - **Port** (str) - UDDB实例访问的端口号 + - **RefQps** (int) - 参考QPS。 免费版: 15000; 畅享版: 30000 - 100000 (根据节点数而定); 专享版: 节点数 * 10w qps + - **RouterNodeNum** (int) - 各版本下的节点个数。体验版: 固定为2节点; 畅享版:固定为4节点(后续可通过管理API调整);专享版:物理机台数 + - **RouterVersion** (str) - UDDB路由节点的版本。分为三种: Trival(免费版): 2中间件节点; QPS:1.5W FellFree(标准版): 固定为4中间件节点,后续将根据业务请求量自动扩展,最多扩展到12个节点,QPS为3w - 10w; EnjoyAlone(物理机版):专享物理机,节点数让客户可选 + - **State** (str) - UDDB状态, 状态列表如下: Init: 初始化中 InitFail: 初始化失败 Starting: 启动中 Running: 系统正常运行中 Abnormal: 系统运行中, 有异常, 还能提供服务 Error: 系统运行中, 但不能正常提供服务 Shutdown: 关闭中 Shutoff: 已关闭 Deleted: 已删除 UpgradingUDDB: 升降级UDDB配置中 UpgradingDataNode: 升降级UDDB节点配置中 ChangingSlaveCount: 改变只读实例数量中 ScalingOutUDDB: 水平扩展中 + - **UDDBId** (str) - UDDB实例ID + - **VirtualIP** (str) - UDDB实例访问的虚IP + - **Zone** (str) - UDDB实例对应的可用区 + + + **DataNodeInfo** + - **CreateTime** (str) - 节点的创建时间 + - **DiskSpace** (str) - 数据节点的磁盘大小配置. 单位: GB + - **Id** (str) - 数据节点ID + - **LastTransTaskId** (str) - 最近一次数据迁移任务id + - **Memory** (str) - 数据节点的内存配置, 单位:MB + - **SlaveCount** (str) - 数据节点的只读实例个数. + - **SlaveInfos** (list) - 见 **SlaveInfo** 模型定义 + - **State** (str) - 数据分片状态, 状态列表如下: Init: 初始化中 Fail: 安装失败 Starting: 启动中 Running: 系统正常运行中 Shutdown: 关闭中 Shutoff: 已关闭 Deleted: 已删除 Upgrading: 系统升级中 + + + **SlaveInfo** + - **DataNodeId** (str) - 对应数据节点的ID + - **Id** (str) - 只读实例ID + - **State** (str) - 只读实例状态, 状态列表如下: Init: 初始化中 Fail: 安装失败 Starting: 启动中 Running: 系统正常运行中 Shutdown: 关闭中 Shutoff: 已关闭 Deleted: 已删除 Upgrading: 系统升级中 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUDDBInstanceRequestSchema().dumps(d) + + resp = self.invoke("DescribeUDDBInstance", d, **kwargs) + return apis.DescribeUDDBInstanceResponseSchema().loads(resp) + + def describe_uddb_instance_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUDDBInstancePrice - 获取分布式数据库UDDB价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DataNodeCount** (int) - (Required) 初始的数据节点个数 取值必须>0. + - **DataNodeDiskSpace** (int) - (Required) 新的数据节点的磁盘大小配置. 单位: GB 具体数值参考UDB的磁盘大小取值. + - **DataNodeMemory** (str) - (Required) 新的数据节点的内存配置, 单位:MB 具体数值参考UDB的内存取值. + - **RouterNodeNum** (int) - (Required) 其他版本:该参数可不填;专享版:物理机节点个数。一台物理机有2个节点 + - **RouterVersion** (str) - (Required) UDDB路由节点的版本。分为三种: Trival(免费版): 2中间件节点; QPS:1.5WFeelFree(标准版): 固定为4中间件节点,后续将根据业务请求量自动扩展,最多扩展到12个节点,QPS为3w - 10w;EnjoyAlone(物理机版):专享物理机,节点数让客户可选 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ChargeType** (str) - 付费类型,可选值如下: Year: 按年付费 Month: 按月付费 Dynamic: 按需付费(单位: 小时) Trial: 免费试用 默认值为: Dynamic + - **DataNodeSlaveCount** (int) - 每个数据节点的只读实例个数, 取值必须>=0. 默认取值为0. + - **InstanceMode** (str) - 存储节点的高可用模式, 分为高可用UDB(HA)和普通UDB(Normal),如果不填, 则默认为HA + - **InstanceType** (str) - 存储节点和只读实例的磁盘类型。分为:SSD磁盘(SATA_SSD)或普通磁盘(Normal)。 如果不填,则默认为SATA_SSD + - **Quantity** (int) - 购买时长,默认值1 + + **Response** + + - **Message** (str) - 如果执行失败, 失败的错误消息 + - **PriceInfo** (dict) - 见 **PriceDetailInfo** 模型定义 + + **Response Model** + + **PriceDetailInfo** + - **DataNodePrice** (float) - 存储节点费用 + - **DataNodeSlavePrice** (float) - 只读实例费用 + - **MiddlewarePrice** (float) - 中间件路由节点费用 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUDDBInstancePriceRequestSchema().dumps(d) + + resp = self.invoke("DescribeUDDBInstancePrice", d, **kwargs) + return apis.DescribeUDDBInstancePriceResponseSchema().loads(resp) + + def describe_uddb_instance_upgrade_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUDDBInstanceUpgradePrice - 升级UDDB时,获取升级后的价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **RouterNodeNum** (int) - (Required) 其他版本:该参数可不填;专享版:物理机节点的个数。一台物理机有2个节点 + - **RouterVersion** (str) - (Required) UDDB路由节点的版本。分为三种: Trival(免费版): 2中间件节点; QPS:1.5WFeelFree(标准版): 固定为4中间件节点,后续将根据业务请求量自动扩展,最多扩展到12个节点,QPS为3w - 10w;EnjoyAlone(物理机版):专享物理机,节点数让客户可选 + - **UDDBId** (str) - (Required) UDDB实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **DataNodeCount** (int) - 新的数据节点个数 取值必须>0. + - **DataNodeDiskSpace** (int) - 新的数据节点的磁盘大小配置. 单位: GB 具体数值参考UDB的磁盘大小取值. + - **DataNodeMemory** (int) - 新的数据节点的内存配置, 单位:MB 具体数值参考UDB的内存取值. + - **DataNodeSlaveCount** (int) - 每个数据节点的只读实例个数, 取值必须>=0. + - **InstanceMode** (str) - 存储节点的高可用模式, 分为高可用UDB(HA)和普通UDB(Normal),如果不填, 则默认为HA + - **InstanceType** (str) - 存储节点和只读实例的磁盘类型。分为:SSD磁盘(SATA_SSD)或普通磁盘(Normal)。 如果不填,则默认为SATA_SSD + + **Response** + + - **Message** (str) - 如果执行失败, 失败的错误消息 + - **PriceInfo** (dict) - 见 **PriceInfo** 模型定义 + + **Response Model** + + **PriceInfo** + - **DataNodePrice** (float) - 存储节点费用 + - **DataNodeSlavePrice** (float) - 只读实例费用 + - **MiddlewarePrice** (float) - 中间件路由节点费用 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUDDBInstanceUpgradePriceRequestSchema().dumps(d) + + resp = self.invoke("DescribeUDDBInstanceUpgradePrice", d, **kwargs) + return apis.DescribeUDDBInstanceUpgradePriceResponseSchema().loads(resp) + + def restart_uddb_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RestartUDDBInstance - 重启UDDB实例,开始提供服务。如下状态的UDDB实例可以进行这个操作:Running: 正常运行中Abnormal: 异常运行中当请求返回成功之后,UDDB实例的状态变成"Starting"(启动中); 如果返回失败, UDDB实例状态保持不变 UDDB实例在重启过程中, 当UDDB实例启动成功之后, UDDB实例的状态变成"Running"(正常运行中); 如果启动过程中出现异常, 状态变成"Abnormal"(异常运行中), 或者"Shutoff"(已关闭 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UDDBId** (str) - (Required) UDDB实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 如果执行失败, 失败的错误消息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.RestartUDDBInstanceRequestSchema().dumps(d) + + resp = self.invoke("RestartUDDBInstance", d, **kwargs) + return apis.RestartUDDBInstanceResponseSchema().loads(resp) + + def start_uddb_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """StartUDDBInstance - 启动UDDB实例,开始提供服务。如下状态的UDDB实例可以进行这个操作:Shutoff: 已关闭当请求返回成功之后,UDDB实例的状态变成"Starting"(启动中); 如果返回失败, UDDB实例状态保持不变 UDDB实例在启动过程中, 当UDDB实例启动成功之后, UDDB实例的状态变成"Running"(正常运行中); 如果启动过程中出现异常, 状态变成"Abnormal"(异常运行中), 或者"Shutoff"(已关闭) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UDDBId** (str) - (Required) UDDB实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 如果执行失败, 失败的错误消息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.StartUDDBInstanceRequestSchema().dumps(d) + + resp = self.invoke("StartUDDBInstance", d, **kwargs) + return apis.StartUDDBInstanceResponseSchema().loads(resp) + + def stop_uddb_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """StopUDDBInstance - 关闭UDDB实例,停止提供服务。如下状态的UDDB实例可以进行这个操作:Running: 正常运行中Abnormal: 异常运行中当请求返回成功之后,UDDB实例的状态变成"Shutdown"(关闭中); 如果返回失败, UDDB实例状态保持不变 UDDB实例在关闭过程中, 当UDDB实例关闭成功之后, UDDB实例的状态变成"Shutoff"(已关闭); 如果关闭过程中出现异常, 根据UDDB实例的情况, 状态变成"Abnormal"(异常运行中), 或者"Running"(正常运行中) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UDDBId** (str) - (Required) UDDB实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 如果执行失败, 失败的错误消息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.StopUDDBInstanceRequestSchema().dumps(d) + + resp = self.invoke("StopUDDBInstance", d, **kwargs) + return apis.StopUDDBInstanceResponseSchema().loads(resp) + + def upgrade_uddb_data_node( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpgradeUDDBDataNode - 升降级分布式数据库数据节点的配置, 提高/降低数据节点的数据容量和内存所有数据节点以及其所挂载的只读实例的配置都受到影响升降级数据节点的配置之后之后, 会按照数据节点新的磁盘和内存大小重新计费如下状态的数据节点实例可以进行这个操作:Shutoff: 已关闭当请求返回成功之后,UDDB实例的状态变成"UpgradingDataNode",相关数据节点的状态变成"Upgrading"; 如果返回失败, UDDB实例状态保持不变 当UDDB实例升级结束之后, UDDB实例的状态变成"Shutoff" + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DataNodeDiskSpace** (int) - (Required) 新的数据节点的磁盘大小配置. 单位: GB 具体数值参考UDB的磁盘大小取值. + - **DataNodeMemory** (int) - (Required) 新的数据节点的内存配置, 单位:MB 具体数值参考UDB的内存取值 + - **UDDBId** (str) - (Required) UDDB实例ID + - **CouponId** (str) - 使用的代金券id + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 如果执行失败, 失败的错误消息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpgradeUDDBDataNodeRequestSchema().dumps(d) + + resp = self.invoke("UpgradeUDDBDataNode", d, **kwargs) + return apis.UpgradeUDDBDataNodeResponseSchema().loads(resp) + + def upgrade_uddb_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpgradeUDDBInstance - 升降级分布式数据库中间件的配置, 提高/降低请求处理的并发性修改请求处理节点个数之后, 按照所有请求处理节点的总内存容量和CPU核数重新计费如下状态的UDDB实例可以进行这个操作:Running: 系统正常运行中当请求返回成功之后,UDDB实例的状态变成"UpgradingUDDB"; 如果返回失败, UDDB实例状态保持不变 当UDDB实例升级成功之后, UDDB实例的状态变成"Running"; 如果更改过程中出现异常, 状态变成"Abnormal", 或者"Error" + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **RouterNodeNum** (int) - (Required) 其他版本:该参数可不填;专享版:物理机台数 + - **RouterVersion** (str) - (Required) UDDB路由节点的版本。分为三种: Trival(免费版): 2中间件节点; QPS:1.5W FellFree(标准版): 固定为4中间件节点,后续将根据业务请求量自动扩展,最多扩展到12个节点,QPS为3w - 10w; EnjoyAlone(物理机版):专享物理机,节点数让客户可选 + - **UDDBId** (str) - (Required) UDDB实例ID + - **CouponId** (str) - 使用的代金券id + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 如果执行失败, 失败的错误消息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpgradeUDDBInstanceRequestSchema().dumps(d) + + resp = self.invoke("UpgradeUDDBInstance", d, **kwargs) + return apis.UpgradeUDDBInstanceResponseSchema().loads(resp) diff --git a/ucloud/services/uddb/schemas/__init__.py b/ucloud/services/uddb/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/uddb/schemas/apis.py b/ucloud/services/uddb/schemas/apis.py new file mode 100644 index 00000000..8621afb2 --- /dev/null +++ b/ucloud/services/uddb/schemas/apis.py @@ -0,0 +1,520 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.uddb.schemas import models + +""" UDDB API Schema +""" + + +""" +API: ChangeUDDBInstanceName + +修改分布式数据库中间件名称 +""" + + +class ChangeUDDBInstanceNameRequestSchema(schema.RequestSchema): + """ChangeUDDBInstanceName - 修改分布式数据库中间件名称""" + + fields = { + "NewName": fields.Str(required=True, dump_to="NewName"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UDDBId": fields.Str(required=True, dump_to="UDDBId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ChangeUDDBInstanceNameResponseSchema(schema.ResponseSchema): + """ChangeUDDBInstanceName - 修改分布式数据库中间件名称""" + + fields = {} + + +""" +API: ChangeUDDBSlaveCount + +改变分布式数据库数据节点的只读实例个数 +每一个UDDB的数据节点负责处理所有的写入请求。与此同时,每一个数据节点可以配置若干个该节点的只读实例。当主节点的数据写入完毕后,只读实例把这次的写入操作进行更新,从而和数据节点保持一致。 +只读实例可以使得数据由多份复制,在数据节点和只读实例之间,可以做请求的读写分离, 也就是说, 主节点写入数据之后, 数据的读操作可以由数据只读实例进行分担, 这样减少主节点的压力, 增加性能 +当改变了数据节点的只读实例个数之后,对于现有的和以后的每一个数据节点都采用这个配置。如果UDDB实例有现有的数据节点, 那么它会根据新配置的参数,自动创建或删除数据节点的只读实例 +如下状态的UDDB实例可以进行这个操作: +Running: 系统正常运行中 +当请求返回成功之后,UDDB实例的状态变成"ChangingSlaveCount"; 如果返回失败, UDDB实例状态保持不变 当UDDB更改数据分区的只读实例个数成功之后, UDDB实例的状态变成"Running"(正常运行中); 如果更改过程中出现异常, 状态变成"Abnormal"(异常运行中)或者"Error"(运行错误) +""" + + +class ChangeUDDBSlaveCountRequestSchema(schema.RequestSchema): + """ChangeUDDBSlaveCount - 改变分布式数据库数据节点的只读实例个数 + 每一个UDDB的数据节点负责处理所有的写入请求。与此同时,每一个数据节点可以配置若干个该节点的只读实例。当主节点的数据写入完毕后,只读实例把这次的写入操作进行更新,从而和数据节点保持一致。 + 只读实例可以使得数据由多份复制,在数据节点和只读实例之间,可以做请求的读写分离, 也就是说, 主节点写入数据之后, 数据的读操作可以由数据只读实例进行分担, 这样减少主节点的压力, 增加性能 + 当改变了数据节点的只读实例个数之后,对于现有的和以后的每一个数据节点都采用这个配置。如果UDDB实例有现有的数据节点, 那么它会根据新配置的参数,自动创建或删除数据节点的只读实例 + 如下状态的UDDB实例可以进行这个操作: + Running: 系统正常运行中 + 当请求返回成功之后,UDDB实例的状态变成"ChangingSlaveCount"; 如果返回失败, UDDB实例状态保持不变 当UDDB更改数据分区的只读实例个数成功之后, UDDB实例的状态变成"Running"(正常运行中); 如果更改过程中出现异常, 状态变成"Abnormal"(异常运行中)或者"Error"(运行错误) + """ + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SlaveCount": fields.Str(required=True, dump_to="SlaveCount"), + "UDDBId": fields.Str(required=True, dump_to="UDDBId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ChangeUDDBSlaveCountResponseSchema(schema.ResponseSchema): + """ChangeUDDBSlaveCount - 改变分布式数据库数据节点的只读实例个数 + 每一个UDDB的数据节点负责处理所有的写入请求。与此同时,每一个数据节点可以配置若干个该节点的只读实例。当主节点的数据写入完毕后,只读实例把这次的写入操作进行更新,从而和数据节点保持一致。 + 只读实例可以使得数据由多份复制,在数据节点和只读实例之间,可以做请求的读写分离, 也就是说, 主节点写入数据之后, 数据的读操作可以由数据只读实例进行分担, 这样减少主节点的压力, 增加性能 + 当改变了数据节点的只读实例个数之后,对于现有的和以后的每一个数据节点都采用这个配置。如果UDDB实例有现有的数据节点, 那么它会根据新配置的参数,自动创建或删除数据节点的只读实例 + 如下状态的UDDB实例可以进行这个操作: + Running: 系统正常运行中 + 当请求返回成功之后,UDDB实例的状态变成"ChangingSlaveCount"; 如果返回失败, UDDB实例状态保持不变 当UDDB更改数据分区的只读实例个数成功之后, UDDB实例的状态变成"Running"(正常运行中); 如果更改过程中出现异常, 状态变成"Abnormal"(异常运行中)或者"Error"(运行错误) + """ + + fields = {} + + +""" +API: CreateUDDBInstance + +创建创建分布式数据库UDDB实例, 简称UDDB实例。 +""" + + +class CreateUDDBInstanceRequestSchema(schema.RequestSchema): + """CreateUDDBInstance - 创建创建分布式数据库UDDB实例, 简称UDDB实例。""" + + fields = { + "AdminPassword": fields.Str(required=True, dump_to="AdminPassword"), + "AdminUser": fields.Str(required=False, dump_to="AdminUser"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "DBTypeId": fields.Str(required=True, dump_to="DBTypeId"), + "DataNodeCount": fields.Int(required=True, dump_to="DataNodeCount"), + "DataNodeDiskSpace": fields.Int( + required=True, dump_to="DataNodeDiskSpace" + ), + "DataNodeMemory": fields.Int(required=True, dump_to="DataNodeMemory"), + "DataNodeSlaveCount": fields.Int( + required=False, dump_to="DataNodeSlaveCount" + ), + "InstanceMode": fields.Str(required=False, dump_to="InstanceMode"), + "InstanceType": fields.Str(required=False, dump_to="InstanceType"), + "Name": fields.Str(required=True, dump_to="Name"), + "Port": fields.Int(required=False, dump_to="Port"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "RouterNodeNum": fields.Int(required=True, dump_to="RouterNodeNum"), + "RouterVersion": fields.Str(required=True, dump_to="RouterVersion"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateUDDBInstanceResponseSchema(schema.ResponseSchema): + """CreateUDDBInstance - 创建创建分布式数据库UDDB实例, 简称UDDB实例。""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + "UDDBId": fields.Str(required=False, load_from="UDDBId"), + } + + +""" +API: DeleteUDDBInstance + +删除UDDB实例。 +如下状态的UDDB实例可以进行这个操作: +InitFail: 初始化失败 +Shutoff: 已关闭 +当请求返回成功之后,UDDB实例就已经被删除, 列表上看不到对应的UDDB实例 +""" + + +class DeleteUDDBInstanceRequestSchema(schema.RequestSchema): + """DeleteUDDBInstance - 删除UDDB实例。 + 如下状态的UDDB实例可以进行这个操作: + InitFail: 初始化失败 + Shutoff: 已关闭 + 当请求返回成功之后,UDDB实例就已经被删除, 列表上看不到对应的UDDB实例 + """ + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UDDBId": fields.Str(required=True, dump_to="UDDBId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DeleteUDDBInstanceResponseSchema(schema.ResponseSchema): + """DeleteUDDBInstance - 删除UDDB实例。 + 如下状态的UDDB实例可以进行这个操作: + InitFail: 初始化失败 + Shutoff: 已关闭 + 当请求返回成功之后,UDDB实例就已经被删除, 列表上看不到对应的UDDB实例 + """ + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DescribeUDDBInstance + +获取分布式数据库UDDB的详细信息 +""" + + +class DescribeUDDBInstanceRequestSchema(schema.RequestSchema): + """DescribeUDDBInstance - 获取分布式数据库UDDB的详细信息""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UDDBId": fields.Str(required=True, dump_to="UDDBId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeUDDBInstanceResponseSchema(schema.ResponseSchema): + """DescribeUDDBInstance - 获取分布式数据库UDDB的详细信息""" + + fields = { + "DataSet": fields.List( + models.DataSetUDDBSchema(), required=False, load_from="DataSet" + ), + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: DescribeUDDBInstancePrice + +获取分布式数据库UDDB价格 +""" + + +class DescribeUDDBInstancePriceRequestSchema(schema.RequestSchema): + """DescribeUDDBInstancePrice - 获取分布式数据库UDDB价格""" + + fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "DataNodeCount": fields.Int(required=True, dump_to="DataNodeCount"), + "DataNodeDiskSpace": fields.Int( + required=True, dump_to="DataNodeDiskSpace" + ), + "DataNodeMemory": fields.Str(required=True, dump_to="DataNodeMemory"), + "DataNodeSlaveCount": fields.Int( + required=False, dump_to="DataNodeSlaveCount" + ), + "InstanceMode": fields.Str(required=False, dump_to="InstanceMode"), + "InstanceType": fields.Str(required=False, dump_to="InstanceType"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "RouterNodeNum": fields.Int(required=True, dump_to="RouterNodeNum"), + "RouterVersion": fields.Str(required=True, dump_to="RouterVersion"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeUDDBInstancePriceResponseSchema(schema.ResponseSchema): + """DescribeUDDBInstancePrice - 获取分布式数据库UDDB价格""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + "PriceInfo": models.PriceDetailInfoSchema(), + } + + +""" +API: DescribeUDDBInstanceUpgradePrice + +升级UDDB时,获取升级后的价格 +""" + + +class DescribeUDDBInstanceUpgradePriceRequestSchema(schema.RequestSchema): + """DescribeUDDBInstanceUpgradePrice - 升级UDDB时,获取升级后的价格""" + + fields = { + "DataNodeCount": fields.Int(required=False, dump_to="DataNodeCount"), + "DataNodeDiskSpace": fields.Int( + required=False, dump_to="DataNodeDiskSpace" + ), + "DataNodeMemory": fields.Int(required=False, dump_to="DataNodeMemory"), + "DataNodeSlaveCount": fields.Int( + required=False, dump_to="DataNodeSlaveCount" + ), + "InstanceMode": fields.Str(required=False, dump_to="InstanceMode"), + "InstanceType": fields.Str(required=False, dump_to="InstanceType"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "RouterNodeNum": fields.Int(required=True, dump_to="RouterNodeNum"), + "RouterVersion": fields.Str(required=True, dump_to="RouterVersion"), + "UDDBId": fields.Str(required=True, dump_to="UDDBId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeUDDBInstanceUpgradePriceResponseSchema(schema.ResponseSchema): + """DescribeUDDBInstanceUpgradePrice - 升级UDDB时,获取升级后的价格""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + "PriceInfo": models.PriceInfoSchema(), + } + + +""" +API: RestartUDDBInstance + +重启UDDB实例,开始提供服务。 + +如下状态的UDDB实例可以进行这个操作: + +Running: 正常运行中 +Abnormal: 异常运行中 +当请求返回成功之后,UDDB实例的状态变成"Starting"(启动中); 如果返回失败, UDDB实例状态保持不变 UDDB实例在重启过程中, 当UDDB实例启动成功之后, UDDB实例的状态变成"Running"(正常运行中); 如果启动过程中出现异常, 状态变成"Abnormal"(异常运行中), 或者"Shutoff"(已关闭 +""" + + +class RestartUDDBInstanceRequestSchema(schema.RequestSchema): + """RestartUDDBInstance - 重启UDDB实例,开始提供服务。 + + 如下状态的UDDB实例可以进行这个操作: + + Running: 正常运行中 + Abnormal: 异常运行中 + 当请求返回成功之后,UDDB实例的状态变成"Starting"(启动中); 如果返回失败, UDDB实例状态保持不变 UDDB实例在重启过程中, 当UDDB实例启动成功之后, UDDB实例的状态变成"Running"(正常运行中); 如果启动过程中出现异常, 状态变成"Abnormal"(异常运行中), 或者"Shutoff"(已关闭 + """ + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UDDBId": fields.Str(required=True, dump_to="UDDBId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class RestartUDDBInstanceResponseSchema(schema.ResponseSchema): + """RestartUDDBInstance - 重启UDDB实例,开始提供服务。 + + 如下状态的UDDB实例可以进行这个操作: + + Running: 正常运行中 + Abnormal: 异常运行中 + 当请求返回成功之后,UDDB实例的状态变成"Starting"(启动中); 如果返回失败, UDDB实例状态保持不变 UDDB实例在重启过程中, 当UDDB实例启动成功之后, UDDB实例的状态变成"Running"(正常运行中); 如果启动过程中出现异常, 状态变成"Abnormal"(异常运行中), 或者"Shutoff"(已关闭 + """ + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: StartUDDBInstance + +启动UDDB实例,开始提供服务。 + +如下状态的UDDB实例可以进行这个操作: + +Shutoff: 已关闭 +当请求返回成功之后,UDDB实例的状态变成"Starting"(启动中); 如果返回失败, UDDB实例状态保持不变 UDDB实例在启动过程中, 当UDDB实例启动成功之后, UDDB实例的状态变成"Running"(正常运行中); 如果启动过程中出现异常, 状态变成"Abnormal"(异常运行中), 或者"Shutoff"(已关闭) +""" + + +class StartUDDBInstanceRequestSchema(schema.RequestSchema): + """StartUDDBInstance - 启动UDDB实例,开始提供服务。 + + 如下状态的UDDB实例可以进行这个操作: + + Shutoff: 已关闭 + 当请求返回成功之后,UDDB实例的状态变成"Starting"(启动中); 如果返回失败, UDDB实例状态保持不变 UDDB实例在启动过程中, 当UDDB实例启动成功之后, UDDB实例的状态变成"Running"(正常运行中); 如果启动过程中出现异常, 状态变成"Abnormal"(异常运行中), 或者"Shutoff"(已关闭) + """ + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UDDBId": fields.Str(required=True, dump_to="UDDBId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class StartUDDBInstanceResponseSchema(schema.ResponseSchema): + """StartUDDBInstance - 启动UDDB实例,开始提供服务。 + + 如下状态的UDDB实例可以进行这个操作: + + Shutoff: 已关闭 + 当请求返回成功之后,UDDB实例的状态变成"Starting"(启动中); 如果返回失败, UDDB实例状态保持不变 UDDB实例在启动过程中, 当UDDB实例启动成功之后, UDDB实例的状态变成"Running"(正常运行中); 如果启动过程中出现异常, 状态变成"Abnormal"(异常运行中), 或者"Shutoff"(已关闭) + """ + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: StopUDDBInstance + +关闭UDDB实例,停止提供服务。 + +如下状态的UDDB实例可以进行这个操作: + +Running: 正常运行中 +Abnormal: 异常运行中 +当请求返回成功之后,UDDB实例的状态变成"Shutdown"(关闭中); 如果返回失败, UDDB实例状态保持不变 UDDB实例在关闭过程中, 当UDDB实例关闭成功之后, UDDB实例的状态变成"Shutoff"(已关闭); 如果关闭过程中出现异常, 根据UDDB实例的情况, 状态变成"Abnormal"(异常运行中), 或者"Running"(正常运行中) +""" + + +class StopUDDBInstanceRequestSchema(schema.RequestSchema): + """StopUDDBInstance - 关闭UDDB实例,停止提供服务。 + + 如下状态的UDDB实例可以进行这个操作: + + Running: 正常运行中 + Abnormal: 异常运行中 + 当请求返回成功之后,UDDB实例的状态变成"Shutdown"(关闭中); 如果返回失败, UDDB实例状态保持不变 UDDB实例在关闭过程中, 当UDDB实例关闭成功之后, UDDB实例的状态变成"Shutoff"(已关闭); 如果关闭过程中出现异常, 根据UDDB实例的情况, 状态变成"Abnormal"(异常运行中), 或者"Running"(正常运行中) + """ + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UDDBId": fields.Str(required=True, dump_to="UDDBId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class StopUDDBInstanceResponseSchema(schema.ResponseSchema): + """StopUDDBInstance - 关闭UDDB实例,停止提供服务。 + + 如下状态的UDDB实例可以进行这个操作: + + Running: 正常运行中 + Abnormal: 异常运行中 + 当请求返回成功之后,UDDB实例的状态变成"Shutdown"(关闭中); 如果返回失败, UDDB实例状态保持不变 UDDB实例在关闭过程中, 当UDDB实例关闭成功之后, UDDB实例的状态变成"Shutoff"(已关闭); 如果关闭过程中出现异常, 根据UDDB实例的情况, 状态变成"Abnormal"(异常运行中), 或者"Running"(正常运行中) + """ + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: UpgradeUDDBDataNode + +升降级分布式数据库数据节点的配置, 提高/降低数据节点的数据容量和内存 + +所有数据节点以及其所挂载的只读实例的配置都受到影响 + +升降级数据节点的配置之后之后, 会按照数据节点新的磁盘和内存大小重新计费 + +如下状态的数据节点实例可以进行这个操作: + +Shutoff: 已关闭 +当请求返回成功之后,UDDB实例的状态变成"UpgradingDataNode",相关数据节点的状态变成"Upgrading"; 如果返回失败, UDDB实例状态保持不变 当UDDB实例升级结束之后, UDDB实例的状态变成"Shutoff" +""" + + +class UpgradeUDDBDataNodeRequestSchema(schema.RequestSchema): + """UpgradeUDDBDataNode - 升降级分布式数据库数据节点的配置, 提高/降低数据节点的数据容量和内存 + + 所有数据节点以及其所挂载的只读实例的配置都受到影响 + + 升降级数据节点的配置之后之后, 会按照数据节点新的磁盘和内存大小重新计费 + + 如下状态的数据节点实例可以进行这个操作: + + Shutoff: 已关闭 + 当请求返回成功之后,UDDB实例的状态变成"UpgradingDataNode",相关数据节点的状态变成"Upgrading"; 如果返回失败, UDDB实例状态保持不变 当UDDB实例升级结束之后, UDDB实例的状态变成"Shutoff" + """ + + fields = { + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "DataNodeDiskSpace": fields.Int( + required=True, dump_to="DataNodeDiskSpace" + ), + "DataNodeMemory": fields.Int(required=True, dump_to="DataNodeMemory"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UDDBId": fields.Str(required=True, dump_to="UDDBId"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class UpgradeUDDBDataNodeResponseSchema(schema.ResponseSchema): + """UpgradeUDDBDataNode - 升降级分布式数据库数据节点的配置, 提高/降低数据节点的数据容量和内存 + + 所有数据节点以及其所挂载的只读实例的配置都受到影响 + + 升降级数据节点的配置之后之后, 会按照数据节点新的磁盘和内存大小重新计费 + + 如下状态的数据节点实例可以进行这个操作: + + Shutoff: 已关闭 + 当请求返回成功之后,UDDB实例的状态变成"UpgradingDataNode",相关数据节点的状态变成"Upgrading"; 如果返回失败, UDDB实例状态保持不变 当UDDB实例升级结束之后, UDDB实例的状态变成"Shutoff" + """ + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: UpgradeUDDBInstance + +升降级分布式数据库中间件的配置, 提高/降低请求处理的并发性 + +修改请求处理节点个数之后, 按照所有请求处理节点的总内存容量和CPU核数重新计费 + +如下状态的UDDB实例可以进行这个操作: + +Running: 系统正常运行中 +当请求返回成功之后,UDDB实例的状态变成"UpgradingUDDB"; 如果返回失败, UDDB实例状态保持不变 当UDDB实例升级成功之后, UDDB实例的状态变成"Running"; 如果更改过程中出现异常, 状态变成"Abnormal", 或者"Error" +""" + + +class UpgradeUDDBInstanceRequestSchema(schema.RequestSchema): + """UpgradeUDDBInstance - 升降级分布式数据库中间件的配置, 提高/降低请求处理的并发性 + + 修改请求处理节点个数之后, 按照所有请求处理节点的总内存容量和CPU核数重新计费 + + 如下状态的UDDB实例可以进行这个操作: + + Running: 系统正常运行中 + 当请求返回成功之后,UDDB实例的状态变成"UpgradingUDDB"; 如果返回失败, UDDB实例状态保持不变 当UDDB实例升级成功之后, UDDB实例的状态变成"Running"; 如果更改过程中出现异常, 状态变成"Abnormal", 或者"Error" + """ + + fields = { + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "RouterNodeNum": fields.Int(required=True, dump_to="RouterNodeNum"), + "RouterVersion": fields.Str(required=True, dump_to="RouterVersion"), + "UDDBId": fields.Str(required=True, dump_to="UDDBId"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class UpgradeUDDBInstanceResponseSchema(schema.ResponseSchema): + """UpgradeUDDBInstance - 升降级分布式数据库中间件的配置, 提高/降低请求处理的并发性 + + 修改请求处理节点个数之后, 按照所有请求处理节点的总内存容量和CPU核数重新计费 + + 如下状态的UDDB实例可以进行这个操作: + + Running: 系统正常运行中 + 当请求返回成功之后,UDDB实例的状态变成"UpgradingUDDB"; 如果返回失败, UDDB实例状态保持不变 当UDDB实例升级成功之后, UDDB实例的状态变成"Running"; 如果更改过程中出现异常, 状态变成"Abnormal", 或者"Error" + """ + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } diff --git a/ucloud/services/uddb/schemas/models.py b/ucloud/services/uddb/schemas/models.py new file mode 100644 index 00000000..90667983 --- /dev/null +++ b/ucloud/services/uddb/schemas/models.py @@ -0,0 +1,96 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class SlaveInfoSchema(schema.ResponseSchema): + """SlaveInfo - UDDB只读实例信息""" + + fields = { + "DataNodeId": fields.Str(required=False, load_from="DataNodeId"), + "Id": fields.Str(required=False, load_from="Id"), + "State": fields.Str(required=False, load_from="State"), + } + + +class DataNodeInfoSchema(schema.ResponseSchema): + """DataNodeInfo - UDDB存储节点和下挂的只读实例信息""" + + fields = { + "CreateTime": fields.Str(required=False, load_from="CreateTime"), + "DiskSpace": fields.Str(required=False, load_from="DiskSpace"), + "Id": fields.Str(required=False, load_from="Id"), + "LastTransTaskId": fields.Str( + required=False, load_from="LastTransTaskId" + ), + "Memory": fields.Str(required=False, load_from="Memory"), + "SlaveCount": fields.Str(required=False, load_from="SlaveCount"), + "SlaveInfos": fields.List(SlaveInfoSchema()), + "State": fields.Str(required=False, load_from="State"), + } + + +class DataSetUDDBSchema(schema.ResponseSchema): + """DataSetUDDB - UDDB信息的DataSet""" + + fields = { + "AdminUser": fields.Str(required=False, load_from="AdminUser"), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "CreateTime": fields.Str(required=False, load_from="CreateTime"), + "DBTypeId": fields.Str(required=False, load_from="DBTypeId"), + "DataNodeCount": fields.Str(required=False, load_from="DataNodeCount"), + "DataNodeDiskSpace": fields.Str( + required=False, load_from="DataNodeDiskSpace" + ), + "DataNodeList": fields.List(DataNodeInfoSchema()), + "DataNodeMemory": fields.Str( + required=False, load_from="DataNodeMemory" + ), + "DataNodeSlaveCount": fields.Str( + required=False, load_from="DataNodeSlaveCount" + ), + "ExpiredTime": fields.Str(required=False, load_from="ExpiredTime"), + "InstanceMode": fields.Str(required=False, load_from="InstanceMode"), + "InstanceType": fields.Str(required=False, load_from="InstanceType"), + "Name": fields.Str(required=False, load_from="Name"), + "Port": fields.Str(required=False, load_from="Port"), + "RefQps": fields.Int(required=False, load_from="RefQps"), + "RouterNodeNum": fields.Int(required=False, load_from="RouterNodeNum"), + "RouterVersion": fields.Str(required=False, load_from="RouterVersion"), + "State": fields.Str(required=False, load_from="State"), + "UDDBId": fields.Str(required=False, load_from="UDDBId"), + "VirtualIP": fields.Str(required=False, load_from="VirtualIP"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class PriceDetailInfoSchema(schema.ResponseSchema): + """PriceDetailInfo - UDDB实例计费详情""" + + fields = { + "DataNodePrice": fields.Float( + required=False, load_from="DataNodePrice" + ), + "DataNodeSlavePrice": fields.Float( + required=False, load_from="DataNodeSlavePrice" + ), + "MiddlewarePrice": fields.Float( + required=False, load_from="MiddlewarePrice" + ), + } + + +class PriceInfoSchema(schema.ResponseSchema): + """PriceInfo - UDDB实例计费详情""" + + fields = { + "DataNodePrice": fields.Float( + required=False, load_from="DataNodePrice" + ), + "DataNodeSlavePrice": fields.Float( + required=False, load_from="DataNodeSlavePrice" + ), + "MiddlewarePrice": fields.Float( + required=False, load_from="MiddlewarePrice" + ), + } diff --git a/ucloud/services/udi/__init__.py b/ucloud/services/udi/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/udi/client.py b/ucloud/services/udi/client.py new file mode 100644 index 00000000..bc236f06 --- /dev/null +++ b/ucloud/services/udi/client.py @@ -0,0 +1,250 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.udi.schemas import apis + + +class UDIClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UDIClient, self).__init__(config, transport, middleware, logger) + + def create_function_template( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateFunctionTemplate - 创建功能参数模板 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ContainerFormat** (str) - (Required) 文件输出格式 + - **EncodeFormat** (str) - (Required) 编码格式 + - **Function** (str) - (Required) 功能名称 + - **ProjectName** (str) - (Required) 项目名称 + - **TemplateName** (str) - (Required) 模板名称 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **AudioBitRate** (str) - 音频比特率 + - **AudioBitRateCustom** (str) - 自定义音频比特率 + - **AudioChannel** (str) - 音频声道 + - **AudioSampleRate** (str) - 音频采样率 + - **CRF** (str) - CRF压缩率 + - **CRFCustom** (str) - 自定义CRF压缩率 + - **FrameRate** (str) - 帧率 + - **FrameRateCustom** (str) - 自定义帧率 + - **Resolution** (str) - 分辨率 + - **ResolutionHeight** (str) - 分辨率高 + - **ResolutionWidth** (str) - 分辨率宽 + - **VideoBitRate** (str) - 视频比特率 + - **VideoBitRateCustom** (str) - 自定义视频比特率 + + **Response** + + - **TemplateId** (str) - 创建的模板ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateFunctionTemplateRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateFunctionTemplate", d, **kwargs) + return apis.CreateFunctionTemplateResponseSchema().loads(resp) + + def create_media_task( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateMediaTask - 创建一个多媒体任务 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Bucket** (str) - (Required) Bucket名称 + - **DstKey** (str) - (Required) 目标生成文件 + - **Function** (str) - (Required) 功能名称:例VideoTranscode + - **FunctionParamTemplateId** (str) - (Required) 功能的参数模板ID,需要事先创建模板才可用,也可以使用预设模板,详细可通过DescribeFunctionTemplate接口查询 + - **SrcKey** (str) - (Required) 源文件 + - **StorageBackend** (str) - (Required) 存储源 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **TaskId** (str) - 任务ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateMediaTaskRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateMediaTask", d, **kwargs) + return apis.CreateMediaTaskResponseSchema().loads(resp) + + def delete_function_template( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteFunctionTemplate - 删除功能模板 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **TemplateId** (str) - (Required) 要删除的模板ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteFunctionTemplateRequestSchema().dumps(d) + + resp = self.invoke("DeleteFunctionTemplate", d, **kwargs) + return apis.DeleteFunctionTemplateResponseSchema().loads(resp) + + def describe_function_template( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeFunctionTemplate - 获取功能模板 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Type** (str) - 功能模板类型:预设(preset)自定义(custom),为空则获取两种类型 + + **Response** + + - **Templates** (list) - 见 **FunctionTemplate** 模型定义 + + **Response Model** + + **FunctionTemplate** + - **FunctionName** (str) - + - **Id** (str) - + - **Name** (str) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeFunctionTemplateRequestSchema().dumps(d) + + resp = self.invoke("DescribeFunctionTemplate", d, **kwargs) + return apis.DescribeFunctionTemplateResponseSchema().loads(resp) + + def describe_media_functions( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeMediaFunctions - 描述当前支持的多媒体功能以及对应功能需要的参数信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Function** (str) - 要查询的Function名称,为空则返回所有支持的Function + + **Response** + + - **Functions** (list) - 见 **Function** 模型定义 + + **Response Model** + + **Function** + - **DisplayName** (str) - + - **FunctionName** (str) - + - **InputType** (str) - + - **OutputType** (str) - + - **SupportParams** (list) - 见 **ParamOption** 模型定义 + + + **ParamOption** + - **DisplayName** (str) - + - **OptionalValues** (list) - + - **ParamName** (str) - + - **Required** (bool) - + - **WhenValueCustom** (list) - 见 **ParamCustom** 模型定义 + + + **ParamCustom** + - **Max** (int) - + - **Min** (int) - + - **ParamName** (str) - + - **ParamType** (str) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeMediaFunctionsRequestSchema().dumps(d) + + resp = self.invoke("DescribeMediaFunctions", d, **kwargs) + return apis.DescribeMediaFunctionsResponseSchema().loads(resp) + + def describe_media_task( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeMediaTask - 查询任务状态 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **TaskId** (str) - 要查询的任务ID,为空则查询所有 + + **Response** + + - **Tasks** (list) - 见 **MediaTask** 模型定义 + + **Response Model** + + **MediaTask** + - **Function** (str) - + - **Id** (str) - + - **Status** (str) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeMediaTaskRequestSchema().dumps(d) + + resp = self.invoke("DescribeMediaTask", d, **kwargs) + return apis.DescribeMediaTaskResponseSchema().loads(resp) diff --git a/ucloud/services/udi/schemas/__init__.py b/ucloud/services/udi/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/udi/schemas/apis.py b/ucloud/services/udi/schemas/apis.py new file mode 100644 index 00000000..26db4c18 --- /dev/null +++ b/ucloud/services/udi/schemas/apis.py @@ -0,0 +1,205 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.udi.schemas import models + +""" UDI API Schema +""" + + +""" +API: CreateFunctionTemplate + +创建功能参数模板 +""" + + +class CreateFunctionTemplateRequestSchema(schema.RequestSchema): + """CreateFunctionTemplate - 创建功能参数模板""" + + fields = { + "AudioBitRate": fields.Str(required=False, dump_to="AudioBitRate"), + "AudioBitRateCustom": fields.Str( + required=False, dump_to="AudioBitRateCustom" + ), + "AudioChannel": fields.Str(required=False, dump_to="AudioChannel"), + "AudioSampleRate": fields.Str( + required=False, dump_to="AudioSampleRate" + ), + "CRF": fields.Str(required=False, dump_to="CRF"), + "CRFCustom": fields.Str(required=False, dump_to="CRFCustom"), + "ContainerFormat": fields.Str(required=True, dump_to="ContainerFormat"), + "EncodeFormat": fields.Str(required=True, dump_to="EncodeFormat"), + "FrameRate": fields.Str(required=False, dump_to="FrameRate"), + "FrameRateCustom": fields.Str( + required=False, dump_to="FrameRateCustom" + ), + "Function": fields.Str(required=True, dump_to="Function"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ProjectName": fields.Str(required=True, dump_to="ProjectName"), + "Region": fields.Str(required=True, dump_to="Region"), + "Resolution": fields.Str(required=False, dump_to="Resolution"), + "ResolutionHeight": fields.Str( + required=False, dump_to="ResolutionHeight" + ), + "ResolutionWidth": fields.Str( + required=False, dump_to="ResolutionWidth" + ), + "TemplateName": fields.Str(required=True, dump_to="TemplateName"), + "VideoBitRate": fields.Str(required=False, dump_to="VideoBitRate"), + "VideoBitRateCustom": fields.Str( + required=False, dump_to="VideoBitRateCustom" + ), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateFunctionTemplateResponseSchema(schema.ResponseSchema): + """CreateFunctionTemplate - 创建功能参数模板""" + + fields = { + "TemplateId": fields.Str(required=True, load_from="TemplateId"), + } + + +""" +API: CreateMediaTask + +创建一个多媒体任务 +""" + + +class CreateMediaTaskRequestSchema(schema.RequestSchema): + """CreateMediaTask - 创建一个多媒体任务""" + + fields = { + "Bucket": fields.Str(required=True, dump_to="Bucket"), + "DstKey": fields.Str(required=True, dump_to="DstKey"), + "Function": fields.Str(required=True, dump_to="Function"), + "FunctionParamTemplateId": fields.Str( + required=True, dump_to="FunctionParamTemplateId" + ), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SrcKey": fields.Str(required=True, dump_to="SrcKey"), + "StorageBackend": fields.Str(required=True, dump_to="StorageBackend"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateMediaTaskResponseSchema(schema.ResponseSchema): + """CreateMediaTask - 创建一个多媒体任务""" + + fields = { + "TaskId": fields.Str(required=False, load_from="TaskId"), + } + + +""" +API: DeleteFunctionTemplate + +删除功能模板 +""" + + +class DeleteFunctionTemplateRequestSchema(schema.RequestSchema): + """DeleteFunctionTemplate - 删除功能模板""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "TemplateId": fields.Str(required=True, dump_to="TemplateId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DeleteFunctionTemplateResponseSchema(schema.ResponseSchema): + """DeleteFunctionTemplate - 删除功能模板""" + + fields = {} + + +""" +API: DescribeFunctionTemplate + +获取功能模板 +""" + + +class DescribeFunctionTemplateRequestSchema(schema.RequestSchema): + """DescribeFunctionTemplate - 获取功能模板""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Type": fields.Str(required=False, dump_to="Type"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeFunctionTemplateResponseSchema(schema.ResponseSchema): + """DescribeFunctionTemplate - 获取功能模板""" + + fields = { + "Templates": fields.List( + models.FunctionTemplateSchema(), + required=False, + load_from="Templates", + ), + } + + +""" +API: DescribeMediaFunctions + +描述当前支持的多媒体功能以及对应功能需要的参数信息 +""" + + +class DescribeMediaFunctionsRequestSchema(schema.RequestSchema): + """DescribeMediaFunctions - 描述当前支持的多媒体功能以及对应功能需要的参数信息""" + + fields = { + "Function": fields.Str(required=False, dump_to="Function"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeMediaFunctionsResponseSchema(schema.ResponseSchema): + """DescribeMediaFunctions - 描述当前支持的多媒体功能以及对应功能需要的参数信息""" + + fields = { + "Functions": fields.List( + models.FunctionSchema(), required=False, load_from="Functions" + ), + } + + +""" +API: DescribeMediaTask + +查询任务状态 +""" + + +class DescribeMediaTaskRequestSchema(schema.RequestSchema): + """DescribeMediaTask - 查询任务状态""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "TaskId": fields.Str(required=False, dump_to="TaskId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeMediaTaskResponseSchema(schema.ResponseSchema): + """DescribeMediaTask - 查询任务状态""" + + fields = { + "Tasks": fields.List( + models.MediaTaskSchema(), required=False, load_from="Tasks" + ), + } diff --git a/ucloud/services/udi/schemas/models.py b/ucloud/services/udi/schemas/models.py new file mode 100644 index 00000000..84e49c91 --- /dev/null +++ b/ucloud/services/udi/schemas/models.py @@ -0,0 +1,58 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class FunctionTemplateSchema(schema.ResponseSchema): + """FunctionTemplate -""" + + fields = { + "FunctionName": fields.Str(required=False, load_from="FunctionName"), + "Id": fields.Str(required=False, load_from="Id"), + "Name": fields.Str(required=False, load_from="Name"), + } + + +class ParamCustomSchema(schema.ResponseSchema): + """ParamCustom -""" + + fields = { + "Max": fields.Int(required=False, load_from="Max"), + "Min": fields.Int(required=False, load_from="Min"), + "ParamName": fields.Str(required=False, load_from="ParamName"), + "ParamType": fields.Str(required=False, load_from="ParamType"), + } + + +class ParamOptionSchema(schema.ResponseSchema): + """ParamOption -""" + + fields = { + "DisplayName": fields.Str(required=False, load_from="DisplayName"), + "OptionalValues": fields.List(fields.Str()), + "ParamName": fields.Str(required=False, load_from="ParamName"), + "Required": fields.Bool(required=False, load_from="Required"), + "WhenValueCustom": fields.List(ParamCustomSchema()), + } + + +class FunctionSchema(schema.ResponseSchema): + """Function -""" + + fields = { + "DisplayName": fields.Str(required=False, load_from="DisplayName"), + "FunctionName": fields.Str(required=False, load_from="FunctionName"), + "InputType": fields.Str(required=False, load_from="InputType"), + "OutputType": fields.Str(required=False, load_from="OutputType"), + "SupportParams": fields.List(ParamOptionSchema()), + } + + +class MediaTaskSchema(schema.ResponseSchema): + """MediaTask -""" + + fields = { + "Function": fields.Str(required=False, load_from="Function"), + "Id": fields.Str(required=False, load_from="Id"), + "Status": fields.Str(required=False, load_from="Status"), + } diff --git a/ucloud/services/udisk/client.py b/ucloud/services/udisk/client.py index eb42163e..c3bde936 100644 --- a/ucloud/services/udisk/client.py +++ b/ucloud/services/udisk/client.py @@ -14,25 +14,32 @@ def __init__( super(UDiskClient, self).__init__(config, transport, middleware, logger) def attach_udisk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ AttachUDisk - 将一个可用的UDisk挂载到某台主机上,当UDisk挂载成功后,还需要在主机内部进行文件系统操作 + """AttachUDisk - 将一个可用的UDisk挂载到某台主机上,当UDisk挂载成功后,还需要在主机内部进行文件系统操作 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **UDiskId** (str) - (Required) 需要挂载的UDisk实例ID. - - **UHostId** (str) - (Required) UHost实例ID - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **EnableCrossPodAttach** (str) - 是否允许跨pod挂载(Yes:允许跨pod挂载,No:不允许跨pod挂载,不填默认No) + - **HostId** (str) - Host实例ID - **MultiAttach** (str) - 是否允许多点挂载(Yes: 允许多点挂载, No: 不允许多点挂载, 不填默认Yes ) - + - **UHostId** (str) - UHost实例ID。【UHostId和HostId必须选填一个,本字段即将废弃,建议使用HostId】 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** + - **DeviceName** (str) - 挂载的设备名称 + - **HostId** (str) - 挂载的Host实例ID - **UDiskId** (str) - 挂载的UDisk实例ID - - **UHostId** (str) - 挂载的UHost实例ID - + - **UHostId** (str) - 挂载的UHost实例ID。【即将废弃,建议使用HostId】 + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.AttachUDiskRequestSchema().dumps(d) @@ -40,98 +47,219 @@ def attach_udisk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: return apis.AttachUDiskResponseSchema().loads(resp) def clone_udisk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ CloneUDisk - 从UDisk创建UDisk克隆 + """CloneUDisk - 从UDisk创建UDisk克隆 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Name** (str) - (Required) 实例名称 - **SourceId** (str) - (Required) 克隆父Disk的Id - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - - **ChargeType** (str) - Year , Month, Dynamic,Postpay 默认: Dynamic + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **BackupMode** (str) - 快照服务备份策略。默认采用基础版套餐开通,“Base”:基础版,“ Ultimate”:旗舰版,“ Custom”:自定义备份链 + - **ChargeType** (str) - Year , Month, Dynamic,Postpay,Trial 默认: Month - **Comment** (str) - Disk注释 - **CouponId** (str) - 使用的代金券id + - **Day** (int) - BackupMode为Custom时,进行设置, 以5天级为基础进行倍数扩增,如5、10、15、20、25、30 + - **HostId** (str) - Host实例ID。克隆出的云盘可直接挂载到该主机上。 + - **Hour** (int) - BackupMode为Custom时,进行设置, 以24小时级为基础进行倍数扩增,如24、48、72、96 + - **Journal** (int) - BackupMode为Custom时,进行设置, 以12小时秒级为基础进行倍数扩增,如12、24、36、48 - **Quantity** (int) - 购买时长 默认: 1 - - **UDataArkMode** (str) - 方舟是否开启,"Yes":开启,"No":关闭;默认为"No" - + - **RdmaClusterId** (str) - RDMA集群id。指定RSSD云盘克隆到对应的RDMA集群。 + - **Size** (int) - 新克隆UDisk的大小,单位:GB。指定Size须大于等于源盘Size,小于源盘Size或者不指定该参数均按源盘Size克隆新盘。普通数据盘:范围[1~8000];SSD数据盘:范围[1~8000];RSSD数据盘:范围[1~32000];高效数据盘:范围[1~32000]。 + - **SnapshotService** (str) - 是否开启快照服务(开启快照服务,可免费开启数据方舟)。Yes:开启,No:不开启,默认值:No + - **Tag** (str) - 业务组 默认:Default + - **UDataArkMode** (str) - 【开启数据方舟入口已关闭】是否开启数据方舟。Yes:开启,No:不开启,默认值:No + **Response** - **UDiskId** (list) - 创建UDisk Id - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.CloneUDiskRequestSchema().dumps(d) - # build options - kwargs["max_retries"] = 0 # ignore retry when api is not idempotent - resp = self.invoke("CloneUDisk", d, **kwargs) return apis.CloneUDiskResponseSchema().loads(resp) def clone_udisk_snapshot( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CloneUDiskSnapshot - 从快照创建UDisk克隆 + """CloneUDiskSnapshot - 从快照创建UDisk克隆 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Name** (str) - (Required) 实例名称 - - **Size** (int) - (Required) 购买UDisk大小,单位:GB,范围[1~2000], 权限位控制可达8T,若需要请申请开通相关权限。 - **SourceId** (str) - (Required) 克隆父Snapshot的Id - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **BackupMode** (str) - 快照服务备份策略。默认采用基础版套餐开通,“Base”:基础版,“ Ultimate”:旗舰版,“ Custom”:自定义备份链 - **ChargeType** (str) - Year , Month, Dynamic,Postpay 默认: Dynamic - **Comment** (str) - Disk注释 - **CouponId** (str) - 使用的代金券id + - **Day** (int) - BackupMode为Custom时,进行设置, 以5天级为基础进行倍数扩增,如5、10、15、20、25、30 + - **HostId** (str) - Host实例ID。克隆出的云盘可直接挂载到该主机上。 + - **Hour** (int) - BackupMode为Custom时,进行设置, 以24小时级为基础进行倍数扩增,如24、48、72、96 + - **Journal** (int) - BackupMode为Custom时,进行设置, 以12小时秒级为基础进行倍数扩增,如12、24、36、48 - **Quantity** (int) - 购买时长 默认: 1 - - **UDataArkMode** (str) - 是否开启数据方舟 默认:No - + - **RdmaClusterId** (str) - RDMA集群id。指定RSSD云盘克隆到对应的RDMA集群。 + - **Size** (int) - 新克隆UDisk的大小,单位:GB。指定Size须大于等于源盘Size,小于源盘Size或者不指定该参数均按源盘Size克隆新盘。普通数据盘:范围[1~8000];SSD数据盘:范围[1~8000];RSSD数据盘:范围[1~32000];高效数据盘:范围[1~32000]。 + - **SnapshotService** (str) - 是否开启快照服务(开启快照服务,可免费开启数据方舟)。Yes:开启,No:不开启,默认值:No + - **Tag** (str) - 业务组 默认:Default + - **UDataArkMode** (str) - 【开启数据方舟入口已关闭】是否开启数据方舟。Yes:开启,No:不开启,默认值:No + **Response** - **UDiskId** (list) - 创建UDisk Id - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.CloneUDiskSnapshotRequestSchema().dumps(d) + resp = self.invoke("CloneUDiskSnapshot", d, **kwargs) + return apis.CloneUDiskSnapshotResponseSchema().loads(resp) + + def clone_udisk_udataark( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CloneUDiskUDataArk - 从数据方舟的备份创建UDisk + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Name** (str) - (Required) 实例名称 + - **SnapshotTime** (int) - (Required) 指定从方舟克隆的备份时间点 + - **UDiskId** (str) - (Required) 需要克隆的源盘id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **BackupMode** (str) - 快照服务备份策略。默认采用基础版套餐开通,“Base”:基础版,“ Ultimate”:旗舰版,“ Custom”:自定义备份链 + - **ChargeType** (str) - Year , Month, Dynamic,Postpay 默认: Dynamic + - **Comment** (str) - Disk注释 + - **CouponId** (str) - 使用的代金券id + - **Day** (int) - BackupMode为Custom时,进行设置, 以5天级为基础进行倍数扩增,如5、10、15、20、25、30 + - **HostId** (str) - Host实例ID。克隆出的云盘可直接挂载到该主机上。 + - **Hour** (int) - BackupMode为Custom时,进行设置, 以24小时级为基础进行倍数扩增,如24、48、72、96 + - **Journal** (int) - BackupMode为Custom时,进行设置, 以12小时秒级为基础进行倍数扩增,如12、24、36、48 + - **Quantity** (int) - 购买时长 默认: 1 + - **RdmaClusterId** (str) - RDMA集群id。指定RSSD云盘克隆到对应的RDMA集群。 + - **Size** (int) - 新克隆UDisk的大小,单位:GB。指定Size须大于等于源盘Size,小于源盘Size或者不指定该参数均按源盘Size克隆新盘。普通数据盘:范围[1~8000];SSD数据盘:范围[1~8000];RSSD数据盘:范围[1~32000];高效数据盘:范围[1~32000]。 + - **SnapshotService** (str) - 是否开启快照服务(开启快照服务,可免费开启数据方舟)。Yes:开启,No:不开启,默认值:No + - **Tag** (str) - 业务组 默认:Default + - **UDataArkMode** (str) - 【开启数据方舟入口已关闭】是否开启数据方舟。Yes:开启,No:不开启,默认值:No + + **Response** + + - **UDiskId** (list) - 创建UDisk Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CloneUDiskUDataArkRequestSchema().dumps(d) + + resp = self.invoke("CloneUDiskUDataArk", d, **kwargs) + return apis.CloneUDiskUDataArkResponseSchema().loads(resp) + + def create_attach_udisk( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateAttachUDisk - 创建并挂载UDisk磁盘 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Name** (str) - (Required) 实例名称 + - **Size** (int) - (Required) 购买UDisk大小,单位:GB,普通数据盘:范围[1~8000];SSD数据盘:范围[1~8000];RSSD数据盘:范围[1~32000];高效数据盘:范围[1~32000]。 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **BackupMode** (str) - 快照服务备份策略。默认采用基础版套餐开通,“Base”:基础版,“ Ultimate”:旗舰版,“ Custom”:自定义备份链 + - **ChargeType** (str) - Year , Month, Dynamic, Postpay, Trial 。 Size小于等于2000时,默认为Dynamic;Size大于2000时,默认为Month。 + - **CmkId** (str) - 加密需要的cmk id,UKmsMode为Yes时,必填 + - **CouponId** (str) - 使用的代金券id + - **Day** (int) - BackupMode为Custom时,进行设置, 以5天级为基础进行倍数扩增,如5、10、15、20、25、30 + - **DiskType** (str) - UDisk 类型: DataDisk(普通数据盘),SSDDataDisk(SSD数据盘),RSSDDataDisk(RSSD数据盘),EfficiencyDataDisk(高效数据盘),默认值(DataDisk) + - **HostId** (str) - Host实例ID。当创建云盘类型为RSSDDataDisk时,根据传入的HostId,创建与虚机在同一PodId下的云盘。 + - **Hour** (int) - BackupMode为Custom时,进行设置, 以24小时级为基础进行倍数扩增,如24、48、72、96 + - **Journal** (int) - BackupMode为Custom时,进行设置, 以12小时秒级为基础进行倍数扩增,如12、24、36、48 + - **MultiAttach** (str) - 是否允许多点挂载(Yes: 允许多点挂载, No: 不允许多点挂载, 不填默认Yes ) + - **Quantity** (int) - 购买时长 默认: 1 + - **SnapshotService** (str) - 是否开启快照服务(开启快照服务,可免费开启数据方舟)。Yes:开启,No:不开启,默认值:No + - **Tag** (str) - 业务组 默认:Default + - **UDataArkMode** (str) - 【开启数据方舟入口已关闭】是否开启数据方舟。Yes:开启,No:不开启,默认值:No + - **UHostId** (str) - UHost实例ID。当创建云盘类型为RSSDDataDisk时,根据传入的UHostId,创建与虚机在同一PodId下的云盘。【UHostId和HostId必须选填一个,本字段即将废弃,建议使用HostId】 + - **UKmsMode** (str) - 是否加密。Yes:加密,No:不加密,默认值(No) + + **Response** + + - **DeviceName** (str) - 挂载设备名称 + - **HostId** (str) - 挂载的Host实例ID + - **UDiskId** (str) - 挂载的UDisk实例ID + - **UHostId** (str) - 挂载的UHost实例ID。【即将废弃,建议使用HostId】 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateAttachUDiskRequestSchema().dumps(d) + # build options kwargs["max_retries"] = 0 # ignore retry when api is not idempotent - resp = self.invoke("CloneUDiskSnapshot", d, **kwargs) - return apis.CloneUDiskSnapshotResponseSchema().loads(resp) + resp = self.invoke("CreateAttachUDisk", d, **kwargs) + return apis.CreateAttachUDiskResponseSchema().loads(resp) def create_udisk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ CreateUDisk - 创建UDisk磁盘 + """CreateUDisk - 创建UDisk磁盘 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Name** (str) - (Required) 实例名称 - - **Size** (int) - (Required) 购买UDisk大小,单位:GB,普通盘: 范围[1~2000], 权限位控制可达8T,若需要请申请开通相关权限;SSD盘: 范围[1~4000]。 - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - - **ChargeType** (str) - Year , Month, Dynamic, Postpay, Trial 默认: Dynamic + - **Size** (int) - (Required) 购买UDisk大小,单位:GB,普通数据盘:范围[1~8000];SSD数据盘:范围[1~8000];RSSD数据盘:范围[1~32000];高效数据盘:范围[1~32000]。 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **BackupMode** (str) - 快照服务备份策略。默认采用基础版套餐开通,“Base”:基础版,“ Ultimate”:旗舰版,“ Custom”:自定义备份链 + - **ChargeType** (str) - Year , Month, Dynamic, Postpay, Trial 。默认为Dynamic。 - **CmkId** (str) - 加密需要的cmk id,UKmsMode为Yes时,必填 - **CouponId** (str) - 使用的代金券id - - **DiskType** (str) - UDisk 类型: DataDisk(普通数据盘),SSDDataDisk(SSD数据盘),RSSDDataDisk(RSSD数据盘),默认值(DataDisk) + - **Day** (int) - BackupMode为Custom时,进行设置, 以5天级为基础进行倍数扩增,如5、10、15、20、25、30 + - **DiskType** (str) - UDisk 类型: DataDisk(普通数据盘),SSDDataDisk(SSD数据盘),RSSDDataDisk(RSSD数据盘),EfficiencyDataDisk(高效数据盘),默认值(DataDisk) + - **Hour** (int) - BackupMode为Custom时,进行设置, 以24小时级为基础进行倍数扩增,如24、48、72、96 + - **Journal** (int) - BackupMode为Custom时,进行设置, 以12小时秒级为基础进行倍数扩增,如12、24、36、48 - **Quantity** (int) - 购买时长 默认: 1 + - **RdmaClusterId** (str) - RDMA集群id。DiskType为RSSDDataDisk可填,指定云盘创建到对应的RDMA集群。 + - **SnapshotService** (str) - 是否开启快照服务(开启快照服务,可免费开启数据方舟)。Yes:开启,No:不开启,默认值:No - **Tag** (str) - 业务组 默认:Default - - **UDataArkMode** (str) - 是否开启数据方舟 + - **UDataArkMode** (str) - 【开启数据方舟入口已关闭】是否开启数据方舟。Yes:开启,No:不开启,默认值:No - **UKmsMode** (str) - 是否加密。Yes:加密,No:不加密,默认值(No) - + **Response** - **UDiskId** (list) - UDisk实例Id - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.CreateUDiskRequestSchema().dumps(d) @@ -144,26 +272,29 @@ def create_udisk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def create_udisk_snapshot( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateUDiskSnapshot - 创建snapshot快照 + """CreateUDiskSnapshot - 创建snapshot快照 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Name** (str) - (Required) 快照名称 - **UDiskId** (str) - (Required) 快照的UDisk的Id - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - - **ChargeType** (str) - Year , Month, Dynamic 默认: Dynamic + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ChargeType** (str) - Year , Month, Dynamic 默认: Dynamic (已废弃) - **Comment** (str) - 快照描述 - - **Quantity** (int) - 购买时长 默认: 1 - + - **Quantity** (int) - 购买时长 默认: 1 (已废弃) + **Response** - **SnapshotId** (list) - 快照Id - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.CreateUDiskSnapshotRequestSchema().dumps(d) @@ -174,21 +305,24 @@ def create_udisk_snapshot( return apis.CreateUDiskSnapshotResponseSchema().loads(resp) def delete_udisk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ DeleteUDisk - 删除UDisk + """DeleteUDisk - 删除UDisk **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **UDiskId** (str) - (Required) 要删除的UDisk的Id - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DeleteUDiskRequestSchema().dumps(d) @@ -198,55 +332,110 @@ def delete_udisk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def delete_udisk_snapshot( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeleteUDiskSnapshot - 删除Snapshot + """DeleteUDiskSnapshot - 删除Snapshot **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - **SnapshotId** (str) - 快照Id(填写后不能填写UDisk Id) - **UDiskId** (str) - UDisk Id,删除该盘所创建出来的所有快照(填写后不能填写SnapshotId) - + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DeleteUDiskSnapshotRequestSchema().dumps(d) resp = self.invoke("DeleteUDiskSnapshot", d, **kwargs) return apis.DeleteUDiskSnapshotResponseSchema().loads(resp) + def describe_recycle_udisk( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeRecycleUDisk - 拉取回收站中云硬盘列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Limit** (int) - 返回数据长度, 默认为20 + - **Offset** (int) - 数据偏移量, 默认为0 + + **Response** + + - **DataSet** (list) - 见 **RecycleUDiskSet** 模型定义 + - **TotalCount** (int) - 磁盘数量 + + **Response Model** + + **RecycleUDiskSet** + - **CountdownTime** (int) - 销毁倒计时 + - **CreateTime** (int) - 创建时间 + - **ExpiredTime** (int) - 过期时间 + - **Name** (str) - 磁盘名称 + - **Size** (int) - 磁盘容量 + - **Tag** (str) - 业务组 + - **UDiskId** (str) - 磁盘id + - **Zone** (str) - 可用区 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeRecycleUDiskRequestSchema().dumps(d) + + resp = self.invoke("DescribeRecycleUDisk", d, **kwargs) + return apis.DescribeRecycleUDiskResponseSchema().loads(resp) + def describe_udisk( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUDisk - 获取UDisk实例 + """DescribeUDisk - 获取UDisk实例 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **DiskType** (str) - ProtocolVersion字段为1时,需结合IsBoot确定具体磁盘类型:普通数据盘:DiskType:"CLOUD_NORMAL",IsBoot:"False"; 普通系统盘:DiskType:"CLOUD_NORMAL",IsBoot:"True";SSD数据盘:DiskType:"CLOUD_SSD",IsBoot:"False";SSD系统盘:DiskType:"CLOUD_SSD",IsBoot:"True";RSSD数据盘:DiskType:"CLOUD_RSSD",IsBoot:"False";为空拉取所有。ProtocolVersion字段为0或没有该字段时,可设为以下几个值:普通数据盘:DataDisk;普通系统盘;SystemDisk;SSD数据盘:SSDDataDisk;SSD系统盘:SSDSystemDisk;RSSD数据盘:RSSDDataDisk;为空拉取所有。 + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DiskType** (str) - ProtocolVersion字段为1时,需结合IsBoot确定具体磁盘类型:普通数据盘:DiskType:"CLOUD_NORMAL",IsBoot:"False";普通系统盘:DiskType:"CLOUD_NORMAL",IsBoot:"True";SSD数据盘:DiskType:"CLOUD_SSD",IsBoot:"False";SSD系统盘:DiskType:"CLOUD_SSD",IsBoot:"True";RSSD数据盘:DiskType:"CLOUD_RSSD",IsBoot:"False";RSSD系统盘:DiskType:"CLOUD_RSSD",IsBoot:"True";高效数据盘:DiskType:"CLOUD_EFFICIENCY",IsBoot:"False";高效系统盘:DiskType:"CLOUD_EFFICIENCY",IsBoot:"True";为空拉取所有。ProtocolVersion字段为0或没有该字段时,可设为以下几个值:普通数据盘:DataDisk;普通系统盘:SystemDisk;SSD数据盘:SSDDataDisk;SSD系统盘:SSDSystemDisk;RSSD数据盘:RSSDDataDisk;RSSD系统盘:RSSDSystemDisk:高效数据盘:EfficiencyDataDisk;高效系统盘:EfficiencySystemDisk;为空拉取所有。 + - **HostId** (str) - 根据传入的HostId,返回与该主机关联的云盘信息。 + - **HostIdForAttachment** (str) - 根据传入的HostIdForAttachment,筛选出能被挂载在该主机上的云盘。目前主要针对RSSD云盘。 + - **HostProduct** (str) - 宿主产品类型,可筛选挂载在该类型宿主上的云盘。可选值:uhost, uphost。为空拉取所有。(当HostIdForAttachment字段不为空时,该字段可以不填,若HostIdForAttachment与该字段宿主类型冲突,则以HostIdForAttachment字段为准。) + - **IgnoreBackupMode** (str) - 是否忽略快照服务信息。Yes:忽略,No:不忽略,默认值(No)。(如不关心快照服务信息,建议选填“Yes”,可降低请求延时) + - **IgnoreUBillInfo** (str) - 是否忽略计费信息。Yes:忽略,No:不忽略,默认值(No)。(如不关心账单信息,建议选填“Yes”,可降低请求延时) - **IsBoot** (str) - ProtocolVersion字段为1且DiskType不为空时,必须设置,设置规则请参照DiskType;ProtocolVersion字段为1且DiskType为空时,该字段无效。ProtocolVersion字段为0或没有该字段时,该字段无效。 - **Limit** (int) - 返回数据长度, 默认为20 - **Offset** (int) - 数据偏移量, 默认为0 - **ProtocolVersion** (int) - 请求协议版本,建议升级为1,为1时DiskType与UHost磁盘类型定义一致;默认为0 + - **Status** (str) - 云盘状态。All(所有状态),Available(可用),Attaching(挂载中),InUse(已挂载), Detaching(卸载中), Initializating(分配中),Failed(创建失败),Cloning(克隆中),Restoring(恢复中),RestoreFailed(恢复失败)。默认值:All + - **Tag** (str) - 业务组名称 + - **UDiskBasicInfo** (str) - 是否只返回云盘基础信息(只包含云盘及关联主机的资源信息)。Yes:是,No:否,默认值(No)。(如仅需要基础信息,建议选填“Yes”,可降低请求延时) - **UDiskId** (str) - UDisk Id(留空返回全部) - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **UHostIdForAttachment** (str) - 根据传入的UHostIdForAttachment,筛选出能被挂载在该主机上的云盘【本字段即将废弃,建议使用HostIdForAttachment】 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **DataSet** (list) - 见 **UDiskDataSet** 模型定义 - **TotalCount** (int) - 根据过滤条件得到的总数 - + **Response Model** - - **UDiskDataSet** - + + **UDiskDataSet** - **ArkSwitchEnable** (int) - 是否支持开启方舟,1支持 ,0不支持 + - **BackupMode** (str) - 该盘的备份方式。快照服务:"SnapshotService";数据方舟:"UDataArk";无备份方式:"" - **ChargeType** (str) - Year,Month,Dynamic,Trial,Postpay - **CloneEnable** (int) - 是否支持克隆,1支持 ,0不支持 - **CmkId** (str) - 该盘的cmk id @@ -255,29 +444,37 @@ def describe_udisk( - **CreateTime** (int) - 创建时间 - **DataKey** (str) - 该盘的密文密钥 - **DeviceName** (str) - 挂载的设备名称 - - **DiskType** (str) - 请求中的ProtocolVersion字段为1时,需结合IsBoot确定具体磁盘类型:普通数据盘:DiskType:"CLOUD_NORMAL",IsBoot:"False"; 普通系统盘:DiskType:"CLOUD_NORMAL",IsBoot:"True";SSD数据盘:DiskType:"CLOUD_SSD",IsBoot:"False";SSD系统盘:DiskType:"CLOUD_SSD",IsBoot:"True";RSSD数据盘:DiskType:"CLOUD_RSSD",IsBoot:"False"。请求中的ProtocolVersion字段为0或没有该字段时,云硬盘类型参照如下:普通数据盘:DataDisk;普通系统盘:SystemDisk;SSD数据盘:SSDDataDisk;SSD系统盘:SSDSystemDisk;RSSD数据盘:RSSDDataDisk。 + - **DiskType** (str) - 请求中的ProtocolVersion字段为1时,需结合IsBoot确定具体磁盘类型:普通数据盘:DiskType:"CLOUD_NORMAL",IsBoot:"False"; 普通系统盘:DiskType:"CLOUD_NORMAL",IsBoot:"True";SSD数据盘:DiskType:"CLOUD_SSD",IsBoot:"False";SSD系统盘:DiskType:"CLOUD_SSD",IsBoot:"True";RSSD数据盘:DiskType:"CLOUD_RSSD",IsBoot:"False";RSSD系统盘:DiskType:"CLOUD_RSSD",IsBoot:"True";高效数据盘:DiskType:"CLOUD_EFFICIENCY",IsBoot:"False";高效系统盘:DiskType:"CLOUD_EFFICIENCY",IsBoot:"True"。请求中的ProtocolVersion字段为0或没有该字段时,云硬盘类型参照如下:普通数据盘:DataDisk;普通系统盘:SystemDisk;SSD数据盘:SSDDataDisk;SSD系统盘:SSDSystemDisk;RSSD数据盘:RSSDDataDisk;RSSD系统盘:RSSDSystemDisk;高效数据盘:EfficiencyDataDisk;高效系统盘:EfficiencySystemDisk。 - **ExpiredTime** (int) - 过期时间 + - **HostIP** (str) - 挂载的Host的IP + - **HostId** (str) - 挂载的Host的Id + - **HostName** (str) - 挂载的Host的Name - **IsBoot** (str) - 是否是系统盘,是:"True", 否:"False" - **IsExpire** (str) - 资源是否过期,过期:"Yes", 未过期:"No" - **Name** (str) - 实例名称 + - **RdmaClusterId** (str) - RDMA集群id,仅RSSD返回该值;其他类型云盘返回""。当云盘的此值与快杰云主机的RdmaClusterId相同时,RSSD可以挂载到这台云主机。 - **Size** (int) - 容量单位GB - **SnapEnable** (int) - 是否支持快照,1支持 ,0不支持 - **SnapshotCount** (int) - 该盘快照个数 - **SnapshotLimit** (int) - 该盘快照上限 - - **Status** (str) - 状态:Available(可用),Attaching(挂载中), InUse(已挂载), Detaching(卸载中), Initializating(分配中), Failed(创建失败),Cloning(克隆中),Restoring(恢复中),RestoreFailed(恢复失败), + - **Status** (str) - 状态:Available(可用),Attaching(挂载中), InUse(已挂载), Detaching(卸载中), Initializating(分配中), Failed(创建失败),Cloning(克隆中),Restoring(恢复中),RestoreFailed(恢复失败) - **Tag** (str) - 业务组名称 - **UDataArkMode** (str) - 是否开启数据方舟,开启:"Yes", 不支持:"No" - **UDiskId** (str) - UDisk实例Id - - **UHostIP** (str) - 挂载的UHost的IP - - **UHostId** (str) - 挂载的UHost的Id - - **UHostName** (str) - 挂载的UHost的Name + - **UHostIP** (str) - 挂载的UHost的IP。【即将废弃,建议使用HostIP】 + - **UHostId** (str) - 挂载的UHost的Id。【即将废弃,建议使用HostId】 + - **UHostName** (str) - 挂载的UHost的Name。【即将废弃,建议使用HostName】 - **UKmsMode** (str) - 是否是加密盘,是:"Yes", 否:"No" - **Version** (str) - 是否支持数据方舟,支持:"2.0", 不支持:"1.0" - **Zone** (str) - 可用区 + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUDiskRequestSchema().dumps(d) @@ -287,35 +484,46 @@ def describe_udisk( def describe_udisk_price( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUDiskPrice - 获取UDisk实例价格信息 + """DescribeUDiskPrice - 获取UDisk实例价格信息 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **Size** (int) - (Required) 购买UDisk大小,单位:GB,范围[1~1000] - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - - **ChargeType** (str) - Year, Month, Dynamic,Trial,默认: Dynamic - - **DiskType** (str) - UDisk 类型: DataDisk(普通数据盘),SSDDataDisk(SSD数据盘),SystemDisk(普通系统盘),SSDSystemDisk(SSD系统盘),RSSDDataDisk(RSSD数据盘),默认值(DataDisk) + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Size** (int) - (Required) 购买UDisk大小,单位:GB,普通数据盘:范围[1~8000];SSD数据盘:范围[1~8000];普通系统盘:范围[1~8000];SSD系统盘:范围[1~4000];RSSD数据盘:范围[1~32000];RSSD系统盘:范围[1~4000];高效数据盘:范围[1~32000];高效系统盘:范围[1~500]。 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **BackupMode** (str) - 快照服务备份策略。默认采用基础版套餐开通,“Base”:基础版,“ Ultimate”:旗舰版,“ Custom”:自定义备份链 + - **ChargeType** (str) - Year , Month, Dynamic,Postpay,Trial 默认: Month + - **Day** (int) - BackupMode为Custom时,进行设置, 以5天级为基础进行倍数扩增,如5、10、15、20、25、30 + - **DiskType** (str) - UDisk 类型: DataDisk(普通数据盘),SSDDataDisk(SSD数据盘),RSSDDataDisk(RSSD数据盘),EfficiencyDataDisk(高效数据盘),SystemDisk(普通系统盘),SSDSystemDisk(SSD系统盘),RSSDSystemDisk(RSSD系统盘),EfficiencySystemDisk(高效系统盘),默认值(DataDisk) + - **Hour** (int) - BackupMode为Custom时,进行设置, 以24小时级为基础进行倍数扩增,如24、48、72、96 + - **IsTotalPrice** (str) - 是否将快照服务(数据方舟),云硬盘放入一张订单, 是:"Yes",否:"No",默认是"No" + - **Journal** (int) - BackupMode为Custom时,进行设置, 以12小时秒级为基础进行倍数扩增,如12、24、36、48 + - **MachineType** (str) - 云主机机型(V2.0),枚举值["N", "C", "G", "O", "OM"]。参考 `云主机机型说明 `_ 。 - **Quantity** (int) - 购买UDisk的时长,默认值为1 - - **UDataArkMode** (str) - 是否打开数据方舟, 打开"Yes",关闭"No", 默认关闭 - + - **SnapshotService** (str) - 是否开启快照服务(开启快照服务,可免费开启数据方舟)。Yes:开启,No:不开启,默认值:No + - **UDataArkMode** (str) - 【开启数据方舟入口已关闭】是否开启数据方舟。Yes:开启,No:不开启,默认值:No + **Response** - **DataSet** (list) - 见 **UDiskPriceDataSet** 模型定义 - + **Response Model** - - **UDiskPriceDataSet** - - - **ChargeName** (str) - "UDataArk","UDisk" + + **UDiskPriceDataSet** + - **ChargeName** (str) - "UDataArk","SnapshotService","UDisk","Total" - **ChargeType** (str) - Year, Month, Dynamic,Trial - - **OriginalPrice** (int) - 用户折后价 - - **Price** (int) - 价格 (单位: 分) + - **ListPrice** (int) - 原价(对应计费OriginalPrice) + - **OriginalPrice** (int) - 用户折后价(对应计费CustomPrice) + - **Price** (int) - 实际价格 (单位: 分) + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUDiskPriceRequestSchema().dumps(d) @@ -325,35 +533,34 @@ def describe_udisk_price( def describe_udisk_snapshot( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUDiskSnapshot - 获取UDisk快照 + """DescribeUDiskSnapshot - 获取UDisk快照 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Limit** (int) - 返回数据长度, 默认为20 - **Offset** (int) - 数据偏移量, 默认为0 - **SnapshotId** (str) - 快照id,SnapshotId , UDiskId 同时传SnapshotId优先 - **UDiskId** (str) - UDiskId,返回该盘所做快照.(必须同时传Zone) - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **DataSet** (list) - 见 **UDiskSnapshotSet** 模型定义 - **TotalCount** (int) - 根据过滤条件得到的总数 - + **Response Model** - - **UDiskSnapshotSet** - - - **CmkId** (str) - 该快照的cmk id - - **CmkIdAlias** (str) - cmk id 别名 - - **CmkIdStatus** (str) - 该快照cmk的状态, Enabled(正常),Disabled(失效),Deleted(删除),NoCmkId(非加密盘) + + **UDiskSnapshotSet** + - **CmkId** (str) - 【已废弃】该快照的cmk id + - **CmkIdAlias** (str) - 【已废弃】cmk id 别名 + - **CmkIdStatus** (str) - 【已废弃】该快照cmk的状态, Enabled(正常),Disabled(失效),Deleted(删除),NoCmkId(非加密盘) - **Comment** (str) - 快照描述 - **CreateTime** (int) - 创建时间 - - **DataKey** (str) - 该快照的密文密钥 - - **DiskType** (int) - 磁盘类型,0:数据盘,1:系统盘 - - **ExpiredTime** (int) - 过期时间 + - **DataKey** (str) - 【已废弃】该快照的密文密钥 + - **DiskType** (int) - 磁盘类型,0:普通数据盘;1:普通系统盘;2:SSD数据盘;3:SSD系统盘;4:RSSD数据盘;5:RSSD系统盘。 + - **ExpiredTime** (int) - 【已废弃】过期时间 - **IsUDiskAvailable** (bool) - 对应磁盘是否处于可用状态 - **Name** (str) - 快照名称 - **Size** (int) - 容量单位GB @@ -362,12 +569,17 @@ def describe_udisk_snapshot( - **UDiskId** (str) - 快照的源UDisk的Id - **UDiskName** (str) - 快照的源UDisk的Name - **UHostId** (str) - 对应磁盘制作快照时所挂载的主机 - - **UKmsMode** (str) - 是否是加密盘快照,是:"Yes", 否:"No" + - **UKmsMode** (str) - 【已废弃】是否是加密盘快照,是:"Yes", 否:"No" - **Version** (str) - 快照版本 + - **Zone** (str) - 可用区 + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUDiskSnapshotRequestSchema().dumps(d) @@ -377,74 +589,153 @@ def describe_udisk_snapshot( def describe_udisk_upgrade_price( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUDiskUpgradePrice - 获取UDisk升级价格信息 + """DescribeUDiskUpgradePrice - 获取UDisk升级价格信息 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **Size** (int) - (Required) 购买UDisk大小,单位:GB,范围[1~2000], 权限位控制可达8T,若需要请申请开通相关权限。 + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Size** (int) - (Required) 购买UDisk大小,单位:GB,普通数据盘:范围[1~8000];SSD数据盘:范围[1~8000];普通系统盘:范围[1~8000];SSD系统盘:范围[1~4000];RSSD数据盘:范围[1~32000];RSSD系统盘:范围[1~4000];高效数据盘:范围[1~32000];高效系统盘:范围[1~500]。 - **SourceId** (str) - (Required) 升级目标UDisk ID - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - - **DiskType** (str) - 磁盘类型,SSDDataDisk:ssd数据盘,DataDisk:普通数据盘,SystemDisk:普通系统盘,SSDSystemDisk:ssd系统盘。默认为DataDisk - - **UDataArkMode** (str) - 是否打开数据方舟, 打开"Yes",关闭"No", 默认关闭 - + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **BackupMode** (str) - 快照服务备份策略。默认采用基础版套餐开通,“Base”:基础版,“ Ultimate”:旗舰版,“ Custom”:自定义备份链 + - **Day** (int) - BackupMode为Custom时,进行设置, 以5天级为基础进行倍数扩增,如5、10、15、20、25、30 + - **DiskType** (str) - 【已废弃】UDisk 类型: DataDisk(普通数据盘),SSDDataDisk(SSD数据盘),RSSDDataDisk(RSSD数据盘),EfficiencyDataDisk(高效数据盘),SystemDisk(普通系统盘),SSDSystemDisk(SSD系统盘),RSSDSystemDisk(RSSD系统盘),EfficiencySystemDisk(高效系统盘),默认值(DataDisk) + - **Hour** (int) - BackupMode为Custom时,进行设置, 以24小时级为基础进行倍数扩增,如24、48、72、96 + - **Journal** (int) - BackupMode为Custom时,进行设置, 以12小时秒级为基础进行倍数扩增,如12、24、36、48 + - **MachineType** (str) - 【已废弃】云主机机型(V2.0),枚举值["N", "C", "G", "O", "OM"]。参考 `云主机机型说明 `_ 。 + - **SnapshotService** (str) - 是否开启快照服务(开启快照服务,可免费开启数据方舟)。Yes:开启,No:不开启,默认值:No。仅支持查询开启快照服务的价格。 + - **UDataArkMode** (str) - 【开启数据方舟入口已关闭】是否开启数据方舟。Yes:开启,No:不开启,默认值:No + **Response** - - **OriginalPrice** (int) - 用户折后价 + - **OriginalPrice** (int) - 用户折后价 (对应计费CustomPrice) - **Price** (int) - 价格 - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUDiskUpgradePriceRequestSchema().dumps(d) resp = self.invoke("DescribeUDiskUpgradePrice", d, **kwargs) return apis.DescribeUDiskUpgradePriceResponseSchema().loads(resp) + def detach_delete_udisk( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DetachDeleteUDisk - 卸载删除某个已经挂载在指定UHost实例上的UDisk + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UDiskId** (str) - (Required) 需要卸载的UDisk实例ID + - **DeleteSnapshotService** (str) - 是否删除快照服务。Yes:删除,No:不删除,默认值:Yes。 + - **HostId** (str) - Host实例ID + - **UHostId** (str) - UHost实例ID。【UHostId和HostId必须选填一个,本字段即将废弃,建议使用HostId】 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **HostId** (str) - 卸载的Host实例ID + - **UDiskId** (str) - 卸载删除的UDisk实例ID + - **UHostId** (str) - 卸载的UHost实例ID。【即将废弃,建议使用HostId】 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DetachDeleteUDiskRequestSchema().dumps(d) + + resp = self.invoke("DetachDeleteUDisk", d, **kwargs) + return apis.DetachDeleteUDiskResponseSchema().loads(resp) + def detach_udisk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ DetachUDisk - 卸载某个已经挂载在指定UHost实例上的UDisk + """DetachUDisk - 卸载某个已经挂载在指定UHost实例上的UDisk **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **UDiskId** (str) - (Required) 需要卸载的UDisk实例ID - - **UHostId** (str) - (Required) UHost实例ID - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - + - **HostId** (str) - Host实例ID + - **UHostId** (str) - UHost实例ID。【UHostId和HostId必须选填一个,本字段即将废弃,建议使用HostId】 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** + - **HostId** (str) - 卸载的Host实例ID - **UDiskId** (str) - 卸载的UDisk实例ID - - **UHostId** (str) - 卸载的UHost实例ID - + - **UHostId** (str) - 卸载的UHost实例ID。【即将废弃,建议使用HostId】 + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DetachUDiskRequestSchema().dumps(d) resp = self.invoke("DetachUDisk", d, **kwargs) return apis.DetachUDiskResponseSchema().loads(resp) + def recover_udisk( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RecoverUDisk - 从回收站中恢复云硬盘 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UDiskId** (str) - (Required) 云硬盘资源ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ChargeType** (str) - Year , Month, Dynamic 默认: Dynamic + - **Quantity** (int) - 购买时长 默认: 1 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.RecoverUDiskRequestSchema().dumps(d) + + resp = self.invoke("RecoverUDisk", d, **kwargs) + return apis.RecoverUDiskResponseSchema().loads(resp) + def rename_udisk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ RenameUDisk - 重命名UDisk + """RenameUDisk - 重命名UDisk **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **UDiskId** (str) - (Required) 重命名的UDisk的Id - **UDiskName** (str) - (Required) 重命名UDisk的name - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.RenameUDiskRequestSchema().dumps(d) @@ -452,23 +743,27 @@ def rename_udisk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: return apis.RenameUDiskResponseSchema().loads(resp) def resize_udisk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ ResizeUDisk - 调整UDisk容量 + """ResizeUDisk - 调整UDisk容量 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **Size** (int) - (Required) 调整后大小, 单位:GB, 范围[1~2000],权限位控制可达8000,若需要请申请开通相关权限。 + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Size** (int) - (Required) 调整后大小, 单位:GB,普通数据盘:范围[1~8000];SSD数据盘:范围[1~8000];RSSD数据盘:范围[1~32000]。 - **UDiskId** (str) - (Required) UDisk Id - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - **CouponId** (str) - 使用的代金券id - + - **MachineType** (str) - 云主机机型(V2.0),枚举值["N", "C", "G", "O", "OM"]。参考 `云主机机型说明 `_ 。 + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.ResizeUDiskRequestSchema().dumps(d) @@ -478,48 +773,58 @@ def resize_udisk(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def restore_udisk( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ RestoreUDisk - 从备份恢复数据至UDisk + """RestoreUDisk - 从备份恢复数据至UDisk **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **UDiskId** (str) - (Required) 需要恢复的盘id - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UDiskId** (str) - (Required) 需要恢复的盘ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - **SnapshotId** (str) - 从指定的快照恢复 - **SnapshotTime** (int) - 指定从方舟恢复的备份时间点 - + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.RestoreUDiskRequestSchema().dumps(d) + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + resp = self.invoke("RestoreUDisk", d, **kwargs) return apis.RestoreUDiskResponseSchema().loads(resp) - def set_udisk__udataark_mode( + def set_udisk_udataark_mode( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ SetUDiskUDataArkMode - 设置UDisk数据方舟的状态 + """SetUDiskUDataArkMode - 设置UDisk数据方舟的状态 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **UDataArkMode** (str) - (Required) 是否开启数据方舟,开启:"Yes", 不支持:"No" + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **UDiskId** (str) - (Required) 需要设置数据方舟的UDisk的Id - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **CouponId** (str) - 使用的代金券id + - **UDataArkMode** (str) - 【开启数据方舟入口已关闭】是否开启数据方舟。Yes:开启,No:不开启,默认值:No + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.SetUDiskUDataArkModeRequestSchema().dumps(d) diff --git a/ucloud/services/udisk/schemas/apis.py b/ucloud/services/udisk/schemas/apis.py index c4b15b23..22f1ddea 100644 --- a/ucloud/services/udisk/schemas/apis.py +++ b/ucloud/services/udisk/schemas/apis.py @@ -3,7 +3,6 @@ from ucloud.core.typesystem import schema, fields from ucloud.services.udisk.schemas import models - """ UDisk API Schema """ @@ -16,24 +15,28 @@ class AttachUDiskRequestSchema(schema.RequestSchema): - """ AttachUDisk - 将一个可用的UDisk挂载到某台主机上,当UDisk挂载成功后,还需要在主机内部进行文件系统操作 - """ + """AttachUDisk - 将一个可用的UDisk挂载到某台主机上,当UDisk挂载成功后,还需要在主机内部进行文件系统操作""" fields = { + "EnableCrossPodAttach": fields.Str( + required=False, dump_to="EnableCrossPodAttach" + ), + "HostId": fields.Str(required=False, dump_to="HostId"), "MultiAttach": fields.Str(required=False, dump_to="MultiAttach"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "UDiskId": fields.Str(required=True, dump_to="UDiskId"), - "UHostId": fields.Str(required=True, dump_to="UHostId"), - "Zone": fields.Str(required=True, dump_to="Zone"), + "UHostId": fields.Str(required=False, dump_to="UHostId"), + "Zone": fields.Str(required=False, dump_to="Zone"), } class AttachUDiskResponseSchema(schema.ResponseSchema): - """ AttachUDisk - 将一个可用的UDisk挂载到某台主机上,当UDisk挂载成功后,还需要在主机内部进行文件系统操作 - """ + """AttachUDisk - 将一个可用的UDisk挂载到某台主机上,当UDisk挂载成功后,还需要在主机内部进行文件系统操作""" fields = { + "DeviceName": fields.Str(required=False, load_from="DeviceName"), + "HostId": fields.Str(required=False, load_from="HostId"), "UDiskId": fields.Str(required=False, load_from="UDiskId"), "UHostId": fields.Str(required=False, load_from="UHostId"), } @@ -47,31 +50,40 @@ class AttachUDiskResponseSchema(schema.ResponseSchema): class CloneUDiskRequestSchema(schema.RequestSchema): - """ CloneUDisk - 从UDisk创建UDisk克隆 - """ + """CloneUDisk - 从UDisk创建UDisk克隆""" fields = { + "BackupMode": fields.Str(required=False, dump_to="BackupMode"), "ChargeType": fields.Str(required=False, dump_to="ChargeType"), "Comment": fields.Str(required=False, dump_to="Comment"), "CouponId": fields.Str(required=False, dump_to="CouponId"), + "Day": fields.Int(required=False, dump_to="Day"), + "HostId": fields.Str(required=False, dump_to="HostId"), + "Hour": fields.Int(required=False, dump_to="Hour"), + "Journal": fields.Int(required=False, dump_to="Journal"), "Name": fields.Str(required=True, dump_to="Name"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Quantity": fields.Int(required=False, dump_to="Quantity"), + "RdmaClusterId": fields.Str(required=False, dump_to="RdmaClusterId"), "Region": fields.Str(required=True, dump_to="Region"), + "Size": fields.Int(required=False, dump_to="Size"), + "SnapshotService": fields.Str( + required=False, dump_to="SnapshotService" + ), "SourceId": fields.Str(required=True, dump_to="SourceId"), + "Tag": fields.Str(required=False, dump_to="Tag"), "UDataArkMode": fields.Str(required=False, dump_to="UDataArkMode"), "Zone": fields.Str(required=True, dump_to="Zone"), } class CloneUDiskResponseSchema(schema.ResponseSchema): - """ CloneUDisk - 从UDisk创建UDisk克隆 - """ + """CloneUDisk - 从UDisk创建UDisk克隆""" fields = { "UDiskId": fields.List( fields.Str(), required=False, load_from="UDiskId" - ) + ), } @@ -83,32 +95,134 @@ class CloneUDiskResponseSchema(schema.ResponseSchema): class CloneUDiskSnapshotRequestSchema(schema.RequestSchema): - """ CloneUDiskSnapshot - 从快照创建UDisk克隆 - """ + """CloneUDiskSnapshot - 从快照创建UDisk克隆""" fields = { + "BackupMode": fields.Str(required=False, dump_to="BackupMode"), "ChargeType": fields.Str(required=False, dump_to="ChargeType"), "Comment": fields.Str(required=False, dump_to="Comment"), "CouponId": fields.Str(required=False, dump_to="CouponId"), + "Day": fields.Int(required=False, dump_to="Day"), + "HostId": fields.Str(required=False, dump_to="HostId"), + "Hour": fields.Int(required=False, dump_to="Hour"), + "Journal": fields.Int(required=False, dump_to="Journal"), "Name": fields.Str(required=True, dump_to="Name"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Quantity": fields.Int(required=False, dump_to="Quantity"), + "RdmaClusterId": fields.Str(required=False, dump_to="RdmaClusterId"), "Region": fields.Str(required=True, dump_to="Region"), - "Size": fields.Int(required=True, dump_to="Size"), + "Size": fields.Int(required=False, dump_to="Size"), + "SnapshotService": fields.Str( + required=False, dump_to="SnapshotService" + ), "SourceId": fields.Str(required=True, dump_to="SourceId"), + "Tag": fields.Str(required=False, dump_to="Tag"), "UDataArkMode": fields.Str(required=False, dump_to="UDataArkMode"), "Zone": fields.Str(required=True, dump_to="Zone"), } class CloneUDiskSnapshotResponseSchema(schema.ResponseSchema): - """ CloneUDiskSnapshot - 从快照创建UDisk克隆 - """ + """CloneUDiskSnapshot - 从快照创建UDisk克隆""" fields = { "UDiskId": fields.List( fields.Str(), required=False, load_from="UDiskId" - ) + ), + } + + +""" +API: CloneUDiskUDataArk + +从数据方舟的备份创建UDisk +""" + + +class CloneUDiskUDataArkRequestSchema(schema.RequestSchema): + """CloneUDiskUDataArk - 从数据方舟的备份创建UDisk""" + + fields = { + "BackupMode": fields.Str(required=False, dump_to="BackupMode"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "Comment": fields.Str(required=False, dump_to="Comment"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "Day": fields.Int(required=False, dump_to="Day"), + "HostId": fields.Str(required=False, dump_to="HostId"), + "Hour": fields.Int(required=False, dump_to="Hour"), + "Journal": fields.Int(required=False, dump_to="Journal"), + "Name": fields.Str(required=True, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "RdmaClusterId": fields.Str(required=False, dump_to="RdmaClusterId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Size": fields.Int(required=False, dump_to="Size"), + "SnapshotService": fields.Str( + required=False, dump_to="SnapshotService" + ), + "SnapshotTime": fields.Int(required=True, dump_to="SnapshotTime"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "UDataArkMode": fields.Str(required=False, dump_to="UDataArkMode"), + "UDiskId": fields.Str(required=True, dump_to="UDiskId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CloneUDiskUDataArkResponseSchema(schema.ResponseSchema): + """CloneUDiskUDataArk - 从数据方舟的备份创建UDisk""" + + fields = { + "UDiskId": fields.List( + fields.Str(), required=True, load_from="UDiskId" + ), + } + + +""" +API: CreateAttachUDisk + +创建并挂载UDisk磁盘 +""" + + +class CreateAttachUDiskRequestSchema(schema.RequestSchema): + """CreateAttachUDisk - 创建并挂载UDisk磁盘""" + + fields = { + "BackupMode": fields.Str(required=False, dump_to="BackupMode"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CmkId": fields.Str(required=False, dump_to="CmkId"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "Day": fields.Int(required=False, dump_to="Day"), + "DiskType": fields.Str(required=False, dump_to="DiskType"), + "HostId": fields.Str(required=False, dump_to="HostId"), + "Hour": fields.Int(required=False, dump_to="Hour"), + "Journal": fields.Int(required=False, dump_to="Journal"), + "MultiAttach": fields.Str(required=False, dump_to="MultiAttach"), + "Name": fields.Str(required=True, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "Size": fields.Int(required=True, dump_to="Size"), + "SnapshotService": fields.Str( + required=False, dump_to="SnapshotService" + ), + "Tag": fields.Str(required=False, dump_to="Tag"), + "UDataArkMode": fields.Str(required=False, dump_to="UDataArkMode"), + "UHostId": fields.Str(required=False, dump_to="UHostId"), + "UKmsMode": fields.Str(required=False, dump_to="UKmsMode"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateAttachUDiskResponseSchema(schema.ResponseSchema): + """CreateAttachUDisk - 创建并挂载UDisk磁盘""" + + fields = { + "DeviceName": fields.Str(required=False, load_from="DeviceName"), + "HostId": fields.Str(required=False, load_from="HostId"), + "UDiskId": fields.Str(required=False, load_from="UDiskId"), + "UHostId": fields.Str(required=False, load_from="UHostId"), } @@ -120,19 +234,26 @@ class CloneUDiskSnapshotResponseSchema(schema.ResponseSchema): class CreateUDiskRequestSchema(schema.RequestSchema): - """ CreateUDisk - 创建UDisk磁盘 - """ + """CreateUDisk - 创建UDisk磁盘""" fields = { + "BackupMode": fields.Str(required=False, dump_to="BackupMode"), "ChargeType": fields.Str(required=False, dump_to="ChargeType"), "CmkId": fields.Str(required=False, dump_to="CmkId"), "CouponId": fields.Str(required=False, dump_to="CouponId"), + "Day": fields.Int(required=False, dump_to="Day"), "DiskType": fields.Str(required=False, dump_to="DiskType"), + "Hour": fields.Int(required=False, dump_to="Hour"), + "Journal": fields.Int(required=False, dump_to="Journal"), "Name": fields.Str(required=True, dump_to="Name"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Quantity": fields.Int(required=False, dump_to="Quantity"), + "RdmaClusterId": fields.Str(required=False, dump_to="RdmaClusterId"), "Region": fields.Str(required=True, dump_to="Region"), "Size": fields.Int(required=True, dump_to="Size"), + "SnapshotService": fields.Str( + required=False, dump_to="SnapshotService" + ), "Tag": fields.Str(required=False, dump_to="Tag"), "UDataArkMode": fields.Str(required=False, dump_to="UDataArkMode"), "UKmsMode": fields.Str(required=False, dump_to="UKmsMode"), @@ -141,13 +262,12 @@ class CreateUDiskRequestSchema(schema.RequestSchema): class CreateUDiskResponseSchema(schema.ResponseSchema): - """ CreateUDisk - 创建UDisk磁盘 - """ + """CreateUDisk - 创建UDisk磁盘""" fields = { "UDiskId": fields.List( fields.Str(), required=False, load_from="UDiskId" - ) + ), } @@ -159,8 +279,7 @@ class CreateUDiskResponseSchema(schema.ResponseSchema): class CreateUDiskSnapshotRequestSchema(schema.RequestSchema): - """ CreateUDiskSnapshot - 创建snapshot快照 - """ + """CreateUDiskSnapshot - 创建snapshot快照""" fields = { "ChargeType": fields.Str(required=False, dump_to="ChargeType"), @@ -175,13 +294,12 @@ class CreateUDiskSnapshotRequestSchema(schema.RequestSchema): class CreateUDiskSnapshotResponseSchema(schema.ResponseSchema): - """ CreateUDiskSnapshot - 创建snapshot快照 - """ + """CreateUDiskSnapshot - 创建snapshot快照""" fields = { "SnapshotId": fields.List( fields.Str(), required=True, load_from="SnapshotId" - ) + ), } @@ -193,8 +311,7 @@ class CreateUDiskSnapshotResponseSchema(schema.ResponseSchema): class DeleteUDiskRequestSchema(schema.RequestSchema): - """ DeleteUDisk - 删除UDisk - """ + """DeleteUDisk - 删除UDisk""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -205,8 +322,7 @@ class DeleteUDiskRequestSchema(schema.RequestSchema): class DeleteUDiskResponseSchema(schema.ResponseSchema): - """ DeleteUDisk - 删除UDisk - """ + """DeleteUDisk - 删除UDisk""" fields = {} @@ -219,8 +335,7 @@ class DeleteUDiskResponseSchema(schema.ResponseSchema): class DeleteUDiskSnapshotRequestSchema(schema.RequestSchema): - """ DeleteUDiskSnapshot - 删除Snapshot - """ + """DeleteUDiskSnapshot - 删除Snapshot""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -232,12 +347,41 @@ class DeleteUDiskSnapshotRequestSchema(schema.RequestSchema): class DeleteUDiskSnapshotResponseSchema(schema.ResponseSchema): - """ DeleteUDiskSnapshot - 删除Snapshot - """ + """DeleteUDiskSnapshot - 删除Snapshot""" fields = {} +""" +API: DescribeRecycleUDisk + +拉取回收站中云硬盘列表 +""" + + +class DescribeRecycleUDiskRequestSchema(schema.RequestSchema): + """DescribeRecycleUDisk - 拉取回收站中云硬盘列表""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeRecycleUDiskResponseSchema(schema.ResponseSchema): + """DescribeRecycleUDisk - 拉取回收站中云硬盘列表""" + + fields = { + "DataSet": fields.List( + models.RecycleUDiskSetSchema(), required=False, load_from="DataSet" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + """ API: DescribeUDisk @@ -246,11 +390,21 @@ class DeleteUDiskSnapshotResponseSchema(schema.ResponseSchema): class DescribeUDiskRequestSchema(schema.RequestSchema): - """ DescribeUDisk - 获取UDisk实例 - """ + """DescribeUDisk - 获取UDisk实例""" fields = { "DiskType": fields.Str(required=False, dump_to="DiskType"), + "HostId": fields.Str(required=False, dump_to="HostId"), + "HostIdForAttachment": fields.Str( + required=False, dump_to="HostIdForAttachment" + ), + "HostProduct": fields.Str(required=False, dump_to="HostProduct"), + "IgnoreBackupMode": fields.Str( + required=False, dump_to="IgnoreBackupMode" + ), + "IgnoreUBillInfo": fields.Str( + required=False, dump_to="IgnoreUBillInfo" + ), "IsBoot": fields.Str(required=False, dump_to="IsBoot"), "Limit": fields.Int(required=False, dump_to="Limit"), "Offset": fields.Int(required=False, dump_to="Offset"), @@ -259,14 +413,19 @@ class DescribeUDiskRequestSchema(schema.RequestSchema): required=False, dump_to="ProtocolVersion" ), "Region": fields.Str(required=True, dump_to="Region"), + "Status": fields.Str(required=False, dump_to="Status"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "UDiskBasicInfo": fields.Str(required=False, dump_to="UDiskBasicInfo"), "UDiskId": fields.Str(required=False, dump_to="UDiskId"), + "UHostIdForAttachment": fields.Str( + required=False, dump_to="UHostIdForAttachment" + ), "Zone": fields.Str(required=False, dump_to="Zone"), } class DescribeUDiskResponseSchema(schema.ResponseSchema): - """ DescribeUDisk - 获取UDisk实例 - """ + """DescribeUDisk - 获取UDisk实例""" fields = { "DataSet": fields.List( @@ -284,31 +443,38 @@ class DescribeUDiskResponseSchema(schema.ResponseSchema): class DescribeUDiskPriceRequestSchema(schema.RequestSchema): - """ DescribeUDiskPrice - 获取UDisk实例价格信息 - """ + """DescribeUDiskPrice - 获取UDisk实例价格信息""" fields = { + "BackupMode": fields.Str(required=False, dump_to="BackupMode"), "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "Day": fields.Int(required=False, dump_to="Day"), "DiskType": fields.Str(required=False, dump_to="DiskType"), + "Hour": fields.Int(required=False, dump_to="Hour"), + "IsTotalPrice": fields.Str(required=False, dump_to="IsTotalPrice"), + "Journal": fields.Int(required=False, dump_to="Journal"), + "MachineType": fields.Str(required=False, dump_to="MachineType"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Quantity": fields.Int(required=False, dump_to="Quantity"), "Region": fields.Str(required=True, dump_to="Region"), "Size": fields.Int(required=True, dump_to="Size"), + "SnapshotService": fields.Str( + required=False, dump_to="SnapshotService" + ), "UDataArkMode": fields.Str(required=False, dump_to="UDataArkMode"), "Zone": fields.Str(required=True, dump_to="Zone"), } class DescribeUDiskPriceResponseSchema(schema.ResponseSchema): - """ DescribeUDiskPrice - 获取UDisk实例价格信息 - """ + """DescribeUDiskPrice - 获取UDisk实例价格信息""" fields = { "DataSet": fields.List( models.UDiskPriceDataSetSchema(), required=False, load_from="DataSet", - ) + ), } @@ -320,8 +486,7 @@ class DescribeUDiskPriceResponseSchema(schema.ResponseSchema): class DescribeUDiskSnapshotRequestSchema(schema.RequestSchema): - """ DescribeUDiskSnapshot - 获取UDisk快照 - """ + """DescribeUDiskSnapshot - 获取UDisk快照""" fields = { "Limit": fields.Int(required=False, dump_to="Limit"), @@ -335,8 +500,7 @@ class DescribeUDiskSnapshotRequestSchema(schema.RequestSchema): class DescribeUDiskSnapshotResponseSchema(schema.ResponseSchema): - """ DescribeUDiskSnapshot - 获取UDisk快照 - """ + """DescribeUDiskSnapshot - 获取UDisk快照""" fields = { "DataSet": fields.List( @@ -354,14 +518,21 @@ class DescribeUDiskSnapshotResponseSchema(schema.ResponseSchema): class DescribeUDiskUpgradePriceRequestSchema(schema.RequestSchema): - """ DescribeUDiskUpgradePrice - 获取UDisk升级价格信息 - """ + """DescribeUDiskUpgradePrice - 获取UDisk升级价格信息""" fields = { + "BackupMode": fields.Str(required=False, dump_to="BackupMode"), + "Day": fields.Int(required=False, dump_to="Day"), "DiskType": fields.Str(required=False, dump_to="DiskType"), - "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Hour": fields.Int(required=False, dump_to="Hour"), + "Journal": fields.Int(required=False, dump_to="Journal"), + "MachineType": fields.Str(required=False, dump_to="MachineType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "Size": fields.Int(required=True, dump_to="Size"), + "SnapshotService": fields.Str( + required=False, dump_to="SnapshotService" + ), "SourceId": fields.Str(required=True, dump_to="SourceId"), "UDataArkMode": fields.Str(required=False, dump_to="UDataArkMode"), "Zone": fields.Str(required=True, dump_to="Zone"), @@ -369,8 +540,7 @@ class DescribeUDiskUpgradePriceRequestSchema(schema.RequestSchema): class DescribeUDiskUpgradePriceResponseSchema(schema.ResponseSchema): - """ DescribeUDiskUpgradePrice - 获取UDisk升级价格信息 - """ + """DescribeUDiskUpgradePrice - 获取UDisk升级价格信息""" fields = { "OriginalPrice": fields.Int(required=False, load_from="OriginalPrice"), @@ -378,6 +548,39 @@ class DescribeUDiskUpgradePriceResponseSchema(schema.ResponseSchema): } +""" +API: DetachDeleteUDisk + +卸载删除某个已经挂载在指定UHost实例上的UDisk +""" + + +class DetachDeleteUDiskRequestSchema(schema.RequestSchema): + """DetachDeleteUDisk - 卸载删除某个已经挂载在指定UHost实例上的UDisk""" + + fields = { + "DeleteSnapshotService": fields.Str( + required=False, dump_to="DeleteSnapshotService" + ), + "HostId": fields.Str(required=False, dump_to="HostId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UDiskId": fields.Str(required=True, dump_to="UDiskId"), + "UHostId": fields.Str(required=False, dump_to="UHostId"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DetachDeleteUDiskResponseSchema(schema.ResponseSchema): + """DetachDeleteUDisk - 卸载删除某个已经挂载在指定UHost实例上的UDisk""" + + fields = { + "HostId": fields.Str(required=False, load_from="HostId"), + "UDiskId": fields.Str(required=False, load_from="UDiskId"), + "UHostId": fields.Str(required=False, load_from="UHostId"), + } + + """ API: DetachUDisk @@ -386,28 +589,54 @@ class DescribeUDiskUpgradePriceResponseSchema(schema.ResponseSchema): class DetachUDiskRequestSchema(schema.RequestSchema): - """ DetachUDisk - 卸载某个已经挂载在指定UHost实例上的UDisk - """ + """DetachUDisk - 卸载某个已经挂载在指定UHost实例上的UDisk""" fields = { + "HostId": fields.Str(required=False, dump_to="HostId"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "UDiskId": fields.Str(required=True, dump_to="UDiskId"), - "UHostId": fields.Str(required=True, dump_to="UHostId"), - "Zone": fields.Str(required=True, dump_to="Zone"), + "UHostId": fields.Str(required=False, dump_to="UHostId"), + "Zone": fields.Str(required=False, dump_to="Zone"), } class DetachUDiskResponseSchema(schema.ResponseSchema): - """ DetachUDisk - 卸载某个已经挂载在指定UHost实例上的UDisk - """ + """DetachUDisk - 卸载某个已经挂载在指定UHost实例上的UDisk""" fields = { + "HostId": fields.Str(required=False, load_from="HostId"), "UDiskId": fields.Str(required=False, load_from="UDiskId"), "UHostId": fields.Str(required=False, load_from="UHostId"), } +""" +API: RecoverUDisk + +从回收站中恢复云硬盘 +""" + + +class RecoverUDiskRequestSchema(schema.RequestSchema): + """RecoverUDisk - 从回收站中恢复云硬盘""" + + fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "UDiskId": fields.Str(required=True, dump_to="UDiskId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class RecoverUDiskResponseSchema(schema.ResponseSchema): + """RecoverUDisk - 从回收站中恢复云硬盘""" + + fields = {} + + """ API: RenameUDisk @@ -416,8 +645,7 @@ class DetachUDiskResponseSchema(schema.ResponseSchema): class RenameUDiskRequestSchema(schema.RequestSchema): - """ RenameUDisk - 重命名UDisk - """ + """RenameUDisk - 重命名UDisk""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -429,8 +657,7 @@ class RenameUDiskRequestSchema(schema.RequestSchema): class RenameUDiskResponseSchema(schema.ResponseSchema): - """ RenameUDisk - 重命名UDisk - """ + """RenameUDisk - 重命名UDisk""" fields = {} @@ -443,11 +670,11 @@ class RenameUDiskResponseSchema(schema.ResponseSchema): class ResizeUDiskRequestSchema(schema.RequestSchema): - """ ResizeUDisk - 调整UDisk容量 - """ + """ResizeUDisk - 调整UDisk容量""" fields = { "CouponId": fields.Str(required=False, dump_to="CouponId"), + "MachineType": fields.Str(required=False, dump_to="MachineType"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "Size": fields.Int(required=True, dump_to="Size"), @@ -457,8 +684,7 @@ class ResizeUDiskRequestSchema(schema.RequestSchema): class ResizeUDiskResponseSchema(schema.ResponseSchema): - """ ResizeUDisk - 调整UDisk容量 - """ + """ResizeUDisk - 调整UDisk容量""" fields = {} @@ -471,8 +697,7 @@ class ResizeUDiskResponseSchema(schema.ResponseSchema): class RestoreUDiskRequestSchema(schema.RequestSchema): - """ RestoreUDisk - 从备份恢复数据至UDisk - """ + """RestoreUDisk - 从备份恢复数据至UDisk""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -485,8 +710,7 @@ class RestoreUDiskRequestSchema(schema.RequestSchema): class RestoreUDiskResponseSchema(schema.ResponseSchema): - """ RestoreUDisk - 从备份恢复数据至UDisk - """ + """RestoreUDisk - 从备份恢复数据至UDisk""" fields = {} @@ -499,20 +723,19 @@ class RestoreUDiskResponseSchema(schema.ResponseSchema): class SetUDiskUDataArkModeRequestSchema(schema.RequestSchema): - """ SetUDiskUDataArkMode - 设置UDisk数据方舟的状态 - """ + """SetUDiskUDataArkMode - 设置UDisk数据方舟的状态""" fields = { - "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "UDataArkMode": fields.Str(required=True, dump_to="UDataArkMode"), + "UDataArkMode": fields.Str(required=False, dump_to="UDataArkMode"), "UDiskId": fields.Str(required=True, dump_to="UDiskId"), "Zone": fields.Str(required=True, dump_to="Zone"), } class SetUDiskUDataArkModeResponseSchema(schema.ResponseSchema): - """ SetUDiskUDataArkMode - 设置UDisk数据方舟的状态 - """ + """SetUDiskUDataArkMode - 设置UDisk数据方舟的状态""" fields = {} diff --git a/ucloud/services/udisk/schemas/models.py b/ucloud/services/udisk/schemas/models.py index dac312b0..71f5e8ac 100644 --- a/ucloud/services/udisk/schemas/models.py +++ b/ucloud/services/udisk/schemas/models.py @@ -1,81 +1,100 @@ -""" Code is generated by ucloud-model, DO NOT EDIT IT. """ - -from ucloud.core.typesystem import schema, fields - - -class UDiskDataSetSchema(schema.ResponseSchema): - """ UDiskDataSet - DescribeUDisk - """ - - fields = { - "ArkSwitchEnable": fields.Int( - required=False, load_from="ArkSwitchEnable" - ), - "ChargeType": fields.Str(required=False, load_from="ChargeType"), - "CloneEnable": fields.Int(required=False, load_from="CloneEnable"), - "CmkId": fields.Str(required=False, load_from="CmkId"), - "CmkIdAlias": fields.Str(required=False, load_from="CmkIdAlias"), - "CmkIdStatus": fields.Str(required=False, load_from="CmkIdStatus"), - "CreateTime": fields.Int(required=False, load_from="CreateTime"), - "DataKey": fields.Str(required=False, load_from="DataKey"), - "DeviceName": fields.Str(required=False, load_from="DeviceName"), - "DiskType": fields.Str(required=False, load_from="DiskType"), - "ExpiredTime": fields.Int(required=False, load_from="ExpiredTime"), - "IsBoot": fields.Str(required=False, load_from="IsBoot"), - "IsExpire": fields.Str(required=False, load_from="IsExpire"), - "Name": fields.Str(required=False, load_from="Name"), - "Size": fields.Int(required=False, load_from="Size"), - "SnapEnable": fields.Int(required=False, load_from="SnapEnable"), - "SnapshotCount": fields.Int(required=False, load_from="SnapshotCount"), - "SnapshotLimit": fields.Int(required=False, load_from="SnapshotLimit"), - "Status": fields.Str(required=False, load_from="Status"), - "Tag": fields.Str(required=False, load_from="Tag"), - "UDataArkMode": fields.Str(required=False, load_from="UDataArkMode"), - "UDiskId": fields.Str(required=False, load_from="UDiskId"), - "UHostIP": fields.Str(required=False, load_from="UHostIP"), - "UHostId": fields.Str(required=False, load_from="UHostId"), - "UHostName": fields.Str(required=False, load_from="UHostName"), - "UKmsMode": fields.Str(required=False, load_from="UKmsMode"), - "Version": fields.Str(required=False, load_from="Version"), - "Zone": fields.Str(required=False, load_from="Zone"), - } - - -class UDiskPriceDataSetSchema(schema.ResponseSchema): - """ UDiskPriceDataSet - DescribeUDiskPrice - """ - - fields = { - "ChargeName": fields.Str(required=False, load_from="ChargeName"), - "ChargeType": fields.Str(required=False, load_from="ChargeType"), - "OriginalPrice": fields.Int(required=False, load_from="OriginalPrice"), - "Price": fields.Int(required=False, load_from="Price"), - } - - -class UDiskSnapshotSetSchema(schema.ResponseSchema): - """ UDiskSnapshotSet - DescribeUDiskSnapshot - """ - - fields = { - "CmkId": fields.Str(required=False, load_from="CmkId"), - "CmkIdAlias": fields.Str(required=False, load_from="CmkIdAlias"), - "CmkIdStatus": fields.Str(required=False, load_from="CmkIdStatus"), - "Comment": fields.Str(required=False, load_from="Comment"), - "CreateTime": fields.Int(required=True, load_from="CreateTime"), - "DataKey": fields.Str(required=False, load_from="DataKey"), - "DiskType": fields.Int(required=True, load_from="DiskType"), - "ExpiredTime": fields.Int(required=False, load_from="ExpiredTime"), - "IsUDiskAvailable": fields.Bool( - required=False, load_from="IsUDiskAvailable" - ), - "Name": fields.Str(required=True, load_from="Name"), - "Size": fields.Int(required=True, load_from="Size"), - "SnapshotId": fields.Str(required=True, load_from="SnapshotId"), - "Status": fields.Str(required=True, load_from="Status"), - "UDiskId": fields.Str(required=True, load_from="UDiskId"), - "UDiskName": fields.Str(required=True, load_from="UDiskName"), - "UHostId": fields.Str(required=False, load_from="UHostId"), - "UKmsMode": fields.Str(required=False, load_from="UKmsMode"), - "Version": fields.Str(required=False, load_from="Version"), - } +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class RecycleUDiskSetSchema(schema.ResponseSchema): + """RecycleUDiskSet - 回收站列表""" + + fields = { + "CountdownTime": fields.Int(required=True, load_from="CountdownTime"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "ExpiredTime": fields.Int(required=True, load_from="ExpiredTime"), + "Name": fields.Str(required=True, load_from="Name"), + "Size": fields.Int(required=True, load_from="Size"), + "Tag": fields.Str(required=False, load_from="Tag"), + "UDiskId": fields.Str(required=True, load_from="UDiskId"), + "Zone": fields.Str(required=True, load_from="Zone"), + } + + +class UDiskDataSetSchema(schema.ResponseSchema): + """UDiskDataSet - DescribeUDisk""" + + fields = { + "ArkSwitchEnable": fields.Int( + required=False, load_from="ArkSwitchEnable" + ), + "BackupMode": fields.Str(required=False, load_from="BackupMode"), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "CloneEnable": fields.Int(required=False, load_from="CloneEnable"), + "CmkId": fields.Str(required=False, load_from="CmkId"), + "CmkIdAlias": fields.Str(required=False, load_from="CmkIdAlias"), + "CmkIdStatus": fields.Str(required=False, load_from="CmkIdStatus"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DataKey": fields.Str(required=False, load_from="DataKey"), + "DeviceName": fields.Str(required=False, load_from="DeviceName"), + "DiskType": fields.Str(required=False, load_from="DiskType"), + "ExpiredTime": fields.Int(required=False, load_from="ExpiredTime"), + "HostIP": fields.Str(required=False, load_from="HostIP"), + "HostId": fields.Str(required=False, load_from="HostId"), + "HostName": fields.Str(required=False, load_from="HostName"), + "IsBoot": fields.Str(required=False, load_from="IsBoot"), + "IsExpire": fields.Str(required=False, load_from="IsExpire"), + "Name": fields.Str(required=False, load_from="Name"), + "RdmaClusterId": fields.Str(required=False, load_from="RdmaClusterId"), + "Size": fields.Int(required=False, load_from="Size"), + "SnapEnable": fields.Int(required=False, load_from="SnapEnable"), + "SnapshotCount": fields.Int(required=False, load_from="SnapshotCount"), + "SnapshotLimit": fields.Int(required=False, load_from="SnapshotLimit"), + "Status": fields.Str(required=False, load_from="Status"), + "Tag": fields.Str(required=False, load_from="Tag"), + "UDataArkMode": fields.Str(required=False, load_from="UDataArkMode"), + "UDiskId": fields.Str(required=False, load_from="UDiskId"), + "UHostIP": fields.Str(required=False, load_from="UHostIP"), + "UHostId": fields.Str(required=False, load_from="UHostId"), + "UHostName": fields.Str(required=False, load_from="UHostName"), + "UKmsMode": fields.Str(required=False, load_from="UKmsMode"), + "Version": fields.Str(required=False, load_from="Version"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class UDiskPriceDataSetSchema(schema.ResponseSchema): + """UDiskPriceDataSet - DescribeUDiskPrice""" + + fields = { + "ChargeName": fields.Str(required=False, load_from="ChargeName"), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "ListPrice": fields.Int(required=False, load_from="ListPrice"), + "OriginalPrice": fields.Int(required=False, load_from="OriginalPrice"), + "Price": fields.Int(required=False, load_from="Price"), + } + + +class UDiskSnapshotSetSchema(schema.ResponseSchema): + """UDiskSnapshotSet - DescribeUDiskSnapshot""" + + fields = { + "CmkId": fields.Str(required=False, load_from="CmkId"), + "CmkIdAlias": fields.Str(required=False, load_from="CmkIdAlias"), + "CmkIdStatus": fields.Str(required=False, load_from="CmkIdStatus"), + "Comment": fields.Str(required=False, load_from="Comment"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "DataKey": fields.Str(required=False, load_from="DataKey"), + "DiskType": fields.Int(required=True, load_from="DiskType"), + "ExpiredTime": fields.Int(required=False, load_from="ExpiredTime"), + "IsUDiskAvailable": fields.Bool( + required=False, load_from="IsUDiskAvailable" + ), + "Name": fields.Str(required=True, load_from="Name"), + "Size": fields.Int(required=True, load_from="Size"), + "SnapshotId": fields.Str(required=True, load_from="SnapshotId"), + "Status": fields.Str(required=True, load_from="Status"), + "UDiskId": fields.Str(required=True, load_from="UDiskId"), + "UDiskName": fields.Str(required=True, load_from="UDiskName"), + "UHostId": fields.Str(required=False, load_from="UHostId"), + "UKmsMode": fields.Str(required=False, load_from="UKmsMode"), + "Version": fields.Str(required=False, load_from="Version"), + "Zone": fields.Str(required=True, load_from="Zone"), + } diff --git a/ucloud/services/udns/__init__.py b/ucloud/services/udns/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/udns/client.py b/ucloud/services/udns/client.py new file mode 100644 index 00000000..f5b14842 --- /dev/null +++ b/ucloud/services/udns/client.py @@ -0,0 +1,385 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.udns.schemas import apis + + +class UDNSClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UDNSClient, self).__init__(config, transport, middleware, logger) + + def associate_udns_zone_vpc( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AssociateUDNSZoneVPC - 绑定域名与VPC + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DNSZoneId** (str) - (Required) 域名资源ID + - **VPCId** (str) - (Required) VPC资源ID + - **VPCProjectId** (str) - (Required) VPC所属项目ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.AssociateUDNSZoneVPCRequestSchema().dumps(d) + + resp = self.invoke("AssociateUDNSZoneVPC", d, **kwargs) + return apis.AssociateUDNSZoneVPCResponseSchema().loads(resp) + + def create_udns_record( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUDNSRecord - 创建域名记录 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DNSZoneId** (str) - (Required) 域名资源ID + - **Name** (str) - (Required) 主机记录 + - **Type** (str) - (Required) 记录类型。枚举值,“A”,"CNAME","MX","AAAA","SRV","PTR","TXT"。 + - **Value** (str) - (Required) 数值组,支持逗号分割。格式为:Value|权重|IsEnabled,其中权重支持1-10,IsEnabled为枚举值(1为启用,0为禁用)。输入格式示例:192.168.1.1|1|1,192.168.1.2|10|0。 + - **ValueType** (str) - (Required) 值类型。枚举值,“Normal”,标准;“Multivalue”,多值返回。仅在值为“Multivalue”时,Value的权重生效。 + - **Remark** (str) - 记录的备注信息 + - **TTL** (int) - TTL值,范围为5-600,单位为秒。默认为5 + + **Response** + + - **DNSRecordId** (str) - 域名记录的资源ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateUDNSRecordRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUDNSRecord", d, **kwargs) + return apis.CreateUDNSRecordResponseSchema().loads(resp) + + def create_udns_zone( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUDNSZone - 创建域名 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DNSZoneName** (str) - (Required) 域名字符串 + - **Type** (str) - (Required) 域名类型。枚举值,“private”,内网DNS;“public”,公网DNS,暂只支持private。 + - **ChargeType** (str) - 付费方式, 枚举值为: Year, 按年付费; Month, 按月付费; Dynamic, 按需付费,默认为按月付费 + - **CouponId** (str) - 代金券ID,默认不使用 + - **IsRecursionEnabled** (str) - 是否支持迭代。枚举值,"enable",支持迭代; "disable",不支持迭代 + - **Quantity** (int) - 购买时长,默认为1 + - **Remark** (str) - 备注 + - **Tag** (str) - 所属业务组名称 + + **Response** + + - **DNSZoneId** (str) - 域名资源ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateUDNSZoneRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUDNSZone", d, **kwargs) + return apis.CreateUDNSZoneResponseSchema().loads(resp) + + def delete_udns_record( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUDNSRecord - 删除域名记录 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DNSZoneId** (str) - (Required) 域名资源ID + - **RecordIds** (list) - (Required) 域名记录资源ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteUDNSRecordRequestSchema().dumps(d) + + resp = self.invoke("DeleteUDNSRecord", d, **kwargs) + return apis.DeleteUDNSRecordResponseSchema().loads(resp) + + def describe_udns_domain( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUDNSDomain - zone下所有域名的rr记录 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DNSZoneName** (str) - (Required) zone名称 + - **VPCId** (str) - (Required) VPI资源ID + - **Limit** (int) - 返回数量 + - **Offset** (int) - 查询数量偏移 + + **Response** + + - **RecordInfos** (list) - 见 **RecordInfo** 模型定义 + - **TotalCount** (int) - 总条数 + + **Response Model** + + **ValueSet** + - **Data** (str) - 主机记录 + - **IsEnabled** (int) - 是否启用 + - **Weight** (int) - 权重 + + + **RecordInfo** + - **Name** (str) - 主机记录 + - **RecordId** (str) - 域名记录资源ID + - **Remark** (str) - 记录备注信息 + - **TTL** (int) - TTL值,单位为秒 + - **Type** (str) - 记录类型 + - **ValueSet** (list) - 见 **ValueSet** 模型定义 + - **ValueType** (str) - 记录策略,标准或随机应答 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUDNSDomainRequestSchema().dumps(d) + + resp = self.invoke("DescribeUDNSDomain", d, **kwargs) + return apis.DescribeUDNSDomainResponseSchema().loads(resp) + + def describe_udns_record( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUDNSRecord - 获取域名记录 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DNSZoneId** (str) - (Required) 域名资源ID + - **Limit** (int) - 数据分页值, 默认为20 + - **Offset** (int) - 数据偏移量, 默认为0 + - **Query** (str) - 模糊查询记录 + - **RecordIds** (list) - 域名记录资源ID + - **SortDir** (str) - 排序方式,支持asc desc + - **SortKey** (str) - 排序字段,只支持host update_time + + **Response** + + - **RecordInfos** (list) - 见 **RecordInfo** 模型定义 + - **TotalCount** (int) - 资源数量 + + **Response Model** + + **ValueSet** + - **Data** (str) - 主机记录 + - **IsEnabled** (int) - 是否启用 + - **Weight** (int) - 权重 + + + **RecordInfo** + - **Name** (str) - 主机记录 + - **RecordId** (str) - 域名记录资源ID + - **Remark** (str) - 记录备注信息 + - **TTL** (int) - TTL值,单位为秒 + - **Type** (str) - 记录类型 + - **ValueSet** (list) - 见 **ValueSet** 模型定义 + - **ValueType** (str) - 记录策略,标准或随机应答 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUDNSRecordRequestSchema().dumps(d) + + resp = self.invoke("DescribeUDNSRecord", d, **kwargs) + return apis.DescribeUDNSRecordResponseSchema().loads(resp) + + def describe_udns_zone( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUDNSZone - 获取域名信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DNSZoneIds** (list) - 域名资源ID + - **Limit** (int) - 数据分页值, 默认为20 + - **Offset** (int) - 数据偏移量, 默认为0 + + **Response** + + - **DNSZoneInfos** (list) - 见 **ZoneInfo** 模型定义 + - **TotalCount** (int) - 符合查询条件的域名数量 + + **Response Model** + + **VPCInfo** + - **Name** (str) - VPC名称 + - **Network** (list) - VPC地址空间 + - **VPCId** (str) - VPC ID + - **VPCProjectId** (str) - VPC所属项目ID + - **VPCType** (str) - VPC类型:Normal 公有云 Hybrid 托管云 + + + **ZoneInfo** + - **ChargeType** (str) - 计费类型(Dynamic、Month、Year) + - **CreateTime** (int) - 创建时间 + - **DNSZoneId** (str) - UDNS私有域名 Zone ID + - **DNSZoneName** (str) - 域名名称 + - **ExpireTime** (int) - 过期时间 + - **IsAutoRenew** (str) - 是否开启自动续费(Yes No) + - **IsRecursionEnabled** (str) - 是否支持迭代。枚举值,"enable",支持迭代; "disable",不支持迭代 + - **RecordInfos** (list) - 记录相关ID + - **Remark** (str) - 备注 + - **Tag** (str) - 业务组 + - **VPCInfos** (list) - 见 **VPCInfo** 模型定义 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUDNSZoneRequestSchema().dumps(d) + + resp = self.invoke("DescribeUDNSZone", d, **kwargs) + return apis.DescribeUDNSZoneResponseSchema().loads(resp) + + def disassociate_udns_zone_vpc( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DisassociateUDNSZoneVPC - 解绑域名和VPC + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DNSZoneId** (str) - (Required) 域名资源ID + - **VPCId** (str) - (Required) VPC资源ID + - **VPCProjectId** (str) - (Required) VPC所属项目ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DisassociateUDNSZoneVPCRequestSchema().dumps(d) + + resp = self.invoke("DisassociateUDNSZoneVPC", d, **kwargs) + return apis.DisassociateUDNSZoneVPCResponseSchema().loads(resp) + + def modify_udns_record( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUDNSRecord - 修改域名记录 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DNSZoneId** (str) - (Required) 域名资源ID + - **RecordId** (str) - (Required) 域名记录资源ID + - **Remark** (str) - 记录的备注信息 + - **TTL** (int) - TTL值,单位为秒 + - **Type** (str) - 记录类型。枚举值,“A”,"CNAME","MX","AAAA","SRV","PTR","TXT"。 + - **Value** (str) - 数值组,支持逗号分割。格式为:Value|权重|Enable,其中权重支持1-10,Enable为枚举值(1为启用,0为禁用)。输入格式示例:192.168.1.1|1|1,192.168.1.2|10|0。 + - **ValueType** (str) - 值类型。枚举值,“Normal”,标准;“Multivalue”,多值返回。仅在值为“Multivalue”时,Value的权重生效。 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyUDNSRecordRequestSchema().dumps(d) + + resp = self.invoke("ModifyUDNSRecord", d, **kwargs) + return apis.ModifyUDNSRecordResponseSchema().loads(resp) + + def modify_udns_zone( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUDNSZone - 修改域名备注/递归查询状态 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DNSZoneId** (str) - (Required) 域名资源ID + - **IsRecursionEnabled** (str) - 是否支持迭代。枚举值,"enable",支持迭代; "disable",不支持迭代 + - **Remark** (str) - 备注 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyUDNSZoneRequestSchema().dumps(d) + + resp = self.invoke("ModifyUDNSZone", d, **kwargs) + return apis.ModifyUDNSZoneResponseSchema().loads(resp) diff --git a/ucloud/services/udns/schemas/__init__.py b/ucloud/services/udns/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/udns/schemas/apis.py b/ucloud/services/udns/schemas/apis.py new file mode 100644 index 00000000..1436d21c --- /dev/null +++ b/ucloud/services/udns/schemas/apis.py @@ -0,0 +1,297 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.udns.schemas import models + +""" UDNS API Schema +""" + + +""" +API: AssociateUDNSZoneVPC + +绑定域名与VPC +""" + + +class AssociateUDNSZoneVPCRequestSchema(schema.RequestSchema): + """AssociateUDNSZoneVPC - 绑定域名与VPC""" + + fields = { + "DNSZoneId": fields.Str(required=True, dump_to="DNSZoneId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + "VPCProjectId": fields.Str(required=True, dump_to="VPCProjectId"), + } + + +class AssociateUDNSZoneVPCResponseSchema(schema.ResponseSchema): + """AssociateUDNSZoneVPC - 绑定域名与VPC""" + + fields = {} + + +""" +API: CreateUDNSRecord + +创建域名记录 +""" + + +class CreateUDNSRecordRequestSchema(schema.RequestSchema): + """CreateUDNSRecord - 创建域名记录""" + + fields = { + "DNSZoneId": fields.Str(required=True, dump_to="DNSZoneId"), + "Name": fields.Str(required=True, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "TTL": fields.Int(required=False, dump_to="TTL"), + "Type": fields.Str(required=True, dump_to="Type"), + "Value": fields.Str(required=True, dump_to="Value"), + "ValueType": fields.Str(required=True, dump_to="ValueType"), + } + + +class CreateUDNSRecordResponseSchema(schema.ResponseSchema): + """CreateUDNSRecord - 创建域名记录""" + + fields = { + "DNSRecordId": fields.Str(required=True, load_from="DNSRecordId"), + } + + +""" +API: CreateUDNSZone + +创建域名 +""" + + +class CreateUDNSZoneRequestSchema(schema.RequestSchema): + """CreateUDNSZone - 创建域名""" + + fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "DNSZoneName": fields.Str(required=True, dump_to="DNSZoneName"), + "IsRecursionEnabled": fields.Str( + required=False, dump_to="IsRecursionEnabled" + ), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "Type": fields.Str(required=True, dump_to="Type"), + } + + +class CreateUDNSZoneResponseSchema(schema.ResponseSchema): + """CreateUDNSZone - 创建域名""" + + fields = { + "DNSZoneId": fields.Str(required=True, load_from="DNSZoneId"), + } + + +""" +API: DeleteUDNSRecord + +删除域名记录 +""" + + +class DeleteUDNSRecordRequestSchema(schema.RequestSchema): + """DeleteUDNSRecord - 删除域名记录""" + + fields = { + "DNSZoneId": fields.Str(required=True, dump_to="DNSZoneId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "RecordIds": fields.List(fields.Str()), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DeleteUDNSRecordResponseSchema(schema.ResponseSchema): + """DeleteUDNSRecord - 删除域名记录""" + + fields = {} + + +""" +API: DescribeUDNSDomain + +zone下所有域名的rr记录 +""" + + +class DescribeUDNSDomainRequestSchema(schema.RequestSchema): + """DescribeUDNSDomain - zone下所有域名的rr记录""" + + fields = { + "DNSZoneName": fields.Str(required=True, dump_to="DNSZoneName"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + } + + +class DescribeUDNSDomainResponseSchema(schema.ResponseSchema): + """DescribeUDNSDomain - zone下所有域名的rr记录""" + + fields = { + "RecordInfos": fields.List( + models.RecordInfoSchema(), required=True, load_from="RecordInfos" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeUDNSRecord + +获取域名记录 +""" + + +class DescribeUDNSRecordRequestSchema(schema.RequestSchema): + """DescribeUDNSRecord - 获取域名记录""" + + fields = { + "DNSZoneId": fields.Str(required=True, dump_to="DNSZoneId"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Query": fields.Str(required=False, dump_to="Query"), + "RecordIds": fields.List(fields.Str()), + "Region": fields.Str(required=True, dump_to="Region"), + "SortDir": fields.Str(required=False, dump_to="SortDir"), + "SortKey": fields.Str(required=False, dump_to="SortKey"), + } + + +class DescribeUDNSRecordResponseSchema(schema.ResponseSchema): + """DescribeUDNSRecord - 获取域名记录""" + + fields = { + "RecordInfos": fields.List( + models.RecordInfoSchema(), required=False, load_from="RecordInfos" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeUDNSZone + +获取域名信息 +""" + + +class DescribeUDNSZoneRequestSchema(schema.RequestSchema): + """DescribeUDNSZone - 获取域名信息""" + + fields = { + "DNSZoneIds": fields.List(fields.Str()), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DescribeUDNSZoneResponseSchema(schema.ResponseSchema): + """DescribeUDNSZone - 获取域名信息""" + + fields = { + "DNSZoneInfos": fields.List( + models.ZoneInfoSchema(), required=False, load_from="DNSZoneInfos" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DisassociateUDNSZoneVPC + +解绑域名和VPC +""" + + +class DisassociateUDNSZoneVPCRequestSchema(schema.RequestSchema): + """DisassociateUDNSZoneVPC - 解绑域名和VPC""" + + fields = { + "DNSZoneId": fields.Str(required=True, dump_to="DNSZoneId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + "VPCProjectId": fields.Str(required=True, dump_to="VPCProjectId"), + } + + +class DisassociateUDNSZoneVPCResponseSchema(schema.ResponseSchema): + """DisassociateUDNSZoneVPC - 解绑域名和VPC""" + + fields = {} + + +""" +API: ModifyUDNSRecord + +修改域名记录 +""" + + +class ModifyUDNSRecordRequestSchema(schema.RequestSchema): + """ModifyUDNSRecord - 修改域名记录""" + + fields = { + "DNSZoneId": fields.Str(required=True, dump_to="DNSZoneId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "RecordId": fields.Str(required=True, dump_to="RecordId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "TTL": fields.Int(required=False, dump_to="TTL"), + "Type": fields.Str(required=False, dump_to="Type"), + "Value": fields.Str(required=False, dump_to="Value"), + "ValueType": fields.Str(required=False, dump_to="ValueType"), + } + + +class ModifyUDNSRecordResponseSchema(schema.ResponseSchema): + """ModifyUDNSRecord - 修改域名记录""" + + fields = {} + + +""" +API: ModifyUDNSZone + +修改域名备注/递归查询状态 +""" + + +class ModifyUDNSZoneRequestSchema(schema.RequestSchema): + """ModifyUDNSZone - 修改域名备注/递归查询状态""" + + fields = { + "DNSZoneId": fields.Str(required=True, dump_to="DNSZoneId"), + "IsRecursionEnabled": fields.Str( + required=False, dump_to="IsRecursionEnabled" + ), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + } + + +class ModifyUDNSZoneResponseSchema(schema.ResponseSchema): + """ModifyUDNSZone - 修改域名备注/递归查询状态""" + + fields = {} diff --git a/ucloud/services/udns/schemas/models.py b/ucloud/services/udns/schemas/models.py new file mode 100644 index 00000000..a06de6fd --- /dev/null +++ b/ucloud/services/udns/schemas/models.py @@ -0,0 +1,59 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class ValueSetSchema(schema.ResponseSchema): + """ValueSet - RecordInfos""" + + fields = { + "Data": fields.Str(required=True, load_from="Data"), + "IsEnabled": fields.Int(required=True, load_from="IsEnabled"), + "Weight": fields.Int(required=True, load_from="Weight"), + } + + +class RecordInfoSchema(schema.ResponseSchema): + """RecordInfo - DescribeUDNSRecord""" + + fields = { + "Name": fields.Str(required=True, load_from="Name"), + "RecordId": fields.Str(required=True, load_from="RecordId"), + "Remark": fields.Str(required=True, load_from="Remark"), + "TTL": fields.Int(required=True, load_from="TTL"), + "Type": fields.Str(required=True, load_from="Type"), + "ValueSet": fields.List(ValueSetSchema()), + "ValueType": fields.Str(required=True, load_from="ValueType"), + } + + +class VPCInfoSchema(schema.ResponseSchema): + """VPCInfo - ZoneInfo""" + + fields = { + "Name": fields.Str(required=False, load_from="Name"), + "Network": fields.List(fields.Str()), + "VPCId": fields.Str(required=False, load_from="VPCId"), + "VPCProjectId": fields.Str(required=False, load_from="VPCProjectId"), + "VPCType": fields.Str(required=False, load_from="VPCType"), + } + + +class ZoneInfoSchema(schema.ResponseSchema): + """ZoneInfo - DescribeUDNSZone""" + + fields = { + "ChargeType": fields.Str(required=True, load_from="ChargeType"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "DNSZoneId": fields.Str(required=True, load_from="DNSZoneId"), + "DNSZoneName": fields.Str(required=True, load_from="DNSZoneName"), + "ExpireTime": fields.Int(required=True, load_from="ExpireTime"), + "IsAutoRenew": fields.Str(required=True, load_from="IsAutoRenew"), + "IsRecursionEnabled": fields.Str( + required=True, load_from="IsRecursionEnabled" + ), + "RecordInfos": fields.List(fields.Str()), + "Remark": fields.Str(required=True, load_from="Remark"), + "Tag": fields.Str(required=True, load_from="Tag"), + "VPCInfos": fields.List(VPCInfoSchema()), + } diff --git a/ucloud/services/udpn/client.py b/ucloud/services/udpn/client.py index 04414758..e80e2ed8 100644 --- a/ucloud/services/udpn/client.py +++ b/ucloud/services/udpn/client.py @@ -1,216 +1,240 @@ -""" Code is generated by ucloud-model, DO NOT EDIT IT. """ - -import typing - - -from ucloud.core.client import Client -from ucloud.services.udpn.schemas import apis - - -class UDPNClient(Client): - def __init__( - self, config: dict, transport=None, middleware=None, logger=None - ): - super(UDPNClient, self).__init__(config, transport, middleware, logger) - - def allocate_udpn( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ AllocateUDPN - 分配一条 UDPN 专线 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **Bandwidth** (int) - (Required) 带宽 - - **Peer1** (str) - (Required) 专线可用区1,支持地域:北京二:cn-bj2, 上海二:cn-sh2, 广东:cn-gd, 亚太: hk, 上海一:cn-sh1, 法兰克福:ge-fra, 新加坡:sg, 洛杉矶:us-la, 华盛顿:us-ws, 东京:jpn-tky - - **Peer2** (str) - (Required) 专线可用区2,支持地域:北京二:cn-bj2, 上海二:cn-sh2, 广东:cn-gd, 亚太: hk, 上海一:cn-sh1, 法兰克福:ge-fra, 新加坡:sg, 洛杉矶:us-la, 华盛顿:us-ws, 东京:jpn-tky - - **ChargeType** (str) - 计费类型,枚举值为: Year,按年付费; Month,按月付费; Dynamic,按需付费 - - **CouponId** (str) - 代金劵 - - **Quantity** (int) - 计费时长,默认 1 - - **Response** - - - **UDPNId** (str) - 资源名称 - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.AllocateUDPNRequestSchema().dumps(d) - - # build options - kwargs["max_retries"] = 0 # ignore retry when api is not idempotent - - resp = self.invoke("AllocateUDPN", d, **kwargs) - return apis.AllocateUDPNResponseSchema().loads(resp) - - def describe_udpn( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ DescribeUDPN - 描述 UDPN - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **Limit** (int) - 返回数据长度,默认为 20 - - **Offset** (int) - 列表起始位置偏移量,默认为 0 - - **UDPNId** (str) - 申请到的 UDPN 资源 ID。若为空,则查询该用户在机房所有的专线信息。非默认项目资源,需填写ProjectId - - **Response** - - - **DataSet** (list) - 见 **UDPNData** 模型定义 - - **TotalCount** (int) - 查询到的总数量 - - **Response Model** - - **UDPNData** - - - **Bandwidth** (int) - 带宽 - - **ChargeType** (str) - 计费类型 - - **CreateTime** (int) - unix 时间戳 创建时间 - - **ExpireTime** (int) - unix 时间戳 到期时间 - - **Peer1** (str) - 可用区域 1 - - **Peer2** (str) - 可用区域 2 - - **UDPNId** (str) - UDPN 资源短 ID - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.DescribeUDPNRequestSchema().dumps(d) - - resp = self.invoke("DescribeUDPN", d, **kwargs) - return apis.DescribeUDPNResponseSchema().loads(resp) - - def get_udpn_line_list( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ GetUDPNLineList - 获取当前支持的专线线路列表 - - **Request** - - - **ProjectId** (str) - (Config) - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **Response** - - - **DataSet** (list) - 见 **UDPNLineSet** 模型定义 - - **TotalCount** (int) - DataSet中的元素个数 - - **Response Model** - - **UDPNLineSet** - - - **BandwidthUpperLimit** (int) - 线路带宽上限,单位 M - - **LocalRegion** (str) - 支持UDPN的地域之一,北京二:cn-bj2, 上海二:cn-sh2, 广东:cn-gd, 亚太: hk, 上海一:cn-sh1, 法兰克福:ge-fra, 新加坡:sg, 华盛顿:us-ws, 洛杉矶:us-la, 东京:jpn-tky - - **RemoteRegion** (str) - 支持UDPN的地域之一,北京二:cn-bj2, 上海二:cn-sh2, 广东:cn-gd, 亚太: hk, 上海一:cn-sh1, 法兰克福:ge-fra, 新加坡:sg, 华盛顿:us-ws, 洛杉矶:us-la, 东京:jpn-tky - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.GetUDPNLineListRequestSchema().dumps(d) - - resp = self.invoke("GetUDPNLineList", d, **kwargs) - return apis.GetUDPNLineListResponseSchema().loads(resp) - - def get_udpn_price( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ GetUDPNPrice - 获取 UDPN 价格 - - **Request** - - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **Bandwidth** (int) - (Required) 带宽信息 - - **Peer1** (str) - (Required) 专线可用区1,支持地域:北京二:cn-bj2, 上海二:cn-sh2, 广东:cn-gd, 亚太: hk, 上海一:cn-sh1, 法兰克福:ge-fra, 新加坡:sg, 洛杉矶:us-la, 华盛顿:us-ws, 东京:jpn-tky - - **Peer2** (str) - (Required) 专线可用区2,支持地域:北京二:cn-bj2, 上海二:cn-sh2, 广东:cn-gd, 亚太: hk, 上海一:cn-sh1, 法兰克福:ge-fra, 新加坡:sg, 洛杉矶:us-la, 华盛顿:us-ws, 东京:jpn-tky - - **ChargeType** (str) - 计费类型 - - **Quantity** (int) - 购买时长 - - **Response** - - - **Price** (float) - 专线价格 - - **PurchaseValue** (int) - 资源有效期 unix 时间戳 - - """ - # build request - d = {"Region": self.config.region} - req and d.update(req) - d = apis.GetUDPNPriceRequestSchema().dumps(d) - - resp = self.invoke("GetUDPNPrice", d, **kwargs) - return apis.GetUDPNPriceResponseSchema().loads(resp) - - def get_udpn_upgrade_price( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ GetUDPNUpgradePrice - 获取专线升级价格 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **Bandwidth** (int) - (Required) 带宽 - - **UDPNId** (str) - (Required) 专线带宽资源 Id - - **Response** - - - **Price** (float) - 升级后的价格 - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.GetUDPNUpgradePriceRequestSchema().dumps(d) - - resp = self.invoke("GetUDPNUpgradePrice", d, **kwargs) - return apis.GetUDPNUpgradePriceResponseSchema().loads(resp) - - def modify_udpn_bandwidth( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ ModifyUDPNBandwidth - 修改带宽值 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **Bandwidth** (int) - (Required) 调整后专线带宽, 单位为Mbps,取值范围为大于等于2且小于等于1000([2-1000])的整数 - - **UDPNId** (str) - (Required) UDPN Id - - **CouponId** (str) - 代金劵 ID - - **Response** - - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.ModifyUDPNBandwidthRequestSchema().dumps(d) - - resp = self.invoke("ModifyUDPNBandwidth", d, **kwargs) - return apis.ModifyUDPNBandwidthResponseSchema().loads(resp) - - def release_udpn(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ ReleaseUDPN - 释放 UDPN - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **UDPNId** (str) - (Required) UDPN 资源 Id - - **Response** - - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.ReleaseUDPNRequestSchema().dumps(d) - - resp = self.invoke("ReleaseUDPN", d, **kwargs) - return apis.ReleaseUDPNResponseSchema().loads(resp) +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.udpn.schemas import apis + + +class UDPNClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UDPNClient, self).__init__(config, transport, middleware, logger) + + def allocate_udpn( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AllocateUDPN - 分配一条 UDPN 专线 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Bandwidth** (int) - (Required) 带宽 + - **Peer1** (str) - (Required) 专线可用区1,支持地域:北京二:cn-bj2, 上海二:cn-sh2, 广东:cn-gd, 亚太: hk, 上海一:cn-sh1, 法兰克福:ge-fra, 新加坡:sg, 洛杉矶:us-ca, 华盛顿:us-ws, 东京:jpn-tky + - **Peer2** (str) - (Required) 专线可用区2,支持地域:北京二:cn-bj2, 上海二:cn-sh2, 广东:cn-gd, 亚太: hk, 上海一:cn-sh1, 法兰克福:ge-fra, 新加坡:sg, 洛杉矶:us-ca, 华盛顿:us-ws, 东京:jpn-tky + - **ChargeType** (str) - 计费类型,枚举值为: Year,按年付费; Month,按月付费; Dynamic,按需付费 + - **CouponId** (str) - 代金劵 + - **PayMode** (str) - 计费模式. 枚举值:"Traffic", 流量计费模式; 否则 带宽计费模式; + - **Quantity** (int) - 计费时长,默认 1 + + **Response** + + - **Action** (str) - 操作名称 + - **RetCode** (int) - 返回码 + - **UDPNId** (str) - 资源名称 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.AllocateUDPNRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AllocateUDPN", d, **kwargs) + return apis.AllocateUDPNResponseSchema().loads(resp) + + def describe_udpn( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUDPN - 描述 UDPN + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - 返回数据长度,默认为 20 + - **Offset** (int) - 列表起始位置偏移量,默认为 0 + - **UDPNId** (str) - 申请到的 UDPN 资源 ID。若为空,则查询该用户在机房所有的专线信息。非默认项目资源,需填写ProjectId + + **Response** + + - **DataSet** (list) - 见 **UDPNData** 模型定义 + - **TotalCount** (int) - 查询到的总数量 + + **Response Model** + + **UDPNData** + - **Bandwidth** (int) - 带宽 + - **ChargeType** (str) - 计费类型 + - **CreateTime** (int) - unix 时间戳 创建时间 + - **ExpireTime** (int) - unix 时间戳 到期时间 + - **Peer1** (str) - 可用区域 1 + - **Peer2** (str) - 可用区域 2 + - **UDPNId** (str) - UDPN 资源短 ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUDPNRequestSchema().dumps(d) + + resp = self.invoke("DescribeUDPN", d, **kwargs) + return apis.DescribeUDPNResponseSchema().loads(resp) + + def get_udpn_line_list( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUDPNLineList - 获取当前支持的专线线路列表 + + **Request** + + - **ProjectId** (str) - (Config) + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + + **Response** + + - **DataSet** (list) - 见 **UDPNLineSet** 模型定义 + - **TotalCount** (int) - DataSet中的元素个数 + + **Response Model** + + **UDPNLineSet** + - **BandwidthUpperLimit** (int) - 线路带宽上限,单位 M + - **LocalRegion** (str) - 支持UDPN的地域之一,北京二:cn-bj2, 上海二:cn-sh2, 广东:cn-gd, 亚太: hk, 上海一:cn-sh1, 法兰克福:ge-fra, 新加坡:sg, 华盛顿:us-ws, 洛杉矶:us-la, 东京:jpn-tky + - **RemoteRegion** (str) - 支持UDPN的地域之一,北京二:cn-bj2, 上海二:cn-sh2, 广东:cn-gd, 亚太: hk, 上海一:cn-sh1, 法兰克福:ge-fra, 新加坡:sg, 华盛顿:us-ws, 洛杉矶:us-la, 东京:jpn-tky + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUDPNLineListRequestSchema().dumps(d) + + resp = self.invoke("GetUDPNLineList", d, **kwargs) + return apis.GetUDPNLineListResponseSchema().loads(resp) + + def get_udpn_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUDPNPrice - 获取 UDPN 价格 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Bandwidth** (int) - (Required) 带宽信息 + - **Peer1** (str) - (Required) 专线可用区1,支持地域:北京二:cn-bj2, 上海二:cn-sh2, 广东:cn-gd, 亚太: hk, 上海一:cn-sh1, 法兰克福:ge-fra, 新加坡:sg, 洛杉矶:us-la, 华盛顿:us-ws, 东京:jpn-tky + - **Peer2** (str) - (Required) 专线可用区2,支持地域:北京二:cn-bj2, 上海二:cn-sh2, 广东:cn-gd, 亚太: hk, 上海一:cn-sh1, 法兰克福:ge-fra, 新加坡:sg, 洛杉矶:us-la, 华盛顿:us-ws, 东京:jpn-tky + - **ChargeType** (str) - 计费类型 + - **PayMode** (str) - PayMode,枚举值,Bandwidth:带宽;Traffic:流量 默认不填写:带宽 + - **Quantity** (int) - 购买时长 + + **Response** + + - **Price** (float) - 专线价格 + - **PurchaseValue** (int) - 资源有效期 unix 时间戳 + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUDPNPriceRequestSchema().dumps(d) + + resp = self.invoke("GetUDPNPrice", d, **kwargs) + return apis.GetUDPNPriceResponseSchema().loads(resp) + + def get_udpn_upgrade_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUDPNUpgradePrice - 获取专线升级价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Bandwidth** (int) - (Required) 带宽 + - **UDPNId** (str) - (Required) 专线带宽资源 Id + + **Response** + + - **Price** (float) - 升级后的价格 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUDPNUpgradePriceRequestSchema().dumps(d) + + resp = self.invoke("GetUDPNUpgradePrice", d, **kwargs) + return apis.GetUDPNUpgradePriceResponseSchema().loads(resp) + + def modify_udpn_bandwidth( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUDPNBandwidth - 修改带宽值 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) + - **Bandwidth** (int) - (Required) 调整后专线带宽, 单位为Mbps,取值范围为大于等于2且小于等于1000([2-1000])的整数 + - **UDPNId** (str) - (Required) UDPN Id + - **CouponId** (str) - 代金劵 ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyUDPNBandwidthRequestSchema().dumps(d) + + resp = self.invoke("ModifyUDPNBandwidth", d, **kwargs) + return apis.ModifyUDPNBandwidthResponseSchema().loads(resp) + + def release_udpn(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """ReleaseUDPN - 释放 UDPN + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UDPNId** (str) - (Required) UDPN 资源 Id + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ReleaseUDPNRequestSchema().dumps(d) + + resp = self.invoke("ReleaseUDPN", d, **kwargs) + return apis.ReleaseUDPNResponseSchema().loads(resp) diff --git a/ucloud/services/udpn/schemas/apis.py b/ucloud/services/udpn/schemas/apis.py index 0e5fc8dd..a2982ff1 100644 --- a/ucloud/services/udpn/schemas/apis.py +++ b/ucloud/services/udpn/schemas/apis.py @@ -3,7 +3,6 @@ from ucloud.core.typesystem import schema, fields from ucloud.services.udpn.schemas import models - """ UDPN API Schema """ @@ -16,13 +15,13 @@ class AllocateUDPNRequestSchema(schema.RequestSchema): - """ AllocateUDPN - 分配一条 UDPN 专线 - """ + """AllocateUDPN - 分配一条 UDPN 专线""" fields = { "Bandwidth": fields.Int(required=True, dump_to="Bandwidth"), "ChargeType": fields.Str(required=False, dump_to="ChargeType"), "CouponId": fields.Str(required=False, dump_to="CouponId"), + "PayMode": fields.Str(required=False, dump_to="PayMode"), "Peer1": fields.Str(required=True, dump_to="Peer1"), "Peer2": fields.Str(required=True, dump_to="Peer2"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -32,10 +31,13 @@ class AllocateUDPNRequestSchema(schema.RequestSchema): class AllocateUDPNResponseSchema(schema.ResponseSchema): - """ AllocateUDPN - 分配一条 UDPN 专线 - """ + """AllocateUDPN - 分配一条 UDPN 专线""" - fields = {"UDPNId": fields.Str(required=True, load_from="UDPNId")} + fields = { + "Action": fields.Str(required=True, load_from="Action"), + "RetCode": fields.Int(required=True, load_from="RetCode"), + "UDPNId": fields.Str(required=True, load_from="UDPNId"), + } """ @@ -46,8 +48,7 @@ class AllocateUDPNResponseSchema(schema.ResponseSchema): class DescribeUDPNRequestSchema(schema.RequestSchema): - """ DescribeUDPN - 描述 UDPN - """ + """DescribeUDPN - 描述 UDPN""" fields = { "Limit": fields.Int(required=False, dump_to="Limit"), @@ -59,8 +60,7 @@ class DescribeUDPNRequestSchema(schema.RequestSchema): class DescribeUDPNResponseSchema(schema.ResponseSchema): - """ DescribeUDPN - 描述 UDPN - """ + """DescribeUDPN - 描述 UDPN""" fields = { "DataSet": fields.List( @@ -78,8 +78,7 @@ class DescribeUDPNResponseSchema(schema.ResponseSchema): class GetUDPNLineListRequestSchema(schema.RequestSchema): - """ GetUDPNLineList - 获取当前支持的专线线路列表 - """ + """GetUDPNLineList - 获取当前支持的专线线路列表""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -88,8 +87,7 @@ class GetUDPNLineListRequestSchema(schema.RequestSchema): class GetUDPNLineListResponseSchema(schema.ResponseSchema): - """ GetUDPNLineList - 获取当前支持的专线线路列表 - """ + """GetUDPNLineList - 获取当前支持的专线线路列表""" fields = { "DataSet": fields.List( @@ -107,12 +105,12 @@ class GetUDPNLineListResponseSchema(schema.ResponseSchema): class GetUDPNPriceRequestSchema(schema.RequestSchema): - """ GetUDPNPrice - 获取 UDPN 价格 - """ + """GetUDPNPrice - 获取 UDPN 价格""" fields = { "Bandwidth": fields.Int(required=True, dump_to="Bandwidth"), "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "PayMode": fields.Str(required=False, dump_to="PayMode"), "Peer1": fields.Str(required=True, dump_to="Peer1"), "Peer2": fields.Str(required=True, dump_to="Peer2"), "Quantity": fields.Int(required=False, dump_to="Quantity"), @@ -121,8 +119,7 @@ class GetUDPNPriceRequestSchema(schema.RequestSchema): class GetUDPNPriceResponseSchema(schema.ResponseSchema): - """ GetUDPNPrice - 获取 UDPN 价格 - """ + """GetUDPNPrice - 获取 UDPN 价格""" fields = { "Price": fields.Float(required=True, load_from="Price"), @@ -138,8 +135,7 @@ class GetUDPNPriceResponseSchema(schema.ResponseSchema): class GetUDPNUpgradePriceRequestSchema(schema.RequestSchema): - """ GetUDPNUpgradePrice - 获取专线升级价格 - """ + """GetUDPNUpgradePrice - 获取专线升级价格""" fields = { "Bandwidth": fields.Int(required=True, dump_to="Bandwidth"), @@ -150,10 +146,11 @@ class GetUDPNUpgradePriceRequestSchema(schema.RequestSchema): class GetUDPNUpgradePriceResponseSchema(schema.ResponseSchema): - """ GetUDPNUpgradePrice - 获取专线升级价格 - """ + """GetUDPNUpgradePrice - 获取专线升级价格""" - fields = {"Price": fields.Float(required=True, load_from="Price")} + fields = { + "Price": fields.Float(required=True, load_from="Price"), + } """ @@ -164,21 +161,21 @@ class GetUDPNUpgradePriceResponseSchema(schema.ResponseSchema): class ModifyUDPNBandwidthRequestSchema(schema.RequestSchema): - """ ModifyUDPNBandwidth - 修改带宽值 - """ + """ModifyUDPNBandwidth - 修改带宽值""" fields = { "Bandwidth": fields.Int(required=True, dump_to="Bandwidth"), "CouponId": fields.Str(required=False, dump_to="CouponId"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), - "Region": fields.Str(required=False, dump_to="Region"), + "Region": fields.Str( + required=False, dump_to="Region" + ), # Deprecated, will be removed at 1.0 "UDPNId": fields.Str(required=True, dump_to="UDPNId"), } class ModifyUDPNBandwidthResponseSchema(schema.ResponseSchema): - """ ModifyUDPNBandwidth - 修改带宽值 - """ + """ModifyUDPNBandwidth - 修改带宽值""" fields = {} @@ -191,8 +188,7 @@ class ModifyUDPNBandwidthResponseSchema(schema.ResponseSchema): class ReleaseUDPNRequestSchema(schema.RequestSchema): - """ ReleaseUDPN - 释放 UDPN - """ + """ReleaseUDPN - 释放 UDPN""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -202,7 +198,6 @@ class ReleaseUDPNRequestSchema(schema.RequestSchema): class ReleaseUDPNResponseSchema(schema.ResponseSchema): - """ ReleaseUDPN - 释放 UDPN - """ + """ReleaseUDPN - 释放 UDPN""" fields = {} diff --git a/ucloud/services/udpn/schemas/models.py b/ucloud/services/udpn/schemas/models.py index 12393332..cc577a57 100644 --- a/ucloud/services/udpn/schemas/models.py +++ b/ucloud/services/udpn/schemas/models.py @@ -1,31 +1,29 @@ -""" Code is generated by ucloud-model, DO NOT EDIT IT. """ - -from ucloud.core.typesystem import schema, fields - - -class UDPNDataSchema(schema.ResponseSchema): - """ UDPNData - UDPN 详细信息 - """ - - fields = { - "Bandwidth": fields.Int(required=True, load_from="Bandwidth"), - "ChargeType": fields.Str(required=True, load_from="ChargeType"), - "CreateTime": fields.Int(required=True, load_from="CreateTime"), - "ExpireTime": fields.Int(required=True, load_from="ExpireTime"), - "Peer1": fields.Str(required=True, load_from="Peer1"), - "Peer2": fields.Str(required=True, load_from="Peer2"), - "UDPNId": fields.Str(required=True, load_from="UDPNId"), - } - - -class UDPNLineSetSchema(schema.ResponseSchema): - """ UDPNLineSet - GetUDPNLineList - """ - - fields = { - "BandwidthUpperLimit": fields.Int( - required=True, load_from="BandwidthUpperLimit" - ), - "LocalRegion": fields.Str(required=True, load_from="LocalRegion"), - "RemoteRegion": fields.Str(required=True, load_from="RemoteRegion"), - } +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class UDPNDataSchema(schema.ResponseSchema): + """UDPNData - UDPN 详细信息""" + + fields = { + "Bandwidth": fields.Int(required=True, load_from="Bandwidth"), + "ChargeType": fields.Str(required=True, load_from="ChargeType"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "ExpireTime": fields.Int(required=True, load_from="ExpireTime"), + "Peer1": fields.Str(required=True, load_from="Peer1"), + "Peer2": fields.Str(required=True, load_from="Peer2"), + "UDPNId": fields.Str(required=True, load_from="UDPNId"), + } + + +class UDPNLineSetSchema(schema.ResponseSchema): + """UDPNLineSet - GetUDPNLineList""" + + fields = { + "BandwidthUpperLimit": fields.Int( + required=True, load_from="BandwidthUpperLimit" + ), + "LocalRegion": fields.Str(required=True, load_from="LocalRegion"), + "RemoteRegion": fields.Str(required=True, load_from="RemoteRegion"), + } diff --git a/ucloud/services/udts/__init__.py b/ucloud/services/udts/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/udts/client.py b/ucloud/services/udts/client.py new file mode 100644 index 00000000..05f30d09 --- /dev/null +++ b/ucloud/services/udts/client.py @@ -0,0 +1,410 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.udts.schemas import apis + + +class UDTSClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UDTSClient, self).__init__(config, transport, middleware, logger) + + def check_udts_task( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CheckUDTSTask - 对UDTS 任务提供预检查功能 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **MaxRetryCount** (str) - (Required) 重试次数,最大为 5。 默认为0 + - **Name** (str) - (Required) task 名称,长度不能超过 128 + - **Type** (str) - (Required) 任务类型,值为 transfer 或 integration, transfer 时任务为 数据迁移,integration 时任务为 数据集成。 + - **Query** (str) - 废弃 + - **Source** (list) - 见 **CheckUDTSTaskParamSource** 模型定义 + - **Target** (dict) - 见 **CheckUDTSTaskParamTarget** 模型定义 + + **Response** + + - **Action** (str) - 操作名称 + - **Data** (dict) - 见 **CheckUDTSTaskResult** 模型定义 + - **Message** (str) - 返回消息 + - **RetCode** (str) - 返回码 + + **Request Model** + + **CheckUDTSTaskParamSourceMySQLNodeSyncData** + - **BinlogGTID** (str) - 增量时需要指定的 binlog gtid,可以通过 show master status 获取,或者全量+增量任务会自动设置 + - **BinlogName** (str) - 增量时需要指定的 binlog name,可以通过 show master status 获取,或者全量+增量任务会自动设置 + - **BinlogPos** (int) - 增量时需要指定的 binlog pos,可以通过 show master status 获取,或者全量+增量任务会自动设置 + - **ServerID** (int) - 增量时需要指定的 serverID,不能和现有的 slave 重复,预检查时会检查该值 + + + **CheckUDTSTaskParamSourceMySQLNodeQueryData** + - **DBName** (str) - 数据集成时需要迁移的 DB 名 + - **NewDBName** (str) - 数据集成时迁移后的 DB 名 + + + **CheckUDTSTaskParamTargetMySQLNode** + - **DataRegion** (str) - 目标数据库地域,比如 cn-bj2 + - **Host** (str) - 目标数据库地址, 比如 10.9.37.212 + - **Password** (str) - 目标数据库密码 + - **Port** (int) - 目标数据库端口,比如 3306 + - **SubnetId** (str) - 目标数据库子网 ID ,比如 subnet-zl44fktq + - **User** (str) - 目标数据库用户名,比如 root + - **VPCId** (str) - 目标数据库 VPC,比如 uvnet-1wz5rqte + + + **CheckUDTSTaskParamSourceMySQLNode** + - **DataRegion** (str) - 数据库地域,比如 cn-bj2 + - **Database** (str) - 需要迁移的 DB 名称 + - **Host** (str) - 源数据库地址, 比如 10.9.37.200 + - **Password** (str) - 源 MySQL 密码 + - **Port** (int) - 源 MySQL 端口,如 3306 + - **QueryData** (list) - 见 **CheckUDTSTaskParamSourceMySQLNodeQueryData** 模型定义 + - **SubnetId** (str) - 子网 ID + - **SyncData** (dict) - 见 **CheckUDTSTaskParamSourceMySQLNodeSyncData** 模型定义 + - **Table** (str) - 需要迁移的 table 名 + - **User** (str) - 源 MySQL 用户名,如 root + - **VPCId** (str) - VPC + + + **CheckUDTSTaskParamTarget** + - **DataType** (str) - 目标数据库类型,比如 mysql + - **MySQLNode** (dict) - 见 **CheckUDTSTaskParamTargetMySQLNode** 模型定义 + - **NWType** (str) - 目标 db 网络类型,目前进支持 user + + + **CheckUDTSTaskParamSource** + - **DataType** (str) - 数据库类型 + - **Mode** (str) - // 任务类型,值可以是 full, incremental, full+incremental, bidirectional + - **MySQLNode** (dict) - 见 **CheckUDTSTaskParamSourceMySQLNode** 模型定义 + - **NWType** (str) - 源网络类型,可以是 public,user,dedicated_line + + + **Response Model** + + **CheckResultItem** + - **ErrMessage** (str) - + - **State** (str) - 状态 + + + **CheckResult** + - **Config** (dict) - 见 **CheckResultItem** 模型定义 + - **Connection** (dict) - 见 **CheckResultItem** 模型定义 + - **Privileges** (dict) - 见 **CheckResultItem** 模型定义 + + + **CheckUDTSTaskResult** + - **Source** (dict) - 见 **CheckResult** 模型定义 + - **Target** (dict) - 见 **CheckResult** 模型定义 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.CheckUDTSTaskRequestSchema().dumps(d) + + resp = self.invoke("CheckUDTSTask", d, **kwargs) + return apis.CheckUDTSTaskResponseSchema().loads(resp) + + def create_udts_task( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUDTSTask - 创建UDTS任务 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Name** (str) - (Required) task 名称,长度不能超过 128 + - **Type** (str) - (Required) 任务类型,transfer(数据传输) 或 integration(数据集成) + - **IsUnidirection** (str) - 暂时未使用该字段 + - **MaxRetryCount** (str) - 重试次数,最大为 5。 默认为0 + - **Query** (str) - 暂时未使用该字段 + - **Remark** (str) - 备注信息,长度不能大于 255 + - **Source** (list) - 见 **CreateUDTSTaskParamSource** 模型定义 + - **Target** (dict) - 见 **CreateUDTSTaskParamTarget** 模型定义 + + **Response** + + - **Data** (dict) - + - **Message** (str) - 返回消息 + + **Request Model** + + **CreateUDTSTaskParamSourceMySQLNodeQueryDataTableData** + - **ExcludeTables** (bool) - 暂时未使用该字段 + - **TableNames** (str) - 暂时未使用该字段 + + + **CreateUDTSTaskParamSourceMySQLNodeQueryDataTableMaps** + - **NewTableName** (str) - 数据集成时迁移后的 Table 名 + - **TableName** (str) - 数据集成时需要迁移的 Table 名 + + + **CreateUDTSTaskParamSourceMySQLNodeSyncData** + - **BinlogGTID** (str) - 增量时需要指定的 binlog gtid,可以通过 show master status 获取,或者全量+增量任务会自动设置 + - **BinlogName** (str) - 增量时需要指定的 binlog name,可以通过 show master status 获取,或者全量+增量任务会自动设置 + - **BinlogPos** (int) - 增量时需要指定的 binlog pos,可以通过 show master status 获取,或者全量+增量任务会自动设置 + - **ServerID** (int) - 增量时需要指定的 serverID,不能和现有的 slave 重复,预检查时会检查该值 + + + **CreateUDTSTaskParamSourceMySQLNodeQueryData** + - **DBName** (str) - 数据集成时需要迁移的 DB 名 + - **NewDBName** (str) - 数据集成时迁移后的 DB 名 + - **TableData** (dict) - 见 **CreateUDTSTaskParamSourceMySQLNodeQueryDataTableData** 模型定义 + - **TableMaps** (list) - 见 **CreateUDTSTaskParamSourceMySQLNodeQueryDataTableMaps** 模型定义 + + + **CreateUDTSTaskParamSourceMySQLNode** + - **DataRegion** (str) - 数据库地域,比如 cn-bj2 + - **Database** (str) - 需要迁移的 DB 名称 + - **DupAction** (str) - 重复数据处理规则,数据集成时该参数才有效,值为 ignore或者replace + - **Host** (str) - 源数据库地址 + - **KeepExistData** (bool) - 是否保留原有数据,只有数据集成时该参数才有效 + - **Password** (str) - 源数据库密码 + - **Port** (int) - 源数据库端口 + - **QueryData** (list) - 见 **CreateUDTSTaskParamSourceMySQLNodeQueryData** 模型定义 + - **SubnetId** (str) - 源数据库子网 ID,当网络类型为 user 时需要填写 + - **SyncData** (dict) - 见 **CreateUDTSTaskParamSourceMySQLNodeSyncData** 模型定义 + - **Table** (str) - 需要迁移的 table 名 + - **User** (str) - 源数据库用户名 + - **VPCId** (str) - 源数据库 VPC ID,当网络类型为 user 时需要填写 + + + **CreateUDTSTaskParamTargetMySQLNode** + - **DataRegion** (str) - 目标数据库地域,比如 cn-bj2 + - **Host** (str) - 目标数据库地址, 比如 10.9.37.212 + - **NoBinlog** (bool) - 是否在全量过程中,临时禁用目标 MySQL 产生 binlog,在目标磁盘空间不足,或者需要获取更快的迁移速度时可以使用,该参数会破坏目标 MySQL 的高可用 + - **Password** (str) - 目标数据库密码 + - **Port** (int) - 目标数据库端口,比如 3306 + - **SubnetId** (str) - 目标数据库子网 ID ,比如 subnet-zl44fktq + - **User** (str) - 目标数据库用户名,比如 root + - **VPCId** (str) - 目标数据库 VPC,比如 uvnet-1wz5rqte + + + **CreateUDTSTaskParamSource** + - **BandwidthLimit** (int) - 源端限速值,单位为 MB/s + - **DataType** (str) - 数据库类型,比如 mysql + - **Mode** (str) - 任务类型,值可以是 full, incremental, full+incremental, bidirectional + - **MySQLNode** (dict) - 见 **CreateUDTSTaskParamSourceMySQLNode** 模型定义 + - **NWType** (str) - 源网络类型,可以是 public,user,dedicated_line + + + **CreateUDTSTaskParamTarget** + - **BandwidthLimit** (str) - 目标端限速,单位为 MB/s + - **DataType** (str) - 目标数据库类型,比如 mysql + - **Mode** (str) - + - **MySQLNode** (dict) - 见 **CreateUDTSTaskParamTargetMySQLNode** 模型定义 + - **NWType** (str) - 目标 db 网络类型,目前仅支持 user + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.CreateUDTSTaskRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUDTSTask", d, **kwargs) + return apis.CreateUDTSTaskResponseSchema().loads(resp) + + def get_udts_task_history( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUDTSTaskHistory - 获取任务历史状态 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **TaskId** (str) - (Required) 任务短 id + - **Type** (str) - 任务类型 + + **Response** + + - **Data** (list) - 见 **TaskHistoryItem** 模型定义 + + **Response Model** + + **TaskHistoryItem** + - **AntID** (str) - 任务 ID + - **AntState** (str) - 任务状态 + - **CreateTime** (int) - 事件时间,值为 timestamp + - **CreateTimeH** (str) - 事件时间,为可读的日期时间 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUDTSTaskHistoryRequestSchema().dumps(d) + + resp = self.invoke("GetUDTSTaskHistory", d, **kwargs) + return apis.GetUDTSTaskHistoryResponseSchema().loads(resp) + + def get_udts_task_status( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUDTSTaskStatus - 查看服务状态 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **TaskId** (str) - (Required) 任务ID + - **Type** (str) - 任务类型,值为 transfer 或 integration, transfer 时任务为 数据迁移,integration 时任务为 数据集成。 + + **Response** + + - **Data** (dict) - 见 **StatusData** 模型定义 + - **Message** (str) - 返回信息 + + **Response Model** + + **SyncData** + - **BinlogGTID** (str) - GTID + - **BinlogName** (str) - Binlog 文件名, 长度不超过128字符 + - **BinlogPos** (int) - Binlog Pos + - **ServerId** (int) - 分配给UDTS task的server ID, 必须在MySQL集群中唯一 + + + **Progress** + - **CurCount** (int) - 已迁移条目数 + - **CurDuration** (int) - 已耗时间(单位秒) + - **Percentage** (float) - 完成进度 + - **TotalCount** (int) - 总条目数 + - **TotalDuration** (int) - 估算总耗时间(单位秒) + + + **StatusData** + - **CurRetryCount** (int) - 当前失败重试次数 + - **FailedMessage** (str) - 当Status为Failed时, 显示失败原因 + - **MaxRetryCount** (int) - 用户设置的最大失败重试次数 + - **Progress** (dict) - 见 **Progress** 模型定义 + - **Status** (str) - 任务状态, 状态有 Created:已创建,Checking:检查中,Dumping:转储中,Loading:加载中,Syncing:同步中,Synced:已同步,Done:完成,Failed:失败,Stopping:停止中,Stopped:停止,RetryPending:重试等待中,Starting:启动中,FailedUnrecoverable:异常,StoppedUnrecoverable:异常,Success:成功,Started:已启动 + - **Sync** (dict) - 见 **SyncData** 模型定义 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUDTSTaskStatusRequestSchema().dumps(d) + + resp = self.invoke("GetUDTSTaskStatus", d, **kwargs) + return apis.GetUDTSTaskStatusResponseSchema().loads(resp) + + def list_udts_task( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUDTSTask - 获取用户创建的 Task 信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Limit** (str) - 请求数量,默认为 20 + - **Offset** (str) - 偏移量,默认为 0 + - **Type** (str) - 任务类型 + + **Response** + + - **Data** (list) - 见 **ListDataItem** 模型定义 + - **Message** (str) - 返回信息 + + **Response Model** + + **Progress** + - **CurCount** (int) - 已迁移条目数 + - **CurDuration** (int) - 已耗时间(单位秒) + - **Percentage** (float) - 完成进度 + - **TotalCount** (int) - 总条目数 + - **TotalDuration** (int) - 估算总耗时间(单位秒) + + + **ListDataItem** + - **CreateTime** (int) - 创建时间 + - **CurRetryCount** (int) - 当前失败重试次数 + - **MaxRetryCount** (int) - 最大失败重试次数 + - **Name** (str) - 任务名称 + - **Progress** (dict) - 见 **Progress** 模型定义 + - **Status** (str) - 任务状态 + - **TaskId** (str) - 任务 ID + - **Type** (str) - 任务类型, full全量, incremental增量,full+incremental全量+增量。 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ListUDTSTaskRequestSchema().dumps(d) + + resp = self.invoke("ListUDTSTask", d, **kwargs) + return apis.ListUDTSTaskResponseSchema().loads(resp) + + def start_udts_task( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """StartUDTSTask - 启动UDTS服务 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **TaskId** (str) - (Required) 任务ID + - **Type** (str) - 任务类型 + + **Response** + + - **Message** (str) - 返回信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.StartUDTSTaskRequestSchema().dumps(d) + + resp = self.invoke("StartUDTSTask", d, **kwargs) + return apis.StartUDTSTaskResponseSchema().loads(resp) + + def stop_udts_task( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """StopUDTSTask - 停止UDTS任务 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **TaskId** (str) - (Required) 任务 ID + - **Type** (str) - 任务类型 + + **Response** + + - **Message** (str) - 返回信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.StopUDTSTaskRequestSchema().dumps(d) + + resp = self.invoke("StopUDTSTask", d, **kwargs) + return apis.StopUDTSTaskResponseSchema().loads(resp) diff --git a/ucloud/services/udts/schemas/__init__.py b/ucloud/services/udts/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/udts/schemas/apis.py b/ucloud/services/udts/schemas/apis.py new file mode 100644 index 00000000..ec708e6b --- /dev/null +++ b/ucloud/services/udts/schemas/apis.py @@ -0,0 +1,403 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.udts.schemas import models + +""" UDTS API Schema +""" + + +""" +API: CheckUDTSTask + +对UDTS 任务提供预检查功能 +""" + + +class CheckUDTSTaskParamSourceMySQLNodeSyncDataSchema(schema.RequestSchema): + """CheckUDTSTaskParamSourceMySQLNodeSyncData -""" + + fields = { + "BinlogGTID": fields.Str(required=False, dump_to="BinlogGTID"), + "BinlogName": fields.Str(required=False, dump_to="BinlogName"), + "BinlogPos": fields.Int(required=False, dump_to="BinlogPos"), + "ServerID": fields.Int(required=False, dump_to="ServerID"), + } + + +class CheckUDTSTaskParamSourceMySQLNodeQueryDataSchema(schema.RequestSchema): + """CheckUDTSTaskParamSourceMySQLNodeQueryData -""" + + fields = { + "DBName": fields.Str(required=False, dump_to="DBName"), + "NewDBName": fields.Str(required=False, dump_to="NewDBName"), + } + + +class CheckUDTSTaskParamTargetMySQLNodeSchema(schema.RequestSchema): + """CheckUDTSTaskParamTargetMySQLNode -""" + + fields = { + "DataRegion": fields.Str(required=False, dump_to="DataRegion"), + "Host": fields.Str(required=False, dump_to="Host"), + "Password": fields.Str(required=False, dump_to="Password"), + "Port": fields.Int(required=False, dump_to="Port"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "User": fields.Str(required=False, dump_to="User"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + } + + +class CheckUDTSTaskParamSourceMySQLNodeSchema(schema.RequestSchema): + """CheckUDTSTaskParamSourceMySQLNode -""" + + fields = { + "DataRegion": fields.Str(required=False, dump_to="DataRegion"), + "Database": fields.Str(required=False, dump_to="Database"), + "Host": fields.Str(required=False, dump_to="Host"), + "Password": fields.Str(required=False, dump_to="Password"), + "Port": fields.Int(required=False, dump_to="Port"), + "QueryData": fields.List( + CheckUDTSTaskParamSourceMySQLNodeQueryDataSchema() + ), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "SyncData": CheckUDTSTaskParamSourceMySQLNodeSyncDataSchema( + required=False, dump_to="SyncData" + ), + "Table": fields.Str(required=False, dump_to="Table"), + "User": fields.Str(required=False, dump_to="User"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + } + + +class CheckUDTSTaskParamTargetSchema(schema.RequestSchema): + """CheckUDTSTaskParamTarget -""" + + fields = { + "DataType": fields.Str(required=False, dump_to="DataType"), + "MySQLNode": CheckUDTSTaskParamTargetMySQLNodeSchema( + required=False, dump_to="MySQLNode" + ), + "NWType": fields.Str(required=False, dump_to="NWType"), + } + + +class CheckUDTSTaskParamSourceSchema(schema.RequestSchema): + """CheckUDTSTaskParamSource -""" + + fields = { + "DataType": fields.Str(required=False, dump_to="DataType"), + "Mode": fields.Str(required=False, dump_to="Mode"), + "MySQLNode": CheckUDTSTaskParamSourceMySQLNodeSchema( + required=False, dump_to="MySQLNode" + ), + "NWType": fields.Str(required=False, dump_to="NWType"), + } + + +class CheckUDTSTaskRequestSchema(schema.RequestSchema): + """CheckUDTSTask - 对UDTS 任务提供预检查功能""" + + fields = { + "MaxRetryCount": fields.Str(required=True, dump_to="MaxRetryCount"), + "Name": fields.Str(required=True, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Query": fields.Str(required=False, dump_to="Query"), + "Source": fields.List(CheckUDTSTaskParamSourceSchema()), + "Target": CheckUDTSTaskParamTargetSchema( + required=False, dump_to="Target" + ), + "Type": fields.Str(required=True, dump_to="Type"), + } + + +class CheckUDTSTaskResponseSchema(schema.ResponseSchema): + """CheckUDTSTask - 对UDTS 任务提供预检查功能""" + + fields = { + "Action": fields.Str(required=True, load_from="Action"), + "Data": models.CheckUDTSTaskResultSchema(), + "Message": fields.Str(required=True, load_from="Message"), + "RetCode": fields.Str(required=True, load_from="RetCode"), + } + + +""" +API: CreateUDTSTask + +创建UDTS任务 +""" + + +class CreateUDTSTaskParamSourceMySQLNodeQueryDataTableDataSchema( + schema.RequestSchema +): + """CreateUDTSTaskParamSourceMySQLNodeQueryDataTableData -""" + + fields = { + "ExcludeTables": fields.Bool(required=False, dump_to="ExcludeTables"), + "TableNames": fields.Str(required=False, dump_to="TableNames"), + } + + +class CreateUDTSTaskParamSourceMySQLNodeQueryDataTableMapsSchema( + schema.RequestSchema +): + """CreateUDTSTaskParamSourceMySQLNodeQueryDataTableMaps -""" + + fields = { + "NewTableName": fields.Str(required=False, dump_to="NewTableName"), + "TableName": fields.Str(required=False, dump_to="TableName"), + } + + +class CreateUDTSTaskParamSourceMySQLNodeSyncDataSchema(schema.RequestSchema): + """CreateUDTSTaskParamSourceMySQLNodeSyncData -""" + + fields = { + "BinlogGTID": fields.Str(required=False, dump_to="BinlogGTID"), + "BinlogName": fields.Str(required=False, dump_to="BinlogName"), + "BinlogPos": fields.Int(required=False, dump_to="BinlogPos"), + "ServerID": fields.Int(required=False, dump_to="ServerID"), + } + + +class CreateUDTSTaskParamSourceMySQLNodeQueryDataSchema(schema.RequestSchema): + """CreateUDTSTaskParamSourceMySQLNodeQueryData -""" + + fields = { + "DBName": fields.Str(required=False, dump_to="DBName"), + "NewDBName": fields.Str(required=False, dump_to="NewDBName"), + "TableData": CreateUDTSTaskParamSourceMySQLNodeQueryDataTableDataSchema( + required=False, dump_to="TableData" + ), + "TableMaps": fields.List( + CreateUDTSTaskParamSourceMySQLNodeQueryDataTableMapsSchema() + ), + } + + +class CreateUDTSTaskParamSourceMySQLNodeSchema(schema.RequestSchema): + """CreateUDTSTaskParamSourceMySQLNode -""" + + fields = { + "DataRegion": fields.Str(required=False, dump_to="DataRegion"), + "Database": fields.Str(required=False, dump_to="Database"), + "DupAction": fields.Str(required=False, dump_to="DupAction"), + "Host": fields.Str(required=False, dump_to="Host"), + "KeepExistData": fields.Bool(required=False, dump_to="KeepExistData"), + "Password": fields.Str(required=False, dump_to="Password"), + "Port": fields.Int(required=False, dump_to="Port"), + "QueryData": fields.List( + CreateUDTSTaskParamSourceMySQLNodeQueryDataSchema() + ), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "SyncData": CreateUDTSTaskParamSourceMySQLNodeSyncDataSchema( + required=False, dump_to="SyncData" + ), + "Table": fields.Str(required=False, dump_to="Table"), + "User": fields.Str(required=False, dump_to="User"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + } + + +class CreateUDTSTaskParamTargetMySQLNodeSchema(schema.RequestSchema): + """CreateUDTSTaskParamTargetMySQLNode -""" + + fields = { + "DataRegion": fields.Str(required=False, dump_to="DataRegion"), + "Host": fields.Str(required=False, dump_to="Host"), + "NoBinlog": fields.Bool(required=False, dump_to="NoBinlog"), + "Password": fields.Str(required=False, dump_to="Password"), + "Port": fields.Int(required=False, dump_to="Port"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "User": fields.Str(required=False, dump_to="User"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + } + + +class CreateUDTSTaskParamSourceSchema(schema.RequestSchema): + """CreateUDTSTaskParamSource -""" + + fields = { + "BandwidthLimit": fields.Int(required=False, dump_to="BandwidthLimit"), + "DataType": fields.Str(required=True, dump_to="DataType"), + "Mode": fields.Str(required=True, dump_to="Mode"), + "MySQLNode": CreateUDTSTaskParamSourceMySQLNodeSchema( + required=False, dump_to="MySQLNode" + ), + "NWType": fields.Str(required=True, dump_to="NWType"), + } + + +class CreateUDTSTaskParamTargetSchema(schema.RequestSchema): + """CreateUDTSTaskParamTarget -""" + + fields = { + "BandwidthLimit": fields.Str(required=False, dump_to="BandwidthLimit"), + "DataType": fields.Str(required=True, dump_to="DataType"), + "Mode": fields.Str(required=True, dump_to="Mode"), + "MySQLNode": CreateUDTSTaskParamTargetMySQLNodeSchema( + required=False, dump_to="MySQLNode" + ), + "NWType": fields.Str(required=True, dump_to="NWType"), + } + + +class CreateUDTSTaskRequestSchema(schema.RequestSchema): + """CreateUDTSTask - 创建UDTS任务""" + + fields = { + "IsUnidirection": fields.Str(required=False, dump_to="IsUnidirection"), + "MaxRetryCount": fields.Str(required=False, dump_to="MaxRetryCount"), + "Name": fields.Str(required=True, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Query": fields.Str(required=False, dump_to="Query"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "Source": fields.List(CreateUDTSTaskParamSourceSchema()), + "Target": CreateUDTSTaskParamTargetSchema( + required=False, dump_to="Target" + ), + "Type": fields.Str(required=True, dump_to="Type"), + } + + +class CreateUDTSTaskResponseSchema(schema.ResponseSchema): + """CreateUDTSTask - 创建UDTS任务""" + + fields = { + "Data": fields.Str(), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: GetUDTSTaskHistory + +获取任务历史状态 +""" + + +class GetUDTSTaskHistoryRequestSchema(schema.RequestSchema): + """GetUDTSTaskHistory - 获取任务历史状态""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "TaskId": fields.Str(required=True, dump_to="TaskId"), + "Type": fields.Str(required=False, dump_to="Type"), + } + + +class GetUDTSTaskHistoryResponseSchema(schema.ResponseSchema): + """GetUDTSTaskHistory - 获取任务历史状态""" + + fields = { + "Data": fields.List( + models.TaskHistoryItemSchema(), required=True, load_from="Data" + ), + } + + +""" +API: GetUDTSTaskStatus + +查看服务状态 +""" + + +class GetUDTSTaskStatusRequestSchema(schema.RequestSchema): + """GetUDTSTaskStatus - 查看服务状态""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "TaskId": fields.Str(required=True, dump_to="TaskId"), + "Type": fields.Str(required=False, dump_to="Type"), + } + + +class GetUDTSTaskStatusResponseSchema(schema.ResponseSchema): + """GetUDTSTaskStatus - 查看服务状态""" + + fields = { + "Data": models.StatusDataSchema(), + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: ListUDTSTask + +获取用户创建的 Task 信息 +""" + + +class ListUDTSTaskRequestSchema(schema.RequestSchema): + """ListUDTSTask - 获取用户创建的 Task 信息""" + + fields = { + "Limit": fields.Str(required=False, dump_to="Limit"), + "Offset": fields.Str(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Type": fields.Str(required=False, dump_to="Type"), + } + + +class ListUDTSTaskResponseSchema(schema.ResponseSchema): + """ListUDTSTask - 获取用户创建的 Task 信息""" + + fields = { + "Data": fields.List( + models.ListDataItemSchema(), required=True, load_from="Data" + ), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: StartUDTSTask + +启动UDTS服务 +""" + + +class StartUDTSTaskRequestSchema(schema.RequestSchema): + """StartUDTSTask - 启动UDTS服务""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "TaskId": fields.Str(required=True, dump_to="TaskId"), + "Type": fields.Str(required=False, dump_to="Type"), + } + + +class StartUDTSTaskResponseSchema(schema.ResponseSchema): + """StartUDTSTask - 启动UDTS服务""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: StopUDTSTask + +停止UDTS任务 +""" + + +class StopUDTSTaskRequestSchema(schema.RequestSchema): + """StopUDTSTask - 停止UDTS任务""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "TaskId": fields.Str(required=True, dump_to="TaskId"), + "Type": fields.Str(required=False, dump_to="Type"), + } + + +class StopUDTSTaskResponseSchema(schema.ResponseSchema): + """StopUDTSTask - 停止UDTS任务""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } diff --git a/ucloud/services/udts/schemas/models.py b/ucloud/services/udts/schemas/models.py new file mode 100644 index 00000000..031bfba2 --- /dev/null +++ b/ucloud/services/udts/schemas/models.py @@ -0,0 +1,93 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class CheckResultItemSchema(schema.ResponseSchema): + """CheckResultItem - 预检查结果项""" + + fields = { + "ErrMessage": fields.Str(required=True, load_from="ErrMessage"), + "State": fields.Str(required=True, load_from="State"), + } + + +class CheckResultSchema(schema.ResponseSchema): + """CheckResult - 预检查结果""" + + fields = { + "Config": CheckResultItemSchema(), + "Connection": CheckResultItemSchema(), + "Privileges": CheckResultItemSchema(), + } + + +class CheckUDTSTaskResultSchema(schema.ResponseSchema): + """CheckUDTSTaskResult - 预检查返回的结果""" + + fields = { + "Source": CheckResultSchema(), + "Target": CheckResultSchema(), + } + + +class TaskHistoryItemSchema(schema.ResponseSchema): + """TaskHistoryItem - 任务历史记录中一条数据对应的 Model""" + + fields = { + "AntID": fields.Str(required=False, load_from="AntID"), + "AntState": fields.Str(required=False, load_from="AntState"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "CreateTimeH": fields.Str(required=False, load_from="CreateTimeH"), + } + + +class SyncDataSchema(schema.ResponseSchema): + """SyncData - 增量同步数据""" + + fields = { + "BinlogGTID": fields.Str(required=False, load_from="BinlogGTID"), + "BinlogName": fields.Str(required=True, load_from="BinlogName"), + "BinlogPos": fields.Int(required=True, load_from="BinlogPos"), + "ServerId": fields.Int(required=True, load_from="ServerId"), + } + + +class ProgressSchema(schema.ResponseSchema): + """Progress - 进度信息""" + + fields = { + "CurCount": fields.Int(required=False, load_from="CurCount"), + "CurDuration": fields.Int(required=False, load_from="CurDuration"), + "Percentage": fields.Float(required=False, load_from="Percentage"), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + "TotalDuration": fields.Int(required=False, load_from="TotalDuration"), + } + + +class StatusDataSchema(schema.ResponseSchema): + """StatusData - 动态状态信息""" + + fields = { + "CurRetryCount": fields.Int(required=False, load_from="CurRetryCount"), + "FailedMessage": fields.Str(required=False, load_from="FailedMessage"), + "MaxRetryCount": fields.Int(required=False, load_from="MaxRetryCount"), + "Progress": ProgressSchema(), + "Status": fields.Str(required=False, load_from="Status"), + "Sync": SyncDataSchema(), + } + + +class ListDataItemSchema(schema.ResponseSchema): + """ListDataItem - 返回列表的一个 Task 的信息""" + + fields = { + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "CurRetryCount": fields.Int(required=False, load_from="CurRetryCount"), + "MaxRetryCount": fields.Int(required=False, load_from="MaxRetryCount"), + "Name": fields.Str(required=False, load_from="Name"), + "Progress": ProgressSchema(), + "Status": fields.Str(required=False, load_from="Status"), + "TaskId": fields.Str(required=False, load_from="TaskId"), + "Type": fields.Str(required=False, load_from="Type"), + } diff --git a/ucloud/services/uec/__init__.py b/ucloud/services/uec/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/uec/client.py b/ucloud/services/uec/client.py new file mode 100644 index 00000000..2e610f45 --- /dev/null +++ b/ucloud/services/uec/client.py @@ -0,0 +1,1510 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.uec.schemas import apis + + +class UECClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UECClient, self).__init__(config, transport, middleware, logger) + + def bind_u_ec_firewall( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """BindUEcFirewall - 绑定防火墙,应用防火墙规则 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **FirewallId** (str) - (Required) 防火墙Id + - **ResourceId** (str) - (Required) 虚拟机资源Id或容器组资源id + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.BindUEcFirewallRequestSchema().dumps(d) + + resp = self.invoke("BindUEcFirewall", d, **kwargs) + return apis.BindUEcFirewallResponseSchema().loads(resp) + + def create_u_ec_custom_image( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUEcCustomImage - 从指定虚拟机,生成自定义镜像。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ImageName** (str) - (Required) 镜像名称 + - **NodeId** (str) - (Required) 虚拟机实例ID + - **ImageDescription** (str) - 镜像描述 + + **Response** + + - **ImageId** (str) - 镜像ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.CreateUEcCustomImageRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUEcCustomImage", d, **kwargs) + return apis.CreateUEcCustomImageResponseSchema().loads(resp) + + def create_u_ec_firewall( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUEcFirewall - 创建外网防火墙 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Name** (str) - (Required) 防火墙名称 + - **Remark** (str) - 描述 + - **Rule** (list) - 见 **CreateUEcFirewallParamRule** 模型定义 + + **Response** + + - **FirewallId** (str) - 防火墙Id + + **Request Model** + + **CreateUEcFirewallParamRule** + - **Action** (str) - ACCEPT(接受)和DROP(拒绝) + - **Port** (str) - 端口,范围用"-"符号分隔,如:1-65535 + - **Priority** (str) - 优先级:HIGH(高),MEDIUM(中),LOW(低) + - **ProtocolType** (str) - 协议,可选值:TCP,UDP,ICMP + - **Remark** (str) - 备注 + - **SrcIp** (str) - 源ip + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.CreateUEcFirewallRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUEcFirewall", d, **kwargs) + return apis.CreateUEcFirewallResponseSchema().loads(resp) + + def create_u_ec_holder( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUEcHolder - 创建容器组 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CpuCore** (float) - (Required) 容器组Cpu总核数 + - **IdcId** (str) - (Required) 机房id + - **MemSize** (int) - (Required) 容器组总内存,单位MB + - **SubnetId** (str) - (Required) 子网ID + - **Bandwidth** (int) - 外网绑定的带宽(单位M,默认0,只有当ElasticIp为yes时,默认1) + - **ChargeQuantity** (int) - 月数或者年数(默认值:1,当为按月计费时,0表示计费到月底,默认值为0) + - **ChargeType** (int) - 付费方式(2按月、3按年。默认2,默认月付) + - **ElasticIp** (str) - 绑定外网ip(yes-绑定,no-不绑定,默认no) + - **FirewallId** (str) - 防火墙ID + - **Image** (list) - 见 **CreateUEcHolderParamImage** 模型定义 + - **Name** (str) - 容器组名称(默认default) + - **Pack** (list) - 见 **CreateUEcHolderParamPack** 模型定义 + - **ProductType** (str) - 机型(normal-经济型,hf-标准型,默认normal) + - **RestartStrategy** (int) - 重启策略(0总是,1失败是,2永不,默认0) + - **Storage** (list) - 见 **CreateUEcHolderParamStorage** 模型定义 + + **Response** + + - **ResourceId** (str) - 容器组资源id + + **Request Model** + + **CreateUEcHolderParamImage** + - **Message** (str) - 镜像用户名和密码(如镜像名:密码) + - **StoreAddress** (str) - 镜像仓库地址 + + + **CreateUEcHolderParamPack** + - **Args** (str) - 容器参数(多个用;隔开) + - **Cmd** (str) - 开启容器的命令 + - **ConfigDict** (str) - 容器配置字典(多个用;隔开,如:/data1:resId1;/data2:resId2) + - **CpuCore** (float) - 容器Cpu核数 + - **Environment** (str) - 容器环境变量(多个用;隔开,如:key1:value1;key2:value2) + - **ImageName** (str) - 容器镜像名称 + - **MemSize** (int) - 容器内存,单位MB + - **Name** (str) - 容器名称 + - **WorkDir** (str) - 容器工作目录 + + + **CreateUEcHolderParamStorage** + - **Path** (str) - 存储卷挂载路径 + - **ResourceId** (str) - 存储卷资源id + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.CreateUEcHolderRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUEcHolder", d, **kwargs) + return apis.CreateUEcHolderResponseSchema().loads(resp) + + def create_u_ec_subnet( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUEcSubnet - 创建子网 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CIDR** (str) - (Required) 子网cidr + - **IdcId** (str) - (Required) 机房ID + - **Comment** (str) - 备注 + - **SubnetName** (str) - 子网名称 + + **Response** + + - **SubnetId** (str) - 子网ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.CreateUEcSubnetRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUEcSubnet", d, **kwargs) + return apis.CreateUEcSubnetResponseSchema().loads(resp) + + def create_u_ec_v_host( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUEcVHost - 创建虚拟机v2.0 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CpuCore** (int) - (Required) cpu核心数 + - **DiskSize** (int) - (Required) 数据盘大小,单位GB + - **IdcId** (str) - (Required) 机房id + - **ImageId** (str) - (Required) 镜像ID + - **MemSize** (int) - (Required) 内存大小,单位GB + - **NetLimit** (int) - (Required) 节点带宽限制,单位Mbs + - **AccountName** (str) - 账户名,默认root + - **ChargeQuantity** (int) - 月数或者年数,0计费到月底, 默认0 + - **ChargeType** (int) - 付费方式,1按时,2按月,3按年,默认2 + - **FirewallId** (str) - 外网防护墙规则组,默认 + - **Gpu** (int) - Gpu卡核心数。仅Gpu机型支持此字段 + - **GpuType** (str) - Gpu类型,枚举值["T4S"],ProductType为G时必填 + - **IsNeedOuterIp** (str) - 是否需要外网ip(no-否) + - **Isp** (list) - 运营商(1-电信,2-联通,4移动) + - **NodeCount** (int) - 创建节点数量,默认1 + - **NodeName** (str) - 节点名称 + - **PassWord** (str) - 密码 + - **ProductType** (str) - 产品类型:normal(经济型),hf(标准型),g(Gpu型) + - **SubnetId** (str) - 子网ID + - **SysDiskSize** (int) - 系统盘大小,单位GB, 默认20GB + + **Response** + + - **NodeList** (list) - 见 **NodeList** 模型定义 + + **Response Model** + + **NodeList** + - **NodeId** (str) - 虚拟机资源id + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.CreateUEcVHostRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUEcVHost", d, **kwargs) + return apis.CreateUEcVHostResponseSchema().loads(resp) + + def delete_u_ec_custom_image( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUEcCustomImage - 删除UEDN客户自定义镜像 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ImageId** (str) - (Required) 镜像ID + - **IdcId** (str) - 机房ID,带机房ID表示只删除指定机房镜像 + + **Response** + + - **ImageId** (int) - 镜像ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DeleteUEcCustomImageRequestSchema().dumps(d) + + resp = self.invoke("DeleteUEcCustomImage", d, **kwargs) + return apis.DeleteUEcCustomImageResponseSchema().loads(resp) + + def delete_u_ec_holder( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUEcHolder - 删除容器组 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **HolderId** (list) - (Required) 容器组资源id,n为0,1,2... + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DeleteUEcHolderRequestSchema().dumps(d) + + resp = self.invoke("DeleteUEcHolder", d, **kwargs) + return apis.DeleteUEcHolderResponseSchema().loads(resp) + + def delete_u_ec_subnet( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUEcSubnet - 删除子网 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **SubnetId** (str) - (Required) 子网ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DeleteUEcSubnetRequestSchema().dumps(d) + + resp = self.invoke("DeleteUEcSubnet", d, **kwargs) + return apis.DeleteUEcSubnetResponseSchema().loads(resp) + + def delete_u_ec_v_host( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUEcVHost - 删除vhost虚拟机 v2.0 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **NodeId** (list) - (Required) 节点id + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DeleteUEcVHostRequestSchema().dumps(d) + + resp = self.invoke("DeleteUEcVHost", d, **kwargs) + return apis.DeleteUEcVHostResponseSchema().loads(resp) + + def describe_u_ec_firewall( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUEcFirewall - 获取防火墙信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **FirewallId** (str) - 防火墙ID,默认为返回所有防火墙 + - **Limit** (int) - 返回数据长度,默认为20 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **ResourceId** (str) - 绑定防火墙组的虚拟机资源ID + + **Response** + + - **FirewallSet** (list) - 见 **FirewallInfo** 模型定义 + - **TotalCount** (int) - 满足条件的节点总数 + + **Response Model** + + **FirewallInfo** + - **CreateTime** (int) - 创建时间 + - **FirewallId** (str) - 防火墙Id + - **Name** (str) - 防火墙名称 + - **Remark** (str) - 描述 + - **ResourceCount** (int) - 防火墙绑定资源数量 + - **Rule** (list) - 见 **RuleInfo** 模型定义 + - **Type** (str) - 防火墙组类型,枚举值为: "user defined", 用户自定义防火墙; "recommend web", 默认Web防火墙; "recommend non web", 默认非Web防火墙 + + + **RuleInfo** + - **Action** (str) - ACCEPT(接受)和DROP(拒绝) + - **Port** (str) - 端口,范围用"-"符号分隔,如:1-65535 + - **Priority** (str) - 优先级:HIGH(高),MEDIUM(中),LOW(低) + - **ProtocolType** (str) - 协议,可选值:TCP,UDP,ICMP + - **Remark** (str) - 备注 + - **SrcIp** (str) - 源ip + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUEcFirewallRequestSchema().dumps(d) + + resp = self.invoke("DescribeUEcFirewall", d, **kwargs) + return apis.DescribeUEcFirewallResponseSchema().loads(resp) + + def describe_u_ec_firewall_resource( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUEcFirewallResource - 防火墙绑定的资源列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **FirewallId** (str) - (Required) 防火墙Id + + **Response** + + - **ResourceSet** (list) - 见 **ResourceInfo** 模型定义 + - **TotalCount** (int) - 资源总数 + + **Response Model** + + **ResourceInfo** + - **Name** (str) - 节点名称 + - **PublicIpList** (list) - 节点公网Ip列表 + - **Remark** (str) - 节点备注 + - **ResourceId** (str) - 资源Id + - **State** (int) - 节点状态,1部署中,2待启动,3启动中,4运行中,5正在停止,6已停止,7正在更新,8正在重启,9正在删除, 10已经删除,11异常 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUEcFirewallResourceRequestSchema().dumps(d) + + resp = self.invoke("DescribeUEcFirewallResource", d, **kwargs) + return apis.DescribeUEcFirewallResourceResponseSchema().loads(resp) + + def describe_u_ec_holder( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUEcHolder - 获得容器组信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **HolderId** (list) - 容器组资源id + - **Limit** (int) - 返回数据长度,默认为20,非负整数 + - **Offset** (int) - 列表起始位置偏移量,默认为0。非负整数 + + **Response** + + - **HolderList** (list) - 见 **HolderList** 模型定义 + - **TotalCount** (int) - 满足条件的容器组总数 + + **Response Model** + + **HolderList** + - **City** (str) - 城市名称 + - **CreateTime** (int) - 创建时间 + - **DockerCount** (int) - 容器数量 + - **DockerInfo** (list) - 见 **DockerInfo** 模型定义 + - **ExpireTime** (int) - 过期时间 + - **FirewallId** (str) - 外网防火墙id + - **HolderName** (str) - 容器组名称 + - **IdcId** (str) - 机房id + - **ImageList** (list) - 见 **ImageList** 模型定义 + - **InnerIp** (str) - 容器组内网ip + - **IpList** (list) - 见 **IpList** 模型定义 + - **NetLimit** (int) - 外网绑定的带宽 + - **OcName** (str) - 机房名称 + - **ProductType** (str) - 机器类型(normal经济型,hf标准型) + - **Province** (str) - 省份名称 + - **ResourceId** (str) - 容器组资源id + - **RestartStrategy** (int) - 0:总是;1:失败是;2:永不 + - **State** (int) - 容器组运行状态0:初始化;1:拉取镜像;2:启动中;3:运行中;4:错误;5:正在重启;6:正在删除;7:已经删除;8:容器运行错误;9:启动失败;99:异常 + - **StorVolumeCount** (int) - 存储卷数量 + - **StorVolumeInfo** (list) - 见 **StorVolumeInfo** 模型定义 + - **SubnetId** (str) - 容器组子网id + - **Type** (int) - 线路类型(运营商类型: 0-其它, 1-一线城市单线,2-二线城市单线, 3-全国教育网, 4-全国三通) + + + **DockerInfo** + - **Args** (str) - 参数 + - **CfgDictList** (list) - 见 **CfgDictList** 模型定义 + - **Command** (str) - 命令 + - **CpuCores** (float) - CPU核数(/核)精度0.1核 + - **EnvList** (list) - 见 **EnvList** 模型定义 + - **ImageName** (str) - 镜像名称 + - **MemSize** (float) - 内存大小(Gi) + - **Name** (str) - 容器名称 + - **State** (int) - 容器状态,0:初始化;1:拉取镜像;2:拉取镜像失败;3:启动中;4:运行中;5:正在停止;6:已停止;7:已删除;8:镜像拉取成功;9:启动失败;99:异常 + - **WorkDir** (str) - 工作目录 + + + **CfgDictList** + - **MountPath** (str) - 挂载路径 + - **Name** (str) - 名称 + - **ResourceId** (str) - 资源id + + + **EnvList** + - **Key** (str) - 环境变量key值 + - **Value** (str) - 环境变量Value值 + + + **ImageList** + - **ImageKey** (str) - 镜像密钥 + - **StoreAddr** (str) - 仓库地址 + - **UserName** (str) - 用户名称 + + + **IpList** + - **Ip** (str) - 外网ip + - **Isp** (str) - 运营商 + + + **StorVolumeInfo** + - **DiskSize** (int) - 容量(单位GB) + - **MountPoint** (str) - 挂载点 + - **Name** (str) - 名称 + - **ResourceId** (str) - 资源id + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUEcHolderRequestSchema().dumps(d) + + resp = self.invoke("DescribeUEcHolder", d, **kwargs) + return apis.DescribeUEcHolderResponseSchema().loads(resp) + + def describe_u_ec_holder_idc( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUEcHolderIDC - 获取容器组机房信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Cpu** (float) - (Required) 容器组Cpu核数 + - **Memory** (int) - (Required) 容器组内存大小(单位MB) + - **IdcId** (list) - Idc机房id。默认全部机房 + - **ProductType** (str) - 产品类型,normal标准型,hf高性能型 + - **Type** (int) - 0-其它, 1-一线城市单线,2-二线城市单线, 3-全国教育网, 4-全国三通 + + **Response** + + - **IdcList** (list) - 见 **IdcInfo** 模型定义 + + **Response Model** + + **IdcInfo** + - **City** (str) - 城市 + - **IdcId** (str) - 机房ID + - **Isp** (str) - 运营商 + - **MaxNodeCnt** (int) - 机房可创建节点最大数量 + - **Name** (str) - 机房名称 + - **Province** (str) - 省份 + - **Type** (int) - 运营商类型:0-其它, 1-一线城市单线,2-二线城市单线, 3-全国教育网, 4-全国三通 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUEcHolderIDCRequestSchema().dumps(d) + + resp = self.invoke("DescribeUEcHolderIDC", d, **kwargs) + return apis.DescribeUEcHolderIDCResponseSchema().loads(resp) + + def describe_u_ec_idc( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUEcIDC - 获取IDC机房列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Cpu** (int) - (Required) 节点cpu核数 + - **Memory** (int) - (Required) 节点内存大小, 单位GB + - **Gpu** (int) - Gpu卡核心数 + - **IdcId** (list) - Idc机房id。默认全部机房 + - **ProductType** (str) - 产品类型:normal(经济型),hf(标准型),g(GPU型) + - **Type** (int) - 0-其它, 1-一线城市单线,2-二线城市单线, 3-全国教育网, 4-全国三通 + + **Response** + + - **Action** (str) - 操作名称 + - **IdcList** (list) - 见 **IdcInfo** 模型定义 + - **RetCode** (int) - 返回码 + + **Response Model** + + **IdcInfo** + - **City** (str) - 城市 + - **IdcId** (str) - 机房ID + - **Isp** (str) - 运营商 + - **MaxNodeCnt** (int) - 机房可创建节点最大数量 + - **Name** (str) - 机房名称 + - **Province** (str) - 省份 + - **Type** (int) - 运营商类型:0-其它, 1-一线城市单线,2-二线城市单线, 3-全国教育网, 4-全国三通 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUEcIDCRequestSchema().dumps(d) + + resp = self.invoke("DescribeUEcIDC", d, **kwargs) + return apis.DescribeUEcIDCResponseSchema().loads(resp) + + def describe_u_ec_subnet( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUEcSubnet - 获取子网列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **IdcId** (str) - 机房ID + - **SubnetId** (str) - 子网ID + + **Response** + + - **SubnetList** (list) - 见 **SubnetInfo** 模型定义 + + **Response Model** + + **SubnetInfo** + - **AvailableIPCnt** (int) - 可用ip数 + - **CIDR** (str) - 子网cidr + - **Comment** (str) - 备注 + - **CreateTime** (int) - 创建时间 + - **IdcId** (str) - 机房ID + - **SubnetId** (str) - 子网ID + - **SubnetName** (str) - 子网名称 + - **TotalIpCnt** (int) - 总ip数 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUEcSubnetRequestSchema().dumps(d) + + resp = self.invoke("DescribeUEcSubnet", d, **kwargs) + return apis.DescribeUEcSubnetResponseSchema().loads(resp) + + def describe_u_ec_v_host( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUEcVHost - 获取虚拟机列表 2.0 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **IdcId** (list) - Idc机房id。默认全部机房 + - **Limit** (int) - 返回数据长度, 默认20,非负整数 + - **NodeId** (list) - 节点id,创建节点时生成的id。默认全部节点 + - **Offset** (int) - 数据偏移量,默认0,非负整数 + + **Response** + + - **NodeList** (list) - 见 **NodeInfo** 模型定义 + - **TotalCount** (int) - 满足条件的节点总数 + + **Response Model** + + **NodeInfo** + - **ChargeType** (int) - 付费类型:1按时, 2按月,3按年 + - **City** (str) - 城市 + - **CoreNum** (int) - Cpu核数 + - **CreateTime** (int) - 创建时间 + - **DiskSize** (int) - 数据盘大小, 单位GB + - **ExpiredTime** (int) - 过期时间 + - **FirewallId** (str) - 防火墙Id + - **IdcId** (str) - 机房ID + - **ImageName** (str) - 镜像名称 + - **InnerIps** (list) - 内网ip列表 + - **MemSize** (int) - 节点内存大小,单位GB + - **NetLimit** (int) - 节点带宽限制, 单位Mbs + - **NodeId** (str) - 节点ID + - **NodeIpList** (list) - 见 **NodeIpList** 模型定义 + - **NodeName** (str) - 节点名称 + - **OcName** (str) - 机房名称 + - **ProductType** (str) - 机器类型(normal-经济型,hf-标准型,g-GPU型) + - **Province** (str) - 省份 + - **State** (int) - 节点状态,1部署中,2待启动,3启动中,4运行中,5正在停止,6已停止,7正在更新,8正在重启,9正在删除, 10已经删除,11异常 + - **SysDiskSize** (int) - 系统盘大小, 单位GB + - **Type** (int) - 运营商类型: 0-其它, 1-一线城市单线,2-二线城市单线, 3-全国教育网, 4-全国三通 + + + **NodeIpList** + - **Ip** (str) - 外网ip + - **Isp** (str) - 运营商 + - **IspName** (str) - 运营商名称 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUEcVHostRequestSchema().dumps(d) + + resp = self.invoke("DescribeUEcVHost", d, **kwargs) + return apis.DescribeUEcVHostResponseSchema().loads(resp) + + def describe_u_ec_v_host_isp( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUEcVHostISP - 获取虚拟机运营商信息 + + **Request** + + - **City** (str) - 城市 + - **IspName** (str) - 运营商名称 + - **Province** (str) - 省份 + + **Response** + + - **NodeIspList** (list) - 见 **NodeIspList** 模型定义 + + **Response Model** + + **NodeIspList** + - **City** (str) - 城市 + - **IdcName** (str) - 机房名称 + - **IspName** (str) - 机房运营商名称 + - **LineType** (str) - 线路类型 + - **Province** (str) - 省份 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.DescribeUEcVHostISPRequestSchema().dumps(d) + + resp = self.invoke("DescribeUEcVHostISP", d, **kwargs) + return apis.DescribeUEcVHostISPResponseSchema().loads(resp) + + def get_u_ec_holder_log( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUEcHolderLog - 获取单个容器日志 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **PackName** (str) - (Required) 容器名称 + - **ResourceId** (str) - (Required) 容器组资源id + + **Response** + + - **Data** (str) - 返回的日志数据 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUEcHolderLogRequestSchema().dumps(d) + + resp = self.invoke("GetUEcHolderLog", d, **kwargs) + return apis.GetUEcHolderLogResponseSchema().loads(resp) + + def get_u_ec_holder_metrics( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUEcHolderMetrics - 获取容器(CPU利用率,带宽,内存)数据 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **PackName** (str) - (Required) 容器名称 + - **ResourceId** (str) - (Required) 容器组资源id + - **Type** (list) - (Required) n为0 CPU利用率, 1内存使用率, 2网卡出带宽, 3网卡入带宽, 4网卡出包数, 5网卡入包数 + - **EndTime** (int) - 结束时间 + - **StartTime** (int) - 开始时间 + + **Response** + + - **DataSets** (dict) - 见 **MetricisDataSet** 模型定义 + + **Response Model** + + **MetricisDataSet** + - **CPUUtilization** (list) - 见 **MonitorInfo** 模型定义 + - **MemUtilization** (list) - 见 **MonitorInfo** 模型定义 + - **NICIn** (list) - 见 **MonitorInfo** 模型定义 + - **NICOut** (list) - 见 **MonitorInfo** 模型定义 + - **NetPacketIn** (list) - 见 **MonitorInfo** 模型定义 + - **NetPacketOut** (list) - 见 **MonitorInfo** 模型定义 + + + **MonitorInfo** + - **TimeStamp** (int) - 时间戳 + - **Value** (int) - 值 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUEcHolderMetricsRequestSchema().dumps(d) + + resp = self.invoke("GetUEcHolderMetrics", d, **kwargs) + return apis.GetUEcHolderMetricsResponseSchema().loads(resp) + + def get_u_ec_idc_cut_info( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUEcIDCCutInfo - 获取机房割接信息 + + **Request** + + + **Response** + + - **IDCCutInfo** (list) - 见 **IDCCutInfo** 模型定义 + - **TotalCount** (int) - 满足条件的机房总数 + + **Response Model** + + **IDCCutInfo** + - **City** (str) - 城市 + - **CutType** (str) - 割接类型(中断、抖动、断电) + - **EndTime** (int) - 割接结束时间 + - **IDCName** (str) - 机房名称 + - **Province** (str) - 省份 + - **ResourceSet** (list) - 见 **ResourceSet** 模型定义 + - **StartTime** (int) - 割接开始时间 + + + **ResourceSet** + - **NodeId** (str) - 节点id + - **OuterIps** (list) - 机器外网ip集合 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.GetUEcIDCCutInfoRequestSchema().dumps(d) + + resp = self.invoke("GetUEcIDCCutInfo", d, **kwargs) + return apis.GetUEcIDCCutInfoResponseSchema().loads(resp) + + def get_u_ec_idcv_host_data( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUEcIDCVHostData - 获取机房虚拟机监控数据 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **NodeId** (list) - (Required) 节点资源id;n为0,1,2... + - **Type** (list) - (Required) 监控数据类型;n为0,1,2,3,4...,9 + - **BeginTime** (int) - 开始时间戳 + - **EndTime** (int) - 结束时间戳 + + **Response** + + - **DataSets** (dict) - 见 **DataSet** 模型定义 + + **Response Model** + + **DataSet** + - **CPUUtilization** (list) - 见 **MonitorInfo** 模型定义 + - **DiskReadOps** (list) - 见 **MonitorInfo** 模型定义 + - **DiskWriteOps** (list) - 见 **MonitorInfo** 模型定义 + - **IORead** (list) - 见 **MonitorInfo** 模型定义 + - **IOWrite** (list) - 见 **MonitorInfo** 模型定义 + - **MemUtilization** (list) - 见 **MonitorInfo** 模型定义 + - **NICIn** (list) - 见 **MonitorInfo** 模型定义 + - **NICOut** (list) - 见 **MonitorInfo** 模型定义 + - **NetPacketIn** (list) - 见 **MonitorInfo** 模型定义 + - **NetPacketOut** (list) - 见 **MonitorInfo** 模型定义 + + + **MonitorInfo** + - **TimeStamp** (int) - 时间戳 + - **Value** (int) - 值 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUEcIDCVHostDataRequestSchema().dumps(d) + + resp = self.invoke("GetUEcIDCVHostData", d, **kwargs) + return apis.GetUEcIDCVHostDataResponseSchema().loads(resp) + + def get_u_ec_image( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUEcImage - uec2.0 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ImageType** (str) - 镜像类型:1标准镜像,2行业镜像,3自定义镜像 + - **Limit** (int) - 返回数据长度, 默认20,非负整数 + - **Offset** (int) - 数据偏移量,默认0,非负整数 + + **Response** + + - **ImageList** (list) - 见 **ImageInfo** 模型定义 + - **TotalCount** (int) - 镜像总数 + + **Response Model** + + **ImageInfo** + - **CreateTime** (int) - 镜像创建时间戳 + - **DeployInfoList** (list) - 见 **DeployImageInfo** 模型定义 + - **Gpu** (int) - 是否支持Gpu(1-支持,0-不支持) + - **ImageDesc** (str) - 镜像描述 + - **ImageId** (str) - 镜像ID + - **ImageName** (str) - 镜像名称 + - **ImageSize** (int) - 镜像大小,单位GB + - **ImageType** (int) - 镜像类型:1标准镜像,2行业镜像,3自定义镜像 + - **OcType** (str) - 系统类型:unix, windows + - **State** (int) - 镜像状态:镜像状态 1可用,2不可用,3制作中 + + + **DeployImageInfo** + - **IdcId** (str) - 机房ID + - **State** (int) - 镜像状态 1-可用, 2-不可用, 3-获取中, 4-转换中, 5-部署中 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUEcImageRequestSchema().dumps(d) + + resp = self.invoke("GetUEcImage", d, **kwargs) + return apis.GetUEcImageResponseSchema().loads(resp) + + def get_u_ec_pod_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUEcPodPrice - 获得容器组价格 + + **Request** + + - **IdcId** (str) - (Required) 机房id + - **Bandwidth** (int) - 绑定的带宽,默认0,当绑定外网IP时默认1(单位M) + - **ChargeQuantity** (int) - 月数或年数(默认值:1,当支付类型为按月时,默认值为0) + - **ChargeType** (int) - 支付类型(2按月,3按年,默认2) + - **CpuCore** (float) - 容器组总Cpu核心数 + - **ElasticIp** (str) - 是否绑定外网IP(yes:是,no:否,默认:no) + - **MemSize** (int) - 容器组总内存大小(单位M) + - **ProductType** (str) - 产品类型(normal:标准型,hf:高性能型,默认:normal) + + **Response** + + - **HolderPrice** (float) - 容器组价格 + - **IpPrice** (float) - IP和带宽价格 + + """ + # build request + d = {} + req and d.update(req) + d = apis.GetUEcPodPriceRequestSchema().dumps(d) + + resp = self.invoke("GetUEcPodPrice", d, **kwargs) + return apis.GetUEcPodPriceResponseSchema().loads(resp) + + def get_u_ec_upgrade_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUEcUpgradePrice - 获取虚拟机调整差价 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **NodeId** (str) - (Required) 虚拟机资源ID + - **CpuCore** (int) - cpu核心数 + - **DiskSize** (int) - 数据盘大小,单位GB + - **MemSize** (int) - 内存大小,单位GB + - **NetLimit** (int) - 节点带宽限制,单位Mbs + - **SysDiskSize** (int) - 系统盘大小,单位GB + + **Response** + + - **Price** (int) - 规格调整差价 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUEcUpgradePriceRequestSchema().dumps(d) + + resp = self.invoke("GetUEcUpgradePrice", d, **kwargs) + return apis.GetUEcUpgradePriceResponseSchema().loads(resp) + + def get_u_ec_v_host_data( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUEcVHostData - 获取虚拟机监控数据 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **NodeId** (str) - (Required) 节点id + - **Type** (list) - (Required) 0CPU使用率, 1内存使用率, 2 网卡出流量, 3网卡入流量, 4网卡出包量, 5网卡入包量, 6磁盘读流量, 7磁盘写流量, 8磁盘读次数, 9磁盘写次数 + - **BeginTime** (int) - 查询起始时间 + - **EndTime** (int) - 查询结束时间 + + **Response** + + - **Action** (str) - 操作名称 + - **DataSets** (dict) - 见 **DataSet** 模型定义 + - **RetCode** (int) - 返回码 + + **Response Model** + + **DataSet** + - **CPUUtilization** (list) - 见 **MonitorInfo** 模型定义 + - **DiskReadOps** (list) - 见 **MonitorInfo** 模型定义 + - **DiskWriteOps** (list) - 见 **MonitorInfo** 模型定义 + - **IORead** (list) - 见 **MonitorInfo** 模型定义 + - **IOWrite** (list) - 见 **MonitorInfo** 模型定义 + - **MemUtilization** (list) - 见 **MonitorInfo** 模型定义 + - **NICIn** (list) - 见 **MonitorInfo** 模型定义 + - **NICOut** (list) - 见 **MonitorInfo** 模型定义 + - **NetPacketIn** (list) - 见 **MonitorInfo** 模型定义 + - **NetPacketOut** (list) - 见 **MonitorInfo** 模型定义 + + + **MonitorInfo** + - **TimeStamp** (int) - 时间戳 + - **Value** (int) - 值 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUEcVHostDataRequestSchema().dumps(d) + + resp = self.invoke("GetUEcVHostData", d, **kwargs) + return apis.GetUEcVHostDataResponseSchema().loads(resp) + + def get_u_ec_v_host_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUEcVHostPrice - 获取虚拟机价格 + + **Request** + + - **IdcId** (str) - (Required) 机房Id + - **ChargeQuantity** (int) - 月数或者年数,0计费到月底, 默认0 + - **ChargeType** (int) - 付费方式,1按时,2按月,3按年,默认2 + - **CpuCore** (int) - CPU核数 + - **DiskSize** (int) - 数据盘大小,单位GB + - **Gpu** (int) - Gpu卡核心数。仅Gpu机型支持此字段 + - **GpuType** (str) - Gpu类型,枚举值["T4"],ProductType为g时必填 + - **IpCount** (int) - 外网IP的数量,默认1 + - **MemSize** (int) - 内存大小,单位GB + - **NetLimit** (int) - 网络带宽限速,单位Mbs + - **NodeCount** (int) - 节点数量,默认1 + - **ProductType** (str) - 产品类型:normal(经济型),hf(标准型),g(Gpu型),默认normal + - **SysDiskSize** (int) - 系统盘大小,单位GB + + **Response** + + - **IpPrice** (float) - Ip和带宽价格 + - **NodePrice** (float) - 节点价格 + + """ + # build request + d = {} + req and d.update(req) + d = apis.GetUEcVHostPriceRequestSchema().dumps(d) + + resp = self.invoke("GetUEcVHostPrice", d, **kwargs) + return apis.GetUEcVHostPriceResponseSchema().loads(resp) + + def import_u_ec_custom_image( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ImportUEcCustomImage - 导入自定义镜像 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Format** (str) - 镜像格式,可选RAW、qcow2, 不带镜像ID时必填 + - **IdcId** (list) - 镜像需要导入机房,默认分发到所有机房 + - **ImageDesc** (str) - 镜像描述 + - **ImageId** (str) - 镜像Id,不传参表示新导入镜像,传参表示已有镜像分发到指定机房 + - **ImageName** (str) - 镜像名称,不带镜像ID时必填 + - **OsType** (str) - 操作系统平台,linux、windows(当前版本暂不支持windows),不带镜像ID时必填 + - **UFileUrl** (str) - UFile镜像文件下载地址,不带镜像ID时必填 + + **Response** + + - **ImageId** (str) - 镜像Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ImportUEcCustomImageRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("ImportUEcCustomImage", d, **kwargs) + return apis.ImportUEcCustomImageResponseSchema().loads(resp) + + def login_u_ec_docker( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """LoginUEcDocker - 登录容器 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Name** (str) - (Required) 容器名称 + - **ResourceId** (str) - (Required) 容器组资源id + + **Response** + + - **Link** (str) - 登录地址 + - **LinkPort** (int) - 登录端口 + - **SessionId** (str) - 返回的token + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.LoginUEcDockerRequestSchema().dumps(d) + + resp = self.invoke("LoginUEcDocker", d, **kwargs) + return apis.LoginUEcDockerResponseSchema().loads(resp) + + def modify_u_ec_bandwidth( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUEcBandwidth - 修改节点带宽限制 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **NetLimit** (str) - (Required) 节点带宽限制,单位Mbs + - **NodeId** (str) - (Required) 节点Id + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyUEcBandwidthRequestSchema().dumps(d) + + resp = self.invoke("ModifyUEcBandwidth", d, **kwargs) + return apis.ModifyUEcBandwidthResponseSchema().loads(resp) + + def modify_u_ec_holder_name( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUEcHolderName - 修改容器组名称 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Name** (str) - (Required) 容器组名称 + - **ResourceId** (str) - (Required) 容器组资源id + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyUEcHolderNameRequestSchema().dumps(d) + + resp = self.invoke("ModifyUEcHolderName", d, **kwargs) + return apis.ModifyUEcHolderNameResponseSchema().loads(resp) + + def modify_u_ec_image_name( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUEcImageName - 修改镜像名称 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ImageId** (str) - (Required) 镜像ID + - **ImageName** (str) - (Required) 镜像名称 + - **ImageDesc** (str) - 镜像描述 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyUEcImageNameRequestSchema().dumps(d) + + resp = self.invoke("ModifyUEcImageName", d, **kwargs) + return apis.ModifyUEcImageNameResponseSchema().loads(resp) + + def poweroff_u_ec_v_host( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """PoweroffUEcVHost - 虚拟机断电 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **NodeId** (list) - (Required) 虚拟机资源ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.PoweroffUEcVHostRequestSchema().dumps(d) + + resp = self.invoke("PoweroffUEcVHost", d, **kwargs) + return apis.PoweroffUEcVHostResponseSchema().loads(resp) + + def reinstall_u_ec_v_host( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ReinstallUEcVHost - 虚拟机重装系统 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ImageId** (str) - (Required) 镜像ID + - **NodeId** (str) - (Required) 虚拟机资源ID + - **KeepData** (int) - 是否保留数据盘数据, 0-不保留,1-保留,默认为1 + - **Password** (str) - 节点密码 + - **SysDiskSize** (int) - 系统盘大小,单位GB + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ReinstallUEcVHostRequestSchema().dumps(d) + + resp = self.invoke("ReinstallUEcVHost", d, **kwargs) + return apis.ReinstallUEcVHostResponseSchema().loads(resp) + + def restart_u_ec_holder( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RestartUEcHolder - 重启容器组 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ResourceId** (list) - (Required) 容器组资源id,n为0,1,2... + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.RestartUEcHolderRequestSchema().dumps(d) + + resp = self.invoke("RestartUEcHolder", d, **kwargs) + return apis.RestartUEcHolderResponseSchema().loads(resp) + + def restart_u_ec_v_host( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RestartUEcVHost - 重启虚拟机v2.0 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **NodeId** (list) - (Required) 节点id + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.RestartUEcVHostRequestSchema().dumps(d) + + resp = self.invoke("RestartUEcVHost", d, **kwargs) + return apis.RestartUEcVHostResponseSchema().loads(resp) + + def start_u_ec_v_host( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """StartUEcVHost - 启动UEC虚拟机 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **NodeId** (list) - (Required) 虚拟机资源ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.StartUEcVHostRequestSchema().dumps(d) + + resp = self.invoke("StartUEcVHost", d, **kwargs) + return apis.StartUEcVHostResponseSchema().loads(resp) + + def stop_u_ec_v_host( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """StopUEcVHost - 停止UEC虚拟机 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **NodeId** (list) - (Required) 虚拟机资源ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.StopUEcVHostRequestSchema().dumps(d) + + resp = self.invoke("StopUEcVHost", d, **kwargs) + return apis.StopUEcVHostResponseSchema().loads(resp) + + def un_bind_u_ec_firewall( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UnBindUEcFirewall - 解绑防火墙 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **FirewallId** (str) - (Required) 防火墙Id + - **ResourceId** (str) - (Required) 节点Id或容器组资源id + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.UnBindUEcFirewallRequestSchema().dumps(d) + + resp = self.invoke("UnBindUEcFirewall", d, **kwargs) + return apis.UnBindUEcFirewallResponseSchema().loads(resp) + + def update_u_ec_firewall( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateUEcFirewall - 更新防火墙信息,新增和删除规则 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **FirewallId** (str) - (Required) 防火墙Id + - **Rule** (list) - 见 **UpdateUEcFirewallParamRule** 模型定义 + + **Response** + + + **Request Model** + + **UpdateUEcFirewallParamRule** + - **Action** (str) - ACCEPT(接受)和DROP(拒绝) + - **Port** (str) - 端口,范围用"-"符号分隔,如:1-65535 + - **Priority** (str) - 优先级:HIGH(高),MEDIUM(中),LOW(低) + - **ProtocolType** (str) - 协议,可选值:TCP,UDP,ICMP + - **Remark** (str) - 备注 + - **SrcIp** (str) - 源ip + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.UpdateUEcFirewallRequestSchema().dumps(d) + + resp = self.invoke("UpdateUEcFirewall", d, **kwargs) + return apis.UpdateUEcFirewallResponseSchema().loads(resp) + + def update_u_ec_firewall_attribute( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateUEcFirewallAttribute - 更新防火墙名称及描述 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **FirewallId** (str) - (Required) 防火墙Id + - **Name** (str) - 防火墙名称 + - **Remark** (str) - 描述 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.UpdateUEcFirewallAttributeRequestSchema().dumps(d) + + resp = self.invoke("UpdateUEcFirewallAttribute", d, **kwargs) + return apis.UpdateUEcFirewallAttributeResponseSchema().loads(resp) + + def update_u_ec_subnet( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateUEcSubnet - 更新子网信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **SubnetId** (str) - (Required) 子网ID + - **Comment** (str) - 备注 + - **SubnetName** (str) - 子网名称 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.UpdateUEcSubnetRequestSchema().dumps(d) + + resp = self.invoke("UpdateUEcSubnet", d, **kwargs) + return apis.UpdateUEcSubnetResponseSchema().loads(resp) diff --git a/ucloud/services/uec/schemas/__init__.py b/ucloud/services/uec/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/uec/schemas/apis.py b/ucloud/services/uec/schemas/apis.py new file mode 100644 index 00000000..44acaf50 --- /dev/null +++ b/ucloud/services/uec/schemas/apis.py @@ -0,0 +1,1195 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.uec.schemas import models + +""" UEC API Schema +""" + + +""" +API: BindUEcFirewall + +绑定防火墙,应用防火墙规则 +""" + + +class BindUEcFirewallRequestSchema(schema.RequestSchema): + """BindUEcFirewall - 绑定防火墙,应用防火墙规则""" + + fields = { + "FirewallId": fields.Str(required=True, dump_to="FirewallId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class BindUEcFirewallResponseSchema(schema.ResponseSchema): + """BindUEcFirewall - 绑定防火墙,应用防火墙规则""" + + fields = {} + + +""" +API: CreateUEcCustomImage + +从指定虚拟机,生成自定义镜像。 +""" + + +class CreateUEcCustomImageRequestSchema(schema.RequestSchema): + """CreateUEcCustomImage - 从指定虚拟机,生成自定义镜像。""" + + fields = { + "ImageDescription": fields.Str( + required=False, dump_to="ImageDescription" + ), + "ImageName": fields.Str(required=True, dump_to="ImageName"), + "NodeId": fields.Str(required=True, dump_to="NodeId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class CreateUEcCustomImageResponseSchema(schema.ResponseSchema): + """CreateUEcCustomImage - 从指定虚拟机,生成自定义镜像。""" + + fields = { + "ImageId": fields.Str(required=True, load_from="ImageId"), + } + + +""" +API: CreateUEcFirewall + +创建外网防火墙 +""" + + +class CreateUEcFirewallParamRuleSchema(schema.RequestSchema): + """CreateUEcFirewallParamRule -""" + + fields = { + "Action": fields.Str(required=True, dump_to="Action"), + "Port": fields.Str(required=True, dump_to="Port"), + "Priority": fields.Str(required=True, dump_to="Priority"), + "ProtocolType": fields.Str(required=True, dump_to="ProtocolType"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "SrcIp": fields.Str(required=True, dump_to="SrcIp"), + } + + +class CreateUEcFirewallRequestSchema(schema.RequestSchema): + """CreateUEcFirewall - 创建外网防火墙""" + + fields = { + "Name": fields.Str(required=True, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "Rule": fields.List(CreateUEcFirewallParamRuleSchema()), + } + + +class CreateUEcFirewallResponseSchema(schema.ResponseSchema): + """CreateUEcFirewall - 创建外网防火墙""" + + fields = { + "FirewallId": fields.Str(required=True, load_from="FirewallId"), + } + + +""" +API: CreateUEcHolder + +创建容器组 +""" + + +class CreateUEcHolderParamImageSchema(schema.RequestSchema): + """CreateUEcHolderParamImage -""" + + fields = { + "Message": fields.Str(required=False, dump_to="Message"), + "StoreAddress": fields.Str(required=False, dump_to="StoreAddress"), + } + + +class CreateUEcHolderParamPackSchema(schema.RequestSchema): + """CreateUEcHolderParamPack -""" + + fields = { + "Args": fields.Str(required=False, dump_to="Args"), + "Cmd": fields.Str(required=False, dump_to="Cmd"), + "ConfigDict": fields.Str(required=False, dump_to="ConfigDict"), + "CpuCore": fields.Float(required=False, dump_to="CpuCore"), + "Environment": fields.Str(required=False, dump_to="Environment"), + "ImageName": fields.Str(required=False, dump_to="ImageName"), + "MemSize": fields.Int(required=False, dump_to="MemSize"), + "Name": fields.Str(required=False, dump_to="Name"), + "WorkDir": fields.Str(required=False, dump_to="WorkDir"), + } + + +class CreateUEcHolderParamStorageSchema(schema.RequestSchema): + """CreateUEcHolderParamStorage -""" + + fields = { + "Path": fields.Str(required=False, dump_to="Path"), + "ResourceId": fields.Str(required=False, dump_to="ResourceId"), + } + + +class CreateUEcHolderRequestSchema(schema.RequestSchema): + """CreateUEcHolder - 创建容器组""" + + fields = { + "Bandwidth": fields.Int(required=False, dump_to="Bandwidth"), + "ChargeQuantity": fields.Int(required=False, dump_to="ChargeQuantity"), + "ChargeType": fields.Int(required=False, dump_to="ChargeType"), + "CpuCore": fields.Float(required=True, dump_to="CpuCore"), + "ElasticIp": fields.Str(required=False, dump_to="ElasticIp"), + "FirewallId": fields.Str(required=False, dump_to="FirewallId"), + "IdcId": fields.Str(required=True, dump_to="IdcId"), + "Image": fields.List(CreateUEcHolderParamImageSchema()), + "MemSize": fields.Int(required=True, dump_to="MemSize"), + "Name": fields.Str(required=False, dump_to="Name"), + "Pack": fields.List(CreateUEcHolderParamPackSchema()), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "RestartStrategy": fields.Int( + required=False, dump_to="RestartStrategy" + ), + "Storage": fields.List(CreateUEcHolderParamStorageSchema()), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + } + + +class CreateUEcHolderResponseSchema(schema.ResponseSchema): + """CreateUEcHolder - 创建容器组""" + + fields = { + "ResourceId": fields.Str(required=False, load_from="ResourceId"), + } + + +""" +API: CreateUEcSubnet + +创建子网 +""" + + +class CreateUEcSubnetRequestSchema(schema.RequestSchema): + """CreateUEcSubnet - 创建子网""" + + fields = { + "CIDR": fields.Str(required=True, dump_to="CIDR"), + "Comment": fields.Str(required=False, dump_to="Comment"), + "IdcId": fields.Str(required=True, dump_to="IdcId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "SubnetName": fields.Str(required=False, dump_to="SubnetName"), + } + + +class CreateUEcSubnetResponseSchema(schema.ResponseSchema): + """CreateUEcSubnet - 创建子网""" + + fields = { + "SubnetId": fields.Str(required=True, load_from="SubnetId"), + } + + +""" +API: CreateUEcVHost + +创建虚拟机v2.0 +""" + + +class CreateUEcVHostRequestSchema(schema.RequestSchema): + """CreateUEcVHost - 创建虚拟机v2.0""" + + fields = { + "AccountName": fields.Str(required=False, dump_to="AccountName"), + "ChargeQuantity": fields.Int(required=False, dump_to="ChargeQuantity"), + "ChargeType": fields.Int(required=False, dump_to="ChargeType"), + "CpuCore": fields.Int(required=True, dump_to="CpuCore"), + "DiskSize": fields.Int(required=True, dump_to="DiskSize"), + "FirewallId": fields.Str(required=False, dump_to="FirewallId"), + "Gpu": fields.Int(required=False, dump_to="Gpu"), + "GpuType": fields.Str(required=False, dump_to="GpuType"), + "IdcId": fields.Str(required=True, dump_to="IdcId"), + "ImageId": fields.Str(required=True, dump_to="ImageId"), + "IsNeedOuterIp": fields.Str(required=False, dump_to="IsNeedOuterIp"), + "Isp": fields.List(fields.Int()), + "MemSize": fields.Int(required=True, dump_to="MemSize"), + "NetLimit": fields.Int(required=True, dump_to="NetLimit"), + "NodeCount": fields.Int(required=False, dump_to="NodeCount"), + "NodeName": fields.Str(required=False, dump_to="NodeName"), + "PassWord": fields.Str(required=False, dump_to="PassWord"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "SysDiskSize": fields.Int(required=False, dump_to="SysDiskSize"), + } + + +class CreateUEcVHostResponseSchema(schema.ResponseSchema): + """CreateUEcVHost - 创建虚拟机v2.0""" + + fields = { + "NodeList": fields.List( + models.NodeListSchema(), required=True, load_from="NodeList" + ), + } + + +""" +API: DeleteUEcCustomImage + +删除UEDN客户自定义镜像 +""" + + +class DeleteUEcCustomImageRequestSchema(schema.RequestSchema): + """DeleteUEcCustomImage - 删除UEDN客户自定义镜像""" + + fields = { + "IdcId": fields.Str(required=False, dump_to="IdcId"), + "ImageId": fields.Str(required=True, dump_to="ImageId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class DeleteUEcCustomImageResponseSchema(schema.ResponseSchema): + """DeleteUEcCustomImage - 删除UEDN客户自定义镜像""" + + fields = { + "ImageId": fields.Int(required=True, load_from="ImageId"), + } + + +""" +API: DeleteUEcHolder + +删除容器组 +""" + + +class DeleteUEcHolderRequestSchema(schema.RequestSchema): + """DeleteUEcHolder - 删除容器组""" + + fields = { + "HolderId": fields.List(fields.Str()), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class DeleteUEcHolderResponseSchema(schema.ResponseSchema): + """DeleteUEcHolder - 删除容器组""" + + fields = {} + + +""" +API: DeleteUEcSubnet + +删除子网 +""" + + +class DeleteUEcSubnetRequestSchema(schema.RequestSchema): + """DeleteUEcSubnet - 删除子网""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + } + + +class DeleteUEcSubnetResponseSchema(schema.ResponseSchema): + """DeleteUEcSubnet - 删除子网""" + + fields = {} + + +""" +API: DeleteUEcVHost + +删除vhost虚拟机 v2.0 +""" + + +class DeleteUEcVHostRequestSchema(schema.RequestSchema): + """DeleteUEcVHost - 删除vhost虚拟机 v2.0""" + + fields = { + "NodeId": fields.List(fields.Str()), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class DeleteUEcVHostResponseSchema(schema.ResponseSchema): + """DeleteUEcVHost - 删除vhost虚拟机 v2.0""" + + fields = {} + + +""" +API: DescribeUEcFirewall + +获取防火墙信息 +""" + + +class DescribeUEcFirewallRequestSchema(schema.RequestSchema): + """DescribeUEcFirewall - 获取防火墙信息""" + + fields = { + "FirewallId": fields.Str(required=False, dump_to="FirewallId"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ResourceId": fields.Str(required=False, dump_to="ResourceId"), + } + + +class DescribeUEcFirewallResponseSchema(schema.ResponseSchema): + """DescribeUEcFirewall - 获取防火墙信息""" + + fields = { + "FirewallSet": fields.List( + models.FirewallInfoSchema(), required=False, load_from="FirewallSet" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeUEcFirewallResource + +防火墙绑定的资源列表 +""" + + +class DescribeUEcFirewallResourceRequestSchema(schema.RequestSchema): + """DescribeUEcFirewallResource - 防火墙绑定的资源列表""" + + fields = { + "FirewallId": fields.Str(required=True, dump_to="FirewallId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class DescribeUEcFirewallResourceResponseSchema(schema.ResponseSchema): + """DescribeUEcFirewallResource - 防火墙绑定的资源列表""" + + fields = { + "ResourceSet": fields.List( + models.ResourceInfoSchema(), required=True, load_from="ResourceSet" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeUEcHolder + +获得容器组信息 +""" + + +class DescribeUEcHolderRequestSchema(schema.RequestSchema): + """DescribeUEcHolder - 获得容器组信息""" + + fields = { + "HolderId": fields.List(fields.Str()), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class DescribeUEcHolderResponseSchema(schema.ResponseSchema): + """DescribeUEcHolder - 获得容器组信息""" + + fields = { + "HolderList": fields.List( + models.HolderListSchema(), required=True, load_from="HolderList" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeUEcHolderIDC + +获取容器组机房信息 +""" + + +class DescribeUEcHolderIDCRequestSchema(schema.RequestSchema): + """DescribeUEcHolderIDC - 获取容器组机房信息""" + + fields = { + "Cpu": fields.Float(required=True, dump_to="Cpu"), + "IdcId": fields.List(fields.Str()), + "Memory": fields.Int(required=True, dump_to="Memory"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Type": fields.Int(required=False, dump_to="Type"), + } + + +class DescribeUEcHolderIDCResponseSchema(schema.ResponseSchema): + """DescribeUEcHolderIDC - 获取容器组机房信息""" + + fields = { + "IdcList": fields.List( + models.IdcInfoSchema(), required=True, load_from="IdcList" + ), + } + + +""" +API: DescribeUEcIDC + +获取IDC机房列表 +""" + + +class DescribeUEcIDCRequestSchema(schema.RequestSchema): + """DescribeUEcIDC - 获取IDC机房列表""" + + fields = { + "Cpu": fields.Int(required=True, dump_to="Cpu"), + "Gpu": fields.Int(required=False, dump_to="Gpu"), + "IdcId": fields.List(fields.Str()), + "Memory": fields.Int(required=True, dump_to="Memory"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Type": fields.Int(required=False, dump_to="Type"), + } + + +class DescribeUEcIDCResponseSchema(schema.ResponseSchema): + """DescribeUEcIDC - 获取IDC机房列表""" + + fields = { + "Action": fields.Str(required=True, load_from="Action"), + "IdcList": fields.List( + models.IdcInfoSchema(), required=False, load_from="IdcList" + ), + "RetCode": fields.Int(required=True, load_from="RetCode"), + } + + +""" +API: DescribeUEcSubnet + +获取子网列表 +""" + + +class DescribeUEcSubnetRequestSchema(schema.RequestSchema): + """DescribeUEcSubnet - 获取子网列表""" + + fields = { + "IdcId": fields.Str(required=False, dump_to="IdcId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + } + + +class DescribeUEcSubnetResponseSchema(schema.ResponseSchema): + """DescribeUEcSubnet - 获取子网列表""" + + fields = { + "SubnetList": fields.List( + models.SubnetInfoSchema(), required=False, load_from="SubnetList" + ), + } + + +""" +API: DescribeUEcVHost + +获取虚拟机列表 2.0 +""" + + +class DescribeUEcVHostRequestSchema(schema.RequestSchema): + """DescribeUEcVHost - 获取虚拟机列表 2.0""" + + fields = { + "IdcId": fields.List(fields.Str()), + "Limit": fields.Int(required=False, dump_to="Limit"), + "NodeId": fields.List(fields.Str()), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class DescribeUEcVHostResponseSchema(schema.ResponseSchema): + """DescribeUEcVHost - 获取虚拟机列表 2.0""" + + fields = { + "NodeList": fields.List( + models.NodeInfoSchema(), required=False, load_from="NodeList" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeUEcVHostISP + +获取虚拟机运营商信息 +""" + + +class DescribeUEcVHostISPRequestSchema(schema.RequestSchema): + """DescribeUEcVHostISP - 获取虚拟机运营商信息""" + + fields = { + "City": fields.Str(required=False, dump_to="City"), + "IspName": fields.Str(required=False, dump_to="IspName"), + "Province": fields.Str(required=False, dump_to="Province"), + } + + +class DescribeUEcVHostISPResponseSchema(schema.ResponseSchema): + """DescribeUEcVHostISP - 获取虚拟机运营商信息""" + + fields = { + "NodeIspList": fields.List( + models.NodeIspListSchema(), required=True, load_from="NodeIspList" + ), + } + + +""" +API: GetUEcHolderLog + +获取单个容器日志 +""" + + +class GetUEcHolderLogRequestSchema(schema.RequestSchema): + """GetUEcHolderLog - 获取单个容器日志""" + + fields = { + "PackName": fields.Str(required=True, dump_to="PackName"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class GetUEcHolderLogResponseSchema(schema.ResponseSchema): + """GetUEcHolderLog - 获取单个容器日志""" + + fields = { + "Data": fields.Str(required=False, load_from="Data"), + } + + +""" +API: GetUEcHolderMetrics + +获取容器(CPU利用率,带宽,内存)数据 +""" + + +class GetUEcHolderMetricsRequestSchema(schema.RequestSchema): + """GetUEcHolderMetrics - 获取容器(CPU利用率,带宽,内存)数据""" + + fields = { + "EndTime": fields.Int(required=False, dump_to="EndTime"), + "PackName": fields.Str(required=True, dump_to="PackName"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + "StartTime": fields.Int(required=False, dump_to="StartTime"), + "Type": fields.List(fields.Str()), + } + + +class GetUEcHolderMetricsResponseSchema(schema.ResponseSchema): + """GetUEcHolderMetrics - 获取容器(CPU利用率,带宽,内存)数据""" + + fields = { + "DataSets": models.MetricisDataSetSchema(), + } + + +""" +API: GetUEcIDCCutInfo + +获取机房割接信息 +""" + + +class GetUEcIDCCutInfoRequestSchema(schema.RequestSchema): + """GetUEcIDCCutInfo - 获取机房割接信息""" + + fields = {} + + +class GetUEcIDCCutInfoResponseSchema(schema.ResponseSchema): + """GetUEcIDCCutInfo - 获取机房割接信息""" + + fields = { + "IDCCutInfo": fields.List( + models.IDCCutInfoSchema(), required=True, load_from="IDCCutInfo" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: GetUEcIDCVHostData + +获取机房虚拟机监控数据 +""" + + +class GetUEcIDCVHostDataRequestSchema(schema.RequestSchema): + """GetUEcIDCVHostData - 获取机房虚拟机监控数据""" + + fields = { + "BeginTime": fields.Int(required=False, dump_to="BeginTime"), + "EndTime": fields.Int(required=False, dump_to="EndTime"), + "NodeId": fields.List(fields.Str()), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Type": fields.List(fields.Str()), + } + + +class GetUEcIDCVHostDataResponseSchema(schema.ResponseSchema): + """GetUEcIDCVHostData - 获取机房虚拟机监控数据""" + + fields = { + "DataSets": models.DataSetSchema(), + } + + +""" +API: GetUEcImage + +uec2.0 +""" + + +class GetUEcImageRequestSchema(schema.RequestSchema): + """GetUEcImage - uec2.0""" + + fields = { + "ImageType": fields.Str(required=False, dump_to="ImageType"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class GetUEcImageResponseSchema(schema.ResponseSchema): + """GetUEcImage - uec2.0""" + + fields = { + "ImageList": fields.List( + models.ImageInfoSchema(), required=False, load_from="ImageList" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: GetUEcPodPrice + +获得容器组价格 +""" + + +class GetUEcPodPriceRequestSchema(schema.RequestSchema): + """GetUEcPodPrice - 获得容器组价格""" + + fields = { + "Bandwidth": fields.Int(required=False, dump_to="Bandwidth"), + "ChargeQuantity": fields.Int(required=False, dump_to="ChargeQuantity"), + "ChargeType": fields.Int(required=False, dump_to="ChargeType"), + "CpuCore": fields.Float(required=False, dump_to="CpuCore"), + "ElasticIp": fields.Str(required=False, dump_to="ElasticIp"), + "IdcId": fields.Str(required=True, dump_to="IdcId"), + "MemSize": fields.Int(required=False, dump_to="MemSize"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + } + + +class GetUEcPodPriceResponseSchema(schema.ResponseSchema): + """GetUEcPodPrice - 获得容器组价格""" + + fields = { + "HolderPrice": fields.Float(required=True, load_from="HolderPrice"), + "IpPrice": fields.Float(required=True, load_from="IpPrice"), + } + + +""" +API: GetUEcUpgradePrice + +获取虚拟机调整差价 +""" + + +class GetUEcUpgradePriceRequestSchema(schema.RequestSchema): + """GetUEcUpgradePrice - 获取虚拟机调整差价""" + + fields = { + "CpuCore": fields.Int(required=False, dump_to="CpuCore"), + "DiskSize": fields.Int(required=False, dump_to="DiskSize"), + "MemSize": fields.Int(required=False, dump_to="MemSize"), + "NetLimit": fields.Int(required=False, dump_to="NetLimit"), + "NodeId": fields.Str(required=True, dump_to="NodeId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "SysDiskSize": fields.Int(required=False, dump_to="SysDiskSize"), + } + + +class GetUEcUpgradePriceResponseSchema(schema.ResponseSchema): + """GetUEcUpgradePrice - 获取虚拟机调整差价""" + + fields = { + "Price": fields.Int(required=False, load_from="Price"), + } + + +""" +API: GetUEcVHostData + +获取虚拟机监控数据 +""" + + +class GetUEcVHostDataRequestSchema(schema.RequestSchema): + """GetUEcVHostData - 获取虚拟机监控数据""" + + fields = { + "BeginTime": fields.Int(required=False, dump_to="BeginTime"), + "EndTime": fields.Int(required=False, dump_to="EndTime"), + "NodeId": fields.Str(required=True, dump_to="NodeId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Type": fields.List(fields.Int()), + } + + +class GetUEcVHostDataResponseSchema(schema.ResponseSchema): + """GetUEcVHostData - 获取虚拟机监控数据""" + + fields = { + "Action": fields.Str(required=True, load_from="Action"), + "DataSets": models.DataSetSchema(), + "RetCode": fields.Int(required=True, load_from="RetCode"), + } + + +""" +API: GetUEcVHostPrice + +获取虚拟机价格 +""" + + +class GetUEcVHostPriceRequestSchema(schema.RequestSchema): + """GetUEcVHostPrice - 获取虚拟机价格""" + + fields = { + "ChargeQuantity": fields.Int(required=False, dump_to="ChargeQuantity"), + "ChargeType": fields.Int(required=False, dump_to="ChargeType"), + "CpuCore": fields.Int(required=False, dump_to="CpuCore"), + "DiskSize": fields.Int(required=False, dump_to="DiskSize"), + "Gpu": fields.Int(required=False, dump_to="Gpu"), + "GpuType": fields.Str(required=False, dump_to="GpuType"), + "IdcId": fields.Str(required=True, dump_to="IdcId"), + "IpCount": fields.Int(required=False, dump_to="IpCount"), + "MemSize": fields.Int(required=False, dump_to="MemSize"), + "NetLimit": fields.Int(required=False, dump_to="NetLimit"), + "NodeCount": fields.Int(required=False, dump_to="NodeCount"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "SysDiskSize": fields.Int(required=False, dump_to="SysDiskSize"), + } + + +class GetUEcVHostPriceResponseSchema(schema.ResponseSchema): + """GetUEcVHostPrice - 获取虚拟机价格""" + + fields = { + "IpPrice": fields.Float(required=False, load_from="IpPrice"), + "NodePrice": fields.Float(required=False, load_from="NodePrice"), + } + + +""" +API: ImportUEcCustomImage + +导入自定义镜像 +""" + + +class ImportUEcCustomImageRequestSchema(schema.RequestSchema): + """ImportUEcCustomImage - 导入自定义镜像""" + + fields = { + "Format": fields.Str(required=False, dump_to="Format"), + "IdcId": fields.List(fields.Str()), + "ImageDesc": fields.Str(required=False, dump_to="ImageDesc"), + "ImageId": fields.Str(required=False, dump_to="ImageId"), + "ImageName": fields.Str(required=False, dump_to="ImageName"), + "OsType": fields.Str(required=False, dump_to="OsType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UFileUrl": fields.Str(required=False, dump_to="UFileUrl"), + } + + +class ImportUEcCustomImageResponseSchema(schema.ResponseSchema): + """ImportUEcCustomImage - 导入自定义镜像""" + + fields = { + "ImageId": fields.Str(required=True, load_from="ImageId"), + } + + +""" +API: LoginUEcDocker + +登录容器 +""" + + +class LoginUEcDockerRequestSchema(schema.RequestSchema): + """LoginUEcDocker - 登录容器""" + + fields = { + "Name": fields.Str(required=True, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class LoginUEcDockerResponseSchema(schema.ResponseSchema): + """LoginUEcDocker - 登录容器""" + + fields = { + "Link": fields.Str(required=False, load_from="Link"), + "LinkPort": fields.Int(required=False, load_from="LinkPort"), + "SessionId": fields.Str(required=True, load_from="SessionId"), + } + + +""" +API: ModifyUEcBandwidth + +修改节点带宽限制 +""" + + +class ModifyUEcBandwidthRequestSchema(schema.RequestSchema): + """ModifyUEcBandwidth - 修改节点带宽限制""" + + fields = { + "NetLimit": fields.Str(required=True, dump_to="NetLimit"), + "NodeId": fields.Str(required=True, dump_to="NodeId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class ModifyUEcBandwidthResponseSchema(schema.ResponseSchema): + """ModifyUEcBandwidth - 修改节点带宽限制""" + + fields = {} + + +""" +API: ModifyUEcHolderName + +修改容器组名称 +""" + + +class ModifyUEcHolderNameRequestSchema(schema.RequestSchema): + """ModifyUEcHolderName - 修改容器组名称""" + + fields = { + "Name": fields.Str(required=True, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class ModifyUEcHolderNameResponseSchema(schema.ResponseSchema): + """ModifyUEcHolderName - 修改容器组名称""" + + fields = {} + + +""" +API: ModifyUEcImageName + +修改镜像名称 +""" + + +class ModifyUEcImageNameRequestSchema(schema.RequestSchema): + """ModifyUEcImageName - 修改镜像名称""" + + fields = { + "ImageDesc": fields.Str(required=False, dump_to="ImageDesc"), + "ImageId": fields.Str(required=True, dump_to="ImageId"), + "ImageName": fields.Str(required=True, dump_to="ImageName"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class ModifyUEcImageNameResponseSchema(schema.ResponseSchema): + """ModifyUEcImageName - 修改镜像名称""" + + fields = {} + + +""" +API: PoweroffUEcVHost + +虚拟机断电 +""" + + +class PoweroffUEcVHostRequestSchema(schema.RequestSchema): + """PoweroffUEcVHost - 虚拟机断电""" + + fields = { + "NodeId": fields.List(fields.Str()), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class PoweroffUEcVHostResponseSchema(schema.ResponseSchema): + """PoweroffUEcVHost - 虚拟机断电""" + + fields = {} + + +""" +API: ReinstallUEcVHost + +虚拟机重装系统 +""" + + +class ReinstallUEcVHostRequestSchema(schema.RequestSchema): + """ReinstallUEcVHost - 虚拟机重装系统""" + + fields = { + "ImageId": fields.Str(required=True, dump_to="ImageId"), + "KeepData": fields.Int(required=False, dump_to="KeepData"), + "NodeId": fields.Str(required=True, dump_to="NodeId"), + "Password": fields.Str(required=False, dump_to="Password"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "SysDiskSize": fields.Int(required=False, dump_to="SysDiskSize"), + } + + +class ReinstallUEcVHostResponseSchema(schema.ResponseSchema): + """ReinstallUEcVHost - 虚拟机重装系统""" + + fields = {} + + +""" +API: RestartUEcHolder + +重启容器组 +""" + + +class RestartUEcHolderRequestSchema(schema.RequestSchema): + """RestartUEcHolder - 重启容器组""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ResourceId": fields.List(fields.Str()), + } + + +class RestartUEcHolderResponseSchema(schema.ResponseSchema): + """RestartUEcHolder - 重启容器组""" + + fields = {} + + +""" +API: RestartUEcVHost + +重启虚拟机v2.0 +""" + + +class RestartUEcVHostRequestSchema(schema.RequestSchema): + """RestartUEcVHost - 重启虚拟机v2.0""" + + fields = { + "NodeId": fields.List(fields.Str()), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class RestartUEcVHostResponseSchema(schema.ResponseSchema): + """RestartUEcVHost - 重启虚拟机v2.0""" + + fields = {} + + +""" +API: StartUEcVHost + +启动UEC虚拟机 +""" + + +class StartUEcVHostRequestSchema(schema.RequestSchema): + """StartUEcVHost - 启动UEC虚拟机""" + + fields = { + "NodeId": fields.List(fields.Str()), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class StartUEcVHostResponseSchema(schema.ResponseSchema): + """StartUEcVHost - 启动UEC虚拟机""" + + fields = {} + + +""" +API: StopUEcVHost + +停止UEC虚拟机 +""" + + +class StopUEcVHostRequestSchema(schema.RequestSchema): + """StopUEcVHost - 停止UEC虚拟机""" + + fields = { + "NodeId": fields.List(fields.Str()), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class StopUEcVHostResponseSchema(schema.ResponseSchema): + """StopUEcVHost - 停止UEC虚拟机""" + + fields = {} + + +""" +API: UnBindUEcFirewall + +解绑防火墙 +""" + + +class UnBindUEcFirewallRequestSchema(schema.RequestSchema): + """UnBindUEcFirewall - 解绑防火墙""" + + fields = { + "FirewallId": fields.Str(required=True, dump_to="FirewallId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class UnBindUEcFirewallResponseSchema(schema.ResponseSchema): + """UnBindUEcFirewall - 解绑防火墙""" + + fields = {} + + +""" +API: UpdateUEcFirewall + +更新防火墙信息,新增和删除规则 +""" + + +class UpdateUEcFirewallParamRuleSchema(schema.RequestSchema): + """UpdateUEcFirewallParamRule -""" + + fields = { + "Action": fields.Str(required=True, dump_to="Action"), + "Port": fields.Str(required=True, dump_to="Port"), + "Priority": fields.Str(required=True, dump_to="Priority"), + "ProtocolType": fields.Str(required=True, dump_to="ProtocolType"), + "Remark": fields.Str(required=True, dump_to="Remark"), + "SrcIp": fields.Str(required=True, dump_to="SrcIp"), + } + + +class UpdateUEcFirewallRequestSchema(schema.RequestSchema): + """UpdateUEcFirewall - 更新防火墙信息,新增和删除规则""" + + fields = { + "FirewallId": fields.Str(required=True, dump_to="FirewallId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Rule": fields.List(UpdateUEcFirewallParamRuleSchema()), + } + + +class UpdateUEcFirewallResponseSchema(schema.ResponseSchema): + """UpdateUEcFirewall - 更新防火墙信息,新增和删除规则""" + + fields = {} + + +""" +API: UpdateUEcFirewallAttribute + +更新防火墙名称及描述 +""" + + +class UpdateUEcFirewallAttributeRequestSchema(schema.RequestSchema): + """UpdateUEcFirewallAttribute - 更新防火墙名称及描述""" + + fields = { + "FirewallId": fields.Str(required=True, dump_to="FirewallId"), + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Remark": fields.Str(required=False, dump_to="Remark"), + } + + +class UpdateUEcFirewallAttributeResponseSchema(schema.ResponseSchema): + """UpdateUEcFirewallAttribute - 更新防火墙名称及描述""" + + fields = {} + + +""" +API: UpdateUEcSubnet + +更新子网信息 +""" + + +class UpdateUEcSubnetRequestSchema(schema.RequestSchema): + """UpdateUEcSubnet - 更新子网信息""" + + fields = { + "Comment": fields.Str(required=False, dump_to="Comment"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + "SubnetName": fields.Str(required=False, dump_to="SubnetName"), + } + + +class UpdateUEcSubnetResponseSchema(schema.ResponseSchema): + """UpdateUEcSubnet - 更新子网信息""" + + fields = {} diff --git a/ucloud/services/uec/schemas/models.py b/ucloud/services/uec/schemas/models.py new file mode 100644 index 00000000..3cc45025 --- /dev/null +++ b/ucloud/services/uec/schemas/models.py @@ -0,0 +1,316 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class NodeListSchema(schema.ResponseSchema): + """NodeList - 虚拟机资源id列表""" + + fields = { + "NodeId": fields.Str(required=False, load_from="NodeId"), + } + + +class RuleInfoSchema(schema.ResponseSchema): + """RuleInfo - 防火墙规则""" + + fields = { + "Action": fields.Str(required=True, load_from="Action"), + "Port": fields.Str(required=True, load_from="Port"), + "Priority": fields.Str(required=True, load_from="Priority"), + "ProtocolType": fields.Str(required=True, load_from="ProtocolType"), + "Remark": fields.Str(required=True, load_from="Remark"), + "SrcIp": fields.Str(required=True, load_from="SrcIp"), + } + + +class FirewallInfoSchema(schema.ResponseSchema): + """FirewallInfo - 防火墙信息""" + + fields = { + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "FirewallId": fields.Str(required=True, load_from="FirewallId"), + "Name": fields.Str(required=True, load_from="Name"), + "Remark": fields.Str(required=False, load_from="Remark"), + "ResourceCount": fields.Int(required=True, load_from="ResourceCount"), + "Rule": fields.List(RuleInfoSchema()), + "Type": fields.Str(required=True, load_from="Type"), + } + + +class ResourceInfoSchema(schema.ResponseSchema): + """ResourceInfo - 绑定防火墙的资源信息""" + + fields = { + "Name": fields.Str(required=True, load_from="Name"), + "PublicIpList": fields.List(fields.Str()), + "Remark": fields.Str(required=False, load_from="Remark"), + "ResourceId": fields.Str(required=True, load_from="ResourceId"), + "State": fields.Int(required=True, load_from="State"), + } + + +class EnvListSchema(schema.ResponseSchema): + """EnvList - 容器环境变量列表""" + + fields = { + "Key": fields.Str(required=False, load_from="Key"), + "Value": fields.Str(required=False, load_from="Value"), + } + + +class CfgDictListSchema(schema.ResponseSchema): + """CfgDictList - 容器配置字典列表""" + + fields = { + "MountPath": fields.Str(required=False, load_from="MountPath"), + "Name": fields.Str(required=False, load_from="Name"), + "ResourceId": fields.Str(required=False, load_from="ResourceId"), + } + + +class DockerInfoSchema(schema.ResponseSchema): + """DockerInfo - 容器信息""" + + fields = { + "Args": fields.Str(required=False, load_from="Args"), + "CfgDictList": fields.List(CfgDictListSchema()), + "Command": fields.Str(required=False, load_from="Command"), + "CpuCores": fields.Float(required=False, load_from="CpuCores"), + "EnvList": fields.List(EnvListSchema()), + "ImageName": fields.Str(required=False, load_from="ImageName"), + "MemSize": fields.Float(required=False, load_from="MemSize"), + "Name": fields.Str(required=False, load_from="Name"), + "State": fields.Int(required=False, load_from="State"), + "WorkDir": fields.Str(required=False, load_from="WorkDir"), + } + + +class IpListSchema(schema.ResponseSchema): + """IpList - 容器组外网ip列表""" + + fields = { + "Ip": fields.Str(required=False, load_from="Ip"), + "Isp": fields.Str(required=False, load_from="Isp"), + } + + +class ImageListSchema(schema.ResponseSchema): + """ImageList - 容器组镜像密钥列表""" + + fields = { + "ImageKey": fields.Str(required=False, load_from="ImageKey"), + "StoreAddr": fields.Str(required=False, load_from="StoreAddr"), + "UserName": fields.Str(required=False, load_from="UserName"), + } + + +class StorVolumeInfoSchema(schema.ResponseSchema): + """StorVolumeInfo - 容器组存储卷信息""" + + fields = { + "DiskSize": fields.Int(required=False, load_from="DiskSize"), + "MountPoint": fields.Str(required=False, load_from="MountPoint"), + "Name": fields.Str(required=False, load_from="Name"), + "ResourceId": fields.Str(required=False, load_from="ResourceId"), + } + + +class HolderListSchema(schema.ResponseSchema): + """HolderList - 容器组信息""" + + fields = { + "City": fields.Str(required=False, load_from="City"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DockerCount": fields.Int(required=False, load_from="DockerCount"), + "DockerInfo": fields.List(DockerInfoSchema()), + "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "FirewallId": fields.Str(required=False, load_from="FirewallId"), + "HolderName": fields.Str(required=False, load_from="HolderName"), + "IdcId": fields.Str(required=False, load_from="IdcId"), + "ImageList": fields.List(ImageListSchema()), + "InnerIp": fields.Str(required=False, load_from="InnerIp"), + "IpList": fields.List(IpListSchema()), + "NetLimit": fields.Int(required=False, load_from="NetLimit"), + "OcName": fields.Str(required=False, load_from="OcName"), + "ProductType": fields.Str(required=False, load_from="ProductType"), + "Province": fields.Str(required=False, load_from="Province"), + "ResourceId": fields.Str(required=False, load_from="ResourceId"), + "RestartStrategy": fields.Int( + required=False, load_from="RestartStrategy" + ), + "State": fields.Int(required=False, load_from="State"), + "StorVolumeCount": fields.Int( + required=False, load_from="StorVolumeCount" + ), + "StorVolumeInfo": fields.List(StorVolumeInfoSchema()), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "Type": fields.Int(required=False, load_from="Type"), + } + + +class IdcInfoSchema(schema.ResponseSchema): + """IdcInfo - 机房信息""" + + fields = { + "City": fields.Str(required=False, load_from="City"), + "IdcId": fields.Str(required=False, load_from="IdcId"), + "Isp": fields.Str(required=False, load_from="Isp"), + "MaxNodeCnt": fields.Int(required=False, load_from="MaxNodeCnt"), + "Name": fields.Str(required=False, load_from="Name"), + "Province": fields.Str(required=False, load_from="Province"), + "Type": fields.Int(required=False, load_from="Type"), + } + + +class SubnetInfoSchema(schema.ResponseSchema): + """SubnetInfo - 子网信息""" + + fields = { + "AvailableIPCnt": fields.Int(required=True, load_from="AvailableIPCnt"), + "CIDR": fields.Str(required=True, load_from="CIDR"), + "Comment": fields.Str(required=True, load_from="Comment"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "IdcId": fields.Str(required=True, load_from="IdcId"), + "SubnetId": fields.Str(required=True, load_from="SubnetId"), + "SubnetName": fields.Str(required=True, load_from="SubnetName"), + "TotalIpCnt": fields.Int(required=True, load_from="TotalIpCnt"), + } + + +class NodeIpListSchema(schema.ResponseSchema): + """NodeIpList - 虚拟机外网ip列表""" + + fields = { + "Ip": fields.Str(required=False, load_from="Ip"), + "Isp": fields.Str(required=False, load_from="Isp"), + "IspName": fields.Str(required=False, load_from="IspName"), + } + + +class NodeInfoSchema(schema.ResponseSchema): + """NodeInfo - 节点信息""" + + fields = { + "ChargeType": fields.Int(required=False, load_from="ChargeType"), + "City": fields.Str(required=False, load_from="City"), + "CoreNum": fields.Int(required=False, load_from="CoreNum"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DiskSize": fields.Int(required=False, load_from="DiskSize"), + "ExpiredTime": fields.Int(required=False, load_from="ExpiredTime"), + "FirewallId": fields.Str(required=False, load_from="FirewallId"), + "IdcId": fields.Str(required=False, load_from="IdcId"), + "ImageName": fields.Str(required=False, load_from="ImageName"), + "InnerIps": fields.List(fields.Str()), + "MemSize": fields.Int(required=False, load_from="MemSize"), + "NetLimit": fields.Int(required=False, load_from="NetLimit"), + "NodeId": fields.Str(required=False, load_from="NodeId"), + "NodeIpList": fields.List(NodeIpListSchema()), + "NodeName": fields.Str(required=False, load_from="NodeName"), + "OcName": fields.Str(required=False, load_from="OcName"), + "ProductType": fields.Str(required=False, load_from="ProductType"), + "Province": fields.Str(required=False, load_from="Province"), + "State": fields.Int(required=False, load_from="State"), + "SysDiskSize": fields.Int(required=False, load_from="SysDiskSize"), + "Type": fields.Int(required=False, load_from="Type"), + } + + +class NodeIspListSchema(schema.ResponseSchema): + """NodeIspList - 节点运营商列表""" + + fields = { + "City": fields.Str(required=False, load_from="City"), + "IdcName": fields.Str(required=False, load_from="IdcName"), + "IspName": fields.Str(required=False, load_from="IspName"), + "LineType": fields.Str(required=False, load_from="LineType"), + "Province": fields.Str(required=False, load_from="Province"), + } + + +class MonitorInfoSchema(schema.ResponseSchema): + """MonitorInfo - 监控信息""" + + fields = { + "TimeStamp": fields.Int(required=True, load_from="TimeStamp"), + "Value": fields.Int(required=True, load_from="Value"), + } + + +class MetricisDataSetSchema(schema.ResponseSchema): + """MetricisDataSet - 监控数据""" + + fields = { + "CPUUtilization": fields.List(MonitorInfoSchema()), + "MemUtilization": fields.List(MonitorInfoSchema()), + "NICIn": fields.List(MonitorInfoSchema()), + "NICOut": fields.List(MonitorInfoSchema()), + "NetPacketIn": fields.List(MonitorInfoSchema()), + "NetPacketOut": fields.List(MonitorInfoSchema()), + } + + +class ResourceSetSchema(schema.ResponseSchema): + """ResourceSet - 受到影响的资源列表""" + + fields = { + "NodeId": fields.Str(required=False, load_from="NodeId"), + "OuterIps": fields.List(fields.Str()), + } + + +class IDCCutInfoSchema(schema.ResponseSchema): + """IDCCutInfo - 机房割接信息""" + + fields = { + "City": fields.Str(required=False, load_from="City"), + "CutType": fields.Str(required=False, load_from="CutType"), + "EndTime": fields.Int(required=False, load_from="EndTime"), + "IDCName": fields.Str(required=False, load_from="IDCName"), + "Province": fields.Str(required=False, load_from="Province"), + "ResourceSet": fields.List(ResourceSetSchema()), + "StartTime": fields.Int(required=False, load_from="StartTime"), + } + + +class DataSetSchema(schema.ResponseSchema): + """DataSet - 监控信息集合""" + + fields = { + "CPUUtilization": fields.List(MonitorInfoSchema()), + "DiskReadOps": fields.List(MonitorInfoSchema()), + "DiskWriteOps": fields.List(MonitorInfoSchema()), + "IORead": fields.List(MonitorInfoSchema()), + "IOWrite": fields.List(MonitorInfoSchema()), + "MemUtilization": fields.List(MonitorInfoSchema()), + "NICIn": fields.List(MonitorInfoSchema()), + "NICOut": fields.List(MonitorInfoSchema()), + "NetPacketIn": fields.List(MonitorInfoSchema()), + "NetPacketOut": fields.List(MonitorInfoSchema()), + } + + +class DeployImageInfoSchema(schema.ResponseSchema): + """DeployImageInfo - 镜像部署信息""" + + fields = { + "IdcId": fields.Str(required=False, load_from="IdcId"), + "State": fields.Int(required=False, load_from="State"), + } + + +class ImageInfoSchema(schema.ResponseSchema): + """ImageInfo - 镜像详情""" + + fields = { + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DeployInfoList": fields.List(DeployImageInfoSchema()), + "Gpu": fields.Int(required=False, load_from="Gpu"), + "ImageDesc": fields.Str(required=False, load_from="ImageDesc"), + "ImageId": fields.Str(required=False, load_from="ImageId"), + "ImageName": fields.Str(required=False, load_from="ImageName"), + "ImageSize": fields.Int(required=False, load_from="ImageSize"), + "ImageType": fields.Int(required=False, load_from="ImageType"), + "OcType": fields.Str(required=False, load_from="OcType"), + "State": fields.Int(required=False, load_from="State"), + } diff --git a/ucloud/services/ues/__init__.py b/ucloud/services/ues/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/ues/client.py b/ucloud/services/ues/client.py new file mode 100644 index 00000000..c2fc8962 --- /dev/null +++ b/ucloud/services/ues/client.py @@ -0,0 +1,421 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.ues.schemas import apis + + +class UESClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UESClient, self).__init__(config, transport, middleware, logger) + + def create_ues_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUESInstance - 创建实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **AppVersion** (str) - (Required) 应用服务版本号,支持的类型通过GetUESAppVersion AppVersionList[].AppVersion + - **InstanceName** (str) - (Required) 实例名称 + - **KibanaNodeConf** (str) - (Required) Kibana节点配置, 支持的机型可通过GetUESNodeConf NodeConfList[].NodeConf + - **KibanaNodeDiskConf** (str) - (Required) Kibana节点磁盘类型 + - **NodeConf** (str) - (Required) 节点配置标识, 支持的机型可通过GetUESNodeConf NodeConfList[].NodeConf + - **NodeDiskConf** (str) - (Required) 磁盘类型 + - **SubnetId** (str) - (Required) 子网ID标识 + - **VPCId** (str) - (Required) VPCID标识 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **AppName** (str) - 应用名称,支持的类型通过GetUESAppVersion AppVersionList[].AppName, 默认为elasticsearch + - **BusinessId** (str) - 业务组ID标识 + - **ChargeType** (str) - 计费类型,默认为Month + - **CoordinatingNodeConf** (str) - Coordinating节点机型配置,, 支持的机型可通过GetUESNodeConf NodeConfList[].NodeConf, 默认为空 + - **CoordinatingNodeDiskConf** (str) - Coordinating节点磁盘类型 + - **CoordinatingNodeSize** (int) - Coordinating节点数量 + - **IsMultiZone** (bool) - 是否为多可用区,默认为false + - **IsSecGroup** (bool) - 是否开启安全组,默认为false + - **MasterConf** (str) - 主节点类型标示,支持的机型可通过GetUESNodeConf NodeConfList[].NodeConf, 默认为空 + - **MultiZones** (list) - 多可用区名称,默认空数组 [] + - **NodeDiskSize** (int) - 节点磁盘大小,默认为100G + - **NodeSize** (int) - 节点个数,默认数目为3 + - **Quantity** (int) - 计费长度,默认为1 + - **Remark** (str) - 备注,默认为空 + - **SecGroupIds** (list) - 安全组ID,开启安全组必填,至多可以同时绑定5个安全组 + - **ServicePasswd** (str) - 服务用户密码,默认为changeme + - **ServiceUserName** (str) - elasticsearch 服务用户名称,默认为elastic;OpenSearch 服务用户名称,固定为admin + + **Response** + + - **InstanceId** (str) - 实例ID + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateUESInstanceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUESInstance", d, **kwargs) + return apis.CreateUESInstanceResponseSchema().loads(resp) + + def delete_ues_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUESInstance - 删除实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceId** (str) - (Required) 实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteUESInstanceRequestSchema().dumps(d) + + resp = self.invoke("DeleteUESInstance", d, **kwargs) + return apis.DeleteUESInstanceResponseSchema().loads(resp) + + def describe_ues_instance_v2( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUESInstanceV2 - 查询指定实例详细信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceId** (str) - (Required) 集群实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Result** (dict) - 见 **ClusterNodeV2Info** 模型定义 + + **Response Model** + + **ClusterV2Info** + - **BusinessId** (str) - 项目组ID标识 + - **Region** (str) - 地域 + - **ServiceVersion** (str) - 服务版本号 + - **State** (str) - 服务集群状态 + - **SubnetId** (str) - 子网ID标识 + - **UESInstanceId** (str) - 服务集群ID标识 + - **UESInstanceName** (str) - 服务集群名称 + - **VPCId** (str) - VPCID标识 + - **Vip** (str) - Vip + - **Zone** (str) - 可用区 + + + **NodeV2Info** + - **CPU** (int) - 节点cpu数量 + - **DiskSize** (int) - 节点磁盘大小 + - **DiskType** (str) - 节点磁盘类型 + - **Memory** (int) - 节点内存大小 + - **NodeConf** (str) - 节点配置标识 + - **NodeIP** (str) - 节点IP + - **NodeId** (str) - 节点ID + - **NodeName** (str) - 节点名称 + - **NodeRole** (str) - 节点类型 + - **NodeState** (str) - 节点状态 + + + **ClusterNodeV2Info** + - **ClusterInfo** (dict) - 见 **ClusterV2Info** 模型定义 + - **NodeInfoList** (list) - 见 **NodeV2Info** 模型定义 + - **RequestId** (str) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUESInstanceV2RequestSchema().dumps(d) + + resp = self.invoke("DescribeUESInstanceV2", d, **kwargs) + return apis.DescribeUESInstanceV2ResponseSchema().loads(resp) + + def expand_ues_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ExpandUESInstance - 扩容实例节点 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceId** (str) - (Required) 实例ID + - **NodeCount** (int) - (Required) 扩容后对应类型节点的数目 + - **NodeRole** (str) - (Required) 节点类型(compute、coordinating) + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ExpandUESInstanceRequestSchema().dumps(d) + + resp = self.invoke("ExpandUESInstance", d, **kwargs) + return apis.ExpandUESInstanceResponseSchema().loads(resp) + + def get_ues_app_version( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUESAppVersion - 获取服务应用版本列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **AppVersionList** (list) - 见 **AppVersion** 模型定义 + - **Message** (str) - 错误信息 + - **TotalCount** (int) - 服务应用版本个数 + + **Response Model** + + **AppVersion** + - **AppName** (str) - 应用名称,默认值为elasticsearch + - **AppVersion** (str) - 应用版本号 + - **IsMultiZone** (bool) - 是否支持多区部署,默认为false + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUESAppVersionRequestSchema().dumps(d) + + resp = self.invoke("GetUESAppVersion", d, **kwargs) + return apis.GetUESAppVersionResponseSchema().loads(resp) + + def get_ues_disk_size_limitation( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUESDiskSizeLimitation - 获取磁盘容量限制 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **DiskSizeLimitationSet** (list) - 见 **DiskSizeLimitation** 模型定义 + - **Message** (str) - 错误信息 + + **Response Model** + + **DiskSizeLimitation** + - **DiskType** (str) - 数据盘类别,包含普通云盘|CLOUD_NORMAL、SSD云盘|CLOUD_SSD和RSSD云盘|CLOUD_RSSD。普通本地盘只包含普通本地盘|LOCAL_NORMAL一种。SSD本地盘只包含SSD本地盘|LOCAL_SSD一种。 + - **MaxSize** (int) - 最大值,单位GB + - **MinSize** (int) - 最小值,单位GB + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUESDiskSizeLimitationRequestSchema().dumps(d) + + resp = self.invoke("GetUESDiskSizeLimitation", d, **kwargs) + return apis.GetUESDiskSizeLimitationResponseSchema().loads(resp) + + def get_ues_node_conf( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUESNodeConf - 获取节点配置列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 错误信息 + - **NodeConfList** (list) - 见 **NodeConf** 模型定义 + - **TotalCount** (int) - 所有节点配置信息的个数 + + **Response Model** + + **NodeConf** + - **CPU** (int) - CPU数量 + - **DiskSize** (int) - 磁盘大小,单位为GB + - **DiskType** (str) - 磁盘类型[RSSD|SSD] + - **IsSecGroup** (bool) - 是否支持安全组[true|false] + - **Memory** (int) - 内存,单位为GB + - **NodeConf** (str) - 节点配置标识 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUESNodeConfRequestSchema().dumps(d) + + resp = self.invoke("GetUESNodeConf", d, **kwargs) + return apis.GetUESNodeConfResponseSchema().loads(resp) + + def list_ues_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUESInstance - 获取实例列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - 返回数据长度, 默认为30 + - **Offset** (int) - 数据偏移量, 默认为0 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **ClusterSet** (list) - 见 **ClusterInfo** 模型定义 + - **Message** (str) - 错误信息 + - **TotalCount** (int) - 实例个数 + + **Response Model** + + **ClusterInfo** + - **AppName** (str) - 应用名称 + - **AppVersion** (str) - 应用服务版本号 + - **BusinessId** (str) - 项目组ID标识 + - **ChargeType** (str) - 计费类型,默认为Month + - **CreateTime** (int) - 创建时间 + - **ExpireTime** (int) - 失效时间 + - **InstanceId** (str) - 实例资源ID + - **InstanceName** (str) - 实例名称 + - **IsSecGroup** (bool) - 是否开启安全组 + - **MultiZones** (list) - 多可用区 + - **NodeCount** (int) - 节点个数,默认为集群大小 + - **Resizable** (bool) - 是否支持改配 + - **RunTime** (int) - 实例运行时长 + - **ServiceVersion** (str) - 服务版本号(弃用) + - **State** (str) - 实例状态 + - **SubnetId** (str) - 子网ID标识 + - **Tag** (str) - 业务组 + - **UESInstanceId** (str) - 服务集群ID标识(弃用) + - **UESInstanceName** (str) - 服务集群名称(弃用) + - **VPCId** (str) - VPCID标识 + - **Vip** (str) - VIP地址信息 + - **Zone** (str) - 可用区 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUESInstanceRequestSchema().dumps(d) + + resp = self.invoke("ListUESInstance", d, **kwargs) + return apis.ListUESInstanceResponseSchema().loads(resp) + + def resize_ues_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ResizeUESInstance - 改配实例节点配置 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceId** (str) - (Required) 实例ID + - **NodeRole** (str) - (Required) 节点类型(compute、master、coordinating、kibana、dashboard) + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ForceResizing** (bool) - 进行改配操作是否强制检查集群健康状态,默认为false + - **NodeConf** (str) - 改配节点类型,NodeDiskSize为0,基于NodeRole 进行改配 + - **NodeDiskSize** (int) - 改配节点磁盘大小,NodeConf 为空字符串,基于NodeRole 进行改配 + + **Response** + + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ResizeUESInstanceRequestSchema().dumps(d) + + resp = self.invoke("ResizeUESInstance", d, **kwargs) + return apis.ResizeUESInstanceResponseSchema().loads(resp) + + def restart_ues_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RestartUESInstance - 重启实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceId** (str) - (Required) 实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.RestartUESInstanceRequestSchema().dumps(d) + + resp = self.invoke("RestartUESInstance", d, **kwargs) + return apis.RestartUESInstanceResponseSchema().loads(resp) diff --git a/ucloud/services/ues/schemas/__init__.py b/ucloud/services/ues/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/ues/schemas/apis.py b/ucloud/services/ues/schemas/apis.py new file mode 100644 index 00000000..a48db2c1 --- /dev/null +++ b/ucloud/services/ues/schemas/apis.py @@ -0,0 +1,323 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.ues.schemas import models + +""" UES API Schema +""" + + +""" +API: CreateUESInstance + +创建实例 +""" + + +class CreateUESInstanceRequestSchema(schema.RequestSchema): + """CreateUESInstance - 创建实例""" + + fields = { + "AppName": fields.Str(required=False, dump_to="AppName"), + "AppVersion": fields.Str(required=True, dump_to="AppVersion"), + "BusinessId": fields.Str(required=False, dump_to="BusinessId"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CoordinatingNodeConf": fields.Str( + required=False, dump_to="CoordinatingNodeConf" + ), + "CoordinatingNodeDiskConf": fields.Str( + required=False, dump_to="CoordinatingNodeDiskConf" + ), + "CoordinatingNodeSize": fields.Int( + required=False, dump_to="CoordinatingNodeSize" + ), + "InstanceName": fields.Str(required=True, dump_to="InstanceName"), + "IsMultiZone": fields.Bool(required=False, dump_to="IsMultiZone"), + "IsSecGroup": fields.Bool(required=False, dump_to="IsSecGroup"), + "KibanaNodeConf": fields.Str(required=True, dump_to="KibanaNodeConf"), + "KibanaNodeDiskConf": fields.Str( + required=True, dump_to="KibanaNodeDiskConf" + ), + "MasterConf": fields.Str(required=False, dump_to="MasterConf"), + "MultiZones": fields.List(fields.Str()), + "NodeConf": fields.Str(required=True, dump_to="NodeConf"), + "NodeDiskConf": fields.Str(required=True, dump_to="NodeDiskConf"), + "NodeDiskSize": fields.Int(required=False, dump_to="NodeDiskSize"), + "NodeSize": fields.Int(required=False, dump_to="NodeSize"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "SecGroupIds": fields.List(fields.Str()), + "ServicePasswd": fields.Str(required=False, dump_to="ServicePasswd"), + "ServiceUserName": fields.Str( + required=False, dump_to="ServiceUserName" + ), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateUESInstanceResponseSchema(schema.ResponseSchema): + """CreateUESInstance - 创建实例""" + + fields = { + "InstanceId": fields.Str(required=False, load_from="InstanceId"), + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: DeleteUESInstance + +删除实例 +""" + + +class DeleteUESInstanceRequestSchema(schema.RequestSchema): + """DeleteUESInstance - 删除实例""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DeleteUESInstanceResponseSchema(schema.ResponseSchema): + """DeleteUESInstance - 删除实例""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: DescribeUESInstanceV2 + +查询指定实例详细信息 +""" + + +class DescribeUESInstanceV2RequestSchema(schema.RequestSchema): + """DescribeUESInstanceV2 - 查询指定实例详细信息""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeUESInstanceV2ResponseSchema(schema.ResponseSchema): + """DescribeUESInstanceV2 - 查询指定实例详细信息""" + + fields = { + "Result": models.ClusterNodeV2InfoSchema(), + } + + +""" +API: ExpandUESInstance + +扩容实例节点 +""" + + +class ExpandUESInstanceRequestSchema(schema.RequestSchema): + """ExpandUESInstance - 扩容实例节点""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "NodeCount": fields.Int(required=True, dump_to="NodeCount"), + "NodeRole": fields.Str(required=True, dump_to="NodeRole"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ExpandUESInstanceResponseSchema(schema.ResponseSchema): + """ExpandUESInstance - 扩容实例节点""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: GetUESAppVersion + +获取服务应用版本列表 +""" + + +class GetUESAppVersionRequestSchema(schema.RequestSchema): + """GetUESAppVersion - 获取服务应用版本列表""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetUESAppVersionResponseSchema(schema.ResponseSchema): + """GetUESAppVersion - 获取服务应用版本列表""" + + fields = { + "AppVersionList": fields.List( + models.AppVersionSchema(), required=True, load_from="AppVersionList" + ), + "Message": fields.Str(required=False, load_from="Message"), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: GetUESDiskSizeLimitation + +获取磁盘容量限制 +""" + + +class GetUESDiskSizeLimitationRequestSchema(schema.RequestSchema): + """GetUESDiskSizeLimitation - 获取磁盘容量限制""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetUESDiskSizeLimitationResponseSchema(schema.ResponseSchema): + """GetUESDiskSizeLimitation - 获取磁盘容量限制""" + + fields = { + "DiskSizeLimitationSet": fields.List( + models.DiskSizeLimitationSchema(), + required=False, + load_from="DiskSizeLimitationSet", + ), + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: GetUESNodeConf + +获取节点配置列表 +""" + + +class GetUESNodeConfRequestSchema(schema.RequestSchema): + """GetUESNodeConf - 获取节点配置列表""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetUESNodeConfResponseSchema(schema.ResponseSchema): + """GetUESNodeConf - 获取节点配置列表""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + "NodeConfList": fields.List( + models.NodeConfSchema(), required=True, load_from="NodeConfList" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: ListUESInstance + +获取实例列表 +""" + + +class ListUESInstanceRequestSchema(schema.RequestSchema): + """ListUESInstance - 获取实例列表""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class ListUESInstanceResponseSchema(schema.ResponseSchema): + """ListUESInstance - 获取实例列表""" + + fields = { + "ClusterSet": fields.List( + models.ClusterInfoSchema(), required=True, load_from="ClusterSet" + ), + "Message": fields.Str(required=False, load_from="Message"), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: ResizeUESInstance + +改配实例节点配置 +""" + + +class ResizeUESInstanceRequestSchema(schema.RequestSchema): + """ResizeUESInstance - 改配实例节点配置""" + + fields = { + "ForceResizing": fields.Bool(required=False, dump_to="ForceResizing"), + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "NodeConf": fields.Str(required=False, dump_to="NodeConf"), + "NodeDiskSize": fields.Int(required=False, dump_to="NodeDiskSize"), + "NodeRole": fields.Str(required=True, dump_to="NodeRole"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ResizeUESInstanceResponseSchema(schema.ResponseSchema): + """ResizeUESInstance - 改配实例节点配置""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: RestartUESInstance + +重启实例 +""" + + +class RestartUESInstanceRequestSchema(schema.RequestSchema): + """RestartUESInstance - 重启实例""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class RestartUESInstanceResponseSchema(schema.ResponseSchema): + """RestartUESInstance - 重启实例""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } diff --git a/ucloud/services/ues/schemas/models.py b/ucloud/services/ues/schemas/models.py new file mode 100644 index 00000000..fb3fccc6 --- /dev/null +++ b/ucloud/services/ues/schemas/models.py @@ -0,0 +1,115 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class NodeV2InfoSchema(schema.ResponseSchema): + """NodeV2Info - 节点信息详情""" + + fields = { + "CPU": fields.Int(required=True, load_from="CPU"), + "DiskSize": fields.Int(required=True, load_from="DiskSize"), + "DiskType": fields.Str(required=True, load_from="DiskType"), + "Memory": fields.Int(required=True, load_from="Memory"), + "NodeConf": fields.Str(required=True, load_from="NodeConf"), + "NodeIP": fields.Str(required=True, load_from="NodeIP"), + "NodeId": fields.Str(required=True, load_from="NodeId"), + "NodeName": fields.Str(required=True, load_from="NodeName"), + "NodeRole": fields.Str(required=True, load_from="NodeRole"), + "NodeState": fields.Str(required=True, load_from="NodeState"), + } + + +class ClusterV2InfoSchema(schema.ResponseSchema): + """ClusterV2Info - 集群信息""" + + fields = { + "BusinessId": fields.Str(required=False, load_from="BusinessId"), + "Region": fields.Str(required=False, load_from="Region"), + "ServiceVersion": fields.Str(required=True, load_from="ServiceVersion"), + "State": fields.Str(required=True, load_from="State"), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "UESInstanceId": fields.Str(required=True, load_from="UESInstanceId"), + "UESInstanceName": fields.Str( + required=True, load_from="UESInstanceName" + ), + "VPCId": fields.Str(required=True, load_from="VPCId"), + "Vip": fields.Str(required=False, load_from="Vip"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class ClusterNodeV2InfoSchema(schema.ResponseSchema): + """ClusterNodeV2Info -""" + + fields = { + "ClusterInfo": ClusterV2InfoSchema(), + "NodeInfoList": fields.List(NodeV2InfoSchema()), + "RequestId": fields.Str(required=False, load_from="RequestId"), + } + + +class AppVersionSchema(schema.ResponseSchema): + """AppVersion - ES可选版本详情""" + + fields = { + "AppName": fields.Str(required=True, load_from="AppName"), + "AppVersion": fields.Str(required=True, load_from="AppVersion"), + "IsMultiZone": fields.Bool(required=True, load_from="IsMultiZone"), + } + + +class DiskSizeLimitationSchema(schema.ResponseSchema): + """DiskSizeLimitation -""" + + fields = { + "DiskType": fields.Str(required=False, load_from="DiskType"), + "MaxSize": fields.Int(required=False, load_from="MaxSize"), + "MinSize": fields.Int(required=False, load_from="MinSize"), + } + + +class NodeConfSchema(schema.ResponseSchema): + """NodeConf - 节点配置信息详情""" + + fields = { + "CPU": fields.Int(required=True, load_from="CPU"), + "DiskSize": fields.Int(required=True, load_from="DiskSize"), + "DiskType": fields.Str(required=True, load_from="DiskType"), + "IsSecGroup": fields.Bool(required=True, load_from="IsSecGroup"), + "Memory": fields.Int(required=True, load_from="Memory"), + "NodeConf": fields.Str(required=True, load_from="NodeConf"), + } + + +class ClusterInfoSchema(schema.ResponseSchema): + """ClusterInfo - 集群信息""" + + fields = { + "AppName": fields.Str(required=True, load_from="AppName"), + "AppVersion": fields.Str(required=True, load_from="AppVersion"), + "BusinessId": fields.Str(required=True, load_from="BusinessId"), + "ChargeType": fields.Str(required=True, load_from="ChargeType"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "ExpireTime": fields.Int(required=True, load_from="ExpireTime"), + "InstanceId": fields.Str(required=True, load_from="InstanceId"), + "InstanceName": fields.Str(required=True, load_from="InstanceName"), + "IsSecGroup": fields.Bool(required=False, load_from="IsSecGroup"), + "MultiZones": fields.List(fields.Str()), + "NodeCount": fields.Int(required=True, load_from="NodeCount"), + "Resizable": fields.Bool(required=False, load_from="Resizable"), + "RunTime": fields.Int(required=True, load_from="RunTime"), + "ServiceVersion": fields.Str( + required=False, load_from="ServiceVersion" + ), + "State": fields.Str(required=True, load_from="State"), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "Tag": fields.Str(required=False, load_from="Tag"), + "UESInstanceId": fields.Str(required=False, load_from="UESInstanceId"), + "UESInstanceName": fields.Str( + required=False, load_from="UESInstanceName" + ), + "VPCId": fields.Str(required=False, load_from="VPCId"), + "Vip": fields.Str(required=False, load_from="Vip"), + "Zone": fields.Str(required=True, load_from="Zone"), + } diff --git a/ucloud/services/ufile/__init__.py b/ucloud/services/ufile/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/ufile/client.py b/ucloud/services/ufile/client.py new file mode 100644 index 00000000..6b746f84 --- /dev/null +++ b/ucloud/services/ufile/client.py @@ -0,0 +1,698 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.ufile.schemas import apis + + +class UFileClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UFileClient, self).__init__(config, transport, middleware, logger) + + def create_bucket( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateBucket - 创建Bucket + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BucketName** (str) - (Required) 待创建Bucket的名称,具有全局唯一性 + - **Type** (str) - Bucket访问类型,public或private; 默认为private + + **Response** + + - **BucketId** (str) - 已创建Bucket的ID + - **BucketName** (str) - 已创建Bucket的名称 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateBucketRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateBucket", d, **kwargs) + return apis.CreateBucketResponseSchema().loads(resp) + + def create_ufile_life_cycle( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUFileLifeCycle - 创建生命周期管理 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BucketName** (str) - (Required) 存储空间名称 + - **LifeCycleName** (str) - (Required) 生命周期名称 + - **Prefix** (str) - (Required) 生命周期所适用的前缀;*为整个存储空间文件;一条规则只支持一个文件前缀; + - **Status** (str) - (Required) Enabled -- 启用,Disabled -- 不启用 + - **ArchivalDays** (int) - 指定一个过期天数N,文件会在其最近更新时间点的N天后,自动变为归档存储类型;参数范围:[7,36500],0代表不启用 + - **Days** (int) - 指定一个过期天数N,文件会在其最近更新时间点的N天后过期,自动删除;参数范围:[7,36500],0代表不启用 + - **IADays** (int) - 指定一个过期天数N,文件会在其最近更新时间点的N天后,自动变为低频存储类型;参数范围:[7,36500],0代表不启用 + + **Response** + + - **LifeCycleId** (str) - 生命周期Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateUFileLifeCycleRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUFileLifeCycle", d, **kwargs) + return apis.CreateUFileLifeCycleResponseSchema().loads(resp) + + def create_ufile_token( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUFileToken - 创建US3令牌 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **TokenName** (str) - (Required) 令牌名称 + - **AllowedBuckets** (list) - 令牌允许操作的bucket,默认*表示全部 + - **AllowedOps** (list) - 令牌允许执行的操作[ TOKEN_ALLOW_NONE 没有权限, TOKEN_ALLOW_READ 下载权限 , TOKEN_ALLOW_WRITE 上传权限 , TOKEN_ALLOW_DELETE 删除权限 , TOKEN_ALLOW_LIST 列表权限, TOKEN_ALLOW_IOP 图片处理权限, TOKEN_DENY_UPDATE 禁止覆盖权限]。默认TOKEN_ALLOW_NONE + - **AllowedPrefixes** (list) - 令牌允许操作的key前缀,默认*表示全部 + - **BlackIPList** (list) - 令牌黑名单,支持ipv4,ipv6格式。 + - **ExpireTime** (int) - Unix 时间戳,精确到秒,为令牌过期时间点。默认过期时间为一天(即当前Unix时间戳+86400);注意:过期时间不能超过 4102416000 + - **WhiteIPList** (list) - 令牌白名单,支持ipv4,ipv6格式。 + + **Response** + + - **TokenId** (str) - 令牌唯一ID + - **UFileTokenSet** (dict) - 见 **UFileTokenSet** 模型定义 + + **Response Model** + + **UFileTokenSet** + - **AllowedBuckets** (list) - 令牌允许操作的bucket + - **AllowedOps** (list) - 令牌允许执行的操作,[ TOKEN_ALLOW_NONE 没有权限, TOKEN_ALLOW_READ 下载权限, TOKEN_ALLOW_WRITE 上传权限, TOKEN_ALLOW_DELETE 删除权限, TOKEN_ALLOW_LIST 列表权限, TOKEN_ALLOW_IOP 图片处理权限] + - **AllowedPrefixes** (list) - 令牌允许操作的key前缀 + - **BlackIPList** (list) - 令牌黑名单 + - **CreateTime** (int) - 创建时间 + - **ExpireTime** (int) - 令牌的超时时间点 + - **ModifyTime** (int) - 修改时间 + - **PrivateKey** (str) - 令牌私钥 + - **PublicKey** (str) - 令牌公钥 + - **Region** (str) - 所属地区 + - **TokenId** (str) - 令牌ID + - **TokenName** (str) - 令牌名称 + - **WhiteIPList** (list) - 令牌白名单 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateUFileTokenRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUFileToken", d, **kwargs) + return apis.CreateUFileTokenResponseSchema().loads(resp) + + def delete_bucket( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteBucket - 删除Bucket + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **BucketName** (str) - (Required) 待删除Bucket的名称 + + **Response** + + - **BucketId** (str) - Bucket的ID + - **BucketName** (str) - Bucket的名称 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DeleteBucketRequestSchema().dumps(d) + + resp = self.invoke("DeleteBucket", d, **kwargs) + return apis.DeleteBucketResponseSchema().loads(resp) + + def delete_ufile_life_cycle( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUFileLifeCycle - 删除生命周期管理 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BucketName** (str) - (Required) 存储空间名称 + - **LifeCycleId** (str) - (Required) 生命周期Id + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteUFileLifeCycleRequestSchema().dumps(d) + + resp = self.invoke("DeleteUFileLifeCycle", d, **kwargs) + return apis.DeleteUFileLifeCycleResponseSchema().loads(resp) + + def delete_ufile_token( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUFileToken - 删除令牌 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **TokenId** (str) - (Required) 令牌ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteUFileTokenRequestSchema().dumps(d) + + resp = self.invoke("DeleteUFileToken", d, **kwargs) + return apis.DeleteUFileTokenResponseSchema().loads(resp) + + def describe_bucket( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeBucket - 获取Bucket的描述信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 如果提供此参数,则获取相应地域下所有空间的空间名称(只返回空间名称信息) + - **BucketName** (str) - 待获取Bucket的名称,若不提供,则获取所有Bucket + - **Limit** (int) - 获取所有Bucket列表的限制数目,默认为20 + - **Offset** (int) - 获取所有Bucket列表的偏移数目,默认为0 + + **Response** + + - **DataSet** (list) - 见 **UFileBucketSet** 模型定义 + + **Response Model** + + **UFileBucketSet** + - **Biz** (str) - Bucket所属业务, general或vod或udb general: 普通业务; vod: 视频云业务; udb: 云数据库业务 + - **BucketId** (str) - Bucket的ID + - **BucketName** (str) - Bucket名称 + - **CdnDomainId** (list) - 与Bucket关联的CND加速域名的ID列表 + - **CreateTime** (int) - Bucket的创建时间 + - **Domain** (dict) - 见 **UFileDomainSet** 模型定义 + - **HasUserDomain** (int) - 是否存在自定义域名。0不存在,1存在,2错误 + - **ModifyTime** (int) - Bucket的修改时间 + - **Region** (str) - Bucket所属地域 + - **Tag** (str) - 所属业务组 + - **Type** (str) - Bucket访问类型 + + + **UFileDomainSet** + - **Cdn** (list) - UCDN加速域名 + - **CustomCdn** (list) - 用户自定义CDN加速域名 + - **CustomSrc** (list) - 用户自定义源站域名 + - **Src** (list) - 源站域名 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeBucketRequestSchema().dumps(d) + + resp = self.invoke("DescribeBucket", d, **kwargs) + return apis.DescribeBucketResponseSchema().loads(resp) + + def describe_ufile_life_cycle( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUFileLifeCycle - 获取生命周期信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BucketName** (str) - (Required) 存储空间名称 + - **LifeCycleId** (str) - 生命周期Id;不传递此参数拉取存储空间下面的所有生命周期信息 + + **Response** + + - **DateSet** (list) - 见 **LifeCycleItem** 模型定义 + + **Response Model** + + **LifeCycleItem** + - **ArchivalDays** (int) - 指定一个过期天数N,文件会在其最近更新时间点的N天后过期,自动转换为归档存储类型,0代表不启用; + - **BucketName** (str) - 存储空间名称 + - **Days** (int) - 指定一个过期天数N,文件会在其最近更新时间点的N天后过期,自动删除,0代表不启用; + - **IADays** (int) - 指定一个过期天数N,文件会在其最近更新时间点的N天后过期,自动转换为低频存储类型,0代表不启用; + - **LifeCycleId** (str) - 生命周期Id + - **LifeCycleName** (str) - 生命周期名称 + - **Prefix** (str) - 生命周期所适用的前缀;*为整个存储空间文件; + - **Status** (str) - Enabled -- 启用,Disabled -- 不启用 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUFileLifeCycleRequestSchema().dumps(d) + + resp = self.invoke("DescribeUFileLifeCycle", d, **kwargs) + return apis.DescribeUFileLifeCycleResponseSchema().loads(resp) + + def describe_ufile_token( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUFileToken - 获取令牌信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Display** (int) - 0表示显示部分token信息;不传递和其他情况表示显示全部token信息 + - **TokenId** (str) - 令牌ID,只返回指定ID信息,否则拉取所有令牌 + - **TokenName** (str) - 令牌名称,只返回指定令牌名称信息,否则拉取所有令牌 + + **Response** + + - **DataSet** (list) - 见 **UFileTokenSet** 模型定义 + + **Response Model** + + **UFileTokenSet** + - **AllowedBuckets** (list) - 令牌允许操作的bucket + - **AllowedOps** (list) - 令牌允许执行的操作,[ TOKEN_ALLOW_NONE , TOKEN_ALLOW_READ , TOKEN_ALLOW_WRITE , TOKEN_ALLOW_DELETE , TOKEN_ALLOW_LIST, TOKEN_ALLOW_IOP , TOKEN_ALLOW_DP ] + - **AllowedPrefixes** (list) - 令牌允许操作的key前缀 + - **CreateTime** (int) - 创建时间 + - **ExpireTime** (int) - 令牌的超时时间点 + - **ModifyTime** (int) - 修改时间 + - **PrivateKey** (str) - 令牌私钥 + - **PublicKey** (str) - 令牌公钥 + - **Region** (str) - 所属地区 + - **TokenId** (str) - 令牌ID + - **TokenName** (str) - 令牌名称 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUFileTokenRequestSchema().dumps(d) + + resp = self.invoke("DescribeUFileToken", d, **kwargs) + return apis.DescribeUFileTokenResponseSchema().loads(resp) + + def get_ufile_daily_report( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUFileDailyReport - 查看日消费报表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **EndTime** (int) - (Required) 查询结束时间;unix时间戳,单位s + - **StartTime** (int) - (Required) 查询开始时间;unix时间戳,单位s + - **BucketName** (str) - 空间名称。此字段不为空,返回此Bucket日使用量;否则,返回这个项目的日使用量 + + **Response** + + - **DataSet** (list) - 见 **UFileReportItem** 模型定义 + + **Response Model** + + **UFileReportItem** + - **Daily** (list) - 见 **UFileDailyReportItem** 模型定义 + - **Total** (list) - 见 **UFileTotalReportItem** 模型定义 + + + **UFileDailyReportItem** + - **AcRestore** (float) - 冷存激活量,即归档数据取回量;单位GB + - **AcStorage** (float) - 冷存(归档)存储量;单位GB + - **ApiTimes** (float) - API请求次数(万次) + - **BusyFlow** (float) - 忙时流量;单位GB;海外无此字段 + - **CdnFlow** (float) - cdn回源流量;单位GB + - **Date** (int) - 配额消费时间,unix时间戳(单位s),精确到日期 + - **Flow** (float) - 下载流量:单位GB;国内无此字段 + - **IaGetSize** (float) - 低频数据取回量;单位GB + - **IaStorage** (float) - 低频存储量;单位GB + - **IdleFlow** (float) - 闲时流量;单位GB;海外无此字段 + - **Storage** (float) - 标准存储量;单位GB + + + **UFileTotalReportItem** + - **ApiTimes** (float) - API请求次数(万次) + - **BusyFlow** (float) - 忙时流量;单位GB;海外无此字段 + - **CdnFlow** (float) - cdn回源流量;单位GB + - **Flow** (float) - 下载流量:单位GB;国内无此字段 + - **IdleFlow** (float) - 闲时流量;单位GB;海外无此字段 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUFileDailyReportRequestSchema().dumps(d) + + resp = self.invoke("GetUFileDailyReport", d, **kwargs) + return apis.GetUFileDailyReportResponseSchema().loads(resp) + + def get_ufile_quota( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUFileQuota - 查看配额状态 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **QuotaType** (str) - (Required) 配额类型,取值为storage-volume, download-traffic或request-count + + **Response** + + - **LeftQuota** (float) - 剩余的配额数值 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUFileQuotaRequestSchema().dumps(d) + + resp = self.invoke("GetUFileQuota", d, **kwargs) + return apis.GetUFileQuotaResponseSchema().loads(resp) + + def get_ufile_quota_info( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUFileQuotaInfo - 获取配额信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **QuotaType** (list) - (Required) 配额类型,取值为storage-volume, download-traffic或request-count + + **Response** + + - **DataSet** (list) - 见 **UFileQuotaDataSetItem** 模型定义 + + **Response Model** + + **UFileQuotaDataSetItem** + - **DownloadFlow** (dict) - 见 **UFileQuotaLeft** 模型定义 + - **Owe** (int) - 是否欠费:1表示欠费;0表示未欠费 + - **Region** (str) - 可用地域 + - **RequestCnt** (dict) - 见 **UFileQuotaLeft** 模型定义 + - **Storage** (dict) - 见 **UFileQuotaLeft** 模型定义 + + + **UFileQuotaLeft** + - **Left** (float) - 配额剩余量 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUFileQuotaInfoRequestSchema().dumps(d) + + resp = self.invoke("GetUFileQuotaInfo", d, **kwargs) + return apis.GetUFileQuotaInfoResponseSchema().loads(resp) + + def get_ufile_quota_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUFileQuotaPrice - 根据US3的购买配额,查询需要支付的价格。 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DownloadTraffic** (int) - 下载流量,单位: GB,范围: [0, 60 000],步长:1GB + - **RequestCount** (int) - 请求次数,单位:万次,范围:[0, 1 000 000],步长:1万次 + - **StorageVolume** (int) - 存储容量,单位: GB*天,范围: [0, 30 000 000],步长:100GB*天 + + **Response** + + - **Price** (float) - 待支付价格,单位:分 + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUFileQuotaPriceRequestSchema().dumps(d) + + resp = self.invoke("GetUFileQuotaPrice", d, **kwargs) + return apis.GetUFileQuotaPriceResponseSchema().loads(resp) + + def get_ufile_report( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUFileReport - 查看配额使用报表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **EndTime** (int) - (Required) 查询结束时间 + - **StartTime** (int) - (Required) 查询开始时间 + + **Response** + + - **DataSet** (list) - 见 **UFileReportSet** 模型定义 + + **Response Model** + + **UFileReportSet** + - **DownloadTraffic** (float) - 配额消费当日使用的下载流量,单位:GB + - **RequestCount** (float) - 配额消费当日使用的请求次数,单位:万次 + - **StorageVolume** (float) - 配额消费当日使用的存储容量,单位:GB*天 + - **Time** (int) - 配额消费时间,unix时间戳,精确到日期 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUFileReportRequestSchema().dumps(d) + + resp = self.invoke("GetUFileReport", d, **kwargs) + return apis.GetUFileReportResponseSchema().loads(resp) + + def set_ufile_referer( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """SetUFileReferer - 设置对象存储防盗链 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BucketName** (str) - (Required) 存储空间名称 + - **RefererStatus** (str) - (Required) 开启关闭referer防盗链;关闭防盗链会清空防盗链参数设置,开启防盗链必须指定 RefererType、Referers;开启:on, 关闭:off; + - **RefererAllowNull** (bool) - RefererType为白名单时,RefererAllowNull为false代表不允许空referer访问,为true代表允许空referer访问;此参数默认为 true; + - **RefererType** (int) - 防盗链Referer类型,支持两种类型,黑名单和白名单; 1黑名单,2白名单;RefererStatus为"on"时此参数必填; + - **Referers** (list) - 防盗链Referer规则,支持正则表达式(不支持符号';') + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.SetUFileRefererRequestSchema().dumps(d) + + resp = self.invoke("SetUFileReferer", d, **kwargs) + return apis.SetUFileRefererResponseSchema().loads(resp) + + def update_bucket( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateBucket - 更改Bucket的属性 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **BucketName** (str) - (Required) 待修改Bucket的名称 + - **Type** (str) - (Required) Bucket访问类型;public或private + + **Response** + + - **BucketId** (str) - Bucket的ID + - **BucketName** (str) - Bucket的名称 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.UpdateBucketRequestSchema().dumps(d) + + resp = self.invoke("UpdateBucket", d, **kwargs) + return apis.UpdateBucketResponseSchema().loads(resp) + + def update_ufile_life_cycle( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateUFileLifeCycle - 更新生命周期管理 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BucketName** (str) - (Required) 存储空间名称 + - **LifeCycleId** (str) - (Required) 生命周期Id + - **LifeCycleName** (str) - (Required) 生命周期名称 + - **Prefix** (str) - (Required) 生命周期所适用的前缀;*为整个存储空间文件;一条规则只支持一个文件前缀; + - **Status** (str) - (Required) Enabled -- 启用,Disabled -- 不启用 + - **ArchivalDays** (int) - 指定一个过期天数N,文件会在其最近更新时间点的N天后过期,自动转换为归档存储类型;范围: [7,36500],0代表不启用 + - **Days** (int) - 指定一个过期天数N,文件会在其最近更新时间点的N天后过期,自动删除;范围: [7,36500] + - **IADays** (int) - 指定一个过期天数N,文件会在其最近更新时间点的N天后过期,自动转换为低频存储类型;范围: [7,36500],0代表不启用 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateUFileLifeCycleRequestSchema().dumps(d) + + resp = self.invoke("UpdateUFileLifeCycle", d, **kwargs) + return apis.UpdateUFileLifeCycleResponseSchema().loads(resp) + + def update_ufile_token( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateUFileToken - 更新令牌的操作权限,可操作key的前缀,可操作bucket和令牌超时时间点 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **TokenId** (str) - (Required) 令牌ID + - **AllowedBuckets** (list) - 令牌允许操作的bucket + - **AllowedOps** (list) - 令牌允许执行的操作,[ TOKEN_ALLOW_NONE , TOKEN_ALLOW_READ , TOKEN_ALLOW_WRITE , TOKEN_ALLOW_DELETE , TOKEN_ALLOW_LIST, TOKEN_ALLOW_IOP , TOKEN_ALLOW_DP ] + - **AllowedPrefixes** (list) - 令牌允许操作的key前缀 + - **ExpireTime** (int) - 令牌的超时时间点(时间戳);注意:过期时间不能超过 4102416000 + - **TokenName** (str) - 令牌名称 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateUFileTokenRequestSchema().dumps(d) + + resp = self.invoke("UpdateUFileToken", d, **kwargs) + return apis.UpdateUFileTokenResponseSchema().loads(resp) + + def update_uds_rule( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateUdsRule - 针对对象存储的文件,进行自动触发解压。 + + **Request** + + - **DstBucket** (str) - (Required) 目标Bucket名字,全局唯一 + - **DstDirectory** (str) - (Required) 解压后的目标目录 + - **DstTokenId** (str) - (Required) 目标bucket的token之一的tokenId + - **KeepUS3Name** (bool) - (Required) 是否以压缩文件的前缀为最后一层目录 + - **Prefixes** (str) - (Required) 触发解压缩的前缀 + - **RuleId** (str) - (Required) 规则的唯一Id + - **RuleName** (str) - (Required) 规则名称 + - **SrcBucket** (str) - (Required) 源Bucket名字,全局唯一 + - **SrcTokenId** (str) - (Required) 源bucket的token之一的tokenId + - **ContactGroupId** (str) - 联系的用户组ID + - **Events** (list) - 通知的事件数组 + - **NotificationTypes** (list) - 通知的类型数组 + - **Ops** (list) - 操作的ops数组,"Ops.0":"unzip" + + **Response** + + - **Mesage** (str) - 该请求的消息成功或者失败的描述 + - **RuleId** (str) - 返回规则的规则ID + + """ + # build request + d = {} + req and d.update(req) + d = apis.UpdateUdsRuleRequestSchema().dumps(d) + + resp = self.invoke("UpdateUdsRule", d, **kwargs) + return apis.UpdateUdsRuleResponseSchema().loads(resp) diff --git a/ucloud/services/ufile/schemas/__init__.py b/ucloud/services/ufile/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/ufile/schemas/apis.py b/ucloud/services/ufile/schemas/apis.py new file mode 100644 index 00000000..c521b6ad --- /dev/null +++ b/ucloud/services/ufile/schemas/apis.py @@ -0,0 +1,542 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.ufile.schemas import models + +""" UFile API Schema +""" + + +""" +API: CreateBucket + +创建Bucket +""" + + +class CreateBucketRequestSchema(schema.RequestSchema): + """CreateBucket - 创建Bucket""" + + fields = { + "BucketName": fields.Str(required=True, dump_to="BucketName"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Type": fields.Str(required=False, dump_to="Type"), + } + + +class CreateBucketResponseSchema(schema.ResponseSchema): + """CreateBucket - 创建Bucket""" + + fields = { + "BucketId": fields.Str(required=False, load_from="BucketId"), + "BucketName": fields.Str(required=False, load_from="BucketName"), + } + + +""" +API: CreateUFileLifeCycle + +创建生命周期管理 +""" + + +class CreateUFileLifeCycleRequestSchema(schema.RequestSchema): + """CreateUFileLifeCycle - 创建生命周期管理""" + + fields = { + "ArchivalDays": fields.Int(required=False, dump_to="ArchivalDays"), + "BucketName": fields.Str(required=True, dump_to="BucketName"), + "Days": fields.Int(required=False, dump_to="Days"), + "IADays": fields.Int(required=False, dump_to="IADays"), + "LifeCycleName": fields.Str(required=True, dump_to="LifeCycleName"), + "Prefix": fields.Str(required=True, dump_to="Prefix"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "Status": fields.Str(required=True, dump_to="Status"), + } + + +class CreateUFileLifeCycleResponseSchema(schema.ResponseSchema): + """CreateUFileLifeCycle - 创建生命周期管理""" + + fields = { + "LifeCycleId": fields.Str(required=True, load_from="LifeCycleId"), + } + + +""" +API: CreateUFileToken + +创建US3令牌 +""" + + +class CreateUFileTokenRequestSchema(schema.RequestSchema): + """CreateUFileToken - 创建US3令牌""" + + fields = { + "AllowedBuckets": fields.List(fields.Str()), + "AllowedOps": fields.List(fields.Str()), + "AllowedPrefixes": fields.List(fields.Str()), + "BlackIPList": fields.List(fields.Str()), + "ExpireTime": fields.Int(required=False, dump_to="ExpireTime"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "TokenName": fields.Str(required=True, dump_to="TokenName"), + "WhiteIPList": fields.List(fields.Str()), + } + + +class CreateUFileTokenResponseSchema(schema.ResponseSchema): + """CreateUFileToken - 创建US3令牌""" + + fields = { + "TokenId": fields.Str(required=False, load_from="TokenId"), + "UFileTokenSet": models.UFileTokenSetSchema(), + } + + +""" +API: DeleteBucket + +删除Bucket +""" + + +class DeleteBucketRequestSchema(schema.RequestSchema): + """DeleteBucket - 删除Bucket""" + + fields = { + "BucketName": fields.Str(required=True, dump_to="BucketName"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class DeleteBucketResponseSchema(schema.ResponseSchema): + """DeleteBucket - 删除Bucket""" + + fields = { + "BucketId": fields.Str(required=False, load_from="BucketId"), + "BucketName": fields.Str(required=False, load_from="BucketName"), + } + + +""" +API: DeleteUFileLifeCycle + +删除生命周期管理 +""" + + +class DeleteUFileLifeCycleRequestSchema(schema.RequestSchema): + """DeleteUFileLifeCycle - 删除生命周期管理""" + + fields = { + "BucketName": fields.Str(required=True, dump_to="BucketName"), + "LifeCycleId": fields.Str(required=True, dump_to="LifeCycleId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + } + + +class DeleteUFileLifeCycleResponseSchema(schema.ResponseSchema): + """DeleteUFileLifeCycle - 删除生命周期管理""" + + fields = {} + + +""" +API: DeleteUFileToken + +删除令牌 +""" + + +class DeleteUFileTokenRequestSchema(schema.RequestSchema): + """DeleteUFileToken - 删除令牌""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "TokenId": fields.Str(required=True, dump_to="TokenId"), + } + + +class DeleteUFileTokenResponseSchema(schema.ResponseSchema): + """DeleteUFileToken - 删除令牌""" + + fields = {} + + +""" +API: DescribeBucket + +获取Bucket的描述信息 +""" + + +class DescribeBucketRequestSchema(schema.RequestSchema): + """DescribeBucket - 获取Bucket的描述信息""" + + fields = { + "BucketName": fields.Str(required=False, dump_to="BucketName"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + } + + +class DescribeBucketResponseSchema(schema.ResponseSchema): + """DescribeBucket - 获取Bucket的描述信息""" + + fields = { + "DataSet": fields.List( + models.UFileBucketSetSchema(), required=False, load_from="DataSet" + ), + } + + +""" +API: DescribeUFileLifeCycle + +获取生命周期信息 +""" + + +class DescribeUFileLifeCycleRequestSchema(schema.RequestSchema): + """DescribeUFileLifeCycle - 获取生命周期信息""" + + fields = { + "BucketName": fields.Str(required=True, dump_to="BucketName"), + "LifeCycleId": fields.Str(required=False, dump_to="LifeCycleId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + } + + +class DescribeUFileLifeCycleResponseSchema(schema.ResponseSchema): + """DescribeUFileLifeCycle - 获取生命周期信息""" + + fields = { + "DateSet": fields.List( + models.LifeCycleItemSchema(), required=True, load_from="DateSet" + ), + } + + +""" +API: DescribeUFileToken + +获取令牌信息 +""" + + +class DescribeUFileTokenRequestSchema(schema.RequestSchema): + """DescribeUFileToken - 获取令牌信息""" + + fields = { + "Display": fields.Int(required=False, dump_to="Display"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "TokenId": fields.Str(required=False, dump_to="TokenId"), + "TokenName": fields.Str(required=False, dump_to="TokenName"), + } + + +class DescribeUFileTokenResponseSchema(schema.ResponseSchema): + """DescribeUFileToken - 获取令牌信息""" + + fields = { + "DataSet": fields.List( + models.UFileTokenSetSchema(), required=True, load_from="DataSet" + ), + } + + +""" +API: GetUFileDailyReport + +查看日消费报表 +""" + + +class GetUFileDailyReportRequestSchema(schema.RequestSchema): + """GetUFileDailyReport - 查看日消费报表""" + + fields = { + "BucketName": fields.Str(required=False, dump_to="BucketName"), + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "StartTime": fields.Int(required=True, dump_to="StartTime"), + } + + +class GetUFileDailyReportResponseSchema(schema.ResponseSchema): + """GetUFileDailyReport - 查看日消费报表""" + + fields = { + "DataSet": fields.List( + models.UFileReportItemSchema(), required=True, load_from="DataSet" + ), + } + + +""" +API: GetUFileQuota + +查看配额状态 +""" + + +class GetUFileQuotaRequestSchema(schema.RequestSchema): + """GetUFileQuota - 查看配额状态""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "QuotaType": fields.Str(required=True, dump_to="QuotaType"), + } + + +class GetUFileQuotaResponseSchema(schema.ResponseSchema): + """GetUFileQuota - 查看配额状态""" + + fields = { + "LeftQuota": fields.Float(required=False, load_from="LeftQuota"), + } + + +""" +API: GetUFileQuotaInfo + +获取配额信息 +""" + + +class GetUFileQuotaInfoRequestSchema(schema.RequestSchema): + """GetUFileQuotaInfo - 获取配额信息""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "QuotaType": fields.List(fields.Str()), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class GetUFileQuotaInfoResponseSchema(schema.ResponseSchema): + """GetUFileQuotaInfo - 获取配额信息""" + + fields = { + "DataSet": fields.List( + models.UFileQuotaDataSetItemSchema(), + required=False, + load_from="DataSet", + ), + } + + +""" +API: GetUFileQuotaPrice + +根据US3的购买配额,查询需要支付的价格。 +""" + + +class GetUFileQuotaPriceRequestSchema(schema.RequestSchema): + """GetUFileQuotaPrice - 根据US3的购买配额,查询需要支付的价格。""" + + fields = { + "DownloadTraffic": fields.Int( + required=False, dump_to="DownloadTraffic" + ), + "Region": fields.Str(required=True, dump_to="Region"), + "RequestCount": fields.Int(required=False, dump_to="RequestCount"), + "StorageVolume": fields.Int(required=False, dump_to="StorageVolume"), + } + + +class GetUFileQuotaPriceResponseSchema(schema.ResponseSchema): + """GetUFileQuotaPrice - 根据US3的购买配额,查询需要支付的价格。""" + + fields = { + "Price": fields.Float(required=False, load_from="Price"), + } + + +""" +API: GetUFileReport + +查看配额使用报表 +""" + + +class GetUFileReportRequestSchema(schema.RequestSchema): + """GetUFileReport - 查看配额使用报表""" + + fields = { + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "StartTime": fields.Int(required=True, dump_to="StartTime"), + } + + +class GetUFileReportResponseSchema(schema.ResponseSchema): + """GetUFileReport - 查看配额使用报表""" + + fields = { + "DataSet": fields.List( + models.UFileReportSetSchema(), required=False, load_from="DataSet" + ), + } + + +""" +API: SetUFileReferer + +设置对象存储防盗链 +""" + + +class SetUFileRefererRequestSchema(schema.RequestSchema): + """SetUFileReferer - 设置对象存储防盗链""" + + fields = { + "BucketName": fields.Str(required=True, dump_to="BucketName"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "RefererAllowNull": fields.Bool( + required=False, dump_to="RefererAllowNull" + ), + "RefererStatus": fields.Str(required=True, dump_to="RefererStatus"), + "RefererType": fields.Int(required=False, dump_to="RefererType"), + "Referers": fields.List(fields.Str()), + "Region": fields.Str(required=False, dump_to="Region"), + } + + +class SetUFileRefererResponseSchema(schema.ResponseSchema): + """SetUFileReferer - 设置对象存储防盗链""" + + fields = {} + + +""" +API: UpdateBucket + +更改Bucket的属性 +""" + + +class UpdateBucketRequestSchema(schema.RequestSchema): + """UpdateBucket - 更改Bucket的属性""" + + fields = { + "BucketName": fields.Str(required=True, dump_to="BucketName"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Type": fields.Str(required=True, dump_to="Type"), + } + + +class UpdateBucketResponseSchema(schema.ResponseSchema): + """UpdateBucket - 更改Bucket的属性""" + + fields = { + "BucketId": fields.Str(required=False, load_from="BucketId"), + "BucketName": fields.Str(required=False, load_from="BucketName"), + } + + +""" +API: UpdateUFileLifeCycle + +更新生命周期管理 +""" + + +class UpdateUFileLifeCycleRequestSchema(schema.RequestSchema): + """UpdateUFileLifeCycle - 更新生命周期管理""" + + fields = { + "ArchivalDays": fields.Int(required=False, dump_to="ArchivalDays"), + "BucketName": fields.Str(required=True, dump_to="BucketName"), + "Days": fields.Int(required=False, dump_to="Days"), + "IADays": fields.Int(required=False, dump_to="IADays"), + "LifeCycleId": fields.Str(required=True, dump_to="LifeCycleId"), + "LifeCycleName": fields.Str(required=True, dump_to="LifeCycleName"), + "Prefix": fields.Str(required=True, dump_to="Prefix"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "Status": fields.Str(required=True, dump_to="Status"), + } + + +class UpdateUFileLifeCycleResponseSchema(schema.ResponseSchema): + """UpdateUFileLifeCycle - 更新生命周期管理""" + + fields = {} + + +""" +API: UpdateUFileToken + +更新令牌的操作权限,可操作key的前缀,可操作bucket和令牌超时时间点 +""" + + +class UpdateUFileTokenRequestSchema(schema.RequestSchema): + """UpdateUFileToken - 更新令牌的操作权限,可操作key的前缀,可操作bucket和令牌超时时间点""" + + fields = { + "AllowedBuckets": fields.List(fields.Str()), + "AllowedOps": fields.List(fields.Str()), + "AllowedPrefixes": fields.List(fields.Str()), + "ExpireTime": fields.Int(required=False, dump_to="ExpireTime"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "TokenId": fields.Str(required=True, dump_to="TokenId"), + "TokenName": fields.Str(required=False, dump_to="TokenName"), + } + + +class UpdateUFileTokenResponseSchema(schema.ResponseSchema): + """UpdateUFileToken - 更新令牌的操作权限,可操作key的前缀,可操作bucket和令牌超时时间点""" + + fields = {} + + +""" +API: UpdateUdsRule + +针对对象存储的文件,进行自动触发解压。 +""" + + +class UpdateUdsRuleRequestSchema(schema.RequestSchema): + """UpdateUdsRule - 针对对象存储的文件,进行自动触发解压。""" + + fields = { + "ContactGroupId": fields.Str(required=False, dump_to="ContactGroupId"), + "DstBucket": fields.Str(required=True, dump_to="DstBucket"), + "DstDirectory": fields.Str(required=True, dump_to="DstDirectory"), + "DstTokenId": fields.Str(required=True, dump_to="DstTokenId"), + "Events": fields.List(fields.Str()), + "KeepUS3Name": fields.Bool(required=True, dump_to="KeepUS3Name"), + "NotificationTypes": fields.List(fields.Str()), + "Ops": fields.List(fields.Str()), + "Prefixes": fields.Str(required=True, dump_to="Prefixes"), + "RuleId": fields.Str(required=True, dump_to="RuleId"), + "RuleName": fields.Str(required=True, dump_to="RuleName"), + "SrcBucket": fields.Str(required=True, dump_to="SrcBucket"), + "SrcTokenId": fields.Str(required=True, dump_to="SrcTokenId"), + } + + +class UpdateUdsRuleResponseSchema(schema.ResponseSchema): + """UpdateUdsRule - 针对对象存储的文件,进行自动触发解压。""" + + fields = { + "Mesage": fields.Str(required=False, load_from="Mesage"), + "RuleId": fields.Str(required=True, load_from="RuleId"), + } diff --git a/ucloud/services/ufile/schemas/models.py b/ucloud/services/ufile/schemas/models.py new file mode 100644 index 00000000..df019d23 --- /dev/null +++ b/ucloud/services/ufile/schemas/models.py @@ -0,0 +1,139 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class UFileTokenSetSchema(schema.ResponseSchema): + """UFileTokenSet - ufile令牌集合""" + + fields = { + "AllowedBuckets": fields.List(fields.Str()), + "AllowedOps": fields.List(fields.Str()), + "AllowedPrefixes": fields.List(fields.Str()), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "ExpireTime": fields.Int(required=True, load_from="ExpireTime"), + "ModifyTime": fields.Int(required=True, load_from="ModifyTime"), + "PrivateKey": fields.Str(required=True, load_from="PrivateKey"), + "PublicKey": fields.Str(required=True, load_from="PublicKey"), + "Region": fields.Str(required=True, load_from="Region"), + "TokenId": fields.Str(required=True, load_from="TokenId"), + "TokenName": fields.Str(required=True, load_from="TokenName"), + } + + +class UFileDomainSetSchema(schema.ResponseSchema): + """UFileDomainSet - DescribeBucket""" + + fields = { + "Cdn": fields.List(fields.Str()), + "CustomCdn": fields.List(fields.Str()), + "CustomSrc": fields.List(fields.Str()), + "Src": fields.List(fields.Str()), + } + + +class UFileBucketSetSchema(schema.ResponseSchema): + """UFileBucketSet - DescribeBucket""" + + fields = { + "Biz": fields.Str(required=False, load_from="Biz"), + "BucketId": fields.Str(required=False, load_from="BucketId"), + "BucketName": fields.Str(required=False, load_from="BucketName"), + "CdnDomainId": fields.List(fields.Str()), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "Domain": UFileDomainSetSchema(), + "HasUserDomain": fields.Int(required=False, load_from="HasUserDomain"), + "ModifyTime": fields.Int(required=False, load_from="ModifyTime"), + "Region": fields.Str(required=False, load_from="Region"), + "Tag": fields.Str(required=False, load_from="Tag"), + "Type": fields.Str(required=False, load_from="Type"), + } + + +class LifeCycleItemSchema(schema.ResponseSchema): + """LifeCycleItem - 生命周期信息""" + + fields = { + "ArchivalDays": fields.Int(required=False, load_from="ArchivalDays"), + "BucketName": fields.Str(required=False, load_from="BucketName"), + "Days": fields.Int(required=False, load_from="Days"), + "IADays": fields.Int(required=False, load_from="IADays"), + "LifeCycleId": fields.Str(required=False, load_from="LifeCycleId"), + "LifeCycleName": fields.Str(required=False, load_from="LifeCycleName"), + "Prefix": fields.Str(required=False, load_from="Prefix"), + "Status": fields.Str(required=False, load_from="Status"), + } + + +class UFileTotalReportItemSchema(schema.ResponseSchema): + """UFileTotalReportItem - 总消费信息""" + + fields = { + "ApiTimes": fields.Float(required=False, load_from="ApiTimes"), + "BusyFlow": fields.Float(required=False, load_from="BusyFlow"), + "CdnFlow": fields.Float(required=False, load_from="CdnFlow"), + "Flow": fields.Float(required=False, load_from="Flow"), + "IdleFlow": fields.Float(required=False, load_from="IdleFlow"), + } + + +class UFileDailyReportItemSchema(schema.ResponseSchema): + """UFileDailyReportItem -""" + + fields = { + "AcRestore": fields.Float(required=False, load_from="AcRestore"), + "AcStorage": fields.Float(required=False, load_from="AcStorage"), + "ApiTimes": fields.Float(required=False, load_from="ApiTimes"), + "BusyFlow": fields.Float(required=False, load_from="BusyFlow"), + "CdnFlow": fields.Float(required=False, load_from="CdnFlow"), + "Date": fields.Int(required=False, load_from="Date"), + "Flow": fields.Float(required=False, load_from="Flow"), + "IaGetSize": fields.Float(required=False, load_from="IaGetSize"), + "IaStorage": fields.Float(required=False, load_from="IaStorage"), + "IdleFlow": fields.Float(required=False, load_from="IdleFlow"), + "Storage": fields.Float(required=False, load_from="Storage"), + } + + +class UFileReportItemSchema(schema.ResponseSchema): + """UFileReportItem -""" + + fields = { + "Daily": fields.List(UFileDailyReportItemSchema()), + "Total": fields.List(UFileTotalReportItemSchema()), + } + + +class UFileQuotaLeftSchema(schema.ResponseSchema): + """UFileQuotaLeft - 配额剩余量""" + + fields = { + "Left": fields.Float(required=False, load_from="Left"), + } + + +class UFileQuotaDataSetItemSchema(schema.ResponseSchema): + """UFileQuotaDataSetItem - 配额信息""" + + fields = { + "DownloadFlow": UFileQuotaLeftSchema(), + "Owe": fields.Int(required=False, load_from="Owe"), + "Region": fields.Str(required=False, load_from="Region"), + "RequestCnt": UFileQuotaLeftSchema(), + "Storage": UFileQuotaLeftSchema(), + } + + +class UFileReportSetSchema(schema.ResponseSchema): + """UFileReportSet - GetUFileReport""" + + fields = { + "DownloadTraffic": fields.Float( + required=False, load_from="DownloadTraffic" + ), + "RequestCount": fields.Float(required=False, load_from="RequestCount"), + "StorageVolume": fields.Float( + required=False, load_from="StorageVolume" + ), + "Time": fields.Int(required=False, load_from="Time"), + } diff --git a/ucloud/services/ufs/client.py b/ucloud/services/ufs/client.py index 8327b9bf..256d132d 100644 --- a/ucloud/services/ufs/client.py +++ b/ucloud/services/ufs/client.py @@ -13,31 +13,65 @@ def __init__( ): super(UFSClient, self).__init__(config, transport, middleware, logger) + def add_ufs_volume_mount_point( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AddUFSVolumeMountPoint - 添加文件系统挂载点 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **MountPointName** (str) - (Required) 挂载点名称 + - **SubnetId** (str) - (Required) Subnet ID + - **VolumeId** (str) - (Required) 文件系统ID + - **VpcId** (str) - (Required) Vpc ID + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.AddUFSVolumeMountPointRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AddUFSVolumeMountPoint", d, **kwargs) + return apis.AddUFSVolumeMountPointResponseSchema().loads(resp) + def create_ufs_volume( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateUFSVolume - 创建文件系统 + """CreateUFSVolume - 创建文件系统 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **ProtocolType** (str) - (Required) 文件系统协议,枚举值,NFSv3表示NFS V3协议,NFSv4表示NFS V4协议 - - **Size** (int) - (Required) 文件系统大小,单位为GB,最大不超过20T,香港容量型必须为100的整数倍,Size最小为500GB,北京,上海,广州的容量型必须为1024的整数倍,Size最小为1024GB。性能型文件系统Size最小为100GB - - **StorageType** (str) - (Required) 文件系统存储类型,枚举值,Basic表示容量型,Advanced表示性能型 + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProtocolType** (str) - (Required) 文件系统协议,目前仅支持NFSv4 + - **Size** (int) - (Required) 文件系统大小,单位为GB,必须为100的整数倍,容量型Size最小为500GB,性能型文件系统Size最小为100GB + - **StorageType** (str) - (Required) 文件系统存储类型,Basic表示容量型,Advanced表示性能型 - **ChargeType** (str) - 计费模式,枚举值为: Year,按年付费; Month,按月付费; Dynamic,按需付费(需开启权限); Trial,试用(需开启权限) 默认为Dynamic - **CouponId** (str) - 使用的代金券id - **Quantity** (int) - 购买时长 默认: 1 - **Remark** (str) - 备注 - **Tag** (str) - 文件系统所属业务组 - **VolumeName** (str) - 文件系统名称 - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **VolumeId** (str) - 文件系统ID - **VolumeName** (str) - 文件系统名称 - **VolumeStatus** (str) - 文件系统挂载点状态 - + """ # build request d = { @@ -56,25 +90,25 @@ def create_ufs_volume( def describe_ufs_volume_2( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUFSVolume2 - 获取文件系统列表 + """DescribeUFSVolume2 - 获取文件系统列表 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Limit** (int) - 文件列表长度 - **Offset** (int) - 文件列表起始 - **VolumeId** (str) - 文件系统ID - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **DataSet** (list) - 见 **UFSVolumeInfo2** 模型定义 - **TotalCount** (int) - 文件系统总数 - + **Response Model** - - **UFSVolumeInfo2** - + + **UFSVolumeInfo2** - **CreateTime** (int) - 文件系统创建时间(unix时间戳) - **ExpiredTime** (int) - 文件系统过期时间(unix时间戳) - **IsExpired** (str) - 是否过期 @@ -89,6 +123,7 @@ def describe_ufs_volume_2( - **VolumeId** (str) - 文件系统ID - **VolumeName** (str) - 文件系统名称 + """ # build request d = { @@ -101,21 +136,102 @@ def describe_ufs_volume_2( resp = self.invoke("DescribeUFSVolume2", d, **kwargs) return apis.DescribeUFSVolume2ResponseSchema().loads(resp) + def describe_ufs_volume_mountpoint( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUFSVolumeMountpoint - 获取文件系统挂载点信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **VolumeId** (str) - (Required) 文件系统ID + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **DataSet** (list) - 见 **MountPointInfo** 模型定义 + - **MaxMountPointNum** (int) - 文件系统能创建的最大挂载点数目 + - **TotalMountPointNum** (int) - 目前的挂载点总数 + + **Response Model** + + **MountPointInfo** + - **CreateTime** (int) - 文件系统创建时间(unix时间戳) + - **MountPointIp** (str) - ${挂载点IP}:/ + - **MountPointName** (str) - 挂载点名称 + - **SubnetDescription** (str) - Subnet ID + 网段的形式,方便前端展示 + - **SubnetId** (str) - Subnet ID + - **VpcId** (str) - Vpc ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUFSVolumeMountpointRequestSchema().dumps(d) + + resp = self.invoke("DescribeUFSVolumeMountpoint", d, **kwargs) + return apis.DescribeUFSVolumeMountpointResponseSchema().loads(resp) + + def describe_ufs_volume_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUFSVolumePrice - 获取文件系统价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Size** (int) - (Required) 文件系统大小,单位为GB,新架构容量型最小容量为500GB,以100GB递增,最大不超过100TB。新架构性能型最小容量为100GB,以100GB递增,最大不超过20TB + - **StorageType** (str) - (Required) 文件存储类型,枚举值,Basic表示容量型产品,Advanced表示性能型产品 + - **ChargeType** (str) - Year, Month, Dynamic,Trial,默认: Dynamic + - **Quantity** (int) - 购买UFS的时长, 默认为1 + - **VolumeId** (str) - 文件系统id,第一次创建文件系统时不需要传这个参数 + + **Response** + + - **DataSet** (list) - 见 **UFSPriceDataSet** 模型定义 + + **Response Model** + + **UFSPriceDataSet** + - **ChargeName** (str) - “UFS” + - **ChargeType** (str) - Year, Month, Dynamic,Trial + - **Price** (float) - 价格 (单位: 分) + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUFSVolumePriceRequestSchema().dumps(d) + + resp = self.invoke("DescribeUFSVolumePrice", d, **kwargs) + return apis.DescribeUFSVolumePriceResponseSchema().loads(resp) + def extend_ufs_volume( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ExtendUFSVolume - 文件系统扩容 + """ExtendUFSVolume - 文件系统扩容 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Size** (int) - (Required) 文件系统大小,单位为GB,最大不超过20T,香港容量型必须为100的整数倍,Size最小为500GB,北京,上海,广州的容量型必须为1024的整数倍,Size最小为1024GB。性能型文件系统Size最小为100GB - **VolumeId** (str) - (Required) 文件系统ID - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - + """ # build request d = { @@ -131,17 +247,18 @@ def extend_ufs_volume( def remove_ufs_volume( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ RemoveUFSVolume - 删除UFS文件系统 + """RemoveUFSVolume - 删除UFS文件系统 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **VolumeId** (str) - (Required) 文件系统ID - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - + """ # build request d = { @@ -153,3 +270,59 @@ def remove_ufs_volume( resp = self.invoke("RemoveUFSVolume", d, **kwargs) return apis.RemoveUFSVolumeResponseSchema().loads(resp) + + def remove_ufs_volume_mount_point( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RemoveUFSVolumeMountPoint - 删除文件系统挂载点 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SubnetId** (str) - (Required) Subnet ID + - **VolumeId** (str) - (Required) 文件系统ID + - **VpcId** (str) - (Required) Vpc ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.RemoveUFSVolumeMountPointRequestSchema().dumps(d) + + resp = self.invoke("RemoveUFSVolumeMountPoint", d, **kwargs) + return apis.RemoveUFSVolumeMountPointResponseSchema().loads(resp) + + def update_ufs_volume_info( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateUFSVolumeInfo - 更改文件系统相关信息(名称/备注) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **VolumeId** (str) - (Required) 文件系统ID + - **Remark** (str) - 文件系统备注(文件系统名称/备注至少传入其中一个) + - **VolumeName** (str) - 文件系统名称(文件系统名称/备注至少传入其中一个) + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateUFSVolumeInfoRequestSchema().dumps(d) + + resp = self.invoke("UpdateUFSVolumeInfo", d, **kwargs) + return apis.UpdateUFSVolumeInfoResponseSchema().loads(resp) diff --git a/ucloud/services/ufs/schemas/apis.py b/ucloud/services/ufs/schemas/apis.py index 3e71d3d0..be8f5f92 100644 --- a/ucloud/services/ufs/schemas/apis.py +++ b/ucloud/services/ufs/schemas/apis.py @@ -1,6 +1,5 @@ """ Code is generated by ucloud-model, DO NOT EDIT IT. """ - from ucloud.core.typesystem import schema, fields from ucloud.services.ufs.schemas import models @@ -8,6 +7,33 @@ """ +""" +API: AddUFSVolumeMountPoint + +添加文件系统挂载点 +""" + + +class AddUFSVolumeMountPointRequestSchema(schema.RequestSchema): + """AddUFSVolumeMountPoint - 添加文件系统挂载点""" + + fields = { + "MountPointName": fields.Str(required=True, dump_to="MountPointName"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + "VolumeId": fields.Str(required=True, dump_to="VolumeId"), + "VpcId": fields.Str(required=True, dump_to="VpcId"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class AddUFSVolumeMountPointResponseSchema(schema.ResponseSchema): + """AddUFSVolumeMountPoint - 添加文件系统挂载点""" + + fields = {} + + """ API: CreateUFSVolume @@ -16,8 +42,7 @@ class CreateUFSVolumeRequestSchema(schema.RequestSchema): - """ CreateUFSVolume - 创建文件系统 - """ + """CreateUFSVolume - 创建文件系统""" fields = { "ChargeType": fields.Str(required=False, dump_to="ChargeType"), @@ -31,12 +56,12 @@ class CreateUFSVolumeRequestSchema(schema.RequestSchema): "StorageType": fields.Str(required=True, dump_to="StorageType"), "Tag": fields.Str(required=False, dump_to="Tag"), "VolumeName": fields.Str(required=False, dump_to="VolumeName"), + "Zone": fields.Str(required=False, dump_to="Zone"), } class CreateUFSVolumeResponseSchema(schema.ResponseSchema): - """ CreateUFSVolume - 创建文件系统 - """ + """CreateUFSVolume - 创建文件系统""" fields = { "VolumeId": fields.Str(required=True, load_from="VolumeId"), @@ -53,8 +78,7 @@ class CreateUFSVolumeResponseSchema(schema.ResponseSchema): class DescribeUFSVolume2RequestSchema(schema.RequestSchema): - """ DescribeUFSVolume2 - 获取文件系统列表 - """ + """DescribeUFSVolume2 - 获取文件系统列表""" fields = { "Limit": fields.Int(required=False, dump_to="Limit"), @@ -62,12 +86,12 @@ class DescribeUFSVolume2RequestSchema(schema.RequestSchema): "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "VolumeId": fields.Str(required=False, dump_to="VolumeId"), + "Zone": fields.Str(required=False, dump_to="Zone"), } class DescribeUFSVolume2ResponseSchema(schema.ResponseSchema): - """ DescribeUFSVolume2 - 获取文件系统列表 - """ + """DescribeUFSVolume2 - 获取文件系统列表""" fields = { "DataSet": fields.List( @@ -77,6 +101,71 @@ class DescribeUFSVolume2ResponseSchema(schema.ResponseSchema): } +""" +API: DescribeUFSVolumeMountpoint + +获取文件系统挂载点信息 +""" + + +class DescribeUFSVolumeMountpointRequestSchema(schema.RequestSchema): + """DescribeUFSVolumeMountpoint - 获取文件系统挂载点信息""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "VolumeId": fields.Str(required=True, dump_to="VolumeId"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DescribeUFSVolumeMountpointResponseSchema(schema.ResponseSchema): + """DescribeUFSVolumeMountpoint - 获取文件系统挂载点信息""" + + fields = { + "DataSet": fields.List( + models.MountPointInfoSchema(), required=True, load_from="DataSet" + ), + "MaxMountPointNum": fields.Int( + required=True, load_from="MaxMountPointNum" + ), + "TotalMountPointNum": fields.Int( + required=True, load_from="TotalMountPointNum" + ), + } + + +""" +API: DescribeUFSVolumePrice + +获取文件系统价格 +""" + + +class DescribeUFSVolumePriceRequestSchema(schema.RequestSchema): + """DescribeUFSVolumePrice - 获取文件系统价格""" + + fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "Size": fields.Int(required=True, dump_to="Size"), + "StorageType": fields.Str(required=True, dump_to="StorageType"), + "VolumeId": fields.Str(required=False, dump_to="VolumeId"), + } + + +class DescribeUFSVolumePriceResponseSchema(schema.ResponseSchema): + """DescribeUFSVolumePrice - 获取文件系统价格""" + + fields = { + "DataSet": fields.List( + models.UFSPriceDataSetSchema(), required=False, load_from="DataSet" + ), + } + + """ API: ExtendUFSVolume @@ -85,20 +174,19 @@ class DescribeUFSVolume2ResponseSchema(schema.ResponseSchema): class ExtendUFSVolumeRequestSchema(schema.RequestSchema): - """ ExtendUFSVolume - 文件系统扩容 - """ + """ExtendUFSVolume - 文件系统扩容""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "Size": fields.Int(required=True, dump_to="Size"), "VolumeId": fields.Str(required=True, dump_to="VolumeId"), + "Zone": fields.Str(required=False, dump_to="Zone"), } class ExtendUFSVolumeResponseSchema(schema.ResponseSchema): - """ ExtendUFSVolume - 文件系统扩容 - """ + """ExtendUFSVolume - 文件系统扩容""" fields = {} @@ -111,18 +199,67 @@ class ExtendUFSVolumeResponseSchema(schema.ResponseSchema): class RemoveUFSVolumeRequestSchema(schema.RequestSchema): - """ RemoveUFSVolume - 删除UFS文件系统 - """ + """RemoveUFSVolume - 删除UFS文件系统""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "VolumeId": fields.Str(required=True, dump_to="VolumeId"), + "Zone": fields.Str(required=False, dump_to="Zone"), } class RemoveUFSVolumeResponseSchema(schema.ResponseSchema): - """ RemoveUFSVolume - 删除UFS文件系统 - """ + """RemoveUFSVolume - 删除UFS文件系统""" + + fields = {} + + +""" +API: RemoveUFSVolumeMountPoint + +删除文件系统挂载点 +""" + + +class RemoveUFSVolumeMountPointRequestSchema(schema.RequestSchema): + """RemoveUFSVolumeMountPoint - 删除文件系统挂载点""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + "VolumeId": fields.Str(required=True, dump_to="VolumeId"), + "VpcId": fields.Str(required=True, dump_to="VpcId"), + } + + +class RemoveUFSVolumeMountPointResponseSchema(schema.ResponseSchema): + """RemoveUFSVolumeMountPoint - 删除文件系统挂载点""" + + fields = {} + + +""" +API: UpdateUFSVolumeInfo + +更改文件系统相关信息(名称/备注) +""" + + +class UpdateUFSVolumeInfoRequestSchema(schema.RequestSchema): + """UpdateUFSVolumeInfo - 更改文件系统相关信息(名称/备注)""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "VolumeId": fields.Str(required=True, dump_to="VolumeId"), + "VolumeName": fields.Str(required=False, dump_to="VolumeName"), + } + + +class UpdateUFSVolumeInfoResponseSchema(schema.ResponseSchema): + """UpdateUFSVolumeInfo - 更改文件系统相关信息(名称/备注)""" fields = {} diff --git a/ucloud/services/ufs/schemas/models.py b/ucloud/services/ufs/schemas/models.py index 48069f07..7788a68c 100644 --- a/ucloud/services/ufs/schemas/models.py +++ b/ucloud/services/ufs/schemas/models.py @@ -4,8 +4,7 @@ class UFSVolumeInfo2Schema(schema.ResponseSchema): - """ UFSVolumeInfo2 - 文件系统信息 - """ + """UFSVolumeInfo2 - 文件系统信息""" fields = { "CreateTime": fields.Int(required=False, load_from="CreateTime"), @@ -26,3 +25,28 @@ class UFSVolumeInfo2Schema(schema.ResponseSchema): "VolumeId": fields.Str(required=True, load_from="VolumeId"), "VolumeName": fields.Str(required=True, load_from="VolumeName"), } + + +class MountPointInfoSchema(schema.ResponseSchema): + """MountPointInfo - 挂载点信息""" + + fields = { + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "MountPointIp": fields.Str(required=True, load_from="MountPointIp"), + "MountPointName": fields.Str(required=True, load_from="MountPointName"), + "SubnetDescription": fields.Str( + required=True, load_from="SubnetDescription" + ), + "SubnetId": fields.Str(required=True, load_from="SubnetId"), + "VpcId": fields.Str(required=True, load_from="VpcId"), + } + + +class UFSPriceDataSetSchema(schema.ResponseSchema): + """UFSPriceDataSet - ufs 价格信息""" + + fields = { + "ChargeName": fields.Str(required=False, load_from="ChargeName"), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "Price": fields.Float(required=False, load_from="Price"), + } diff --git a/ucloud/services/ugn/__init__.py b/ucloud/services/ugn/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/ugn/client.py b/ucloud/services/ugn/client.py new file mode 100644 index 00000000..272e70bc --- /dev/null +++ b/ucloud/services/ugn/client.py @@ -0,0 +1,857 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.ugn.schemas import apis + + +class UGNClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UGNClient, self).__init__(config, transport, middleware, logger) + + def attach_ugn_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AttachUGNInstance - 实例加入云联网 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **InstanceId** (str) - (Required) 实例Id + - **InstanceProjectId** (str) - (Required) 实例归属ProjectId + - **InstanceRegion** (str) - (Required) 实例归属地域 + - **InstanceType** (str) - (Required) 实例类型 + - **UGNId** (str) - (Required) 云联网Id + + **Response** + + - **Message** (str) - 返回码描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.AttachUGNInstanceRequestSchema().dumps(d) + + resp = self.invoke("AttachUGNInstance", d, **kwargs) + return apis.AttachUGNInstanceResponseSchema().loads(resp) + + def batch_detach_ugn_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """BatchDetachUGNInstance - 批量移除云联网中实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **InstanceIds** (list) - (Required) 实例id + - **UGNId** (str) - (Required) 云联网id + + **Response** + + - **InstanceIds** (list) - 删除成功的实例id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.BatchDetachUGNInstanceRequestSchema().dumps(d) + + resp = self.invoke("BatchDetachUGNInstance", d, **kwargs) + return apis.BatchDetachUGNInstanceResponseSchema().loads(resp) + + def create_inter_region_bandwidth( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateInterRegionBandwidth - 购买跨域带宽 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Bandwidth** (int) - (Required) 带宽(单位为Mb/s) + - **ChargeType** (str) - (Required) 计费类型 + - **PayMode** (str) - (Required) 付费类型 + - **Quantity** (int) - (Required) 购买时长 + - **Region0** (str) - (Required) 跨域带宽归属地域 + - **Region1** (str) - (Required) 跨域带宽归属地域 + - **UGNId** (str) - (Required) 云联网Id + - **CouponId** (str) - 代金券Id + + **Response** + + - **InterRegionBandwidthId** (str) - 跨域带宽Id + - **Message** (str) - 返回码描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.CreateInterRegionBandwidthRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateInterRegionBandwidth", d, **kwargs) + return apis.CreateInterRegionBandwidthResponseSchema().loads(resp) + + def create_ugn(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """CreateUGN - + + **Request** + + - **ProjectId** (str) - (Config) + - **Name** (str) - + - **Networks** (list) - + - **Remark** (str) - + + **Response** + + - **Message** (str) - + - **UGNID** (str) - + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.CreateUGNRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUGN", d, **kwargs) + return apis.CreateUGNResponseSchema().loads(resp) + + def delete_inter_region_bandwidth( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteInterRegionBandwidth - 删除跨域带宽 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **InterRegionBandwidthId** (str) - (Required) 跨域带宽Id + - **UGNId** (str) - (Required) 云联网Id + + **Response** + + - **Message** (str) - 返回码描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DeleteInterRegionBandwidthRequestSchema().dumps(d) + + resp = self.invoke("DeleteInterRegionBandwidth", d, **kwargs) + return apis.DeleteInterRegionBandwidthResponseSchema().loads(resp) + + def delete_ugn(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """DeleteUGN - 删除云联网 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **UGNId** (str) - (Required) 云联网Id + + **Response** + + - **Message** (str) - 返回码描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DeleteUGNRequestSchema().dumps(d) + + resp = self.invoke("DeleteUGN", d, **kwargs) + return apis.DeleteUGNResponseSchema().loads(resp) + + def describe_inter_region_bandwidth( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeInterRegionBandwidth - 查询跨域带宽 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **UGNId** (str) - (Required) 云联网Id + - **InterRegionBandwidthIds** (list) - 跨域带宽Id + - **Limit** (int) - 数据分页值。默认为20 + - **Offset** (int) - 数据偏移量。默认为0 + + **Response** + + - **InterRegionBandwidths** (list) - 见 **InterRegionBandwidth** 模型定义 + - **Message** (str) - 返回码描述信息 + - **TotalCount** (int) - InterRegionBandwidths字段的数量 + + **Response Model** + + **InterRegionBandwidth** + - **Bandwidth** (int) - 带宽(单位为Mb/s) + - **ChargeType** (str) - 计费类型 + - **CreateTime** (int) - 创建时间 + - **ExpireTime** (int) - 到期时间 + - **InterRegionBandwidthId** (str) - 跨域带宽Id + - **PayMode** (str) - 付费类型 + - **Region0** (str) - 跨域带宽地域 + - **Region1** (str) - 跨域带宽地域 + - **State** (int) - 跨域带宽状态 + - **UGNId** (str) - 云联网Id + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeInterRegionBandwidthRequestSchema().dumps(d) + + resp = self.invoke("DescribeInterRegionBandwidth", d, **kwargs) + return apis.DescribeInterRegionBandwidthResponseSchema().loads(resp) + + def describe_simple_ugn( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeSimpleUGN - 获取简洁版UGN详情 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **UGNID** (str) - (Required) UGN ID + + **Response** + + - **BwPackages** (list) - 见 **SimpleBwPackage** 模型定义 + - **Message** (str) - + - **Networks** (list) - 见 **SimpleNetwork** 模型定义 + - **Routes** (list) - 见 **SimpleRoute** 模型定义 + - **UGN** (dict) - 见 **UGN** 模型定义 + + **Response Model** + + **SimpleBwPackage** + - **BandWidth** (float) - 带宽值 + - **ChangePayMode** (str) - 带宽包切换计费类型 + - **ChangeStatus** (int) - 带宽包切换状态 + - **ChangeTime** (int) - 带宽包切换时间 + - **CreateTime** (int) - 创建时间 + - **ExpireTime** (int) - 过期时间 + - **Name** (str) - + - **PackageID** (str) - + - **Path** (str) - 智能路径Delay:最低时延|IGP:普通线路|TCO:最低成本 + - **PayMode** (str) - 计费模式 FixedBw:固定带宽|Peak95:经典95|Max5:第五峰值|Traffic:流量计费 + - **Qos** (str) - 服务质量Diamond:钻石|Platinum:铂金|Gold:黄金 + - **RegionA** (str) - 地域A名称 + - **RegionB** (str) - 地域B名称 + - **Remark** (str) - + - **UGNID** (str) - + + + **SimpleNetwork** + - **CreateTime** (int) - + - **Name** (str) - 网络实例名称 + - **NetworkID** (str) - 网络实例的ID,如 vnet-xxxxx + - **OrgID** (int) - 网络实例所在项目的ID + - **OrgName** (str) - 网络实例所在项目名 + - **Region** (str) - 网络实例所在地域 + - **RegionID** (int) - 网络实例所在地域ID + - **Type** (str) - 网络实例类型:VPC/HybridGW/... + + + **SimpleRoute** + - **DstAddr** (str) - 目的网段 + - **NextHopID** (str) - 下一跳网络实例 ID + - **NextHopRegion** (str) - 下一跳网络实例所属地域 + - **NextHopRegionID** (int) - 下一跳网络实例所属地域 id + - **NextHopType** (str) - 下一跳网络实例类型 + - **Priority** (int) - 路由优先级 + + + **UGN** + - **BwPackageCount** (int) - 绑定带宽包数量 + - **CreateTime** (int) - 云联网创建时间 + - **Name** (str) - 云联网名称 + - **NetworkCount** (int) - 关联网络实例数量 + - **Remark** (str) - 云联网备注 + - **UGNID** (str) - 云联网资源 ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeSimpleUGNRequestSchema().dumps(d) + + resp = self.invoke("DescribeSimpleUGN", d, **kwargs) + return apis.DescribeSimpleUGNResponseSchema().loads(resp) + + def describe_ugn_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUGNInstance - 查询云联网实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **UGNId** (str) - (Required) 云联网Id + - **InstanceIds** (list) - 实例Id + - **Limit** (int) - 数据分页值。默认为20 + - **Offset** (int) - 数据偏移量。默认为0 + + **Response** + + - **Message** (str) - 返回码描述信息 + - **TotalCount** (int) - UGNInstances字段的数量 + - **UGNInstances** (list) - 见 **Instance** 模型定义 + + **Response Model** + + **Instance** + - **CreateTime** (int) - 加入时间 + - **InstanceId** (str) - 实例Id + - **InstanceOrganizationName** (str) - 实例归属项目名称 + - **InstanceProjectId** (str) - 实例归属ProjectId + - **InstanceRegion** (str) - 实例归属地域 + - **InstanceType** (str) - 实例类型 + - **Networks** (list) - 网段信息 + - **State** (int) - 实例状态 + - **UGNId** (str) - 云联网Id + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUGNInstanceRequestSchema().dumps(d) + + resp = self.invoke("DescribeUGNInstance", d, **kwargs) + return apis.DescribeUGNInstanceResponseSchema().loads(resp) + + def describe_ugn_region_list( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUGNRegionList - 获取ugn支持的地域 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + + **Response** + + - **Message** (str) - 返回码描述信息 + - **RegionList** (list) - 地域列表 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUGNRegionListRequestSchema().dumps(d) + + resp = self.invoke("DescribeUGNRegionList", d, **kwargs) + return apis.DescribeUGNRegionListResponseSchema().loads(resp) + + def describe_ugn_route_rule( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUGNRouteRule - 查询路由规则 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **UGNId** (str) - (Required) 云联网Id + - **Limit** (int) - 数据分页值。默认为20 + - **Offset** (int) - 数据偏移量。默认为0 + - **RouteRuleIds** (list) - 路由规则Id + + **Response** + + - **Message** (str) - 返回码描述信息 + - **TotalCount** (int) - UGNRouteRules字段的数量 + - **UGNRouteRules** (list) - 见 **RouteRule** 模型定义 + + **Response Model** + + **RouteRule** + - **CreateTime** (int) - 创建时间 + - **DeriveInstanceId** (str) - 归属实例Id + - **DeriveInstanceRegion** (str) - 归属实例地域 + - **DeriveInstanceType** (str) - 归属实例类型 + - **DeriveRouteRuleId** (str) - 归属实例路由规则Id + - **DeriveRouteTableId** (str) - 归属实例路由表Id + - **DstAddr** (str) - 目的地址 + - **Enable** (bool) - false:未使能true:已使能 + - **NextHopId** (str) - 归属实例路由下一跳 + - **NextHopType** (str) - 归属实例路由下一跳类型 + - **Priority** (int) - 优先级 + - **Rollback** (bool) - false:不可撤回true:可撤回 + - **RouteRuleId** (str) - 路由规则Id + - **RouteRuleType** (int) - 路由规则类型,枚举值 0:自动发布的LOCAL和动态路由1:手动发布的自定义路由 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUGNRouteRuleRequestSchema().dumps(d) + + resp = self.invoke("DescribeUGNRouteRule", d, **kwargs) + return apis.DescribeUGNRouteRuleResponseSchema().loads(resp) + + def detach_ugn_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DetachUGNInstance - 实例退出云联网 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **InstanceId** (str) - (Required) 实例Id + - **InstanceType** (str) - (Required) 实例类型 + - **UGNId** (str) - (Required) 云联网Id + + **Response** + + - **Message** (str) - 返回码描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DetachUGNInstanceRequestSchema().dumps(d) + + resp = self.invoke("DetachUGNInstance", d, **kwargs) + return apis.DetachUGNInstanceResponseSchema().loads(resp) + + def get_simple_ugn_bw_packages( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetSimpleUGNBwPackages - 获取指定云联网内的带宽包 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **UGNID** (str) - (Required) + - **Limit** (int) - 分页大小,默认20 + - **Offset** (int) - 偏移量,默认0 + + **Response** + + - **BwPackages** (list) - 见 **SimpleBwPackage** 模型定义 + - **Limit** (int) - + - **Message** (str) - + - **Offset** (int) - + - **TotalCount** (int) - + + **Response Model** + + **SimpleBwPackage** + - **BandWidth** (float) - 带宽值 + - **ChangePayMode** (str) - 带宽包切换计费类型 + - **ChangeStatus** (int) - 带宽包切换状态 + - **ChangeTime** (int) - 带宽包切换时间 + - **CreateTime** (int) - 创建时间 + - **ExpireTime** (int) - 过期时间 + - **Name** (str) - + - **PackageID** (str) - + - **Path** (str) - 智能路径Delay:最低时延|IGP:普通线路|TCO:最低成本 + - **PayMode** (str) - 计费模式 FixedBw:固定带宽|Peak95:经典95|Max5:第五峰值|Traffic:流量计费 + - **Qos** (str) - 服务质量Diamond:钻石|Platinum:铂金|Gold:黄金 + - **RegionA** (str) - 地域A名称 + - **RegionB** (str) - 地域B名称 + - **Remark** (str) - + - **UGNID** (str) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetSimpleUGNBwPackagesRequestSchema().dumps(d) + + resp = self.invoke("GetSimpleUGNBwPackages", d, **kwargs) + return apis.GetSimpleUGNBwPackagesResponseSchema().loads(resp) + + def list_simple_bw_package( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListSimpleBwPackage - 获取当前项目下的带宽包列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Limit** (int) - + - **Offset** (int) - + + **Response** + + - **BwPackages** (list) - 见 **SimpleBwPackage** 模型定义 + - **Limit** (int) - + - **Offset** (int) - + - **TotalCount** (int) - + + **Response Model** + + **SimpleBwPackage** + - **BandWidth** (float) - 带宽值 + - **ChangePayMode** (str) - 带宽包切换计费类型 + - **ChangeStatus** (int) - 带宽包切换状态 + - **ChangeTime** (int) - 带宽包切换时间 + - **CreateTime** (int) - 创建时间 + - **ExpireTime** (int) - 过期时间 + - **Name** (str) - + - **PackageID** (str) - + - **Path** (str) - 智能路径Delay:最低时延|IGP:普通线路|TCO:最低成本 + - **PayMode** (str) - 计费模式 FixedBw:固定带宽|Peak95:经典95|Max5:第五峰值|Traffic:流量计费 + - **Qos** (str) - 服务质量Diamond:钻石|Platinum:铂金|Gold:黄金 + - **RegionA** (str) - 地域A名称 + - **RegionB** (str) - 地域B名称 + - **Remark** (str) - + - **UGNID** (str) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ListSimpleBwPackageRequestSchema().dumps(d) + + resp = self.invoke("ListSimpleBwPackage", d, **kwargs) + return apis.ListSimpleBwPackageResponseSchema().loads(resp) + + def list_ugn(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """ListUGN - 获取当前项目下所有云联网资源 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Limit** (int) - 分页大小,默认20 + - **Offset** (int) - 偏移量,默认0 + + **Response** + + - **Limit** (int) - + - **Message** (str) - + - **Offset** (int) - + - **TotalCount** (int) - + - **UGNs** (list) - 见 **UGN** 模型定义 + + **Response Model** + + **UGN** + - **BwPackageCount** (int) - 绑定带宽包数量 + - **CreateTime** (int) - 云联网创建时间 + - **Name** (str) - 云联网名称 + - **NetworkCount** (int) - 关联网络实例数量 + - **Remark** (str) - 云联网备注 + - **UGNID** (str) - 云联网资源 ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ListUGNRequestSchema().dumps(d) + + resp = self.invoke("ListUGN", d, **kwargs) + return apis.ListUGNResponseSchema().loads(resp) + + def modify_inter_region_bandwidth( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyInterRegionBandwidth - 修改跨域带宽 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Bandwidth** (str) - (Required) 带宽(单位为Mb/s) + - **InterRegionBandwidthId** (str) - (Required) 跨域带宽Id + - **UGNId** (str) - (Required) 云联网Id + - **PayMode** (str) - 付费类型 + + **Response** + + - **Message** (str) - 返回码描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyInterRegionBandwidthRequestSchema().dumps(d) + + resp = self.invoke("ModifyInterRegionBandwidth", d, **kwargs) + return apis.ModifyInterRegionBandwidthResponseSchema().loads(resp) + + def modify_ugn_attribute( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUGNAttribute - 修改云联网属性 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **UGNId** (str) - (Required) 云联网Id + - **Name** (str) - 云联网名称 + - **Remark** (str) - 云联网备注 + + **Response** + + - **Message** (str) - 错误码描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyUGNAttributeRequestSchema().dumps(d) + + resp = self.invoke("ModifyUGNAttribute", d, **kwargs) + return apis.ModifyUGNAttributeResponseSchema().loads(resp) + + def modify_ugn_bandwidth( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUGNBandwidth - 修改云联网带宽大小 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **BandWidth** (int) - (Required) 带宽值 + - **PackageID** (str) - (Required) 带宽包id + - **UGNID** (str) - (Required) 云联网id + + **Response** + + - **Message** (str) - + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyUGNBandwidthRequestSchema().dumps(d) + + resp = self.invoke("ModifyUGNBandwidth", d, **kwargs) + return apis.ModifyUGNBandwidthResponseSchema().loads(resp) + + def publish_ugn_route_rule( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """PublishUGNRouteRule - 发布云联网路由规则 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **DeriveRouteRuleId** (str) - (Required) 归属实例路由规则Id + - **DeriveRouteTableId** (str) - (Required) 归属实例路由表Id + - **InstanceId** (str) - (Required) 实例Id + - **UGNId** (str) - (Required) 云联网Id + + **Response** + + - **Message** (str) - 返回码描述信息 + - **RouteRuleId** (str) - 路由规则Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.PublishUGNRouteRuleRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("PublishUGNRouteRule", d, **kwargs) + return apis.PublishUGNRouteRuleResponseSchema().loads(resp) + + def s_describe_ugn( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """SDescribeUGN - 获取简洁版UGN详情 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **UGNID** (str) - (Required) UGN ID + + **Response** + + - **BwPackages** (list) - 见 **SBwPackage** 模型定义 + - **Message** (str) - + - **Networks** (list) - 见 **SNetwork** 模型定义 + - **Policies** (list) - 暂不支持 + - **Routes** (list) - 见 **Route** 模型定义 + - **UGN** (dict) - 见 **UGN** 模型定义 + + **Response Model** + + **SBwPackage** + - **BandWidth** (int) - 带宽值 + - **ChangePayMode** (str) - 带宽包切换计费类型 + - **ChangeStatus** (int) - 带宽包切换状态 + - **ChangeTime** (int) - 带宽包切换时间 + - **CreateTime** (int) - 创建时间 + - **ExpireTime** (int) - 过期时间 + - **Message** (str) - 备注信息 + - **Name** (str) - + - **PackageID** (str) - + - **Path** (str) - 智能路径Delay:最低时延|IGP:普通线路|TCO:最低成本 + - **PayMode** (str) - 计费模式 FixedBw:固定带宽|Peak95:经典95|Max5:第五峰值|Traffic:流量计费 + - **Qos** (str) - 服务质量Diamond:钻石|Platinum:铂金|Gold:黄金 + - **RegionA** (str) - 地域A名称 + - **RegionB** (str) - 地域B名称 + - **Remark** (str) - + - **UGNID** (str) - + + + **SNetwork** + - **CreateTime** (str) - + - **Name** (str) - 网络实例名称 + - **NetworkID** (str) - 网络实例的ID,如 vnet-xxxxx + - **OrgID** (int) - 网络实例所在项目的ID + - **OrgName** (str) - 网络实例所在项目名 + - **Region** (str) - 网络实例所在地域 + - **RegionID** (int) - 网络实例所在地域ID + - **Type** (str) - 网络实例类型:VPC/HybridGW/... + + + **Route** + - **DstAddr** (str) - 目的网段 + - **NexthopID** (str) - 下一跳网络实例 ID + - **NexthopRegion** (str) - 下一跳网络实例所属地域 + - **NexthopRegionID** (int) - 下一跳网络实例所属地域 id + - **NexthopType** (str) - 下一跳网络实例类型 + - **Priority** (int) - 路由优先级 + + + **UGN** + - **BwPackageCount** (int) - 绑定带宽包数量 + - **CreateTime** (int) - 云联网创建时间 + - **Name** (str) - 云联网名称 + - **NetworkCount** (int) - 关联网络实例数量 + - **Remark** (str) - 云联网备注 + - **UGNID** (str) - 云联网资源 ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.SDescribeUGNRequestSchema().dumps(d) + + resp = self.invoke("SDescribeUGN", d, **kwargs) + return apis.SDescribeUGNResponseSchema().loads(resp) + + def unpublish_ugn_route_rule( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UnpublishUGNRouteRule - 取消发布云联网路由规则 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **DeriveRouteRuleId** (str) - (Required) 归属实例路由规则Id + - **DeriveRouteTableId** (str) - (Required) 归属实例路由表Id + - **InstanceId** (str) - (Required) 实例Id + - **UGNId** (str) - (Required) 云联网Id + + **Response** + + - **Message** (str) - 返回码描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.UnpublishUGNRouteRuleRequestSchema().dumps(d) + + resp = self.invoke("UnpublishUGNRouteRule", d, **kwargs) + return apis.UnpublishUGNRouteRuleResponseSchema().loads(resp) + + def update_ugn_bw_package( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateUGNBwPackage - + + **Request** + + - **ProjectId** (str) - (Config) + - **BwBidRate** (float) - (Required) + - **BwULRate** (float) - (Required) + - **PackageID** (str) - (Required) + - **Path** (str) - (Required) + - **PayMode** (str) - (Required) + - **Qos** (str) - (Required) + - **RegionA** (str) - (Required) + - **RegionABwMax** (int) - (Required) + - **RegionABwMin** (int) - (Required) + - **RegionB** (str) - (Required) + - **RegionBBwMax** (int) - (Required) + - **RegionBBwMin** (int) - (Required) + - **UGNID** (str) - (Required) + - **ChargeType** (str) - + - **Coupon** (str) - + - **Name** (str) - + - **Quantity** (str) - + - **Remark** (str) - + + **Response** + + - **Message** (str) - + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.UpdateUGNBwPackageRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("UpdateUGNBwPackage", d, **kwargs) + return apis.UpdateUGNBwPackageResponseSchema().loads(resp) diff --git a/ucloud/services/ugn/schemas/__init__.py b/ucloud/services/ugn/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/ugn/schemas/apis.py b/ucloud/services/ugn/schemas/apis.py new file mode 100644 index 00000000..e937c999 --- /dev/null +++ b/ucloud/services/ugn/schemas/apis.py @@ -0,0 +1,678 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.ugn.schemas import models + +""" UGN API Schema +""" + + +""" +API: AttachUGNInstance + +实例加入云联网 +""" + + +class AttachUGNInstanceRequestSchema(schema.RequestSchema): + """AttachUGNInstance - 实例加入云联网""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "InstanceProjectId": fields.Str( + required=True, dump_to="InstanceProjectId" + ), + "InstanceRegion": fields.Str(required=True, dump_to="InstanceRegion"), + "InstanceType": fields.Str(required=True, dump_to="InstanceType"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "UGNId": fields.Str(required=True, dump_to="UGNId"), + } + + +class AttachUGNInstanceResponseSchema(schema.ResponseSchema): + """AttachUGNInstance - 实例加入云联网""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: BatchDetachUGNInstance + +批量移除云联网中实例 +""" + + +class BatchDetachUGNInstanceRequestSchema(schema.RequestSchema): + """BatchDetachUGNInstance - 批量移除云联网中实例""" + + fields = { + "InstanceIds": fields.List(fields.Str()), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "UGNId": fields.Str(required=True, dump_to="UGNId"), + } + + +class BatchDetachUGNInstanceResponseSchema(schema.ResponseSchema): + """BatchDetachUGNInstance - 批量移除云联网中实例""" + + fields = { + "InstanceIds": fields.List( + fields.Str(), required=True, load_from="InstanceIds" + ), + } + + +""" +API: CreateInterRegionBandwidth + +购买跨域带宽 +""" + + +class CreateInterRegionBandwidthRequestSchema(schema.RequestSchema): + """CreateInterRegionBandwidth - 购买跨域带宽""" + + fields = { + "Bandwidth": fields.Int(required=True, dump_to="Bandwidth"), + "ChargeType": fields.Str(required=True, dump_to="ChargeType"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "PayMode": fields.Str(required=True, dump_to="PayMode"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Quantity": fields.Int(required=True, dump_to="Quantity"), + "Region0": fields.Str(required=True, dump_to="Region0"), + "Region1": fields.Str(required=True, dump_to="Region1"), + "UGNId": fields.Str(required=True, dump_to="UGNId"), + } + + +class CreateInterRegionBandwidthResponseSchema(schema.ResponseSchema): + """CreateInterRegionBandwidth - 购买跨域带宽""" + + fields = { + "InterRegionBandwidthId": fields.Str( + required=True, load_from="InterRegionBandwidthId" + ), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: CreateUGN + + +""" + + +class CreateUGNRequestSchema(schema.RequestSchema): + """CreateUGN -""" + + fields = { + "Name": fields.Str(required=False, dump_to="Name"), + "Networks": fields.List(fields.Str()), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Remark": fields.Str(required=False, dump_to="Remark"), + } + + +class CreateUGNResponseSchema(schema.ResponseSchema): + """CreateUGN -""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + "UGNID": fields.Str(required=False, load_from="UGNID"), + } + + +""" +API: DeleteInterRegionBandwidth + +删除跨域带宽 +""" + + +class DeleteInterRegionBandwidthRequestSchema(schema.RequestSchema): + """DeleteInterRegionBandwidth - 删除跨域带宽""" + + fields = { + "InterRegionBandwidthId": fields.Str( + required=True, dump_to="InterRegionBandwidthId" + ), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "UGNId": fields.Str(required=True, dump_to="UGNId"), + } + + +class DeleteInterRegionBandwidthResponseSchema(schema.ResponseSchema): + """DeleteInterRegionBandwidth - 删除跨域带宽""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DeleteUGN + +删除云联网 +""" + + +class DeleteUGNRequestSchema(schema.RequestSchema): + """DeleteUGN - 删除云联网""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "UGNId": fields.Str(required=True, dump_to="UGNId"), + } + + +class DeleteUGNResponseSchema(schema.ResponseSchema): + """DeleteUGN - 删除云联网""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DescribeInterRegionBandwidth + +查询跨域带宽 +""" + + +class DescribeInterRegionBandwidthRequestSchema(schema.RequestSchema): + """DescribeInterRegionBandwidth - 查询跨域带宽""" + + fields = { + "InterRegionBandwidthIds": fields.List(fields.Str()), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "UGNId": fields.Str(required=True, dump_to="UGNId"), + } + + +class DescribeInterRegionBandwidthResponseSchema(schema.ResponseSchema): + """DescribeInterRegionBandwidth - 查询跨域带宽""" + + fields = { + "InterRegionBandwidths": fields.List( + models.InterRegionBandwidthSchema(), + required=True, + load_from="InterRegionBandwidths", + ), + "Message": fields.Str(required=True, load_from="Message"), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeSimpleUGN + +获取简洁版UGN详情 +""" + + +class DescribeSimpleUGNRequestSchema(schema.RequestSchema): + """DescribeSimpleUGN - 获取简洁版UGN详情""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UGNID": fields.Str(required=True, dump_to="UGNID"), + } + + +class DescribeSimpleUGNResponseSchema(schema.ResponseSchema): + """DescribeSimpleUGN - 获取简洁版UGN详情""" + + fields = { + "BwPackages": fields.List( + models.SimpleBwPackageSchema(), + required=True, + load_from="BwPackages", + ), + "Message": fields.Str(required=True, load_from="Message"), + "Networks": fields.List( + models.SimpleNetworkSchema(), required=True, load_from="Networks" + ), + "Routes": fields.List( + models.SimpleRouteSchema(), required=True, load_from="Routes" + ), + "UGN": models.UGNSchema(), + } + + +""" +API: DescribeUGNInstance + +查询云联网实例 +""" + + +class DescribeUGNInstanceRequestSchema(schema.RequestSchema): + """DescribeUGNInstance - 查询云联网实例""" + + fields = { + "InstanceIds": fields.List(fields.Str()), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "UGNId": fields.Str(required=True, dump_to="UGNId"), + } + + +class DescribeUGNInstanceResponseSchema(schema.ResponseSchema): + """DescribeUGNInstance - 查询云联网实例""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + "UGNInstances": fields.List( + models.InstanceSchema(), required=False, load_from="UGNInstances" + ), + } + + +""" +API: DescribeUGNRegionList + +获取ugn支持的地域 +""" + + +class DescribeUGNRegionListRequestSchema(schema.RequestSchema): + """DescribeUGNRegionList - 获取ugn支持的地域""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class DescribeUGNRegionListResponseSchema(schema.ResponseSchema): + """DescribeUGNRegionList - 获取ugn支持的地域""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + "RegionList": fields.List( + fields.Str(), required=True, load_from="RegionList" + ), + } + + +""" +API: DescribeUGNRouteRule + +查询路由规则 +""" + + +class DescribeUGNRouteRuleRequestSchema(schema.RequestSchema): + """DescribeUGNRouteRule - 查询路由规则""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "RouteRuleIds": fields.List(fields.Str()), + "UGNId": fields.Str(required=True, dump_to="UGNId"), + } + + +class DescribeUGNRouteRuleResponseSchema(schema.ResponseSchema): + """DescribeUGNRouteRule - 查询路由规则""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + "UGNRouteRules": fields.List( + models.RouteRuleSchema(), required=False, load_from="UGNRouteRules" + ), + } + + +""" +API: DetachUGNInstance + +实例退出云联网 +""" + + +class DetachUGNInstanceRequestSchema(schema.RequestSchema): + """DetachUGNInstance - 实例退出云联网""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "InstanceType": fields.Str(required=True, dump_to="InstanceType"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "UGNId": fields.Str(required=True, dump_to="UGNId"), + } + + +class DetachUGNInstanceResponseSchema(schema.ResponseSchema): + """DetachUGNInstance - 实例退出云联网""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: GetSimpleUGNBwPackages + +获取指定云联网内的带宽包 +""" + + +class GetSimpleUGNBwPackagesRequestSchema(schema.RequestSchema): + """GetSimpleUGNBwPackages - 获取指定云联网内的带宽包""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "UGNID": fields.Str(required=True, dump_to="UGNID"), + } + + +class GetSimpleUGNBwPackagesResponseSchema(schema.ResponseSchema): + """GetSimpleUGNBwPackages - 获取指定云联网内的带宽包""" + + fields = { + "BwPackages": fields.List( + models.SimpleBwPackageSchema(), + required=True, + load_from="BwPackages", + ), + "Limit": fields.Int(required=True, load_from="Limit"), + "Message": fields.Str(required=True, load_from="Message"), + "Offset": fields.Int(required=True, load_from="Offset"), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: ListSimpleBwPackage + +获取当前项目下的带宽包列表 +""" + + +class ListSimpleBwPackageRequestSchema(schema.RequestSchema): + """ListSimpleBwPackage - 获取当前项目下的带宽包列表""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class ListSimpleBwPackageResponseSchema(schema.ResponseSchema): + """ListSimpleBwPackage - 获取当前项目下的带宽包列表""" + + fields = { + "BwPackages": fields.List( + models.SimpleBwPackageSchema(), + required=True, + load_from="BwPackages", + ), + "Limit": fields.Int(required=True, load_from="Limit"), + "Offset": fields.Int(required=True, load_from="Offset"), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: ListUGN + +获取当前项目下所有云联网资源 +""" + + +class ListUGNRequestSchema(schema.RequestSchema): + """ListUGN - 获取当前项目下所有云联网资源""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class ListUGNResponseSchema(schema.ResponseSchema): + """ListUGN - 获取当前项目下所有云联网资源""" + + fields = { + "Limit": fields.Int(required=False, load_from="Limit"), + "Message": fields.Str(required=True, load_from="Message"), + "Offset": fields.Int(required=False, load_from="Offset"), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + "UGNs": fields.List( + models.UGNSchema(), required=True, load_from="UGNs" + ), + } + + +""" +API: ModifyInterRegionBandwidth + +修改跨域带宽 +""" + + +class ModifyInterRegionBandwidthRequestSchema(schema.RequestSchema): + """ModifyInterRegionBandwidth - 修改跨域带宽""" + + fields = { + "Bandwidth": fields.Str(required=True, dump_to="Bandwidth"), + "InterRegionBandwidthId": fields.Str( + required=True, dump_to="InterRegionBandwidthId" + ), + "PayMode": fields.Str(required=False, dump_to="PayMode"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "UGNId": fields.Str(required=True, dump_to="UGNId"), + } + + +class ModifyInterRegionBandwidthResponseSchema(schema.ResponseSchema): + """ModifyInterRegionBandwidth - 修改跨域带宽""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: ModifyUGNAttribute + +修改云联网属性 +""" + + +class ModifyUGNAttributeRequestSchema(schema.RequestSchema): + """ModifyUGNAttribute - 修改云联网属性""" + + fields = { + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "UGNId": fields.Str(required=True, dump_to="UGNId"), + } + + +class ModifyUGNAttributeResponseSchema(schema.ResponseSchema): + """ModifyUGNAttribute - 修改云联网属性""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: ModifyUGNBandwidth + +修改云联网带宽大小 +""" + + +class ModifyUGNBandwidthRequestSchema(schema.RequestSchema): + """ModifyUGNBandwidth - 修改云联网带宽大小""" + + fields = { + "BandWidth": fields.Int(required=True, dump_to="BandWidth"), + "PackageID": fields.Str(required=True, dump_to="PackageID"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UGNID": fields.Str(required=True, dump_to="UGNID"), + } + + +class ModifyUGNBandwidthResponseSchema(schema.ResponseSchema): + """ModifyUGNBandwidth - 修改云联网带宽大小""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: PublishUGNRouteRule + +发布云联网路由规则 +""" + + +class PublishUGNRouteRuleRequestSchema(schema.RequestSchema): + """PublishUGNRouteRule - 发布云联网路由规则""" + + fields = { + "DeriveRouteRuleId": fields.Str( + required=True, dump_to="DeriveRouteRuleId" + ), + "DeriveRouteTableId": fields.Str( + required=True, dump_to="DeriveRouteTableId" + ), + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "UGNId": fields.Str(required=True, dump_to="UGNId"), + } + + +class PublishUGNRouteRuleResponseSchema(schema.ResponseSchema): + """PublishUGNRouteRule - 发布云联网路由规则""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "RouteRuleId": fields.Str(required=False, load_from="RouteRuleId"), + } + + +""" +API: SDescribeUGN + +获取简洁版UGN详情 +""" + + +class SDescribeUGNRequestSchema(schema.RequestSchema): + """SDescribeUGN - 获取简洁版UGN详情""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UGNID": fields.Str(required=True, dump_to="UGNID"), + } + + +class SDescribeUGNResponseSchema(schema.ResponseSchema): + """SDescribeUGN - 获取简洁版UGN详情""" + + fields = { + "BwPackages": fields.List( + models.SBwPackageSchema(), required=True, load_from="BwPackages" + ), + "Message": fields.Str(required=True, load_from="Message"), + "Networks": fields.List( + models.SNetworkSchema(), required=True, load_from="Networks" + ), + "Policies": fields.List( + fields.Str(), required=True, load_from="Policies" + ), + "Routes": fields.List( + models.RouteSchema(), required=True, load_from="Routes" + ), + "UGN": models.UGNSchema(), + } + + +""" +API: UnpublishUGNRouteRule + +取消发布云联网路由规则 +""" + + +class UnpublishUGNRouteRuleRequestSchema(schema.RequestSchema): + """UnpublishUGNRouteRule - 取消发布云联网路由规则""" + + fields = { + "DeriveRouteRuleId": fields.Str( + required=True, dump_to="DeriveRouteRuleId" + ), + "DeriveRouteTableId": fields.Str( + required=True, dump_to="DeriveRouteTableId" + ), + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "UGNId": fields.Str(required=True, dump_to="UGNId"), + } + + +class UnpublishUGNRouteRuleResponseSchema(schema.ResponseSchema): + """UnpublishUGNRouteRule - 取消发布云联网路由规则""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: UpdateUGNBwPackage + + +""" + + +class UpdateUGNBwPackageRequestSchema(schema.RequestSchema): + """UpdateUGNBwPackage -""" + + fields = { + "BwBidRate": fields.Float(required=True, dump_to="BwBidRate"), + "BwULRate": fields.Float(required=True, dump_to="BwULRate"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "Coupon": fields.Str(required=False, dump_to="Coupon"), + "Name": fields.Str(required=False, dump_to="Name"), + "PackageID": fields.Str(required=True, dump_to="PackageID"), + "Path": fields.Str(required=True, dump_to="Path"), + "PayMode": fields.Str(required=True, dump_to="PayMode"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Qos": fields.Str(required=True, dump_to="Qos"), + "Quantity": fields.Str(required=False, dump_to="Quantity"), + "RegionA": fields.Str(required=True, dump_to="RegionA"), + "RegionABwMax": fields.Int(required=True, dump_to="RegionABwMax"), + "RegionABwMin": fields.Int(required=True, dump_to="RegionABwMin"), + "RegionB": fields.Str(required=True, dump_to="RegionB"), + "RegionBBwMax": fields.Int(required=True, dump_to="RegionBBwMax"), + "RegionBBwMin": fields.Int(required=True, dump_to="RegionBBwMin"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "UGNID": fields.Str(required=True, dump_to="UGNID"), + } + + +class UpdateUGNBwPackageResponseSchema(schema.ResponseSchema): + """UpdateUGNBwPackage -""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } diff --git a/ucloud/services/ugn/schemas/models.py b/ucloud/services/ugn/schemas/models.py new file mode 100644 index 00000000..e057d80a --- /dev/null +++ b/ucloud/services/ugn/schemas/models.py @@ -0,0 +1,191 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class InterRegionBandwidthSchema(schema.ResponseSchema): + """InterRegionBandwidth - 跨域带宽""" + + fields = { + "Bandwidth": fields.Int(required=True, load_from="Bandwidth"), + "ChargeType": fields.Str(required=True, load_from="ChargeType"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "ExpireTime": fields.Int(required=True, load_from="ExpireTime"), + "InterRegionBandwidthId": fields.Str( + required=True, load_from="InterRegionBandwidthId" + ), + "PayMode": fields.Str(required=True, load_from="PayMode"), + "Region0": fields.Str(required=True, load_from="Region0"), + "Region1": fields.Str(required=True, load_from="Region1"), + "State": fields.Int(required=True, load_from="State"), + "UGNId": fields.Str(required=True, load_from="UGNId"), + } + + +class UGNSchema(schema.ResponseSchema): + """UGN - 云联网信息""" + + fields = { + "BwPackageCount": fields.Int(required=True, load_from="BwPackageCount"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "Name": fields.Str(required=True, load_from="Name"), + "NetworkCount": fields.Int(required=True, load_from="NetworkCount"), + "Remark": fields.Str(required=True, load_from="Remark"), + "UGNID": fields.Str(required=True, load_from="UGNID"), + } + + +class SimpleRouteSchema(schema.ResponseSchema): + """SimpleRoute - 简洁版云联网路由条目""" + + fields = { + "DstAddr": fields.Str(required=False, load_from="DstAddr"), + "NextHopID": fields.Str(required=False, load_from="NextHopID"), + "NextHopRegion": fields.Str(required=False, load_from="NextHopRegion"), + "NextHopRegionID": fields.Int( + required=False, load_from="NextHopRegionID" + ), + "NextHopType": fields.Str(required=False, load_from="NextHopType"), + "Priority": fields.Int(required=False, load_from="Priority"), + } + + +class SimpleNetworkSchema(schema.ResponseSchema): + """SimpleNetwork - 简洁版云联网网络实例""" + + fields = { + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "Name": fields.Str(required=True, load_from="Name"), + "NetworkID": fields.Str(required=True, load_from="NetworkID"), + "OrgID": fields.Int(required=False, load_from="OrgID"), + "OrgName": fields.Str(required=True, load_from="OrgName"), + "Region": fields.Str(required=True, load_from="Region"), + "RegionID": fields.Int(required=False, load_from="RegionID"), + "Type": fields.Str(required=True, load_from="Type"), + } + + +class SimpleBwPackageSchema(schema.ResponseSchema): + """SimpleBwPackage - 简洁版带宽包""" + + fields = { + "BandWidth": fields.Float(required=True, load_from="BandWidth"), + "ChangePayMode": fields.Str(required=False, load_from="ChangePayMode"), + "ChangeStatus": fields.Int(required=False, load_from="ChangeStatus"), + "ChangeTime": fields.Int(required=False, load_from="ChangeTime"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "Name": fields.Str(required=False, load_from="Name"), + "PackageID": fields.Str(required=True, load_from="PackageID"), + "Path": fields.Str(required=True, load_from="Path"), + "PayMode": fields.Str(required=True, load_from="PayMode"), + "Qos": fields.Str(required=True, load_from="Qos"), + "RegionA": fields.Str(required=True, load_from="RegionA"), + "RegionB": fields.Str(required=True, load_from="RegionB"), + "Remark": fields.Str(required=False, load_from="Remark"), + "UGNID": fields.Str(required=True, load_from="UGNID"), + } + + +class InstanceSchema(schema.ResponseSchema): + """Instance - 云联网实例信息""" + + fields = { + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "InstanceId": fields.Str(required=True, load_from="InstanceId"), + "InstanceOrganizationName": fields.Str( + required=True, load_from="InstanceOrganizationName" + ), + "InstanceProjectId": fields.Str( + required=True, load_from="InstanceProjectId" + ), + "InstanceRegion": fields.Str(required=True, load_from="InstanceRegion"), + "InstanceType": fields.Str(required=True, load_from="InstanceType"), + "Networks": fields.List(fields.Str()), + "State": fields.Int(required=True, load_from="State"), + "UGNId": fields.Str(required=True, load_from="UGNId"), + } + + +class RouteRuleSchema(schema.ResponseSchema): + """RouteRule - 云联网路由规则""" + + fields = { + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "DeriveInstanceId": fields.Str( + required=True, load_from="DeriveInstanceId" + ), + "DeriveInstanceRegion": fields.Str( + required=True, load_from="DeriveInstanceRegion" + ), + "DeriveInstanceType": fields.Str( + required=True, load_from="DeriveInstanceType" + ), + "DeriveRouteRuleId": fields.Str( + required=True, load_from="DeriveRouteRuleId" + ), + "DeriveRouteTableId": fields.Str( + required=True, load_from="DeriveRouteTableId" + ), + "DstAddr": fields.Str(required=True, load_from="DstAddr"), + "Enable": fields.Bool(required=True, load_from="Enable"), + "NextHopId": fields.Str(required=True, load_from="NextHopId"), + "NextHopType": fields.Str(required=True, load_from="NextHopType"), + "Priority": fields.Int(required=True, load_from="Priority"), + "Rollback": fields.Bool(required=True, load_from="Rollback"), + "RouteRuleId": fields.Str(required=True, load_from="RouteRuleId"), + "RouteRuleType": fields.Int(required=True, load_from="RouteRuleType"), + } + + +class SNetworkSchema(schema.ResponseSchema): + """SNetwork - 简洁版云联网网络实例""" + + fields = { + "CreateTime": fields.Str(required=False, load_from="CreateTime"), + "Name": fields.Str(required=True, load_from="Name"), + "NetworkID": fields.Str(required=True, load_from="NetworkID"), + "OrgID": fields.Int(required=False, load_from="OrgID"), + "OrgName": fields.Str(required=True, load_from="OrgName"), + "Region": fields.Str(required=True, load_from="Region"), + "RegionID": fields.Int(required=False, load_from="RegionID"), + "Type": fields.Str(required=True, load_from="Type"), + } + + +class SBwPackageSchema(schema.ResponseSchema): + """SBwPackage - 简洁版带宽包""" + + fields = { + "BandWidth": fields.Int(required=True, load_from="BandWidth"), + "ChangePayMode": fields.Str(required=False, load_from="ChangePayMode"), + "ChangeStatus": fields.Int(required=False, load_from="ChangeStatus"), + "ChangeTime": fields.Int(required=False, load_from="ChangeTime"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "Message": fields.Str(required=False, load_from="Message"), + "Name": fields.Str(required=False, load_from="Name"), + "PackageID": fields.Str(required=True, load_from="PackageID"), + "Path": fields.Str(required=True, load_from="Path"), + "PayMode": fields.Str(required=True, load_from="PayMode"), + "Qos": fields.Str(required=True, load_from="Qos"), + "RegionA": fields.Str(required=True, load_from="RegionA"), + "RegionB": fields.Str(required=True, load_from="RegionB"), + "Remark": fields.Str(required=False, load_from="Remark"), + "UGNID": fields.Str(required=True, load_from="UGNID"), + } + + +class RouteSchema(schema.ResponseSchema): + """Route - 云联网路由条目""" + + fields = { + "DstAddr": fields.Str(required=False, load_from="DstAddr"), + "NexthopID": fields.Str(required=False, load_from="NexthopID"), + "NexthopRegion": fields.Str(required=False, load_from="NexthopRegion"), + "NexthopRegionID": fields.Int( + required=False, load_from="NexthopRegionID" + ), + "NexthopType": fields.Str(required=False, load_from="NexthopType"), + "Priority": fields.Int(required=False, load_from="Priority"), + } diff --git a/ucloud/services/uhadoop/__init__.py b/ucloud/services/uhadoop/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/uhadoop/client.py b/ucloud/services/uhadoop/client.py new file mode 100644 index 00000000..e64826cf --- /dev/null +++ b/ucloud/services/uhadoop/client.py @@ -0,0 +1,481 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.uhadoop.schemas import apis + + +class UHadoopClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UHadoopClient, self).__init__( + config, transport, middleware, logger + ) + + def add_uhadoop_instance_node( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AddUHadoopInstanceNode - 给已有集群添加一定数量的节点 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceId** (str) - (Required) 实例ID + - **NodeRole** (str) - (Required) 节点的角色,值为task|core|client之一 + - **NodeType** (str) - (Required) 机型,如:o.hadoop2m.medium,可从GetUHadoopNodeType接口获取 + - **BootDiskSize** (str) - 系统盘容量,非裸金属机型必填 + - **BootDiskType** (str) - 系统盘类型,非裸金属机型必填,例如:CLOUD_RSSD + - **DataDiskNum** (str) - 数据盘数量,非裸金属机型时必填 + - **DataDiskSize** (str) - 数据盘容量,非裸金属机型必填 + - **DataDiskType** (str) - 数据盘类型,非裸金属机型必填,例如:CLOUD_RSSD + - **NodeCount** (int) - 节点数量,默认为1 + - **Password** (str) - 密码,NodeRole为client时必填 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.AddUHadoopInstanceNodeRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AddUHadoopInstanceNode", d, **kwargs) + return apis.AddUHadoopInstanceNodeResponseSchema().loads(resp) + + def create_uhadoop_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUHadoopInstance - 创建实例接口。\\ 创建实例前需要按以下步骤准备必要参数:\\ 1.获取Region(地域)和 Zone(可用区),访问链接:https://docs.ucloud.cn/api/summary/regionlist 可以获取所有支持的地域和可用区;\\ 2.FrameworkVersion,访问链接:https://docs.ucloud.cn/api/uhadoop-api/list_uhadoop_framework_app_by_use_case,响应字段的AppConfigSet[N].FrameworkVersion是框架版本是支持的 UHadoop 版本;\\ 3.ChargeType付费类型,可用值:Dynamic为按小时付费,Month为按月付费,Year为按年付费;\\ 4.InstanceGroupConfigs需要获取NodeType机型详情,访问链接:https://docs.ucloud.cn/api/uhadoop-api/get_uhadoop_node_type,响应字段的InstanceTypeSet[N].NodeType是机型名称,响应字段的InstanceTypeSet[N].SuitableRole是机型可用的节点类型;\\ 5.获取DiskSize磁盘大小范围 ,访问链接:https://docs.ucloud.cn/api/uhadoop-api/get_uhadoop_node_type,该接口响应字段的InstanceTypeSet[N].DiskSet[N].DiskMinSize和InstanceTypeSet[N].DiskSet[N].DiskMaxSize是磁盘大小的取值范围;\\ 6.InstanceName,自定义输入实例名称,只能包含中英文、数字以及- _ ;\\7.Password,集群机器的登录密码,需要输入base64编码后的内容;\\8.AppConfigs 集群需要安装的组件,访问链接,https://docs.ucloud.cn/api/uhadoop-api/list_uhadoop_framework_app ,AppConfigSet[N].AppName是组件名称,AppConfigSet[N].AppVersion是组件版本 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **AppConfigs** (list) - (Required) 集群需要安装的组件,格式:组件#版本通过ListUHadoopFrameworkApp接口获取,例如:Spark#3.3.0 + - **Framework** (str) - (Required) 框架,值为'Hadoop'|'HDFS'|'MR'|'StarRocks'之一,框架,例如Hadoop|MR|HDFS|StarRocks Hadoop框架包含存储与计算服务 MR集群包含计算服务 HDFS只包含存储服务,StarRocks为StarRocks集群 + - **FrameworkVersion** (str) - (Required) 版本,例如:3.2.1-udh3.0,通过ListUHadoopFrameworkApp接口获取 + - **InstanceGroupConfigs** (list) - (Required) 节点配置,里面包括NodeType(机型),NodeRole(节点类别,值为其中之一:master|core|task),Count(数量),DataDiskType(数据盘类别),DataDiskSize(数据盘大小),DataDiskNum(数据盘数量),BootDiskType(系统盘类型),BootDiskSize(系统盘大小),通过GetUHadoopNodeType接口获取,示例为:InstanceGroupConfigs.0.NodeType=o.hadoop2m.xlargeInstanceGroupConfigs.0.NodeRole=masterInstanceGroupConfigs.0.Count=2InstanceGroupConfigs.0.DataDiskType=CLOUD_RSSDInstanceGroupConfigs.0.DataDiskSize=100InstanceGroupConfigs.0.DataDiskNum=1InstanceGroupConfigs.0.BootDiskType=CLOUD_RSSDInstanceGroupConfigs.0.BootDiskSize=50InstanceGroupConfigs.1.NodeType=o.hadoop2m.xlargeInstanceGroupConfigs.1.NodeRole=coreInstanceGroupConfigs.1.Count=3InstanceGroupConfigs.1.DataDiskType=CLOUD_RSSDInstanceGroupConfigs.1.DataDiskSize=200InstanceGroupConfigs.1.DataDiskNum=1InstanceGroupConfigs.1.BootDiskType=CLOUD_RSSDInstanceGroupConfigs.1.BootDiskSize=50 + - **Password** (str) - (Required) 集群机器的登录密码,需要输入base64编码后的内容 + - **SubnetId** (str) - (Required) 子网ID + - **VPCId** (str) - (Required) VPCId + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **BusinessId** (str) - 工作组ID,默认Default + - **ChargeType** (str) - 支付类别,默认:Month + - **InstanceName** (str) - 实例名称,默认为实例ID + - **IsSecurityEnabled** (str) - 是否开启安全组 + - **Quantity** (int) - 数量,默认1 + - **SecGroupIds** (str) - 安全组ID,字符串数组,IsSecurityEnabled为true时生效 + - **StandAloneMetaStore** (str) - 目前只支持传‘udb’ + - **StorgeClusterId** (str) - Framework为‘MR’时,存储集群ID + - **US3AccessKey** (str) - US3 配置公钥,仅支持框架为StarRocks存算分离时传入 + - **US3Bucket** (str) - US3 bucket名称,仅支持框架为StarRocks存算分离时传入 + - **US3SecretKey** (str) - US3 配置私钥,仅支持框架为StarRocks存算分离时传入 + - **US3TokenName** (str) - US3 Token名称,仅支持框架为StarRocks存算分离时传入 + + **Response** + + - **InstanceId** (str) - 实例ID + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateUHadoopInstanceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUHadoopInstance", d, **kwargs) + return apis.CreateUHadoopInstanceResponseSchema().loads(resp) + + def delete_uhadoop_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUHadoopInstance - 删除掉一个uhadoop集群 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceId** (str) - (Required) 实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ReleaseEIP** (bool) - 是否释放绑定的EIP。true: 解绑EIP后,并释放;其他值或不填:解绑EIP。 + + **Response** + + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteUHadoopInstanceRequestSchema().dumps(d) + + resp = self.invoke("DeleteUHadoopInstance", d, **kwargs) + return apis.DeleteUHadoopInstanceResponseSchema().loads(resp) + + def describe_uhadoop_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUHadoopInstance - 描述集群 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceId** (str) - (Required) 实例ID + - **SubnetId** (str) - 子网ID + - **VPCId** (str) - VPCID + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **ClusterSet** (list) - 见 **ClusterInfo** 模型定义 + - **Message** (str) - 错误信息 + + **Response Model** + + **ClusterInfo** + - **AppConfigCount** (str) - 组件数量 + - **AppConfigSet** (str) - 组件集合 + - **BusinessId** (str) - 业务组ID + - **ChargeType** (str) - 付费类型 + - **CoreCount** (str) - core节点数量 + - **CreateTime** (str) - 创建时间 + - **ExpireTime** (str) - 到期时间 + - **Framework** (str) - 框架,值为'Hadoop'|'HDFS'|'MR'|'StarRocks'之一,框架,例如Hadoop|MR|HDFS|StarRocks Hadoop框架包含存储与计算服务 MR集群包含计算服务 HDFS只包含存储服务,StarRocks为StarRocks集群 + - **HadoopVersion** (str) - Hadoop版本,值为 hadoop3.2.1-udh3.0|hadoop3.3.4-udh3.1|hadoop2.8.5-udh2.2 + - **InstanceId** (str) - 实例ID + - **InstanceName** (str) - 实例名称 + - **IsOpenSecGroup** (str) - 是否开启安全组 + - **MasterCount** (str) - Master节点数量 + - **NodeCount** (str) - 节点数量 + - **NodeSet** (str) - 节点集合 + - **ReleaseVersion** (str) - Uhadoop版本,值为 uhadoop 3.0|uhadoop 2.2|uhadoop 3.1 + - **RunningTime** (str) - 运行时间 + - **State** (str) - 状态,值为以下其中之一,Running(运行中)|Creating(创建中)|CreateFailed(创建失败)|Deploying(部署中)|Updating(变更中) + - **SubnetId** (str) - 子网ID + - **Tag** (str) - 集群Tag + - **TaskCount** (str) - Task节点数量 + - **VPCId** (str) - VPC ID + - **Zone** (str) - 可用区 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUHadoopInstanceRequestSchema().dumps(d) + + resp = self.invoke("DescribeUHadoopInstance", d, **kwargs) + return apis.DescribeUHadoopInstanceResponseSchema().loads(resp) + + def get_uhadoop_node_type( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUHadoopNodeType - 获取节点类型信息 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Framework** (str) - 框架,例如Hadoop|MR|HDFS|StarRocks,Hadoop框架包含存储与计算服务,MR集群包含计算服务,HDFS只包含存储服务,StarRocks为StarRocks集群 + - **FrameworkVersion** (str) - 框架版本,例如3.2.1-udh3.0,通过ListUHadoopFrameworkApp接口获取 + - **NodeRole** (str) - 角色,master|core|task + - **NodeType** (str) - 机型名称 + + **Response** + + - **HostTypeSupportNodeType** (str) - 机型可支持的节点类型 + - **InstanceTypeSet** (list) - 见 **InstanceType** 模型定义 + - **Message** (str) - 错误信息 + - **MetaDataUDBUsable** (bool) - 当前可用区是否支持元数据库使用UDB + + **Response Model** + + **DiskSet** + - **DiskMaxNum** (str) - 最大磁盘数量 + - **DiskMaxSize** (str) - 最大单块盘容量,单位GB + - **DiskMinNum** (str) - 最小磁盘数量 + - **DiskMinSize** (str) - 最小单块盘容量,单位GB + - **DiskNum** (int) - 磁盘数量 + - **DiskType** (list) - 可支持的磁盘类型 + - **SingleDiskSize** (int) - 单块盘大小 + - **Size** (int) - 总磁盘大小 + - **Type** (str) - 磁盘角色,分Data数据盘和Boot系统盘 + + + **InstanceType** + - **CPU** (str) - cpu大小 + - **CPUToMemoryRatio** (str) - cpu内存比 + - **DiskSet** (list) - 见 **DiskSet** 模型定义 + - **GpuCount** (int) - GPU数量 + - **GpuType** (str) - GPU型号 + - **HostType** (str) - 机型种类,可选Outstanding(快杰机型)|General(普通机型)|BareMetal(裸金属机型)|GPU(GPU机型)四种类型 + - **IsOpenSecgroup** (str) - 是否支持开启安全组 + - **IsUsable** (str) - 是否可用,该机型是否支持创建 + - **Memory** (str) - 内存大小 + - **NodeType** (str) - 机型名称 + - **SuitableRole** (list) - 可用的节点类型,值为core|task|master之一 + + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUHadoopNodeTypeRequestSchema().dumps(d) + + resp = self.invoke("GetUHadoopNodeType", d, **kwargs) + return apis.GetUHadoopNodeTypeResponseSchema().loads(resp) + + def list_uhadoop_framework_app( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUHadoopFrameworkApp - 列举可选app + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Framework** (str) - (Required) 框架,值为'Hadoop'|'HDFS'|'MR'|'StarRocks'之一,框架,例如Hadoop|MR|HDFS|StarRocks Hadoop框架包含存储与计算服务 MR集群包含计算服务 HDFS只包含存储服务,StarRocks为StarRocks集群 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **InstanceId** (str) - 实例ID,可选。传的话,过滤出适合此集群的app信息。 + + **Response** + + - **AppConfigSet** (list) - 见 **AppConfig** 模型定义 + - **Message** (str) - 错误信息 + + **Response Model** + + **AppConfig** + - **AppName** (str) - 需要安装的应用如:Hive,HBase, Spark,Hue,Pig等其他组件 + - **AppStatus** (str) - 应用的状态(运行中)'Running'|(已停止)'Stopped'|(启动中)'Starting'|(停止中)'Stopping'|(启动失败)'StartFailed'|(停止失败)'StopFailed'|(安装中)'Installing'|(安装失败)'InstallFailed'|(未安装)'NotInstalled', + - **AppVersion** (str) - 应用的版本号(0.13.1,0.98.6 等等) + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUHadoopFrameworkAppRequestSchema().dumps(d) + + resp = self.invoke("ListUHadoopFrameworkApp", d, **kwargs) + return apis.ListUHadoopFrameworkAppResponseSchema().loads(resp) + + def list_uhadoop_framework_app_by_use_case( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUHadoopFrameworkAppByUseCase - 按使用场景列出uhadoop的框架和框架中的应用 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **AppConfigSet** (list) - 见 **AppConfigVersion** 模型定义 + - **Message** (str) - 错误信息 + + **Response Model** + + **UseCases** + - **AppVersion** (str) - 组件版本 + - **ClusterCase** (str) - 集群种类 + - **MustHas** (str) - 依赖的组件 + + + **AppConfigVersion** + - **Framework** (str) - 框架,值为'Hadoop'|'HDFS'|'MR'|'StarRocks'之一,框架,例如Hadoop|MR|HDFS|StarRocks Hadoop框架包含存储与计算服务 MR集群包含计算服务 HDFS只包含存储服务,StarRocks为StarRocks集群 + - **FrameworkVersion** (str) - 框架版本 + - **HadoopVersion** (str) - Hadoop版本,值为 hadoop3.2.1-udh3.0|hadoop3.3.4-udh3.1 |hadoop2.8.5-udh2.2 + - **ReleaseVersion** (str) - UHadoop版本,值为 uhadoop 3.0|uhadoop 2.2|uhadoop 3.1 + - **UseCases** (list) - 见 **UseCases** 模型定义 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUHadoopFrameworkAppByUseCaseRequestSchema().dumps(d) + + resp = self.invoke("ListUHadoopFrameworkAppByUseCase", d, **kwargs) + return apis.ListUHadoopFrameworkAppByUseCaseResponseSchema().loads(resp) + + def list_uhadoop_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUHadoopInstance - 列出用户所有的uhadoop集群 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - 获取列表的长度限制,默认值为60 + - **Offset** (int) - 获取列表的偏移,默认值为0 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **ClusterSet** (list) - 见 **ListClusterInfo** 模型定义 + - **Message** (str) - 错误信息 + - **TotalCount** (int) - 总数 + + **Response Model** + + **ListClusterInfo** + - **BusinessId** (str) - 业务组ID + - **CreateTime** (str) - 创建时间 + - **Framework** (str) - 框架,值为'Hadoop'|'HDFS'|'MR'|'StarRocks'之一,Hadoop框架包含存储与计算服务,MR集群包含计算服务,HDFS只包含存储服务,StarRocks为StarRocks集群 + - **HadoopVersion** (str) - Hadoop版本,值为 hadoop3.2.1-udh3.0|hadoop3.3.4-udh3.1 |hadoop2.8.5-udh2.2 + - **InstanceId** (str) - 实例ID + - **InstanceName** (str) - 实例名称 + - **ReleaseVersion** (str) - Uhadoop版本,值为 uhadoop 3.0|uhadoop 2.2|uhadoop 3.1 + - **State** (str) - 状态,值为以下其中之一,Running(运行中)|Creating(创建中)|CreateFailed(创建失败)|Deploying(部署中)|Updating(变更中) + - **SubnetId** (str) - 子网ID + - **VPCId** (str) - VPC ID + - **Zone** (str) - 可用区 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUHadoopInstanceRequestSchema().dumps(d) + + resp = self.invoke("ListUHadoopInstance", d, **kwargs) + return apis.ListUHadoopInstanceResponseSchema().loads(resp) + + def restart_uhadoop_service( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RestartUHadoopService - 重启集群服务(包含start|stop|restart) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceId** (str) - (Required) 实例ID + - **ServiceName** (str) - (Required) 要操作的服务名。可通过ListUHadoopFrameworkApp接口获取 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ApplicationVersion** (str) - 应用版本,ApplicationVersion传参时,表示这次操作是整个应用所有服务。 + - **NodeId** (list) - 要操作的NodeId数组。如果传入,则用于过滤操作哪些Node。 + - **NodeRole** (list) - 要操作的NodeRole数组。如果传入,则用于过滤操作哪些Node。值为以下之一master|core|task + - **OnlyStart** (bool) - 只启动。值为false|true之一,默认false,当OnlyStart和OnlyStop同时置为true,则重启。 + - **OnlyStop** (bool) - 只停止。值为false|true之一,默认false。当OnlyStart和OnlyStop同时置为true,则重启。 + + **Response** + + - **Message** (str) - 错误信息 + - **State** (str) - 当前执行状态,running(操作运行中)|success(操作成功)|failed(操作失败)|killed(操作被终止)。 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.RestartUHadoopServiceRequestSchema().dumps(d) + + resp = self.invoke("RestartUHadoopService", d, **kwargs) + return apis.RestartUHadoopServiceResponseSchema().loads(resp) + + def upgrade_uhadoop_node( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpgradeUHadoopNode - 升级uhadoop节点 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceId** (str) - (Required) 实例ID + - **NodeRole** (str) - (Required) 节点角色,支持"master"|"core"|"task" + - **NodeType** (str) - (Required) 节点新机型,通过GetUHadoopNodeType接口获取 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **NodeNames** (list) - 节点名称,当NodeRole不为master时必填 + + **Response** + + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpgradeUHadoopNodeRequestSchema().dumps(d) + + resp = self.invoke("UpgradeUHadoopNode", d, **kwargs) + return apis.UpgradeUHadoopNodeResponseSchema().loads(resp) + + def upgrade_uhadoop_node_disk( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpgradeUHadoopNodeDisk - 扩容集群节点磁盘 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DataDiskSize** (int) - (Required) 新的数据盘磁盘大小 + - **InstanceId** (str) - (Required) 实例ID + - **NodeRole** (str) - (Required) 节点角色,值为master|core|task之一 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **BootDiskSize** (int) - 系统盘磁盘大小,仅支持云盘裸金属机型(系统盘和数据盘数值同时增加、只会处理系统盘参数) + - **NodeNames** (list) - 节点名称集合,当NodeRole不为master时必填 + + **Response** + + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpgradeUHadoopNodeDiskRequestSchema().dumps(d) + + resp = self.invoke("UpgradeUHadoopNodeDisk", d, **kwargs) + return apis.UpgradeUHadoopNodeDiskResponseSchema().loads(resp) diff --git a/ucloud/services/uhadoop/schemas/__init__.py b/ucloud/services/uhadoop/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/uhadoop/schemas/apis.py b/ucloud/services/uhadoop/schemas/apis.py new file mode 100644 index 00000000..0093441f --- /dev/null +++ b/ucloud/services/uhadoop/schemas/apis.py @@ -0,0 +1,384 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.uhadoop.schemas import models + +""" UHadoop API Schema +""" + + +""" +API: AddUHadoopInstanceNode + +给已有集群添加一定数量的节点 +""" + + +class AddUHadoopInstanceNodeRequestSchema(schema.RequestSchema): + """AddUHadoopInstanceNode - 给已有集群添加一定数量的节点""" + + fields = { + "BootDiskSize": fields.Str(required=False, dump_to="BootDiskSize"), + "BootDiskType": fields.Str(required=False, dump_to="BootDiskType"), + "DataDiskNum": fields.Str(required=False, dump_to="DataDiskNum"), + "DataDiskSize": fields.Str(required=False, dump_to="DataDiskSize"), + "DataDiskType": fields.Str(required=False, dump_to="DataDiskType"), + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "NodeCount": fields.Int(required=False, dump_to="NodeCount"), + "NodeRole": fields.Str(required=True, dump_to="NodeRole"), + "NodeType": fields.Str(required=True, dump_to="NodeType"), + "Password": fields.Str(required=False, dump_to="Password"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class AddUHadoopInstanceNodeResponseSchema(schema.ResponseSchema): + """AddUHadoopInstanceNode - 给已有集群添加一定数量的节点""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: CreateUHadoopInstance + +创建实例接口。\\ 创建实例前需要按以下步骤准备必要参数:\\ 1.获取Region(地域)和 Zone(可用区),访问链接:https://docs.ucloud.cn/api/summary/regionlist 可以获取所有支持的地域和可用区;\\ 2.FrameworkVersion,访问链接:https://docs.ucloud.cn/api/uhadoop-api/list_uhadoop_framework_app_by_use_case,响应字段的AppConfigSet[N].FrameworkVersion是框架版本是支持的 UHadoop 版本;\\ 3.ChargeType付费类型,可用值:Dynamic为按小时付费,Month为按月付费,Year为按年付费;\\ 4.InstanceGroupConfigs需要获取NodeType机型详情,访问链接:https://docs.ucloud.cn/api/uhadoop-api/get_uhadoop_node_type,响应字段的InstanceTypeSet[N].NodeType是机型名称,响应字段的InstanceTypeSet[N].SuitableRole是机型可用的节点类型;\\ 5.获取DiskSize磁盘大小范围 ,访问链接:https://docs.ucloud.cn/api/uhadoop-api/get_uhadoop_node_type,该接口响应字段的InstanceTypeSet[N].DiskSet[N].DiskMinSize和InstanceTypeSet[N].DiskSet[N].DiskMaxSize是磁盘大小的取值范围;\\ 6.InstanceName,自定义输入实例名称,只能包含中英文、数字以及- _ ;\\7.Password,集群机器的登录密码,需要输入base64编码后的内容;\\8.AppConfigs 集群需要安装的组件,访问链接,https://docs.ucloud.cn/api/uhadoop-api/list_uhadoop_framework_app ,AppConfigSet[N].AppName是组件名称,AppConfigSet[N].AppVersion是组件版本 +""" + + +class CreateUHadoopInstanceRequestSchema(schema.RequestSchema): + """CreateUHadoopInstance - 创建实例接口。\\ 创建实例前需要按以下步骤准备必要参数:\\ 1.获取Region(地域)和 Zone(可用区),访问链接:https://docs.ucloud.cn/api/summary/regionlist 可以获取所有支持的地域和可用区;\\ 2.FrameworkVersion,访问链接:https://docs.ucloud.cn/api/uhadoop-api/list_uhadoop_framework_app_by_use_case,响应字段的AppConfigSet[N].FrameworkVersion是框架版本是支持的 UHadoop 版本;\\ 3.ChargeType付费类型,可用值:Dynamic为按小时付费,Month为按月付费,Year为按年付费;\\ 4.InstanceGroupConfigs需要获取NodeType机型详情,访问链接:https://docs.ucloud.cn/api/uhadoop-api/get_uhadoop_node_type,响应字段的InstanceTypeSet[N].NodeType是机型名称,响应字段的InstanceTypeSet[N].SuitableRole是机型可用的节点类型;\\ 5.获取DiskSize磁盘大小范围 ,访问链接:https://docs.ucloud.cn/api/uhadoop-api/get_uhadoop_node_type,该接口响应字段的InstanceTypeSet[N].DiskSet[N].DiskMinSize和InstanceTypeSet[N].DiskSet[N].DiskMaxSize是磁盘大小的取值范围;\\ 6.InstanceName,自定义输入实例名称,只能包含中英文、数字以及- _ ;\\7.Password,集群机器的登录密码,需要输入base64编码后的内容;\\8.AppConfigs 集群需要安装的组件,访问链接,https://docs.ucloud.cn/api/uhadoop-api/list_uhadoop_framework_app ,AppConfigSet[N].AppName是组件名称,AppConfigSet[N].AppVersion是组件版本""" + + fields = { + "AppConfig": fields.List( + fields.Str() + ), # Deprecated, will be removed at 1.0 + "AppConfigs": fields.List(fields.Str()), + "BusinessId": fields.Str(required=False, dump_to="BusinessId"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "Framework": fields.Str(required=True, dump_to="Framework"), + "FrameworkVersion": fields.Str( + required=True, dump_to="FrameworkVersion" + ), + "InstanceGroupConfigs": fields.List(fields.Str()), + "InstanceName": fields.Str(required=False, dump_to="InstanceName"), + "IsSecurityEnabled": fields.Str( + required=False, dump_to="IsSecurityEnabled" + ), + "Password": fields.Str(required=True, dump_to="Password"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "SecGroupIds": fields.Str(required=False, dump_to="SecGroupIds"), + "StandAloneMetaStore": fields.Str( + required=False, dump_to="StandAloneMetaStore" + ), + "StorgeClusterId": fields.Str( + required=False, dump_to="StorgeClusterId" + ), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + "US3AccessKey": fields.Str(required=False, dump_to="US3AccessKey"), + "US3Bucket": fields.Str(required=False, dump_to="US3Bucket"), + "US3SecretKey": fields.Str(required=False, dump_to="US3SecretKey"), + "US3TokenName": fields.Str(required=False, dump_to="US3TokenName"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateUHadoopInstanceResponseSchema(schema.ResponseSchema): + """CreateUHadoopInstance - 创建实例接口。\\ 创建实例前需要按以下步骤准备必要参数:\\ 1.获取Region(地域)和 Zone(可用区),访问链接:https://docs.ucloud.cn/api/summary/regionlist 可以获取所有支持的地域和可用区;\\ 2.FrameworkVersion,访问链接:https://docs.ucloud.cn/api/uhadoop-api/list_uhadoop_framework_app_by_use_case,响应字段的AppConfigSet[N].FrameworkVersion是框架版本是支持的 UHadoop 版本;\\ 3.ChargeType付费类型,可用值:Dynamic为按小时付费,Month为按月付费,Year为按年付费;\\ 4.InstanceGroupConfigs需要获取NodeType机型详情,访问链接:https://docs.ucloud.cn/api/uhadoop-api/get_uhadoop_node_type,响应字段的InstanceTypeSet[N].NodeType是机型名称,响应字段的InstanceTypeSet[N].SuitableRole是机型可用的节点类型;\\ 5.获取DiskSize磁盘大小范围 ,访问链接:https://docs.ucloud.cn/api/uhadoop-api/get_uhadoop_node_type,该接口响应字段的InstanceTypeSet[N].DiskSet[N].DiskMinSize和InstanceTypeSet[N].DiskSet[N].DiskMaxSize是磁盘大小的取值范围;\\ 6.InstanceName,自定义输入实例名称,只能包含中英文、数字以及- _ ;\\7.Password,集群机器的登录密码,需要输入base64编码后的内容;\\8.AppConfigs 集群需要安装的组件,访问链接,https://docs.ucloud.cn/api/uhadoop-api/list_uhadoop_framework_app ,AppConfigSet[N].AppName是组件名称,AppConfigSet[N].AppVersion是组件版本""" + + fields = { + "InstanceId": fields.Str(required=False, load_from="InstanceId"), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DeleteUHadoopInstance + +删除掉一个uhadoop集群 +""" + + +class DeleteUHadoopInstanceRequestSchema(schema.RequestSchema): + """DeleteUHadoopInstance - 删除掉一个uhadoop集群""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ReleaseEIP": fields.Bool(required=False, dump_to="ReleaseEIP"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DeleteUHadoopInstanceResponseSchema(schema.ResponseSchema): + """DeleteUHadoopInstance - 删除掉一个uhadoop集群""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DescribeUHadoopInstance + +描述集群 +""" + + +class DescribeUHadoopInstanceRequestSchema(schema.RequestSchema): + """DescribeUHadoopInstance - 描述集群""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DescribeUHadoopInstanceResponseSchema(schema.ResponseSchema): + """DescribeUHadoopInstance - 描述集群""" + + fields = { + "ClusterSet": fields.List( + models.ClusterInfoSchema(), required=False, load_from="ClusterSet" + ), + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: GetUHadoopNodeType + +获取节点类型信息 +""" + + +class GetUHadoopNodeTypeRequestSchema(schema.RequestSchema): + """GetUHadoopNodeType - 获取节点类型信息""" + + fields = { + "Framework": fields.Str(required=False, dump_to="Framework"), + "FrameworkVersion": fields.Str( + required=False, dump_to="FrameworkVersion" + ), + "NodeRole": fields.Str(required=False, dump_to="NodeRole"), + "NodeType": fields.Str(required=False, dump_to="NodeType"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetUHadoopNodeTypeResponseSchema(schema.ResponseSchema): + """GetUHadoopNodeType - 获取节点类型信息""" + + fields = { + "HostTypeSupportNodeType": fields.Str( + required=False, load_from="HostTypeSupportNodeType" + ), + "InstanceTypeSet": fields.List( + models.InstanceTypeSchema(), + required=True, + load_from="InstanceTypeSet", + ), + "Message": fields.Str(required=False, load_from="Message"), + "MetaDataUDBUsable": fields.Bool( + required=False, load_from="MetaDataUDBUsable" + ), + } + + +""" +API: ListUHadoopFrameworkApp + +列举可选app +""" + + +class ListUHadoopFrameworkAppRequestSchema(schema.RequestSchema): + """ListUHadoopFrameworkApp - 列举可选app""" + + fields = { + "Framework": fields.Str(required=True, dump_to="Framework"), + "InstanceId": fields.Str(required=False, dump_to="InstanceId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ListUHadoopFrameworkAppResponseSchema(schema.ResponseSchema): + """ListUHadoopFrameworkApp - 列举可选app""" + + fields = { + "AppConfigSet": fields.List( + models.AppConfigSchema(), required=False, load_from="AppConfigSet" + ), + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: ListUHadoopFrameworkAppByUseCase + +按使用场景列出uhadoop的框架和框架中的应用 +""" + + +class ListUHadoopFrameworkAppByUseCaseRequestSchema(schema.RequestSchema): + """ListUHadoopFrameworkAppByUseCase - 按使用场景列出uhadoop的框架和框架中的应用""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ListUHadoopFrameworkAppByUseCaseResponseSchema(schema.ResponseSchema): + """ListUHadoopFrameworkAppByUseCase - 按使用场景列出uhadoop的框架和框架中的应用""" + + fields = { + "AppConfigSet": fields.List( + models.AppConfigVersionSchema(), + required=False, + load_from="AppConfigSet", + ), + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: ListUHadoopInstance + +列出用户所有的uhadoop集群 +""" + + +class ListUHadoopInstanceRequestSchema(schema.RequestSchema): + """ListUHadoopInstance - 列出用户所有的uhadoop集群""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class ListUHadoopInstanceResponseSchema(schema.ResponseSchema): + """ListUHadoopInstance - 列出用户所有的uhadoop集群""" + + fields = { + "ClusterSet": fields.List( + models.ListClusterInfoSchema(), + required=True, + load_from="ClusterSet", + ), + "Message": fields.Str(required=False, load_from="Message"), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: RestartUHadoopService + +重启集群服务(包含start|stop|restart) +""" + + +class RestartUHadoopServiceRequestSchema(schema.RequestSchema): + """RestartUHadoopService - 重启集群服务(包含start|stop|restart)""" + + fields = { + "ApplicationVersion": fields.Str( + required=False, dump_to="ApplicationVersion" + ), + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "NodeId": fields.List(fields.Str()), + "NodeRole": fields.List(fields.Str()), + "OnlyStart": fields.Bool(required=False, dump_to="OnlyStart"), + "OnlyStop": fields.Bool(required=False, dump_to="OnlyStop"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ServiceName": fields.Str(required=True, dump_to="ServiceName"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class RestartUHadoopServiceResponseSchema(schema.ResponseSchema): + """RestartUHadoopService - 重启集群服务(包含start|stop|restart)""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + "State": fields.Str(required=False, load_from="State"), + } + + +""" +API: UpgradeUHadoopNode + +升级uhadoop节点 +""" + + +class UpgradeUHadoopNodeRequestSchema(schema.RequestSchema): + """UpgradeUHadoopNode - 升级uhadoop节点""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "NodeNames": fields.List(fields.Str()), + "NodeRole": fields.Str(required=True, dump_to="NodeRole"), + "NodeType": fields.Str(required=True, dump_to="NodeType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class UpgradeUHadoopNodeResponseSchema(schema.ResponseSchema): + """UpgradeUHadoopNode - 升级uhadoop节点""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: UpgradeUHadoopNodeDisk + +扩容集群节点磁盘 +""" + + +class UpgradeUHadoopNodeDiskRequestSchema(schema.RequestSchema): + """UpgradeUHadoopNodeDisk - 扩容集群节点磁盘""" + + fields = { + "BootDiskSize": fields.Int(required=False, dump_to="BootDiskSize"), + "DataDiskSize": fields.Int(required=True, dump_to="DataDiskSize"), + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "NodeNames": fields.List(fields.Str()), + "NodeRole": fields.Str(required=True, dump_to="NodeRole"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class UpgradeUHadoopNodeDiskResponseSchema(schema.ResponseSchema): + """UpgradeUHadoopNodeDisk - 扩容集群节点磁盘""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } diff --git a/ucloud/services/uhadoop/schemas/models.py b/ucloud/services/uhadoop/schemas/models.py new file mode 100644 index 00000000..56c0ac4a --- /dev/null +++ b/ucloud/services/uhadoop/schemas/models.py @@ -0,0 +1,131 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class ClusterInfoSchema(schema.ResponseSchema): + """ClusterInfo - 集群信息""" + + fields = { + "AppConfigCount": fields.Str( + required=False, load_from="AppConfigCount" + ), + "AppConfigSet": fields.Str(required=False, load_from="AppConfigSet"), + "BusinessId": fields.Str(required=True, load_from="BusinessId"), + "ChargeType": fields.Str(required=True, load_from="ChargeType"), + "CoreCount": fields.Str(required=True, load_from="CoreCount"), + "CreateTime": fields.Str(required=True, load_from="CreateTime"), + "ExpireTime": fields.Str(required=True, load_from="ExpireTime"), + "Framework": fields.Str(required=True, load_from="Framework"), + "HadoopVersion": fields.Str(required=True, load_from="HadoopVersion"), + "InstanceId": fields.Str(required=True, load_from="InstanceId"), + "InstanceName": fields.Str(required=True, load_from="InstanceName"), + "IsOpenSecGroup": fields.Str( + required=False, load_from="IsOpenSecGroup" + ), + "MasterCount": fields.Str(required=True, load_from="MasterCount"), + "NodeCount": fields.Str(required=False, load_from="NodeCount"), + "NodeSet": fields.Str(required=False, load_from="NodeSet"), + "ReleaseVersion": fields.Str(required=True, load_from="ReleaseVersion"), + "RunningTime": fields.Str(required=False, load_from="RunningTime"), + "State": fields.Str(required=True, load_from="State"), + "SubnetId": fields.Str(required=True, load_from="SubnetId"), + "Tag": fields.Str(required=True, load_from="Tag"), + "TaskCount": fields.Str(required=True, load_from="TaskCount"), + "VPCId": fields.Str(required=True, load_from="VPCId"), + "Zone": fields.Str(required=True, load_from="Zone"), + } + + +class DiskSetSchema(schema.ResponseSchema): + """DiskSet -""" + + fields = { + "DiskMaxNum": fields.Str(required=False, load_from="DiskMaxNum"), + "DiskMaxSize": fields.Str(required=False, load_from="DiskMaxSize"), + "DiskMinNum": fields.Str(required=False, load_from="DiskMinNum"), + "DiskMinSize": fields.Str(required=False, load_from="DiskMinSize"), + "DiskNum": fields.Int(required=False, load_from="DiskNum"), + "DiskType": fields.List(fields.Str()), + "SingleDiskSize": fields.Int( + required=False, load_from="SingleDiskSize" + ), + "Size": fields.Int(required=True, load_from="Size"), + "Type": fields.Str(required=True, load_from="Type"), + } + + +class InstanceTypeSchema(schema.ResponseSchema): + """InstanceType - 机型配置""" + + fields = { + "CPU": fields.Str(required=True, load_from="CPU"), + "CPUToMemoryRatio": fields.Str( + required=True, load_from="CPUToMemoryRatio" + ), + "DiskSet": fields.List(DiskSetSchema()), + "GpuCount": fields.Int(required=False, load_from="GpuCount"), + "GpuType": fields.Str(required=False, load_from="GpuType"), + "HostType": fields.Str(required=True, load_from="HostType"), + "IsOpenSecgroup": fields.Str( + required=False, load_from="IsOpenSecgroup" + ), + "IsUsable": fields.Str(required=True, load_from="IsUsable"), + "Memory": fields.Str(required=True, load_from="Memory"), + "NodeType": fields.Str(required=True, load_from="NodeType"), + "SuitableRole": fields.List(fields.Str()), + } + + +class AppConfigSchema(schema.ResponseSchema): + """AppConfig - 应用配置详情""" + + fields = { + "AppName": fields.Str(required=False, load_from="AppName"), + "AppStatus": fields.Str(required=False, load_from="AppStatus"), + "AppVersion": fields.Str(required=False, load_from="AppVersion"), + } + + +class UseCasesSchema(schema.ResponseSchema): + """UseCases - 框架使用示例""" + + fields = { + "AppVersion": fields.Str(required=False, load_from="AppVersion"), + "ClusterCase": fields.Str(required=False, load_from="ClusterCase"), + "MustHas": fields.Str(required=False, load_from="MustHas"), + } + + +class AppConfigVersionSchema(schema.ResponseSchema): + """AppConfigVersion - 组件版本""" + + fields = { + "Framework": fields.Str(required=False, load_from="Framework"), + "FrameworkVersion": fields.Str( + required=False, load_from="FrameworkVersion" + ), + "HadoopVersion": fields.Str(required=False, load_from="HadoopVersion"), + "ReleaseVersion": fields.Str( + required=False, load_from="ReleaseVersion" + ), + "UseCases": fields.List(UseCasesSchema()), + } + + +class ListClusterInfoSchema(schema.ResponseSchema): + """ListClusterInfo - 集群信息""" + + fields = { + "BusinessId": fields.Str(required=True, load_from="BusinessId"), + "CreateTime": fields.Str(required=True, load_from="CreateTime"), + "Framework": fields.Str(required=True, load_from="Framework"), + "HadoopVersion": fields.Str(required=True, load_from="HadoopVersion"), + "InstanceId": fields.Str(required=True, load_from="InstanceId"), + "InstanceName": fields.Str(required=True, load_from="InstanceName"), + "ReleaseVersion": fields.Str(required=True, load_from="ReleaseVersion"), + "State": fields.Str(required=True, load_from="State"), + "SubnetId": fields.Str(required=True, load_from="SubnetId"), + "VPCId": fields.Str(required=True, load_from="VPCId"), + "Zone": fields.Str(required=True, load_from="Zone"), + } diff --git a/ucloud/services/uhids/__init__.py b/ucloud/services/uhids/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/uhids/client.py b/ucloud/services/uhids/client.py new file mode 100644 index 00000000..9d6ea608 --- /dev/null +++ b/ucloud/services/uhids/client.py @@ -0,0 +1,897 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.uhids.schemas import apis + + +class UHIDSClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UHIDSClient, self).__init__(config, transport, middleware, logger) + + def add_uhost_sec_base_check_white_rule( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AddUHostSecBaseCheckWhiteRule - 添加安全基线白名单 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Data** (str) - (Required) 基线白名单规则信息(值为以下字段的json转base64后字符串,json格式:{"Data":[{"IP":{"Type":"ip","IPs":["192.168.3.4","192.168.3.4"]},"RuleID":"B0101001V01","AppName":"Linux","Description":"存在弱口令用户[testUser]","RiskType":"配置缺陷","RiskLevel":"高危","User":"testUser"},{"IP":{"Type":"all","IPs":[]},"RuleID":"B0101001V01","AppName":"Linux","Description":"存在弱口令用户[testUser]","RiskType":"配置缺陷","RiskLevel":"高危","User":"testUser"}]}) + + **Response** + + - **Fail** (int) - 失败数 + - **Success** (int) - 成功数 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.AddUHostSecBaseCheckWhiteRuleRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AddUHostSecBaseCheckWhiteRule", d, **kwargs) + return apis.AddUHostSecBaseCheckWhiteRuleResponseSchema().loads(resp) + + def add_uhost_sec_web_risk_white_rule( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AddUHostSecWebRiskWhiteRule - 添加webrisk白名单 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Data** (str) - (Required) webrisk白名单规则信息(值为以下字段的json转base64后字符串,json格式:{"Data":[{"IP":{"Type":"subnet","IPs":["192.168.1.0/24","172.36.1.0-172.36.255.255"]},"Type":"不安全的配置","RuleId":"30001","RiskDesc":"未删除的.git目录","Detail":"未删除的.git目录,黑客可以直接下载git相关文件","FileName":"/var/www/html/DiscuzX/install/index.php"},{"IP":{"Type":"all","IPs":[]},"Type":"不安全的配置","RuleId":"30001","RiskDesc":"未删除的.git目录","Detail":"未删除的.git目录,黑客可以直接下载git相关文件","FileName":"/var/www/html/DiscuzX/install/index.php"}]}) + + **Response** + + - **Fail** (int) - 失败数 + - **Success** (int) - 成功数 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.AddUHostSecWebRiskWhiteRuleRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AddUHostSecWebRiskWhiteRule", d, **kwargs) + return apis.AddUHostSecWebRiskWhiteRuleResponseSchema().loads(resp) + + def add_uhostsec_common_login_ip( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AddUhostsecCommonLoginIp - 添加常用登陆Ip + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **IPs** (str) - (Required) IP白名单列表,多个逗号间隔 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.AddUhostsecCommonLoginIpRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AddUhostsecCommonLoginIp", d, **kwargs) + return apis.AddUhostsecCommonLoginIpResponseSchema().loads(resp) + + def add_uhostsec_common_login_location( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AddUhostsecCommonLoginLocation - 添加常用登录地 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Data** (str) - (Required) 登录地址信息(值为以下字段的json转base64后字符串,json格式:{"Data":[{"Country":"中国","Province":"广东","City":"深圳"},{"Country":"中国","Province":"广东","City":"广州"}]}) + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.AddUhostsecCommonLoginLocationRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AddUhostsecCommonLoginLocation", d, **kwargs) + return apis.AddUhostsecCommonLoginLocationResponseSchema().loads(resp) + + def agent_os_statistic( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AgentOSStatistic - 统计当前主机安装哪些系统,并统计各系统安装数 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID + + **Response** + + - **Result** (dict) - 见 **OSList** 模型定义 + + **Response Model** + + **OSVersion** + - **Count** (int) - 该版本系统安装主机数 + - **Name** (str) - 系统名称 + + + **OSInfo** + - **Count** (int) - 主机数 + - **OSType** (str) - 系统类型 + - **Version** (list) - 见 **OSVersion** 模型定义 + + + **OSList** + - **OS** (list) - 见 **OSInfo** 模型定义 + - **Total** (int) - 主机操作系统总数 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.AgentOSStatisticRequestSchema().dumps(d) + + resp = self.invoke("AgentOSStatistic", d, **kwargs) + return apis.AgentOSStatisticResponseSchema().loads(resp) + + def agent_warnning_statistic( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AgentWarnningStatistic - 统计总主机数,在线数,离线数,有风险主机数,无风险主机数 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID + + **Response** + + - **Result** (dict) - 见 **AgentWarnningStatisticInfo** 模型定义 + + **Response Model** + + **AgentWarnningStatisticInfo** + - **AgentTotal** (int) - 主机总数 + - **Offline** (int) - 离线主机数 + - **Online** (int) - 在线主机数 + - **SafeCount** (int) - 无风险主机数 + - **WarnningCount** (int) - 有风险主机数 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.AgentWarnningStatisticRequestSchema().dumps(d) + + resp = self.invoke("AgentWarnningStatistic", d, **kwargs) + return apis.AgentWarnningStatisticResponseSchema().loads(resp) + + def buy_bill_point( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """BuyBillPoint - 购买付费点数 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **AutoBusiness** (bool) - (Required) 是否自动设置企业版(true-是,false-否) + - **AutoRenew** (bool) - (Required) 是否自动续费(true-是,false-否) + - **PointNum** (int) - (Required) 购买数量 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.BuyBillPointRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("BuyBillPoint", d, **kwargs) + return apis.BuyBillPointResponseSchema().loads(resp) + + def del_uhost_sec_base_check_white_rule( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DelUHostSecBaseCheckWhiteRule - 删除安全基线白名单 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **WhiteID** (str) - (Required) 基线白名单ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DelUHostSecBaseCheckWhiteRuleRequestSchema().dumps(d) + + resp = self.invoke("DelUHostSecBaseCheckWhiteRule", d, **kwargs) + return apis.DelUHostSecBaseCheckWhiteRuleResponseSchema().loads(resp) + + def del_uhost_sec_common_login( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DelUHostSecCommonLogin - 删除常用登陆IP或常用登陆地 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **WhiteID** (str) - (Required) 登录白名单ID + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DelUHostSecCommonLoginRequestSchema().dumps(d) + + resp = self.invoke("DelUHostSecCommonLogin", d, **kwargs) + return apis.DelUHostSecCommonLoginResponseSchema().loads(resp) + + def del_uhost_sec_warnings( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DelUHostSecWarnings - 删除告警 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Data** (str) - (Required) 要删除告警的列表json格式:{"Data":[{"WarnType":"WebShellAlarm","ID":"59e870483ef9f419617b7744"},{"WarnType":"checkCockhorse","ID":"59f67a26812c307b65d72e99"}]})WarnType类型:WebShellAlarm,checkCockhorse,BaseCheck,webRisk,VulCheck2,AbnormalLogin,SshBruteSucceeded + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DelUHostSecWarningsRequestSchema().dumps(d) + + resp = self.invoke("DelUHostSecWarnings", d, **kwargs) + return apis.DelUHostSecWarningsResponseSchema().loads(resp) + + def get_uhosts_ec_agent_deployment_statistics( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUHostsecAgentDeploymentStatistics - 获取当前项目制定工程的Agent部署统计值,包括安装与未安装信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + + **Response** + + - **Installed** (int) - 已安装台数 + - **Uninstalled** (int) - 未安装台数 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUHostsecAgentDeploymentStatisticsRequestSchema().dumps(d) + + resp = self.invoke("GetUHostsecAgentDeploymentStatistics", d, **kwargs) + return apis.GetUHostsecAgentDeploymentStatisticsResponseSchema().loads( + resp + ) + + def get_uhosts_ec_agent_install_script( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUHostsecAgentInstallScript - 不同的项目使用的安装脚本附带的属性值会有差异,这里需要根据每个不同的项目来获取相应的主机安全agent安装脚本下载地址 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + + **Response** + + - **InstallScript** (str) - 安装脚本内容 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUHostsecAgentInstallScriptRequestSchema().dumps(d) + + resp = self.invoke("GetUHostsecAgentInstallScript", d, **kwargs) + return apis.GetUHostsecAgentInstallScriptResponseSchema().loads(resp) + + def get_uhosts_ec_base_check_rule_description( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUHostsecBaseCheckRuleDescription - 获取基线检测指定规则详细描述 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID + - **RuleID** (str) - (Required) 规则ID + + **Response** + + - **Description** (str) - 规则描述 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUHostsecBaseCheckRuleDescriptionRequestSchema().dumps(d) + + resp = self.invoke("GetUHostsecBaseCheckRuleDescription", d, **kwargs) + return apis.GetUHostsecBaseCheckRuleDescriptionResponseSchema().loads( + resp + ) + + def get_uhostsec_agent_deployment_situation_with_ver_info( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUhostsecAgentDeploymentSituationWithVerInfo - 获取当前项目的主机安装信息,包括IP,当前付费版本等信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID + + **Response** + + - **InfoList** (list) - 见 **HostAgentStatusInfo** 模型定义 + - **InstallNum** (int) - 已安装UHIDS的主机数 + - **TotalNum** (int) - 主机总数 + - **UninstallNum** (int) - 未安装UHIDS的主机数 + + **Response Model** + + **NIC** + - **IP** (str) - 网卡ip + - **Mac** (str) - 网卡mac + + + **HostAgentStatusInfo** + - **AgentId** (str) - UHIDS的Agent识别ID + - **HostName** (str) - uhost的备注名 + - **Installed** (bool) - 是否已经安装 + - **Ip** (list) - 主机IP列表 + - **NICs** (list) - 见 **NIC** 模型定义 + - **NowVer** (int) - 此主机当前UHIDS版本信息 + - **OsName** (str) - 系统版本 + - **SetVer** (int) - 用户设置此主机UHIDS版本信息 + - **UHostId** (str) - uhost资源短ID + - **Zone** (str) - 可用区 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUhostsecAgentDeploymentSituationWithVerInfoRequestSchema().dumps( + d + ) + + resp = self.invoke( + "GetUhostsecAgentDeploymentSituationWithVerInfo", d, **kwargs + ) + return apis.GetUhostsecAgentDeploymentSituationWithVerInfoResponseSchema().loads( + resp + ) + + def get_uhostsec_trojan_description( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUhostsecTrojanDescription - 获取某一类木马告警的详细描述信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID + - **TableName** (str) - (Required) 获取指定当前木马对应的告警表名,指定当前木马对应的告警表名,利用告警表名来获取当前的描述信息,可以通过获取ListUHostsecTrojanWarnsResponse的返回信息提供TableName值内容,值:WebShellAlarm、checkCockhorse + + **Response** + + - **Description** (str) - 木马描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUhostsecTrojanDescriptionRequestSchema().dumps(d) + + resp = self.invoke("GetUhostsecTrojanDescription", d, **kwargs) + return apis.GetUhostsecTrojanDescriptionResponseSchema().loads(resp) + + def list_uhosts_ec_warn_days_statistics_v2( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUHostsecWarnDaysStatisticsV2 - 获取按天列出各类告警统计值,但不统计暴力破解失败数据,SshBruteFailed为0 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **EndTime** (str) - 统计结束时间(y-m-d hh:mm:ss)。不填写默认为当前时间 + - **StartTime** (str) - 统计开始时间(y-m-d hh:mm:ss)。不填写默认从一周前开始统计 + + **Response** + + - **Statistics** (list) - 见 **Statistics** 模型定义 + + **Response Model** + + **Statistics** + - **AbnormalLogin** (int) - 异常登录告警统计值 + - **BaseCheck** (int) - 安全基线检查告警统计值 + - **Date** (str) - 进行告警统计的时间 + - **SshBruteFailed** (int) - 暴力破解失败统计值 + - **SshBruteSucceeded** (int) - 暴力破解成功告警统计值 + - **Trojan** (int) - 木马告警统计值 + - **VulCheck** (int) - 漏洞检查告警统计值 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ListUHostsecWarnDaysStatisticsV2RequestSchema().dumps(d) + + resp = self.invoke("ListUHostsecWarnDaysStatisticsV2", d, **kwargs) + return apis.ListUHostsecWarnDaysStatisticsV2ResponseSchema().loads(resp) + + def list_uhosts_ec_warn_statistics_v2( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUHostsecWarnStatisticsV2 - 获取当前账号与项目下的各类主机安全告警统计值,但不统计暴力破解失败数据,SshBruteFailed为0 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + + **Response** + + - **WarnStatistics** (dict) - 见 **WarnStatistics** 模型定义 + + **Response Model** + + **WarnStatistics** + - **AbnormalLogin** (int) - 异常登录告警统计值 + - **BaseCheck** (int) - 安全基线检查告警统计值 + - **SshBruteFailed** (int) - 暴力破解失败统计值 + - **SshBruteSucceeded** (int) - 暴力破解成功告警统计值 + - **Trojan** (int) - 木马告警统计值 + - **VulCheck** (int) - 漏洞检查告警统计值 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ListUHostsecWarnStatisticsV2RequestSchema().dumps(d) + + resp = self.invoke("ListUHostsecWarnStatisticsV2", d, **kwargs) + return apis.ListUHostsecWarnStatisticsV2ResponseSchema().loads(resp) + + def list_uhostsec_common_login_ip( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUhostsecCommonLoginIp - 列出公共登录ip列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + + **Response** + + - **Infos** (list) - 见 **IP** 模型定义 + + **Response Model** + + **IP** + - **Account** (str) - 操作账号 + - **CreateTime** (str) - 添加时间 + - **ID** (str) - ID + - **IP** (str) - IP + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ListUhostsecCommonLoginIpRequestSchema().dumps(d) + + resp = self.invoke("ListUhostsecCommonLoginIp", d, **kwargs) + return apis.ListUhostsecCommonLoginIpResponseSchema().loads(resp) + + def list_uhostsec_common_login_location( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUhostsecCommonLoginLocation - 获取公共登录地列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + + **Response** + + - **Infos** (list) - 见 **CommonLoginLocationInfo** 模型定义 + + **Response Model** + + **CommonLoginLocationInfo** + - **Account** (str) - 账号 + - **City** (str) - 城市 + - **Country** (str) - 国家 + - **CreateTime** (str) - 创建/修改时间 + - **Province** (str) - 省份 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ListUhostsecCommonLoginLocationRequestSchema().dumps(d) + + resp = self.invoke("ListUhostsecCommonLoginLocation", d, **kwargs) + return apis.ListUhostsecCommonLoginLocationResponseSchema().loads(resp) + + def opt_business_ver_auto( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """OptBusinessVerAuto - 对自动设置企业版的开关设置 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID + - **Open** (bool) - (Required) 开(true)/关(false) + + **Response** + + - **OpenStatus** (bool) - 当前开关状态,false-关闭,true-开启 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.OptBusinessVerAutoRequestSchema().dumps(d) + + resp = self.invoke("OptBusinessVerAuto", d, **kwargs) + return apis.OptBusinessVerAutoResponseSchema().loads(resp) + + def opt_pay_auto_renew( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """OptPayAutoRenew - 自动续费功能的开关 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID + - **Open** (bool) - (Required) 开(true)/关(false) + + **Response** + + - **OpenStatus** (bool) - 当前开关状态,false-关闭,true-开启 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.OptPayAutoRenewRequestSchema().dumps(d) + + resp = self.invoke("OptPayAutoRenew", d, **kwargs) + return apis.OptPayAutoRenewResponseSchema().loads(resp) + + def query_bill_point_deduction_flow_by_cycle( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """QueryBillPointDeductionFlowByCycle - 按照周期(目前只支持按天)统计用户计费点数变化(增加/减少/预留)情况 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID + - **Type** (str) - (Required) 周期(可用值:day) + - **EndTime** (str) - (可选)查询结束时间,格式xxxx-xx-xx + - **StartTime** (str) - (可选)查询开始时间,格式xxxx-xx-xx + + **Response** + + - **Result** (list) - 见 **CycleBillPointStat** 模型定义 + + **Response Model** + + **CycleBillPointStat** + - **AddPointNum** (int) - 减少的减少 + - **RemainPointNum** (int) - 余留的点数 + - **SubPointNum** (int) - 增加的点数 + - **Time** (str) - 统计时间 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.QueryBillPointDeductionFlowByCycleRequestSchema().dumps(d) + + resp = self.invoke("QueryBillPointDeductionFlowByCycle", d, **kwargs) + return apis.QueryBillPointDeductionFlowByCycleResponseSchema().loads( + resp + ) + + def query_newest_update_time( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """QueryNewestUpdateTime - 查询下载数据最新更新时间 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID + + **Response** + + - **Result** (dict) - 见 **DataSignatureNewestUpdateTime** 模型定义 + + **Response Model** + + **DataSignatureNewestUpdateTime** + - **Login** (str) - 登录流水最新更新时间 + - **Torojan** (str) - 木马样本最新更新时间 + - **Vul** (str) - 漏洞最新更新时间 + - **WebBase** (str) - web基线最新更新时间 + - **Webshell** (str) - Webshell最新更新时间 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.QueryNewestUpdateTimeRequestSchema().dumps(d) + + resp = self.invoke("QueryNewestUpdateTime", d, **kwargs) + return apis.QueryNewestUpdateTimeResponseSchema().loads(resp) + + def query_pay_info( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """QueryPayInfo - 查询用户的付费信息,保护目前未消费点数,点数过期时间,自动续费开关等 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID + + **Response** + + - **AutoBusinessVer** (bool) - 自动企业版开关 + - **AutoRenew** (bool) - 自动续费开关 + - **BillPoint** (int) - 未消费预付费点数 + - **CompanyId** (int) - 公司ID + - **ExpiratTime** (str) - 预付费点数过期时间 + - **OrganizationId** (int) - 项目ID + - **RemainTime** (str) - 预付费点数剩余使用时长 + - **RenewPointNum** (int) - 用户最近一次购买的点数大小 + - **ResourceLongId** (str) - 资源ID + - **UpdateTime** (str) - 更改时间 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.QueryPayInfoRequestSchema().dumps(d) + + resp = self.invoke("QueryPayInfo", d, **kwargs) + return apis.QueryPayInfoResponseSchema().loads(resp) + + def query_uhost_sec_warning_base_checks( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """QueryUHostSecWarningBaseChecks - 查询正在告警的安全基线类型列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Type** (str) - (Required) 过滤BaseCheck告警类型,sys:系统安全检查,app:应用安全检查 + + **Response** + + - **Result** (list) - 见 **BaseCheckWarning** 模型定义 + + **Response Model** + + **BaseCheckWarning** + - **AgentCount** (int) - 影响主机数 + - **AppName** (str) - 应用类 + - **Description** (str) - 风险描述 + - **DescriptionEn** (str) - 风险英文描述 + - **RiskLevel** (str) - 风险等级 + - **RiskType** (str) - 风险类型 + - **RuleID** (str) - 基线规则ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.QueryUHostSecWarningBaseChecksRequestSchema().dumps(d) + + resp = self.invoke("QueryUHostSecWarningBaseChecks", d, **kwargs) + return apis.QueryUHostSecWarningBaseChecksResponseSchema().loads(resp) + + def query_week_report_list( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """QueryWeekReportList - 查询主机安全周报 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID + - **PageIndex** (int) - 第N页 + - **PageSize** (int) - 页大小 + + **Response** + + - **Result** (list) - 见 **WeekReport** 模型定义 + - **Total** (int) - 记录总数 + + **Response Model** + + **WeekReport** + - **FileName** (str) - 文件名称 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.QueryWeekReportListRequestSchema().dumps(d) + + resp = self.invoke("QueryWeekReportList", d, **kwargs) + return apis.QueryWeekReportListResponseSchema().loads(resp) + + def switch_agent_function_version( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """SwitchAgentFunctionVersion - 对agent在各个功能版本之间切换 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID + - **AgentList** (str) - (Required) 操作的Agent列表,以逗号分隔,如全部则设成ALL + - **ChargeType** (int) - (Required) 付费类型 月付或年付 + - **FuncVersion** (int) - (Required) 功能版本(0-基础版 1-企业版) + - **Coupon** (str) - 代金券 + - **Quantity** (int) - 购买数量 + + **Response** + + - **Records** (dict) - 见 **SwitchAgentRecord** 模型定义 + + **Response Model** + + **SwitchAgentRecord** + - **AgentID** (str) - + - **Message** (str) - + - **RetCode** (int) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.SwitchAgentFunctionVersionRequestSchema().dumps(d) + + resp = self.invoke("SwitchAgentFunctionVersion", d, **kwargs) + return apis.SwitchAgentFunctionVersionResponseSchema().loads(resp) + + def vul_statistic_top_n( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """VulStatisticTopN - 某种类型漏洞存在主机的主机数TOP N + + **Request** + + - **ProjectId** (str) - (Config) 项目ID + - **TopN** (int) - 感染主机数量最多的前N个漏洞,最小为10 + + **Response** + + - **Result** (list) - 见 **VulStatisticTopNInfo** 模型定义 + + **Response Model** + + **VulStatisticTopNInfo** + - **AgentCount** (int) - 存在该漏洞的主机数 + - **Name** (str) - 漏洞名称 + - **VulID** (str) - 漏洞ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.VulStatisticTopNRequestSchema().dumps(d) + + resp = self.invoke("VulStatisticTopN", d, **kwargs) + return apis.VulStatisticTopNResponseSchema().loads(resp) diff --git a/ucloud/services/uhids/schemas/__init__.py b/ucloud/services/uhids/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/uhids/schemas/apis.py b/ucloud/services/uhids/schemas/apis.py new file mode 100644 index 00000000..65f5f13f --- /dev/null +++ b/ucloud/services/uhids/schemas/apis.py @@ -0,0 +1,719 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.uhids.schemas import models + +""" UHIDS API Schema +""" + + +""" +API: AddUHostSecBaseCheckWhiteRule + +添加安全基线白名单 +""" + + +class AddUHostSecBaseCheckWhiteRuleRequestSchema(schema.RequestSchema): + """AddUHostSecBaseCheckWhiteRule - 添加安全基线白名单""" + + fields = { + "Data": fields.Str(required=True, dump_to="Data"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class AddUHostSecBaseCheckWhiteRuleResponseSchema(schema.ResponseSchema): + """AddUHostSecBaseCheckWhiteRule - 添加安全基线白名单""" + + fields = { + "Fail": fields.Int(required=False, load_from="Fail"), + "Success": fields.Int(required=False, load_from="Success"), + } + + +""" +API: AddUHostSecWebRiskWhiteRule + +添加webrisk白名单 +""" + + +class AddUHostSecWebRiskWhiteRuleRequestSchema(schema.RequestSchema): + """AddUHostSecWebRiskWhiteRule - 添加webrisk白名单""" + + fields = { + "Data": fields.Str(required=True, dump_to="Data"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class AddUHostSecWebRiskWhiteRuleResponseSchema(schema.ResponseSchema): + """AddUHostSecWebRiskWhiteRule - 添加webrisk白名单""" + + fields = { + "Fail": fields.Int(required=False, load_from="Fail"), + "Success": fields.Int(required=False, load_from="Success"), + } + + +""" +API: AddUhostsecCommonLoginIp + +添加常用登陆Ip +""" + + +class AddUhostsecCommonLoginIpRequestSchema(schema.RequestSchema): + """AddUhostsecCommonLoginIp - 添加常用登陆Ip""" + + fields = { + "IPs": fields.Str(required=True, dump_to="IPs"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class AddUhostsecCommonLoginIpResponseSchema(schema.ResponseSchema): + """AddUhostsecCommonLoginIp - 添加常用登陆Ip""" + + fields = {} + + +""" +API: AddUhostsecCommonLoginLocation + +添加常用登录地 +""" + + +class AddUhostsecCommonLoginLocationRequestSchema(schema.RequestSchema): + """AddUhostsecCommonLoginLocation - 添加常用登录地""" + + fields = { + "Data": fields.Str(required=True, dump_to="Data"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class AddUhostsecCommonLoginLocationResponseSchema(schema.ResponseSchema): + """AddUhostsecCommonLoginLocation - 添加常用登录地""" + + fields = {} + + +""" +API: AgentOSStatistic + +统计当前主机安装哪些系统,并统计各系统安装数 +""" + + +class AgentOSStatisticRequestSchema(schema.RequestSchema): + """AgentOSStatistic - 统计当前主机安装哪些系统,并统计各系统安装数""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class AgentOSStatisticResponseSchema(schema.ResponseSchema): + """AgentOSStatistic - 统计当前主机安装哪些系统,并统计各系统安装数""" + + fields = { + "Result": models.OSListSchema(), + } + + +""" +API: AgentWarnningStatistic + +统计总主机数,在线数,离线数,有风险主机数,无风险主机数 +""" + + +class AgentWarnningStatisticRequestSchema(schema.RequestSchema): + """AgentWarnningStatistic - 统计总主机数,在线数,离线数,有风险主机数,无风险主机数""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class AgentWarnningStatisticResponseSchema(schema.ResponseSchema): + """AgentWarnningStatistic - 统计总主机数,在线数,离线数,有风险主机数,无风险主机数""" + + fields = { + "Result": models.AgentWarnningStatisticInfoSchema(), + } + + +""" +API: BuyBillPoint + +购买付费点数 +""" + + +class BuyBillPointRequestSchema(schema.RequestSchema): + """BuyBillPoint - 购买付费点数""" + + fields = { + "AutoBusiness": fields.Bool(required=True, dump_to="AutoBusiness"), + "AutoRenew": fields.Bool(required=True, dump_to="AutoRenew"), + "PointNum": fields.Int(required=True, dump_to="PointNum"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class BuyBillPointResponseSchema(schema.ResponseSchema): + """BuyBillPoint - 购买付费点数""" + + fields = {} + + +""" +API: DelUHostSecBaseCheckWhiteRule + +删除安全基线白名单 +""" + + +class DelUHostSecBaseCheckWhiteRuleRequestSchema(schema.RequestSchema): + """DelUHostSecBaseCheckWhiteRule - 删除安全基线白名单""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "WhiteID": fields.Str(required=True, dump_to="WhiteID"), + } + + +class DelUHostSecBaseCheckWhiteRuleResponseSchema(schema.ResponseSchema): + """DelUHostSecBaseCheckWhiteRule - 删除安全基线白名单""" + + fields = {} + + +""" +API: DelUHostSecCommonLogin + +删除常用登陆IP或常用登陆地 +""" + + +class DelUHostSecCommonLoginRequestSchema(schema.RequestSchema): + """DelUHostSecCommonLogin - 删除常用登陆IP或常用登陆地""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "WhiteID": fields.Str(required=True, dump_to="WhiteID"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DelUHostSecCommonLoginResponseSchema(schema.ResponseSchema): + """DelUHostSecCommonLogin - 删除常用登陆IP或常用登陆地""" + + fields = {} + + +""" +API: DelUHostSecWarnings + +删除告警 +""" + + +class DelUHostSecWarningsRequestSchema(schema.RequestSchema): + """DelUHostSecWarnings - 删除告警""" + + fields = { + "Data": fields.Str(required=True, dump_to="Data"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class DelUHostSecWarningsResponseSchema(schema.ResponseSchema): + """DelUHostSecWarnings - 删除告警""" + + fields = {} + + +""" +API: GetUHostsecAgentDeploymentStatistics + +获取当前项目制定工程的Agent部署统计值,包括安装与未安装信息 +""" + + +class GetUHostsecAgentDeploymentStatisticsRequestSchema(schema.RequestSchema): + """GetUHostsecAgentDeploymentStatistics - 获取当前项目制定工程的Agent部署统计值,包括安装与未安装信息""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class GetUHostsecAgentDeploymentStatisticsResponseSchema(schema.ResponseSchema): + """GetUHostsecAgentDeploymentStatistics - 获取当前项目制定工程的Agent部署统计值,包括安装与未安装信息""" + + fields = { + "Installed": fields.Int(required=False, load_from="Installed"), + "Uninstalled": fields.Int(required=False, load_from="Uninstalled"), + } + + +""" +API: GetUHostsecAgentInstallScript + +不同的项目使用的安装脚本附带的属性值会有差异,这里需要根据每个不同的项目来获取相应的主机安全agent安装脚本下载地址 +""" + + +class GetUHostsecAgentInstallScriptRequestSchema(schema.RequestSchema): + """GetUHostsecAgentInstallScript - 不同的项目使用的安装脚本附带的属性值会有差异,这里需要根据每个不同的项目来获取相应的主机安全agent安装脚本下载地址""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class GetUHostsecAgentInstallScriptResponseSchema(schema.ResponseSchema): + """GetUHostsecAgentInstallScript - 不同的项目使用的安装脚本附带的属性值会有差异,这里需要根据每个不同的项目来获取相应的主机安全agent安装脚本下载地址""" + + fields = { + "InstallScript": fields.Str(required=True, load_from="InstallScript"), + } + + +""" +API: GetUHostsecBaseCheckRuleDescription + +获取基线检测指定规则详细描述 +""" + + +class GetUHostsecBaseCheckRuleDescriptionRequestSchema(schema.RequestSchema): + """GetUHostsecBaseCheckRuleDescription - 获取基线检测指定规则详细描述""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "RuleID": fields.Str(required=True, dump_to="RuleID"), + } + + +class GetUHostsecBaseCheckRuleDescriptionResponseSchema(schema.ResponseSchema): + """GetUHostsecBaseCheckRuleDescription - 获取基线检测指定规则详细描述""" + + fields = { + "Description": fields.Str(required=False, load_from="Description"), + } + + +""" +API: GetUhostsecAgentDeploymentSituationWithVerInfo + +获取当前项目的主机安装信息,包括IP,当前付费版本等信息 +""" + + +class GetUhostsecAgentDeploymentSituationWithVerInfoRequestSchema( + schema.RequestSchema +): + """GetUhostsecAgentDeploymentSituationWithVerInfo - 获取当前项目的主机安装信息,包括IP,当前付费版本等信息""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class GetUhostsecAgentDeploymentSituationWithVerInfoResponseSchema( + schema.ResponseSchema +): + """GetUhostsecAgentDeploymentSituationWithVerInfo - 获取当前项目的主机安装信息,包括IP,当前付费版本等信息""" + + fields = { + "InfoList": fields.List( + models.HostAgentStatusInfoSchema(), + required=False, + load_from="InfoList", + ), + "InstallNum": fields.Int(required=False, load_from="InstallNum"), + "TotalNum": fields.Int(required=False, load_from="TotalNum"), + "UninstallNum": fields.Int(required=False, load_from="UninstallNum"), + } + + +""" +API: GetUhostsecTrojanDescription + +获取某一类木马告警的详细描述信息 +""" + + +class GetUhostsecTrojanDescriptionRequestSchema(schema.RequestSchema): + """GetUhostsecTrojanDescription - 获取某一类木马告警的详细描述信息""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "TableName": fields.Str(required=True, dump_to="TableName"), + } + + +class GetUhostsecTrojanDescriptionResponseSchema(schema.ResponseSchema): + """GetUhostsecTrojanDescription - 获取某一类木马告警的详细描述信息""" + + fields = { + "Description": fields.Str(required=False, load_from="Description"), + } + + +""" +API: ListUHostsecWarnDaysStatisticsV2 + +获取按天列出各类告警统计值,但不统计暴力破解失败数据,SshBruteFailed为0 +""" + + +class ListUHostsecWarnDaysStatisticsV2RequestSchema(schema.RequestSchema): + """ListUHostsecWarnDaysStatisticsV2 - 获取按天列出各类告警统计值,但不统计暴力破解失败数据,SshBruteFailed为0""" + + fields = { + "EndTime": fields.Str(required=False, dump_to="EndTime"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "StartTime": fields.Str(required=False, dump_to="StartTime"), + } + + +class ListUHostsecWarnDaysStatisticsV2ResponseSchema(schema.ResponseSchema): + """ListUHostsecWarnDaysStatisticsV2 - 获取按天列出各类告警统计值,但不统计暴力破解失败数据,SshBruteFailed为0""" + + fields = { + "Statistics": fields.List( + models.StatisticsSchema(), required=True, load_from="Statistics" + ), + } + + +""" +API: ListUHostsecWarnStatisticsV2 + +获取当前账号与项目下的各类主机安全告警统计值,但不统计暴力破解失败数据,SshBruteFailed为0 +""" + + +class ListUHostsecWarnStatisticsV2RequestSchema(schema.RequestSchema): + """ListUHostsecWarnStatisticsV2 - 获取当前账号与项目下的各类主机安全告警统计值,但不统计暴力破解失败数据,SshBruteFailed为0""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class ListUHostsecWarnStatisticsV2ResponseSchema(schema.ResponseSchema): + """ListUHostsecWarnStatisticsV2 - 获取当前账号与项目下的各类主机安全告警统计值,但不统计暴力破解失败数据,SshBruteFailed为0""" + + fields = { + "WarnStatistics": models.WarnStatisticsSchema(), + } + + +""" +API: ListUhostsecCommonLoginIp + +列出公共登录ip列表 +""" + + +class ListUhostsecCommonLoginIpRequestSchema(schema.RequestSchema): + """ListUhostsecCommonLoginIp - 列出公共登录ip列表""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class ListUhostsecCommonLoginIpResponseSchema(schema.ResponseSchema): + """ListUhostsecCommonLoginIp - 列出公共登录ip列表""" + + fields = { + "Infos": fields.List( + models.IPSchema(), required=False, load_from="Infos" + ), + } + + +""" +API: ListUhostsecCommonLoginLocation + +获取公共登录地列表 +""" + + +class ListUhostsecCommonLoginLocationRequestSchema(schema.RequestSchema): + """ListUhostsecCommonLoginLocation - 获取公共登录地列表""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class ListUhostsecCommonLoginLocationResponseSchema(schema.ResponseSchema): + """ListUhostsecCommonLoginLocation - 获取公共登录地列表""" + + fields = { + "Infos": fields.List( + models.CommonLoginLocationInfoSchema(), + required=False, + load_from="Infos", + ), + } + + +""" +API: OptBusinessVerAuto + +对自动设置企业版的开关设置 +""" + + +class OptBusinessVerAutoRequestSchema(schema.RequestSchema): + """OptBusinessVerAuto - 对自动设置企业版的开关设置""" + + fields = { + "Open": fields.Bool(required=True, dump_to="Open"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class OptBusinessVerAutoResponseSchema(schema.ResponseSchema): + """OptBusinessVerAuto - 对自动设置企业版的开关设置""" + + fields = { + "OpenStatus": fields.Bool(required=True, load_from="OpenStatus"), + } + + +""" +API: OptPayAutoRenew + +自动续费功能的开关 +""" + + +class OptPayAutoRenewRequestSchema(schema.RequestSchema): + """OptPayAutoRenew - 自动续费功能的开关""" + + fields = { + "Open": fields.Bool(required=True, dump_to="Open"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class OptPayAutoRenewResponseSchema(schema.ResponseSchema): + """OptPayAutoRenew - 自动续费功能的开关""" + + fields = { + "OpenStatus": fields.Bool(required=True, load_from="OpenStatus"), + } + + +""" +API: QueryBillPointDeductionFlowByCycle + +按照周期(目前只支持按天)统计用户计费点数变化(增加/减少/预留)情况 +""" + + +class QueryBillPointDeductionFlowByCycleRequestSchema(schema.RequestSchema): + """QueryBillPointDeductionFlowByCycle - 按照周期(目前只支持按天)统计用户计费点数变化(增加/减少/预留)情况""" + + fields = { + "EndTime": fields.Str(required=False, dump_to="EndTime"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "StartTime": fields.Str(required=False, dump_to="StartTime"), + "Type": fields.Str(required=True, dump_to="Type"), + } + + +class QueryBillPointDeductionFlowByCycleResponseSchema(schema.ResponseSchema): + """QueryBillPointDeductionFlowByCycle - 按照周期(目前只支持按天)统计用户计费点数变化(增加/减少/预留)情况""" + + fields = { + "Result": fields.List( + models.CycleBillPointStatSchema(), + required=False, + load_from="Result", + ), + } + + +""" +API: QueryNewestUpdateTime + +查询下载数据最新更新时间 +""" + + +class QueryNewestUpdateTimeRequestSchema(schema.RequestSchema): + """QueryNewestUpdateTime - 查询下载数据最新更新时间""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class QueryNewestUpdateTimeResponseSchema(schema.ResponseSchema): + """QueryNewestUpdateTime - 查询下载数据最新更新时间""" + + fields = { + "Result": models.DataSignatureNewestUpdateTimeSchema(), + } + + +""" +API: QueryPayInfo + +查询用户的付费信息,保护目前未消费点数,点数过期时间,自动续费开关等 +""" + + +class QueryPayInfoRequestSchema(schema.RequestSchema): + """QueryPayInfo - 查询用户的付费信息,保护目前未消费点数,点数过期时间,自动续费开关等""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class QueryPayInfoResponseSchema(schema.ResponseSchema): + """QueryPayInfo - 查询用户的付费信息,保护目前未消费点数,点数过期时间,自动续费开关等""" + + fields = { + "AutoBusinessVer": fields.Bool( + required=True, load_from="AutoBusinessVer" + ), + "AutoRenew": fields.Bool(required=True, load_from="AutoRenew"), + "BillPoint": fields.Int(required=True, load_from="BillPoint"), + "CompanyId": fields.Int(required=False, load_from="CompanyId"), + "ExpiratTime": fields.Str(required=True, load_from="ExpiratTime"), + "OrganizationId": fields.Int( + required=False, load_from="OrganizationId" + ), + "RemainTime": fields.Str(required=True, load_from="RemainTime"), + "RenewPointNum": fields.Int(required=False, load_from="RenewPointNum"), + "ResourceLongId": fields.Str( + required=False, load_from="ResourceLongId" + ), + "UpdateTime": fields.Str(required=False, load_from="UpdateTime"), + } + + +""" +API: QueryUHostSecWarningBaseChecks + +查询正在告警的安全基线类型列表 +""" + + +class QueryUHostSecWarningBaseChecksRequestSchema(schema.RequestSchema): + """QueryUHostSecWarningBaseChecks - 查询正在告警的安全基线类型列表""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Type": fields.Str(required=True, dump_to="Type"), + } + + +class QueryUHostSecWarningBaseChecksResponseSchema(schema.ResponseSchema): + """QueryUHostSecWarningBaseChecks - 查询正在告警的安全基线类型列表""" + + fields = { + "Result": fields.List( + models.BaseCheckWarningSchema(), required=False, load_from="Result" + ), + } + + +""" +API: QueryWeekReportList + +查询主机安全周报 +""" + + +class QueryWeekReportListRequestSchema(schema.RequestSchema): + """QueryWeekReportList - 查询主机安全周报""" + + fields = { + "PageIndex": fields.Int(required=False, dump_to="PageIndex"), + "PageSize": fields.Int(required=False, dump_to="PageSize"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class QueryWeekReportListResponseSchema(schema.ResponseSchema): + """QueryWeekReportList - 查询主机安全周报""" + + fields = { + "Result": fields.List( + models.WeekReportSchema(), required=True, load_from="Result" + ), + "Total": fields.Int(required=False, load_from="Total"), + } + + +""" +API: SwitchAgentFunctionVersion + +对agent在各个功能版本之间切换 +""" + + +class SwitchAgentFunctionVersionRequestSchema(schema.RequestSchema): + """SwitchAgentFunctionVersion - 对agent在各个功能版本之间切换""" + + fields = { + "AgentList": fields.Str(required=True, dump_to="AgentList"), + "ChargeType": fields.Int(required=True, dump_to="ChargeType"), + "Coupon": fields.Str(required=False, dump_to="Coupon"), + "FuncVersion": fields.Int(required=True, dump_to="FuncVersion"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + } + + +class SwitchAgentFunctionVersionResponseSchema(schema.ResponseSchema): + """SwitchAgentFunctionVersion - 对agent在各个功能版本之间切换""" + + fields = { + "Records": models.SwitchAgentRecordSchema(), + } + + +""" +API: VulStatisticTopN + +某种类型漏洞存在主机的主机数TOP N +""" + + +class VulStatisticTopNRequestSchema(schema.RequestSchema): + """VulStatisticTopN - 某种类型漏洞存在主机的主机数TOP N""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "TopN": fields.Int(required=False, dump_to="TopN"), + } + + +class VulStatisticTopNResponseSchema(schema.ResponseSchema): + """VulStatisticTopN - 某种类型漏洞存在主机的主机数TOP N""" + + fields = { + "Result": fields.List( + models.VulStatisticTopNInfoSchema(), + required=True, + load_from="Result", + ), + } diff --git a/ucloud/services/uhids/schemas/models.py b/ucloud/services/uhids/schemas/models.py new file mode 100644 index 00000000..b481f509 --- /dev/null +++ b/ucloud/services/uhids/schemas/models.py @@ -0,0 +1,190 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class OSVersionSchema(schema.ResponseSchema): + """OSVersion - 系统版本信息""" + + fields = { + "Count": fields.Int(required=False, load_from="Count"), + "Name": fields.Str(required=False, load_from="Name"), + } + + +class OSInfoSchema(schema.ResponseSchema): + """OSInfo - 主机操作系统信息""" + + fields = { + "Count": fields.Int(required=False, load_from="Count"), + "OSType": fields.Str(required=False, load_from="OSType"), + "Version": fields.List(OSVersionSchema()), + } + + +class OSListSchema(schema.ResponseSchema): + """OSList - 主机操作系统列表""" + + fields = { + "OS": fields.List(OSInfoSchema()), + "Total": fields.Int(required=False, load_from="Total"), + } + + +class AgentWarnningStatisticInfoSchema(schema.ResponseSchema): + """AgentWarnningStatisticInfo - 服务器状态统计Result数据信息""" + + fields = { + "AgentTotal": fields.Int(required=True, load_from="AgentTotal"), + "Offline": fields.Int(required=True, load_from="Offline"), + "Online": fields.Int(required=True, load_from="Online"), + "SafeCount": fields.Int(required=True, load_from="SafeCount"), + "WarnningCount": fields.Int(required=True, load_from="WarnningCount"), + } + + +class NICSchema(schema.ResponseSchema): + """NIC - 网卡信息""" + + fields = { + "IP": fields.Str(required=False, load_from="IP"), + "Mac": fields.Str(required=False, load_from="Mac"), + } + + +class HostAgentStatusInfoSchema(schema.ResponseSchema): + """HostAgentStatusInfo - 主机的Agent状态信息""" + + fields = { + "AgentId": fields.Str(required=True, load_from="AgentId"), + "HostName": fields.Str(required=True, load_from="HostName"), + "Installed": fields.Bool(required=True, load_from="Installed"), + "Ip": fields.List(fields.Str()), + "NICs": fields.List(NICSchema()), + "NowVer": fields.Int(required=True, load_from="NowVer"), + "OsName": fields.Str(required=False, load_from="OsName"), + "SetVer": fields.Int(required=True, load_from="SetVer"), + "UHostId": fields.Str(required=True, load_from="UHostId"), + "Zone": fields.Str(required=True, load_from="Zone"), + } + + +class StatisticsSchema(schema.ResponseSchema): + """Statistics - 主机安全告警按时间段统计""" + + fields = { + "AbnormalLogin": fields.Int(required=True, load_from="AbnormalLogin"), + "BaseCheck": fields.Int(required=True, load_from="BaseCheck"), + "Date": fields.Str(required=True, load_from="Date"), + "SshBruteFailed": fields.Int(required=True, load_from="SshBruteFailed"), + "SshBruteSucceeded": fields.Int( + required=True, load_from="SshBruteSucceeded" + ), + "Trojan": fields.Int(required=True, load_from="Trojan"), + "VulCheck": fields.Int(required=True, load_from="VulCheck"), + } + + +class WarnStatisticsSchema(schema.ResponseSchema): + """WarnStatistics - 主机告警统计""" + + fields = { + "AbnormalLogin": fields.Int(required=True, load_from="AbnormalLogin"), + "BaseCheck": fields.Int(required=True, load_from="BaseCheck"), + "SshBruteFailed": fields.Int( + required=False, load_from="SshBruteFailed" + ), + "SshBruteSucceeded": fields.Int( + required=True, load_from="SshBruteSucceeded" + ), + "Trojan": fields.Int(required=True, load_from="Trojan"), + "VulCheck": fields.Int(required=True, load_from="VulCheck"), + } + + +class IPSchema(schema.ResponseSchema): + """IP - 白名单IP""" + + fields = { + "Account": fields.Str(required=True, load_from="Account"), + "CreateTime": fields.Str(required=True, load_from="CreateTime"), + "ID": fields.Str(required=True, load_from="ID"), + "IP": fields.Str(required=True, load_from="IP"), + } + + +class CommonLoginLocationInfoSchema(schema.ResponseSchema): + """CommonLoginLocationInfo - 公共登录地信息""" + + fields = { + "Account": fields.Str(required=False, load_from="Account"), + "City": fields.Str(required=False, load_from="City"), + "Country": fields.Str(required=False, load_from="Country"), + "CreateTime": fields.Str(required=False, load_from="CreateTime"), + "Province": fields.Str(required=False, load_from="Province"), + } + + +class CycleBillPointStatSchema(schema.ResponseSchema): + """CycleBillPointStat - 周期统计的计费点数情况""" + + fields = { + "AddPointNum": fields.Int(required=True, load_from="AddPointNum"), + "RemainPointNum": fields.Int(required=True, load_from="RemainPointNum"), + "SubPointNum": fields.Int(required=True, load_from="SubPointNum"), + "Time": fields.Str(required=True, load_from="Time"), + } + + +class DataSignatureNewestUpdateTimeSchema(schema.ResponseSchema): + """DataSignatureNewestUpdateTime - 数据下载最新更新时间""" + + fields = { + "Login": fields.Str(required=False, load_from="Login"), + "Torojan": fields.Str(required=False, load_from="Torojan"), + "Vul": fields.Str(required=False, load_from="Vul"), + "WebBase": fields.Str(required=False, load_from="WebBase"), + "Webshell": fields.Str(required=False, load_from="Webshell"), + } + + +class BaseCheckWarningSchema(schema.ResponseSchema): + """BaseCheckWarning - 基线告警信息""" + + fields = { + "AgentCount": fields.Int(required=False, load_from="AgentCount"), + "AppName": fields.Str(required=False, load_from="AppName"), + "Description": fields.Str(required=False, load_from="Description"), + "DescriptionEn": fields.Str(required=False, load_from="DescriptionEn"), + "RiskLevel": fields.Str(required=False, load_from="RiskLevel"), + "RiskType": fields.Str(required=False, load_from="RiskType"), + "RuleID": fields.Str(required=False, load_from="RuleID"), + } + + +class WeekReportSchema(schema.ResponseSchema): + """WeekReport -""" + + fields = { + "FileName": fields.Str(required=True, load_from="FileName"), + } + + +class SwitchAgentRecordSchema(schema.ResponseSchema): + """SwitchAgentRecord - 切换Agent 版本记录""" + + fields = { + "AgentID": fields.Str(required=False, load_from="AgentID"), + "Message": fields.Str(required=False, load_from="Message"), + "RetCode": fields.Int(required=False, load_from="RetCode"), + } + + +class VulStatisticTopNInfoSchema(schema.ResponseSchema): + """VulStatisticTopNInfo - 高危漏洞TOP N列表漏洞信息""" + + fields = { + "AgentCount": fields.Int(required=True, load_from="AgentCount"), + "Name": fields.Str(required=True, load_from="Name"), + "VulID": fields.Str(required=True, load_from="VulID"), + } diff --git a/ucloud/services/uhost/client.py b/ucloud/services/uhost/client.py index 500527c5..096f0da6 100644 --- a/ucloud/services/uhost/client.py +++ b/ucloud/services/uhost/client.py @@ -13,29 +13,76 @@ def __init__( ): super(UHostClient, self).__init__(config, transport, middleware, logger) + def add_uhost_to_isolation_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AddUHostToIsolationGroup - + + **Request** + + - **ProjectId** (str) - (Config) + - **Region** (str) - (Config) + - **GroupId** (str) - (Required) + - **UHostId** (str) - (Required) + - **Zone** (str) - (Required) + + **Response** + + - **UHostId** (str) - + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.AddUHostToIsolationGroupRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AddUHostToIsolationGroup", d, **kwargs) + return apis.AddUHostToIsolationGroupResponseSchema().loads(resp) + def copy_custom_image( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CopyCustomImage - 复制自制镜像 + """CopyCustomImage - 复制自制镜像 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **SourceImageId** (str) - (Required) 源镜像Id, 参见 DescribeImage - **TargetProjectId** (str) - (Required) 目标项目Id, 参见 GetProjectList - **TargetImageDescription** (str) - 目标镜像描述 - **TargetImageName** (str) - 目标镜像名称 - - **TargetRegion** (str) - 目标地域,不跨地域不用填 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **TargetImageTag** (str) - 目标镜像业务组 + - **TargetRegion** (str) - 目标地域,不跨地域可不填 + - **TargetRegionList** (list) - 目标地域的集合,批量复制时填写 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** + - **Infos** (list) - 见 **CopyImageTaskInfo** 模型定义 + - **TargetImageId** (str) - 目标镜像Id,只有非批量复制的时候该字段才存在 + - **TaskId** (str) - 目标镜像复制的任务Id,只有非批量复制的时候该字段才存在 + + **Response Model** + + **CopyImageTaskInfo** - **TargetImageId** (str) - 目标镜像Id - + - **TargetRegion** (str) - 目标地域 + - **TaskId** (str) - 目标镜像复制的任务Id + + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.CopyCustomImageRequestSchema().dumps(d) @@ -48,24 +95,30 @@ def copy_custom_image( def create_custom_image( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateCustomImage - 从指定UHost实例,生成自定义镜像。 + """CreateCustomImage - 从指定UHost实例,生成自定义镜像。 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **ImageName** (str) - (Required) 镜像名称 - - **UHostId** (str) - (Required) UHost实例ID 参见 `DescribeUHostInstance `_ + - **UHostId** (str) - (Required) UHost实例ID 参见 `DescribeUHostInstance `_ + - **DataUDiskIds** (list) - 【数组】关联的云盘数据盘id列表。注意: 云盘数据盘需要开启快照服务 - **ImageDescription** (str) - 镜像描述 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Tag** (str) - 镜像业务组。默认:Default + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** + - **DataSnapshotIds** (list) - 云盘数据盘快照id列表 - **ImageId** (str) - 镜像Id - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.CreateCustomImageRequestSchema().dumps(d) @@ -75,103 +128,159 @@ def create_custom_image( resp = self.invoke("CreateCustomImage", d, **kwargs) return apis.CreateCustomImageResponseSchema().loads(resp) + def create_isolation_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateIsolationGroup - 创建硬件隔离组,组内机器严格隔离在不同宿主机上。 + + **Request** + + - **ProjectId** (str) - (Config) 项目id + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **GroupName** (str) - (Required) 硬件隔离组名称。请遵照 `字段规范 `_ 设定隔离组名称。 + - **Remark** (str) - 备注。请遵照 `字段规范 `_ 设定隔离组备注。 + + **Response** + + - **GroupId** (str) - 硬件隔离组id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateIsolationGroupRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateIsolationGroup", d, **kwargs) + return apis.CreateIsolationGroupResponseSchema().loads(resp) + def create_uhost_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateUHostInstance - 创建UHost实例。 + """CreateUHostInstance - 创建UHost实例。 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **ImageId** (str) - (Required) 镜像ID。 请通过 `DescribeImage `_ 获取 - - **LoginMode** (str) - (Required) 主机登陆模式。密码(默认选项): Password。 - - **Password** (str) - (Required) UHost密码。请遵照 `字段规范 `_ 设定密码。密码需使用base64进行编码,举例如下:# echo -n Password1 | base64UGFzc3dvcmQx。 - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - - **AlarmTemplateId** (int) - 告警模板id,如果传了告警模板id,且告警模板id正确,则绑定告警模板。绑定告警模板失败只会在后台有日志,不会影响创建主机流程,也不会在前端报错。 - - **BootDiskSpace** (int) - 【待废弃,不建议调用】系统盘大小。 单位:GB, 范围[20,100], 步长:10 + - **LoginMode** (str) - (Required) 主机登陆模式。密码(默认选项): Password,密钥:KeyPair,Password,自制镜像密码:ImagePasswd。 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **AlarmTemplateId** (int) - 告警模板id,如果传了告警模板id,且告警模板id正确,则绑定告警模板。绑定告警模板失败不会影响创建主机流程。 + - **AutoDataDiskInit** (str) - 数据盘是否需要自动分区挂载。当镜像支持“Cloud-init”Feature时可填写此字段。取值 >“On” 自动挂载(默认值)> “Off” 不自动挂载。 - **CPU** (int) - 虚拟CPU核数。可选参数:1-64(具体机型与CPU的对应关系参照控制台)。默认值: 4。 - - **ChargeType** (str) - 计费模式。枚举值为: \\ > Year,按年付费; \\ > Month,按月付费;\\ > Dynamic,按小时预付费 \\ > Postpay,按小时后付费(支持关机不收费,目前仅部分可用区支持,请联系您的客户经理) \\ 默认为月付 + - **ChargeType** (str) - 计费模式。枚举值为: \\ > Year,按年付费; \\ > Month,按月付费;\\ > Dynamic,按小时预付费 \\ > Postpay,按小时后付费(支持关机不收费,目前仅部分可用区支持,请联系您的客户经理) \\ > Spot计费为抢占式实例(内测阶段) \\ 默认为月付 - **CouponId** (str) - 主机代金券ID。请通过DescribeCoupon接口查询,或登录用户中心查看 - - **DiskPassword** (str) - 【待废弃,不建议调用】加密盘的密码。若输入此字段,自动选择加密盘。加密盘需要权限位。 - - **DiskSpace** (int) - 【待废弃,不建议调用】数据盘大小。 单位:GB, 范围[0,8000], 步长:10, 默认值:20,云盘支持0-8000;本地普通盘支持0-2000;本地SSD盘(包括所有GPU机型)支持100-1000 - **Disks** (list) - 见 **CreateUHostInstanceParamDisks** 模型定义 + - **Features** (dict) - 见 **CreateUHostInstanceParamFeatures** 模型定义 - **GPU** (int) - GPU卡核心数。仅GPU机型支持此字段(可选范围与MachineType+GpuType相关) - - **GpuType** (str) - GPU类型,枚举值["K80", "P40", "V100"],MachineType为G时必填 - - **HostIp** (str) - 指定宿主机创建,此时SetId为必填 - - **HostType** (str) - 【已废弃】宿主机类型,N2,N1 + - **GpuType** (str) - GPU类型,枚举值["K80", "P40", "V100", "T4","T4A", "T4S","2080Ti","2080Ti-4C","1080Ti", "T4/4", "V100S",2080","2080TiS","2080TiPro","3090","4090","4090Pro","4090_48G","A100","A800","H20"]。MachineType为G时必填 + - **HostBinding** (bool) - 【私有专区属性】专区云主机开启宿住关联属性 - **HotplugFeature** (bool) - 热升级特性。True为开启,False为未开启,默认False。 - - **InstallAgent** (str) - 【暂不支持】是否安装UGA。'yes': 安装;其他或者不填:不安装。 - **IsolationGroup** (str) - 硬件隔离组id。可通过DescribeIsolationGroup获取。 - - **KeyPair** (str) - 【暂不支持】Keypair公钥,LoginMode为KeyPair时此项必须 - - **MachineType** (str) - 云主机机型(V2.0),在本字段和字段UHostType中,仅需要其中1个字段即可;当填写了MachineType时,必须填写MinimalCpuPlatform字段。枚举值["N", "C", "G", "O"]。参考 `云主机机型说明 `_ 。 - - **MaxCount** (int) - 本次最大创建主机数量,取值范围是[1,100],默认值为1。 + - **KeyPairId** (str) - KeypairId 密钥对ID,LoginMode为KeyPair时此项必须。 + - **Labels** (list) - 见 **CreateUHostInstanceParamLabels** 模型定义 + - **MachineType** (str) - 云主机机型(V2.0),在本字段和字段UHostType中,仅需要其中1个字段即可。枚举值["N", "C", "G", "O", "OM", "OMEM", "OPRO", "OPROG"]。参考 `云主机机型说明 `_ 。 + - **MaxCount** (int) - 本次最大创建主机数量,取值范围是[1,100],默认值为1。- 库存数量不足时,按库存数量创建。- 配额不足时,返回错误。- 使用隔离组时,以隔离组可用数量为准。 - **Memory** (int) - 内存大小。单位:MB。范围 :[1024, 262144],取值为1024的倍数(可选范围参考控制台)。默认值:8192 - - **MinimalCpuPlatform** (str) - 最低cpu平台,枚举值["Intel/Auto", "Intel/IvyBridge", "Intel/Haswell", "Intel/Broadwell", "Intel/Skylake", "Intel/Cascadelake"。 + - **MinCount** (int) - 本次最小创建主机数量,取值范围是[1,100],默认值为1。- 配额不足时,返回错误。 + - **MinimalCpuPlatform** (str) - 最低cpu平台,枚举值["Intel/Auto", "Intel/IvyBridge", "Intel/Haswell", "Intel/Broadwell", "Intel/Skylake", "Intel/Cascadelake", "Intel/CascadelakeR", "Intel/IceLake", "Intel/SapphireRapids", "Amd/Epyc2", "Amd/Auto","Ampere/Auto","Ampere/Altra"],默认值是"Intel/Auto"。 - **Name** (str) - UHost实例名称。默认:UHost。请遵照 `字段规范 `_ 设定实例名称。 - - **NetCapability** (str) - 网络增强特性。枚举值:Normal(默认),不开启; Super,开启网络增强1.0; Ultra,开启网络增强2.0(仅支持部分可用区,请参考控制台) - - **NetworkId** (str) - 【已废弃】网络ID(VPC2.0情况下无需填写)。VPC1.0情况下,若不填写,代表优先选择基础网络; 若填写,代表选择子网。参见DescribeSubnet。 + - **NetCapability** (str) - 网络增强特性。枚举值:Normal,不开启; Super,开启网络增强1.0; Ultra,开启网络增强2.0;Extreme,开启网络增强3.0(详情参考官网文档) - **NetworkInterface** (list) - 见 **CreateUHostInstanceParamNetworkInterface** 模型定义 + - **Password** (str) - UHost密码。请遵照 `字段规范 `_ 设定密码。密码需使用base64进行编码,举例如下:# echo -n Password1 | base64 UGFzc3dvcmQx。 - **PrivateIp** (list) - 【数组】创建云主机时指定内网IP。若不传值,则随机分配当前子网下的IP。调用方式举例:PrivateIp.0=x.x.x.x。当前只支持一个内网IP。 - - **PrivateMac** (str) - 【批量创建该参数无效】【内部字段】创建云主机时指定Mac。调用方式举例:PrivateMac="xx:xx:xx:xx:xx:xx"。 - **Quantity** (int) - 购买时长。默认:值 1。按小时购买(Dynamic/Postpay)时无需此参数。 月付时,此参数传0,代表购买至月末。 - - **ResourceType** (int) - 【内部参数】资源类型 - - **SecurityGroupId** (str) - 防火墙ID,默认:Web推荐防火墙。如何查询SecurityGroupId请参见 `DescribeFirewall `_ 。 - - **SetId** (int) - 指定set创建 - - **StorageType** (str) - 【待废弃,不建议调用】磁盘类型,同时设定系统盘和数据盘的磁盘类型。枚举值为:LocalDisk,本地磁盘; UDisk,云硬盘;默认为LocalDisk。仅部分可用区支持云硬盘方式的主机存储方式,具体请查询控制台。 + - **SecGroupId** (list) - 见 **CreateUHostInstanceParamSecGroupId** 模型定义 + - **SecurityGroupId** (str) - 防火墙ID,默认:Web推荐防火墙。如何查询SecurityGroupId请参见 `DescribeFirewall `_ 。 + - **SecurityMode** (str) - 主机安全模式。Firewall:防火墙;SecGroup:安全组;默认值:Firewall。 - **SubnetId** (str) - 子网 ID。默认为当前地域的默认子网。 - **Tag** (str) - 业务组。默认:Default(Default即为未分组)。请遵照 `字段规范 `_ 设定业务组。 - - **TimemachineFeature** (str) - 【待废弃,不建议调用】是否开启方舟特性。Yes为开启方舟,No为关闭方舟。目前仅选择普通本地盘+普通本地盘 或 SSD云盘+普通云盘的组合支持开启方舟。 + - **UDHostId** (str) - 【私有专区属性】专区宿主机id + - **UDSetId** (str) - 【私有专区属性】专区id + - **UHostFamily** (str) - 规格族。 由机型代号和 CPU 平台组成,用于指定云主机的硬件类型与处理器平台。 当 MachineType 为 "O"(快杰型)时,支持以下取值:- o1i:快杰型 O1 代,Intel 平台 - o1a:快杰型 O1 代,AMD 平台- o1r:快杰型 O1 代,ARM 平台 - o2i:快杰型 O2 代,Intel 平台 默认值:o1i 或 o1a(系统将根据资源情况自动选择) 当 MachineType 为 "OM"(快杰共享型)时,支持以下取值: - om1i:快杰内存增强型 OM1 代,Intel 平台 - om2i:快杰内存增强型 OM2 代,Intel 平台注意:规格族必须与 MachineType 匹配,否则请求将被拒绝。 - **UHostType** (str) - 【建议后续不再使用】云主机机型(V1.0),在本字段和字段MachineType中,仅需要其中1个字段即可。参考 `云主机机型说明 `_ 。 - - **UserData** (str) - 【即将支持】用户自定义数据。当镜像支持Cloud-init Feature时可填写此字段。注意:1、总数据量大小不超多16K;2、使用base64编码 - - **UserDataScript** (str) - 【暂不支持】cloudinit方式下,用户初始化脚本 + - **UserData** (str) - 用户自定义数据。当镜像支持Cloud-init Feature时可填写此字段。注意:1、总数据量大小不超过 16K;2、使用base64编码 - **VPCId** (str) - VPC ID。默认为当前地域的默认VPC。 - + **Response** - **IPs** (list) - 【批量创建不会返回】IP信息 - **UHostIds** (list) - UHost实例Id集合 - + **Request Model** - - **CreateUHostInstanceParamNetworkInterfaceEIPGlobalSSH** - - - **Area** (str) - 填写支持SSH访问IP的地区名称,如“洛杉矶”,“新加坡”,“香港”,“东京”,“华盛顿”,“法兰克福”。Area和AreaCode两者必填其中之一。 - - **AreaCode** (str) - GlobalSSH的地区编码,格式为区域航空港国际通用代码。Area和AreaCode两者必填其中之一。 - - **Port** (int) - SSH端口,1-65535且不能使用80,443端口 - - **CreateUHostInstanceParamNetworkInterfaceEIP** - - - **Bandwidth** (int) - 【若绑定EIP,此参数必填】弹性IP的外网带宽, 单位为Mbps. 共享带宽模式必须指定0M带宽, 非共享带宽模式必须指定非0Mbps带宽. 各地域非共享带宽的带宽范围如下: 流量计费[1-300],带宽计费[1-800] - - **CouponId** (str) - 当前EIP代金券id。请通过DescribeCoupon接口查询,或登录用户中心查看。 - - **GlobalSSH** (dict) - 见 **CreateUHostInstanceParamNetworkInterfaceEIPGlobalSSH** 模型定义 - - **OperatorName** (str) - 【若绑定EIP,此参数必填】弹性IP的线路。枚举值: 国际: International BGP: Bgp 各地域允许的线路参数如下: cn-sh1: Bgp cn-sh2: Bgp cn-gd: Bgp cn-bj1: Bgp cn-bj2: Bgp hk: International us-ca: International th-bkk: International kr-seoul:International us-ws:International ge-fra:International sg:International tw-kh:International.其他海外线路均为 International - - **PayMode** (str) - 弹性IP的计费模式. 枚举值: "Traffic", 流量计费; "Bandwidth", 带宽计费; "ShareBandwidth",共享带宽模式. "Free":免费带宽模式.默认为 "Bandwidth". - - **ShareBandwidthId** (str) - 绑定的共享带宽Id,仅当PayMode为ShareBandwidth时有效 - **CreateUHostInstanceParamNetworkInterfaceIPv6** - - - **Adress** (str) - 第N个网卡对应的IPv6地址,默认不分配IPv6,“Auto”自动分配,不为空的其他字符串为实际要分配的IPv6地址 - - **ShareBandwidthId** (str) - 第N块网卡中IPv6对应的共享带宽id,默认不带外网 + **CreateUHostInstanceParamSecGroupId** + - **Id** (str) - 安全组 ID。至多可以同时绑定5个安全组。 + - **Priority** (int) - 安全组优先级。取值范围[1, 5] + - **CreateUHostInstanceParamDisks** - - - **BackupType** (str) - 磁盘备份方案。枚举值:\\ > NONE,无备份 \\ > DATAARK,数据方舟 \\ 当前磁盘支持的备份模式参考 `磁盘类型 `_ + **CreateUHostInstanceParamDisksCustomBackup** + - **Day** (str) - Disks.N.BackupMode为"Custom"时,进行设置, 以5天级为基础进行倍数扩增,如5、10、15、20、25、30。 + - **Hour** (str) - Disks.N.BackupMode为"Custom"时,进行设置, 以24小时级为基础进行倍数扩增,如24、48、72、96。 + - **Journal** (str) - Disks.N.BackupMode为"Custom"时,进行设置, 以12小时秒级为基础进行倍数扩增,如12、24、36、48。 + + + **CreateUHostInstanceParamDisks** + - **BackupMode** (str) - 指定快照备份策略。当Disks.N.BackupType为"SNAPSHOT"时此参数生效。枚举值:"Base":标准版,"Ultimate":旗舰版,"Custom":自定义备份链;默认值:"Base"。 + - **BackupType** (str) - 磁盘备份方案。枚举值:\\ > NONE,无备份 \\ > SNAPSHOT,快照 \\当前磁盘支持的备份模式参考 `磁盘类型 `_ ,默认值:NONE - **CouponId** (str) - 云盘代金券id。不适用于系统盘/本地盘。请通过DescribeCoupon接口查询,或登录用户中心查看 - - **Encrypted** (bool) - 【功能仅部分可用区开放,详询技术支持】磁盘是否加密。加密:true, 不加密: false加密必须传入对应的的KmsKeyId + - **CustomBackup** (dict) - 见 **CreateUHostInstanceParamDisksCustomBackup** 模型定义 + - **Encrypted** (bool) - 【功能仅部分可用区开放,详询技术支持】磁盘是否加密。加密:true, 不加密: false加密必须传入对应的的KmsKeyId,默认值false - **IsBoot** (str) - 是否是系统盘。枚举值:\\ > True,是系统盘 \\ > False,是数据盘(默认)。Disks数组中有且只能有一块盘是系统盘。 - **KmsKeyId** (str) - 【功能仅部分可用区开放,详询技术支持】kms key id。选择加密盘时必填。 - - **Size** (int) - 磁盘大小,单位GB,必须是10GB的整数倍。请参考 `磁盘类型 `_ 。 + - **Size** (int) - 磁盘大小,单位GB。请参考 `磁盘类型 `_ 。 + - **SnapshotId** (str) - 从快照创建盘时所用快照id,目前仅支持数据盘 - **Type** (str) - 磁盘类型。请参考 `磁盘类型 `_ 。 - **CreateUHostInstanceParamNetworkInterface** - + + **CreateUHostInstanceParamNetworkInterfaceIPv6** + - **Address** (str) - 第N个网卡对应的IPv6地址,默认不分配IPv6,“Auto”自动分配,不为空的其他字符串为实际要分配的IPv6地址。当前仅支持分配一个IPv6地址 + + + **CreateUHostInstanceParamNetworkInterfaceEIPGlobalSSH** + - **Area** (str) - + - **AreaCode** (str) - + - **Port** (int) - + + + **CreateUHostInstanceParamNetworkInterfaceEIP** + - **Bandwidth** (int) - 【若绑定EIP,此参数必填】弹性IP的外网带宽, 单位为Mbps. 共享带宽模式下非必传, 非共享带宽模式必须指定非0Mbps带宽. 各地域非共享带宽的带宽范围如下: 流量计费[1-300],带宽计费[1-800] + - **CouponId** (str) - 当前EIP代金券id。请通过DescribeCoupon接口查询,或登录用户中心查看。 + - **OperatorName** (str) - 【若绑定EIP,此参数必填】弹性IP的线路。枚举值: 国际: International BGP: Bgp 各地域允许的线路参数如下: cn-sh1: Bgp cn-sh2: Bgp cn-gd: Bgp cn-bj1: Bgp cn-bj2: Bgp hk: International us-ca: International th-bkk: International kr-seoul:International us-ws:International ge-fra:International sg:International tw-kh:International.其他海外线路均为 International + - **PayMode** (str) - 弹性IP的计费模式. 枚举值: "Traffic", 流量计费; "Bandwidth", 带宽计费; "ShareBandwidth",共享带宽模式. "Free":免费带宽模式,默认为 "Bandwidth" + - **ShareBandwidthId** (str) - 绑定的共享带宽Id,仅当PayMode为ShareBandwidth时有效 + + + **CreateUHostInstanceParamNetworkInterface** + - **CreateCernetIp** (bool) - 申请并绑定一个教育网EIP。True为申请并绑定,False为不会申请绑定,默认False。当前只支持具有HPC特性的机型。 - **EIP** (dict) - 见 **CreateUHostInstanceParamNetworkInterfaceEIP** 模型定义 - **IPv6** (dict) - 见 **CreateUHostInstanceParamNetworkInterfaceIPv6** 模型定义 + + **CreateUHostInstanceParamLabels** + - **Key** (str) - 用户资源标签的键值 + - **Value** (str) - 用户资源标签的值 + + + **CreateUHostInstanceParamVolumes** + + + **CreateUHostInstanceParamFeatures** + - **UNI** (bool) - 弹性网卡特性。开启了弹性网卡权限位,此特性才生效,默认 false 未开启,true 开启。 + + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.CreateUHostInstanceRequestSchema().dumps(d) @@ -181,35 +290,258 @@ def create_uhost_instance( resp = self.invoke("CreateUHostInstance", d, **kwargs) return apis.CreateUHostInstanceResponseSchema().loads(resp) + def create_uhost_key_pair( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUHostKeyPair - 创建主机密钥对信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **KeyPairName** (str) - (Required) 密钥对名称。 由字母,数字,符号组成,长度为1-63位。 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **KeyPair** (dict) - 见 **KeyPair** 模型定义 + + **Response Model** + + **KeyPair** + - **CreateTime** (int) - 密钥对的创建时间,格式为Unix Timestamp。 + - **KeyPairFingerPrint** (str) - 密钥对指纹。md5(ProjectId|KeyPairId|PublicKey) + - **KeyPairId** (str) - 密钥对ID。 + - **KeyPairName** (str) - 密钥对名称。 长度为1~63个英文或中文字符。 + - **PrivateKeyBody** (str) - 密钥对的私钥内容。只有创建接口才会返回。 + - **ProjectId** (str) - 项目ID。 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateUHostKeyPairRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUHostKeyPair", d, **kwargs) + return apis.CreateUHostKeyPairResponseSchema().loads(resp) + + def delete_isolation_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteIsolationGroup - 删除硬件隔离组。 + + **Request** + + - **ProjectId** (str) - (Config) 项目id + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **GroupId** (str) - (Required) 硬件隔离组id + + **Response** + + - **GroupId** (str) - 硬件隔离组id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteIsolationGroupRequestSchema().dumps(d) + + resp = self.invoke("DeleteIsolationGroup", d, **kwargs) + return apis.DeleteIsolationGroupResponseSchema().loads(resp) + + def delete_uhost_key_pairs( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUHostKeyPairs - 删除一对或者多对密钥对。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **KeyPairIds** (list) - (Required) 密钥对ID,最多支持 100 对。 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteUHostKeyPairsRequestSchema().dumps(d) + + resp = self.invoke("DeleteUHostKeyPairs", d, **kwargs) + return apis.DeleteUHostKeyPairsResponseSchema().loads(resp) + + def describe_available_instance_types( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeAvailableInstanceTypes - DescribeAvailableInstanceTypes + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **MachineTypes** (list) - 指定机型列表 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **AvailableInstanceTypes** (list) - 见 **AvailableInstanceTypes** 模型定义 + - **Status** (str) - 当前区域是否可售 + + **Response Model** + + **Collection** + - **Cpu** (int) - CPU规格 + - **Memory** (list) - 内存规格 + - **MinimalCpuPlatform** (list) - CPU和内存规格只能在列出来的CPU平台支持 + + + **MachineSizes** + - **Collection** (list) - 见 **Collection** 模型定义 + - **Gpu** (int) - Gpu为GPU可支持的规格即GPU颗数,非GPU机型,Gpu为0 + + + **CpuPlatformWithModels** + - **CpuFrequency** (str) - CPU频率 + - **CpuModels** (list) - CPU Model列表 + - **Name** (str) - CPU平台 + + + **UHostFamily** + - **CpuFrequency** (str) - CPU频率信息 + - **CpuPlatforms** (list) - 见 **CpuPlatformWithModels** 模型定义 + - **Name** (str) - 规格族 + + + **CpuPlatforms** + - **Amd** (list) - 返回AMD的CPU平台信息,例如:AMD: ['Amd/Epyc2'] + - **Ampere** (list) - 返回Arm的CPU平台信息,例如:Ampere: ['Ampere/Altra'] + - **Intel** (list) - 返回Intel的CPU平台信息,例如:Intel: ['Intel/CascadeLake','Intel/CascadelakeR','Intel/IceLake'] + + + **FeatureModes** + - **MinimalCpuPlatform** (list) - 这个特性必须是列出来的CPU平台及以上的CPU才支持 + - **Name** (str) - 模式|特性名称 + - **RelatedToImageFeature** (list) - 为镜像上支持这个特性的标签。例如DescribeImage返回的字段Features包含HotPlug,说明该镜像支持热升级。 + + + **BootDiskInfo** + - **Features** (list) - 磁盘可支持的服务 + - **InstantResize** (bool) - 系统盘是否允许扩容,如果是本地盘,则不允许扩容,InstantResize为false。 + - **MaximalSize** (int) - MaximalSize为磁盘最大值 + - **Name** (str) - 系统盘类别,包含普通云盘|CLOUD_NORMAL、SSD云盘|CLOUD_SSD和RSSD云盘|CLOUD_RSSD。普通本地盘只包含普通本地盘|LOCAL_NORMAL一种。SSD本地盘只包含SSD本地盘|LOCAL_SSD一种。 + + + **DataDiskInfo** + - **Features** (list) - 数据盘可支持的服务 + - **MaximalSize** (int) - MaximalSize为磁盘最大值 + - **MinimalSize** (int) - 磁盘最小值,如果没有该字段,最小值取基础镜像Size值即可(linux为20G,windows为40G)。 + - **Name** (str) - 数据盘类别,包含普通云盘|CLOUD_NORMAL、SSD云盘|CLOUD_SSD和RSSD云盘|CLOUD_RSSD。普通本地盘只包含普通本地盘|LOCAL_NORMAL一种。SSD本地盘只包含SSD本地盘|LOCAL_SSD一种。 + + + **Performance** + - **Rate** (int) - 交互展示参数,可忽略 + - **Value** (float) - 值,单位是TFlops + + + **Features** + - **Modes** (list) - 见 **FeatureModes** 模型定义 + - **Name** (str) - 可支持的特性名称。目前支持的特性网络增强|NetCapability、热升级|Hotplug + + + **GraphicsMemory** + - **Rate** (int) - 交互展示参数,可忽略 + - **Value** (int) - 值,单位是GB + + + **Disks** + - **BootDisk** (list) - 见 **BootDiskInfo** 模型定义 + - **DataDisk** (list) - 见 **DataDiskInfo** 模型定义 + - **Name** (str) - 磁盘介质类别信息,磁盘主要分类如下:云盘|cloudDisk、普通本地盘|normalLocalDisk和SSD本地盘|ssdLocalDisk。 + + + **AvailableInstanceTypes** + - **CpuPlatforms** (dict) - 见 **CpuPlatforms** 模型定义 + - **Description** (str) - 机型描述 + - **Disks** (list) - 见 **Disks** 模型定义 + - **Features** (list) - 见 **Features** 模型定义 + - **GraphicsMemory** (dict) - 见 **GraphicsMemory** 模型定义 + - **InstanceType** (str) - 实例类型,枚举值["uhost", "spot"] + - **MachineClass** (str) - 区分是否是GPU机型:GPU机型|GPU,非GPU机型|Normal。 + - **MachineSizes** (list) - 见 **MachineSizes** 模型定义 + - **Name** (str) - 机型名称:快杰O型|O 、快杰共享型|OM 、快杰内存型|OMEM 、 快杰PRO型|OPRO、通用N型|N、高主频C型|C和GPU G型|G等 + - **ParentType** (str) - 父机型 + - **Performance** (dict) - 见 **Performance** 模型定义 + - **Status** (str) - 机型状态:可售|Normal 、 公测|Beta、售罄|Soldout、隐藏|Hidden + - **UHostFamilies** (list) - 见 **UHostFamily** 模型定义 + - **Zone** (str) - 可用区信息 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeAvailableInstanceTypesRequestSchema().dumps(d) + + resp = self.invoke("DescribeAvailableInstanceTypes", d, **kwargs) + return apis.DescribeAvailableInstanceTypesResponseSchema().loads(resp) + def describe_image( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeImage - 获取指定数据中心镜像列表,用户可通过指定操作系统类型,镜像Id进行过滤。 + """DescribeImage - 获取指定数据中心镜像列表,用户可通过指定操作系统类型,镜像Id进行过滤。 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **FuncType** (str) - 镜像归属,枚举值:["gpu","app","uhost"]。"gpu": 对gpu进行处理过的行业镜像;"app":轻量云主机专用的镜像;"uhost":云主机镜像市场的行业镜像。FuncType传参错误会被忽略 - **ImageId** (str) - 镜像Id + - **ImageIds** (list) - 镜像Id列表 - **ImageType** (str) - 镜像类型。标准镜像:Base,镜像市场:Business, 自定义镜像:Custom,默认返回所有类型 - **Limit** (int) - 返回数据长度,默认为20 - **Offset** (int) - 列表起始位置偏移量,默认为0 - **OsType** (str) - 操作系统类型:Linux, Windows 默认返回所有类型 - **PriceSet** (int) - 是否返回价格:1返回,0不返回;默认不返回 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Tag** (str) - 业务组Id。默认:Default + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **ImageSet** (list) - 见 **UHostImageSet** 模型定义 - **TotalCount** (int) - 满足条件的镜像总数 - + **Response Model** - - **UHostImageSet** - + + **BasePriceSet** + - **ChargeType** (str) - 计费类型 + - **OriginalPrice** (float) - 限时优惠的折前原价(即列表价乘以商务折扣后的单价)。 + - **Price** (float) - 价格,单位: 元,保留小数点后两位有效数字 + + + **UHostImageSet** - **CreateTime** (int) - 创建时间,格式为Unix时间戳 - - **Features** (list) - 特殊状态标识, 目前包含NetEnhnced(网络增强1.0), NetEnhanced_Ultra](网络增强2.0),HotPlug(热升级),CloudInit - - **FuncType** (str) - 行业镜像类型(仅行业镜像将返回这个值) + - **DataSnapshotIds** (list) - 关联的云盘数据盘快照Id列表 + - **Features** (list) - 特殊状态标识,目前包含NetEnhnced(网络增强1.0), NetEnhanced_Ultra(网络增强2.0), NetEnhanced_Extreme(网络增强3.0), HotPlug(热升级), GPU(GPU镜像),CloudInit, IPv6(支持IPv6网络),RssdAttachable(支持RSSD云盘),Vgpu_AMD(支持AMD的vgpu),Vgpu_NVIDIA(支持NVIDIA的vgpu),Aarch64_Type(支持arm64架构) + - **FuncType** (str) - 镜像归属,枚举值:["gpu","app","uhost"]。"gpu": 对gpu进行处理过的行业镜像;"app":轻量云主机专用的镜像;"uhost":云主机镜像市场的行业镜像 - **ImageDescription** (str) - 镜像描述 - **ImageId** (str) - 镜像ID - **ImageName** (str) - 镜像名称 @@ -217,16 +549,26 @@ def describe_image( - **ImageType** (str) - 镜像类型 标准镜像:Base, 行业镜像:Business,自定义镜像:Custom - **IntegratedSoftware** (str) - 集成软件名称(仅行业镜像将返回这个值) - **Links** (str) - 介绍链接(仅行业镜像将返回这个值) + - **MaintainEol** (str) - 系统EOL的时间,格式:YYYY/MM/DD - **MinimalCPU** (str) - 默认值为空'''。当CentOS 7.3/7.4/7.5等镜像会标记为“Broadwell” - **OsName** (str) - 操作系统名称 - - **OsType** (str) - 操作系统类型:Liunx,Windows - - **State** (str) - 镜像状态, 可用:Available,制作中:Making, 不可用:Unavailable + - **OsType** (str) - 操作系统类型:Linux,Windows + - **PriceSet** (list) - 见 **BasePriceSet** 模型定义 + - **PrimarySoftware** (str) - 主要安装软件 + - **SceneCategories** (list) - 场景分类,目前包含Featured(精选),PreInstalledDrivers(预装驱动),AIPainting(AI绘画),AIModels(AI模型),HPC(高性能计算) + - **State** (str) - 镜像状态, 可用:Available,制作中:Making, 不可用:Unavailable,复制中:Copying + - **SupportedGPUTypes** (list) - 支持的GPU机型 + - **Tag** (str) - 业务组 - **Vendor** (str) - 供应商(仅行业镜像将返回这个值) - - **Zone** (str) - 可用区,参见 `可用区列表 `_ + - **Zone** (str) - 可用区,参见 `可用区列表 `_ + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeImageRequestSchema().dumps(d) @@ -236,37 +578,41 @@ def describe_image( def describe_isolation_group( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeIsolationGroup - 查询硬件隔离组列表。 + """DescribeIsolationGroup - 查询硬件隔离组列表。 **Request** - **ProjectId** (str) - (Config) 项目id - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **GroupId** (str) - 待查的硬件隔离组id - **Limit** (int) - 返回数据长度,默认为20,最大100 - **Offset** (int) - 列表起始位置偏移量,默认为0 - + **Response** - **IsolationGroupSet** (list) - 见 **IsolationGroup** 模型定义 - + - **TotalCount** (int) - 硬件隔离组总数 + **Response Model** - - **SpreadInfo** - - - **UHostCount** (int) - 可用区中硬件隔离组中云主机的数量,不超过7。 + + **SpreadInfo** + - **UHostCount** (int) - 当前地域所有可用区中硬件隔离组中云主机的数量,不超过7。 - **Zone** (str) - 可用区信息 - **IsolationGroup** - + + **IsolationGroup** - **GroupId** (str) - 硬件隔离组id - **GroupName** (str) - 硬件隔离组名称 - **Remark** (str) - 备注 - **SpreadInfoSet** (list) - 见 **SpreadInfo** 模型定义 + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeIsolationGroupRequestSchema().dumps(d) @@ -276,94 +622,128 @@ def describe_isolation_group( def describe_uhost_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUHostInstance - 获取主机或主机列表信息,并可根据数据中心,主机ID等参数进行过滤。 + """DescribeUHostInstance - 获取主机或主机列表信息,并可根据数据中心,主机ID等参数进行过滤。 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **IsolationGroup** (str) - 硬件隔离组id。通过硬件隔离组筛选主机。 - - **LifeCycle** (int) - 1:普通云主机;2:抢占型云主机;如不传此参数,默认全部获取 - **Limit** (int) - 返回数据长度,默认为20,最大100 - **Offset** (int) - 列表起始位置偏移量,默认为0 - **SubnetId** (str) - 子网id。通过子网筛选主机。北京一地域无效。 - **Tag** (str) - 要查询的业务组名称 + - **UDiskIdForAttachment** (str) - 要挂载的云盘id,过滤返回能被UDiskId挂载的云主机。目前主要针对rssd云盘使用 - **UHostIds** (list) - 【数组】UHost主机的资源ID,例如UHostIds.0代表希望获取信息 的主机1,UHostIds.1代表主机2。 如果不传入,则返回当前Region 所有符合条件的UHost实例。 - **VPCId** (str) - vpc id。通过VPC筛选主机。北京一地域无效。 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - - **Action** (str) - 操作名称 - - **RetCode** (int) - 返回码 - **TotalCount** (int) - UHostInstance总数 - **UHostSet** (list) - 见 **UHostInstanceSet** 模型定义 - + **Response Model** - - **UHostDiskSet** - - - **BackupType** (str) - 备份方案。若开通了数据方舟,则为DataArk - - **DiskId** (str) - 磁盘ID - - **DiskType** (str) - 磁盘类型。请参考 `磁盘类型 `_ 。 - - **Drive** (str) - 磁盘盘符 - - **Encrypted** (bool) - true: 加密盘 false:非加密盘 - - **IsBoot** (str) - 是否是系统盘。枚举值:\\ > True,是系统盘 \\ > False,是数据盘(默认)。Disks数组中有且只能有一块盘是系统盘。 - - **Name** (str) - UDisk名字(仅当磁盘是UDisk时返回) - - **Size** (int) - 磁盘大小,单位: GB - - **Type** (str) - 【建议不再使用】磁盘类型。系统盘: Boot,数据盘: Data,网络盘:Udisk - **UHostIPSet** - + **UHostKeyPair** + - **KeyPairId** (str) - 密钥对ID + - **KeyPairState** (str) - 主机密钥对状态,Normal 正常,Deleted 删除 + + + **UHostIPSet** - **Bandwidth** (int) - IP对应的带宽, 单位: Mb (内网IP不显示带宽信息) - - **Default** (str) - 【暂未支持】是否为默认网卡。True: 是默认网卡;其他值:不是。 + - **Default** (str) - 内网 Private 类型下,表示是否为默认网卡。true: 是默认网卡;其他值:不是。 - **IP** (str) - IP地址 - **IPId** (str) - 外网IP资源ID 。(内网IP无对应的资源ID) - - **Mac** (str) - 当前网卡的Mac。 + - **IPMode** (str) - IPv4/IPv6; + - **Mac** (str) - 内网 Private 类型下,当前网卡的Mac。 + - **NetworkInterfaceId** (str) - 弹性网卡为默认网卡时,返回对应的 ID 值 - **SubnetId** (str) - IP地址对应的子网 ID。(北京一不支持,字段返回为空) - **Type** (str) - 国际: Internation,BGP: Bgp,内网: Private - **VPCId** (str) - IP地址对应的VPC ID。(北京一不支持,字段返回为空) - **Weight** (int) - 当前EIP的权重。权重最大的为当前的出口IP。 - **UHostInstanceSet** - + + **UDSetUDHostAttribute** + - **HostBinding** (bool) - 是否绑定私有专区宿主机 + - **UDHostId** (str) - 私有专区宿主机 + - **UDSetId** (str) - 私有专区 + + + **UHostDiskSet** + - **BackupType** (str) - 备份方案。若开通了数据方舟,则为DATAARK + - **DiskId** (str) - 磁盘ID + - **DiskType** (str) - 磁盘类型。请参考 `磁盘类型 `_ 。 + - **Drive** (str) - 磁盘盘符 + - **Encrypted** (str) - "true": 加密盘 "false":非加密盘 + - **IsBoot** (str) - 是否是系统盘。枚举值:\\ > True,是系统盘 \\ > False,是数据盘(默认)。Disks数组中有且只能有一块盘是系统盘。 + - **Name** (str) - UDisk名字(仅当磁盘是UDisk时返回) + - **Size** (int) - 磁盘大小,单位: GB + - **Type** (str) - 【建议不再使用】磁盘类型。系统盘: Boot,数据盘: Data,网络盘:Udisk + + + **SpotAttribute** + - **RecycleTime** (int) - 回收时间 + + + **UHostInstanceSet** - **AutoRenew** (str) - 是否自动续费,自动续费:“Yes”,不自动续费:“No” - **BasicImageId** (str) - 基础镜像ID(指当前自定义镜像的来源镜像) - **BasicImageName** (str) - 基础镜像名称(指当前自定义镜像的来源镜像) - **BootDiskState** (str) - 系统盘状态 Normal表示初始化完成;Initializing表示在初始化。仍在初始化的系统盘无法制作镜像。 - **CPU** (int) - 虚拟CPU核数,单位: 个 - - **ChargeType** (str) - 计费模式,枚举值为: Year,按年付费; Month,按月付费; Dynamic,按需付费(需开启权限); + - **ChargeType** (str) - 计费模式,枚举值为: Year,按年付费; Month,按月付费; Dynamic,按需付费(需开启权限);Preemptive 为抢占式实例; + - **CloudInitFeature** (bool) - true: 支持cloutinit方式初始化;false: 不支持 + - **CpuPlatform** (str) - 云主机CPU平台。参考 `云主机机型说明 `_ 。 - **CreateTime** (int) - 创建时间,格式为Unix时间戳 - **DiskSet** (list) - 见 **UHostDiskSet** 模型定义 + - **EpcInstance** (bool) - true: 高性能计算主机;false: 不是 - **ExpireTime** (int) - 到期时间,格式为Unix时间戳 - **GPU** (int) - GPU个数 + - **GpuType** (str) - GPU类型;枚举值["K80", "P40", "V100", "T4","T4A", "T4S","2080Ti","2080Ti-4C","1080Ti", "T4/4", "MI100", "V100S",2080","2080TiS","2080TiPro","3090","4090","4090Pro","A100","A800","H20"] + - **HiddenKvm** (bool) - true: 开启 hidden kvm 功能;false: 不是 - **HostType** (str) - 【建议不再使用】主机系列:N2,表示系列2;N1,表示系列1 + - **HotPlugMaxCpu** (int) - 热升级支持的最大CPU个数 - **HotplugFeature** (bool) - true: 开启热升级; false,未开启热升级 + - **HpcFeature** (bool) - true: 开启 hpc 系列功能;false: 未开启 - **IPSet** (list) - 见 **UHostIPSet** 模型定义 + - **IPv6Feature** (bool) - true: 有ipv6特性;false,没有ipv6特性 - **ImageId** (str) - 【建议不再使用】主机的系统盘ID。 - **IsolationGroup** (str) - 隔离组id,不在隔离组则返回"" + - **KeyPair** (dict) - 见 **UHostKeyPair** 模型定义 - **LifeCycle** (str) - 主机的生命周期类型。目前仅支持Normal:普通; - **MachineType** (str) - 云主机机型(新)。参考 `云主机机型说明 `_ 。 - **Memory** (int) - 内存大小,单位: MB - **Name** (str) - UHost实例名称 - **NetCapability** (str) - 网络增强。Normal: 无;Super: 网络增强1.0; Ultra: 网络增强2.0 + - **NetFeatureTag** (str) - Firewall:防火墙,SecGroup:安全组,Acl:acl - **NetworkState** (str) - 【建议不再使用】网络状态。 连接:Connected, 断开:NotConnected - **OsName** (str) - 创建主机的最初来源镜像的操作系统名称(若直接通过基础镜像创建,此处返回和BasicImageName一致) - **OsType** (str) - 操作系统类别。返回"Linux"或者"Windows" + - **RdmaClusterId** (str) - RDMA集群id,仅快杰云主机返回该值;其他类型云主机返回""。当云主机的此值与RSSD云盘的RdmaClusterId相同时,RSSD可以挂载到这台云主机。 - **Remark** (str) - 备注 - - **State** (str) - 实例状态,枚举值:\\ >初始化: Initializing; \\ >启动中: Starting; \\> 运行中: Running; \\> 关机中: Stopping; \\ >关机: Stopped \\ >安装失败: Install Fail; \\ >重启中: Rebooting + - **RestrictMode** (str) - 仅抢占式实例返回,LowSpeed为低速模式,PowerOff为关机模式 + - **SecGroupInstance** (bool) - 【待废弃】true: 绑定了安全组的主机;false: 不是 + - **SpotAttribute** (dict) - 见 **SpotAttribute** 模型定义 + - **State** (str) - 实例状态,枚举值:\\ >初始化: Initializing; \\ >启动中: Starting; \\> 运行中: Running; \\> 关机中: Stopping; \\ >关机: Stopped \\ >安装失败: Install Fail; \\ >重启中: Rebooting; \\ > 未知(空字符串,获取状态超时或出错):"" - **StorageType** (str) - 【建议不再使用】主机磁盘类型。 枚举值为:\\ > LocalDisk,本地磁盘; \\ > UDisk 云盘。\\只要有一块磁盘为本地盘,即返回LocalDisk。 - **SubnetType** (str) - 【建议不再使用】仅北京A的云主机会返回此字段。基础网络模式:Default;子网模式:Private - **Tag** (str) - 业务组名称 - **TimemachineFeature** (str) - 【建议不再使用】数据方舟模式。枚举值:\\ > Yes: 开启方舟; \\ > no,未开启方舟 - **TotalDiskSpace** (int) - 总的数据盘存储空间。 + - **UDHostAttribute** (dict) - 见 **UDSetUDHostAttribute** 模型定义 + - **UHostFamily** (str) - 规格族。 由机型代号和 CPU 平台组成,用于指定云主机的硬件类型与处理器平台。 当 MachineType 为 "O"(快杰型)时,支持以下取值: - o1i:快杰型 O1 代,Intel 平台 - o1a:快杰型 O1 代,AMD 平台 - o1r:快杰型 O1 代,ARM 平台 - o2i:快杰型 O2 代,Intel 平台 默认值:o1i 或 o1a或o1r(系统将根据资源情况自动选择) 当 MachineType 为 "OM"(快杰共享型)时,支持以下取值: - om1i:快杰内存增强型 OM1 代,Intel 平台 - om2i:快杰内存增强型 OM2 代,Intel 平台 - **UHostId** (str) - UHost实例ID - **UHostType** (str) - 【建议不再使用】云主机机型(旧)。参考 `云主机机型说明 `_ 。 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUHostInstanceRequestSchema().dumps(d) @@ -373,120 +753,230 @@ def describe_uhost_instance( def describe_uhost_instance_snapshot( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUHostInstanceSnapshot - 获取已经存在的UHost实例的存储快照列表。 + """DescribeUHostInstanceSnapshot - **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **UHostId** (str) - (Required) UHost实例ID 参见 `DescribeUHostInstance `_ - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **ProjectId** (str) - (Config) + - **Region** (str) - (Config) + - **UHostId** (str) - (Required) + - **Zone** (str) - + **Response** - **SnapshotSet** (list) - 见 **UHostSnapshotSet** 模型定义 - - **UhostId** (str) - UHost实例ID - + - **UhostId** (str) - + **Response Model** - - **UHostSnapshotSet** - - - **SnapshotName** (str) - 快照名称 - - **SnapshotState** (str) - 快照状态, 制作中:Capturing 制作成功:Success 制作失败:Fail - - **SnapshotTime** (str) - 快照制作时间 + + **UHostSnapshotSet** + - **SnapshotName** (str) - + - **SnapshotState** (str) - + - **SnapshotTime** (str) - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUHostInstanceSnapshotRequestSchema().dumps(d) + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + resp = self.invoke("DescribeUHostInstanceSnapshot", d, **kwargs) return apis.DescribeUHostInstanceSnapshotResponseSchema().loads(resp) + def describe_uhost_key_pairs( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUHostKeyPairs - 查询一个或多个密钥对。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **KeyPairFingerPrint** (str) - 密钥对的指纹。 + - **KeyPairName** (str) - 密钥对名称。 + - **Limit** (int) - 返回数据长度,默认为20,最大100 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **KeyPairs** (list) - 见 **KeyPairDesc** 模型定义 + - **TotalCount** (int) - 密钥对总数 + + **Response Model** + + **KeyPairDesc** + - **CreateTime** (int) - 密钥对的创建时间,格式为Unix Timestamp。 + - **KeyPairFingerPrint** (str) - 密钥对指纹。md5(ProjectId|KeyPairId|PublicKey) + - **KeyPairId** (str) - 密钥对ID。 + - **KeyPairName** (str) - 密钥对名称。 长度为1~63个英文或中文字符。 + - **ProjectId** (str) - 项目ID。 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUHostKeyPairsRequestSchema().dumps(d) + + resp = self.invoke("DescribeUHostKeyPairs", d, **kwargs) + return apis.DescribeUHostKeyPairsResponseSchema().loads(resp) + def describe_uhost_tags( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUHostTags - 获取指定数据中心的业务组列表。 + """DescribeUHostTags - 获取指定数据中心的业务组列表。 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **TagSet** (list) - 见 **UHostTagSet** 模型定义 - - **TotalCount** (int) - 已有主机的业务组总个数 - + - **TotalCount** (int) - 已有主机的业务组总数 + **Response Model** - - **UHostTagSet** - + + **UHostTagSet** - **Tag** (str) - 业务组名称 - **TotalCount** (int) - 该业务组中包含的主机个数 - **Zone** (str) - 可用区 + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUHostTagsRequestSchema().dumps(d) resp = self.invoke("DescribeUHostTags", d, **kwargs) return apis.DescribeUHostTagsResponseSchema().loads(resp) + def get_attached_disk_upgrade_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetAttachedDiskUpgradePrice - 获取挂载磁盘的升级价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DiskId** (str) - (Required) 磁盘ID。参见 `DescribeUHostInstance `_ 返回值中的DiskSet。 + - **DiskSpace** (int) - (Required) 磁盘大小,单位GB。取值范围需大于当前磁盘大小,最大值请参考 `磁盘类型 `_ 。 + - **UHostId** (str) - (Required) UHost实例ID。 参见 `DescribeUHostInstance `_ 。 + - **BackupMode** (str) - 磁盘备份方案。枚举值:\\ > NONE,无备份 \\ > DATAARK,数据方舟 \\> SNAPSHOT(SNAPSHOT模式目前仅在上海C支持),快照 \\ 当前磁盘支持的备份模式参考 `磁盘类型 `_ 。默认值为当前的备份模式。 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **ListPrice** (float) - 原价。精度为小数点后2位。 + - **ListPriceDetail** (dict) - 见 **DiskUpgradePriceDetail** 模型定义 + - **OriginalPrice** (float) - 用户折后价。精度为小数点后2位。 + - **OriginalPriceDetail** (dict) - 见 **DiskUpgradePriceDetail** 模型定义 + - **Price** (float) - 升级差价。精度为小数点后2位。 + - **PriceDetail** (dict) - 见 **DiskUpgradePriceDetail** 模型定义 + + **Response Model** + + **DiskUpgradePriceDetail** + - **Snapshot** (float) - 快照的价格 + - **UDisk** (float) - 磁盘的价格 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetAttachedDiskUpgradePriceRequestSchema().dumps(d) + + resp = self.invoke("GetAttachedDiskUpgradePrice", d, **kwargs) + return apis.GetAttachedDiskUpgradePriceResponseSchema().loads(resp) + def get_uhost_instance_price( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetUHostInstancePrice - 根据UHost实例配置,获取UHost实例的价格。 + """GetUHostInstancePrice - 根据UHost实例配置,获取UHost实例的价格。 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **CPU** (int) - (Required) CPU核数。可选参数:1-64。可选范围参照控制台。默认值: 4 - **Count** (int) - (Required) 购买台数,范围[1,5] - - **ImageId** (str) - (Required) 镜像Id,可通过 `DescribeImage `_ 获取镜像ID - **Memory** (int) - (Required) 内存大小。单位:MB。范围 :[1024, 262144],取值为1024的倍数(可选范围参照好控制台)。默认值:8192 - - **ChargeType** (str) - 计费模式。枚举值为: \\ > Year,按年付费; \\ > Month,按月付费;\\ > Dynamic,按小时付费 \\ 默认为月付。 - - **DiskSpace** (int) - 【待废弃】数据盘大小,单位: GB,范围[0,1000],步长: 10,默认值: 0 + - **ChargeType** (str) - 计费模式。枚举值为: \\ > Year,按年付费; \\ > Month,按月付费;\\ > Dynamic,按小时付费 // >Spot 抢占式实例 \\ 如果不传某个枚举值,默认返回年付、月付、时付的价格组合集。 + - **CpuPlatform** (str) - 取值"Intel" "Amd",默认值“Intel” - **Disks** (list) - 见 **GetUHostInstancePriceParamDisks** 模型定义 - **GPU** (int) - GPU卡核心数。仅GPU机型支持此字段。 - - **GpuType** (str) - GPU类型,枚举值["K80", "P40", "V100"] - - **LifeCycle** (int) - 【未支持】1:普通云主机;2:抢占性云主机;默认普通 - - **MachineType** (str) - 云主机机型(V2版本概念)。枚举值["N", "C", "G", "O"]。参考 `云主机机型说明 `_ 。 + - **GpuType** (str) - GPU类型,枚举值["K80", "P40", "V100", "T4","T4A", "T4S","2080Ti","2080Ti-4C","1080Ti", "T4/4", "MI100", "V100S",2080","2080TiS","2080TiPro","3090","4090","4090Pro","A100","A800"] + - **ImageId** (str) - 镜像Id,可通过 `DescribeImage `_ 获取镜像ID, 如果镜像ID不传,系统盘大小必传 + - **MachineType** (str) - 云主机机型(V2版本概念)。枚举值["N", "C", "G", "O", "OS", "OPRO", "OMAX", "O.BM", "O.EPC"]。参考 `云主机机型说明 `_ 。 - **NetCapability** (str) - 网络增强。枚举值:Normal,不开启; Super,开启网络增强1.0。 默认值为Normal。 - **Quantity** (int) - 购买时长。默认: 1。按小时购买(Dynamic)时无需此参数。 月付时,此参数传0,代表了购买至月末。 - - **StorageType** (str) - 【待废弃】磁盘类型,同时设定系统盘和数据盘, 枚举值为:LocalDisk,本地磁盘; UDisk,云硬盘; 默认为LocalDisk 仅部分可用区支持云硬盘方式的主机存储方式,具体请查询控制台。 - - **TimemachineFeature** (str) - 【待废弃】方舟机型。No,Yes。默认是No。 + - **ShowPriceDetails** (bool) - 返回价格详细信息 + - **UDSetUHostInstance** (bool) - 专区云主机。如果要在专区宿主机上创建云主机,该参数可以填写为true + - **UHostFamily** (str) - 规格族。 由机型代号和 CPU 平台组成,用于指定云主机的硬件类型与处理器平台。当 MachineType 为 "O"(快杰型)时,支持以下取值: - o1i:快杰型 O1 代,Intel 平台 - o1a:快杰型 O1 代,AMD 平台- o1r:快杰型 O1 代,ARM 平台 - o2i:快杰型 O2 代,Intel 平台 默认值:o1i 或 o1a或o1r(系统将根据资源情况自动选择) 当 MachineType 为 "OM"(快杰共享型)时,支持以下取值: - om1i:快杰内存增强型 OM1 代,Intel 平台 - om2i:快杰内存增强型 OM2 代,Intel 平台注意:规格族必须与 MachineType 匹配,否则请求将被拒绝。 - **UHostType** (str) - 【待废弃】云主机机型(V1版本概念)。参考 `云主机机型说明 `_ 。 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **PriceSet** (list) - 见 **UHostPriceSet** 模型定义 - + **Request Model** - - **GetUHostInstancePriceParamDisks** - - - **BackupType** (str) - 磁盘备份方案。枚举值:\\ > NONE,无备份 \\ > DATAARK,数据方舟 \\ 当前磁盘支持的备份模式参考 `磁盘类型 `_ + + **GetUHostInstancePriceParamVolumes** + + + **GetUHostInstancePriceParamDisks** + - **BackupType** (str) - 磁盘备份方案。枚举值:\\ > NONE,无备份 \\ > DATAARK,数据方舟 \\ > SNAPSHOT,快照\\ 当前磁盘支持的备份模式参考 `磁盘类型 `_ - **IsBoot** (str) - 是否是系统盘。枚举值:\\ > True,是系统盘 \\ > False,是数据盘(默认)。Disks数组中有且只能有一块盘是系统盘。 - **Size** (int) - 磁盘大小,单位GB。请参考 `磁盘类型 `_ 。 - **Type** (str) - 磁盘类型。请参考 `磁盘类型 `_ 。 + **Response Model** - - **UHostPriceSet** - + + **PriceDetail** + - **Snapshot** (float) - 快照价格 + - **UDisk** (float) - 云盘价格 + - **UHost** (float) - 主机价格 + - **Volume** (float) - 数据卷价格 + + + **UHostPriceSet** - **ChargeType** (str) - 计费类型。Year,Month,Dynamic + - **OriginalPrice** (float) - 限时优惠的折前原价。 + - **OriginalPriceDetail** (dict) - 见 **PriceDetail** 模型定义 - **Price** (float) - 价格,单位: 元,保留小数点后两位有效数字 + - **PriceDetail** (dict) - 见 **PriceDetail** 模型定义 + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.GetUHostInstancePriceRequestSchema().dumps(d) @@ -496,57 +986,132 @@ def get_uhost_instance_price( def get_uhost_instance_vnc_info( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetUHostInstanceVncInfo - 获取指定UHost实例的管理VNC配置详细信息。 + """GetUHostInstanceVncInfo - 获取指定UHost实例的管理VNC配置详细信息。 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **UHostId** (str) - (Required) UHost实例ID 参见 `DescribeUHostInstance `_ - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UHostId** (str) - (Required) UHost实例ID 参见 `DescribeUHostInstance `_ + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - - **UhostId** (str) - UHost实例ID + - **UHostId** (str) - UHost实例ID - **VncIP** (str) - Vnc登录IP - **VncPassword** (str) - Vnc 登录密码 - **VncPort** (int) - Vnc登录端口 - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.GetUHostInstanceVncInfoRequestSchema().dumps(d) resp = self.invoke("GetUHostInstanceVncInfo", d, **kwargs) return apis.GetUHostInstanceVncInfoResponseSchema().loads(resp) + def get_uhost_refund_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUHostRefundPrice - 获取主机删除扣除费用。包括主机、磁盘、快照服务、EIP等资源的费用 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UHostIds** (list) - (Required) 【数组】UHost实例ID。参见 `DescribeUHostInstance `_ + + **Response** + + - **RefundPriceSet** (list) - 见 **UHostRefundPriceSet** 模型定义 + + **Response Model** + + **UHostRefundPriceSet** + - **Code** (int) - 实例操作结果的错误码。0为成功 + - **RefundPrice** (float) - 实例的删除退费金额 + - **UHostId** (str) - UHost实例ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUHostRefundPriceRequestSchema().dumps(d) + + resp = self.invoke("GetUHostRefundPrice", d, **kwargs) + return apis.GetUHostRefundPriceResponseSchema().loads(resp) + + def get_uhost_renew_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUHostRenewPrice - 获取主机续费价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ChargeType** (str) - (Required) 计费类型。Year,Month,Dynamic,默认返回全部计费方式对应的价格 + - **UHostId** (str) - (Required) UHost实例ID + + **Response** + + - **PriceSet** (list) - 见 **BasePriceSet** 模型定义 + + **Response Model** + + **BasePriceSet** + - **ChargeType** (str) - 计费类型 + - **OriginalPrice** (float) - 限时优惠的折前原价(即列表价乘以商务折扣后的单价)。 + - **Price** (float) - 价格,单位: 元,保留小数点后两位有效数字 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUHostRenewPriceRequestSchema().dumps(d) + + resp = self.invoke("GetUHostRenewPrice", d, **kwargs) + return apis.GetUHostRenewPriceResponseSchema().loads(resp) + def get_uhost_upgrade_price( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetUHostUpgradePrice - 获取UHost实例升级配置的价格。可选配置范围请参考 `云主机机型说明 `_ 。 + """GetUHostUpgradePrice - 获取UHost实例升级配置的价格。可选配置范围请参考 `云主机机型说明 `_ 。 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **UHostId** (str) - (Required) UHost实例ID。 参见 `DescribeUHostInstance `_ 。 - - **BootDiskSpace** (int) - 【待废弃】系统大小,单位: GB,范围[20,100],步长: 10。 - **CPU** (int) - 虚拟CPU核数。可选参数:1-64(可选范围参考控制台)。默认值为当前实例的CPU核数。 - - **DiskSpace** (int) - 【待废弃】数据盘大小,单位: GB,范围[0,1000],步长: 10, 默认值是该主机当前数据盘大小。 - - **HostType** (str) - 【待废弃】主机系列,目前支持N1,N2 + - **GPU** (int) - GPU卡核心数。仅GPU机型支持此字段(可选范围与MachineType+GpuType相关) - **Memory** (int) - 内存大小。单位:MB。范围 :[1024, 262144],取值为1024的倍数(可选范围参考控制台)。默认值为当前实例的内存大小。 - - **NetCapValue** (int) - 网卡升降级(1,表示升级,2表示降级,0表示不变) - - **TimemachineFeature** (str) - 方舟机型。No,Yes。默认是No。 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **NetCapValue** (int) - 网卡升降级(1,表示升级,2表示降级,0表示不变)。仅支持网络增强1.0和网络增强2.0的开启和关闭,不支持网络增强特性互相转换,如网络增强1.0升级到网络增强2.0是不被支持的。 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** + - **OriginalPrice** (float) - 限时优惠的折前原价 - **Price** (float) - 规格调整差价。精确到小数点后2位。 - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.GetUHostUpgradePriceRequestSchema().dumps(d) @@ -556,12 +1121,12 @@ def get_uhost_upgrade_price( def import_custom_image( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ImportCustomImage - 把UFile的镜像文件导入到UHost,生成自定义镜像 + """ImportCustomImage - 把UFile的镜像文件导入到UHost,生成自定义镜像 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Auth** (bool) - (Required) 是否授权。必须填true - **Format** (str) - (Required) 镜像格式,可选RAW、VHD、VMDK、qcow2 - **ImageName** (str) - (Required) 镜像名称 @@ -569,14 +1134,18 @@ def import_custom_image( - **OsType** (str) - (Required) 操作系统平台,比如CentOS、Ubuntu、Windows、RedHat等,请参考控制台的镜像版本;若导入控制台上没有的操作系统,参数为Other - **UFileUrl** (str) - (Required) UFile私有空间地址 - **ImageDescription** (str) - 镜像描述 - + - **Tag** (str) - 业务组 + **Response** - **ImageId** (str) - 镜像Id - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.ImportCustomImageRequestSchema().dumps(d) @@ -586,26 +1155,123 @@ def import_custom_image( resp = self.invoke("ImportCustomImage", d, **kwargs) return apis.ImportCustomImageResponseSchema().loads(resp) + def import_uhost_key_pairs( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ImportUHostKeyPairs - 导入密钥对后,仅保管公钥部分,需自行妥善保存密钥对的私钥部分。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **KeyPairName** (str) - (Required) 密钥对名称。由字母,数字,符号组成,长度为1-63位。 + - **PublicKeyBody** (str) - (Required) 密钥对的公钥内容。 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **KeyPairFingerPrint** (str) - 密钥对指纹。根据RFC4716定义的公钥指纹格式,采用MD5信息摘要算法。算法处理的具体信息格式:`ProjectIdKeyPairId|PublicKeyBody`。 + - **KeyPairId** (str) - 密钥对标识 + - **KeyPairName** (str) - 密钥对名称 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ImportUHostKeyPairsRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("ImportUHostKeyPairs", d, **kwargs) + return apis.ImportUHostKeyPairsResponseSchema().loads(resp) + + def leave_isolation_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """LeaveIsolationGroup - 移除硬件隔离组中的主机 + + **Request** + + - **ProjectId** (str) - (Config) 项目id + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **GroupId** (str) - (Required) 硬件隔离组id + - **UHostId** (str) - (Required) 主机id + - **Zone** (str) - 可用区信息 + + **Response** + + - **UHostId** (str) - 主机id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.LeaveIsolationGroupRequestSchema().dumps(d) + + resp = self.invoke("LeaveIsolationGroup", d, **kwargs) + return apis.LeaveIsolationGroupResponseSchema().loads(resp) + + def modify_uhost_ip( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUHostIP - 修改云主机内网 IP 地址 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写时为默认项目。请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **PresentIpAddress** (str) - (Required) 需要修改为的 IP 地址。新的IP地址和旧IP地址必须属于统一子网,且和主机内部的配置文件一致。 + - **UHostId** (str) - (Required) 指定云主机 ID。 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **PreviousIpAddress** (str) - 所需修改的原 IP 地址 ,当云主机只有一个IP地址时,此参数不必填写。 + + **Response** + + - **Message** (str) - 输出错误的信息 + - **UHostId** (str) - 目标云主机 ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyUHostIPRequestSchema().dumps(d) + + resp = self.invoke("ModifyUHostIP", d, **kwargs) + return apis.ModifyUHostIPResponseSchema().loads(resp) + def modify_uhost_instance_name( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ModifyUHostInstanceName - 修改指定UHost实例名称,需要给出数据中心,UHostId,及新的实例名称。 + """ModifyUHostInstanceName - 修改指定UHost实例名称,需要给出数据中心,UHostId,及新的实例名称。 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **UHostId** (str) - (Required) UHost实例ID 参见 `DescribeUHostInstance `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UHostId** (str) - (Required) UHost实例ID 参见 `DescribeUHostInstance `_ - **Name** (str) - UHost实例名称 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - - **UhostId** (str) - UHost实例ID - + - **UHostId** (str) - UHost实例ID + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.ModifyUHostInstanceNameRequestSchema().dumps(d) @@ -615,23 +1281,26 @@ def modify_uhost_instance_name( def modify_uhost_instance_remark( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ModifyUHostInstanceRemark - 修改指定UHost实例备注信息。 + """ModifyUHostInstanceRemark - 修改指定UHost实例备注信息。 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **UHostId** (str) - (Required) UHost实例ID 参见 `DescribeUHostInstance `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UHostId** (str) - (Required) UHost实例ID 参见 `DescribeUHostInstance `_ - **Remark** (str) - 备注 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - - **UhostId** (str) - UHost实例ID - + - **UHostId** (str) - UHost实例ID + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.ModifyUHostInstanceRemarkRequestSchema().dumps(d) @@ -641,23 +1310,26 @@ def modify_uhost_instance_remark( def modify_uhost_instance_tag( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ModifyUHostInstanceTag - 修改指定UHost实例业务组标识。 + """ModifyUHostInstanceTag - 修改指定UHost实例业务组标识。 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **UHostId** (str) - (Required) UHost实例ID 参见 `DescribeUHostInstance `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UHostId** (str) - (Required) UHost实例ID 参见 `DescribeUHostInstance `_ - **Tag** (str) - 业务组名称 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - - **UhostId** (str) - UHost实例ID - + - **UHostId** (str) - UHost实例ID + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.ModifyUHostInstanceTagRequestSchema().dumps(d) @@ -667,22 +1339,25 @@ def modify_uhost_instance_tag( def poweroff_uhost_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ PoweroffUHostInstance - 直接关闭UHost实例电源,无需等待实例正常关闭。 + """PoweroffUHostInstance - 直接关闭UHost实例电源,无需等待实例正常关闭。 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **UHostId** (str) - (Required) UHost实例ID 参见 `DescribeUHostInstance `_ - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UHostId** (str) - (Required) UHost实例ID 参见 `DescribeUHostInstance `_ + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - - **UhostId** (str) - UHost实例ID - + - **UHostId** (str) - UHost的实例ID + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.PoweroffUHostInstanceRequestSchema().dumps(d) @@ -692,23 +1367,26 @@ def poweroff_uhost_instance( def reboot_uhost_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ RebootUHostInstance - 重新启动UHost实例,需要指定数据中心及UHostID两个参数的值。 + """RebootUHostInstance - 重新启动UHost实例,需要指定数据中心及UHostID两个参数的值。 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **UHostId** (str) - (Required) UHost实例ID 参见 `DescribeUHostInstance `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UHostId** (str) - (Required) UHost实例ID 参见 `DescribeUHostInstance `_ - **DiskPassword** (str) - 加密盘密码 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - - **UhostId** (str) - UHost实例ID - + - **UHostId** (str) - UHost实例ID + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.RebootUHostInstanceRequestSchema().dumps(d) @@ -718,27 +1396,34 @@ def reboot_uhost_instance( def reinstall_uhost_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ReinstallUHostInstance - 重新安装指定UHost实例的操作系统 + """ReinstallUHostInstance - 重新安装指定UHost实例的操作系统 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **UHostId** (str) - (Required) UHost实例资源ID 参见 `DescribeUHostInstance `_ - - **DNSServers** (list) - 针对非私有子网主机,可自定义DNS。n可为0-2 - - **ImageId** (str) - 镜像Id,默认使用原镜像 参见 `DescribeImage `_ - - **Password** (str) - 如果创建UHost实例时LoginMode为Password,则必须填写,如果LoginMode为KeyPair,不需要填写 (密码格式使用BASE64编码;LoginMode不可变更) - - **ReserveDisk** (str) - 是否保留数据盘,保留:Yes,不报留:No, 默认:Yes - - **ResourceType** (int) - 云灾备指明191 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UHostId** (str) - (Required) UHost实例资源ID 参见 `DescribeUHostInstance `_ + - **AutoDataDiskInit** (str) - 数据盘是否需要自动分区挂载。当镜像支持Cloud-init Feature时可填写此字段。取值“On”(默认值), “Off” + - **BootDiskSpace** (int) - 系统盘大小。 单位:GB, 范围[20,100]。 + - **HostName** (str) - 操作系统主机名 + - **ImageId** (str) - 镜像Id,默认使用原镜像 参见 `DescribeImage `_ + - **KeyPairId** (str) - KeypairId 密钥对ID,LoginMode为KeyPair时此项必须。 + - **LoginMode** (str) - 主机登陆模式。密码(默认选项): Password,密钥 KeyPair,自制镜像密码: ImagePasswd。 + - **Password** (str) - 如果重装UHost实例时LoginMode为Password,则必须填写,如果LoginMode为KeyPair,不需要填写 (密码格式使用BASE64编码;举例如下:# echo -n Password1 | base64UGFzc3dvcmQx。) + - **ReserveDisk** (str) - 是否保留数据盘,保留:Yes,不保留:No, 默认:Yes;如果是从Windows重装为Linux或反之,则无法保留数据盘(该参数目前仅对本地数据盘起作用) + - **UserData** (str) - cloudinit初始化使用。注意:1、总数据量大小不超多16K 2、使用base64编码 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - - **UhostId** (str) - UHost实例资源ID - + - **UHostId** (str) - UHost实例资源ID + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.ReinstallUHostInstanceRequestSchema().dumps(d) @@ -748,23 +1433,29 @@ def reinstall_uhost_instance( def reset_uhost_instance_password( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ResetUHostInstancePassword - 重置UHost实例的管理员密码。 + """ResetUHostInstancePassword - 重置UHost实例的管理员密码。 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **Password** (str) - (Required) UHost新密码(密码格式使用BASE64编码) + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **UHostId** (str) - (Required) UHost实例ID - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **AutoStart** (bool) - 修改密码结束后是否立即开机,默认为false, 如果设置为true,则修改密码成功后立即开机; 抢占式和后付费云主机暂不支持当前功能; + - **KeyPairId** (str) - KeypairId 密钥对ID,LoginMode为KeyPair时此项必须。 + - **LoginMode** (str) - 主机登陆模式。密码(默认选项): Password,密钥 KeyPair。 + - **Password** (str) - UHost新密码(密码格式使用BASE64编码) + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - - **UhostId** (str) - UHost实例ID - + - **UHostId** (str) - UHost实例ID + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.ResetUHostInstancePasswordRequestSchema().dumps(d) @@ -774,24 +1465,29 @@ def reset_uhost_instance_password( def resize_attached_disk( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ResizeAttachedDisk - 修改挂载的磁盘大小,包含系统盘和数据盘 + """ResizeAttachedDisk - 修改挂载的磁盘大小,包含系统盘和数据盘 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **DiskId** (str) - (Required) 磁盘ID。参见 `DescribeUHostInstance `_ 返回值中的DiskSet。 - **DiskSpace** (int) - (Required) 磁盘大小,单位GB,步长为10。取值范围需大于当前磁盘大小,最大值请参考 `磁盘类型 `_ 。 - **UHostId** (str) - (Required) UHost实例ID。 参见 `DescribeUHostInstance `_ 。 - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **DryRun** (bool) - 用于测试磁盘是否支持在线扩容。DryRun=true,不会执行实际操作,只会返回操作的预期结果。DryRun = false ,正常执行扩容操作。 + **Response** - **DiskId** (str) - 改配成功的磁盘id - + - **NeedRestart** (bool) - 扩容后的状态。NeedRestart = true,必须关闭后启动实例才能使用扩容的磁盘空间。NeedRestart = false,磁盘扩容后无需重启操作。 + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.ResizeAttachedDiskRequestSchema().dumps(d) @@ -801,27 +1497,30 @@ def resize_attached_disk( def resize_uhost_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ResizeUHostInstance - 修改指定UHost实例的资源配置,如CPU核心数,内存容量大小,磁盘空间大小,网络增强等。 + """ResizeUHostInstance - 修改指定UHost实例的资源配置,如CPU核心数,内存容量大小,网络增强等。可选配置范围请参考 `云主机机型说明 `_ 。 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **UHostId** (str) - (Required) UHost实例ID 参见 `DescribeUHostInstance `_ - - **BootDiskSpace** (int) - 系统盘大小,单位:GB,范围[20,100],步长:10,系统盘不支持缩容,因此不允许输入比当前实例系统盘小的值 - - **CPU** (int) - 虚拟CPU核数,单位:个,范围:[1,16],最小值为1,其他值是2的倍数,默认值为当前实例的CPU核数(*windows CPU>=2) - - **DiskSpace** (int) - 数据盘大小,单位:GB,范围[10,1000]; SSD机型,单位:GB,范围[100,500];步长:10,默认值为当前实例的数据盘大小,数据盘不支持缩容,因此不允许输入比当前实例数据盘大小的值 - - **Memory** (int) - 内存大小,单位:MB,范围[2048,65536],步长:2048,默认值为当前实例的内存大小(BGP-C数据中心最小支持1024,限Linux系统) + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UHostId** (str) - (Required) UHost实例ID 参见 `DescribeUHostInstance `_ + - **AutoStart** (bool) - 扩容结束后是否立即开机,默认为false,如果设置为true,则扩容成功后立即开机;抢占式和后付费云主机暂不支持当前功能; + - **CPU** (int) - 虚拟CPU核数。可选参数:1-240(可选范围与UHostType相关)。默认值为当前实例的CPU核数 + - **GPU** (int) - GPU卡核心数。仅GPU机型支持此字段(可选范围与MachineType+GpuType相关) + - **Memory** (int) - 内存大小。单位:MB。范围 :[1024, 1966080],取值为1024的倍数(可选范围与UHostType相关)。默认值为当前实例的内存大小。 - **NetCapValue** (int) - 网卡升降级(1,表示升级,2表示降级,0表示不变) - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - - **UhostId** (str) - UHost实例ID - + - **UHostId** (str) - UHost实例ID + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.ResizeUHostInstanceRequestSchema().dumps(d) @@ -831,23 +1530,26 @@ def resize_uhost_instance( def start_uhost_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ StartUHostInstance - 启动处于关闭状态的UHost实例,需要指定数据中心及UHostID两个参数的值。 + """StartUHostInstance - 启动处于关闭状态的UHost实例,需要指定数据中心及UHostID两个参数的值。 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **UHostId** (str) - (Required) UHost实例ID 参见 `DescribeUHostInstance `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UHostId** (str) - (Required) UHost实例ID 参见 `DescribeUHostInstance `_ - **DiskPassword** (str) - 加密盘密码 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - - **UhostId** (str) - UHost实例ID - + - **UHostId** (str) - UHost实例ID + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.StartUHostInstanceRequestSchema().dumps(d) @@ -857,22 +1559,25 @@ def start_uhost_instance( def stop_uhost_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ StopUHostInstance - 指停止处于运行状态的UHost实例,需指定数据中心及UhostID。 + """StopUHostInstance - 指停止处于运行状态的UHost实例,需指定数据中心及UhostID。 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **UHostId** (str) - (Required) UHost实例ID 参见 `DescribeUHostInstance `_ - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UHostId** (str) - (Required) UHost实例ID 参见 `DescribeUHostInstance `_ + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - - **UhostId** (str) - UHost实例ID - + - **UHostId** (str) - UHost实例ID + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.StopUHostInstanceRequestSchema().dumps(d) @@ -882,22 +1587,24 @@ def stop_uhost_instance( def terminate_custom_image( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ TerminateCustomImage - 删除用户自定义镜像 + """TerminateCustomImage - 删除用户自定义镜像 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **ImageId** (str) - (Required) 自制镜像ID 参见 `DescribeImage `_ - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ImageId** (str) - (Required) 自制镜像ID 参见 `DescribeImage `_ + **Response** - **ImageId** (str) - 自制镜像Id - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.TerminateCustomImageRequestSchema().dumps(d) @@ -907,26 +1614,28 @@ def terminate_custom_image( def terminate_uhost_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ TerminateUHostInstance - 删除指定数据中心的UHost实例。 + """TerminateUHostInstance - 删除指定数据中心的UHost实例。 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **UHostId** (str) - (Required) UHost资源Id 参见 `DescribeUHostInstance `_ - - **Destroy** (int) - 是否直接删除,0表示按照原来的逻辑(有回收站权限,则进入回收站),1表示直接删除 - - **ReleaseEIP** (bool) - 是否释放绑定的EIP。true: 解绑EIP后,并释放;其他值或不填:解绑EIP。 - - **ReleaseUDisk** (bool) - 是否删除挂载的数据盘。true删除,其他不删除。 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UHostId** (str) - (Required) UHost资源Id 参见 `DescribeUHostInstance `_ + - **ReleaseEIP** (bool) - 删除主机时是否释放绑定的EIP。默认为false。 + - **ReleaseUDisk** (bool) - 删除主机时是否同时删除挂载的数据盘。默认为false。 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - - **InRecycle** (str) - 放入回收站:"Yes", 彻底删除:“No” + - **InRecycle** (str) - 用于判断主机删除时是否进入回收站。放入回收站:"Yes", 彻底删除:“No”。 - **UHostId** (str) - UHost 实例 Id - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.TerminateUHostInstanceRequestSchema().dumps(d) @@ -936,24 +1645,29 @@ def terminate_uhost_instance( def upgrade_to_ark_uhost_instance( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ UpgradeToArkUHostInstance - 普通升级为方舟机型 + """UpgradeToArkUHostInstance - **Request** - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **UHostIds** (list) - (Required) UHost主机的资源ID,例如UHostIds.0代表希望升级的主机1,UHostIds.1代表主机2。 - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - - **CouponId** (str) - 代金券ID 请参考DescribeCoupon接口 - + - **Region** (str) - (Config) + - **Zone** (str) - (Required) + - **CouponId** (str) - + - **UHostIds** (list) - + **Response** - - **UHostSet** (list) - UHost主机的资源ID数组 - + - **UHostSet** (list) - + """ # build request - d = {"Region": self.config.region} + d = { + "Region": self.config.region, + } req and d.update(req) d = apis.UpgradeToArkUHostInstanceRequestSchema().dumps(d) + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + resp = self.invoke("UpgradeToArkUHostInstance", d, **kwargs) return apis.UpgradeToArkUHostInstanceResponseSchema().loads(resp) diff --git a/ucloud/services/uhost/schemas/apis.py b/ucloud/services/uhost/schemas/apis.py index 97106b54..3d996d8a 100644 --- a/ucloud/services/uhost/schemas/apis.py +++ b/ucloud/services/uhost/schemas/apis.py @@ -3,11 +3,37 @@ from ucloud.core.typesystem import schema, fields from ucloud.services.uhost.schemas import models - """ UHost API Schema """ +""" +API: AddUHostToIsolationGroup + + +""" + + +class AddUHostToIsolationGroupRequestSchema(schema.RequestSchema): + """AddUHostToIsolationGroup -""" + + fields = { + "GroupId": fields.Str(required=True, dump_to="GroupId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UHostId": fields.Str(required=True, dump_to="UHostId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class AddUHostToIsolationGroupResponseSchema(schema.ResponseSchema): + """AddUHostToIsolationGroup -""" + + fields = { + "UHostId": fields.Str(required=False, load_from="UHostId"), + } + + """ API: CopyCustomImage @@ -16,8 +42,7 @@ class CopyCustomImageRequestSchema(schema.RequestSchema): - """ CopyCustomImage - 复制自制镜像 - """ + """CopyCustomImage - 复制自制镜像""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -29,18 +54,23 @@ class CopyCustomImageRequestSchema(schema.RequestSchema): "TargetImageName": fields.Str( required=False, dump_to="TargetImageName" ), + "TargetImageTag": fields.Str(required=False, dump_to="TargetImageTag"), "TargetProjectId": fields.Str(required=True, dump_to="TargetProjectId"), "TargetRegion": fields.Str(required=False, dump_to="TargetRegion"), + "TargetRegionList": fields.List(fields.Str()), "Zone": fields.Str(required=False, dump_to="Zone"), } class CopyCustomImageResponseSchema(schema.ResponseSchema): - """ CopyCustomImage - 复制自制镜像 - """ + """CopyCustomImage - 复制自制镜像""" fields = { - "TargetImageId": fields.Str(required=False, load_from="TargetImageId") + "Infos": fields.List( + models.CopyImageTaskInfoSchema(), required=False, load_from="Infos" + ), + "TargetImageId": fields.Str(required=False, load_from="TargetImageId"), + "TaskId": fields.Str(required=False, load_from="TaskId"), } @@ -52,26 +82,57 @@ class CopyCustomImageResponseSchema(schema.ResponseSchema): class CreateCustomImageRequestSchema(schema.RequestSchema): - """ CreateCustomImage - 从指定UHost实例,生成自定义镜像。 - """ + """CreateCustomImage - 从指定UHost实例,生成自定义镜像。""" fields = { + "DataUDiskIds": fields.List(fields.Str()), "ImageDescription": fields.Str( required=False, dump_to="ImageDescription" ), "ImageName": fields.Str(required=True, dump_to="ImageName"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), + "Tag": fields.Str(required=False, dump_to="Tag"), "UHostId": fields.Str(required=True, dump_to="UHostId"), "Zone": fields.Str(required=False, dump_to="Zone"), } class CreateCustomImageResponseSchema(schema.ResponseSchema): - """ CreateCustomImage - 从指定UHost实例,生成自定义镜像。 - """ + """CreateCustomImage - 从指定UHost实例,生成自定义镜像。""" - fields = {"ImageId": fields.Str(required=False, load_from="ImageId")} + fields = { + "DataSnapshotIds": fields.List( + fields.Str(), required=False, load_from="DataSnapshotIds" + ), + "ImageId": fields.Str(required=False, load_from="ImageId"), + } + + +""" +API: CreateIsolationGroup + +创建硬件隔离组,组内机器严格隔离在不同宿主机上。 +""" + + +class CreateIsolationGroupRequestSchema(schema.RequestSchema): + """CreateIsolationGroup - 创建硬件隔离组,组内机器严格隔离在不同宿主机上。""" + + fields = { + "GroupName": fields.Str(required=True, dump_to="GroupName"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + } + + +class CreateIsolationGroupResponseSchema(schema.ResponseSchema): + """CreateIsolationGroup - 创建硬件隔离组,组内机器严格隔离在不同宿主机上。""" + + fields = { + "GroupId": fields.Str(required=True, load_from="GroupId"), + } """ @@ -81,41 +142,76 @@ class CreateCustomImageResponseSchema(schema.ResponseSchema): """ -class CreateUHostInstanceParamNetworkInterfaceEIPGlobalSSHSchema( - schema.RequestSchema -): - """ CreateUHostInstanceParamNetworkInterfaceEIPGlobalSSH - - """ +class CreateUHostInstanceParamSecGroupIdSchema(schema.RequestSchema): + """CreateUHostInstanceParamSecGroupId -""" fields = { - "Area": fields.Str(required=False, dump_to="Area"), - "AreaCode": fields.Str(required=False, dump_to="AreaCode"), - "Port": fields.Int(required=False, dump_to="Port"), + "Id": fields.Str(required=False, dump_to="Id"), + "Priority": fields.Int(required=False, dump_to="Priority"), + } + + +class CreateUHostInstanceParamDisksCustomBackupSchema(schema.RequestSchema): + """CreateUHostInstanceParamDisksCustomBackup -""" + + fields = { + "Day": fields.Str(required=False, dump_to="Day"), + "Hour": fields.Str(required=False, dump_to="Hour"), + "Journal": fields.Str(required=False, dump_to="Journal"), + } + + +class CreateUHostInstanceParamDisksSchema(schema.RequestSchema): + """CreateUHostInstanceParamDisks -""" + + fields = { + "BackupMode": fields.Str(required=False, dump_to="BackupMode"), + "BackupType": fields.Str(required=False, dump_to="BackupType"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "CustomBackup": CreateUHostInstanceParamDisksCustomBackupSchema( + required=False, dump_to="CustomBackup" + ), + "Encrypted": fields.Bool(required=False, dump_to="Encrypted"), + "IsBoot": fields.Str(required=True, dump_to="IsBoot"), + "KmsKeyId": fields.Str(required=False, dump_to="KmsKeyId"), + "Size": fields.Int(required=True, dump_to="Size"), + "SnapshotId": fields.Str(required=False, dump_to="SnapshotId"), + "Type": fields.Str(required=True, dump_to="Type"), } class CreateUHostInstanceParamNetworkInterfaceIPv6Schema(schema.RequestSchema): - """ CreateUHostInstanceParamNetworkInterfaceIPv6 - - """ + """CreateUHostInstanceParamNetworkInterfaceIPv6 -""" fields = { - "Adress": fields.Str(required=False, dump_to="Adress"), + "Address": fields.Str(required=False, dump_to="Address"), "ShareBandwidthId": fields.Str( required=False, dump_to="ShareBandwidthId" - ), + ), # Deprecated, will be removed at 1.0 + } + + +class CreateUHostInstanceParamNetworkInterfaceEIPGlobalSSHSchema( + schema.RequestSchema +): + """CreateUHostInstanceParamNetworkInterfaceEIPGlobalSSH -""" + + fields = { + "Area": fields.Str(required=False, dump_to="Area"), + "AreaCode": fields.Str(required=False, dump_to="AreaCode"), + "Port": fields.Int(required=False, dump_to="Port"), } class CreateUHostInstanceParamNetworkInterfaceEIPSchema(schema.RequestSchema): - """ CreateUHostInstanceParamNetworkInterfaceEIP - - """ + """CreateUHostInstanceParamNetworkInterfaceEIP -""" fields = { "Bandwidth": fields.Int(required=False, dump_to="Bandwidth"), "CouponId": fields.Str(required=False, dump_to="CouponId"), "GlobalSSH": CreateUHostInstanceParamNetworkInterfaceEIPGlobalSSHSchema( required=False, dump_to="GlobalSSH" - ), + ), # Deprecated, will be removed at 1.0 "OperatorName": fields.Str(required=False, dump_to="OperatorName"), "PayMode": fields.Str(required=False, dump_to="PayMode"), "ShareBandwidthId": fields.Str( @@ -125,10 +221,10 @@ class CreateUHostInstanceParamNetworkInterfaceEIPSchema(schema.RequestSchema): class CreateUHostInstanceParamNetworkInterfaceSchema(schema.RequestSchema): - """ CreateUHostInstanceParamNetworkInterface - - """ + """CreateUHostInstanceParamNetworkInterface -""" fields = { + "CreateCernetIp": fields.Bool(required=False, dump_to="CreateCernetIp"), "EIP": CreateUHostInstanceParamNetworkInterfaceEIPSchema( required=False, dump_to="EIP" ), @@ -138,86 +234,139 @@ class CreateUHostInstanceParamNetworkInterfaceSchema(schema.RequestSchema): } -class CreateUHostInstanceParamDisksSchema(schema.RequestSchema): - """ CreateUHostInstanceParamDisks - - """ +class CreateUHostInstanceParamLabelsSchema(schema.RequestSchema): + """CreateUHostInstanceParamLabels -""" fields = { - "BackupType": fields.Str(required=False, dump_to="BackupType"), - "CouponId": fields.Str(required=False, dump_to="CouponId"), - "Encrypted": fields.Bool(required=False, dump_to="Encrypted"), - "IsBoot": fields.Str(required=True, dump_to="IsBoot"), - "KmsKeyId": fields.Str(required=False, dump_to="KmsKeyId"), - "Size": fields.Int(required=True, dump_to="Size"), - "Type": fields.Str(required=True, dump_to="Type"), + "Key": fields.Str(required=False, dump_to="Key"), + "Value": fields.Str(required=False, dump_to="Value"), + } + + +class CreateUHostInstanceParamVolumesSchema(schema.RequestSchema): + """CreateUHostInstanceParamVolumes -""" + + fields = {} + + +class CreateUHostInstanceParamFeaturesSchema(schema.RequestSchema): + """CreateUHostInstanceParamFeatures -""" + + fields = { + "UNI": fields.Bool(required=False, dump_to="UNI"), } class CreateUHostInstanceRequestSchema(schema.RequestSchema): - """ CreateUHostInstance - 创建UHost实例。 - """ + """CreateUHostInstance - 创建UHost实例。""" fields = { "AlarmTemplateId": fields.Int( required=False, dump_to="AlarmTemplateId" ), - "BootDiskSpace": fields.Int(required=False, dump_to="BootDiskSpace"), + "AutoDataDiskInit": fields.Str( + required=False, dump_to="AutoDataDiskInit" + ), + "BootDiskSpace": fields.Int( + required=False, dump_to="BootDiskSpace" + ), # Deprecated, will be removed at 1.0 "CPU": fields.Int(required=False, dump_to="CPU"), "ChargeType": fields.Str(required=False, dump_to="ChargeType"), "CouponId": fields.Str(required=False, dump_to="CouponId"), - "DiskPassword": fields.Str(required=False, dump_to="DiskPassword"), - "DiskSpace": fields.Int(required=False, dump_to="DiskSpace"), + "DiskPassword": fields.Str( + required=False, dump_to="DiskPassword" + ), # Deprecated, will be removed at 1.0 + "DiskSpace": fields.Int( + required=False, dump_to="DiskSpace" + ), # Deprecated, will be removed at 1.0 "Disks": fields.List(CreateUHostInstanceParamDisksSchema()), + "Features": CreateUHostInstanceParamFeaturesSchema( + required=False, dump_to="Features" + ), "GPU": fields.Int(required=False, dump_to="GPU"), "GpuType": fields.Str(required=False, dump_to="GpuType"), - "HostIp": fields.Str(required=False, dump_to="HostIp"), - "HostType": fields.Str(required=False, dump_to="HostType"), + "HostBinding": fields.Bool(required=False, dump_to="HostBinding"), + "HostIp": fields.Str( + required=False, dump_to="HostIp" + ), # Deprecated, will be removed at 1.0 + "HostType": fields.Str( + required=False, dump_to="HostType" + ), # Deprecated, will be removed at 1.0 "HotplugFeature": fields.Bool(required=False, dump_to="HotplugFeature"), + "HpcEnhanced": fields.Bool( + required=False, dump_to="HpcEnhanced" + ), # Deprecated, will be removed at 1.0 "ImageId": fields.Str(required=True, dump_to="ImageId"), - "InstallAgent": fields.Str(required=False, dump_to="InstallAgent"), + "InstallAgent": fields.Str( + required=False, dump_to="InstallAgent" + ), # Deprecated, will be removed at 1.0 "IsolationGroup": fields.Str(required=False, dump_to="IsolationGroup"), - "KeyPair": fields.Str(required=False, dump_to="KeyPair"), + "KeyPair": fields.Str( + required=False, dump_to="KeyPair" + ), # Deprecated, will be removed at 1.0 + "KeyPairId": fields.Str(required=False, dump_to="KeyPairId"), + "Labels": fields.List(CreateUHostInstanceParamLabelsSchema()), "LoginMode": fields.Str(required=True, dump_to="LoginMode"), "MachineType": fields.Str(required=False, dump_to="MachineType"), "MaxCount": fields.Int(required=False, dump_to="MaxCount"), "Memory": fields.Int(required=False, dump_to="Memory"), + "MinCount": fields.Int(required=False, dump_to="MinCount"), "MinimalCpuPlatform": fields.Str( required=False, dump_to="MinimalCpuPlatform" ), "Name": fields.Str(required=False, dump_to="Name"), "NetCapability": fields.Str(required=False, dump_to="NetCapability"), - "NetworkId": fields.Str(required=False, dump_to="NetworkId"), + "NetworkId": fields.Str( + required=False, dump_to="NetworkId" + ), # Deprecated, will be removed at 1.0 "NetworkInterface": fields.List( CreateUHostInstanceParamNetworkInterfaceSchema() ), - "Password": fields.Base64(required=True, dump_to="Password"), + "Password": fields.Base64(required=False, dump_to="Password"), "PrivateIp": fields.List(fields.Str()), - "PrivateMac": fields.Str(required=False, dump_to="PrivateMac"), + "PrivateMac": fields.Str( + required=False, dump_to="PrivateMac" + ), # Deprecated, will be removed at 1.0 "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Quantity": fields.Int(required=False, dump_to="Quantity"), "Region": fields.Str(required=True, dump_to="Region"), - "ResourceType": fields.Int(required=False, dump_to="ResourceType"), + "ResourceType": fields.Str( + required=False, dump_to="ResourceType" + ), # Deprecated, will be removed at 1.0 + "RestrictMode": fields.Str( + required=False, dump_to="RestrictMode" + ), # Deprecated, will be removed at 1.0 + "SecGroupId": fields.List(CreateUHostInstanceParamSecGroupIdSchema()), "SecurityGroupId": fields.Str( required=False, dump_to="SecurityGroupId" ), - "SetId": fields.Int(required=False, dump_to="SetId"), - "StorageType": fields.Str(required=False, dump_to="StorageType"), + "SecurityMode": fields.Str(required=False, dump_to="SecurityMode"), + "SetId": fields.Int( + required=False, dump_to="SetId" + ), # Deprecated, will be removed at 1.0 + "StorageType": fields.Str( + required=False, dump_to="StorageType" + ), # Deprecated, will be removed at 1.0 "SubnetId": fields.Str(required=False, dump_to="SubnetId"), "Tag": fields.Str(required=False, dump_to="Tag"), "TimemachineFeature": fields.Str( required=False, dump_to="TimemachineFeature" - ), + ), # Deprecated, will be removed at 1.0 + "UDHostId": fields.Str(required=False, dump_to="UDHostId"), + "UDSetId": fields.Str(required=False, dump_to="UDSetId"), + "UHostFamily": fields.Str(required=False, dump_to="UHostFamily"), "UHostType": fields.Str(required=False, dump_to="UHostType"), "UserData": fields.Str(required=False, dump_to="UserData"), - "UserDataScript": fields.Str(required=False, dump_to="UserDataScript"), + "UserDataScript": fields.Str( + required=False, dump_to="UserDataScript" + ), # Deprecated, will be removed at 1.0 "VPCId": fields.Str(required=False, dump_to="VPCId"), "Zone": fields.Str(required=True, dump_to="Zone"), } class CreateUHostInstanceResponseSchema(schema.ResponseSchema): - """ CreateUHostInstance - 创建UHost实例。 - """ + """CreateUHostInstance - 创建UHost实例。""" fields = { "IPs": fields.List(fields.Str(), required=False, load_from="IPs"), @@ -227,6 +376,112 @@ class CreateUHostInstanceResponseSchema(schema.ResponseSchema): } +""" +API: CreateUHostKeyPair + +创建主机密钥对信息 +""" + + +class CreateUHostKeyPairRequestSchema(schema.RequestSchema): + """CreateUHostKeyPair - 创建主机密钥对信息""" + + fields = { + "KeyPairName": fields.Str(required=True, dump_to="KeyPairName"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class CreateUHostKeyPairResponseSchema(schema.ResponseSchema): + """CreateUHostKeyPair - 创建主机密钥对信息""" + + fields = { + "KeyPair": models.KeyPairSchema(), + } + + +""" +API: DeleteIsolationGroup + +删除硬件隔离组。 +""" + + +class DeleteIsolationGroupRequestSchema(schema.RequestSchema): + """DeleteIsolationGroup - 删除硬件隔离组。""" + + fields = { + "GroupId": fields.Str(required=True, dump_to="GroupId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DeleteIsolationGroupResponseSchema(schema.ResponseSchema): + """DeleteIsolationGroup - 删除硬件隔离组。""" + + fields = { + "GroupId": fields.Str(required=True, load_from="GroupId"), + } + + +""" +API: DeleteUHostKeyPairs + +删除一对或者多对密钥对。 +""" + + +class DeleteUHostKeyPairsRequestSchema(schema.RequestSchema): + """DeleteUHostKeyPairs - 删除一对或者多对密钥对。""" + + fields = { + "KeyPairIds": fields.List(fields.Str()), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DeleteUHostKeyPairsResponseSchema(schema.ResponseSchema): + """DeleteUHostKeyPairs - 删除一对或者多对密钥对。""" + + fields = {} + + +""" +API: DescribeAvailableInstanceTypes + +DescribeAvailableInstanceTypes +""" + + +class DescribeAvailableInstanceTypesRequestSchema(schema.RequestSchema): + """DescribeAvailableInstanceTypes - DescribeAvailableInstanceTypes""" + + fields = { + "MachineTypes": fields.List(fields.Str()), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DescribeAvailableInstanceTypesResponseSchema(schema.ResponseSchema): + """DescribeAvailableInstanceTypes - DescribeAvailableInstanceTypes""" + + fields = { + "AvailableInstanceTypes": fields.List( + models.AvailableInstanceTypesSchema(), + required=True, + load_from="AvailableInstanceTypes", + ), + "Status": fields.Str(required=False, load_from="Status"), + } + + """ API: DescribeImage @@ -235,11 +490,12 @@ class CreateUHostInstanceResponseSchema(schema.ResponseSchema): class DescribeImageRequestSchema(schema.RequestSchema): - """ DescribeImage - 获取指定数据中心镜像列表,用户可通过指定操作系统类型,镜像Id进行过滤。 - """ + """DescribeImage - 获取指定数据中心镜像列表,用户可通过指定操作系统类型,镜像Id进行过滤。""" fields = { + "FuncType": fields.Str(required=False, dump_to="FuncType"), "ImageId": fields.Str(required=False, dump_to="ImageId"), + "ImageIds": fields.List(fields.Str()), "ImageType": fields.Str(required=False, dump_to="ImageType"), "Limit": fields.Int(required=False, dump_to="Limit"), "Offset": fields.Int(required=False, dump_to="Offset"), @@ -247,13 +503,13 @@ class DescribeImageRequestSchema(schema.RequestSchema): "PriceSet": fields.Int(required=False, dump_to="PriceSet"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), + "Tag": fields.Str(required=False, dump_to="Tag"), "Zone": fields.Str(required=False, dump_to="Zone"), } class DescribeImageResponseSchema(schema.ResponseSchema): - """ DescribeImage - 获取指定数据中心镜像列表,用户可通过指定操作系统类型,镜像Id进行过滤。 - """ + """DescribeImage - 获取指定数据中心镜像列表,用户可通过指定操作系统类型,镜像Id进行过滤。""" fields = { "ImageSet": fields.List( @@ -271,8 +527,7 @@ class DescribeImageResponseSchema(schema.ResponseSchema): class DescribeIsolationGroupRequestSchema(schema.RequestSchema): - """ DescribeIsolationGroup - 查询硬件隔离组列表。 - """ + """DescribeIsolationGroup - 查询硬件隔离组列表。""" fields = { "GroupId": fields.Str(required=False, dump_to="GroupId"), @@ -284,15 +539,15 @@ class DescribeIsolationGroupRequestSchema(schema.RequestSchema): class DescribeIsolationGroupResponseSchema(schema.ResponseSchema): - """ DescribeIsolationGroup - 查询硬件隔离组列表。 - """ + """DescribeIsolationGroup - 查询硬件隔离组列表。""" fields = { "IsolationGroupSet": fields.List( models.IsolationGroupSchema(), required=False, load_from="IsolationGroupSet", - ) + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), } @@ -304,18 +559,22 @@ class DescribeIsolationGroupResponseSchema(schema.ResponseSchema): class DescribeUHostInstanceRequestSchema(schema.RequestSchema): - """ DescribeUHostInstance - 获取主机或主机列表信息,并可根据数据中心,主机ID等参数进行过滤。 - """ + """DescribeUHostInstance - 获取主机或主机列表信息,并可根据数据中心,主机ID等参数进行过滤。""" fields = { "IsolationGroup": fields.Str(required=False, dump_to="IsolationGroup"), - "LifeCycle": fields.Int(required=False, dump_to="LifeCycle"), + "LifeCycle": fields.Int( + required=False, dump_to="LifeCycle" + ), # Deprecated, will be removed at 1.0 "Limit": fields.Int(required=False, dump_to="Limit"), "Offset": fields.Int(required=False, dump_to="Offset"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "SubnetId": fields.Str(required=False, dump_to="SubnetId"), "Tag": fields.Str(required=False, dump_to="Tag"), + "UDiskIdForAttachment": fields.Str( + required=False, dump_to="UDiskIdForAttachment" + ), "UHostIds": fields.List(fields.Str()), "VPCId": fields.Str(required=False, dump_to="VPCId"), "Zone": fields.Str(required=False, dump_to="Zone"), @@ -323,17 +582,12 @@ class DescribeUHostInstanceRequestSchema(schema.RequestSchema): class DescribeUHostInstanceResponseSchema(schema.ResponseSchema): - """ DescribeUHostInstance - 获取主机或主机列表信息,并可根据数据中心,主机ID等参数进行过滤。 - """ + """DescribeUHostInstance - 获取主机或主机列表信息,并可根据数据中心,主机ID等参数进行过滤。""" fields = { - "Action": fields.Str(required=True, load_from="Action"), - "RetCode": fields.Int(required=True, load_from="RetCode"), - "TotalCount": fields.Int(required=False, load_from="TotalCount"), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), "UHostSet": fields.List( - models.UHostInstanceSetSchema(), - required=False, - load_from="UHostSet", + models.UHostInstanceSetSchema(), required=True, load_from="UHostSet" ), } @@ -341,13 +595,12 @@ class DescribeUHostInstanceResponseSchema(schema.ResponseSchema): """ API: DescribeUHostInstanceSnapshot -获取已经存在的UHost实例的存储快照列表。 + """ class DescribeUHostInstanceSnapshotRequestSchema(schema.RequestSchema): - """ DescribeUHostInstanceSnapshot - 获取已经存在的UHost实例的存储快照列表。 - """ + """DescribeUHostInstanceSnapshot -""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -358,8 +611,7 @@ class DescribeUHostInstanceSnapshotRequestSchema(schema.RequestSchema): class DescribeUHostInstanceSnapshotResponseSchema(schema.ResponseSchema): - """ DescribeUHostInstanceSnapshot - 获取已经存在的UHost实例的存储快照列表。 - """ + """DescribeUHostInstanceSnapshot -""" fields = { "SnapshotSet": fields.List( @@ -371,6 +623,40 @@ class DescribeUHostInstanceSnapshotResponseSchema(schema.ResponseSchema): } +""" +API: DescribeUHostKeyPairs + +查询一个或多个密钥对。 +""" + + +class DescribeUHostKeyPairsRequestSchema(schema.RequestSchema): + """DescribeUHostKeyPairs - 查询一个或多个密钥对。""" + + fields = { + "KeyPairFingerPrint": fields.Str( + required=False, dump_to="KeyPairFingerPrint" + ), + "KeyPairName": fields.Str(required=False, dump_to="KeyPairName"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DescribeUHostKeyPairsResponseSchema(schema.ResponseSchema): + """DescribeUHostKeyPairs - 查询一个或多个密钥对。""" + + fields = { + "KeyPairs": fields.List( + models.KeyPairDescSchema(), required=True, load_from="KeyPairs" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + """ API: DescribeUHostTags @@ -379,8 +665,7 @@ class DescribeUHostInstanceSnapshotResponseSchema(schema.ResponseSchema): class DescribeUHostTagsRequestSchema(schema.RequestSchema): - """ DescribeUHostTags - 获取指定数据中心的业务组列表。 - """ + """DescribeUHostTags - 获取指定数据中心的业务组列表。""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -390,8 +675,7 @@ class DescribeUHostTagsRequestSchema(schema.RequestSchema): class DescribeUHostTagsResponseSchema(schema.ResponseSchema): - """ DescribeUHostTags - 获取指定数据中心的业务组列表。 - """ + """DescribeUHostTags - 获取指定数据中心的业务组列表。""" fields = { "TagSet": fields.List( @@ -401,6 +685,42 @@ class DescribeUHostTagsResponseSchema(schema.ResponseSchema): } +""" +API: GetAttachedDiskUpgradePrice + +获取挂载磁盘的升级价格 +""" + + +class GetAttachedDiskUpgradePriceRequestSchema(schema.RequestSchema): + """GetAttachedDiskUpgradePrice - 获取挂载磁盘的升级价格""" + + fields = { + "BackupMode": fields.Str(required=False, dump_to="BackupMode"), + "DiskId": fields.Str(required=True, dump_to="DiskId"), + "DiskSpace": fields.Int(required=True, dump_to="DiskSpace"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UHostId": fields.Str(required=True, dump_to="UHostId"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class GetAttachedDiskUpgradePriceResponseSchema(schema.ResponseSchema): + """GetAttachedDiskUpgradePrice - 获取挂载磁盘的升级价格""" + + fields = { + "ListPrice": fields.Float(required=False, load_from="ListPrice"), + "ListPriceDetail": models.DiskUpgradePriceDetailSchema(), + "OriginalPrice": fields.Float( + required=False, load_from="OriginalPrice" + ), + "OriginalPriceDetail": models.DiskUpgradePriceDetailSchema(), + "Price": fields.Float(required=False, load_from="Price"), + "PriceDetail": models.DiskUpgradePriceDetailSchema(), + } + + """ API: GetUHostInstancePrice @@ -408,9 +728,14 @@ class DescribeUHostTagsResponseSchema(schema.ResponseSchema): """ +class GetUHostInstancePriceParamVolumesSchema(schema.RequestSchema): + """GetUHostInstancePriceParamVolumes -""" + + fields = {} + + class GetUHostInstancePriceParamDisksSchema(schema.RequestSchema): - """ GetUHostInstancePriceParamDisks - - """ + """GetUHostInstancePriceParamDisks -""" fields = { "BackupType": fields.Str(required=False, dump_to="BackupType"), @@ -421,42 +746,54 @@ class GetUHostInstancePriceParamDisksSchema(schema.RequestSchema): class GetUHostInstancePriceRequestSchema(schema.RequestSchema): - """ GetUHostInstancePrice - 根据UHost实例配置,获取UHost实例的价格。 - """ + """GetUHostInstancePrice - 根据UHost实例配置,获取UHost实例的价格。""" fields = { "CPU": fields.Int(required=True, dump_to="CPU"), "ChargeType": fields.Str(required=False, dump_to="ChargeType"), "Count": fields.Int(required=True, dump_to="Count"), - "DiskSpace": fields.Int(required=False, dump_to="DiskSpace"), + "CpuPlatform": fields.Str(required=False, dump_to="CpuPlatform"), + "DiskSpace": fields.Int( + required=False, dump_to="DiskSpace" + ), # Deprecated, will be removed at 1.0 "Disks": fields.List(GetUHostInstancePriceParamDisksSchema()), "GPU": fields.Int(required=False, dump_to="GPU"), "GpuType": fields.Str(required=False, dump_to="GpuType"), - "ImageId": fields.Str(required=True, dump_to="ImageId"), - "LifeCycle": fields.Int(required=False, dump_to="LifeCycle"), + "ImageId": fields.Str(required=False, dump_to="ImageId"), + "LifeCycle": fields.Int( + required=False, dump_to="LifeCycle" + ), # Deprecated, will be removed at 1.0 "MachineType": fields.Str(required=False, dump_to="MachineType"), "Memory": fields.Int(required=True, dump_to="Memory"), "NetCapability": fields.Str(required=False, dump_to="NetCapability"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Quantity": fields.Int(required=False, dump_to="Quantity"), "Region": fields.Str(required=True, dump_to="Region"), - "StorageType": fields.Str(required=False, dump_to="StorageType"), + "ShowPriceDetails": fields.Bool( + required=False, dump_to="ShowPriceDetails" + ), + "StorageType": fields.Str( + required=False, dump_to="StorageType" + ), # Deprecated, will be removed at 1.0 "TimemachineFeature": fields.Str( required=False, dump_to="TimemachineFeature" + ), # Deprecated, will be removed at 1.0 + "UDSetUHostInstance": fields.Bool( + required=False, dump_to="UDSetUHostInstance" ), + "UHostFamily": fields.Str(required=False, dump_to="UHostFamily"), "UHostType": fields.Str(required=False, dump_to="UHostType"), "Zone": fields.Str(required=False, dump_to="Zone"), } class GetUHostInstancePriceResponseSchema(schema.ResponseSchema): - """ GetUHostInstancePrice - 根据UHost实例配置,获取UHost实例的价格。 - """ + """GetUHostInstancePrice - 根据UHost实例配置,获取UHost实例的价格。""" fields = { "PriceSet": fields.List( models.UHostPriceSetSchema(), required=False, load_from="PriceSet" - ) + ), } @@ -468,8 +805,7 @@ class GetUHostInstancePriceResponseSchema(schema.ResponseSchema): class GetUHostInstanceVncInfoRequestSchema(schema.RequestSchema): - """ GetUHostInstanceVncInfo - 获取指定UHost实例的管理VNC配置详细信息。 - """ + """GetUHostInstanceVncInfo - 获取指定UHost实例的管理VNC配置详细信息。""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -480,17 +816,76 @@ class GetUHostInstanceVncInfoRequestSchema(schema.RequestSchema): class GetUHostInstanceVncInfoResponseSchema(schema.ResponseSchema): - """ GetUHostInstanceVncInfo - 获取指定UHost实例的管理VNC配置详细信息。 - """ + """GetUHostInstanceVncInfo - 获取指定UHost实例的管理VNC配置详细信息。""" fields = { - "UhostId": fields.Str(required=False, load_from="UhostId"), + "UHostId": fields.Str(required=False, load_from="UHostId"), + "UhostId": fields.Str( + required=False, load_from="UhostId" + ), # Deprecated, will be removed at 1.0 "VncIP": fields.Str(required=False, load_from="VncIP"), "VncPassword": fields.Str(required=False, load_from="VncPassword"), "VncPort": fields.Int(required=False, load_from="VncPort"), } +""" +API: GetUHostRefundPrice + +获取主机删除扣除费用。包括主机、磁盘、快照服务、EIP等资源的费用 +""" + + +class GetUHostRefundPriceRequestSchema(schema.RequestSchema): + """GetUHostRefundPrice - 获取主机删除扣除费用。包括主机、磁盘、快照服务、EIP等资源的费用""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UHostIds": fields.List(fields.Str()), + } + + +class GetUHostRefundPriceResponseSchema(schema.ResponseSchema): + """GetUHostRefundPrice - 获取主机删除扣除费用。包括主机、磁盘、快照服务、EIP等资源的费用""" + + fields = { + "RefundPriceSet": fields.List( + models.UHostRefundPriceSetSchema(), + required=True, + load_from="RefundPriceSet", + ), + } + + +""" +API: GetUHostRenewPrice + +获取主机续费价格 +""" + + +class GetUHostRenewPriceRequestSchema(schema.RequestSchema): + """GetUHostRenewPrice - 获取主机续费价格""" + + fields = { + "ChargeType": fields.Str(required=True, dump_to="ChargeType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UHostId": fields.Str(required=True, dump_to="UHostId"), + } + + +class GetUHostRenewPriceResponseSchema(schema.ResponseSchema): + """GetUHostRenewPrice - 获取主机续费价格""" + + fields = { + "PriceSet": fields.List( + models.BasePriceSetSchema(), required=False, load_from="PriceSet" + ), + } + + """ API: GetUHostUpgradePrice @@ -499,31 +894,41 @@ class GetUHostInstanceVncInfoResponseSchema(schema.ResponseSchema): class GetUHostUpgradePriceRequestSchema(schema.RequestSchema): - """ GetUHostUpgradePrice - 获取UHost实例升级配置的价格。可选配置范围请参考[[api:uhost-api:uhost_type|云主机机型说明]]。 - """ + """GetUHostUpgradePrice - 获取UHost实例升级配置的价格。可选配置范围请参考[[api:uhost-api:uhost_type|云主机机型说明]]。""" fields = { - "BootDiskSpace": fields.Int(required=False, dump_to="BootDiskSpace"), + "BootDiskSpace": fields.Int( + required=False, dump_to="BootDiskSpace" + ), # Deprecated, will be removed at 1.0 "CPU": fields.Int(required=False, dump_to="CPU"), - "DiskSpace": fields.Int(required=False, dump_to="DiskSpace"), - "HostType": fields.Str(required=False, dump_to="HostType"), + "DiskSpace": fields.Int( + required=False, dump_to="DiskSpace" + ), # Deprecated, will be removed at 1.0 + "GPU": fields.Int(required=False, dump_to="GPU"), + "HostType": fields.Str( + required=False, dump_to="HostType" + ), # Deprecated, will be removed at 1.0 "Memory": fields.Int(required=False, dump_to="Memory"), "NetCapValue": fields.Int(required=False, dump_to="NetCapValue"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "TimemachineFeature": fields.Str( required=False, dump_to="TimemachineFeature" - ), + ), # Deprecated, will be removed at 1.0 "UHostId": fields.Str(required=True, dump_to="UHostId"), "Zone": fields.Str(required=False, dump_to="Zone"), } class GetUHostUpgradePriceResponseSchema(schema.ResponseSchema): - """ GetUHostUpgradePrice - 获取UHost实例升级配置的价格。可选配置范围请参考[[api:uhost-api:uhost_type|云主机机型说明]]。 - """ + """GetUHostUpgradePrice - 获取UHost实例升级配置的价格。可选配置范围请参考[[api:uhost-api:uhost_type|云主机机型说明]]。""" - fields = {"Price": fields.Float(required=False, load_from="Price")} + fields = { + "OriginalPrice": fields.Float( + required=False, load_from="OriginalPrice" + ), + "Price": fields.Float(required=False, load_from="Price"), + } """ @@ -534,8 +939,7 @@ class GetUHostUpgradePriceResponseSchema(schema.ResponseSchema): class ImportCustomImageRequestSchema(schema.RequestSchema): - """ ImportCustomImage - 把UFile的镜像文件导入到UHost,生成自定义镜像 - """ + """ImportCustomImage - 把UFile的镜像文件导入到UHost,生成自定义镜像""" fields = { "Auth": fields.Bool(required=True, dump_to="Auth"), @@ -548,15 +952,108 @@ class ImportCustomImageRequestSchema(schema.RequestSchema): "OsType": fields.Str(required=True, dump_to="OsType"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), + "Tag": fields.Str(required=False, dump_to="Tag"), "UFileUrl": fields.Str(required=True, dump_to="UFileUrl"), } class ImportCustomImageResponseSchema(schema.ResponseSchema): - """ ImportCustomImage - 把UFile的镜像文件导入到UHost,生成自定义镜像 - """ + """ImportCustomImage - 把UFile的镜像文件导入到UHost,生成自定义镜像""" + + fields = { + "ImageId": fields.Str(required=False, load_from="ImageId"), + } + + +""" +API: ImportUHostKeyPairs + +导入密钥对后,仅保管公钥部分,需自行妥善保存密钥对的私钥部分。 +""" + - fields = {"ImageId": fields.Str(required=False, load_from="ImageId")} +class ImportUHostKeyPairsRequestSchema(schema.RequestSchema): + """ImportUHostKeyPairs - 导入密钥对后,仅保管公钥部分,需自行妥善保存密钥对的私钥部分。""" + + fields = { + "KeyPairName": fields.Str(required=True, dump_to="KeyPairName"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "PublicKeyBody": fields.Str(required=True, dump_to="PublicKeyBody"), + "Region": fields.Str(required=False, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class ImportUHostKeyPairsResponseSchema(schema.ResponseSchema): + """ImportUHostKeyPairs - 导入密钥对后,仅保管公钥部分,需自行妥善保存密钥对的私钥部分。""" + + fields = { + "KeyPairFingerPrint": fields.Str( + required=False, load_from="KeyPairFingerPrint" + ), + "KeyPairId": fields.Str(required=False, load_from="KeyPairId"), + "KeyPairName": fields.Str(required=True, load_from="KeyPairName"), + } + + +""" +API: LeaveIsolationGroup + +移除硬件隔离组中的主机 +""" + + +class LeaveIsolationGroupRequestSchema(schema.RequestSchema): + """LeaveIsolationGroup - 移除硬件隔离组中的主机""" + + fields = { + "GroupId": fields.Str(required=True, dump_to="GroupId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UHostId": fields.Str(required=True, dump_to="UHostId"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class LeaveIsolationGroupResponseSchema(schema.ResponseSchema): + """LeaveIsolationGroup - 移除硬件隔离组中的主机""" + + fields = { + "UHostId": fields.Str(required=True, load_from="UHostId"), + } + + +""" +API: ModifyUHostIP + +修改云主机内网 IP 地址 +""" + + +class ModifyUHostIPRequestSchema(schema.RequestSchema): + """ModifyUHostIP - 修改云主机内网 IP 地址""" + + fields = { + "PresentIpAddress": fields.Str( + required=True, dump_to="PresentIpAddress" + ), + "PreviousIpAddress": fields.Str( + required=False, dump_to="PreviousIpAddress" + ), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UHostId": fields.Str(required=True, dump_to="UHostId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ModifyUHostIPResponseSchema(schema.ResponseSchema): + """ModifyUHostIP - 修改云主机内网 IP 地址""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + "UHostId": fields.Str(required=False, load_from="UHostId"), + } """ @@ -567,8 +1064,7 @@ class ImportCustomImageResponseSchema(schema.ResponseSchema): class ModifyUHostInstanceNameRequestSchema(schema.RequestSchema): - """ ModifyUHostInstanceName - 修改指定UHost实例名称,需要给出数据中心,UHostId,及新的实例名称。 - """ + """ModifyUHostInstanceName - 修改指定UHost实例名称,需要给出数据中心,UHostId,及新的实例名称。""" fields = { "Name": fields.Str(required=False, dump_to="Name"), @@ -580,10 +1076,14 @@ class ModifyUHostInstanceNameRequestSchema(schema.RequestSchema): class ModifyUHostInstanceNameResponseSchema(schema.ResponseSchema): - """ ModifyUHostInstanceName - 修改指定UHost实例名称,需要给出数据中心,UHostId,及新的实例名称。 - """ + """ModifyUHostInstanceName - 修改指定UHost实例名称,需要给出数据中心,UHostId,及新的实例名称。""" - fields = {"UhostId": fields.Str(required=False, load_from="UhostId")} + fields = { + "UHostId": fields.Str(required=False, load_from="UHostId"), + "UhostId": fields.Str( + required=False, load_from="UhostId" + ), # Deprecated, will be removed at 1.0 + } """ @@ -594,8 +1094,7 @@ class ModifyUHostInstanceNameResponseSchema(schema.ResponseSchema): class ModifyUHostInstanceRemarkRequestSchema(schema.RequestSchema): - """ ModifyUHostInstanceRemark - 修改指定UHost实例备注信息。 - """ + """ModifyUHostInstanceRemark - 修改指定UHost实例备注信息。""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -607,10 +1106,14 @@ class ModifyUHostInstanceRemarkRequestSchema(schema.RequestSchema): class ModifyUHostInstanceRemarkResponseSchema(schema.ResponseSchema): - """ ModifyUHostInstanceRemark - 修改指定UHost实例备注信息。 - """ + """ModifyUHostInstanceRemark - 修改指定UHost实例备注信息。""" - fields = {"UhostId": fields.Str(required=False, load_from="UhostId")} + fields = { + "UHostId": fields.Str(required=False, load_from="UHostId"), + "UhostId": fields.Str( + required=False, load_from="UhostId" + ), # Deprecated, will be removed at 1.0 + } """ @@ -621,8 +1124,7 @@ class ModifyUHostInstanceRemarkResponseSchema(schema.ResponseSchema): class ModifyUHostInstanceTagRequestSchema(schema.RequestSchema): - """ ModifyUHostInstanceTag - 修改指定UHost实例业务组标识。 - """ + """ModifyUHostInstanceTag - 修改指定UHost实例业务组标识。""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -634,10 +1136,14 @@ class ModifyUHostInstanceTagRequestSchema(schema.RequestSchema): class ModifyUHostInstanceTagResponseSchema(schema.ResponseSchema): - """ ModifyUHostInstanceTag - 修改指定UHost实例业务组标识。 - """ + """ModifyUHostInstanceTag - 修改指定UHost实例业务组标识。""" - fields = {"UhostId": fields.Str(required=False, load_from="UhostId")} + fields = { + "UHostId": fields.Str(required=False, load_from="UHostId"), + "UhostId": fields.Str( + required=False, load_from="UhostId" + ), # Deprecated, will be removed at 1.0 + } """ @@ -648,8 +1154,7 @@ class ModifyUHostInstanceTagResponseSchema(schema.ResponseSchema): class PoweroffUHostInstanceRequestSchema(schema.RequestSchema): - """ PoweroffUHostInstance - 直接关闭UHost实例电源,无需等待实例正常关闭。 - """ + """PoweroffUHostInstance - 直接关闭UHost实例电源,无需等待实例正常关闭。""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -660,10 +1165,14 @@ class PoweroffUHostInstanceRequestSchema(schema.RequestSchema): class PoweroffUHostInstanceResponseSchema(schema.ResponseSchema): - """ PoweroffUHostInstance - 直接关闭UHost实例电源,无需等待实例正常关闭。 - """ + """PoweroffUHostInstance - 直接关闭UHost实例电源,无需等待实例正常关闭。""" - fields = {"UhostId": fields.Str(required=False, load_from="UhostId")} + fields = { + "UHostId": fields.Str(required=False, load_from="UHostId"), + "UhostId": fields.Str( + required=False, load_from="UhostId" + ), # Deprecated, will be removed at 1.0 + } """ @@ -674,8 +1183,7 @@ class PoweroffUHostInstanceResponseSchema(schema.ResponseSchema): class RebootUHostInstanceRequestSchema(schema.RequestSchema): - """ RebootUHostInstance - 重新启动UHost实例,需要指定数据中心及UHostID两个参数的值。 - """ + """RebootUHostInstance - 重新启动UHost实例,需要指定数据中心及UHostID两个参数的值。""" fields = { "DiskPassword": fields.Str(required=False, dump_to="DiskPassword"), @@ -687,10 +1195,14 @@ class RebootUHostInstanceRequestSchema(schema.RequestSchema): class RebootUHostInstanceResponseSchema(schema.ResponseSchema): - """ RebootUHostInstance - 重新启动UHost实例,需要指定数据中心及UHostID两个参数的值。 - """ + """RebootUHostInstance - 重新启动UHost实例,需要指定数据中心及UHostID两个参数的值。""" - fields = {"UhostId": fields.Str(required=False, load_from="UhostId")} + fields = { + "UHostId": fields.Str(required=False, load_from="UHostId"), + "UhostId": fields.Str( + required=False, load_from="UhostId" + ), # Deprecated, will be removed at 1.0 + } """ @@ -701,27 +1213,42 @@ class RebootUHostInstanceResponseSchema(schema.ResponseSchema): class ReinstallUHostInstanceRequestSchema(schema.RequestSchema): - """ ReinstallUHostInstance - 重新安装指定UHost实例的操作系统 - """ + """ReinstallUHostInstance - 重新安装指定UHost实例的操作系统""" fields = { - "DNSServers": fields.List(fields.Str()), + "AutoDataDiskInit": fields.Str( + required=False, dump_to="AutoDataDiskInit" + ), + "BootDiskSpace": fields.Int(required=False, dump_to="BootDiskSpace"), + "DNSServers": fields.List( + fields.Str() + ), # Deprecated, will be removed at 1.0 + "HostName": fields.Str(required=False, dump_to="HostName"), "ImageId": fields.Str(required=False, dump_to="ImageId"), + "KeyPairId": fields.Str(required=False, dump_to="KeyPairId"), + "LoginMode": fields.Str(required=False, dump_to="LoginMode"), "Password": fields.Base64(required=False, dump_to="Password"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "ReserveDisk": fields.Str(required=False, dump_to="ReserveDisk"), - "ResourceType": fields.Int(required=False, dump_to="ResourceType"), + "ResourceType": fields.Int( + required=False, dump_to="ResourceType" + ), # Deprecated, will be removed at 1.0 "UHostId": fields.Str(required=True, dump_to="UHostId"), + "UserData": fields.Str(required=False, dump_to="UserData"), "Zone": fields.Str(required=False, dump_to="Zone"), } class ReinstallUHostInstanceResponseSchema(schema.ResponseSchema): - """ ReinstallUHostInstance - 重新安装指定UHost实例的操作系统 - """ + """ReinstallUHostInstance - 重新安装指定UHost实例的操作系统""" - fields = {"UhostId": fields.Str(required=False, load_from="UhostId")} + fields = { + "UHostId": fields.Str(required=False, load_from="UHostId"), + "UhostId": fields.Str( + required=False, load_from="UhostId" + ), # Deprecated, will be removed at 1.0 + } """ @@ -732,11 +1259,13 @@ class ReinstallUHostInstanceResponseSchema(schema.ResponseSchema): class ResetUHostInstancePasswordRequestSchema(schema.RequestSchema): - """ ResetUHostInstancePassword - 重置UHost实例的管理员密码。 - """ + """ResetUHostInstancePassword - 重置UHost实例的管理员密码。""" fields = { - "Password": fields.Base64(required=True, dump_to="Password"), + "AutoStart": fields.Bool(required=False, dump_to="AutoStart"), + "KeyPairId": fields.Str(required=False, dump_to="KeyPairId"), + "LoginMode": fields.Str(required=False, dump_to="LoginMode"), + "Password": fields.Base64(required=False, dump_to="Password"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "UHostId": fields.Str(required=True, dump_to="UHostId"), @@ -745,10 +1274,14 @@ class ResetUHostInstancePasswordRequestSchema(schema.RequestSchema): class ResetUHostInstancePasswordResponseSchema(schema.ResponseSchema): - """ ResetUHostInstancePassword - 重置UHost实例的管理员密码。 - """ + """ResetUHostInstancePassword - 重置UHost实例的管理员密码。""" - fields = {"UhostId": fields.Str(required=False, load_from="UhostId")} + fields = { + "UHostId": fields.Str(required=False, load_from="UHostId"), + "UhostId": fields.Str( + required=False, load_from="UhostId" + ), # Deprecated, will be removed at 1.0 + } """ @@ -759,12 +1292,12 @@ class ResetUHostInstancePasswordResponseSchema(schema.ResponseSchema): class ResizeAttachedDiskRequestSchema(schema.RequestSchema): - """ ResizeAttachedDisk - 修改挂载的磁盘大小,包含系统盘和数据盘 - """ + """ResizeAttachedDisk - 修改挂载的磁盘大小,包含系统盘和数据盘""" fields = { "DiskId": fields.Str(required=True, dump_to="DiskId"), "DiskSpace": fields.Int(required=True, dump_to="DiskSpace"), + "DryRun": fields.Bool(required=False, dump_to="DryRun"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "UHostId": fields.Str(required=True, dump_to="UHostId"), @@ -773,27 +1306,34 @@ class ResizeAttachedDiskRequestSchema(schema.RequestSchema): class ResizeAttachedDiskResponseSchema(schema.ResponseSchema): - """ ResizeAttachedDisk - 修改挂载的磁盘大小,包含系统盘和数据盘 - """ + """ResizeAttachedDisk - 修改挂载的磁盘大小,包含系统盘和数据盘""" - fields = {"DiskId": fields.Str(required=False, load_from="DiskId")} + fields = { + "DiskId": fields.Str(required=False, load_from="DiskId"), + "NeedRestart": fields.Bool(required=False, load_from="NeedRestart"), + } """ API: ResizeUHostInstance -修改指定UHost实例的资源配置,如CPU核心数,内存容量大小,磁盘空间大小,网络增强等。 +修改指定UHost实例的资源配置,如CPU核心数,内存容量大小,网络增强等。可选配置范围请参考[[api:uhost-api:uhost_type|云主机机型说明]]。 """ class ResizeUHostInstanceRequestSchema(schema.RequestSchema): - """ ResizeUHostInstance - 修改指定UHost实例的资源配置,如CPU核心数,内存容量大小,磁盘空间大小,网络增强等。 - """ + """ResizeUHostInstance - 修改指定UHost实例的资源配置,如CPU核心数,内存容量大小,网络增强等。可选配置范围请参考[[api:uhost-api:uhost_type|云主机机型说明]]。""" fields = { - "BootDiskSpace": fields.Int(required=False, dump_to="BootDiskSpace"), + "AutoStart": fields.Bool(required=False, dump_to="AutoStart"), + "BootDiskSpace": fields.Int( + required=False, dump_to="BootDiskSpace" + ), # Deprecated, will be removed at 1.0 "CPU": fields.Int(required=False, dump_to="CPU"), - "DiskSpace": fields.Int(required=False, dump_to="DiskSpace"), + "DiskSpace": fields.Int( + required=False, dump_to="DiskSpace" + ), # Deprecated, will be removed at 1.0 + "GPU": fields.Int(required=False, dump_to="GPU"), "Memory": fields.Int(required=False, dump_to="Memory"), "NetCapValue": fields.Int(required=False, dump_to="NetCapValue"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -804,10 +1344,14 @@ class ResizeUHostInstanceRequestSchema(schema.RequestSchema): class ResizeUHostInstanceResponseSchema(schema.ResponseSchema): - """ ResizeUHostInstance - 修改指定UHost实例的资源配置,如CPU核心数,内存容量大小,磁盘空间大小,网络增强等。 - """ + """ResizeUHostInstance - 修改指定UHost实例的资源配置,如CPU核心数,内存容量大小,网络增强等。可选配置范围请参考[[api:uhost-api:uhost_type|云主机机型说明]]。""" - fields = {"UhostId": fields.Str(required=False, load_from="UhostId")} + fields = { + "UHostId": fields.Str(required=False, load_from="UHostId"), + "UhostId": fields.Str( + required=False, load_from="UhostId" + ), # Deprecated, will be removed at 1.0 + } """ @@ -818,8 +1362,7 @@ class ResizeUHostInstanceResponseSchema(schema.ResponseSchema): class StartUHostInstanceRequestSchema(schema.RequestSchema): - """ StartUHostInstance - 启动处于关闭状态的UHost实例,需要指定数据中心及UHostID两个参数的值。 - """ + """StartUHostInstance - 启动处于关闭状态的UHost实例,需要指定数据中心及UHostID两个参数的值。""" fields = { "DiskPassword": fields.Str(required=False, dump_to="DiskPassword"), @@ -831,10 +1374,14 @@ class StartUHostInstanceRequestSchema(schema.RequestSchema): class StartUHostInstanceResponseSchema(schema.ResponseSchema): - """ StartUHostInstance - 启动处于关闭状态的UHost实例,需要指定数据中心及UHostID两个参数的值。 - """ + """StartUHostInstance - 启动处于关闭状态的UHost实例,需要指定数据中心及UHostID两个参数的值。""" - fields = {"UhostId": fields.Str(required=False, load_from="UhostId")} + fields = { + "UHostId": fields.Str(required=False, load_from="UHostId"), + "UhostId": fields.Str( + required=False, load_from="UhostId" + ), # Deprecated, will be removed at 1.0 + } """ @@ -845,8 +1392,7 @@ class StartUHostInstanceResponseSchema(schema.ResponseSchema): class StopUHostInstanceRequestSchema(schema.RequestSchema): - """ StopUHostInstance - 指停止处于运行状态的UHost实例,需指定数据中心及UhostID。 - """ + """StopUHostInstance - 指停止处于运行状态的UHost实例,需指定数据中心及UhostID。""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -857,10 +1403,14 @@ class StopUHostInstanceRequestSchema(schema.RequestSchema): class StopUHostInstanceResponseSchema(schema.ResponseSchema): - """ StopUHostInstance - 指停止处于运行状态的UHost实例,需指定数据中心及UhostID。 - """ + """StopUHostInstance - 指停止处于运行状态的UHost实例,需指定数据中心及UhostID。""" - fields = {"UhostId": fields.Str(required=False, load_from="UhostId")} + fields = { + "UHostId": fields.Str(required=False, load_from="UHostId"), + "UhostId": fields.Str( + required=False, load_from="UhostId" + ), # Deprecated, will be removed at 1.0 + } """ @@ -871,22 +1421,24 @@ class StopUHostInstanceResponseSchema(schema.ResponseSchema): class TerminateCustomImageRequestSchema(schema.RequestSchema): - """ TerminateCustomImage - 删除用户自定义镜像 - """ + """TerminateCustomImage - 删除用户自定义镜像""" fields = { "ImageId": fields.Str(required=True, dump_to="ImageId"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "Zone": fields.Str(required=False, dump_to="Zone"), + "Zone": fields.Str( + required=False, dump_to="Zone" + ), # Deprecated, will be removed at 1.0 } class TerminateCustomImageResponseSchema(schema.ResponseSchema): - """ TerminateCustomImage - 删除用户自定义镜像 - """ + """TerminateCustomImage - 删除用户自定义镜像""" - fields = {"ImageId": fields.Str(required=False, load_from="ImageId")} + fields = { + "ImageId": fields.Str(required=False, load_from="ImageId"), + } """ @@ -897,11 +1449,12 @@ class TerminateCustomImageResponseSchema(schema.ResponseSchema): class TerminateUHostInstanceRequestSchema(schema.RequestSchema): - """ TerminateUHostInstance - 删除指定数据中心的UHost实例。 - """ + """TerminateUHostInstance - 删除指定数据中心的UHost实例。""" fields = { - "Destroy": fields.Int(required=False, dump_to="Destroy"), + "Destroy": fields.Int( + required=False, dump_to="Destroy" + ), # Deprecated, will be removed at 1.0 "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "ReleaseEIP": fields.Bool(required=False, dump_to="ReleaseEIP"), @@ -912,8 +1465,7 @@ class TerminateUHostInstanceRequestSchema(schema.RequestSchema): class TerminateUHostInstanceResponseSchema(schema.ResponseSchema): - """ TerminateUHostInstance - 删除指定数据中心的UHost实例。 - """ + """TerminateUHostInstance - 删除指定数据中心的UHost实例。""" fields = { "InRecycle": fields.Str(required=True, load_from="InRecycle"), @@ -924,13 +1476,12 @@ class TerminateUHostInstanceResponseSchema(schema.ResponseSchema): """ API: UpgradeToArkUHostInstance -普通升级为方舟机型 + """ class UpgradeToArkUHostInstanceRequestSchema(schema.RequestSchema): - """ UpgradeToArkUHostInstance - 普通升级为方舟机型 - """ + """UpgradeToArkUHostInstance -""" fields = { "CouponId": fields.Str(required=False, dump_to="CouponId"), @@ -941,11 +1492,10 @@ class UpgradeToArkUHostInstanceRequestSchema(schema.RequestSchema): class UpgradeToArkUHostInstanceResponseSchema(schema.ResponseSchema): - """ UpgradeToArkUHostInstance - 普通升级为方舟机型 - """ + """UpgradeToArkUHostInstance -""" fields = { "UHostSet": fields.List( fields.Str(), required=False, load_from="UHostSet" - ) + ), } diff --git a/ucloud/services/uhost/schemas/models.py b/ucloud/services/uhost/schemas/models.py index fbd8f736..e2f6ee94 100644 --- a/ucloud/services/uhost/schemas/models.py +++ b/ucloud/services/uhost/schemas/models.py @@ -3,12 +3,190 @@ from ucloud.core.typesystem import schema, fields +class CopyImageTaskInfoSchema(schema.ResponseSchema): + """CopyImageTaskInfo - 镜像复制的任务信息""" + + fields = { + "TargetImageId": fields.Str(required=False, load_from="TargetImageId"), + "TargetRegion": fields.Str(required=False, load_from="TargetRegion"), + "TaskId": fields.Str(required=False, load_from="TaskId"), + } + + +class KeyPairSchema(schema.ResponseSchema): + """KeyPair - 密钥对信息""" + + fields = { + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "KeyPairFingerPrint": fields.Str( + required=False, load_from="KeyPairFingerPrint" + ), + "KeyPairId": fields.Str(required=False, load_from="KeyPairId"), + "KeyPairName": fields.Str(required=False, load_from="KeyPairName"), + "PrivateKeyBody": fields.Str( + required=False, load_from="PrivateKeyBody" + ), + "ProjectId": fields.Str(required=False, load_from="ProjectId"), + } + + +class PerformanceSchema(schema.ResponseSchema): + """Performance - GPU的性能指标""" + + fields = { + "Rate": fields.Int(required=False, load_from="Rate"), + "Value": fields.Float(required=False, load_from="Value"), + } + + +class BootDiskInfoSchema(schema.ResponseSchema): + """BootDiskInfo - 系统盘信息""" + + fields = { + "Features": fields.List(fields.Str()), + "InstantResize": fields.Bool(required=False, load_from="InstantResize"), + "MaximalSize": fields.Int(required=False, load_from="MaximalSize"), + "Name": fields.Str(required=False, load_from="Name"), + } + + +class DataDiskInfoSchema(schema.ResponseSchema): + """DataDiskInfo - 数据盘信息""" + + fields = { + "Features": fields.List(fields.Str()), + "MaximalSize": fields.Int(required=False, load_from="MaximalSize"), + "MinimalSize": fields.Int(required=False, load_from="MinimalSize"), + "Name": fields.Str(required=False, load_from="Name"), + } + + +class DisksSchema(schema.ResponseSchema): + """Disks - 磁盘信息""" + + fields = { + "BootDisk": fields.List(BootDiskInfoSchema()), + "DataDisk": fields.List(DataDiskInfoSchema()), + "Name": fields.Str(required=False, load_from="Name"), + } + + +class GraphicsMemorySchema(schema.ResponseSchema): + """GraphicsMemory - GPU的显存指标""" + + fields = { + "Rate": fields.Int(required=False, load_from="Rate"), + "Value": fields.Int(required=False, load_from="Value"), + } + + +class CpuPlatformWithModelsSchema(schema.ResponseSchema): + """CpuPlatformWithModels -""" + + fields = { + "CpuFrequency": fields.Str(required=False, load_from="CpuFrequency"), + "CpuModels": fields.List(fields.Str()), + "Name": fields.Str(required=False, load_from="Name"), + } + + +class UHostFamilySchema(schema.ResponseSchema): + """UHostFamily -""" + + fields = { + "CpuFrequency": fields.Str(required=False, load_from="CpuFrequency"), + "CpuPlatforms": fields.List(CpuPlatformWithModelsSchema()), + "Name": fields.Str(required=False, load_from="Name"), + } + + +class CpuPlatformsSchema(schema.ResponseSchema): + """CpuPlatforms - CPU平台信息""" + + fields = { + "Amd": fields.List(fields.Str()), + "Ampere": fields.List(fields.Str()), + "Intel": fields.List(fields.Str()), + } + + +class CollectionSchema(schema.ResponseSchema): + """Collection - CPU和内存可支持的规格""" + + fields = { + "Cpu": fields.Int(required=False, load_from="Cpu"), + "Memory": fields.List(fields.Int()), + "MinimalCpuPlatform": fields.List(fields.Str()), + } + + +class MachineSizesSchema(schema.ResponseSchema): + """MachineSizes - GPU、CPU和内存信息""" + + fields = { + "Collection": fields.List(CollectionSchema()), + "Gpu": fields.Int(required=False, load_from="Gpu"), + } + + +class FeatureModesSchema(schema.ResponseSchema): + """FeatureModes - 可以支持的模式类别""" + + fields = { + "MinimalCpuPlatform": fields.List(fields.Str()), + "Name": fields.Str(required=False, load_from="Name"), + "RelatedToImageFeature": fields.List(fields.Str()), + } + + +class FeaturesSchema(schema.ResponseSchema): + """Features - 虚机可支持的特性""" + + fields = { + "Modes": fields.List(FeatureModesSchema()), + "Name": fields.Str(required=False, load_from="Name"), + } + + +class AvailableInstanceTypesSchema(schema.ResponseSchema): + """AvailableInstanceTypes - https://ushare.ucloudadmin.com/pages/viewpage.action?pageId=104662646""" + + fields = { + "CpuPlatforms": CpuPlatformsSchema(), + "Description": fields.Str(required=False, load_from="Description"), + "Disks": fields.List(DisksSchema()), + "Features": fields.List(FeaturesSchema()), + "GraphicsMemory": GraphicsMemorySchema(), + "InstanceType": fields.Str(required=False, load_from="InstanceType"), + "MachineClass": fields.Str(required=False, load_from="MachineClass"), + "MachineSizes": fields.List(MachineSizesSchema()), + "Name": fields.Str(required=False, load_from="Name"), + "ParentType": fields.Str(required=False, load_from="ParentType"), + "Performance": PerformanceSchema(), + "Status": fields.Str(required=False, load_from="Status"), + "UHostFamilies": fields.List(UHostFamilySchema()), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class BasePriceSetSchema(schema.ResponseSchema): + """BasePriceSet - 价格信息""" + + fields = { + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "OriginalPrice": fields.Float( + required=False, load_from="OriginalPrice" + ), + "Price": fields.Float(required=False, load_from="Price"), + } + + class UHostImageSetSchema(schema.ResponseSchema): - """ UHostImageSet - DescribeImage - """ + """UHostImageSet - DescribeImage""" fields = { "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DataSnapshotIds": fields.List(fields.Str()), "Features": fields.List(fields.Str()), "FuncType": fields.Str(required=False, load_from="FuncType"), "ImageDescription": fields.Str( @@ -22,18 +200,25 @@ class UHostImageSetSchema(schema.ResponseSchema): required=False, load_from="IntegratedSoftware" ), "Links": fields.Str(required=False, load_from="Links"), + "MaintainEol": fields.Str(required=False, load_from="MaintainEol"), "MinimalCPU": fields.Str(required=False, load_from="MinimalCPU"), "OsName": fields.Str(required=False, load_from="OsName"), "OsType": fields.Str(required=False, load_from="OsType"), + "PriceSet": fields.List(BasePriceSetSchema()), + "PrimarySoftware": fields.Str( + required=False, load_from="PrimarySoftware" + ), + "SceneCategories": fields.List(fields.Str()), "State": fields.Str(required=False, load_from="State"), + "SupportedGPUTypes": fields.List(fields.Str()), + "Tag": fields.Str(required=False, load_from="Tag"), "Vendor": fields.Str(required=False, load_from="Vendor"), "Zone": fields.Str(required=False, load_from="Zone"), } class SpreadInfoSchema(schema.ResponseSchema): - """ SpreadInfo - 每个可用区中硬件隔离组信息 - """ + """SpreadInfo - 每个可用区中硬件隔离组信息""" fields = { "UHostCount": fields.Int(required=False, load_from="UHostCount"), @@ -42,8 +227,7 @@ class SpreadInfoSchema(schema.ResponseSchema): class IsolationGroupSchema(schema.ResponseSchema): - """ IsolationGroup - 硬件隔离组信息 - """ + """IsolationGroup - 硬件隔离组信息""" fields = { "GroupId": fields.Str(required=False, load_from="GroupId"), @@ -54,15 +238,14 @@ class IsolationGroupSchema(schema.ResponseSchema): class UHostDiskSetSchema(schema.ResponseSchema): - """ UHostDiskSet - DescribeUHostInstance - """ + """UHostDiskSet - DescribeUHostInstance""" fields = { "BackupType": fields.Str(required=False, load_from="BackupType"), "DiskId": fields.Str(required=False, load_from="DiskId"), "DiskType": fields.Str(required=True, load_from="DiskType"), "Drive": fields.Str(required=False, load_from="Drive"), - "Encrypted": fields.Bool(required=False, load_from="Encrypted"), + "Encrypted": fields.Str(required=False, load_from="Encrypted"), "IsBoot": fields.Str(required=True, load_from="IsBoot"), "Name": fields.Str(required=False, load_from="Name"), "Size": fields.Int(required=False, load_from="Size"), @@ -70,26 +253,55 @@ class UHostDiskSetSchema(schema.ResponseSchema): } +class UHostKeyPairSchema(schema.ResponseSchema): + """UHostKeyPair - 主机密钥信息""" + + fields = { + "KeyPairId": fields.Str(required=False, load_from="KeyPairId"), + "KeyPairState": fields.Str(required=False, load_from="KeyPairState"), + } + + class UHostIPSetSchema(schema.ResponseSchema): - """ UHostIPSet - DescribeUHostInstance - """ + """UHostIPSet - DescribeUHostInstance""" fields = { "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), - "Default": fields.Str(required=True, load_from="Default"), + "Default": fields.Str(required=False, load_from="Default"), "IP": fields.Str(required=False, load_from="IP"), "IPId": fields.Str(required=False, load_from="IPId"), - "Mac": fields.Str(required=True, load_from="Mac"), + "IPMode": fields.Str(required=True, load_from="IPMode"), + "Mac": fields.Str(required=False, load_from="Mac"), + "NetworkInterfaceId": fields.Str( + required=False, load_from="NetworkInterfaceId" + ), "SubnetId": fields.Str(required=False, load_from="SubnetId"), "Type": fields.Str(required=False, load_from="Type"), "VPCId": fields.Str(required=False, load_from="VPCId"), - "Weight": fields.Int(required=True, load_from="Weight"), + "Weight": fields.Int(required=False, load_from="Weight"), + } + + +class UDSetUDHostAttributeSchema(schema.ResponseSchema): + """UDSetUDHostAttribute - 私有专区对应的宿主机属性""" + + fields = { + "HostBinding": fields.Bool(required=False, load_from="HostBinding"), + "UDHostId": fields.Str(required=False, load_from="UDHostId"), + "UDSetId": fields.Str(required=False, load_from="UDSetId"), + } + + +class SpotAttributeSchema(schema.ResponseSchema): + """SpotAttribute - 竞价实例属性""" + + fields = { + "RecycleTime": fields.Int(required=False, load_from="RecycleTime"), } class UHostInstanceSetSchema(schema.ResponseSchema): - """ UHostInstanceSet - DescribeUHostInstance - """ + """UHostInstanceSet - DescribeUHostInstance""" fields = { "AutoRenew": fields.Str(required=False, load_from="AutoRenew"), @@ -100,28 +312,46 @@ class UHostInstanceSetSchema(schema.ResponseSchema): "BootDiskState": fields.Str(required=False, load_from="BootDiskState"), "CPU": fields.Int(required=False, load_from="CPU"), "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "CloudInitFeature": fields.Bool( + required=False, load_from="CloudInitFeature" + ), + "CpuPlatform": fields.Str(required=False, load_from="CpuPlatform"), "CreateTime": fields.Int(required=False, load_from="CreateTime"), "DiskSet": fields.List(UHostDiskSetSchema()), + "EpcInstance": fields.Bool(required=False, load_from="EpcInstance"), "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), "GPU": fields.Int(required=False, load_from="GPU"), + "GpuType": fields.Str(required=False, load_from="GpuType"), + "HiddenKvm": fields.Bool(required=False, load_from="HiddenKvm"), "HostType": fields.Str(required=False, load_from="HostType"), + "HotPlugMaxCpu": fields.Int(required=False, load_from="HotPlugMaxCpu"), "HotplugFeature": fields.Bool( required=False, load_from="HotplugFeature" ), + "HpcFeature": fields.Bool(required=False, load_from="HpcFeature"), "IPSet": fields.List(UHostIPSetSchema()), + "IPv6Feature": fields.Bool(required=False, load_from="IPv6Feature"), "ImageId": fields.Str(required=False, load_from="ImageId"), "IsolationGroup": fields.Str( required=False, load_from="IsolationGroup" ), + "KeyPair": UHostKeyPairSchema(), "LifeCycle": fields.Str(required=False, load_from="LifeCycle"), "MachineType": fields.Str(required=False, load_from="MachineType"), "Memory": fields.Int(required=False, load_from="Memory"), "Name": fields.Str(required=False, load_from="Name"), "NetCapability": fields.Str(required=False, load_from="NetCapability"), + "NetFeatureTag": fields.Str(required=False, load_from="NetFeatureTag"), "NetworkState": fields.Str(required=False, load_from="NetworkState"), "OsName": fields.Str(required=False, load_from="OsName"), "OsType": fields.Str(required=False, load_from="OsType"), + "RdmaClusterId": fields.Str(required=False, load_from="RdmaClusterId"), "Remark": fields.Str(required=False, load_from="Remark"), + "RestrictMode": fields.Str(required=False, load_from="RestrictMode"), + "SecGroupInstance": fields.Bool( + required=False, load_from="SecGroupInstance" + ), + "SpotAttribute": SpotAttributeSchema(), "State": fields.Str(required=False, load_from="State"), "StorageType": fields.Str(required=False, load_from="StorageType"), "SubnetType": fields.Str(required=False, load_from="SubnetType"), @@ -132,6 +362,8 @@ class UHostInstanceSetSchema(schema.ResponseSchema): "TotalDiskSpace": fields.Int( required=False, load_from="TotalDiskSpace" ), + "UDHostAttribute": UDSetUDHostAttributeSchema(), + "UHostFamily": fields.Str(required=False, load_from="UHostFamily"), "UHostId": fields.Str(required=False, load_from="UHostId"), "UHostType": fields.Str(required=False, load_from="UHostType"), "Zone": fields.Str(required=False, load_from="Zone"), @@ -139,8 +371,7 @@ class UHostInstanceSetSchema(schema.ResponseSchema): class UHostSnapshotSetSchema(schema.ResponseSchema): - """ UHostSnapshotSet - DescribeUHostInstanceSnapshot - """ + """UHostSnapshotSet -""" fields = { "SnapshotName": fields.Str(required=False, load_from="SnapshotName"), @@ -149,9 +380,22 @@ class UHostSnapshotSetSchema(schema.ResponseSchema): } +class KeyPairDescSchema(schema.ResponseSchema): + """KeyPairDesc - 密钥对信息,不包含私钥内容。""" + + fields = { + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "KeyPairFingerPrint": fields.Str( + required=False, load_from="KeyPairFingerPrint" + ), + "KeyPairId": fields.Str(required=False, load_from="KeyPairId"), + "KeyPairName": fields.Str(required=False, load_from="KeyPairName"), + "ProjectId": fields.Str(required=False, load_from="ProjectId"), + } + + class UHostTagSetSchema(schema.ResponseSchema): - """ UHostTagSet - DescribeUHostTags - """ + """UHostTagSet - DescribeUHostTags""" fields = { "Tag": fields.Str(required=False, load_from="Tag"), @@ -160,11 +404,52 @@ class UHostTagSetSchema(schema.ResponseSchema): } +class DiskUpgradePriceDetailSchema(schema.ResponseSchema): + """DiskUpgradePriceDetail - 升级磁盘的详细价格""" + + fields = { + "Snapshot": fields.Float(required=False, load_from="Snapshot"), + "UDisk": fields.Float(required=False, load_from="UDisk"), + } + + +class PriceDetailSchema(schema.ResponseSchema): + """PriceDetail - 价格详细信息""" + + fields = { + "Snapshot": fields.Float(required=False, load_from="Snapshot"), + "UDisk": fields.Float(required=False, load_from="UDisk"), + "UHost": fields.Float(required=False, load_from="UHost"), + "Volume": fields.Float(required=False, load_from="Volume"), + } + + class UHostPriceSetSchema(schema.ResponseSchema): - """ UHostPriceSet - 主机价格 - """ + """UHostPriceSet - 主机价格""" fields = { "ChargeType": fields.Str(required=True, load_from="ChargeType"), + "ListPrice": fields.Float( + required=False, load_from="ListPrice" + ), # Deprecated, will be removed at 1.0 + "ListPriceDetail": PriceDetailSchema( + required=False, load_from="ListPriceDetail" + ), # Deprecated, will be removed at 1.0 + "OriginalPrice": fields.Float(required=True, load_from="OriginalPrice"), + "OriginalPriceDetail": PriceDetailSchema(), "Price": fields.Float(required=True, load_from="Price"), + "PriceDetail": PriceDetailSchema(), + } + + +class UHostRefundPriceSetSchema(schema.ResponseSchema): + """UHostRefundPriceSet - 删除退费详情""" + + fields = { + "Code": fields.Int(required=True, load_from="Code"), + "Message": fields.Str( + required=False, load_from="Message" + ), # Deprecated, will be removed at 1.0 + "RefundPrice": fields.Float(required=False, load_from="RefundPrice"), + "UHostId": fields.Str(required=True, load_from="UHostId"), } diff --git a/ucloud/services/uhub/client.py b/ucloud/services/uhub/client.py index da1ed1e6..037b1ecb 100644 --- a/ucloud/services/uhub/client.py +++ b/ucloud/services/uhub/client.py @@ -14,19 +14,19 @@ def __init__( super(UHubClient, self).__init__(config, transport, middleware, logger) def create_repo(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ CreateRepo - 创建镜像仓库 + """CreateRepo - 创建镜像仓库 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **RepoName** (str) - (Required) 仓库名称,不可修改 - **Description** (str) - 仓库备注 - **IsShared** (bool) - 镜像仓库是否公开,公开为true、不公开为false;默认为false - + **Response** - **Message** (str) - 有错误时返回内容 - + """ # build request d = { @@ -42,16 +42,16 @@ def create_repo(self, req: typing.Optional[dict] = None, **kwargs) -> dict: return apis.CreateRepoResponseSchema().loads(resp) def delete_repo(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ DeleteRepo - 删除镜像仓库 + """DeleteRepo - 删除镜像仓库 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **RepoName** (str) - (Required) 镜像仓库名称 - + **Response** - + """ # build request d = { @@ -66,18 +66,18 @@ def delete_repo(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def delete_repo_image( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeleteRepoImage - 删除镜像 + """DeleteRepoImage - 删除镜像 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **ImageName** (str) - (Required) 镜像名称 - **RepoName** (str) - (Required) 镜像仓库名称 - **TagName** (str) - 不指定tag则删除全部tag - + **Response** - + """ # build request d = { @@ -92,29 +92,30 @@ def delete_repo_image( def get_image_tag( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetImageTag - 获取镜像tag + """GetImageTag - 获取镜像tag **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **ImageName** (str) - (Required) 镜像名称 - **RepoName** (str) - (Required) 镜像仓库名称 - **Limit** (int) - 每次获取数量,默认为20 - **Offset** (int) - 偏移量,默认0 - **TagName** (str) - 默认不写,如果填写,代表查询该tag,否则查全部tag - + **Response** - **TagSet** (list) - 见 **TagSet** 模型定义 - **TotalCount** (int) - tag总数 - + **Response Model** - - **TagSet** - + + **TagSet** + - **Digest** (str) - 镜像digest值 - **TagName** (str) - Tag名称 - **UpdateTime** (str) - 镜像更新时间 + """ # build request d = { @@ -127,24 +128,23 @@ def get_image_tag( return apis.GetImageTagResponseSchema().loads(resp) def get_repo(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ GetRepo - 获取镜像仓库 + """GetRepo - 获取镜像仓库 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **Limit** (int) - 数量,默认20 - **Offset** (int) - 偏移量,默认0 - **Type** (str) - private私有仓库,public公共仓库,默认public - + **Response** - **RepoSet** (list) - 见 **RepoSet** 模型定义 - **TotalCount** (int) - 总的仓库数量 - + **Response Model** - - **RepoSet** - + + **RepoSet** - **CreateTime** (str) - 仓库创建时间 - **Description** (str) - 镜像仓库描述 - **IsOutSide** (str) - 镜像仓库是否外网可以访问,可以为ture,不可以为false @@ -152,6 +152,7 @@ def get_repo(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **RepoName** (str) - 镜像仓库名称 - **UpdateTime** (str) - 仓库更新时间 + """ # build request d = { @@ -166,24 +167,23 @@ def get_repo(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def get_repo_image( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetRepoImage - 获取镜像仓库下的镜像 + """GetRepoImage - 获取镜像仓库下的镜像 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **RepoName** (str) - (Required) 镜像仓库名称 - **Limit** (int) - 显示数量,默认为20 - **Offset** (int) - 偏移量,默认0 - + **Response** - **ImageSet** (list) - 见 **ImageSet** 模型定义 - - **TotalCount** (int) - - + - **TotalCount** (int) - + **Response Model** - - **ImageSet** - + + **ImageSet** - **CreateTime** (str) - 创建时间 - **ImageName** (str) - 镜像名称 - **LatestTag** (str) - 最新push的Tag @@ -191,6 +191,7 @@ def get_repo_image( - **RepoName** (str) - 镜像仓库名称 - **UpdateTime** (str) - 修改时间 + """ # build request d = { @@ -203,19 +204,19 @@ def get_repo_image( return apis.GetRepoImageResponseSchema().loads(resp) def update_repo(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ UpdateRepo - 更新镜像仓库 + """UpdateRepo - 更新镜像仓库 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **RepoName** (str) - (Required) 镜像仓库名称,不可修改 - **Description** (str) - 备注 - **IsShared** (str) - false设置为私有;true设置为公有。默认false - + **Response** - **Message** (str) - 错误的时候返回 - + """ # build request d = { diff --git a/ucloud/services/uhub/schemas/apis.py b/ucloud/services/uhub/schemas/apis.py index 32c67381..fcdbbee0 100644 --- a/ucloud/services/uhub/schemas/apis.py +++ b/ucloud/services/uhub/schemas/apis.py @@ -1,6 +1,5 @@ """ Code is generated by ucloud-model, DO NOT EDIT IT. """ - from ucloud.core.typesystem import schema, fields from ucloud.services.uhub.schemas import models @@ -16,8 +15,7 @@ class CreateRepoRequestSchema(schema.RequestSchema): - """ CreateRepo - 创建镜像仓库 - """ + """CreateRepo - 创建镜像仓库""" fields = { "Description": fields.Str(required=False, dump_to="Description"), @@ -28,8 +26,7 @@ class CreateRepoRequestSchema(schema.RequestSchema): class CreateRepoResponseSchema(schema.ResponseSchema): - """ CreateRepo - 创建镜像仓库 - """ + """CreateRepo - 创建镜像仓库""" fields = { "Message": fields.Str(required=False, load_from="Message"), @@ -44,8 +41,7 @@ class CreateRepoResponseSchema(schema.ResponseSchema): class DeleteRepoRequestSchema(schema.RequestSchema): - """ DeleteRepo - 删除镜像仓库 - """ + """DeleteRepo - 删除镜像仓库""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -54,8 +50,7 @@ class DeleteRepoRequestSchema(schema.RequestSchema): class DeleteRepoResponseSchema(schema.ResponseSchema): - """ DeleteRepo - 删除镜像仓库 - """ + """DeleteRepo - 删除镜像仓库""" fields = {} @@ -68,8 +63,7 @@ class DeleteRepoResponseSchema(schema.ResponseSchema): class DeleteRepoImageRequestSchema(schema.RequestSchema): - """ DeleteRepoImage - 删除镜像 - """ + """DeleteRepoImage - 删除镜像""" fields = { "ImageName": fields.Str(required=True, dump_to="ImageName"), @@ -80,8 +74,7 @@ class DeleteRepoImageRequestSchema(schema.RequestSchema): class DeleteRepoImageResponseSchema(schema.ResponseSchema): - """ DeleteRepoImage - 删除镜像 - """ + """DeleteRepoImage - 删除镜像""" fields = {} @@ -94,8 +87,7 @@ class DeleteRepoImageResponseSchema(schema.ResponseSchema): class GetImageTagRequestSchema(schema.RequestSchema): - """ GetImageTag - 获取镜像tag - """ + """GetImageTag - 获取镜像tag""" fields = { "ImageName": fields.Str(required=True, dump_to="ImageName"), @@ -108,8 +100,7 @@ class GetImageTagRequestSchema(schema.RequestSchema): class GetImageTagResponseSchema(schema.ResponseSchema): - """ GetImageTag - 获取镜像tag - """ + """GetImageTag - 获取镜像tag""" fields = { "TagSet": fields.List( @@ -127,8 +118,7 @@ class GetImageTagResponseSchema(schema.ResponseSchema): class GetRepoRequestSchema(schema.RequestSchema): - """ GetRepo - 获取镜像仓库 - """ + """GetRepo - 获取镜像仓库""" fields = { "Limit": fields.Int(required=False, dump_to="Limit"), @@ -139,8 +129,7 @@ class GetRepoRequestSchema(schema.RequestSchema): class GetRepoResponseSchema(schema.ResponseSchema): - """ GetRepo - 获取镜像仓库 - """ + """GetRepo - 获取镜像仓库""" fields = { "RepoSet": fields.List( @@ -158,8 +147,7 @@ class GetRepoResponseSchema(schema.ResponseSchema): class GetRepoImageRequestSchema(schema.RequestSchema): - """ GetRepoImage - 获取镜像仓库下的镜像 - """ + """GetRepoImage - 获取镜像仓库下的镜像""" fields = { "Limit": fields.Int(required=False, dump_to="Limit"), @@ -170,8 +158,7 @@ class GetRepoImageRequestSchema(schema.RequestSchema): class GetRepoImageResponseSchema(schema.ResponseSchema): - """ GetRepoImage - 获取镜像仓库下的镜像 - """ + """GetRepoImage - 获取镜像仓库下的镜像""" fields = { "ImageSet": fields.List( @@ -189,8 +176,7 @@ class GetRepoImageResponseSchema(schema.ResponseSchema): class UpdateRepoRequestSchema(schema.RequestSchema): - """ UpdateRepo - 更新镜像仓库 - """ + """UpdateRepo - 更新镜像仓库""" fields = { "Description": fields.Str(required=False, dump_to="Description"), @@ -201,8 +187,7 @@ class UpdateRepoRequestSchema(schema.RequestSchema): class UpdateRepoResponseSchema(schema.ResponseSchema): - """ UpdateRepo - 更新镜像仓库 - """ + """UpdateRepo - 更新镜像仓库""" fields = { "Message": fields.Str(required=False, load_from="Message"), diff --git a/ucloud/services/uhub/schemas/models.py b/ucloud/services/uhub/schemas/models.py index 10aa3b92..7240066f 100644 --- a/ucloud/services/uhub/schemas/models.py +++ b/ucloud/services/uhub/schemas/models.py @@ -4,18 +4,17 @@ class TagSetSchema(schema.ResponseSchema): - """ TagSet - Tag详细信息 - """ + """TagSet - Tag详细信息""" fields = { + "Digest": fields.Str(required=False, load_from="Digest"), "TagName": fields.Str(required=True, load_from="TagName"), "UpdateTime": fields.Str(required=True, load_from="UpdateTime"), } class RepoSetSchema(schema.ResponseSchema): - """ RepoSet - 镜像仓库 - """ + """RepoSet - 镜像仓库""" fields = { "CreateTime": fields.Str(required=True, load_from="CreateTime"), @@ -28,8 +27,7 @@ class RepoSetSchema(schema.ResponseSchema): class ImageSetSchema(schema.ResponseSchema): - """ ImageSet - 镜像信息 - """ + """ImageSet - 镜像信息""" fields = { "CreateTime": fields.Str(required=True, load_from="CreateTime"), diff --git a/ucloud/services/uk8s/__init__.py b/ucloud/services/uk8s/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/uk8s/client.py b/ucloud/services/uk8s/client.py new file mode 100644 index 00000000..84e01db6 --- /dev/null +++ b/ucloud/services/uk8s/client.py @@ -0,0 +1,729 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.uk8s.schemas import apis + + +class UK8SClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UK8SClient, self).__init__(config, transport, middleware, logger) + + def add_uk8s_existing_uhost( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AddUK8SExistingUHost - 将预先创建好的云主机加入到UK8S集群,需要注意的是,该云主机依然会执行重装系统的操作。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) UK8S集群ID。 可从UK8S控制台获取。 + - **Password** (str) - (Required) Node节点密码。请遵照 `字段规范 `_ 设定密码。密码需使用base64进行编码,如下:# echo -n Password1 | base64 + - **UHostId** (str) - (Required) 云主机Id,为了保证节点正常运行,该主机配置不得低于2C4G。 + - **DisableSchedule** (bool) - 用于标示添加完节点后是否将节点临时禁用. 传入 "true" 表示禁用,传入其它或不传表示不禁用 + - **ImageId** (str) - 镜像 Id,不填时后台程序会自动选用一个可用的镜像 Id,支持用户自定义镜像,自定义镜像必须基于基础镜像制作。 + - **InitScript** (str) - 用户自定义Shell脚本。与UserData的区别在于InitScript在节点初始化完毕后才执行,UserData则是云主机初始化时执行。 + - **Labels** (str) - Node节点标签。key=value形式,多组用”,“隔开,最多5组。 如env=pro,type=game + - **MaxPods** (int) - 默认110,生产环境建议小于等于110。 + - **SubnetId** (str) - 该云主机所属子网Id。 + - **UserData** (str) - 用户自定义数据。当镜像支持Cloud-init Feature时可填写此字段。注意:1、总数据量大小不超过 16K;2、使用base64编码。 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息。 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.AddUK8SExistingUHostRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AddUK8SExistingUHost", d, **kwargs) + return apis.AddUK8SExistingUHostResponseSchema().loads(resp) + + def add_uk8s_node_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AddUK8SNodeGroup - 添加UK8S节点池 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) 集群ID + - **NodeGroupName** (str) - (Required) 节点池名字 + - **BootDiskSize** (int) - 系统盘大小,单位GB。默认40。范围:[40, 500]。注意SSD本地盘无法调整。 + - **BootDiskType** (str) - 磁盘类型 + - **CPU** (int) - GPU卡核心数。仅GPU机型支持此字段(可选范围与MachineType+GpuType相关) + - **ChargeType** (str) - 计费模式 + - **DataDiskSize** (int) - 数据磁盘大小 + - **DataDiskType** (str) - 磁盘类型 + - **GPU** (int) - GPU卡核心数 + - **GpuType** (str) - GPU类型 + - **ImageId** (str) - 镜像ID + - **MachineType** (str) - 云主机机型。枚举值["N", "C", "G", "O", "OS"]。参考 `云主机机型说明 `_ 。 + - **Mem** (int) - 内存大小。单位:MB + - **MinimalCpuPlatform** (str) - 最低cpu平台,枚举值["Intel/Auto", "Intel/IvyBridge", "Intel/Haswell", "Intel/Broadwell", "Intel/Skylake", "Intel/Cascadelake";"Intel/CascadelakeR"; “Amd/Epyc2”,"Amd/Auto"],默认值是"Intel/Auto" + - **SubnetId** (str) - 子网 ID。默认为集群创建时填写的子网ID,也可以填写集群同VPC内的子网ID。 + - **Tag** (str) - 业务组 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息。 + - **NodeGroupId** (str) - 节点池ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.AddUK8SNodeGroupRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AddUK8SNodeGroup", d, **kwargs) + return apis.AddUK8SNodeGroupResponseSchema().loads(resp) + + def add_uk8s_phost_node( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AddUK8SPHostNode - 为UK8S集群添加一台或多台物理云主机类型的节点。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ChargeType** (str) - (Required) 计费模式。枚举值为: \\ > Year,按年付费; \\ > Month,按月付费;\\ 默认为月付 + - **ClusterId** (str) - (Required) UK8S集群ID。 可从UK8S控制台获取。 + - **Count** (int) - (Required) 最大创建Node节点数量,取值范围是[1,10]。 + - **Password** (str) - (Required) Node节点密码。请遵照 `字段规范 `_ 设定密码。密码需使用base64进行编码,如下:# echo -n Password1 | base64 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **DisableSchedule** (bool) - 用于标示添加完节点后是否将节点临时禁用. 传入 "true" 表示禁用,传入其它或不传表示不禁用 + - **ImageId** (str) - 镜像 Id,不填时后台程序会自动选用一个可用的镜像 Id,支持用户自定义镜像,自定义镜像必须基于基础镜像制作。 + - **InitScript** (str) - 用户自定义Shell脚本。与UserData的区别在于InitScript在节点初始化完毕后才执行。 + - **Labels** (str) - Node节点标签。key=value形式,多组用”,“隔开,最多5组。 如env=pro,type=game + - **MaxPods** (int) - 默认110,生产环境建议小于等于110。 + - **NIC** (str) - 网络环境,可选千兆:1G ,万兆:10G, 默认1G。 + - **Quantity** (int) - 购买时长。默认: 1。月付时,此参数传0,代表了购买至月末。 + - **Raid** (str) - Raid配置,默认Raid10 支持:Raid0、Raid1、Raid5、Raid10,NoRaid + - **SubnetId** (str) - 子网 ID。默认为集群创建时填写的子网ID,也可以填写集群同VPC内的子网ID。 + - **Type** (str) - 物理机类型,默认为:db-2(基础型-SAS-V3) + + **Response** + + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息。 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.AddUK8SPHostNodeRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AddUK8SPHostNode", d, **kwargs) + return apis.AddUK8SPHostNodeResponseSchema().loads(resp) + + def add_uk8s_uhost_node( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AddUK8SUHostNode - 为UK8S集群添加一台Node节点,机型类型为云主机 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **CPU** (int) - (Required) 虚拟CPU核数。可选参数:2-64(具体机型与CPU的对应关系参照控制台)。默认值: 4。 + - **ChargeType** (str) - (Required) 计费模式。枚举值为: \\ > Year,按年付费; \\ > Month,按月付费;\\ > Dynamic,按小时预付费 \\ > Postpay,按小时后付费(支持关机不收费,目前仅部分可用区支持,请联系您的客户经理) \\ 默认为月付 + - **ClusterId** (str) - (Required) UK8S集群ID。 可从UK8S控制台获取。 + - **Count** (int) - (Required) 创建Node节点数量,取值范围是[1,50]。 + - **Mem** (int) - (Required) 内存大小。单位:MB。范围 :[4096, 262144],取值为1024的倍数(可选范围参考控制台)。默认值:8192 + - **Password** (str) - (Required) Node节点密码。请遵照 `字段规范 `_ 设定密码。密码需使用base64进行编码,如下:# echo -n Password1 | base64 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **BootDiskSize** (int) - 系统盘大小,单位GB。默认40。范围:[40, 500]。注意SSD本地盘无法调整。 + - **BootDiskType** (str) - 磁盘类型。请参考 `磁盘类型 `_ 。默认为SSD云盘 + - **DataDiskSize** (int) - 数据磁盘大小,单位GB。默认0。范围 :[20, 1000] + - **DataDiskType** (str) - 磁盘类型。请参考 `磁盘类型 `_ 。默认为SSD云盘 + - **DisableSchedule** (bool) - 用于标示添加完节点后是否将节点临时禁用. 传入 "true" 表示禁用,传入其它或不传表示不禁用 + - **GPU** (int) - GPU卡核心数。仅GPU机型支持此字段(可选范围与MachineType+GpuType相关) + - **GpuType** (str) - GPU类型,枚举值["K80", "P40", "V100",],MachineType为G时必填 + - **ImageId** (str) - 镜像 Id,不填时后台程序会自动选用一个可用的镜像 Id,支持用户自定义镜像,自定义镜像必须基于基础镜像制作。 + - **InitScript** (str) - 用户自定义Shell脚本。与UserData的区别在于InitScript在节点初始化完毕后才执行,UserData则是云主机初始化时执行。 + - **IsolationGroup** (str) - 硬件隔离组id。可通过DescribeIsolationGroup获取。 + - **Labels** (str) - Node节点标签。key=value形式,多组用”,“隔开,最多5组。 如env=pro,type=game + - **MachineType** (str) - 云主机机型。枚举值["N", "C", "G", "O", "OS"]。参考 `云主机机型说明 `_ 。 + - **MaxPods** (int) - 默认110,生产环境建议小于等于110。 + - **MinimalCpuPlatform** (str) - 最低cpu平台,枚举值["Intel/Auto", "Intel/IvyBridge", "Intel/Haswell", "Intel/Broadwell", "Intel/Skylake", "Intel/Cascadelake";"Intel/CascadelakeR"; “Amd/Epyc2”,"Amd/Auto"],默认值是"Intel/Auto" + - **NodeGroupId** (str) - 节点池id + - **Quantity** (int) - 购买时长。默认: 1。按小时购买(Dynamic)时无需此参数。 月付时,此参数传0,代表了购买至月末。 + - **SubnetId** (str) - 子网 ID。默认为集群创建时填写的子网ID,也可以填写集群同VPC内的子网ID。 + - **Tag** (str) - 业务组 + - **Taints** (str) - Node节点污点,形式为key=value:effect,多组taints用”,“隔开,最多支持五组。 + - **UserData** (str) - 用户自定义数据。当镜像支持Cloud-init Feature时可填写此字段。注意:1、总数据量大小不超过 16K;2、使用base64编码。 + + **Response** + + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息。 + - **NodeIds** (list) - Node实例Id集合 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.AddUK8SUHostNodeRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AddUK8SUHostNode", d, **kwargs) + return apis.AddUK8SUHostNodeResponseSchema().loads(resp) + + def create_uk8s_cluster_v2( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUK8SClusterV2 - 创建UK8S集群 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterName** (str) - (Required) 集群名称 + - **MasterCPU** (int) - (Required) Master节点的虚拟CPU核数。可选参数:2-64(具体机型与CPU的对应关系参照控制台)。 + - **MasterMachineType** (str) - (Required) Master节点的云主机机型(V2.0),如["N", "C", "O", "OS"],具体请参照云主机机型。 + - **MasterMem** (int) - (Required) Master节点的内存大小。单位:MB。范围 :[4096, 262144],取值为1024的倍数(可选范围参考控制台)。 + - **Password** (str) - (Required) 集群节点密码,包括Master和Node。密码需包含最少一个大写字母,请使用base64进行编码,举例如下:# echo -n Password1 | base64 + - **ServiceCIDR** (str) - (Required) Service 网段,用于分配ClusterIP,如172.17.0.0/16。该网段不能与集群所属VPC网段重叠。 + - **SubnetId** (str) - (Required) 集群Node及Pod所属子网 + - **VPCId** (str) - (Required) 集群Node及Pod所属VPC + - **ChargeType** (str) - 集群所有节点的付费模式。枚举值为: Year,按年付费; Month,按月付费; Dynamic,按小时付费(需开启权限),默认按月。 + - **ClusterDomain** (str) - 创建集群的时候定义clusterdomain + - **ExternalApiServer** (str) - 是否允许外网访问apiserver,开启:Yes 不开启:No。默认为No。 + - **ImageId** (str) - Master节点和Node节点的镜像 ID,不填则随机选择可用的基础镜像。支持用户自定义镜像。 + - **InitScript** (str) - 用户自定义脚本,与UserData不同,自定义脚本将在集群安装完毕后执行。注意:1、总数据量大小不超多16K;2、使用base64编码。 + - **K8sVersion** (str) - k8s集群的版本,版本信息请参考UK8S集群创建页,不指定的话默认为当前支持的最高版本。 + - **KubeProxy** (dict) - 见 **CreateUK8SClusterV2ParamKubeProxy** 模型定义 + - **Master** (list) - 见 **CreateUK8SClusterV2ParamMaster** 模型定义 + - **MasterBootDiskSize** (int) - Master节点系统盘大小,单位GB,默认为40。范围:[40, 500]。注意SSD本地盘无法调整。 + - **MasterBootDiskType** (str) - Master节点系统盘类型。请参考 `磁盘类型 `_ 。默认为SSD云盘 + - **MasterDataDiskSize** (int) - Master节点的数据盘大小,单位GB,默认为0。范围 :[20, 1000] + - **MasterDataDiskType** (str) - Master节点数据盘类型。请参考 `磁盘类型 `_ 。默认为SSD云盘 + - **MasterIsolationGroup** (str) - 【无效,已删除】当前将自动为Master节点创建隔离组,确保Master节点归属于不同物理机。 + - **MasterMinimalCpuPlatform** (str) - Master节点的最低cpu平台,不选则随机。枚举值["Intel/Auto", "Intel/IvyBridge", "Intel/Haswell", "Intel/Broadwell", "Intel/Skylake", "Intel/Cascadelake"。 + - **Nodes** (list) - 见 **CreateUK8SClusterV2ParamNodes** 模型定义 + - **Quantity** (int) - 购买时长。默认为1。按小时购买(Dynamic)时无需此参数。 月付时,此参数传0,代表了购买至月末。 + - **Tag** (str) - 业务组 + - **UserData** (str) - 用户自定义数据。注意:1、总数据量大小不超多16K;2、使用base64编码。 + + **Response** + + - **ClusterId** (str) - 集群ID + + **Request Model** + + **CreateUK8SClusterV2ParamKubeProxy** + - **Mode** (str) - 集群kube-proxy模式。支持iptables和ipvs,默认为iptables。 + + + **CreateUK8SClusterV2ParamMaster** + - **Zone** (str) - Master节点所属可用区,需要设置 Master.0.Zone、 Master.1.Zone、Master.2.Zone 三个 Master 节点的可用区。 三个节点可部署在不同可用区。参见 `可用区列表 `_ + + + **CreateUK8SClusterV2ParamNodes** + - **BootDiskSIze** (int) - Node节点的系统盘大小,单位GB,默认为40。范围:[40, 500]。注意SSD本地盘无法调整。 + - **BootDiskType** (str) - 一组Node节点的系统盘类型,请参考 `磁盘类型 `_ 。默认为SSD云盘 + - **CPU** (int) - 一组Node节点的虚拟CPU核数。单位:核,范围:[2, 64],可选范围参考控制台。 + - **Count** (int) - 一组Node节点的数量,范围:[1,10]。 + - **DataDiskSize** (int) - 数据磁盘大小,单位GB。默认0。范围 :[20, 1000] + - **DataDiskType** (str) - 一组Node节点的数据盘类型,请参考 `磁盘类型 `_ 。默认为SSD云盘 + - **GPU** (int) - 一组Node节点的GPU卡核心数,仅GPU机型支持此字段。 + - **GpuType** (str) - 一组Node节点的GPU类型,枚举值["K80", "P40", "V100"],最新值参考Console。 + - **IsolationGroup** (str) - 一组Node节点的隔离组Id,归属于同一隔离组的虚拟机节点将落在不同的物理机上,单个隔离组最多只能容纳8个节点。参见DescribeIsolationGroup。 + - **Labels** (str) - Node节点标签,形式为key=value,多组Labels用”,“隔开,最多支持五组。 + - **MachineType** (str) - 一组Nodes节点云主机机型,如["N", "C", "O", "OS"],具体请参照云主机机型。 + - **MaxPods** (int) - Node节点上可运行最大节点数,默认为110。 + - **Mem** (int) - 一组Node节点的内存大小。单位:MB,范围 :[4096, 262144],取值为1024的倍数,可选范围参考控制台。 + - **MinimalCpuPlatform** (str) - Node节点的最低cpu平台,不选则随机。枚举值["Intel/Auto", "Intel/IvyBridge", "Intel/Haswell", "Intel/Broadwell", "Intel/Skylake", "Intel/Cascadelake"。 + - **Taints** (str) - Node节点污点,形式为key=value:effect,多组taints用”,“隔开,最多支持五组。 + - **Zone** (str) - 一组Nodes节点所属可用区,可创建多组Nodes节点,如一组是CPU Nodes节点,另一组是GPU Nodes节点。参见 `可用区列表 `_ + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateUK8SClusterV2RequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUK8SClusterV2", d, **kwargs) + return apis.CreateUK8SClusterV2ResponseSchema().loads(resp) + + def del_uk8s_cluster( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DelUK8SCluster - 删除UK8S集群 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) 集群id + - **ReleaseUDisk** (bool) - 是否删除节点挂载的数据盘。枚举值[true:删除,false: 不删除],默认不删除 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DelUK8SClusterRequestSchema().dumps(d) + + resp = self.invoke("DelUK8SCluster", d, **kwargs) + return apis.DelUK8SClusterResponseSchema().loads(resp) + + def del_uk8s_cluster_node_v2( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DelUK8SClusterNodeV2 - 删除集群中的Node节点,删除前务必先将其中的Pod驱逐。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) UK8S集群ID。 可从UK8S控制台获取。 + - **NodeId** (str) - (Required) Node在UK8S处的唯一标示,如uk8s-reewqe5-sdasadsda。**非云主机或物理云主机资源Id** + - **ReleaseDataUDisk** (bool) - 删除节点时是否释放数据盘。 枚举值[true:释放,false: 不释放],默认为true。 + + **Response** + + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息。 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DelUK8SClusterNodeV2RequestSchema().dumps(d) + + resp = self.invoke("DelUK8SClusterNodeV2", d, **kwargs) + return apis.DelUK8SClusterNodeV2ResponseSchema().loads(resp) + + def describe_uk8s_cluster( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUK8SCluster - 获取集群信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目id + - **Region** (str) - (Config) 所属区域 + - **ClusterId** (str) - (Required) k8s集群ID + + **Response** + + - **ApiServer** (str) - 集群apiserver地址 + - **CACert** (str) - 集群CA根证书 + - **ClusterDomain** (str) - 自定义或者默认的clusterdomain + - **ClusterId** (str) - 集群ID + - **ClusterName** (str) - 资源名字 + - **CreateTime** (int) - 创建时间 + - **EtcdCert** (str) - 集群etcd服务证书 + - **EtcdKey** (str) - 集群etcd服务密钥 + - **ExternalApiServer** (str) - 集群外部apiserver地址 + - **KubeProxy** (dict) - 见 **KubeProxy** 模型定义 + - **MasterCount** (int) - Master 节点数量 + - **MasterList** (list) - 见 **UhostInfo** 模型定义 + - **MasterResourceStatus** (str) - Master配置预警:Normal正常;Warning 需要升级;Error 需要紧急升级; + - **NodeCount** (int) - Node节点数量 + - **NodeList** (list) - 见 **UhostInfo** 模型定义 + - **PodCIDR** (str) - Pod网段 + - **ServiceCIDR** (str) - 服务网段 + - **Status** (str) - 状态 + - **SubnetId** (str) - 所属子网 + - **VPCId** (str) - 所属VPC + - **Version** (str) - K8S版本 + + **Response Model** + + **KubeProxy** + - **Mode** (str) - KubeProxy模式,枚举值为[ipvs,iptables] + + + **UhostInfo** + - **CPU** (int) - Cpu数量 + - **CreateTime** (int) - 创建时间 + - **DiskSet** (list) - 见 **DiskSet** 模型定义 + - **ExpireTime** (int) - 到期时间 + - **IPSet** (list) - 见 **IPSet** 模型定义 + - **Memory** (int) - 内存 + - **Name** (str) - 主机名称 + - **NodeId** (str) - 主机ID + - **NodeType** (str) - 节点类型:uhost表示云主机;uphost表示物理云主机 + - **OsName** (str) - 镜像信息 + - **State** (str) - 主机状态 + - **Zone** (str) - 所在机房 + + + **DiskSet** + - **BackupType** (str) - 备份方案,枚举类型:BASIC_SNAPSHOT,普通快照;DATAARK,方舟。无快照则不返回该字段。 + - **DiskId** (str) - 磁盘长ID + - **DiskType** (str) - LOCAL_NOMAL| CLOUD_NORMAL| LOCAL_SSD| CLOUD_SSD|EXCLUSIVE_LOCAL_DISK + - **Drive** (str) - 磁盘盘符 + - **Encrypted** (str) - Yes: 加密 No: 非加密 + - **IOPS** (int) - 当前主机的IOPS值 + - **IsBoot** (str) - True| False + - **Name** (str) - UDisk名字(仅当磁盘是UDisk时返回) + - **Size** (int) - 磁盘大小,单位: GB + - **Type** (str) - 磁盘类型。系统盘: Boot,数据盘: Data,网络盘:Udisk + + + **IPSet** + - **Bandwidth** (int) - IP对应的带宽, 单位: Mb (内网IP不显示带宽信息) + - **Default** (str) - 是否默认的弹性网卡的信息。true: 是默认弹性网卡;其他值:不是。 + - **IP** (str) - IP地址 + - **IPId** (str) - IP资源ID (内网IP无对应的资源ID) + - **Type** (str) - 国际: Internation,BGP: Bgp,内网: Private + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUK8SClusterRequestSchema().dumps(d) + + resp = self.invoke("DescribeUK8SCluster", d, **kwargs) + return apis.DescribeUK8SClusterResponseSchema().loads(resp) + + def describe_uk8s_image( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUK8SImage - 获取UK8S支持的Node节点操作系统,可基于该操作系统制定自定义镜像 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **ImageSet** (list) - 见 **ImageInfo** 模型定义 + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息。 + - **PHostImageSet** (list) - 见 **ImageInfo** 模型定义 + + **Response Model** + + **ImageInfo** + - **ImageId** (str) - 镜像 Id + - **ImageName** (str) - 镜像名称 + - **NotSupportGPU** (bool) - 该镜像是否支持GPU机型,枚举值[true:不支持,false:支持]。 + - **ZoneId** (int) - 可用区 Id + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUK8SImageRequestSchema().dumps(d) + + resp = self.invoke("DescribeUK8SImage", d, **kwargs) + return apis.DescribeUK8SImageResponseSchema().loads(resp) + + def describe_uk8s_node( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUK8SNode - 用于获取 UK8S 节点详情 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) UK8S 集群 Id + - **Name** (str) - (Required) K8S 节点IP或者节点ID + + **Response** + + - **Action** (str) - 操作名称 + - **AllocatedPodCount** (int) - 已分配到当前节点的 Pod 数量 + - **Annotations** (list) - 字符串数组,每一项是类似 "node.alpha.kubernetes.io/ttl=0" 的注解 + - **CPUCapacity** (str) - 节点 CPU 总量 + - **CPULimits** (str) - 节点上已分配 Pod 的 CPU 限制值 + - **CPULimitsFraction** (str) - 节点上已分配 Pod 的 CPU 限制值占 CPU 总量的比例 + - **CPURequests** (str) - 节点上已分配 Pod 的 CPU 请求量 + - **CPURequestsFraction** (str) - 节点上已分配 Pod 的 CPU 请求量占 CPU 总量的比例 + - **Conditions** (list) - 见 **K8SNodeCondition** 模型定义 + - **ContainerImages** (list) - 节点上镜像名称数组 + - **ContainerRuntimeVersion** (str) - 容器运行时版本,如:"docker://18.9.9" + - **CreationTimestamp** (int) - 时间戳,单位是 秒 + - **Hostname** (str) - 主机名 + - **InternalIP** (str) - 内部 IP 地址 + - **KernelVersion** (str) - 内核版本,如:"4.19.0-6.el7.ucloud.x86_64" + - **KubeProxyVersion** (str) - kubeproxy 版本 + - **KubeletVersion** (str) - kubelet 版本 + - **Labels** (list) - 字符串数组,每一项是类似 "kubernetes.io/arch=amd64" 的标签 + - **MemoryCapacity** (str) - 节点内存总量 + - **MemoryLimits** (str) - 节点上已分配 Pod 的内存限制量 + - **MemoryLimitsFraction** (str) - 节点上已分配 Pod 的内存限制量占内存总量的比例,如返回值为 "18",则意味着限制量占总量的 18% + - **MemoryRequests** (str) - 节点上已分配 Pod 的内存请求量 + - **MemoryRequestsFraction** (str) - 节点上已分配 Pod 的内存请求量占内存总量的比例,如返回值为 "4.5",则意味着请求量占总量的 4.5% + - **Message** (str) - 操作出错时的提示信息 + - **Name** (str) - 节点名称 + - **OSImage** (str) - 操作系统类型,如:"CentOS Linux 7 (Core)" + - **PodCapacity** (int) - 节点允许的可分配 Pod 最大数量 + - **ProviderID** (str) - 字符串,如:"UCloud://cn-sh2-02//uk8s-vsc0vgob-n-mpzxc" + - **RetCode** (int) - 返回码 + - **Taints** (list) - 字符串数组,每一项是类似 "node-role.kubernetes.io/master:NoSchedule" 的污点 + - **Unschedulable** (bool) - 是否禁止调度 + + **Response Model** + + **K8SNodeCondition** + - **LastProbeTime** (str) - 最后一次上报状态的时间 + - **LastTransitionTime** (str) - 最后一次状态转变时间 + - **Message** (str) - 状态变化的描述信息 + - **Reason** (str) - 状态变化的原因 + - **Status** (str) - 状态,False、True + - **Type** (str) - Condition 类型,如 MemoryPressure、DiskPressure、PIDPressure、Ready + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUK8SNodeRequestSchema().dumps(d) + + resp = self.invoke("DescribeUK8SNode", d, **kwargs) + return apis.DescribeUK8SNodeResponseSchema().loads(resp) + + def list_uk8s_cluster_node_v2( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUK8SClusterNodeV2 - 获取UK8S集群节点信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) UK8S集群ID + + **Response** + + - **NodeSet** (list) - 见 **NodeInfoV2** 模型定义 + - **TotalCount** (int) - 满足条件的节点数量,包括Master。 + + **Response Model** + + **NodeInfoV2** + - **AsgId** (str) - 节点所属伸缩组ID,非伸缩组创建出来的节点,伸缩组ID为Default。 + - **CPU** (int) - Node节点CPU核数,单位: 个。 + - **CreateTime** (int) - 节点创建时间 + - **ExpireTime** (int) - 节点计费到期时间 + - **GPU** (int) - 节点的GPU颗数。 + - **IPSet** (list) - 见 **UHostIPSet** 模型定义 + - **InstanceId** (str) - 资源ID,如uhost-xxxx,或uphost-xxxxx。 + - **InstanceName** (str) - 资源名称,初始值等于NodeId,用户可在UHost或UPHost处修改。 + - **InstanceType** (str) - Node节点的资源类型,枚举值为UHost或UPHost。 + - **KubeProxy** (dict) - 见 **KubeProxy** 模型定义 + - **MachineType** (str) - 机型类别,分别对应Uhost的MachineType或PHost的PHostType。 + - **Memory** (int) - 内存大小,单位: MB。 + - **NodeId** (str) - NodeId,Node在UK8S处的唯一标示,如uk8s-reewqe5-sdasadsda + - **NodeLogInfo** (str) - 加节点时判断是否没有资源,如果返回NORESOURCE则代表没有资源了 + - **NodeRole** (str) - node角色,枚举值为master、node + - **NodeStatus** (str) - Node的状态:枚举值:初始化:"Initializing";启动中:"Starting";运行:"Running";停止中:"Stopping";停止:"Stopped";待删除:"ToBeDeleted";删除中:"Deleting";异常:"Error";安装失败:"Install Fail"; + - **OsName** (str) - Node节点的镜像名称。 + - **OsType** (str) - Node节点的操作系统类别,如Linux或Windows。 + - **Unschedulable** (bool) - 是否允许Pod调度到该节点,枚举值为true或false。 + - **Zone** (str) - Node所在可用区 + + + **UHostIPSet** + - **Bandwidth** (int) - IP对应的带宽, 单位: Mb (内网IP不显示带宽信息) + - **IP** (str) - IP地址 + - **IPId** (str) - IP资源ID (内网IP无对应的资源ID) + - **Mac** (str) - Mac地址 + - **SubnetId** (str) - IP地址对应的子网 ID + - **Type** (str) - 国际: Internation,BGP: Bgp,内网: Private + - **VPCId** (str) - IP地址对应的VPC ID + + + **KubeProxy** + - **Mode** (str) - KubeProxy模式,枚举值为[ipvs,iptables] + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUK8SClusterNodeV2RequestSchema().dumps(d) + + resp = self.invoke("ListUK8SClusterNodeV2", d, **kwargs) + return apis.ListUK8SClusterNodeV2ResponseSchema().loads(resp) + + def list_uk8s_cluster_v2( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUK8SClusterV2 - 获取UK8S集群列表信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - UK8S集群ID + - **Limit** (int) - 返回数据长度,默认为20。 + - **Offset** (int) - 列表起始位置偏移量,默认为0。 + + **Response** + + - **ClusterCount** (int) - 满足条件的集群数量 + - **ClusterSet** (list) - 见 **ClusterSet** 模型定义 + + **Response Model** + + **ClusterSet** + - **ApiServer** (str) - 集群apiserver地址 + - **ClusterId** (str) - 集群ID + - **ClusterLogInfo** (str) - 创建集群时判断如果为NORESOURCE则为没资源,否则为空 + - **ClusterName** (str) - 资源名字 + - **CreateTime** (int) - 创建时间 + - **ExternalApiServer** (str) - 集群外部apiserver地址 + - **K8sVersion** (str) - 集群版本 + - **MasterCount** (int) - Master 节点数量 + - **NodeCount** (int) - Node节点数量 + - **PodCIDR** (str) - Pod网段 + - **ServiceCIDR** (str) - 服务网段 + - **Status** (str) - 集群状态,枚举值:初始化:"INITIALIZING";启动中:"STARTING";创建失败:"CREATEFAILED";正常运行:"RUNNING";添加节点:"ADDNODE";删除节点:"DELNODE";删除中:"DELETING";删除失败:"DELETEFAILED";错误:"ERROR";升级插件:"UPDATE_PLUGIN";更新插件信息:"UPDATE_PLUGIN_INFO";异常:"ABNORMAL";升级集群中:"UPGRADING";容器运行时切换:"CONVERTING" + - **SubnetId** (str) - 所属子网 + - **VPCId** (str) - 所属VPC + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUK8SClusterV2RequestSchema().dumps(d) + + resp = self.invoke("ListUK8SClusterV2", d, **kwargs) + return apis.ListUK8SClusterV2ResponseSchema().loads(resp) + + def list_uk8s_node_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUK8SNodeGroup - 列出UK8S节点池 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) 集群ID + + **Response** + + - **NodeGroupList** (list) - 见 **NodeGroupSet** 模型定义 + + **Response Model** + + **NodeGroupSet** + - **BootDiskSize** (int) - 系统盘大小 + - **BootDiskType** (str) - 系统盘类型 + - **CPU** (int) - 虚拟CPU核数 + - **ChargeType** (str) - 付费方式 + - **DataDiskSize** (int) - 数据盘大小 + - **DataDiskType** (str) - 数据盘类型 + - **GPU** (int) - GPU卡核心数 + - **GpuType** (str) - GPU类型 + - **ImageId** (str) - 镜像ID + - **MachineType** (str) - 机型 + - **Mem** (int) - 内存大小 + - **MinimalCpuPlatform** (str) - cpu平台 + - **NodeGroupId** (str) - 节点池ID + - **NodeGroupName** (str) - 节点池名字 + - **NodeList** (list) - 节点id列表 + - **Tag** (str) - 业务组 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUK8SNodeGroupRequestSchema().dumps(d) + + resp = self.invoke("ListUK8SNodeGroup", d, **kwargs) + return apis.ListUK8SNodeGroupResponseSchema().loads(resp) + + def remove_uk8s_node_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RemoveUK8SNodeGroup - 删除UK8S节点池 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) 集群id + - **NodeGroupId** (str) - (Required) 节点池Id + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.RemoveUK8SNodeGroupRequestSchema().dumps(d) + + resp = self.invoke("RemoveUK8SNodeGroup", d, **kwargs) + return apis.RemoveUK8SNodeGroupResponseSchema().loads(resp) diff --git a/ucloud/services/uk8s/schemas/__init__.py b/ucloud/services/uk8s/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/uk8s/schemas/apis.py b/ucloud/services/uk8s/schemas/apis.py new file mode 100644 index 00000000..85eb6bed --- /dev/null +++ b/ucloud/services/uk8s/schemas/apis.py @@ -0,0 +1,639 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.uk8s.schemas import models + +""" UK8S API Schema +""" + + +""" +API: AddUK8SExistingUHost + +将预先创建好的云主机加入到UK8S集群,需要注意的是,该云主机依然会执行重装系统的操作。 +""" + + +class AddUK8SExistingUHostRequestSchema(schema.RequestSchema): + """AddUK8SExistingUHost - 将预先创建好的云主机加入到UK8S集群,需要注意的是,该云主机依然会执行重装系统的操作。""" + + fields = { + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "DisableSchedule": fields.Bool( + required=False, dump_to="DisableSchedule" + ), + "ImageId": fields.Str(required=False, dump_to="ImageId"), + "InitScript": fields.Str(required=False, dump_to="InitScript"), + "Labels": fields.Str(required=False, dump_to="Labels"), + "MaxPods": fields.Int(required=False, dump_to="MaxPods"), + "Password": fields.Str(required=True, dump_to="Password"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "UHostId": fields.Str(required=True, dump_to="UHostId"), + "UserData": fields.Str(required=False, dump_to="UserData"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class AddUK8SExistingUHostResponseSchema(schema.ResponseSchema): + """AddUK8SExistingUHost - 将预先创建好的云主机加入到UK8S集群,需要注意的是,该云主机依然会执行重装系统的操作。""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: AddUK8SNodeGroup + +添加UK8S节点池 +""" + + +class AddUK8SNodeGroupRequestSchema(schema.RequestSchema): + """AddUK8SNodeGroup - 添加UK8S节点池""" + + fields = { + "BootDiskSize": fields.Int(required=False, dump_to="BootDiskSize"), + "BootDiskType": fields.Str(required=False, dump_to="BootDiskType"), + "CPU": fields.Int(required=False, dump_to="CPU"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "DataDiskSize": fields.Int(required=False, dump_to="DataDiskSize"), + "DataDiskType": fields.Str(required=False, dump_to="DataDiskType"), + "GPU": fields.Int(required=False, dump_to="GPU"), + "GpuType": fields.Str(required=False, dump_to="GpuType"), + "ImageId": fields.Str(required=False, dump_to="ImageId"), + "MachineType": fields.Str(required=False, dump_to="MachineType"), + "Mem": fields.Int(required=False, dump_to="Mem"), + "MinimalCpuPlatform": fields.Str( + required=False, dump_to="MinimalCpuPlatform" + ), + "NodeGroupName": fields.Str(required=True, dump_to="NodeGroupName"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class AddUK8SNodeGroupResponseSchema(schema.ResponseSchema): + """AddUK8SNodeGroup - 添加UK8S节点池""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "NodeGroupId": fields.Str(required=True, load_from="NodeGroupId"), + } + + +""" +API: AddUK8SPHostNode + +为UK8S集群添加一台或多台物理云主机类型的节点。 +""" + + +class AddUK8SPHostNodeRequestSchema(schema.RequestSchema): + """AddUK8SPHostNode - 为UK8S集群添加一台或多台物理云主机类型的节点。""" + + fields = { + "ChargeType": fields.Str(required=True, dump_to="ChargeType"), + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "Count": fields.Int(required=True, dump_to="Count"), + "DisableSchedule": fields.Bool( + required=False, dump_to="DisableSchedule" + ), + "ImageId": fields.Str(required=False, dump_to="ImageId"), + "InitScript": fields.Str(required=False, dump_to="InitScript"), + "Labels": fields.Str(required=False, dump_to="Labels"), + "MaxPods": fields.Int(required=False, dump_to="MaxPods"), + "NIC": fields.Str(required=False, dump_to="NIC"), + "Password": fields.Str(required=True, dump_to="Password"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Raid": fields.Str(required=False, dump_to="Raid"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "Type": fields.Str(required=False, dump_to="Type"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class AddUK8SPHostNodeResponseSchema(schema.ResponseSchema): + """AddUK8SPHostNode - 为UK8S集群添加一台或多台物理云主机类型的节点。""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: AddUK8SUHostNode + +为UK8S集群添加一台Node节点,机型类型为云主机 +""" + + +class AddUK8SUHostNodeRequestSchema(schema.RequestSchema): + """AddUK8SUHostNode - 为UK8S集群添加一台Node节点,机型类型为云主机""" + + fields = { + "BootDiskSize": fields.Int(required=False, dump_to="BootDiskSize"), + "BootDiskType": fields.Str(required=False, dump_to="BootDiskType"), + "CPU": fields.Int(required=True, dump_to="CPU"), + "ChargeType": fields.Str(required=True, dump_to="ChargeType"), + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "Count": fields.Int(required=True, dump_to="Count"), + "DataDiskSize": fields.Int(required=False, dump_to="DataDiskSize"), + "DataDiskType": fields.Str(required=False, dump_to="DataDiskType"), + "DisableSchedule": fields.Bool( + required=False, dump_to="DisableSchedule" + ), + "GPU": fields.Int(required=False, dump_to="GPU"), + "GpuType": fields.Str(required=False, dump_to="GpuType"), + "ImageId": fields.Str(required=False, dump_to="ImageId"), + "InitScript": fields.Str(required=False, dump_to="InitScript"), + "IsolationGroup": fields.Str(required=False, dump_to="IsolationGroup"), + "Labels": fields.Str(required=False, dump_to="Labels"), + "MachineType": fields.Str(required=False, dump_to="MachineType"), + "MaxPods": fields.Int(required=False, dump_to="MaxPods"), + "Mem": fields.Int(required=True, dump_to="Mem"), + "MinimalCpuPlatform": fields.Str( + required=False, dump_to="MinimalCpuPlatform" + ), + "MinmalCpuPlatform": fields.Str( + required=False, dump_to="MinmalCpuPlatform" + ), # Deprecated, will be removed at 1.0 + "NodeGroupId": fields.Str(required=False, dump_to="NodeGroupId"), + "Password": fields.Str(required=True, dump_to="Password"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "Taints": fields.Str(required=False, dump_to="Taints"), + "UserData": fields.Str(required=False, dump_to="UserData"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class AddUK8SUHostNodeResponseSchema(schema.ResponseSchema): + """AddUK8SUHostNode - 为UK8S集群添加一台Node节点,机型类型为云主机""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "NodeIds": fields.List( + fields.Str(), required=False, load_from="NodeIds" + ), + } + + +""" +API: CreateUK8SClusterV2 + +创建UK8S集群 +""" + + +class CreateUK8SClusterV2ParamKubeProxySchema(schema.RequestSchema): + """CreateUK8SClusterV2ParamKubeProxy -""" + + fields = { + "Mode": fields.Str(required=False, dump_to="Mode"), + } + + +class CreateUK8SClusterV2ParamMasterSchema(schema.RequestSchema): + """CreateUK8SClusterV2ParamMaster -""" + + fields = { + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateUK8SClusterV2ParamNodesSchema(schema.RequestSchema): + """CreateUK8SClusterV2ParamNodes -""" + + fields = { + "BootDiskSIze": fields.Int(required=False, dump_to="BootDiskSIze"), + "BootDiskType": fields.Str(required=False, dump_to="BootDiskType"), + "CPU": fields.Int(required=True, dump_to="CPU"), + "Count": fields.Int(required=True, dump_to="Count"), + "DataDiskSize": fields.Int(required=False, dump_to="DataDiskSize"), + "DataDiskType": fields.Str(required=False, dump_to="DataDiskType"), + "GPU": fields.Int(required=False, dump_to="GPU"), + "GpuType": fields.Str(required=False, dump_to="GpuType"), + "IsolationGroup": fields.Str(required=False, dump_to="IsolationGroup"), + "Labels": fields.Str(required=False, dump_to="Labels"), + "MachineType": fields.Str(required=True, dump_to="MachineType"), + "MaxPods": fields.Int(required=False, dump_to="MaxPods"), + "Mem": fields.Int(required=True, dump_to="Mem"), + "MinimalCpuPlatform": fields.Str( + required=False, dump_to="MinimalCpuPlatform" + ), + "MinmalCpuPlatform": fields.Str( + required=False, dump_to="MinmalCpuPlatform" + ), # Deprecated, will be removed at 1.0 + "Taints": fields.Str(required=False, dump_to="Taints"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateUK8SClusterV2RequestSchema(schema.RequestSchema): + """CreateUK8SClusterV2 - 创建UK8S集群""" + + fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "ClusterDomain": fields.Str(required=False, dump_to="ClusterDomain"), + "ClusterName": fields.Str(required=True, dump_to="ClusterName"), + "ExternalApiServer": fields.Str( + required=False, dump_to="ExternalApiServer" + ), + "ImageId": fields.Str(required=False, dump_to="ImageId"), + "InitScript": fields.Str(required=False, dump_to="InitScript"), + "K8sVersion": fields.Str(required=False, dump_to="K8sVersion"), + "KubeProxy": CreateUK8SClusterV2ParamKubeProxySchema( + required=False, dump_to="KubeProxy" + ), + "Master": fields.List(CreateUK8SClusterV2ParamMasterSchema()), + "MasterBootDiskSize": fields.Int( + required=False, dump_to="MasterBootDiskSize" + ), + "MasterBootDiskType": fields.Str( + required=False, dump_to="MasterBootDiskType" + ), + "MasterCPU": fields.Int(required=True, dump_to="MasterCPU"), + "MasterDataDiskSize": fields.Int( + required=False, dump_to="MasterDataDiskSize" + ), + "MasterDataDiskType": fields.Str( + required=False, dump_to="MasterDataDiskType" + ), + "MasterIsolationGroup": fields.Str( + required=False, dump_to="MasterIsolationGroup" + ), + "MasterMachineType": fields.Str( + required=True, dump_to="MasterMachineType" + ), + "MasterMem": fields.Int(required=True, dump_to="MasterMem"), + "MasterMinimalCpuPlatform": fields.Str( + required=False, dump_to="MasterMinimalCpuPlatform" + ), + "MasterMinmalCpuPlatform": fields.Str( + required=False, dump_to="MasterMinmalCpuPlatform" + ), # Deprecated, will be removed at 1.0 + "Nodes": fields.List(CreateUK8SClusterV2ParamNodesSchema()), + "Password": fields.Str(required=True, dump_to="Password"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "ServiceCIDR": fields.Str(required=True, dump_to="ServiceCIDR"), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "UserData": fields.Str(required=False, dump_to="UserData"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + } + + +class CreateUK8SClusterV2ResponseSchema(schema.ResponseSchema): + """CreateUK8SClusterV2 - 创建UK8S集群""" + + fields = { + "ClusterId": fields.Str(required=True, load_from="ClusterId"), + } + + +""" +API: DelUK8SCluster + +删除UK8S集群 +""" + + +class DelUK8SClusterRequestSchema(schema.RequestSchema): + """DelUK8SCluster - 删除UK8S集群""" + + fields = { + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ReleaseUDisk": fields.Bool(required=False, dump_to="ReleaseUDisk"), + } + + +class DelUK8SClusterResponseSchema(schema.ResponseSchema): + """DelUK8SCluster - 删除UK8S集群""" + + fields = {} + + +""" +API: DelUK8SClusterNodeV2 + +删除集群中的Node节点,删除前务必先将其中的Pod驱逐。 +""" + + +class DelUK8SClusterNodeV2RequestSchema(schema.RequestSchema): + """DelUK8SClusterNodeV2 - 删除集群中的Node节点,删除前务必先将其中的Pod驱逐。""" + + fields = { + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "NodeId": fields.Str(required=True, dump_to="NodeId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ReleaseDataUDisk": fields.Bool( + required=False, dump_to="ReleaseDataUDisk" + ), + } + + +class DelUK8SClusterNodeV2ResponseSchema(schema.ResponseSchema): + """DelUK8SClusterNodeV2 - 删除集群中的Node节点,删除前务必先将其中的Pod驱逐。""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: DescribeUK8SCluster + +获取集群信息 +""" + + +class DescribeUK8SClusterRequestSchema(schema.RequestSchema): + """DescribeUK8SCluster - 获取集群信息""" + + fields = { + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DescribeUK8SClusterResponseSchema(schema.ResponseSchema): + """DescribeUK8SCluster - 获取集群信息""" + + fields = { + "ApiServer": fields.Str(required=False, load_from="ApiServer"), + "CACert": fields.Str(required=False, load_from="CACert"), + "ClusterDomain": fields.Str(required=False, load_from="ClusterDomain"), + "ClusterId": fields.Str(required=True, load_from="ClusterId"), + "ClusterName": fields.Str(required=True, load_from="ClusterName"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "EtcdCert": fields.Str(required=False, load_from="EtcdCert"), + "EtcdKey": fields.Str(required=False, load_from="EtcdKey"), + "ExternalApiServer": fields.Str( + required=False, load_from="ExternalApiServer" + ), + "KubeProxy": models.KubeProxySchema(), + "MasterCount": fields.Int(required=True, load_from="MasterCount"), + "MasterList": fields.List( + models.UhostInfoSchema(), required=False, load_from="MasterList" + ), + "MasterResourceStatus": fields.Str( + required=False, load_from="MasterResourceStatus" + ), + "NodeCount": fields.Int(required=False, load_from="NodeCount"), + "NodeList": fields.List( + models.UhostInfoSchema(), required=False, load_from="NodeList" + ), + "PodCIDR": fields.Str(required=True, load_from="PodCIDR"), + "ServiceCIDR": fields.Str(required=True, load_from="ServiceCIDR"), + "Status": fields.Str(required=False, load_from="Status"), + "SubnetId": fields.Str(required=True, load_from="SubnetId"), + "VPCId": fields.Str(required=True, load_from="VPCId"), + "Version": fields.Str(required=False, load_from="Version"), + } + + +""" +API: DescribeUK8SImage + +获取UK8S支持的Node节点操作系统,可基于该操作系统制定自定义镜像 +""" + + +class DescribeUK8SImageRequestSchema(schema.RequestSchema): + """DescribeUK8SImage - 获取UK8S支持的Node节点操作系统,可基于该操作系统制定自定义镜像""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DescribeUK8SImageResponseSchema(schema.ResponseSchema): + """DescribeUK8SImage - 获取UK8S支持的Node节点操作系统,可基于该操作系统制定自定义镜像""" + + fields = { + "ImageSet": fields.List( + models.ImageInfoSchema(), required=False, load_from="ImageSet" + ), + "Message": fields.Str(required=True, load_from="Message"), + "PHostImageSet": fields.List( + models.ImageInfoSchema(), required=False, load_from="PHostImageSet" + ), + } + + +""" +API: DescribeUK8SNode + +用于获取 UK8S 节点详情 +""" + + +class DescribeUK8SNodeRequestSchema(schema.RequestSchema): + """DescribeUK8SNode - 用于获取 UK8S 节点详情""" + + fields = { + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "Name": fields.Str(required=True, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DescribeUK8SNodeResponseSchema(schema.ResponseSchema): + """DescribeUK8SNode - 用于获取 UK8S 节点详情""" + + fields = { + "Action": fields.Str(required=True, load_from="Action"), + "AllocatedPodCount": fields.Int( + required=True, load_from="AllocatedPodCount" + ), + "Annotations": fields.List( + fields.Str(), required=True, load_from="Annotations" + ), + "CPUCapacity": fields.Str(required=True, load_from="CPUCapacity"), + "CPULimits": fields.Str(required=True, load_from="CPULimits"), + "CPULimitsFraction": fields.Str( + required=True, load_from="CPULimitsFraction" + ), + "CPURequests": fields.Str(required=True, load_from="CPURequests"), + "CPURequestsFraction": fields.Str( + required=True, load_from="CPURequestsFraction" + ), + "Conditions": fields.List( + models.K8SNodeConditionSchema(), + required=True, + load_from="Conditions", + ), + "ContainerImages": fields.List( + fields.Str(), required=True, load_from="ContainerImages" + ), + "ContainerRuntimeVersion": fields.Str( + required=True, load_from="ContainerRuntimeVersion" + ), + "CreationTimestamp": fields.Int( + required=True, load_from="CreationTimestamp" + ), + "Hostname": fields.Str(required=True, load_from="Hostname"), + "InternalIP": fields.Str(required=True, load_from="InternalIP"), + "KernelVersion": fields.Str(required=True, load_from="KernelVersion"), + "KubeProxyVersion": fields.Str( + required=True, load_from="KubeProxyVersion" + ), + "KubeletVersion": fields.Str(required=True, load_from="KubeletVersion"), + "Labels": fields.List(fields.Str(), required=True, load_from="Labels"), + "MemoryCapacity": fields.Str(required=True, load_from="MemoryCapacity"), + "MemoryLimits": fields.Str(required=True, load_from="MemoryLimits"), + "MemoryLimitsFraction": fields.Str( + required=True, load_from="MemoryLimitsFraction" + ), + "MemoryRequests": fields.Str(required=True, load_from="MemoryRequests"), + "MemoryRequestsFraction": fields.Str( + required=True, load_from="MemoryRequestsFraction" + ), + "Message": fields.Str(required=True, load_from="Message"), + "Name": fields.Str(required=True, load_from="Name"), + "OSImage": fields.Str(required=True, load_from="OSImage"), + "PodCapacity": fields.Int(required=True, load_from="PodCapacity"), + "ProviderID": fields.Str(required=True, load_from="ProviderID"), + "RetCode": fields.Int(required=True, load_from="RetCode"), + "Taints": fields.List(fields.Str(), required=False, load_from="Taints"), + "Unschedulable": fields.Bool(required=True, load_from="Unschedulable"), + } + + +""" +API: ListUK8SClusterNodeV2 + +获取UK8S集群节点信息 +""" + + +class ListUK8SClusterNodeV2RequestSchema(schema.RequestSchema): + """ListUK8SClusterNodeV2 - 获取UK8S集群节点信息""" + + fields = { + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class ListUK8SClusterNodeV2ResponseSchema(schema.ResponseSchema): + """ListUK8SClusterNodeV2 - 获取UK8S集群节点信息""" + + fields = { + "NodeSet": fields.List( + models.NodeInfoV2Schema(), required=True, load_from="NodeSet" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: ListUK8SClusterV2 + +获取UK8S集群列表信息 +""" + + +class ListUK8SClusterV2RequestSchema(schema.RequestSchema): + """ListUK8SClusterV2 - 获取UK8S集群列表信息""" + + fields = { + "ClusterId": fields.Str(required=False, dump_to="ClusterId"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class ListUK8SClusterV2ResponseSchema(schema.ResponseSchema): + """ListUK8SClusterV2 - 获取UK8S集群列表信息""" + + fields = { + "ClusterCount": fields.Int(required=True, load_from="ClusterCount"), + "ClusterSet": fields.List( + models.ClusterSetSchema(), required=False, load_from="ClusterSet" + ), + } + + +""" +API: ListUK8SNodeGroup + +列出UK8S节点池 +""" + + +class ListUK8SNodeGroupRequestSchema(schema.RequestSchema): + """ListUK8SNodeGroup - 列出UK8S节点池""" + + fields = { + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str( + required=False, dump_to="Zone" + ), # Deprecated, will be removed at 1.0 + } + + +class ListUK8SNodeGroupResponseSchema(schema.ResponseSchema): + """ListUK8SNodeGroup - 列出UK8S节点池""" + + fields = { + "NodeGroupList": fields.List( + models.NodeGroupSetSchema(), + required=False, + load_from="NodeGroupList", + ), + } + + +""" +API: RemoveUK8SNodeGroup + +删除UK8S节点池 +""" + + +class RemoveUK8SNodeGroupRequestSchema(schema.RequestSchema): + """RemoveUK8SNodeGroup - 删除UK8S节点池""" + + fields = { + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "NodeGroupId": fields.Str(required=True, dump_to="NodeGroupId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str( + required=False, dump_to="Zone" + ), # Deprecated, will be removed at 1.0 + } + + +class RemoveUK8SNodeGroupResponseSchema(schema.ResponseSchema): + """RemoveUK8SNodeGroup - 删除UK8S节点池""" + + fields = {} diff --git a/ucloud/services/uk8s/schemas/models.py b/ucloud/services/uk8s/schemas/models.py new file mode 100644 index 00000000..a3f8d1ff --- /dev/null +++ b/ucloud/services/uk8s/schemas/models.py @@ -0,0 +1,179 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class DiskSetSchema(schema.ResponseSchema): + """DiskSet - 节点磁盘信息""" + + fields = { + "BackupType": fields.Str(required=False, load_from="BackupType"), + "DiskId": fields.Str(required=False, load_from="DiskId"), + "DiskType": fields.Str(required=False, load_from="DiskType"), + "Drive": fields.Str(required=False, load_from="Drive"), + "Encrypted": fields.Str(required=False, load_from="Encrypted"), + "IOPS": fields.Int(required=False, load_from="IOPS"), + "IsBoot": fields.Str(required=False, load_from="IsBoot"), + "Name": fields.Str(required=False, load_from="Name"), + "Size": fields.Int(required=False, load_from="Size"), + "Type": fields.Str(required=False, load_from="Type"), + } + + +class IPSetSchema(schema.ResponseSchema): + """IPSet - 节点的IP信息""" + + fields = { + "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), + "Default": fields.Str(required=False, load_from="Default"), + "IP": fields.Str(required=False, load_from="IP"), + "IPId": fields.Str(required=False, load_from="IPId"), + "Type": fields.Str(required=False, load_from="Type"), + } + + +class UhostInfoSchema(schema.ResponseSchema): + """UhostInfo - 机器信息""" + + fields = { + "CPU": fields.Int(required=True, load_from="CPU"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "DiskSet": fields.List(DiskSetSchema()), + "ExpireTime": fields.Int(required=True, load_from="ExpireTime"), + "IPSet": fields.List(IPSetSchema()), + "Memory": fields.Int(required=True, load_from="Memory"), + "Name": fields.Str(required=True, load_from="Name"), + "NodeId": fields.Str(required=True, load_from="NodeId"), + "NodeType": fields.Str(required=True, load_from="NodeType"), + "OsName": fields.Str(required=True, load_from="OsName"), + "State": fields.Str(required=True, load_from="State"), + "Zone": fields.Str(required=True, load_from="Zone"), + } + + +class KubeProxySchema(schema.ResponseSchema): + """KubeProxy - KubeProxy信息""" + + fields = { + "Mode": fields.Str(required=False, load_from="Mode"), + } + + +class ImageInfoSchema(schema.ResponseSchema): + """ImageInfo - UK8S 可用镜像信息""" + + fields = { + "ImageId": fields.Str(required=True, load_from="ImageId"), + "ImageName": fields.Str(required=True, load_from="ImageName"), + "NotSupportGPU": fields.Bool(required=True, load_from="NotSupportGPU"), + "ZoneId": fields.Int(required=True, load_from="ZoneId"), + } + + +class K8SNodeConditionSchema(schema.ResponseSchema): + """K8SNodeCondition - Kubernetes Node Condition""" + + fields = { + "LastProbeTime": fields.Str(required=False, load_from="LastProbeTime"), + "LastTransitionTime": fields.Str( + required=False, load_from="LastTransitionTime" + ), + "Message": fields.Str(required=False, load_from="Message"), + "Reason": fields.Str(required=False, load_from="Reason"), + "Status": fields.Str(required=False, load_from="Status"), + "Type": fields.Str(required=False, load_from="Type"), + } + + +class UHostIPSetSchema(schema.ResponseSchema): + """UHostIPSet - 云主机IP信息""" + + fields = { + "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), + "Default": fields.Str( + required=False, load_from="Default" + ), # Deprecated, will be removed at 1.0 + "IP": fields.Str(required=False, load_from="IP"), + "IPId": fields.Str(required=False, load_from="IPId"), + "Mac": fields.Str(required=False, load_from="Mac"), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "Type": fields.Str(required=False, load_from="Type"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + } + + +class NodeInfoV2Schema(schema.ResponseSchema): + """NodeInfoV2 - UK8S 节点信息""" + + fields = { + "AsgId": fields.Str(required=True, load_from="AsgId"), + "CPU": fields.Int(required=True, load_from="CPU"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "ExpireTime": fields.Int(required=True, load_from="ExpireTime"), + "GPU": fields.Int(required=False, load_from="GPU"), + "IPSet": fields.List(UHostIPSetSchema()), + "InstanceId": fields.Str(required=True, load_from="InstanceId"), + "InstanceName": fields.Str(required=True, load_from="InstanceName"), + "InstanceType": fields.Str(required=True, load_from="InstanceType"), + "KubeProxy": KubeProxySchema(), + "MachineType": fields.Str(required=True, load_from="MachineType"), + "Memory": fields.Int(required=True, load_from="Memory"), + "NodeId": fields.Str(required=True, load_from="NodeId"), + "NodeLogInfo": fields.Str(required=True, load_from="NodeLogInfo"), + "NodeRole": fields.Str(required=True, load_from="NodeRole"), + "NodeStatus": fields.Str(required=True, load_from="NodeStatus"), + "OsName": fields.Str(required=True, load_from="OsName"), + "OsType": fields.Str(required=True, load_from="OsType"), + "Unschedulable": fields.Bool(required=True, load_from="Unschedulable"), + "Zone": fields.Str(required=True, load_from="Zone"), + } + + +class ClusterSetSchema(schema.ResponseSchema): + """ClusterSet - 集群信息""" + + fields = { + "ApiServer": fields.Str(required=True, load_from="ApiServer"), + "ClusterId": fields.Str(required=True, load_from="ClusterId"), + "ClusterLogInfo": fields.Str( + required=False, load_from="ClusterLogInfo" + ), + "ClusterName": fields.Str(required=True, load_from="ClusterName"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "ExternalApiServer": fields.Str( + required=False, load_from="ExternalApiServer" + ), + "K8sVersion": fields.Str(required=True, load_from="K8sVersion"), + "MasterCount": fields.Int(required=True, load_from="MasterCount"), + "NodeCount": fields.Int(required=False, load_from="NodeCount"), + "PodCIDR": fields.Str(required=True, load_from="PodCIDR"), + "ServiceCIDR": fields.Str(required=True, load_from="ServiceCIDR"), + "Status": fields.Str(required=False, load_from="Status"), + "SubnetId": fields.Str(required=True, load_from="SubnetId"), + "VPCId": fields.Str(required=True, load_from="VPCId"), + } + + +class NodeGroupSetSchema(schema.ResponseSchema): + """NodeGroupSet - 节点池配置""" + + fields = { + "BootDiskSize": fields.Int(required=False, load_from="BootDiskSize"), + "BootDiskType": fields.Str(required=False, load_from="BootDiskType"), + "CPU": fields.Int(required=False, load_from="CPU"), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "DataDiskSize": fields.Int(required=False, load_from="DataDiskSize"), + "DataDiskType": fields.Str(required=False, load_from="DataDiskType"), + "GPU": fields.Int(required=False, load_from="GPU"), + "GpuType": fields.Str(required=False, load_from="GpuType"), + "ImageId": fields.Str(required=False, load_from="ImageId"), + "MachineType": fields.Str(required=False, load_from="MachineType"), + "Mem": fields.Int(required=False, load_from="Mem"), + "MinimalCpuPlatform": fields.Str( + required=False, load_from="MinimalCpuPlatform" + ), + "NodeGroupId": fields.Str(required=False, load_from="NodeGroupId"), + "NodeGroupName": fields.Str(required=False, load_from="NodeGroupName"), + "NodeList": fields.List(fields.Str()), + "Tag": fields.Str(required=False, load_from="Tag"), + } diff --git a/ucloud/services/ukafka/__init__.py b/ucloud/services/ukafka/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/ukafka/client.py b/ucloud/services/ukafka/client.py new file mode 100644 index 00000000..a232b991 --- /dev/null +++ b/ucloud/services/ukafka/client.py @@ -0,0 +1,567 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.ukafka.schemas import apis + + +class UKafkaClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UKafkaClient, self).__init__( + config, transport, middleware, logger + ) + + def add_ukafka_instance_node( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AddUKafkaInstanceNode - 给实例添加节点 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceId** (str) - (Required) 实例ID + - **NodeCount** (str) - (Required) 新添加节点数量 + - **NodeType** (str) - (Required) 机型,支持的机型可通过GetUKafkaNodeType 接口返回的InstanceTypeSet[].InstanceTypeName + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.AddUKafkaInstanceNodeRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AddUKafkaInstanceNode", d, **kwargs) + return apis.AddUKafkaInstanceNodeResponseSchema().loads(resp) + + def create_ukafka_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUKafkaInstance - 创建实例接口。\\ 创建实例前需要按以下步骤准备必要参数:\\ 1.获取Region(地域)和 Zone(可用区),访问链接:https://docs.ucloud.cn/api/summary/regionlist 可以获取所有支持的地域和可用区;\\ 2.获取FrameworkVersion,访问链接:https://docs.ucloud.cn/api/ukafka-api/list_ukafka_framework_version,响应字段的FrameworkVersions[N].Version是支持的 Kafka 版本;\\ 3.ChargeType付费类型,可用值:Dynamic为按小时付费,Month为按月付费,Year为按年付费;\\ 4.获取NodeType机型详情,访问链接:https://docs.ucloud.cn/api/ukafka-api/get_ukafka_node_type,响应字段的NodeTypeSet[N].NodeTypeName是支持的所有机型;\\ 5.获取DiskSize磁盘大小范围 ,访问链接:https://docs.ucloud.cn/api/ukafka-api/get_ukafka_node_type,该接口响应字段的NodeTypeSet[N].MinDiskSize和NodeTypeSet[N].MaxDiskSize是磁盘大小的取值范围;\\ 6.InstanceName,自定义输入实例名称,只能包含中英文、数字以及- _ . + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ChargeType** (str) - (Required) 付费方式 + - **DiskSize** (int) - (Required) 数据盘大小。支持范围根据GetUKafkaNodeType 接口返回的InstanceTypeSet[].MaxDiskSize 和MinDiskSize获取 + - **FrameworkVersion** (str) - (Required) kafka版本,支持的版本可通过ListUKafkaFrameworkVersion 接口返回字段的FrameworkVersions获取 + - **InstanceName** (str) - (Required) 实例名,可自定义。只能包含中英文、数字以及- _ . + - **NodeType** (str) - (Required) 机型,支持的机型可通过GetUKafkaNodeType 接口返回的InstanceTypeSet[].InstanceTypeName + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **BusinessId** (str) - 业务组,默认Default + - **DiskControllerType** (str) - 磁盘管理方式,支持值:NONE、CLEAN。默认值:NONE + - **DiskThreshold** (str) - 磁盘清理阈值,支持范围[70,90]。DiskControllerType 为CLEAN 时必填。默认值 90 + - **IsSecurityEnabled** (str) - 是否开启安全组,支持"true","false",默认 false + - **LogRetentionHours** (str) - kafka 日志保存时间,支持范围[1,240]。默认 72 小时 + - **NodeCount** (int) - 实例节点数量。默认 3 节点 + - **Quantity** (str) - 实例数量,默认 1 + - **SubnetId** (str) - 子网 ID,不填时为默认子网 ID + - **VPCId** (str) - VPCID,不填时为默认VPCID + + **Response** + + - **InstanceId** (str) - 实例资源 ID + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateUKafkaInstanceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUKafkaInstance", d, **kwargs) + return apis.CreateUKafkaInstanceResponseSchema().loads(resp) + + def delete_ukafka_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUKafkaInstance - 删除实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceId** (str) - (Required) 实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteUKafkaInstanceRequestSchema().dumps(d) + + resp = self.invoke("DeleteUKafkaInstance", d, **kwargs) + return apis.DeleteUKafkaInstanceResponseSchema().loads(resp) + + def describe_ukafka_consumer( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUKafkaConsumer - 获取 Kafka 消费组信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目 ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList 接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterInstanceId** (str) - (Required) 实例 ID + - **ConsumerGroup** (str) - (Required) 消费组组名 + - **Type** (str) - (Required) 消费者组类型(同消费者组列表返回的类型值) + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **GroupName** (str) - 消费者组组名 + - **Topics** (list) - 消费者组所订阅 topic 信息 + - **Type** (str) - 消费者组类型 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUKafkaConsumerRequestSchema().dumps(d) + + resp = self.invoke("DescribeUKafkaConsumer", d, **kwargs) + return apis.DescribeUKafkaConsumerResponseSchema().loads(resp) + + def describe_ukafka_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUKafkaInstance - 获取整个实例的信息。实例ID,可以通过ListUKafkaInstance 接口的ClusterSet. ClusterInstanceId 获取 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterInstanceId** (str) - (Required) 实例ID,可以通过ListUKafkaInstance 接口的ClusterSet. ClusterInstanceId 获取 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **ClusterSet** (list) - 见 **ClusterInfo** 模型定义 + + **Response Model** + + **IP** + - **IP** (str) - IP地址 + - **Type** (str) - IP类型 + + + **Url** + - **Addr** (str) - 访问地址 + - **Protocal** (str) - 访问协议 + + + **BrokerOfTopicInfo** + - **PartitionOnBroker** (str) - topic 在 broker 上分布的 partition 数量 + - **Partitions** (str) - topic 在 broker上 partition 列表 + - **Replication** (int) - Topic 副本数 + - **TopicName** (str) - topic 名称 + - **TotalPartitions** (int) - partition 数量 + + + **Endpoints** + - **PlainText** (dict) - 见 **Url** 模型定义 + - **SaslPlainText** (dict) - 见 **Url** 模型定义 + + + **UHostConfig** + - **BootDiskSize** (int) - 节点系统盘大小(单位G)【删除】 + - **CPU** (int) - 节点 CPU 核心数 + - **DataDiskSize** (int) - 节点数据盘大小(单位G) + - **DiskType** (str) - 节点数据盘类型 + - **Memory** (int) - 节点内存(单位MB) + - **OS** (str) - 节点内部系统名称【删除】 + + + **Broker** + - **BrokerId** (str) - broker id + - **BrokerInfo** (list) - 见 **BrokerOfTopicInfo** 模型定义 + - **CreateTime** (str) - broker 创建信息 + - **DomainName** (str) - broker 域名 + - **Endpoints** (dict) - 见 **Endpoints** 模型定义 + - **ExpireTime** (int) - broker 过期时间 + - **IPSet** (list) - 见 **IP** 模型定义 + - **InstanceGroupType** (str) - broker 机型信息 + - **KafkaPort** (int) - kafka 服务端口 + - **Remark** (str) - broker 备注信息 + - **ResourceId** (str) - broker 注册资源信息 + - **SecurityGroupId** (str) - 安全组 id + - **State** (str) - broker 当前状态 + - **UHostConfig** (dict) - 见 **UHostConfig** 模型定义 + - **UHostId** (str) - 节点 id + - **UHostName** (str) - 节点名称 + - **UHostRole** (str) - 节点类型 + - **ZooKeeper** (str) - 节点是否部署 zookeeper + - **ZooKeeperPort** (int) - zookeeper 服务端口 + + + **ClusterInfo** + - **AutoRenew** (str) - 是否开启自动续费 + - **BusinessId** (str) - 业务组 ID + - **ChargeType** (str) - 付费类型 + - **ClusterInstanceId** (str) - 实例id + - **ClusterInstanceName** (str) - 实例名称 + - **CreateTime** (int) - 实例创建时间 + - **ExpireTime** (int) - 实例过期时间 + - **Framework** (str) - 实例框架 + - **FrameworkVersion** (str) - 实例框架版本 + - **IsOpenSecgroup** (str) - 是否开启安全组 + - **NetworkId** (str) - 网络 id(已废弃) + - **Remark** (str) - 实例备注 + - **RunningTime** (int) - 实例运行时间 + - **State** (str) - 实例当前状态,实例状态:"Running"| "Abnormal"| "Creating"| "Deleting"| "CreateFailed"| "DeleteFailed"| "Unavailable"| "Deleted"| "Updating"| "Deploying"| "Migrating"| "ExpandFailed" + - **SubnetId** (str) - 所属子网 id + - **Tag** (str) - 实例标记 + - **UHostCount** (int) - 实例节点个数 + - **UHostSet** (list) - 见 **Broker** 模型定义 + - **VPCId** (str) - 所属 VPC id + - **ValidBrokerNum** (int) - 可用节点个数 + - **Zone** (str) - 所属可用区 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUKafkaInstanceRequestSchema().dumps(d) + + resp = self.invoke("DescribeUKafkaInstance", d, **kwargs) + return apis.DescribeUKafkaInstanceResponseSchema().loads(resp) + + def get_ukafka_node_type( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUKafkaNodeType - 获取节点机型配置 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **NodeType** (str) - 传参时返回指定机型信息,参数为空时返回所有机型信息 + + **Response** + + - **Message** (str) - 错误信息 + - **NodeTypeSet** (list) - 见 **InstanceType** 模型定义 + + **Response Model** + + **DiskSet** + - **Size** (str) - 磁盘大小 + - **Type** (str) - 磁盘类型。Boot 表示系统盘,Data 表示数据盘 + + + **InstanceType** + - **CPU** (int) - CPU核心数 + - **DiskSet** (dict) - 见 **DiskSet** 模型定义 + - **DiskType** (str) - 磁盘类型。RSSD 表示固态云盘,SSD 表示本地固态盘,COMMON 表示本地 SATA 盘 + - **IsOpenSecGroup** (bool) - 该机型是否支持安全组 + - **MaxDiskSize** (int) - 机型最大支持磁盘大小 + - **Memory** (str) - 内存大小(单位 MB) + - **MinDiskSize** (int) - 机型最小支持磁盘大小 + - **NodeTypeName** (str) - 机型名称 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUKafkaNodeTypeRequestSchema().dumps(d) + + resp = self.invoke("GetUKafkaNodeType", d, **kwargs) + return apis.GetUKafkaNodeTypeResponseSchema().loads(resp) + + def is_ukafka_topic_name_exist( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """IsUKafkaTopicNameExist - 检查一个topic名称是否已经在集群中了。实例ID,可以通过ListUKafkaInstance 接口的ClusterSet. ClusterInstanceId 获取 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterInstanceId** (str) - (Required) 实例ID,可以通过ListUKafkaInstance 接口的ClusterSet. ClusterInstanceId 获取 + - **TopicName** (str) - (Required) 待检查的topic名称 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **IsExist** (str) - 是否已经存在 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.IsUKafkaTopicNameExistRequestSchema().dumps(d) + + resp = self.invoke("IsUKafkaTopicNameExist", d, **kwargs) + return apis.IsUKafkaTopicNameExistResponseSchema().loads(resp) + + def list_ukafka_consumers( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUKafkaConsumers - 列出 Kafka 消费组 + + **Request** + + - **ProjectId** (str) - (Config) 项目 ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList 接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterInstanceId** (str) - (Required) 实例ID,可以通过ListUKafkaInstance 接口的ClusterSet. ClusterInstanceId 获取 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Groups** (list) - 见 **Group** 模型定义 + + **Response Model** + + **Group** + - **GroupId** (str) - 消费者组资源ID + - **GroupName** (str) - 消费者组组名 + - **NumOfTopics** (int) - 订阅 Topic 数量 + - **Type** (str) - 消费者组类型 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUKafkaConsumersRequestSchema().dumps(d) + + resp = self.invoke("ListUKafkaConsumers", d, **kwargs) + return apis.ListUKafkaConsumersResponseSchema().loads(resp) + + def list_ukafka_framework_version( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUKafkaFrameworkVersion - 列举ukafka框架版本 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **FrameworkVersions** (list) - 见 **Version** 模型定义 + - **Message** (str) - 错误信息 + + **Response Model** + + **Version** + - **Label** (str) - kafka 版本标签。recommend 表示推荐版本,beta 表示公测版本 + - **Version** (str) - kafka版本 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUKafkaFrameworkVersionRequestSchema().dumps(d) + + resp = self.invoke("ListUKafkaFrameworkVersion", d, **kwargs) + return apis.ListUKafkaFrameworkVersionResponseSchema().loads(resp) + + def list_ukafka_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUKafkaInstance - 获取实例列表信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **BusinessId** (str) - 业务组 ID + - **Limit** (str) - 默认为60 + - **Offset** (str) - 默认为0 + - **SubnetId** (str) - SubnetId + - **VPCId** (str) - VPCId + + **Response** + + - **ClusterSet** (dict) - 见 **ClusterSet** 模型定义 + - **Message** (str) - 错误信息 + - **TotalCount** (str) - 总数 + + **Response Model** + + **ClusterSet** + - **AutoRenew** (str) - 是否自动续费 + - **BusinessId** (str) - 业务组 ID + - **ChargeType** (str) - 付费类型 + - **ClusterInstanceId** (str) - 实例id + - **ClusterInstanceName** (str) - 实例名称 + - **CreateTime** (int) - 实例创建时间戳 + - **ExpireTime** (int) - 实例过期时间 + - **Framework** (str) - 框架 + - **FrameworkVersion** (str) - Kafka 框架版本 + - **InstanceGroupType** (str) - 实例机型 + - **NewMessage** (str) - 事件状态未读消息(已废弃) + - **RedundantCount** (int) - 冗余计数(已废弃) + - **Remark** (str) - 实例备注 + - **RunningTime** (int) - 实例运行时间 + - **State** (str) - 实例当前状态,集群状态:"Running"| "Abnormal"| "Creating"| "Deleting"| "CreateFailed"| "DeleteFailed"| "Unavailable"| "Deleted"| "Updating"| "Deploying"| "Migrating"| "ExpandFailed" + - **SubnetId** (str) - 所属子网 id + - **Tag** (str) - 实例标记 + - **UHostCount** (int) - 实例节点个数 + - **VPCId** (str) - 所属 VPC id + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUKafkaInstanceRequestSchema().dumps(d) + + resp = self.invoke("ListUKafkaInstance", d, **kwargs) + return apis.ListUKafkaInstanceResponseSchema().loads(resp) + + def list_ukafka_topics( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUKafkaTopics - 获取 kafka 实例 topic 列表信息。实例ID,可以通过ListUKafkaInstance 接口的ClusterSet. ClusterInstanceId 获取 + + **Request** + + - **ProjectId** (str) - (Config) 项目 ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList 接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterInstanceId** (str) - (Required) 实例ID,可以通过ListUKafkaInstance 接口的ClusterSet. ClusterInstanceId 获取 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Length** (int) - topic 列表长度 + - **TopicList** (list) - 见 **TopicInfo** 模型定义 + + **Response Model** + + **TopicInfo** + - **NumOfOccupyBroker** (int) - 占用 broker 数量 + - **NumOfPartition** (int) - 分区数量 + - **NumOfReplica** (int) - 副本数量 + - **Status** (str) - topic 状态 + - **Topic** (str) - topic 名称 + - **UnderReplicasPer** (float) - 落后副本占比 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUKafkaTopicsRequestSchema().dumps(d) + + resp = self.invoke("ListUKafkaTopics", d, **kwargs) + return apis.ListUKafkaTopicsResponseSchema().loads(resp) + + def modify_ukafka_instance_type( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUKafkaInstanceType - 规格升降级,仅升级CPU 和内存 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceId** (str) - (Required) 实例ID + - **NodeType** (str) - (Required) 目标机型,支持的机型可通过GetUKafkaNodeType 接口返回的InstanceTypeSet[].InstanceTypeName。仅升级CPU 和内存 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyUKafkaInstanceTypeRequestSchema().dumps(d) + + resp = self.invoke("ModifyUKafkaInstanceType", d, **kwargs) + return apis.ModifyUKafkaInstanceTypeResponseSchema().loads(resp) + + def resize_ukafka_disk( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ResizeUKafkaDisk - 磁盘扩容 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DiskSize** (int) - (Required) 数据盘大小。支持范围根据GetUKafkaNodeType 接口返回的InstanceTypeSet[].MaxDiskSize 和MinDiskSize获取 + - **InstanceId** (str) - (Required) 实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ResizeUKafkaDiskRequestSchema().dumps(d) + + resp = self.invoke("ResizeUKafkaDisk", d, **kwargs) + return apis.ResizeUKafkaDiskResponseSchema().loads(resp) diff --git a/ucloud/services/ukafka/schemas/__init__.py b/ucloud/services/ukafka/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/ukafka/schemas/apis.py b/ucloud/services/ukafka/schemas/apis.py new file mode 100644 index 00000000..d790c01b --- /dev/null +++ b/ucloud/services/ukafka/schemas/apis.py @@ -0,0 +1,410 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.ukafka.schemas import models + +""" UKafka API Schema +""" + + +""" +API: AddUKafkaInstanceNode + +给实例添加节点 +""" + + +class AddUKafkaInstanceNodeRequestSchema(schema.RequestSchema): + """AddUKafkaInstanceNode - 给实例添加节点""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "NodeCount": fields.Str(required=True, dump_to="NodeCount"), + "NodeType": fields.Str(required=True, dump_to="NodeType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class AddUKafkaInstanceNodeResponseSchema(schema.ResponseSchema): + """AddUKafkaInstanceNode - 给实例添加节点""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: CreateUKafkaInstance + +创建实例接口。\\ 创建实例前需要按以下步骤准备必要参数:\\ 1.获取Region(地域)和 Zone(可用区),访问链接:https://docs.ucloud.cn/api/summary/regionlist 可以获取所有支持的地域和可用区;\\ 2.获取FrameworkVersion,访问链接:https://docs.ucloud.cn/api/ukafka-api/list_ukafka_framework_version,响应字段的FrameworkVersions[N].Version是支持的 Kafka 版本;\\ 3.ChargeType付费类型,可用值:Dynamic为按小时付费,Month为按月付费,Year为按年付费;\\ 4.获取NodeType机型详情,访问链接:https://docs.ucloud.cn/api/ukafka-api/get_ukafka_node_type,响应字段的NodeTypeSet[N].NodeTypeName是支持的所有机型;\\ 5.获取DiskSize磁盘大小范围 ,访问链接:https://docs.ucloud.cn/api/ukafka-api/get_ukafka_node_type,该接口响应字段的NodeTypeSet[N].MinDiskSize和NodeTypeSet[N].MaxDiskSize是磁盘大小的取值范围;\\ 6.InstanceName,自定义输入实例名称,只能包含中英文、数字以及- _ . +""" + + +class CreateUKafkaInstanceRequestSchema(schema.RequestSchema): + """CreateUKafkaInstance - 创建实例接口。\\ 创建实例前需要按以下步骤准备必要参数:\\ 1.获取Region(地域)和 Zone(可用区),访问链接:https://docs.ucloud.cn/api/summary/regionlist 可以获取所有支持的地域和可用区;\\ 2.获取FrameworkVersion,访问链接:https://docs.ucloud.cn/api/ukafka-api/list_ukafka_framework_version,响应字段的FrameworkVersions[N].Version是支持的 Kafka 版本;\\ 3.ChargeType付费类型,可用值:Dynamic为按小时付费,Month为按月付费,Year为按年付费;\\ 4.获取NodeType机型详情,访问链接:https://docs.ucloud.cn/api/ukafka-api/get_ukafka_node_type,响应字段的NodeTypeSet[N].NodeTypeName是支持的所有机型;\\ 5.获取DiskSize磁盘大小范围 ,访问链接:https://docs.ucloud.cn/api/ukafka-api/get_ukafka_node_type,该接口响应字段的NodeTypeSet[N].MinDiskSize和NodeTypeSet[N].MaxDiskSize是磁盘大小的取值范围;\\ 6.InstanceName,自定义输入实例名称,只能包含中英文、数字以及- _ .""" + + fields = { + "BusinessId": fields.Str(required=False, dump_to="BusinessId"), + "ChargeType": fields.Str(required=True, dump_to="ChargeType"), + "DiskControllerType": fields.Str( + required=False, dump_to="DiskControllerType" + ), + "DiskSize": fields.Int(required=True, dump_to="DiskSize"), + "DiskThreshold": fields.Str(required=False, dump_to="DiskThreshold"), + "FrameworkVersion": fields.Str( + required=True, dump_to="FrameworkVersion" + ), + "InstanceName": fields.Str(required=True, dump_to="InstanceName"), + "IsSecurityEnabled": fields.Str( + required=False, dump_to="IsSecurityEnabled" + ), + "LogRetentionHours": fields.Str( + required=False, dump_to="LogRetentionHours" + ), + "NodeCount": fields.Int(required=False, dump_to="NodeCount"), + "NodeType": fields.Str(required=True, dump_to="NodeType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Str(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateUKafkaInstanceResponseSchema(schema.ResponseSchema): + """CreateUKafkaInstance - 创建实例接口。\\ 创建实例前需要按以下步骤准备必要参数:\\ 1.获取Region(地域)和 Zone(可用区),访问链接:https://docs.ucloud.cn/api/summary/regionlist 可以获取所有支持的地域和可用区;\\ 2.获取FrameworkVersion,访问链接:https://docs.ucloud.cn/api/ukafka-api/list_ukafka_framework_version,响应字段的FrameworkVersions[N].Version是支持的 Kafka 版本;\\ 3.ChargeType付费类型,可用值:Dynamic为按小时付费,Month为按月付费,Year为按年付费;\\ 4.获取NodeType机型详情,访问链接:https://docs.ucloud.cn/api/ukafka-api/get_ukafka_node_type,响应字段的NodeTypeSet[N].NodeTypeName是支持的所有机型;\\ 5.获取DiskSize磁盘大小范围 ,访问链接:https://docs.ucloud.cn/api/ukafka-api/get_ukafka_node_type,该接口响应字段的NodeTypeSet[N].MinDiskSize和NodeTypeSet[N].MaxDiskSize是磁盘大小的取值范围;\\ 6.InstanceName,自定义输入实例名称,只能包含中英文、数字以及- _ .""" + + fields = { + "InstanceId": fields.Str(required=True, load_from="InstanceId"), + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: DeleteUKafkaInstance + +删除实例 +""" + + +class DeleteUKafkaInstanceRequestSchema(schema.RequestSchema): + """DeleteUKafkaInstance - 删除实例""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DeleteUKafkaInstanceResponseSchema(schema.ResponseSchema): + """DeleteUKafkaInstance - 删除实例""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DescribeUKafkaConsumer + +获取 Kafka 消费组信息 +""" + + +class DescribeUKafkaConsumerRequestSchema(schema.RequestSchema): + """DescribeUKafkaConsumer - 获取 Kafka 消费组信息""" + + fields = { + "ClusterInstanceId": fields.Str( + required=True, dump_to="ClusterInstanceId" + ), + "ConsumerGroup": fields.Str(required=True, dump_to="ConsumerGroup"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Type": fields.Str(required=True, dump_to="Type"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeUKafkaConsumerResponseSchema(schema.ResponseSchema): + """DescribeUKafkaConsumer - 获取 Kafka 消费组信息""" + + fields = { + "GroupName": fields.Str(required=False, load_from="GroupName"), + "Topics": fields.List(fields.Str(), required=False, load_from="Topics"), + "Type": fields.Str(required=False, load_from="Type"), + } + + +""" +API: DescribeUKafkaInstance + +获取整个实例的信息。实例ID,可以通过ListUKafkaInstance 接口的ClusterSet. ClusterInstanceId 获取 +""" + + +class DescribeUKafkaInstanceRequestSchema(schema.RequestSchema): + """DescribeUKafkaInstance - 获取整个实例的信息。实例ID,可以通过ListUKafkaInstance 接口的ClusterSet. ClusterInstanceId 获取""" + + fields = { + "ClusterInstanceId": fields.Str( + required=True, dump_to="ClusterInstanceId" + ), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeUKafkaInstanceResponseSchema(schema.ResponseSchema): + """DescribeUKafkaInstance - 获取整个实例的信息。实例ID,可以通过ListUKafkaInstance 接口的ClusterSet. ClusterInstanceId 获取""" + + fields = { + "ClusterSet": fields.List( + models.ClusterInfoSchema(), required=True, load_from="ClusterSet" + ), + } + + +""" +API: GetUKafkaNodeType + +获取节点机型配置 +""" + + +class GetUKafkaNodeTypeRequestSchema(schema.RequestSchema): + """GetUKafkaNodeType - 获取节点机型配置""" + + fields = { + "NodeType": fields.Str(required=False, dump_to="NodeType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetUKafkaNodeTypeResponseSchema(schema.ResponseSchema): + """GetUKafkaNodeType - 获取节点机型配置""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + "NodeTypeSet": fields.List( + models.InstanceTypeSchema(), required=True, load_from="NodeTypeSet" + ), + } + + +""" +API: IsUKafkaTopicNameExist + +检查一个topic名称是否已经在集群中了。实例ID,可以通过ListUKafkaInstance 接口的ClusterSet. ClusterInstanceId 获取 +""" + + +class IsUKafkaTopicNameExistRequestSchema(schema.RequestSchema): + """IsUKafkaTopicNameExist - 检查一个topic名称是否已经在集群中了。实例ID,可以通过ListUKafkaInstance 接口的ClusterSet. ClusterInstanceId 获取""" + + fields = { + "ClusterInstanceId": fields.Str( + required=True, dump_to="ClusterInstanceId" + ), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "TopicName": fields.Str(required=True, dump_to="TopicName"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class IsUKafkaTopicNameExistResponseSchema(schema.ResponseSchema): + """IsUKafkaTopicNameExist - 检查一个topic名称是否已经在集群中了。实例ID,可以通过ListUKafkaInstance 接口的ClusterSet. ClusterInstanceId 获取""" + + fields = { + "IsExist": fields.Str(required=True, load_from="IsExist"), + } + + +""" +API: ListUKafkaConsumers + +列出 Kafka 消费组 +""" + + +class ListUKafkaConsumersRequestSchema(schema.RequestSchema): + """ListUKafkaConsumers - 列出 Kafka 消费组""" + + fields = { + "ClusterInstanceId": fields.Str( + required=True, dump_to="ClusterInstanceId" + ), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ListUKafkaConsumersResponseSchema(schema.ResponseSchema): + """ListUKafkaConsumers - 列出 Kafka 消费组""" + + fields = { + "Groups": fields.List( + models.GroupSchema(), required=False, load_from="Groups" + ), + } + + +""" +API: ListUKafkaFrameworkVersion + +列举ukafka框架版本 +""" + + +class ListUKafkaFrameworkVersionRequestSchema(schema.RequestSchema): + """ListUKafkaFrameworkVersion - 列举ukafka框架版本""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ListUKafkaFrameworkVersionResponseSchema(schema.ResponseSchema): + """ListUKafkaFrameworkVersion - 列举ukafka框架版本""" + + fields = { + "FrameworkVersions": fields.List( + models.VersionSchema(), required=True, load_from="FrameworkVersions" + ), + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: ListUKafkaInstance + +获取实例列表信息 +""" + + +class ListUKafkaInstanceRequestSchema(schema.RequestSchema): + """ListUKafkaInstance - 获取实例列表信息""" + + fields = { + "BusinessId": fields.Str(required=False, dump_to="BusinessId"), + "ClusterInstanceId": fields.Str( + required=False, dump_to="ClusterInstanceId" + ), # Deprecated, will be removed at 1.0 + "Filter": fields.Str( + required=False, dump_to="Filter" + ), # Deprecated, will be removed at 1.0 + "Limit": fields.Str(required=False, dump_to="Limit"), + "Offset": fields.Str(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ListUKafkaInstanceResponseSchema(schema.ResponseSchema): + """ListUKafkaInstance - 获取实例列表信息""" + + fields = { + "ClusterSet": models.ClusterSetSchema(), + "Message": fields.Str(required=False, load_from="Message"), + "TotalCount": fields.Str(required=True, load_from="TotalCount"), + } + + +""" +API: ListUKafkaTopics + +获取 kafka 实例 topic 列表信息。实例ID,可以通过ListUKafkaInstance 接口的ClusterSet. ClusterInstanceId 获取 +""" + + +class ListUKafkaTopicsRequestSchema(schema.RequestSchema): + """ListUKafkaTopics - 获取 kafka 实例 topic 列表信息。实例ID,可以通过ListUKafkaInstance 接口的ClusterSet. ClusterInstanceId 获取""" + + fields = { + "ClusterInstanceId": fields.Str( + required=True, dump_to="ClusterInstanceId" + ), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ListUKafkaTopicsResponseSchema(schema.ResponseSchema): + """ListUKafkaTopics - 获取 kafka 实例 topic 列表信息。实例ID,可以通过ListUKafkaInstance 接口的ClusterSet. ClusterInstanceId 获取""" + + fields = { + "Length": fields.Int(required=False, load_from="Length"), + "TopicList": fields.List( + models.TopicInfoSchema(), required=True, load_from="TopicList" + ), + } + + +""" +API: ModifyUKafkaInstanceType + +规格升降级,仅升级CPU 和内存 +""" + + +class ModifyUKafkaInstanceTypeRequestSchema(schema.RequestSchema): + """ModifyUKafkaInstanceType - 规格升降级,仅升级CPU 和内存""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "NodeType": fields.Str(required=True, dump_to="NodeType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ModifyUKafkaInstanceTypeResponseSchema(schema.ResponseSchema): + """ModifyUKafkaInstanceType - 规格升降级,仅升级CPU 和内存""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: ResizeUKafkaDisk + +磁盘扩容 +""" + + +class ResizeUKafkaDiskRequestSchema(schema.RequestSchema): + """ResizeUKafkaDisk - 磁盘扩容""" + + fields = { + "DiskSize": fields.Int(required=True, dump_to="DiskSize"), + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ResizeUKafkaDiskResponseSchema(schema.ResponseSchema): + """ResizeUKafkaDisk - 磁盘扩容""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } diff --git a/ucloud/services/ukafka/schemas/models.py b/ucloud/services/ukafka/schemas/models.py new file mode 100644 index 00000000..faa99fcf --- /dev/null +++ b/ucloud/services/ukafka/schemas/models.py @@ -0,0 +1,229 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class BrokerOfTopicInfoSchema(schema.ResponseSchema): + """BrokerOfTopicInfo - broker 的 topic 相关信息""" + + fields = { + "PartitionOnBroker": fields.Str( + required=False, load_from="PartitionOnBroker" + ), + "Partitions": fields.Str(required=False, load_from="Partitions"), + "Replication": fields.Int(required=False, load_from="Replication"), + "TopicName": fields.Str(required=False, load_from="TopicName"), + "TotalPartitions": fields.Int( + required=False, load_from="TotalPartitions" + ), + } + + +class IPSchema(schema.ResponseSchema): + """IP - IP 信息""" + + fields = { + "IP": fields.Str(required=False, load_from="IP"), + "Type": fields.Str(required=False, load_from="Type"), + } + + +class UHostConfigSchema(schema.ResponseSchema): + """UHostConfig - 节点配置""" + + fields = { + "BootDiskSize": fields.Int(required=False, load_from="BootDiskSize"), + "CPU": fields.Int(required=False, load_from="CPU"), + "DataDiskSize": fields.Int(required=False, load_from="DataDiskSize"), + "DiskType": fields.Str(required=False, load_from="DiskType"), + "Memory": fields.Int(required=False, load_from="Memory"), + "OS": fields.Str(required=False, load_from="OS"), + } + + +class UrlSchema(schema.ResponseSchema): + """Url -""" + + fields = { + "Addr": fields.Str(required=False, load_from="Addr"), + "Protocal": fields.Str(required=False, load_from="Protocal"), + } + + +class EndpointsSchema(schema.ResponseSchema): + """Endpoints - kafka broker 连接信息""" + + fields = { + "PlainText": UrlSchema(), + "SaslPlainText": UrlSchema(), + } + + +class BrokerSchema(schema.ResponseSchema): + """Broker - kafka Broker 信息""" + + fields = { + "BrokerId": fields.Str(required=False, load_from="BrokerId"), + "BrokerInfo": fields.List(BrokerOfTopicInfoSchema()), + "CreateTime": fields.Str(required=False, load_from="CreateTime"), + "DomainName": fields.Str(required=False, load_from="DomainName"), + "Endpoints": EndpointsSchema(), + "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "IPSet": fields.List(IPSchema()), + "InstanceGroupType": fields.Str( + required=False, load_from="InstanceGroupType" + ), + "KafkaPort": fields.Int(required=False, load_from="KafkaPort"), + "Remark": fields.Str(required=False, load_from="Remark"), + "ResourceId": fields.Str(required=False, load_from="ResourceId"), + "SecurityGroupId": fields.Str( + required=False, load_from="SecurityGroupId" + ), + "State": fields.Str(required=False, load_from="State"), + "UHostConfig": UHostConfigSchema(), + "UHostId": fields.Str(required=False, load_from="UHostId"), + "UHostName": fields.Str(required=False, load_from="UHostName"), + "UHostRole": fields.Str(required=False, load_from="UHostRole"), + "ZooKeeper": fields.Str(required=False, load_from="ZooKeeper"), + "ZooKeeperPort": fields.Int(required=False, load_from="ZooKeeperPort"), + } + + +class ClusterInfoSchema(schema.ResponseSchema): + """ClusterInfo - 实例信息""" + + fields = { + "AutoRenew": fields.Str(required=False, load_from="AutoRenew"), + "BusinessId": fields.Str(required=False, load_from="BusinessId"), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "ClusterInstanceId": fields.Str( + required=False, load_from="ClusterInstanceId" + ), + "ClusterInstanceName": fields.Str( + required=False, load_from="ClusterInstanceName" + ), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "Framework": fields.Str(required=False, load_from="Framework"), + "FrameworkVersion": fields.Str( + required=False, load_from="FrameworkVersion" + ), + "IsOpenSecgroup": fields.Str( + required=False, load_from="IsOpenSecgroup" + ), + "NetworkId": fields.Str(required=False, load_from="NetworkId"), + "Remark": fields.Str(required=False, load_from="Remark"), + "RunningTime": fields.Int(required=False, load_from="RunningTime"), + "State": fields.Str(required=False, load_from="State"), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "Tag": fields.Str(required=False, load_from="Tag"), + "UHostCount": fields.Int(required=False, load_from="UHostCount"), + "UHostSet": fields.List(BrokerSchema()), + "VPCId": fields.Str(required=False, load_from="VPCId"), + "ValidBrokerNum": fields.Int( + required=False, load_from="ValidBrokerNum" + ), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class DiskSetSchema(schema.ResponseSchema): + """DiskSet - 磁盘配置""" + + fields = { + "Size": fields.Str(required=True, load_from="Size"), + "Type": fields.Str(required=True, load_from="Type"), + } + + +class InstanceTypeSchema(schema.ResponseSchema): + """InstanceType - kafka 集群节点信息""" + + fields = { + "CPU": fields.Int(required=False, load_from="CPU"), + "DiskSet": DiskSetSchema(), + "DiskType": fields.Str(required=False, load_from="DiskType"), + "IsOpenSecGroup": fields.Bool( + required=False, load_from="IsOpenSecGroup" + ), + "MaxDiskSize": fields.Int(required=False, load_from="MaxDiskSize"), + "Memory": fields.Str(required=False, load_from="Memory"), + "MinDiskSize": fields.Int(required=False, load_from="MinDiskSize"), + "NodeTypeName": fields.Str(required=False, load_from="NodeTypeName"), + } + + +class GroupSchema(schema.ResponseSchema): + """Group - Kafka 消费者组每一项的信息""" + + fields = { + "GroupId": fields.Str(required=False, load_from="GroupId"), + "GroupName": fields.Str(required=False, load_from="GroupName"), + "NumOfTopics": fields.Int(required=False, load_from="NumOfTopics"), + "Type": fields.Str(required=False, load_from="Type"), + } + + +class VersionSchema(schema.ResponseSchema): + """Version -""" + + fields = { + "Label": fields.Str(required=False, load_from="Label"), + "Version": fields.Str(required=False, load_from="Version"), + } + + +class ClusterSetSchema(schema.ResponseSchema): + """ClusterSet - 实例信息""" + + fields = { + "AutoRenew": fields.Str(required=False, load_from="AutoRenew"), + "BusinessId": fields.Str(required=False, load_from="BusinessId"), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "ClusterInstanceId": fields.Str( + required=False, load_from="ClusterInstanceId" + ), + "ClusterInstanceName": fields.Str( + required=False, load_from="ClusterInstanceName" + ), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "Framework": fields.Str(required=False, load_from="Framework"), + "FrameworkVersion": fields.Str( + required=False, load_from="FrameworkVersion" + ), + "InstanceGroupType": fields.Str( + required=False, load_from="InstanceGroupType" + ), + "NewMessage": fields.Str(required=False, load_from="NewMessage"), + "RedundantCount": fields.Int( + required=False, load_from="RedundantCount" + ), + "Remark": fields.Str(required=False, load_from="Remark"), + "RunningTime": fields.Int(required=False, load_from="RunningTime"), + "State": fields.Str(required=False, load_from="State"), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "Tag": fields.Str(required=False, load_from="Tag"), + "UHostCount": fields.Int(required=False, load_from="UHostCount"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class TopicInfoSchema(schema.ResponseSchema): + """TopicInfo - Topic 信息对象""" + + fields = { + "NumOfOccupyBroker": fields.Int( + required=False, load_from="NumOfOccupyBroker" + ), + "NumOfPartition": fields.Int( + required=False, load_from="NumOfPartition" + ), + "NumOfReplica": fields.Int(required=False, load_from="NumOfReplica"), + "Status": fields.Str(required=False, load_from="Status"), + "Topic": fields.Str(required=False, load_from="Topic"), + "UnderReplicasPer": fields.Float( + required=False, load_from="UnderReplicasPer" + ), + } diff --git a/ucloud/services/ulb/client.py b/ucloud/services/ulb/client.py index 96eba7d5..224e938c 100644 --- a/ucloud/services/ulb/client.py +++ b/ucloud/services/ulb/client.py @@ -1,731 +1,2520 @@ -""" Code is generated by ucloud-model, DO NOT EDIT IT. """ - -import typing - - -from ucloud.core.client import Client -from ucloud.services.ulb.schemas import apis - - -class ULBClient(Client): - def __init__( - self, config: dict, transport=None, middleware=None, logger=None - ): - super(ULBClient, self).__init__(config, transport, middleware, logger) - - def allocate_backend( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ AllocateBackend - 添加ULB后端资源实例 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **ResourceId** (str) - (Required) 所添加的后端资源的资源ID - - **ResourceType** (str) - (Required) 所添加的后端资源的类型,枚举值:UHost -> 云主机;UPM -> 物理云主机; UDHost -> 私有专区主机;UDocker -> 容器,默认值为“UHost” - - **ULBId** (str) - (Required) 负载均衡实例的ID - - **VServerId** (str) - (Required) VServer实例的ID - - **Enabled** (int) - 后端实例状态开关,枚举值: 1:启用; 0:禁用 默认为启用 - - **Port** (int) - 所添加的后端资源服务端口,取值范围[1-65535],默认80 - - **Weight** (int) - 所添加的后端RS权重(在加权轮询算法下有效),取值范围[0-100],默认为1 - - **Response** - - - **BackendId** (str) - 所添加的后端资源在ULB中的对象ID,(为ULB系统中使用,与资源自身ID无关),可用于 UpdateBackendAttribute/UpdateBackendAttributeBatch/ReleaseBackend - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.AllocateBackendRequestSchema().dumps(d) - - resp = self.invoke("AllocateBackend", d, **kwargs) - return apis.AllocateBackendResponseSchema().loads(resp) - - def allocate_backend_batch( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ AllocateBackendBatch - 批量添加VServer后端节点 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **Backends** (list) - (Required) 用| 分割字段,格式:ResourceId| ResourceType| Port| Enabled|IP| Weight。ResourceId:所添加的后端资源的资源ID;ResourceType:所添加的后端资源的类型,枚举值:UHost -> 云主机;UPM -> 物理云主机; UDHost -> 私有专区主机;UDocker -> 容器,默认值为“UHost”;Port:所添加的后端资源服务端口,取值范围[1-65535];Enabled:后端实例状态开关,枚举值: 1:启用; 0:禁用;IP:后端资源内网ip;Weight:所添加的后端RS权重(在加权轮询算法下有效),取值范围[0-100],默认为1 - - **ULBId** (str) - (Required) 负载均衡实例的ID - - **VServerId** (str) - (Required) VServer实例的ID - - **ApiVersion** (int) - - - **Response** - - - **BackendSet** (list) - 见 **BackendSet** 模型定义 - - **Response Model** - - **BackendSet** - - - **BackendId** (str) - rs的资源ID - - **ResourceId** (str) - rs对应的UHost ID - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.AllocateBackendBatchRequestSchema().dumps(d) - - resp = self.invoke("AllocateBackendBatch", d, **kwargs) - return apis.AllocateBackendBatchResponseSchema().loads(resp) - - def bind_ssl(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ BindSSL - 将SSL证书绑定到VServer - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **SSLId** (str) - (Required) SSL证书的Id - - **ULBId** (str) - (Required) 所绑定ULB实例ID - - **VServerId** (str) - (Required) 所绑定VServer实例ID - - **Response** - - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.BindSSLRequestSchema().dumps(d) - - resp = self.invoke("BindSSL", d, **kwargs) - return apis.BindSSLResponseSchema().loads(resp) - - def create_policy( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ CreatePolicy - 创建VServer内容转发策略 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **BackendId** (list) - (Required) 内容转发策略应用的后端资源实例的ID,来源于 AllocateBackend 返回的 BackendId - - **Match** (str) - (Required) 内容转发匹配字段 - - **ULBId** (str) - (Required) 需要添加内容转发策略的负载均衡实例ID - - **VServerId** (str) - (Required) 需要添加内容转发策略的VServer实例ID - - **Type** (str) - 内容转发匹配字段的类型 - - **Response** - - - **PolicyId** (str) - 内容转发策略ID - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.CreatePolicyRequestSchema().dumps(d) - - # build options - kwargs["max_retries"] = 0 # ignore retry when api is not idempotent - - resp = self.invoke("CreatePolicy", d, **kwargs) - return apis.CreatePolicyResponseSchema().loads(resp) - - def create_ssl(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ CreateSSL - 创建SSL证书,可以把整个 Pem 证书内容传过来,或者把证书、私钥、CA证书分别传过来 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **SSLName** (str) - (Required) SSL证书的名字,默认值为空 - - **CaCert** (str) - CA证书 - - **PrivateKey** (str) - 加密证书的私钥 - - **SSLContent** (str) - SSL证书的完整内容,包括用户证书、加密证书的私钥、CA证书 - - **SSLType** (str) - 所添加的SSL证书类型,目前只支持Pem格式 - - **UserCert** (str) - 用户的证书 - - **Response** - - - **SSLId** (str) - SSL证书的Id - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.CreateSSLRequestSchema().dumps(d) - - # build options - kwargs["max_retries"] = 0 # ignore retry when api is not idempotent - - resp = self.invoke("CreateSSL", d, **kwargs) - return apis.CreateSSLResponseSchema().loads(resp) - - def create_ulb(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ CreateULB - 创建负载均衡实例,可以选择内网或者外网 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **BusinessId** (str) - ULB 所属的业务组ID,如果不传则使用默认的业务组 - - **ChargeType** (str) - 付费方式 - - **IPVersion** (str) - ULB ip类型,枚举值:IPv6 / IPv4 (内部测试,暂未对外开放) - - **InnerMode** (str) - 创建的ULB是否为内网模式 - - **ListenType** (str) - ULB 监听器类型,枚举值:RequestProxy / PacketsTransmit (内部测试,暂未对外开放) - - **OuterMode** (str) - 创建的ULB是否为外网模式,默认即为外网模式 - - **PrivateIp** (str) - 创建内网ULB时指定内网IP。若不传值,则随机分配当前子网下的IP(暂时不对外开放,创建外网ULB该字段会忽略) - - **Remark** (str) - 备注 - - **SubnetId** (str) - 内网ULB 所属的子网ID,如果不传则使用默认的子网 - - **Tag** (str) - 业务组 - - **ULBName** (str) - 负载均衡的名字,默认值为“ULB” - - **VPCId** (str) - ULB所在的VPC的ID, 如果不传则使用默认的VPC - - **Response** - - - **ULBId** (str) - 负载均衡实例的Id - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.CreateULBRequestSchema().dumps(d) - - # build options - kwargs["max_retries"] = 0 # ignore retry when api is not idempotent - - resp = self.invoke("CreateULB", d, **kwargs) - return apis.CreateULBResponseSchema().loads(resp) - - def create_vserver( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ CreateVServer - 创建VServer实例,定义监听的协议和端口以及负载均衡算法 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **ULBId** (str) - (Required) 负载均衡实例ID - - **ClientTimeout** (int) - ListenType为RequestProxy时表示空闲连接的回收时间,单位:秒,取值范围:时(0,86400],默认值为60;ListenType为PacketsTransmit时表示连接保持的时间,单位:秒,取值范围:[60,900],0 表示禁用连接保持 - - **Domain** (str) - 根据MonitorType确认; 当MonitorType为Port时,此字段无意义。当MonitorType为Path时,代表HTTP检查域名 - - **FrontendPort** (int) - VServer后端端口,取值范围[1-65535];默认值为80 - - **ListenType** (str) - 监听器类型,枚举值为:RequestProxy -> 请求代理;PacketsTransmit -> 报文转发;默认为"RequestProxy" - - **Method** (str) - VServer负载均衡模式,枚举值:Roundrobin -> 轮询;Source -> 源地址;ConsistentHash -> 一致性哈希;SourcePort -> 源地址(计算端口);ConsistentHashPort -> 一致性哈希(计算端口); WeightRoundrobin -> 加权轮询; Leastconn -> 最小连接数。ConsistentHash,SourcePort,ConsistentHashPort 只在报文转发中使用;Leastconn只在请求代理中使用;Roundrobin、Source和WeightRoundrobin在请求代理和报文转发中使用。默认为:"Roundrobin" - - **MonitorType** (str) - 健康检查类型,枚举值:Port -> 端口检查;Path -> 路径检查; - - **Path** (str) - 根据MonitorType确认; 当MonitorType为Port时,此字段无意义。当MonitorType为Path时,代表HTTP检查路径 - - **PersistenceInfo** (str) - 根据PersistenceType确认; None和ServerInsert: 此字段无意义; UserDefined:此字段传入自定义会话保持String - - **PersistenceType** (str) - VServer会话保持方式,默认关闭会话保持。枚举值:None -> 关闭;ServerInsert -> 自动生成KEY;UserDefined -> 用户自定义KEY。 - - **Protocol** (str) - VServer实例的协议,请求代理模式下有 HTTP、HTTPS、TCP,报文转发下有 TCP,UDP。默认为“HTTP" - - **VServerName** (str) - VServer实例名称,默认为"VServer" - - **Response** - - - **VServerId** (str) - VServer实例的Id - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.CreateVServerRequestSchema().dumps(d) - - # build options - kwargs["max_retries"] = 0 # ignore retry when api is not idempotent - - resp = self.invoke("CreateVServer", d, **kwargs) - return apis.CreateVServerResponseSchema().loads(resp) - - def delete_policy( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ DeletePolicy - 删除内容转发策略 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **PolicyId** (str) - (Required) 内容转发策略ID - - **GroupId** (str) - 内容转发策略组ID - - **VServerId** (str) - VServer 资源ID - - **Response** - - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.DeletePolicyRequestSchema().dumps(d) - - resp = self.invoke("DeletePolicy", d, **kwargs) - return apis.DeletePolicyResponseSchema().loads(resp) - - def delete_ssl(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ DeleteSSL - 删除SSL证书 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **SSLId** (str) - (Required) SSL证书的ID - - **Response** - - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.DeleteSSLRequestSchema().dumps(d) - - resp = self.invoke("DeleteSSL", d, **kwargs) - return apis.DeleteSSLResponseSchema().loads(resp) - - def delete_ulb(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ DeleteULB - 删除负载均衡实例 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **ULBId** (str) - (Required) 负载均衡实例的ID - - **ReleaseEip** (bool) - 删除ulb时是否释放绑定的EIP,false标识只解绑EIP,true表示会释放绑定的EIP,默认是false - - **Response** - - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.DeleteULBRequestSchema().dumps(d) - - resp = self.invoke("DeleteULB", d, **kwargs) - return apis.DeleteULBResponseSchema().loads(resp) - - def delete_vserver( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ DeleteVServer - 删除VServer实例 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **ULBId** (str) - (Required) 负载均衡实例的ID - - **VServerId** (str) - (Required) VServer实例的ID - - **Response** - - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.DeleteVServerRequestSchema().dumps(d) - - resp = self.invoke("DeleteVServer", d, **kwargs) - return apis.DeleteVServerResponseSchema().loads(resp) - - def describe_ssl(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ DescribeSSL - 获取SSL证书信息 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **Limit** (int) - 数据分页值,默认为20 - - **Offset** (int) - 数据偏移量,默认值为0 - - **SSLId** (str) - SSL证书的Id - - **Response** - - - **DataSet** (list) - 见 **ULBSSLSet** 模型定义 - - **TotalCount** (int) - 满足条件的SSL证书总数 - - **Response Model** - - **ULBSSLSet** - - - **HashValue** (str) - - - **SSLId** (str) - SSL证书的Id - - **SSLName** (str) - SSL证书的名字 - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.DescribeSSLRequestSchema().dumps(d) - - resp = self.invoke("DescribeSSL", d, **kwargs) - return apis.DescribeSSLResponseSchema().loads(resp) - - def describe_ulb(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ DescribeULB - 获取ULB详细信息 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **BusinessId** (str) - ULB所属的业务组ID - - **Limit** (int) - 数据分页值,默认为20 - - **Offset** (int) - 数据偏移量,默认为0 - - **SubnetId** (str) - ULB所属的子网ID - - **ULBId** (str) - 负载均衡实例的Id。 若指定则返回指定的负载均衡实例的信息; 若不指定则返回当前数据中心中所有的负载均衡实例的信息 - - **VPCId** (str) - ULB所属的VPC - - **Response** - - - **DataSet** (list) - 见 **ULBSet** 模型定义 - - **TotalCount** (int) - 满足条件的ULB总数 - - **Response Model** - - **PolicyBackendSet** - - - **BackendId** (str) - 所添加的后端资源在ULB中的对象ID,(为ULB系统中使用,与资源自身ID无关 - - **ObjectId** (str) - 后端资源的对象ID - - **Port** (int) - 所添加的后端资源服务端口 - - **PrivateIP** (str) - 后端资源的内网IP - - **ResourceName** (str) - 后端资源的实例名称 - - **ULBPolicySet** - - - **BackendSet** (list) - 见 **PolicyBackendSet** 模型定义 - - **Match** (str) - 内容转发匹配字段;默认内容转发类型下为空。 - - **PolicyId** (str) - 内容转发Id,默认内容转发类型下为空。 - - **PolicyPriority** (int) - 内容转发优先级,范围[1,9999],数字越大优先级越高。默认内容转发规则下为0。 - - **PolicyType** (str) - 内容类型,枚举值:Custom -> 客户自定义;Default -> 默认内容转发 - - **TotalCount** (int) - 默认内容转发类型下返回当前rs总数 - - **Type** (str) - 内容转发匹配字段的类型,枚举值:Domain -> 域名;Path -> 路径; 默认内容转发类型下为空 - - **VServerId** (str) - 所属VServerId - - **ULBBackendSet** - - - **BackendId** (str) - 后端资源实例的Id - - **Enabled** (int) - 后端提供服务的实例启用与否,枚举值:0 禁用 1 启用 - - **Port** (int) - 后端提供服务的端口 - - **PrivateIP** (str) - 后端提供服务的内网IP - - **ResourceId** (str) - 资源实例的资源Id - - **ResourceName** (str) - 资源实例的资源名称 - - **ResourceType** (str) - 资源实例的类型 - - **Status** (int) - 后端提供服务的实例运行状态,枚举值:0健康检查健康状态 1 健康检查异常 - - **SubResourceId** (str) - 资源绑定的虚拟网卡实例的资源Id - - **SubResourceName** (str) - 资源绑定的虚拟网卡实例的资源名称 - - **SubResourceType** (str) - 资源绑定的虚拟网卡实例的类型 - - **SubnetId** (str) - 后端提供服务的资源所在的子网的ID - - **Weight** (int) - - - **ULBSSLSet** - - - **HashValue** (str) - - - **SSLId** (str) - SSL证书的Id - - **SSLName** (str) - SSL证书的名字 - - **ULBVServerSet** - - - **BackendSet** (list) - 见 **ULBBackendSet** 模型定义 - - **ClientTimeout** (int) - 空闲连接的回收时间,单位:秒。 - - **Domain** (str) - 根据MonitorType确认; 当MonitorType为Port时,此字段无意义。当MonitorType为Path时,代表HTTP检查域名 - - **FrontendPort** (int) - VServer服务端口 - - **ListenType** (str) - 监听器类型,枚举值为: RequestProxy -> 请求代理;PacketsTransmit -> 报文转发 - - **Method** (str) - VServer负载均衡的模式,枚举值:Roundrobin -> 轮询;Source -> 源地址;ConsistentHash -> 一致性哈希;SourcePort -> 源地址(计算端口);ConsistentHashPort -> 一致性哈希(计算端口)。 - - **MonitorType** (str) - 健康检查类型,枚举值:Port -> 端口检查;Path -> 路径检查; - - **Path** (str) - 根据MonitorType确认; 当MonitorType为Port时,此字段无意义。当MonitorType为Path时,代表HTTP检查路径 - - **PersistenceInfo** (str) - 根据PersistenceType确定: None或ServerInsert,此字段为空; UserDefined,此字段展示用户自定义会话string。 - - **PersistenceType** (str) - VServer会话保持方式。枚举值为: None -> 关闭会话保持; ServerInsert -> 自动生成; UserDefined -> 用户自定义。 - - **PolicySet** (list) - 见 **ULBPolicySet** 模型定义 - - **Protocol** (str) - VServer实例的协议。 枚举值为:HTTP,TCP,UDP,HTTPS。 - - **SSLSet** (list) - 见 **ULBSSLSet** 模型定义 - - **Status** (int) - VServer的运行状态。枚举值: 0 -> rs全部运行正常;1 -> rs全部运行异常;2 -> rs部分运行异常。 - - **VServerId** (str) - VServer实例的Id - - **VServerName** (str) - VServer实例的名字 - - **ULBIPSet** - - - **Bandwidth** (int) - 弹性IP的带宽值(暂未对外开放) - - **BandwidthType** (int) - 弹性IP的带宽类型,枚举值:1 表示是共享带宽,0 普通带宽类型(暂未对外开放) - - **EIP** (str) - 弹性IP地址 - - **EIPId** (str) - 弹性IP的ID - - **OperatorName** (str) - 弹性IP的运营商信息,枚举值为: Bgp:BGP IP International:国际IP - - **ULBSet** - - - **Bandwidth** (int) - 带宽 - - **BandwidthType** (int) - 带宽类型,枚举值为: 0,非共享带宽; 1,共享带宽 - - **BusinessId** (str) - ULB 所属的业务组ID - - **CreateTime** (int) - ULB的创建时间,格式为Unix Timestamp - - **ExpireTime** (int) - ULB的到期时间,格式为Unix Timestamp - - **IPSet** (list) - 见 **ULBIPSet** 模型定义 - - **Name** (str) - 负载均衡的资源名称(资源系统中),缺省值“ULB” - - **PrivateIP** (str) - ULB的内网IP,当ULBType为OuterMode时,该值为空 - - **Remark** (str) - 负载均衡的备注,缺省值“” - - **Resource** (list) - ULB的详细信息列表(废弃) - - **SubnetId** (str) - ULB 为 InnerMode 时,ULB 所属的子网ID,默认为空 - - **Tag** (str) - 负载均衡的业务组名称,缺省值“Default” - - **ULBId** (str) - 负载均衡的资源ID - - **ULBName** (str) - 负载均衡的资源名称(内部记载,废弃) - - **ULBType** (str) - ULB 的类型 - - **VPCId** (str) - ULB所在的VPC的ID - - **VServerSet** (list) - 见 **ULBVServerSet** 模型定义 - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.DescribeULBRequestSchema().dumps(d) - - resp = self.invoke("DescribeULB", d, **kwargs) - return apis.DescribeULBResponseSchema().loads(resp) - - def describe_vserver( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ DescribeVServer - 获取ULB下的VServer的详细信息 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **ULBId** (str) - (Required) 负载均衡实例的Id - - **Limit** (int) - 数据分页值 - - **Offset** (int) - 数据偏移量 - - **VServerId** (str) - VServer实例的Id;若指定则返回指定的VServer实例的信息; 若不指定则返回当前负载均衡实例下所有VServer的信息 - - **Response** - - - **DataSet** (list) - 见 **ULBVServerSet** 模型定义 - - **TotalCount** (int) - 满足条件的VServer总数 - - **Response Model** - - **PolicyBackendSet** - - - **BackendId** (str) - 所添加的后端资源在ULB中的对象ID,(为ULB系统中使用,与资源自身ID无关 - - **ObjectId** (str) - 后端资源的对象ID - - **Port** (int) - 所添加的后端资源服务端口 - - **PrivateIP** (str) - 后端资源的内网IP - - **ResourceName** (str) - 后端资源的实例名称 - - **ULBSSLSet** - - - **HashValue** (str) - - - **SSLId** (str) - SSL证书的Id - - **SSLName** (str) - SSL证书的名字 - - **ULBPolicySet** - - - **BackendSet** (list) - 见 **PolicyBackendSet** 模型定义 - - **Match** (str) - 内容转发匹配字段;默认内容转发类型下为空。 - - **PolicyId** (str) - 内容转发Id,默认内容转发类型下为空。 - - **PolicyPriority** (int) - 内容转发优先级,范围[1,9999],数字越大优先级越高。默认内容转发规则下为0。 - - **PolicyType** (str) - 内容类型,枚举值:Custom -> 客户自定义;Default -> 默认内容转发 - - **TotalCount** (int) - 默认内容转发类型下返回当前rs总数 - - **Type** (str) - 内容转发匹配字段的类型,枚举值:Domain -> 域名;Path -> 路径; 默认内容转发类型下为空 - - **VServerId** (str) - 所属VServerId - - **ULBBackendSet** - - - **BackendId** (str) - 后端资源实例的Id - - **Enabled** (int) - 后端提供服务的实例启用与否,枚举值:0 禁用 1 启用 - - **Port** (int) - 后端提供服务的端口 - - **PrivateIP** (str) - 后端提供服务的内网IP - - **ResourceId** (str) - 资源实例的资源Id - - **ResourceName** (str) - 资源实例的资源名称 - - **ResourceType** (str) - 资源实例的类型 - - **Status** (int) - 后端提供服务的实例运行状态,枚举值:0健康检查健康状态 1 健康检查异常 - - **SubResourceId** (str) - 资源绑定的虚拟网卡实例的资源Id - - **SubResourceName** (str) - 资源绑定的虚拟网卡实例的资源名称 - - **SubResourceType** (str) - 资源绑定的虚拟网卡实例的类型 - - **SubnetId** (str) - 后端提供服务的资源所在的子网的ID - - **Weight** (int) - - - **ULBVServerSet** - - - **BackendSet** (list) - 见 **ULBBackendSet** 模型定义 - - **ClientTimeout** (int) - 空闲连接的回收时间,单位:秒。 - - **Domain** (str) - 根据MonitorType确认; 当MonitorType为Port时,此字段无意义。当MonitorType为Path时,代表HTTP检查域名 - - **FrontendPort** (int) - VServer服务端口 - - **ListenType** (str) - 监听器类型,枚举值为: RequestProxy -> 请求代理;PacketsTransmit -> 报文转发 - - **Method** (str) - VServer负载均衡的模式,枚举值:Roundrobin -> 轮询;Source -> 源地址;ConsistentHash -> 一致性哈希;SourcePort -> 源地址(计算端口);ConsistentHashPort -> 一致性哈希(计算端口)。 - - **MonitorType** (str) - 健康检查类型,枚举值:Port -> 端口检查;Path -> 路径检查; - - **Path** (str) - 根据MonitorType确认; 当MonitorType为Port时,此字段无意义。当MonitorType为Path时,代表HTTP检查路径 - - **PersistenceInfo** (str) - 根据PersistenceType确定: None或ServerInsert,此字段为空; UserDefined,此字段展示用户自定义会话string。 - - **PersistenceType** (str) - VServer会话保持方式。枚举值为: None -> 关闭会话保持; ServerInsert -> 自动生成; UserDefined -> 用户自定义。 - - **PolicySet** (list) - 见 **ULBPolicySet** 模型定义 - - **Protocol** (str) - VServer实例的协议。 枚举值为:HTTP,TCP,UDP,HTTPS。 - - **SSLSet** (list) - 见 **ULBSSLSet** 模型定义 - - **Status** (int) - VServer的运行状态。枚举值: 0 -> rs全部运行正常;1 -> rs全部运行异常;2 -> rs部分运行异常。 - - **VServerId** (str) - VServer实例的Id - - **VServerName** (str) - VServer实例的名字 - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.DescribeVServerRequestSchema().dumps(d) - - resp = self.invoke("DescribeVServer", d, **kwargs) - return apis.DescribeVServerResponseSchema().loads(resp) - - def release_backend( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ ReleaseBackend - 从VServer释放后端资源实例 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **BackendId** (str) - (Required) 后端资源实例的ID(ULB后端ID,非资源自身ID) - - **ULBId** (str) - (Required) 负载均衡实例的ID - - **Response** - - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.ReleaseBackendRequestSchema().dumps(d) - - resp = self.invoke("ReleaseBackend", d, **kwargs) - return apis.ReleaseBackendResponseSchema().loads(resp) - - def unbind_ssl(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ UnbindSSL - 从VServer解绑SSL证书 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **SSLId** (str) - (Required) SSL证书的Id - - **ULBId** (str) - (Required) 所绑定ULB实例ID - - **VServerId** (str) - (Required) 所绑定VServer实例ID - - **Response** - - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.UnbindSSLRequestSchema().dumps(d) - - resp = self.invoke("UnbindSSL", d, **kwargs) - return apis.UnbindSSLResponseSchema().loads(resp) - - def update_backend_attribute( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ UpdateBackendAttribute - 更新ULB后端资源实例(服务节点)属性 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **BackendId** (str) - (Required) 后端资源实例的ID(ULB后端ID,非资源自身ID) - - **ULBId** (str) - (Required) 负载均衡资源ID - - **Enabled** (int) - 后端实例状态开关 - - **Port** (int) - 后端资源服务端口,取值范围[1-65535] - - **Weight** (int) - 所添加的后端RS权重(在加权轮询算法下有效),取值范围[0-100],默认为1 - - **Response** - - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.UpdateBackendAttributeRequestSchema().dumps(d) - - resp = self.invoke("UpdateBackendAttribute", d, **kwargs) - return apis.UpdateBackendAttributeResponseSchema().loads(resp) - - def update_policy( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ UpdatePolicy - 更新内容转发规则,包括转发规则后的服务节点 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **BackendId** (list) - (Required) 内容转发策略应用的后端资源实例的ID,来源于 AllocateBackend 返回的 BackendId - - **Match** (str) - (Required) 内容转发匹配字段 - - **PolicyId** (str) - (Required) 转发规则的ID - - **ULBId** (str) - (Required) 需要添加内容转发策略的负载均衡实例ID - - **VServerId** (str) - (Required) 需要添加内容转发策略的VServer实例ID - - **Type** (str) - 内容转发匹配字段的类型 - - **Response** - - - **PolicyId** (str) - 转发规则的ID - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.UpdatePolicyRequestSchema().dumps(d) - - resp = self.invoke("UpdatePolicy", d, **kwargs) - return apis.UpdatePolicyResponseSchema().loads(resp) - - def update_ulb_attribute( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ UpdateULBAttribute - 更新ULB名字业务组备注等属性字段 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **ULBId** (str) - (Required) ULB资源ID - - **Name** (str) - 名字 - - **Remark** (str) - 备注 - - **Tag** (str) - 业务 - - **Response** - - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.UpdateULBAttributeRequestSchema().dumps(d) - - resp = self.invoke("UpdateULBAttribute", d, **kwargs) - return apis.UpdateULBAttributeResponseSchema().loads(resp) - - def update_vserver_attribute( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ UpdateVServerAttribute - 更新VServer实例属性 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **ULBId** (str) - (Required) 负载均衡实例ID - - **VServerId** (str) - (Required) VServer实例ID - - **ClientTimeout** (int) - 请求代理的VServer下表示空闲连接的回收时间,单位:秒,取值范围:时(0,86400],默认值为60;报文转发的VServer下表示回话保持的时间,单位:秒,取值范围:[60,900],0 表示禁用连接保持 - - **Domain** (str) - MonitorType 为 Path 时指定健康检查发送请求时HTTP HEADER 里的域名 - - **Method** (str) - VServer负载均衡模式,枚举值:Roundrobin -> 轮询;Source -> 源地址;ConsistentHash -> 一致性哈希;SourcePort -> 源地址(计算端口);ConsistentHashPort -> 一致性哈希(计算端口); WeightRoundrobin -> 加权轮询; Leastconn -> 最小连接数。ConsistentHash,SourcePort,ConsistentHashPort 只在报文转发中使用;Leastconn只在请求代理中使用;Roundrobin、Source和WeightRoundrobin在请求代理和报文转发中使用。默认为:"Roundrobin" - - **MonitorType** (str) - 健康检查的类型,Port:端口,Path:路径 - - **Path** (str) - MonitorType 为 Path 时指定健康检查发送请求时的路径,默认为 / - - **PersistenceInfo** (str) - 根据PersistenceType确定: None或ServerInsert, 此字段无意义; UserDefined, 则此字段传入用户自定义会话保持String. 若无此字段则不做修改 - - **PersistenceType** (str) - VServer会话保持模式,若无此字段则不做修改。枚举值:None:关闭;ServerInsert:自动生成KEY;UserDefined:用户自定义KEY。 - - **Protocol** (str) - VServer协议类型,请求代理只支持修改为 HTTP/HTTPS,报文转发VServer只支持修改为 TCP/UDP - - **VServerName** (str) - VServer实例名称,若无此字段则不做修改 - - **Response** - - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.UpdateVServerAttributeRequestSchema().dumps(d) - - resp = self.invoke("UpdateVServerAttribute", d, **kwargs) - return apis.UpdateVServerAttributeResponseSchema().loads(resp) +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.ulb.schemas import apis + + +class ULBClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(ULBClient, self).__init__(config, transport, middleware, logger) + + def add_ssl_binding( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AddSSLBinding - ALB的监听器绑定SSL证书 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ListenerId** (str) - (Required) 监听器的ID + - **LoadBalancerId** (str) - (Required) 负载均衡实例的ID + - **SSLIds** (list) - (Required) SSLId的数组 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.AddSSLBindingRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AddSSLBinding", d, **kwargs) + return apis.AddSSLBindingResponseSchema().loads(resp) + + def add_targets(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """AddTargets - 给应用型负载均衡监听器添加后端服务节点 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ListenerId** (str) - (Required) 监听器的ID + - **LoadBalancerId** (str) - (Required) 负载均衡实例的ID + - **Targets** (list) - 见 **AddTargetsParamTargets** 模型定义 + + **Response** + + - **Targets** (list) - 见 **TargetSet** 模型定义 + + **Request Model** + + **AddTargetsParamTargets** + - **Enabled** (bool) - 服务节点是否启用。默认值true + - **IsBackup** (bool) - 服务节点是否为备节点。默认值false + - **Port** (int) - 服务节点的端口。限定取值:[1-65535],默认值80 + - **ResourceIP** (str) - 服务节点的IP。在IP类型时,必传 + - **ResourceId** (str) - 服务节点的资源ID。在非IP类型时,必传 + - **ResourceType** (str) - 服务节点的类型。限定枚举值:"UHost" / "UNI"/"UPM"/"IP",默认值:"UHost";非IP类型,如果该资源有多个IP,将只能添加主IP;非IP类型,展示时,会显示相关资源信息,IP类型只展示IP信息。在相关资源被删除时,非IP类型会把相关资源从lb中剔除,IP类型不保证这个逻辑 + - **SubnetId** (str) - 服务节点的子网资源ID。在IP类型时,必传 + - **VPCId** (str) - 服务节点的VPC资源ID。在IP类型时,必传 + - **Weight** (int) - 服务节点的权重。限定取值:[1-100],默认值1;仅在加权轮询算法时有效 + + + **Response Model** + + **TargetSet** + - **Enabled** (bool) - 服务节点是否启用。 默认值:true + - **Id** (str) - 服务节点的标识ID。 + - **IsBackup** (bool) - 服务节点是否为备节点。 默认值:false + - **Port** (int) - 服务节点的端口。限定取值:[1-65535]; 默认值:80 + - **ResourceIP** (str) - 服务节点的IP。在IP类型时,必传 + - **ResourceId** (str) - 服务节点的资源ID。在非IP类型时,必传 + - **ResourceType** (str) - 服务节点的类型。限定枚举值:UHost -> 云主机,UNI -> 虚拟网卡,UPM -> 物理云主机,IP -> IP类型; 默认值:"UHost"; 非IP类型,如果该资源有多个IP,将只能添加主IP; 非IP类型,展示时,会显示相关资源信息,IP类型只展示IP信息。 在相关资源被删除时,非IP类型会把相关资源从lb中剔除,IP类型不保证这个逻辑 + - **State** (str) - 服务节点的健康检查状态。限定枚举值:Healthy -> 健康,Unhealthy -> 不健康 + - **SubnetId** (str) - 服务节点的子网资源ID。在IP类型时,必传 + - **VPCId** (str) - 服务节点的VPC资源ID。在IP类型时,必传 + - **Weight** (int) - 服务节点的权重。限定取值:[1-100]; 仅在加权轮询算法时有效; 默认值:1 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.AddTargetsRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AddTargets", d, **kwargs) + return apis.AddTargetsResponseSchema().loads(resp) + + def allocate_backend( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AllocateBackend - 添加CLB后端资源实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ResourceType** (str) - (Required) 所添加的后端资源的类型,枚举值:UHost -> 云主机;UNI -> 虚拟网卡;UPM -> 物理云主机;UHybrid->混合云主机;CUBE->Cube, IP->IP类型;默认值为UHost。报文转发模式不支持UHybrid、CUBE、IP + - **ULBId** (str) - (Required) 传统型负载均衡实例的ID + - **VServerId** (str) - (Required) VServer实例的ID + - **Enabled** (int) - 后端实例状态开关,枚举值: 1:启用; 0:禁用 默认为启用 + - **IsBackup** (int) - rs是否为backup,默认为00:普通rs1:backup的rs + - **Port** (int) - 所添加的后端资源服务端口,取值范围[1-65535],默认80 + - **ResourceIP** (str) - 所添加的后端服务器的资源实例IP,当ResourceType 为 UHybrid 或 IP时有效,且必填;与ResourceId二选一必填 + - **ResourceId** (str) - 所添加的后端资源的资源ID;与ResourceIP二选一必填 + - **SubnetId** (str) - 所添加的后端服务器所在的子网,当ResourceType 为 UHybrid 或 IP 时有效,且必填 + - **VPCId** (str) - 所添加的后端服务器所在的vpc,当ResourceType 为 UHybrid 或 IP 时有效,且必填 + - **Weight** (int) - 所添加的后端RS权重(在加权轮询算法下有效),取值范围[1-100],默认为1 + + **Response** + + - **BackendId** (str) - 所添加的后端资源在CLB中的对象ID,(为CLB系统中使用,与资源自身ID无关),可用于 UpdateBackendAttribute/UpdateBackendAttributeBatch/ReleaseBackend + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.AllocateBackendRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AllocateBackend", d, **kwargs) + return apis.AllocateBackendResponseSchema().loads(resp) + + def allocate_backend_batch( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AllocateBackendBatch - + + **Request** + + - **ProjectId** (str) - (Config) + - **Region** (str) - (Config) + - **ULBId** (str) - (Required) + - **VServerId** (str) - (Required) + - **ApiVersion** (int) - + - **Backends** (list) - + + **Response** + + - **BackendSet** (list) - 见 **BackendSet** 模型定义 + + **Response Model** + + **BackendSet** + - **BackendId** (str) - + - **ResourceId** (str) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.AllocateBackendBatchRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AllocateBackendBatch", d, **kwargs) + return apis.AllocateBackendBatchResponseSchema().loads(resp) + + def bind_ssl(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """BindSSL - 将SSL证书绑定到传统型负载均衡VServer + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SSLId** (str) - (Required) SSL证书的Id + - **ULBId** (str) - (Required) 所绑定CLB实例ID + - **VServerId** (str) - (Required) 所绑定VServer实例ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.BindSSLRequestSchema().dumps(d) + + resp = self.invoke("BindSSL", d, **kwargs) + return apis.BindSSLResponseSchema().loads(resp) + + def create_listener( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateListener - 创建一个应用型负载均衡的监听器 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **LoadBalancerId** (str) - (Required) 负载均衡实例的ID + - **Certificates** (list) - (应用型专用)服务器默认证书ID。仅HTTPS监听支持,且必填;暂时只支持最大长度为1 + - **CompressionEnabled** (bool) - (应用型专用)是否开启数据压缩功能。目前只支持使用gzip对特定文件类型进行压缩。默认值为:false + - **HTTP2Enabled** (bool) - (应用型专用)是否开启HTTP/2特性。仅HTTPS监听支持开启;默认值为:false + - **HealthCheckConfig** (dict) - 见 **CreateListenerParamHealthCheckConfig** 模型定义 + - **IdleTimeout** (int) - 连接空闲超时时间。单位:秒。应用型限定取值:[1-86400];默认值60 + - **ListenerPort** (int) - 监听器的监听端口。应用型限定取值:[1-65535],默认值80 + - **ListenerProtocol** (str) - 监听协议。应用型限定取值:“HTTP”/"HTTPS",默认值“HTTP” + - **Name** (str) - 监听器的名称。限定字符长度:[1-255];限定特殊字符,仅支持:“-”,“_”,“.”;默认值:listener + - **RedirectEnabled** (bool) - (应用型专用)是否开启HTTP重定向到HTTPS。仅HTTP监听支持开启;默认值为:false + - **RedirectPort** (int) - (应用型专用)重定向端口。限定取值:[1-65535],默认值443 + - **Remark** (str) - 监听器的备注信息。限定字符长度:[0-255] + - **Scheduler** (str) - 负载均衡算法。应用型限定取值:"Roundrobin"/"Source"/"WeightRoundrobin"/" Leastconn"/"Backup",默认值"Roundrobin" + - **SecurityPolicyId** (str) - (应用型专用)安全策略组ID。仅HTTPS监听支持绑定;默认值“Default”,表示绑定原生策略 + - **StickinessConfig** (dict) - 见 **CreateListenerParamStickinessConfig** 模型定义 + + **Response** + + - **ListenerId** (str) - 监听器的ID + + **Request Model** + + **CreateListenerParamHealthCheckConfig** + - **Domain** (str) - (应用型专用)HTTP检查域名 + - **Enabled** (bool) - 是否开启健康检查功能。暂时不支持关闭。默认值为:true + - **Method** (str) - (应用型专用)HTTP检查方法。只支持GET和HEAD。 + - **Path** (str) - (应用型专用)HTTP检查路径 + - **ResponseCode** (str) - (应用型专用)GRPC检查响应码 + - **Type** (str) - 健康检查方式。应用型限定取值:“Port”/"HTTP/GRPC",默认值:“Port” + + + **CreateListenerParamStickinessConfig** + - **CookieName** (str) - (应用型专用)自定义Cookie。当StickinessType取值"UserDefined"时有效;限定字符长度:[0-255] + - **Enabled** (bool) - 是否开启会话保持功能。应用型负载均衡实例基于Cookie实现;默认值为:false + - **Type** (str) - (应用型专用)Cookie处理方式。限定枚举值:"ServerInsert" / "UserDefined";默认值为:“ServerInsert” + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateListenerRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateListener", d, **kwargs) + return apis.CreateListenerResponseSchema().loads(resp) + + def create_load_balancer( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateLoadBalancer - 创建一个应用型负载均衡实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SubnetId** (str) - (Required) 负载均衡实例所属的子网资源ID。负载均衡实例的内网VIP和SNAT场景的源IP限定在该子网内;指定子网不影响添加后端服务节点时的范围,依旧是整个VPC下支持的资源 + - **VPCId** (str) - (Required) 负载均衡实例所属的VPC资源ID + - **ChargeType** (str) - 付费模式。限定枚举值:"Year" / "Month"/"Day"/"Dynamic",默认值为:“Month” + - **CouponId** (str) - 代金券code + - **IPVersion** (str) - 负载均衡实例的IP协议。限定枚举值:"IPv4" / "IPv6"/"DualStack",默认值为:“IPv4” + - **LabelInfos** (list) - 见 **CreateLoadBalancerParamLabelInfos** 模型定义 + - **Name** (str) - 负载均衡实例的名称。默认值:lb;特殊字符仅支持:“-”,“_”,“.”;限定字符长度:[1-255] + - **Quantity** (int) - 购买的时长, 默认: 1; 0-> 购买至月末(0只在月付费有效,其余付费模式传0,实际收费按一个周期计费) + - **Remark** (str) - 负载均衡实例的备注信息。限定字符长度:[0-255] + - **SecGroups** (list) - 见 **CreateLoadBalancerParamSecGroups** 模型定义 + - **Tag** (str) - 负载均衡实例所属的业务组ID。默认值为“Default”; 传空则为Default业务组 + - **Type** (str) - 负载均衡实例的类型。限定枚举值:"Application" / "Network",默认值:"Application" + + **Response** + + - **LoadBalancerId** (str) - 负载均衡实例的ID + + **Request Model** + + **CreateLoadBalancerParamSecGroups** + - **Priority** (int) - 安全组优先级 + - **SecGroupId** (str) - 安全组id + + + **CreateLoadBalancerParamLabelInfos** + - **Key** (str) - 标签键 + - **Value** (str) - 标签值 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateLoadBalancerRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateLoadBalancer", d, **kwargs) + return apis.CreateLoadBalancerResponseSchema().loads(resp) + + def create_policy( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreatePolicy - 传统型负载均衡创建VServer内容转发策略 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BackendId** (list) - (Required) 内容转发策略应用的传统型负载均衡后端资源实例的ID,来源于 AllocateBackend 返回的 BackendId + - **Match** (str) - (Required) 内容转发匹配字段 + - **ULBId** (str) - (Required) 需要添加内容转发策略的传统型负载均衡实例ID + - **VServerId** (str) - (Required) 需要添加内容转发策略的传统型负载均衡VServer实例ID + - **DomainMatchMode** (str) - 内容转发规则中域名的匹配方式,默认与原本一致。枚举值:Regular,正则;Wildcard,泛域名 + - **PolicyPriority** (int) - 策略优先级,1-9999;只针对路径规则生效 + - **Type** (str) - 内容转发匹配字段的类型 + + **Response** + + - **PolicyId** (str) - 内容转发策略ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreatePolicyRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreatePolicy", d, **kwargs) + return apis.CreatePolicyResponseSchema().loads(resp) + + def create_rule(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """CreateRule - 给应用型负载均衡监听器创建一条转发规则 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ListenerId** (str) - (Required) 监听器的ID + - **LoadBalancerId** (str) - (Required) 负载均衡实例的ID + - **Pass** (bool) - 当转发的服务节点为空时,规则是否忽略。默认值true + - **RuleActions** (list) - 见 **CreateRuleParamRuleActions** 模型定义 + - **RuleConditions** (list) - 见 **CreateRuleParamRuleConditions** 模型定义 + + **Response** + + - **RuleId** (str) - 转发规则的ID + + **Request Model** + + **CreateRuleParamRuleConditionsHostConfig** + - **MatchMode** (str) - 匹配方式。限定枚举值:"Regular"/"Wildcard",默认值:"Regular" + - **Values** (list) - 取值。暂时只支持数组长度为1;取值需符合相关匹配方式的条件;域名匹配时必填 + + + **CreateRuleParamRuleActionsForwardConfigTargets** + - **Id** (str) - 转发的后端服务节点的标识ID。限定在监听器的服务节点池里;数组长度可以是0;转发服务节点配置的数组长度不为0时,Id必填 + - **Weight** (int) - 转发的后端服务节点的权重。仅监听器负载均衡算法是加权轮询是有效 + + + **CreateRuleParamRuleActionsInsertHeaderConfig** + - **Key** (str) - 插入的 header 字段名称,长度为 1~40 个字符,支持大小写字母 a~z、数字、下划线(_)和短划线(-)。头字段名称不能重复用于InsertHeader中。header 字段不能使用以下(此处判断大小写不敏感)x-real-ip、x-forwarded-for、x-forwarded-proto、x-forwarded-srcport、ucloud-alb-trace、connection、upgrade、content-length、transfer-encoding、keep-alive、te、host、cookie、remoteip、authority + - **Value** (str) - 插入的 header 字段内容。ValueType 取值为 SystemDefined 时取值如下:ClientSrcPort:客户端端口。ClientSrcIp:客户端 IP 地址。Protocol:客户端请求的协议(HTTP 或 HTTPS)。RuleID:客户端请求命中的转发规则ID。ALBID:ALB ID。ALBPort:ALB 端口。ValueType 取值为 UserDefined 时:可以自定义头字段内容,限制长度为 1~128 个字符,只支持 ASCII 码值ch >= 32 && ch < 127范围内、不包括 $ 的可打印字符。ValueType 取值为 ReferenceHeader 时:可以引用请求头字段中的某一个字段,限制长度限制为 1~128 个字符,支持小写字母 a~z、数字、短划线(-)和下划线(_)。 + - **ValueType** (str) - 头字段内容类型。取值:UserDefined:用户指定。ReferenceHeader:引用用户请求头中的某一个字段。SystemDefined:系统定义。 + + + **CreateRuleParamRuleActionsRemoveHeaderConfig** + - **Key** (str) - 删除的 header 字段名称,目前只能删除以下几个默认配置的字段X-Real-IP、X-Forwarded-For、X-Forwarded-Proto、X-Forwarded-SrcPort + + + **CreateRuleParamRuleActionsForwardConfig** + - **Targets** (list) - 见 **CreateRuleParamRuleActionsForwardConfigTargets** 模型定义 + + + **CreateRuleParamRuleActionsCorsConfig** + - **AllowCredentials** (str) - 是否允许携带凭证信息。取值:on:是。off:否。 + - **AllowHeaders** (list) - 允许跨域的 Header 列表。支持配置为*或配置一个或多个 value 值。单个 value 值只允许包含大小写字母、数字,不能以下划线(_)和短划线(-)开头或结尾,最大长度限制为 32 个字符。最多支持20个值 + - **AllowMethods** (list) - 选择跨域访问时允许的 HTTP 方法。取值:GET。POST。PUT。DELETE。HEAD。OPTIONS。PATCH。 + - **AllowOrigin** (list) - 允许的访问来源列表。支持只配置一个元素*,或配置一个或多个值。单个值必须以http://或者https://开头,后边加一个正确的域名或一级泛域名。(例:http://*.test.abc.example.com)单个值可以不加端口,也可以指定端口,端口范围:1~65535。最多支持5个值 + - **ExposeHeaders** (list) - 允许暴露的 Header 列表。支持配置为*或配置一个或多个 value 值。单个 value 值只允许包含大小写字母、数字,不能以下划线(_)和短划线(-)开头或结尾,最大长度限制为 32 个字符。最多支持20个值 + - **MaxAge** (int) - 预检请求在浏览器的最大缓存时间,单位:秒。取值范围:-1~172800。 + + + **CreateRuleParamRuleActionsFixedResponseConfig** + - **Content** (str) - 返回的固定内容。最大支持存储 1 KB,只支持 ASCII 码值ch >= 32 && ch < 127范围内、不包括 $ 的可打印字符。 + - **HttpCode** (int) - 返回的 HTTP 响应码,仅支持 2xx、4xx、5xx 数字,x 为任意数字。 + + + **CreateRuleParamRuleActions** + - **CorsConfig** (dict) - 见 **CreateRuleParamRuleActionsCorsConfig** 模型定义 + - **FixedResponseConfig** (dict) - 见 **CreateRuleParamRuleActionsFixedResponseConfig** 模型定义 + - **ForwardConfig** (dict) - 见 **CreateRuleParamRuleActionsForwardConfig** 模型定义 + - **InsertHeaderConfig** (dict) - 见 **CreateRuleParamRuleActionsInsertHeaderConfig** 模型定义 + - **Order** (int) - 转发规则动作执行的顺序,取值为1~1000,按值从小到大执行动作。值不能为空,不能重复。Forward、FixedResponse 类型的动作不判断 Order,最后一个执行 + - **RemoveHeaderConfig** (dict) - 见 **CreateRuleParamRuleActionsRemoveHeaderConfig** 模型定义 + - **Type** (str) - 动作类型。限定枚举值:"Forward"、"InsertHeader"、"Cors"、"FixedResponse"、"RemoveHeader"。只会处理 Type 对应的结构体。 + + + **CreateRuleParamRuleConditionsPathConfig** + - **Values** (list) - 取值。暂时只支持数组长度为1;取值需符合相关条件;路径匹配时必填 + + + **CreateRuleParamRuleConditions** + - **HostConfig** (dict) - 见 **CreateRuleParamRuleConditionsHostConfig** 模型定义 + - **PathConfig** (dict) - 见 **CreateRuleParamRuleConditionsPathConfig** 模型定义 + - **Type** (str) - 匹配条件类型。限定枚举值:"Host"/"Path" + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateRuleRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateRule", d, **kwargs) + return apis.CreateRuleResponseSchema().loads(resp) + + def create_ssl(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """CreateSSL - 创建SSL证书,可以把整个 Pem 证书内容传过来,或者把证书、私钥、CA证书分别传过来 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SSLName** (str) - (Required) SSL证书的名字,默认值不为空 + - **CaCert** (str) - CA证书 + - **PrivateKey** (str) - 加密证书的私钥 + - **SSLContent** (str) - SSL证书的完整内容,包括用户证书、加密证书的私钥、CA证书 + - **SSLType** (str) - 所添加的SSL证书类型,目前只支持Pem格式 + - **USSLId** (str) - USSL证书的ID + - **UserCert** (str) - 用户的证书 + + **Response** + + - **SSLId** (str) - SSL证书的Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateSSLRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateSSL", d, **kwargs) + return apis.CreateSSLResponseSchema().loads(resp) + + def create_security_policy( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateSecurityPolicy - 创建安全策略 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SSLCiphers** (list) - (Required) 加密套件 + - **SecurityPolicyName** (str) - (Required) 安全策略名称 + - **TLSVersion** (str) - (Required) TLS版本 + + **Response** + + - **SecurityPolicyId** (str) - 安全策略ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateSecurityPolicyRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateSecurityPolicy", d, **kwargs) + return apis.CreateSecurityPolicyResponseSchema().loads(resp) + + def create_ulb(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """CreateULB - 创建传统型负载均衡负载均衡实例,可以选择内网或者外网 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BusinessId** (str) - CLB 所属的业务组ID,如果不传则使用默认的业务组 + - **ChargeType** (str) - 付费方式, 枚举值为: Year, 按年付费; Month, 按月付费; Dynamic, 按时付费 + - **FirewallId** (str) - 防火墙ID,如果不传,则默认不绑定防火墙 + - **InnerMode** (str) - 创建的CLB是否为内网模式 + - **ListenType** (str) - CLB 监听器类型,外网CLB默认RequestProxy,内网ULB默认PacketsTransmit。枚举值:RequestProxy,请求代理; PacketsTransmit ,报文转发。 + - **OuterMode** (str) - 创建的CLB是否为外网模式,默认即为外网模式 + - **Remark** (str) - 备注 + - **SubnetId** (str) - CLB 所属的子网ID,如果不传则随机选择一个。 + - **Tag** (str) - 业务组 + - **ULBName** (str) - 负载均衡的名字,默认值为“ULB” + - **VPCId** (str) - CLB所在的VPC的ID。 如果不传则使用默认的VPC,若不传且无默认VPC则接口报错 + + **Response** + + - **IPv6AddressId** (str) - IPv6地址Id + - **ULBId** (str) - 传统型负载均衡实例的Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateULBRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateULB", d, **kwargs) + return apis.CreateULBResponseSchema().loads(resp) + + def create_vserver( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateVServer - 创建CLB的VServer实例,定义监听的协议和端口以及负载均衡算法 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ULBId** (str) - (Required) 传统型负载均衡实例ID + - **ClientTimeout** (int) - ListenType为RequestProxy时表示空闲连接的回收时间,单位:秒,取值范围:时(0,86400],默认值为60;ListenType为PacketsTransmit时表示连接保持的时间,单位:秒,取值范围:[60,900],0 表示禁用连接保持 + - **Domain** (str) - 根据MonitorType确认; 当MonitorType为Path时,此字段有意义,代表HTTP检查域名 + - **EnableCompression** (int) - 0:关闭 1:开启,用于数据压缩功能 + - **EnableHTTP2** (int) - 0:关闭 1:开启,用于开启http2功能;默认值为0 + - **ForwardPort** (int) - 重定向端口,取值范围[0-65535];默认值为0,代表关闭;仅HTTP协议支持开启重定向功能 + - **FrontendPort** (int) - VServer后端端口,取值范围[1-65535];默认值为80 + - **ListenType** (str) - 监听器类型,枚举值,RequestProxy ,请求代理;PacketsTransmit ,报文转发。默认为RequestProxy + - **Method** (str) - VServer负载均衡模式,枚举值:Roundrobin -> 轮询;Source -> 源地址;ConsistentHash -> 一致性哈希;SourcePort -> 源地址(计算端口);ConsistentHashPort -> 一致性哈希(计算端口); WeightRoundrobin -> 加权轮询; Leastconn -> 最小连接数;Backup ->主备模式。ConsistentHash,SourcePort,ConsistentHashPort 只在报文转发中使用;Leastconn只在请求代理中使用;Roundrobin、Source和WeightRoundrobin,Backup在请求代理和报文转发中使用。默认为:"Roundrobin" + - **MonitorType** (str) - 健康检查类型,枚举值:Port -> 端口检查;Path -> 路径检查;Ping -> Ping探测;Customize -> UDP检查请求代理型默认值为Port,其中TCP协议仅支持Port,其他协议支持Port和Path;报文转发型TCP协议仅支持Port,UDP协议支持Ping、Port和Customize,默认值为Ping + - **Path** (str) - 根据MonitorType确认; 当MonitorType为Path时,此字段有意义,代表HTTP检查路径 + - **PersistenceInfo** (str) - 根据PersistenceType确认; None和ServerInsert: 此字段无意义; UserDefined:此字段传入自定义会话保持String + - **PersistenceType** (str) - VServer会话保持方式,默认关闭会话保持。枚举值:None -> 关闭;ServerInsert -> 自动生成KEY;UserDefined -> 用户自定义KEY。 + - **Protocol** (str) - VServer实例的协议,请求代理模式下有 HTTP、HTTPS、TCP,报文转发下有 TCP,UDP。默认为“HTTP" + - **RequestMsg** (str) - 根据MonitorType确认; 当MonitorType为Customize时,此字段有意义,代表UDP检查发出的请求报文 + - **ResponseMsg** (str) - 根据MonitorType确认; 当MonitorType为Customize时,此字段有意义,代表UDP检查请求应收到的响应报文 + - **SecurityPolicyId** (str) - 安全策略组ID,默认值'Default' + - **VServerName** (str) - VServer实例名称,默认为"VServer" + + **Response** + + - **VServerId** (str) - VServer实例的Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateVServerRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateVServer", d, **kwargs) + return apis.CreateVServerResponseSchema().loads(resp) + + def delete_listener( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteListener - 删除一个应用型负载均衡监听器 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ListenerId** (str) - (Required) 应用型负载均衡监听器的ID + - **LoadBalancerId** (str) - (Required) 应用型负载均衡实例的ID + - **RelatedRedirectDisabled** (bool) - (Required) 是否关闭相关监听器的重定向功能。默认为false,即有其他监听器重定向到本监听器,则删除失败。为true时,会先关闭相关监听器的重定向功能,再删除本监听器。默认值为:false + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteListenerRequestSchema().dumps(d) + + resp = self.invoke("DeleteListener", d, **kwargs) + return apis.DeleteListenerResponseSchema().loads(resp) + + def delete_load_balancer( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteLoadBalancer - 删除一个应用型负载均衡实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **LoadBalancerId** (str) - (Required) 应用型负载均衡实例的ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteLoadBalancerRequestSchema().dumps(d) + + resp = self.invoke("DeleteLoadBalancer", d, **kwargs) + return apis.DeleteLoadBalancerResponseSchema().loads(resp) + + def delete_policy( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeletePolicy - 删除传统型负载均衡的内容转发策略 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **PolicyId** (str) - (Required) CLB的内容转发策略ID + - **VServerId** (str) - CLB的VServer 资源ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeletePolicyRequestSchema().dumps(d) + + resp = self.invoke("DeletePolicy", d, **kwargs) + return apis.DeletePolicyResponseSchema().loads(resp) + + def delete_rule(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """DeleteRule - 删除应用型负载均衡监听器的一条转发规则 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ListenerId** (str) - (Required) 应用型负载均衡监听器的ID + - **LoadBalancerId** (str) - (Required) 应用型负载均衡实例的ID + - **RuleId** (str) - (Required) 应用型负载均衡的转发规则的ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteRuleRequestSchema().dumps(d) + + resp = self.invoke("DeleteRule", d, **kwargs) + return apis.DeleteRuleResponseSchema().loads(resp) + + def delete_ssl(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """DeleteSSL - 删除SSL证书 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SSLId** (str) - (Required) SSL证书的ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteSSLRequestSchema().dumps(d) + + resp = self.invoke("DeleteSSL", d, **kwargs) + return apis.DeleteSSLResponseSchema().loads(resp) + + def delete_ssl_binding( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteSSLBinding - 删除监听器绑定的扩展证书 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ListenerId** (str) - (Required) 监听器的ID + - **LoadBalancerId** (str) - (Required) 负载均衡实例的ID + - **SSLIds** (list) - (Required) SSLId的数组 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteSSLBindingRequestSchema().dumps(d) + + resp = self.invoke("DeleteSSLBinding", d, **kwargs) + return apis.DeleteSSLBindingResponseSchema().loads(resp) + + def delete_security_policy( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteSecurityPolicy - 删除安全策略 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SecurityPolicyId** (str) - (Required) 安全策略ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteSecurityPolicyRequestSchema().dumps(d) + + resp = self.invoke("DeleteSecurityPolicy", d, **kwargs) + return apis.DeleteSecurityPolicyResponseSchema().loads(resp) + + def delete_ulb(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """DeleteULB - 删除传统型负载均衡实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ULBId** (str) - (Required) 传统型负载均衡实例的ID + - **ReleaseEip** (bool) - 删除clb时是否释放绑定的EIP,false标识只解绑EIP,true表示会释放绑定的EIP,默认是false。Anycast IP 此参数无效 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteULBRequestSchema().dumps(d) + + resp = self.invoke("DeleteULB", d, **kwargs) + return apis.DeleteULBResponseSchema().loads(resp) + + def delete_vserver( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteVServer - 删除CLB的VServer实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ULBId** (str) - (Required) 传统型负载均衡实例的ID + - **VServerId** (str) - (Required) CLB下的VServer实例的ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteVServerRequestSchema().dumps(d) + + resp = self.invoke("DeleteVServer", d, **kwargs) + return apis.DeleteVServerResponseSchema().loads(resp) + + def describe_listeners( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeListeners - 描述一个指定的监听器或者一个应用型负载均衡实例下的所有监听器 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - 数据分页值,默认为100 + - **ListenerId** (str) - 应用型负载均衡监听器的ID。若指定ListenerId,则忽略LoadBalancerId。ListenId和LoadBalancerId必选其一 + - **LoadBalancerId** (str) - 应用型负载均衡实例的ID。未指定ListenId,则描述指定的LoadBalancerId下的所有监听器。 + - **Offset** (int) - 数据偏移量,默认为0 + + **Response** + + - **Listeners** (list) - 见 **Listener** 模型定义 + - **TotalCount** (int) - 满足条件的负载均衡监听器总数 + + **Response Model** + + **CorsConfigSet** + - **AllowCredentials** (str) - 是否允许携带凭证信息。取值:on:是。off:否。 + - **AllowHeaders** (list) - 允许跨域的 Header 列表。支持配置为*或配置一个或多个 value 值。单个 value 值只允许包含大小写字母、数字,不能以下划线(_)和短划线(-)开头或结尾,最大长度限制为 32 个字符。最多支持20个值 + - **AllowMethods** (list) - 选择跨域访问时允许的 HTTP 方法。取值:GETPOSTPUTDELETEHEADOPTIONSPATCH + - **AllowOrigin** (list) - 允许的访问来源列表。支持只配置一个元素*,或配置一个或多个值。单个值必须以http://或者https://开头,后边加一个正确的域名或一级泛域名。(例:http://*.test.abc.example.com)单个值可以不加端口,也可以指定端口,端口范围:1~65535。最多支持5个值 + - **ExposeHeaders** (list) - 允许暴露的 Header 列表。支持配置为*或配置一个或多个 value 值。单个 value 值只允许包含大小写字母、数字,不能以下划线(_)和短划线(-)开头或结尾,最大长度限制为 32 个字符。最多支持20个值 + - **MaxAge** (int) - 预检请求在浏览器的最大缓存时间,单位:秒。取值范围:-1~172800。 + + + **FixedResponseConfigSet** + - **Content** (str) - 返回的固定内容。最大支持存储 1 KB,只支持 ASCII 码值ch >= 32 && ch < 127范围内、不包括 $ 的可打印字符。 + - **HttpCode** (int) - 返回的 HTTP 响应码,仅支持 2xx、4xx、5xx 数字,x 为任意数字。 + + + **InsertHeaderConfigSet** + - **Key** (str) - 插入的 header 字段名称,长度为 1~40 个字符,支持大小写字母 a~z、数字、下划线(_)和短划线(-)。头字段名称不能重复用于InsertHeader中。header 字段不能使用以下(此处判断大小写不敏感)x-real-ip、x-forwarded-for、x-forwarded-proto、x-forwarded-srcport、ucloud-alb-trace、connection、upgrade、content-length、transfer-encoding、keep-alive、te、host、cookie、remoteip、authority + - **Value** (str) - 插入的 header 字段内容。ValueType 取值为 SystemDefined 时取值如下:ClientSrcPort:客户端端口。ClientSrcIp:客户端 IP 地址。Protocol:客户端请求的协议(HTTP 或 HTTPS)。RuleID:客户端请求命中的转发规则ID。ALBID:ALB ID。ALBPort:ALB 端口。ValueType 取值为 UserDefined 时:可以自定义头字段内容,限制长度为 1~128 个字符,只支持 ASCII 码值ch >= 32 && ch < 127范围内、不包括 $ 的可打印字符。ValueType 取值为 ReferenceHeader 时:可以引用请求头字段中的某一个字段,限制长度限制为 1~128 个字符,支持小写字母 a~z、数字、短划线(-)和下划线(_)。 + - **ValueType** (str) - 头字段内容类型。取值:UserDefined:用户指定。ReferenceHeader:引用用户请求头中的某一个字段。SystemDefined:系统定义。 + + + **RemoveHeaderConfigSet** + - **Key** (str) - 删除的 header 字段名称,目前只能删除以下几个默认配置的字段: X-Real-IP、X-Forwarded-For、X-Forwarded-Proto、X-Forwarded-SrcPort + + + **ForwardTargetSet** + - **Id** (str) - 服务节点的标识ID + - **Weight** (int) - 权重。仅监听器负载均衡算法是加权轮询是有效;取值范围[1-100],默认值为1 + + + **ForwardConfigSet** + - **Targets** (list) - 见 **ForwardTargetSet** 模型定义 + + + **RuleAction** + - **CorsConfig** (dict) - 见 **CorsConfigSet** 模型定义 + - **FixedResponseConfig** (dict) - 见 **FixedResponseConfigSet** 模型定义 + - **ForwardConfig** (dict) - 见 **ForwardConfigSet** 模型定义 + - **InsertHeaderConfig** (dict) - 见 **InsertHeaderConfigSet** 模型定义 + - **Order** (int) - 转发规则动作执行的顺序,取值为1~1000,按值从小到大执行动作。值不能为空,不能重复。Forward、FixedResponse 类型的动作不判断 Order,最后一个执行 + - **RemoveHeaderConfig** (dict) - 见 **RemoveHeaderConfigSet** 模型定义 + - **Type** (str) - 动作类型。限定枚举值:Forward、"InsertHeader"、"Cors"、"FixedResponse"、"RemoveHeader" + + + **HostConfigSet** + - **MatchMode** (str) - 匹配方式。限定枚举值:Regular-正则,Wildcard-泛域名; 默认值:Regular + - **Values** (list) - 取值。暂时只支持数组长度为1; 取值需符合相关匹配方式的条件 + + + **PathConfigSet** + - **Values** (list) - 取值。暂时只支持数组长度为1; 取值需符合相关匹配方式的条件 + + + **RuleCondition** + - **HostConfig** (dict) - 见 **HostConfigSet** 模型定义 + - **PathConfig** (dict) - 见 **PathConfigSet** 模型定义 + - **Type** (str) - 匹配条件类型。限定枚举值:Host,Path + + + **Rule** + - **IsDefault** (bool) - 是否为默认转发规则 + - **Pass** (bool) - 当转发的服务节点为空时,规则是否忽略 + - **RuleActions** (list) - 见 **RuleAction** 模型定义 + - **RuleConditions** (list) - 见 **RuleCondition** 模型定义 + - **RuleId** (str) - 转发规则的ID + + + **StickinessConfigSet** + - **CookieName** (str) - (应用型专用)自定义Cookie。当StickinessType取值"UserDefined"时有效 + - **Enabled** (bool) - 是否开启会话保持功能。应用型负载均衡实例基于Cookie实现 + - **Type** (str) - (应用型专用)Cookie处理方式。限定枚举值: ServerInsert -> 自动生成KEY;UserDefined -> 用户自定义KEY + + + **HealthCheckConfigSet** + - **Domain** (str) - (应用型专用)HTTP检查域名。 当Type为HTTP时,此字段有意义,代表HTTP检查域名 + - **Enabled** (bool) - 是否开启健康检查功能。暂时不支持关闭。 默认值为:true + - **Method** (str) - (应用型专用)HTTP检查方法。当Type为HTTP时,此字段有意义,代表HTTP检查方法 + - **Path** (str) - (应用型专用)HTTP检查路径。当Type为HTTP时,此字段有意义,代表HTTP检查路径 + - **ResponseCode** (str) - (应用型专用)GRPC检查响应码。当Type为GRPC时,此字段有意义,代表GRPC检查响应码 + - **Type** (str) - 健康检查方式。应用型限定取值: Port -> 端口检查;HTTP -> HTTP检查; 默认值:Port + + + **Target** + - **Enabled** (bool) - 服务节点是否启用 + - **Id** (str) - 服务节点的标识ID。为ALB/NLB中使用,与资源自身ID无关,可用于UpdateTargetsAttribute/RemoveTargets + - **IsBackup** (bool) - 服务节点是否为备节点 + - **Port** (int) - 服务节点的端口 + - **ResourceIP** (str) - 服务节点的IP + - **ResourceId** (str) - 服务节点的资源ID + - **ResourceName** (str) - 服务节点的资源名称 + - **ResourceType** (str) - 服务节点的类型。限定枚举值:UHost -> 云主机,UNI -> 虚拟网卡,UPM -> 物理云主机,IP -> IP类型; 默认值:"UHost"; 非IP类型,如果该资源有多个IP,将只能添加主IP; 非IP类型,展示时,会显示相关资源信息,IP类型只展示IP信息。 在相关资源被删除时,非IP类型会把相关资源从lb中剔除,IP类型不保证这个逻辑 + - **State** (str) - 服务节点的健康检查状态。限定枚举值:Healthy -> 健康,Unhealthy -> 不健康 + - **SubnetId** (str) - 服务节点的子网资源ID + - **VPCId** (str) - 服务节点的VPC资源ID + - **Weight** (int) - 服务节点的权重。仅在加权轮询算法时有效 + + + **Certificate** + - **IsDefault** (bool) - 是否为默认证书 + - **SSLId** (str) - 证书ID + + + **Listener** + - **Certificates** (list) - 见 **Certificate** 模型定义 + - **CompressionEnabled** (bool) - (应用型专用)是否开启数据压缩功能。目前只支持使用gzip对特定文件类型进行压缩 + - **HTTP2Enabled** (bool) - (应用型专用)是否开启HTTP/2特性。仅HTTPS监听支持开启 + - **HealthCheckConfig** (dict) - 见 **HealthCheckConfigSet** 模型定义 + - **IdleTimeout** (int) - 连接空闲超时时间。单位:秒 + - **ListenerId** (str) - 监听器的ID + - **ListenerPort** (int) - 监听器的监听端口 + - **ListenerProtocol** (str) - 监听协议。应用型限定取值: HTTP、HTTPS + - **Name** (str) - 监听器的名称 + - **RedirectEnabled** (bool) - (应用型专用)是否开启HTTP重定向到HTTPS。仅HTTP监听支持开启 + - **RedirectPort** (int) - (应用型专用)重定向端口 + - **Remark** (str) - 监听器的备注信息 + - **Rules** (list) - 见 **Rule** 模型定义 + - **Scheduler** (str) - 负载均衡算法。应用型限定取值:Roundrobin -> 轮询;Source -> 源地址; WeightRoundrobin -> 加权轮询; Leastconn -> 最小连接数;Backup ->主备模式 + - **SecurityPolicyId** (str) - (应用型专用)安全策略组ID。仅HTTPS监听支持绑定;Default -> 原生策略 + - **State** (str) - listener健康状态。限定枚举值:Healthy -> 健康,Unhealthy -> 不健康,PartialHealth -> 部分健康,None -> 无节点状态 + - **StickinessConfig** (dict) - 见 **StickinessConfigSet** 模型定义 + - **Targets** (list) - 见 **Target** 模型定义 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeListenersRequestSchema().dumps(d) + + resp = self.invoke("DescribeListeners", d, **kwargs) + return apis.DescribeListenersResponseSchema().loads(resp) + + def describe_load_balancers( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeLoadBalancers - 描述特定条件下的应用型负载均衡实例或者全部的应用型负载均衡实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (str) - 数据分页值,默认为100 + - **LoadBalancerIds** (list) - 负载均衡实例的ID。必须是同一类型的实例,若指定了实例ID,将忽略除Type外的其他过滤条件 + - **Offset** (str) - 数据偏移量,默认为0 + - **ShowDetail** (bool) - 是否获取监听器和后端服务节点的详细信息。默认值:false + - **SubnetId** (str) - 限定所在的子网 + - **Type** (str) - 负载均衡实例的类型。限定枚举值:"Application" / "Network",默认值:"Application" + - **VPCId** (str) - 限定所在的VPC + + **Response** + + - **LoadBalancers** (list) - 见 **LoadBalancer** 模型定义 + - **TotalCount** (int) - 满足条件的负载均衡实例总数 + + **Response Model** + + **FixedResponseConfigSet** + - **Content** (str) - 返回的固定内容。最大支持存储 1 KB,只支持 ASCII 码值ch >= 32 && ch < 127范围内、不包括 $ 的可打印字符。 + - **HttpCode** (int) - 返回的 HTTP 响应码,仅支持 2xx、4xx、5xx 数字,x 为任意数字。 + + + **ForwardTargetSet** + - **Id** (str) - 服务节点的标识ID + - **Weight** (int) - 权重。仅监听器负载均衡算法是加权轮询是有效;取值范围[1-100],默认值为1 + + + **Certificate** + - **IsDefault** (bool) - 是否为默认证书 + - **SSLId** (str) - 证书ID + + + **HealthCheckConfigSet** + - **Domain** (str) - (应用型专用)HTTP检查域名。 当Type为HTTP时,此字段有意义,代表HTTP检查域名 + - **Enabled** (bool) - 是否开启健康检查功能。暂时不支持关闭。 默认值为:true + - **Method** (str) - (应用型专用)HTTP检查方法。当Type为HTTP时,此字段有意义,代表HTTP检查方法 + - **Path** (str) - (应用型专用)HTTP检查路径。当Type为HTTP时,此字段有意义,代表HTTP检查路径 + - **ResponseCode** (str) - (应用型专用)GRPC检查响应码。当Type为GRPC时,此字段有意义,代表GRPC检查响应码 + - **Type** (str) - 健康检查方式。应用型限定取值: Port -> 端口检查;HTTP -> HTTP检查; 默认值:Port + + + **HostConfigSet** + - **MatchMode** (str) - 匹配方式。限定枚举值:Regular-正则,Wildcard-泛域名; 默认值:Regular + - **Values** (list) - 取值。暂时只支持数组长度为1; 取值需符合相关匹配方式的条件 + + + **PathConfigSet** + - **Values** (list) - 取值。暂时只支持数组长度为1; 取值需符合相关匹配方式的条件 + + + **RuleCondition** + - **HostConfig** (dict) - 见 **HostConfigSet** 模型定义 + - **PathConfig** (dict) - 见 **PathConfigSet** 模型定义 + - **Type** (str) - 匹配条件类型。限定枚举值:Host,Path + + + **InsertHeaderConfigSet** + - **Key** (str) - 插入的 header 字段名称,长度为 1~40 个字符,支持大小写字母 a~z、数字、下划线(_)和短划线(-)。头字段名称不能重复用于InsertHeader中。header 字段不能使用以下(此处判断大小写不敏感)x-real-ip、x-forwarded-for、x-forwarded-proto、x-forwarded-srcport、ucloud-alb-trace、connection、upgrade、content-length、transfer-encoding、keep-alive、te、host、cookie、remoteip、authority + - **Value** (str) - 插入的 header 字段内容。ValueType 取值为 SystemDefined 时取值如下:ClientSrcPort:客户端端口。ClientSrcIp:客户端 IP 地址。Protocol:客户端请求的协议(HTTP 或 HTTPS)。RuleID:客户端请求命中的转发规则ID。ALBID:ALB ID。ALBPort:ALB 端口。ValueType 取值为 UserDefined 时:可以自定义头字段内容,限制长度为 1~128 个字符,只支持 ASCII 码值ch >= 32 && ch < 127范围内、不包括 $ 的可打印字符。ValueType 取值为 ReferenceHeader 时:可以引用请求头字段中的某一个字段,限制长度限制为 1~128 个字符,支持小写字母 a~z、数字、短划线(-)和下划线(_)。 + - **ValueType** (str) - 头字段内容类型。取值:UserDefined:用户指定。ReferenceHeader:引用用户请求头中的某一个字段。SystemDefined:系统定义。 + + + **RemoveHeaderConfigSet** + - **Key** (str) - 删除的 header 字段名称,目前只能删除以下几个默认配置的字段: X-Real-IP、X-Forwarded-For、X-Forwarded-Proto、X-Forwarded-SrcPort + + + **AccessLogConfigSet** + - **Enabled** (bool) - (应用型专用)是否开启访问日志记录功能 + - **US3BucketName** (str) - (应用型专用)用于存储访问日志的bucket + - **US3TokenId** (str) - (应用型专用)上传访问日志到bucket所需的token + + + **StickinessConfigSet** + - **CookieName** (str) - (应用型专用)自定义Cookie。当StickinessType取值"UserDefined"时有效 + - **Enabled** (bool) - 是否开启会话保持功能。应用型负载均衡实例基于Cookie实现 + - **Type** (str) - (应用型专用)Cookie处理方式。限定枚举值: ServerInsert -> 自动生成KEY;UserDefined -> 用户自定义KEY + + + **FirewallSet** + - **FirewallId** (str) - 防火墙ID + - **FirewallName** (str) - 防火墙名称 + + + **Target** + - **Enabled** (bool) - 服务节点是否启用 + - **Id** (str) - 服务节点的标识ID。为ALB/NLB中使用,与资源自身ID无关,可用于UpdateTargetsAttribute/RemoveTargets + - **IsBackup** (bool) - 服务节点是否为备节点 + - **Port** (int) - 服务节点的端口 + - **ResourceIP** (str) - 服务节点的IP + - **ResourceId** (str) - 服务节点的资源ID + - **ResourceName** (str) - 服务节点的资源名称 + - **ResourceType** (str) - 服务节点的类型。限定枚举值:UHost -> 云主机,UNI -> 虚拟网卡,UPM -> 物理云主机,IP -> IP类型; 默认值:"UHost"; 非IP类型,如果该资源有多个IP,将只能添加主IP; 非IP类型,展示时,会显示相关资源信息,IP类型只展示IP信息。 在相关资源被删除时,非IP类型会把相关资源从lb中剔除,IP类型不保证这个逻辑 + - **State** (str) - 服务节点的健康检查状态。限定枚举值:Healthy -> 健康,Unhealthy -> 不健康 + - **SubnetId** (str) - 服务节点的子网资源ID + - **VPCId** (str) - 服务节点的VPC资源ID + - **Weight** (int) - 服务节点的权重。仅在加权轮询算法时有效 + + + **ForwardConfigSet** + - **Targets** (list) - 见 **ForwardTargetSet** 模型定义 + + + **CorsConfigSet** + - **AllowCredentials** (str) - 是否允许携带凭证信息。取值:on:是。off:否。 + - **AllowHeaders** (list) - 允许跨域的 Header 列表。支持配置为*或配置一个或多个 value 值。单个 value 值只允许包含大小写字母、数字,不能以下划线(_)和短划线(-)开头或结尾,最大长度限制为 32 个字符。最多支持20个值 + - **AllowMethods** (list) - 选择跨域访问时允许的 HTTP 方法。取值:GETPOSTPUTDELETEHEADOPTIONSPATCH + - **AllowOrigin** (list) - 允许的访问来源列表。支持只配置一个元素*,或配置一个或多个值。单个值必须以http://或者https://开头,后边加一个正确的域名或一级泛域名。(例:http://*.test.abc.example.com)单个值可以不加端口,也可以指定端口,端口范围:1~65535。最多支持5个值 + - **ExposeHeaders** (list) - 允许暴露的 Header 列表。支持配置为*或配置一个或多个 value 值。单个 value 值只允许包含大小写字母、数字,不能以下划线(_)和短划线(-)开头或结尾,最大长度限制为 32 个字符。最多支持20个值 + - **MaxAge** (int) - 预检请求在浏览器的最大缓存时间,单位:秒。取值范围:-1~172800。 + + + **RuleAction** + - **CorsConfig** (dict) - 见 **CorsConfigSet** 模型定义 + - **FixedResponseConfig** (dict) - 见 **FixedResponseConfigSet** 模型定义 + - **ForwardConfig** (dict) - 见 **ForwardConfigSet** 模型定义 + - **InsertHeaderConfig** (dict) - 见 **InsertHeaderConfigSet** 模型定义 + - **Order** (int) - 转发规则动作执行的顺序,取值为1~1000,按值从小到大执行动作。值不能为空,不能重复。Forward、FixedResponse 类型的动作不判断 Order,最后一个执行 + - **RemoveHeaderConfig** (dict) - 见 **RemoveHeaderConfigSet** 模型定义 + - **Type** (str) - 动作类型。限定枚举值:Forward、"InsertHeader"、"Cors"、"FixedResponse"、"RemoveHeader" + + + **Rule** + - **IsDefault** (bool) - 是否为默认转发规则 + - **Pass** (bool) - 当转发的服务节点为空时,规则是否忽略 + - **RuleActions** (list) - 见 **RuleAction** 模型定义 + - **RuleConditions** (list) - 见 **RuleCondition** 模型定义 + - **RuleId** (str) - 转发规则的ID + + + **Listener** + - **Certificates** (list) - 见 **Certificate** 模型定义 + - **CompressionEnabled** (bool) - (应用型专用)是否开启数据压缩功能。目前只支持使用gzip对特定文件类型进行压缩 + - **HTTP2Enabled** (bool) - (应用型专用)是否开启HTTP/2特性。仅HTTPS监听支持开启 + - **HealthCheckConfig** (dict) - 见 **HealthCheckConfigSet** 模型定义 + - **IdleTimeout** (int) - 连接空闲超时时间。单位:秒 + - **ListenerId** (str) - 监听器的ID + - **ListenerPort** (int) - 监听器的监听端口 + - **ListenerProtocol** (str) - 监听协议。应用型限定取值: HTTP、HTTPS + - **Name** (str) - 监听器的名称 + - **RedirectEnabled** (bool) - (应用型专用)是否开启HTTP重定向到HTTPS。仅HTTP监听支持开启 + - **RedirectPort** (int) - (应用型专用)重定向端口 + - **Remark** (str) - 监听器的备注信息 + - **Rules** (list) - 见 **Rule** 模型定义 + - **Scheduler** (str) - 负载均衡算法。应用型限定取值:Roundrobin -> 轮询;Source -> 源地址; WeightRoundrobin -> 加权轮询; Leastconn -> 最小连接数;Backup ->主备模式 + - **SecurityPolicyId** (str) - (应用型专用)安全策略组ID。仅HTTPS监听支持绑定;Default -> 原生策略 + - **State** (str) - listener健康状态。限定枚举值:Healthy -> 健康,Unhealthy -> 不健康,PartialHealth -> 部分健康,None -> 无节点状态 + - **StickinessConfig** (dict) - 见 **StickinessConfigSet** 模型定义 + - **Targets** (list) - 见 **Target** 模型定义 + + + **SecGroupInfo** + - **Name** (str) - 安全组名称 + - **Priority** (int) - 优先级 + - **SecgroupId** (str) - 安全组id + - **VPCId** (str) - 安全组所属vpc id + + + **IPInfo** + - **AddressType** (str) - 网络模式。 限定枚举值:Internet -> 互联网,Intranet -> 内联网 + - **Bandwidth** (int) - 带宽值。单位M + - **BandwidthType** (int) - 带宽类型。限定枚举值:1 -> 共享带宽,0 -> 普通带宽类型 + - **IP** (str) - IP地址 + - **IPVersion** (str) - IP协议版本 + - **Id** (str) - 唯一标识ID + - **OperatorName** (str) - 外网IP的运营商信息。枚举值为:Telecom -> 电信,Unicom -> 联通,International -> 国际IP,Bgp -> BGP,Duplet -> 双线(电信+联通双线路),BGPPro -> 精品BGP,China-mobile -> 中国移动,Anycast -> AnycastEIP + + + **LoadBalancer** + - **AccessLogConfig** (dict) - 见 **AccessLogConfigSet** 模型定义 + - **AutoRenewEnabled** (bool) - 是否开启自动续费 + - **ChargeType** (str) - 付费模式 + - **CreateTime** (int) - 负载均衡实例创建时间。格式为Unix Timestamp + - **Firewall** (dict) - 见 **FirewallSet** 模型定义 + - **IPInfos** (list) - 见 **IPInfo** 模型定义 + - **IPVersion** (str) - 负载均衡实例支持的IP协议版本 + - **Listeners** (list) - 见 **Listener** 模型定义 + - **LoadBalancerId** (str) - 负载均衡实例的ID + - **Name** (str) - 负载均衡实例的名称 + - **PurchaseValue** (int) - 有效期(计费)。格式为Unix Timestamp + - **Remark** (str) - 负载均衡实例的备注信息 + - **SecGroup** (list) - 见 **SecGroupInfo** 模型定义 + - **SnatIPs** (list) - 应用型实例的代理IP或网络型FULLNAT模式下snat所用的IP + - **Status** (str) - lb状态:Normal-正常;Arrears-欠费停服 + - **SubnetId** (str) - 负载均衡实例所属的子网资源ID。负载均衡实例的内网VIP和SNAT场景的源IP限定在该子网内;指定子网不影响添加后端服务节点时的范围,依旧是整个VPC下支持的资源 + - **Tag** (str) - 负载均衡实例所属的业务组ID + - **Type** (str) - 负载均衡实例的类型。限定枚举值:Application -> 应用型,Network -> 网络型 + - **VPCId** (str) - 负载均衡实例所属的VPC资源ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeLoadBalancersRequestSchema().dumps(d) + + resp = self.invoke("DescribeLoadBalancers", d, **kwargs) + return apis.DescribeLoadBalancersResponseSchema().loads(resp) + + def describe_rules( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeRules - 描述一条指定的转发规则或者一个应用型负载均衡监听器下的所有转发规则 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ListenerId** (str) - (Required) 监听器的ID + - **LoadBalancerId** (str) - (Required) 应用型负载均衡实例的ID + - **RuleId** (str) - 应用型负载均衡转发规则的ID。指定RuleId,则只描述该规则 + + **Response** + + - **Rules** (list) - 见 **Rule** 模型定义 + + **Response Model** + + **CorsConfigSet** + - **AllowCredentials** (str) - 是否允许携带凭证信息。取值:on:是。off:否。 + - **AllowHeaders** (list) - 允许跨域的 Header 列表。支持配置为*或配置一个或多个 value 值。单个 value 值只允许包含大小写字母、数字,不能以下划线(_)和短划线(-)开头或结尾,最大长度限制为 32 个字符。最多支持20个值 + - **AllowMethods** (list) - 选择跨域访问时允许的 HTTP 方法。取值:GETPOSTPUTDELETEHEADOPTIONSPATCH + - **AllowOrigin** (list) - 允许的访问来源列表。支持只配置一个元素*,或配置一个或多个值。单个值必须以http://或者https://开头,后边加一个正确的域名或一级泛域名。(例:http://*.test.abc.example.com)单个值可以不加端口,也可以指定端口,端口范围:1~65535。最多支持5个值 + - **ExposeHeaders** (list) - 允许暴露的 Header 列表。支持配置为*或配置一个或多个 value 值。单个 value 值只允许包含大小写字母、数字,不能以下划线(_)和短划线(-)开头或结尾,最大长度限制为 32 个字符。最多支持20个值 + - **MaxAge** (int) - 预检请求在浏览器的最大缓存时间,单位:秒。取值范围:-1~172800。 + + + **FixedResponseConfigSet** + - **Content** (str) - 返回的固定内容。最大支持存储 1 KB,只支持 ASCII 码值ch >= 32 && ch < 127范围内、不包括 $ 的可打印字符。 + - **HttpCode** (int) - 返回的 HTTP 响应码,仅支持 2xx、4xx、5xx 数字,x 为任意数字。 + + + **InsertHeaderConfigSet** + - **Key** (str) - 插入的 header 字段名称,长度为 1~40 个字符,支持大小写字母 a~z、数字、下划线(_)和短划线(-)。头字段名称不能重复用于InsertHeader中。header 字段不能使用以下(此处判断大小写不敏感)x-real-ip、x-forwarded-for、x-forwarded-proto、x-forwarded-srcport、ucloud-alb-trace、connection、upgrade、content-length、transfer-encoding、keep-alive、te、host、cookie、remoteip、authority + - **Value** (str) - 插入的 header 字段内容。ValueType 取值为 SystemDefined 时取值如下:ClientSrcPort:客户端端口。ClientSrcIp:客户端 IP 地址。Protocol:客户端请求的协议(HTTP 或 HTTPS)。RuleID:客户端请求命中的转发规则ID。ALBID:ALB ID。ALBPort:ALB 端口。ValueType 取值为 UserDefined 时:可以自定义头字段内容,限制长度为 1~128 个字符,只支持 ASCII 码值ch >= 32 && ch < 127范围内、不包括 $ 的可打印字符。ValueType 取值为 ReferenceHeader 时:可以引用请求头字段中的某一个字段,限制长度限制为 1~128 个字符,支持小写字母 a~z、数字、短划线(-)和下划线(_)。 + - **ValueType** (str) - 头字段内容类型。取值:UserDefined:用户指定。ReferenceHeader:引用用户请求头中的某一个字段。SystemDefined:系统定义。 + + + **RemoveHeaderConfigSet** + - **Key** (str) - 删除的 header 字段名称,目前只能删除以下几个默认配置的字段: X-Real-IP、X-Forwarded-For、X-Forwarded-Proto、X-Forwarded-SrcPort + + + **ForwardTargetSet** + - **Id** (str) - 服务节点的标识ID + - **Weight** (int) - 权重。仅监听器负载均衡算法是加权轮询是有效;取值范围[1-100],默认值为1 + + + **ForwardConfigSet** + - **Targets** (list) - 见 **ForwardTargetSet** 模型定义 + + + **RuleAction** + - **CorsConfig** (dict) - 见 **CorsConfigSet** 模型定义 + - **FixedResponseConfig** (dict) - 见 **FixedResponseConfigSet** 模型定义 + - **ForwardConfig** (dict) - 见 **ForwardConfigSet** 模型定义 + - **InsertHeaderConfig** (dict) - 见 **InsertHeaderConfigSet** 模型定义 + - **Order** (int) - 转发规则动作执行的顺序,取值为1~1000,按值从小到大执行动作。值不能为空,不能重复。Forward、FixedResponse 类型的动作不判断 Order,最后一个执行 + - **RemoveHeaderConfig** (dict) - 见 **RemoveHeaderConfigSet** 模型定义 + - **Type** (str) - 动作类型。限定枚举值:Forward、"InsertHeader"、"Cors"、"FixedResponse"、"RemoveHeader" + + + **HostConfigSet** + - **MatchMode** (str) - 匹配方式。限定枚举值:Regular-正则,Wildcard-泛域名; 默认值:Regular + - **Values** (list) - 取值。暂时只支持数组长度为1; 取值需符合相关匹配方式的条件 + + + **PathConfigSet** + - **Values** (list) - 取值。暂时只支持数组长度为1; 取值需符合相关匹配方式的条件 + + + **RuleCondition** + - **HostConfig** (dict) - 见 **HostConfigSet** 模型定义 + - **PathConfig** (dict) - 见 **PathConfigSet** 模型定义 + - **Type** (str) - 匹配条件类型。限定枚举值:Host,Path + + + **Rule** + - **IsDefault** (bool) - 是否为默认转发规则 + - **Pass** (bool) - 当转发的服务节点为空时,规则是否忽略 + - **RuleActions** (list) - 见 **RuleAction** 模型定义 + - **RuleConditions** (list) - 见 **RuleCondition** 模型定义 + - **RuleId** (str) - 转发规则的ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeRulesRequestSchema().dumps(d) + + resp = self.invoke("DescribeRules", d, **kwargs) + return apis.DescribeRulesResponseSchema().loads(resp) + + def describe_ssl(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """DescribeSSL - 获取SSL证书信息,仅能获取SSL证书与传统型负载均衡监听器的绑定关系 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - 数据分页值,默认为20 + - **Offset** (int) - 数据偏移量,默认值为0 + - **SSLId** (str) - SSL证书的Id + + **Response** + + - **DataSet** (list) - 见 **ULBSSLSet** 模型定义 + - **TotalCount** (int) - 满足条件的SSL证书总数 + + **Response Model** + + **SSLBindedTargetSet** + - **ULBId** (str) - VServer 所属的ULB实例的资源ID + - **ULBName** (str) - ULB实例的名称 + - **VServerId** (str) - SSL证书绑定到的VServer的资源ID + - **VServerName** (str) - 对应的VServer的名字 + + + **ULBSSLSet** + - **BindedTargetSet** (list) - 见 **SSLBindedTargetSet** 模型定义 + - **CreateTime** (int) - SSL证书的创建时间 + - **Domains** (str) - SSL证书平台的域名,多域名时,不展示扩展域名 + - **HashValue** (str) - SSL证书的HASH值 + - **NotAfter** (int) - 证书过期时间 + - **NotBefore** (int) - 证书颁发时间 + - **SSLContent** (str) - SSL证书的内容 + - **SSLId** (str) - SSL证书的Id + - **SSLName** (str) - SSL证书的名字 + - **SSLSource** (int) - SSL证书来源,SSL证书来源,0代表证书来自于ULB平台,1代表证书来自于USSL平台 + - **SSLType** (str) - SSL证书类型,暂时只有 Pem 一种类型 + - **USSLId** (str) - USSL证书平台的编号,只有当SSLSource为1时才出现 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeSSLRequestSchema().dumps(d) + + resp = self.invoke("DescribeSSL", d, **kwargs) + return apis.DescribeSSLResponseSchema().loads(resp) + + def describe_ssl_v2( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeSSLV2 - 获取SSL证书信息,该接口可以同时获取SSL与传统型和应用型负载均衡监听器的绑定关系 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - 数据分页值,默认为20 + - **Offset** (int) - 数据偏移量,默认值为0 + - **SSLId** (str) - SSL证书的Id + + **Response** + + - **DataSet** (list) - 见 **SSLInfo** 模型定义 + - **TotalCount** (int) - 满足条件的SSL证书总数 + + **Response Model** + + **SSLRelation** + - **IsDefault** (bool) - 是否为监听器默认SSL证书 + - **ListenerId** (str) - 监听器的ID + - **ListenerName** (str) - 监听器的名称 + - **LoadBalancerId** (str) - 负载均衡实例的ID + - **LoadBalancerName** (str) - 负载均衡实例的名称 + + + **SSLInfo** + - **CreateTime** (int) - SSL证书的创建时间 + - **DNSNames** (str) - SSL证书的扩展域名 + - **Domains** (str) - SSL证书的域名 + - **HashValue** (str) - SSL证书的HASH值 + - **NotAfter** (int) - 证书过期时间 + - **NotBefore** (int) - 证书颁发时间 + - **Relations** (list) - 见 **SSLRelation** 模型定义 + - **SSLContent** (str) - SSL证书的内容 + - **SSLId** (str) - SSL证书的Id + - **SSLName** (str) - SSL证书的名字 + - **SSLSource** (int) - SSL证书来源,SSL证书来源,0代表证书来自于ULB平台,1代表证书来自于USSL平台 + - **SSLType** (str) - SSL证书类型,暂时只有 Pem 一种类型 + - **USSLId** (str) - USSL证书平台的编号,只有当SSLSource为1时才出现 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeSSLV2RequestSchema().dumps(d) + + resp = self.invoke("DescribeSSLV2", d, **kwargs) + return apis.DescribeSSLV2ResponseSchema().loads(resp) + + def describe_security_policies( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeSecurityPolicies - 获取安全策略的信息,绑定关系仅能获取安全策略与传统型负载均衡监听器的绑定关系 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - 数据分页值 + - **Offset** (int) - 数据偏移量 + - **SecurityPolicyId** (str) - 安全策略ID + + **Response** + + - **DataSet** (list) - 见 **SecurityPolicy** 模型定义 + - **TotalCount** (int) - 满足条件的安全策略总数 + + **Response Model** + + **BindVServerInfo** + - **Port** (int) - VServer端口 + - **ULBId** (str) - ULB的ID + - **VServerId** (str) - 绑定的VServerId + - **VServerName** (str) - 绑定的VServer名称 + + + **SecurityPolicy** + - **SSLCiphers** (list) - 加密套件 + - **SecurityPolicyId** (str) - 安全策略ID + - **SecurityPolicyName** (str) - 安全策略名称 + - **SecurityPolicyType** (int) - 安全策略类型 0:预定义 1:自定义 + - **TLSVersion** (str) - TLS最低版本 + - **VServerSet** (list) - 见 **BindVServerInfo** 模型定义 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeSecurityPoliciesRequestSchema().dumps(d) + + resp = self.invoke("DescribeSecurityPolicies", d, **kwargs) + return apis.DescribeSecurityPoliciesResponseSchema().loads(resp) + + def describe_security_policies_v2( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeSecurityPoliciesV2 - 获取安全策略的信息,可以同时获取安全策略与传统型和应用性负载均衡监听器的绑定关系 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - 数据分页值 + - **Offset** (int) - 数据偏移量 + - **SecurityPolicyId** (str) - 安全策略ID + + **Response** + + - **DataSet** (list) - 见 **SecurityPolicyInfo** 模型定义 + - **TotalCount** (int) - 满足条件的安全策略总数 + + **Response Model** + + **SecurityPolicyRelation** + - **ListenerId** (str) - 监听器的ID + - **ListenerName** (str) - 监听器的名称 + - **ListenerPort** (int) - 监听端口 + - **LoadBalancerId** (str) - 负载均衡实例的ID + + + **SecurityPolicyInfo** + - **Relations** (list) - 见 **SecurityPolicyRelation** 模型定义 + - **SSLCiphers** (list) - 加密套件 + - **SecurityPolicyId** (str) - 安全策略ID + - **SecurityPolicyName** (str) - 安全策略名称 + - **SecurityPolicyType** (int) - 安全策略类型 0:预定义 1:自定义 + - **TLSVersion** (str) - TLS最低版本 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeSecurityPoliciesV2RequestSchema().dumps(d) + + resp = self.invoke("DescribeSecurityPoliciesV2", d, **kwargs) + return apis.DescribeSecurityPoliciesV2ResponseSchema().loads(resp) + + def describe_support_ciphers( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeSupportCiphers - 返回安全策略所有支持的加密套件 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + + **Response** + + - **DataSet** (list) - 见 **TLSAndCiphers** 模型定义 + + **Response Model** + + **TLSAndCiphers** + - **SSLCiphers** (list) - 加密套件 + - **TLSVersion** (str) - TLS最低版本 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeSupportCiphersRequestSchema().dumps(d) + + resp = self.invoke("DescribeSupportCiphers", d, **kwargs) + return apis.DescribeSupportCiphersResponseSchema().loads(resp) + + def describe_ulb(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """DescribeULB - 获取CLB详细信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BusinessId** (str) - CLB所属的业务组ID + - **Limit** (int) - 数据分页值,默认为20 + - **Offset** (int) - 数据偏移量,默认为0 + - **SubnetId** (str) - CLB所属的子网ID + - **ULBId** (str) - 传统型负载均衡实例的Id。 若指定则返回指定的传统型负载均衡实例的信息; 若不指定则返回当前数据中心中所有的传统型负载均衡实例的信息 + - **VPCId** (str) - CLB所属的VPC + + **Response** + + - **DataSet** (list) - 见 **ULBSet** 模型定义 + - **TotalCount** (int) - 满足条件的CLB总数 + + **Response Model** + + **PolicyBackendSet** + - **BackendId** (str) - 所添加的后端资源在ULB中的对象ID,(为ULB系统中使用,与资源自身ID无关 + - **ObjectId** (str) - 后端资源的对象ID + - **Port** (int) - 所添加的后端资源服务端口 + - **PrivateIP** (str) - 后端资源的内网IP + - **ResourceName** (str) - 后端资源的实例名称 + - **ResourceType** (str) - 所添加的后端资源的类型,枚举值:UHost -> 云主机;UPM -> 物理云主机; UDHost -> 私有专区主机;UDocker -> 容器;UHybrid->混合云主机;CUBE->Cube;UNI -> 虚拟网卡 + - **SubResourceId** (str) - 如果资源绑定了弹性网卡,则展示弹性网卡的资源ID + - **SubResourceName** (str) - 如果资源绑定了弹性网卡,则展示弹性网卡的资源名称 + - **SubResourceType** (str) - "UNI"或者为空 + + + **ULBPolicySet** + - **BackendSet** (list) - 见 **PolicyBackendSet** 模型定义 + - **DomainMatchMode** (str) - 内容转发规则中域名的匹配方式。枚举值:Regular,正则;Wildcard,泛域名 + - **Match** (str) - 内容转发匹配字段;默认内容转发类型下为空。 + - **PolicyId** (str) - 内容转发Id,默认内容转发类型下为空。 + - **PolicyPriority** (int) - 内容转发优先级,范围[1,9999],数字越大优先级越高。默认内容转发规则下为0。 + - **PolicyType** (str) - 内容类型,枚举值:Custom -> 客户自定义;Default -> 默认内容转发 + - **TotalCount** (int) - 默认内容转发类型下返回当前rs总数 + - **Type** (str) - 内容转发匹配字段的类型,枚举值:Domain -> 域名;Path -> 路径; 默认内容转发类型下为空 + - **VServerId** (str) - 所属VServerId + + + **BindSecurityPolicy** + - **SSLCiphers** (list) - 加密套件 + - **SecurityPolicyId** (str) - 安全策略组ID + - **SecurityPolicyName** (str) - 安全策略组名称 + - **SecurityPolicyType** (int) - 安全策略类型 0:预定义 1:自定义 + - **TLSVersion** (str) - TLS最低版本 + + + **SSLBindedTargetSet** + - **ULBId** (str) - VServer 所属的ULB实例的资源ID + - **ULBName** (str) - ULB实例的名称 + - **VServerId** (str) - SSL证书绑定到的VServer的资源ID + - **VServerName** (str) - 对应的VServer的名字 + + + **ULBSSLSet** + - **BindedTargetSet** (list) - 见 **SSLBindedTargetSet** 模型定义 + - **CreateTime** (int) - SSL证书的创建时间 + - **Domains** (str) - USSL证书平台的域名,只有当SSLSource为1时才出现 + - **HashValue** (str) - SSL证书的HASH值 + - **NotAfter** (int) - 证书过期时间,只有当SSLSource为1时才出现 + - **NotBefore** (int) - 证书颁发时间,只有当SSLSource为1时才出现 + - **SSLContent** (str) - SSL证书的内容 + - **SSLId** (str) - SSL证书的Id + - **SSLName** (str) - SSL证书的名字 + - **SSLSource** (int) - SSL证书来源,SSL证书来源,0代表证书来自于ULB平台,1代表证书来自于USSL平台 + - **SSLType** (str) - SSL证书类型,暂时只有 Pem 一种类型 + - **USSLId** (str) - USSL证书平台的编号,只有当SSLSource为1时才出现 + + + **ULBBackendSet** + - **BackendId** (str) - 后端资源实例的Id + - **Enabled** (int) - 后端提供服务的实例启用与否,枚举值:0 禁用 1 启用 + - **IsBackup** (int) - 是否为backup,只有当vserver的Backup属性为1时才会有此字段,说明:0:主rs1:备rs + - **Port** (int) - 后端提供服务的端口 + - **PrivateIP** (str) - 后端提供服务的内网IP + - **ResourceId** (str) - 资源实例的资源Id + - **ResourceName** (str) - 资源实例的资源名称 + - **ResourceType** (str) - 资源实例的类型 + - **Status** (int) - 后端提供服务的实例运行状态,枚举值:0健康检查健康状态 1 健康检查异常 + - **SubResourceId** (str) - 资源绑定的虚拟网卡实例的资源Id + - **SubResourceName** (str) - 资源绑定的虚拟网卡实例的资源名称 + - **SubResourceType** (str) - 资源绑定的虚拟网卡实例的类型 + - **SubnetId** (str) - 后端提供服务的资源所在的子网的ID + - **VPCId** (str) - 后端服务器所在的VPC + - **Weight** (int) - 后端RS权重(在加权轮询算法下有效) + + + **ULBVServerSet** + - **BackendSet** (list) - 见 **ULBBackendSet** 模型定义 + - **ClientTimeout** (int) - 空闲连接的回收时间,单位:秒。 + - **Domain** (str) - 根据MonitorType确认; 当MonitorType为Port时,此字段无意义。当MonitorType为Path时,代表HTTP检查域名 + - **EnableCompression** (int) - 数据压缩开关,0:关闭 1:开启 + - **EnableHTTP2** (int) - 0:关闭 1:开启,用于开启http2功能;默认值为0 + - **ForwardPort** (int) - 重定向端口,取值范围[0-65535];默认值为0,代表关闭;仅HTTP协议支持开启重定向功能 + - **FrontendPort** (int) - VServer服务端口 + - **ListenType** (str) - 监听器类型,枚举值为: RequestProxy -> 请求代理;PacketsTransmit -> 报文转发 + - **Method** (str) - VServer负载均衡的模式,枚举值:Roundrobin -> 轮询;Source -> 源地址;ConsistentHash -> 一致性哈希;SourcePort -> 源地址(计算端口);ConsistentHashPort -> 一致性哈希(计算端口)。 + - **MonitorType** (str) - 健康检查类型,枚举值:Port -> 端口检查;Path -> 路径检查;Ping -> Ping探测, Customize -> UDP检查请求代理型默认值为Port,其中TCP协议仅支持Port,其他协议支持Port和Path; 报文转发型TCP协议仅支持Port,UDP协议支持Ping、Port和Customize + - **Path** (str) - 根据MonitorType确认; 当MonitorType为Port时,此字段无意义。当MonitorType为Path时,代表HTTP检查路径 + - **PersistenceInfo** (str) - 根据PersistenceType确定: None或ServerInsert,此字段为空; UserDefined,此字段展示用户自定义会话string。 + - **PersistenceType** (str) - VServer会话保持方式。枚举值为: None -> 关闭会话保持; ServerInsert -> 自动生成; UserDefined -> 用户自定义。 + - **PolicySet** (list) - 见 **ULBPolicySet** 模型定义 + - **Protocol** (str) - VServer实例的协议。 枚举值为:HTTP,TCP,UDP,HTTPS。 + - **RequestMsg** (str) - 根据MonitorType确认; 当MonitorType为Customize时,此字段有意义,代表UDP检查发出的请求报文 + - **ResponseMsg** (str) - 根据MonitorType确认; 当MonitorType为Customize时,此字段有意义,代表UDP检查请求应收到的响应报文 + - **SSLSet** (list) - 见 **ULBSSLSet** 模型定义 + - **SecurityPolicy** (dict) - 见 **BindSecurityPolicy** 模型定义 + - **Status** (int) - VServer的运行状态。枚举值: 0 -> rs全部运行正常;1 -> rs全部运行异常;2 -> rs部分运行异常。 + - **ULBId** (str) - 负载均衡实例的Id + - **VServerId** (str) - VServer实例的Id + - **VServerName** (str) - VServer实例的名字 + + + **FirewallSet** + - **FirewallId** (str) - 防火墙ID + - **FirewallName** (str) - 防火墙名称 + + + **ULBIPSet** + - **Bandwidth** (int) - 弹性IP的带宽值(暂未对外开放) + - **BandwidthType** (int) - 弹性IP的带宽类型,枚举值:1 表示是共享带宽,0 普通带宽类型(暂未对外开放) + - **EIP** (str) - 弹性IP地址 + - **EIPId** (str) - 弹性IP的ID + - **OperatorName** (str) - 弹性IP的运营商信息,枚举值为: Bgp:BGP IP International:国际IP + + + **LoggerSet** + - **BucketName** (str) - ulb日志上传的bucket + - **TokenID** (str) - 上传到bucket使用的token的tokenid + - **TokenName** (str) - bucket的token名称 + + + **ULBSet** + - **Bandwidth** (int) - 带宽 + - **BandwidthType** (int) - 带宽类型,枚举值为: 0,非共享带宽; 1,共享带宽 + - **BusinessId** (str) - ULB 所属的业务组ID + - **CreateTime** (int) - ULB的创建时间,格式为Unix Timestamp + - **EnableLog** (int) - ULB是否开启日志功能。0,关闭;1,开启 + - **FirewallSet** (list) - 见 **FirewallSet** 模型定义 + - **IPSet** (list) - 见 **ULBIPSet** 模型定义 + - **IPVersion** (str) - ULB ip类型,枚举值:IPv6 / IPv4 (内部测试,暂未对外开放) + - **ListenType** (str) - ULB 监听器类型,枚举值:RequestProxy,请求代理; PacketsTransmit ,报文转发;Comprehensive,兼容型;Pending,未定型 + - **LogSet** (dict) - 见 **LoggerSet** 模型定义 + - **Name** (str) - 负载均衡的资源名称 + - **PrivateIP** (str) - ULB的内网IP,当ULBType为OuterMode时,该值为空 + - **Remark** (str) - 负载均衡的备注 + - **SnatIps** (list) - ULB后向代理IP,仅当有代理IP时返回否 + - **SubnetId** (str) - ULB 为 InnerMode 时,ULB 所属的子网ID,默认为空 + - **Tag** (str) - 负载均衡的业务组名称 + - **ULBId** (str) - 负载均衡的资源ID + - **ULBType** (str) - ULB 的类型 + - **VPCId** (str) - ULB所在的VPC的ID + - **VServerSet** (list) - 见 **ULBVServerSet** 模型定义 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeULBRequestSchema().dumps(d) + + resp = self.invoke("DescribeULB", d, **kwargs) + return apis.DescribeULBResponseSchema().loads(resp) + + def describe_ulb_simple( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeULBSimple - 获取CLB信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BusinessId** (str) - CLB所属的业务组ID + - **Limit** (int) - 数据分页值,默认为10000 + - **Offset** (int) - 数据偏移量,默认为0 + - **SubnetId** (str) - CLB所属的子网ID + - **ULBId** (str) - 传统型负载均衡实例的Id。 若指定则返回指定的传统型负载均衡实例的信息; 若不指定则返回当前数据中心中所有的传统型负载均衡实例的信息 + - **VPCId** (str) - CLB所属的VPC + + **Response** + + - **DataSet** (list) - 见 **ULBSimpleSet** 模型定义 + - **TotalCount** (int) - 满足条件的CLB总数 + + **Response Model** + + **LoggerSet** + - **BucketName** (str) - ulb日志上传的bucket + - **TokenID** (str) - 上传到bucket使用的token的tokenid + - **TokenName** (str) - bucket的token名称 + + + **FirewallSet** + - **FirewallId** (str) - 防火墙ID + - **FirewallName** (str) - 防火墙名称 + + + **ULBIPSet** + - **Bandwidth** (int) - 弹性IP的带宽值(暂未对外开放) + - **BandwidthType** (int) - 弹性IP的带宽类型,枚举值:1 表示是共享带宽,0 普通带宽类型(暂未对外开放) + - **EIP** (str) - 弹性IP地址 + - **EIPId** (str) - 弹性IP的ID + - **OperatorName** (str) - 弹性IP的运营商信息,枚举值为: Bgp:BGP IP International:国际IP + + + **ULBSimpleSet** + - **Bandwidth** (int) - 带宽 + - **BandwidthType** (int) - 带宽类型,枚举值为: 0,非共享带宽; 1,共享带宽 + - **BusinessId** (str) - ULB 所属的业务组ID + - **CreateTime** (int) - ULB的创建时间,格式为Unix Timestamp + - **EnableLog** (int) - ULB是否开启日志功能。0,关闭;1,开启 + - **FirewallSet** (list) - 见 **FirewallSet** 模型定义 + - **IPSet** (list) - 见 **ULBIPSet** 模型定义 + - **IPVersion** (str) - ULB提供服务的IP类型。枚举值,“IPv4”,"IPv6"。默认为“IPv4” + - **ListenType** (str) - ULB 监听器类型,枚举值:RequestProxy,请求代理; PacketsTransmit ,报文转发;Comprehensive,兼容型;Pending,未定型 + - **LogSet** (dict) - 见 **LoggerSet** 模型定义 + - **Name** (str) - 负载均衡的资源名称 + - **PrivateIP** (str) - ULB的内网IP,当ULBType为OuterMode时,该值为空 + - **Remark** (str) - 负载均衡的备注 + - **SnatIps** (list) - ULB后向代理IP,仅当有代理IP时返回否 + - **SubnetId** (str) - ULB 为 InnerMode 时,ULB 所属的子网ID + - **Tag** (str) - 负载均衡的业务组名称 + - **ULBId** (str) - 负载均衡的资源ID + - **ULBType** (str) - ULB 的类型(InnerMode or OuterMode) + - **VPCId** (str) - ULB所在的VPC的ID + - **VServerCount** (int) - ulb下vserver数量 + - **WAFMode** (str) - WAF功能状态,枚举类型:Unavailable:无法创建WAF;NoWAF:未绑定WAF;Intranet:内网回源Waf;Extranet:外网回源Waf + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeULBSimpleRequestSchema().dumps(d) + + resp = self.invoke("DescribeULBSimple", d, **kwargs) + return apis.DescribeULBSimpleResponseSchema().loads(resp) + + def describe_vserver( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeVServer - 获取CLB下的VServer的详细信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - 数据分页值 + - **Offset** (int) - 数据偏移量 + - **ULBId** (str) - 传统型负载均衡实例的Id + - **VServerId** (str) - CLB下的VServer实例的Id;若指定则返回指定的VServer实例的信息; 若不指定则返回当前传统型负载均衡实例下所有VServer的信息 + + **Response** + + - **DataSet** (list) - 见 **ULBVServerSet** 模型定义 + - **TotalCount** (int) - 满足条件的VServer总数 + + **Response Model** + + **SSLBindedTargetSet** + - **ULBId** (str) - VServer 所属的ULB实例的资源ID + - **ULBName** (str) - ULB实例的名称 + - **VServerId** (str) - SSL证书绑定到的VServer的资源ID + - **VServerName** (str) - 对应的VServer的名字 + + + **ULBSSLSet** + - **BindedTargetSet** (list) - 见 **SSLBindedTargetSet** 模型定义 + - **CreateTime** (int) - SSL证书的创建时间 + - **Domains** (str) - USSL证书平台的域名,只有当SSLSource为1时才出现 + - **HashValue** (str) - SSL证书的HASH值 + - **NotAfter** (int) - 证书过期时间,只有当SSLSource为1时才出现 + - **NotBefore** (int) - 证书颁发时间,只有当SSLSource为1时才出现 + - **SSLContent** (str) - SSL证书的内容 + - **SSLId** (str) - SSL证书的Id + - **SSLName** (str) - SSL证书的名字 + - **SSLSource** (int) - SSL证书来源,SSL证书来源,0代表证书来自于ULB平台,1代表证书来自于USSL平台 + - **SSLType** (str) - SSL证书类型,暂时只有 Pem 一种类型 + - **USSLId** (str) - USSL证书平台的编号,只有当SSLSource为1时才出现 + + + **BindSecurityPolicy** + - **SSLCiphers** (list) - 加密套件 + - **SecurityPolicyId** (str) - 安全策略组ID + - **SecurityPolicyName** (str) - 安全策略组名称 + - **SecurityPolicyType** (int) - 安全策略类型 0:预定义 1:自定义 + - **TLSVersion** (str) - TLS最低版本 + + + **PolicyBackendSet** + - **BackendId** (str) - 所添加的后端资源在ULB中的对象ID,(为ULB系统中使用,与资源自身ID无关 + - **ObjectId** (str) - 后端资源的对象ID + - **Port** (int) - 所添加的后端资源服务端口 + - **PrivateIP** (str) - 后端资源的内网IP + - **ResourceName** (str) - 后端资源的实例名称 + - **ResourceType** (str) - 所添加的后端资源的类型,枚举值:UHost -> 云主机;UPM -> 物理云主机; UDHost -> 私有专区主机;UDocker -> 容器;UHybrid->混合云主机;CUBE->Cube;UNI -> 虚拟网卡 + - **SubResourceId** (str) - 如果资源绑定了弹性网卡,则展示弹性网卡的资源ID + - **SubResourceName** (str) - 如果资源绑定了弹性网卡,则展示弹性网卡的资源名称 + - **SubResourceType** (str) - "UNI"或者为空 + + + **ULBPolicySet** + - **BackendSet** (list) - 见 **PolicyBackendSet** 模型定义 + - **DomainMatchMode** (str) - 内容转发规则中域名的匹配方式。枚举值:Regular,正则;Wildcard,泛域名 + - **Match** (str) - 内容转发匹配字段;默认内容转发类型下为空。 + - **PolicyId** (str) - 内容转发Id,默认内容转发类型下为空。 + - **PolicyPriority** (int) - 内容转发优先级,范围[1,9999],数字越大优先级越高。默认内容转发规则下为0。 + - **PolicyType** (str) - 内容类型,枚举值:Custom -> 客户自定义;Default -> 默认内容转发 + - **TotalCount** (int) - 默认内容转发类型下返回当前rs总数 + - **Type** (str) - 内容转发匹配字段的类型,枚举值:Domain -> 域名;Path -> 路径; 默认内容转发类型下为空 + - **VServerId** (str) - 所属VServerId + + + **ULBBackendSet** + - **BackendId** (str) - 后端资源实例的Id + - **Enabled** (int) - 后端提供服务的实例启用与否,枚举值:0 禁用 1 启用 + - **IsBackup** (int) - 是否为backup,只有当vserver的Backup属性为1时才会有此字段,说明:0:主rs1:备rs + - **Port** (int) - 后端提供服务的端口 + - **PrivateIP** (str) - 后端提供服务的内网IP + - **ResourceId** (str) - 资源实例的资源Id + - **ResourceName** (str) - 资源实例的资源名称 + - **ResourceType** (str) - 资源实例的类型 + - **Status** (int) - 后端提供服务的实例运行状态,枚举值:0健康检查健康状态 1 健康检查异常 + - **SubResourceId** (str) - 资源绑定的虚拟网卡实例的资源Id + - **SubResourceName** (str) - 资源绑定的虚拟网卡实例的资源名称 + - **SubResourceType** (str) - 资源绑定的虚拟网卡实例的类型 + - **SubnetId** (str) - 后端提供服务的资源所在的子网的ID + - **VPCId** (str) - 后端服务器所在的VPC + - **Weight** (int) - 后端RS权重(在加权轮询算法下有效) + + + **ULBVServerSet** + - **BackendSet** (list) - 见 **ULBBackendSet** 模型定义 + - **ClientTimeout** (int) - 空闲连接的回收时间,单位:秒。 + - **Domain** (str) - 根据MonitorType确认; 当MonitorType为Port时,此字段无意义。当MonitorType为Path时,代表HTTP检查域名 + - **EnableCompression** (int) - 数据压缩开关,0:关闭 1:开启 + - **EnableHTTP2** (int) - 0:关闭 1:开启,用于开启http2功能;默认值为0 + - **ForwardPort** (int) - 重定向端口,取值范围[0-65535];默认值为0,代表关闭;仅HTTP协议支持开启重定向功能 + - **FrontendPort** (int) - VServer服务端口 + - **ListenType** (str) - 监听器类型,枚举值为: RequestProxy -> 请求代理;PacketsTransmit -> 报文转发 + - **Method** (str) - VServer负载均衡的模式,枚举值:Roundrobin -> 轮询;Source -> 源地址;ConsistentHash -> 一致性哈希;SourcePort -> 源地址(计算端口);ConsistentHashPort -> 一致性哈希(计算端口)。 + - **MonitorType** (str) - 健康检查类型,枚举值:Port -> 端口检查;Path -> 路径检查;Ping -> Ping探测, Customize -> UDP检查请求代理型默认值为Port,其中TCP协议仅支持Port,其他协议支持Port和Path; 报文转发型TCP协议仅支持Port,UDP协议支持Ping、Port和Customize + - **Path** (str) - 根据MonitorType确认; 当MonitorType为Port时,此字段无意义。当MonitorType为Path时,代表HTTP检查路径 + - **PersistenceInfo** (str) - 根据PersistenceType确定: None或ServerInsert,此字段为空; UserDefined,此字段展示用户自定义会话string。 + - **PersistenceType** (str) - VServer会话保持方式。枚举值为: None -> 关闭会话保持; ServerInsert -> 自动生成; UserDefined -> 用户自定义。 + - **PolicySet** (list) - 见 **ULBPolicySet** 模型定义 + - **Protocol** (str) - VServer实例的协议。 枚举值为:HTTP,TCP,UDP,HTTPS。 + - **RequestMsg** (str) - 根据MonitorType确认; 当MonitorType为Customize时,此字段有意义,代表UDP检查发出的请求报文 + - **ResponseMsg** (str) - 根据MonitorType确认; 当MonitorType为Customize时,此字段有意义,代表UDP检查请求应收到的响应报文 + - **SSLSet** (list) - 见 **ULBSSLSet** 模型定义 + - **SecurityPolicy** (dict) - 见 **BindSecurityPolicy** 模型定义 + - **Status** (int) - VServer的运行状态。枚举值: 0 -> rs全部运行正常;1 -> rs全部运行异常;2 -> rs部分运行异常。 + - **ULBId** (str) - 负载均衡实例的Id + - **VServerId** (str) - VServer实例的Id + - **VServerName** (str) - VServer实例的名字 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeVServerRequestSchema().dumps(d) + + resp = self.invoke("DescribeVServer", d, **kwargs) + return apis.DescribeVServerResponseSchema().loads(resp) + + def release_backend( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ReleaseBackend - 从CLB的VServer释放后端资源实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BackendId** (str) - (Required) 后端资源实例的ID(CLB后端ID,非资源自身ID) + - **ULBId** (str) - (Required) 传统型负载均衡实例的ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ReleaseBackendRequestSchema().dumps(d) + + resp = self.invoke("ReleaseBackend", d, **kwargs) + return apis.ReleaseBackendResponseSchema().loads(resp) + + def remove_targets( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RemoveTargets - 从应用型负载均衡监听器删除后端服务节点 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Ids** (list) - (Required) 服务节点的标识ID。不超过20个; + - **ListenerId** (str) - (Required) 监听器的ID + - **LoadBalancerId** (str) - (Required) 负载均衡实例的ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.RemoveTargetsRequestSchema().dumps(d) + + resp = self.invoke("RemoveTargets", d, **kwargs) + return apis.RemoveTargetsResponseSchema().loads(resp) + + def un_bind_security_policy( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UnBindSecurityPolicy - 批量解绑安全策略,会同时解绑与传统型和应用型负载均衡监听器的绑定关系 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SecurityPolicyId** (str) - (Required) 安全策略ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UnBindSecurityPolicyRequestSchema().dumps(d) + + resp = self.invoke("UnBindSecurityPolicy", d, **kwargs) + return apis.UnBindSecurityPolicyResponseSchema().loads(resp) + + def unbind_ssl(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """UnbindSSL - 从CLB下的VServer解绑SSL证书 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SSLId** (str) - (Required) SSL证书的Id + - **ULBId** (str) - (Required) 所绑定CLB实例ID + - **VServerId** (str) - (Required) CLB所绑定VServer实例ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UnbindSSLRequestSchema().dumps(d) + + resp = self.invoke("UnbindSSL", d, **kwargs) + return apis.UnbindSSLResponseSchema().loads(resp) + + def update_backend_attribute( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateBackendAttribute - 更新CLB后端资源实例(服务节点)属性 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BackendId** (str) - (Required) 后端资源实例的ID(CLB后端ID,非资源自身ID) + - **ULBId** (str) - (Required) 传统型负载均衡资源ID + - **Enabled** (int) - 后端实例状态开关 + - **IsBackup** (int) - 是否为backup0:主rs1:备rs默认为0 + - **Port** (int) - 后端资源服务端口,取值范围[1-65535] + - **Weight** (int) - 所添加的后端RS权重(在加权轮询算法下有效),取值范围[1-100],默认为1 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateBackendAttributeRequestSchema().dumps(d) + + resp = self.invoke("UpdateBackendAttribute", d, **kwargs) + return apis.UpdateBackendAttributeResponseSchema().loads(resp) + + def update_backend_batch( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateBackendBatch - 批量更新ULB后端资源实例(服务节点)属性 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ULBId** (str) - (Required) 负载均衡资源ID + - **Attributes** (list) - 见 **UpdateBackendBatchParamAttributes** 模型定义 + + **Response** + + - **BackendSet** (list) - 见 **BackendMsg** 模型定义 + + **Request Model** + + **UpdateBackendBatchParamAttributes** + - **BackendId** (str) - 后端资源实例的ID(ULB后端ID,非资源自身ID) + - **Enabled** (int) - 后端实例状态开关 + - **IsBackup** (int) - 是否为backup 0:主rs 1:备rs 默认为0 + - **Port** (int) - 后端资源服务端口,取值范围[1-65535] + - **Weight** (int) - 所添加的后端RS权重(在加权轮询算法下有效),取值范围[0-100],默认为1 + + + **Response Model** + + **BackendMsg** + - **BackendId** (str) - rs的资源ID + - **SubMessage** (str) - 修改rs返回的消息 + - **SubRetCode** (int) - 修改rs的返回值 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateBackendBatchRequestSchema().dumps(d) + + resp = self.invoke("UpdateBackendBatch", d, **kwargs) + return apis.UpdateBackendBatchResponseSchema().loads(resp) + + def update_listener_attribute( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateListenerAttribute - 更新一个应用型负载均衡监听器的属性 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ListenerId** (str) - (Required) 监听器的ID + - **LoadBalancerId** (str) - (Required) 负载均衡实例的ID + - **Certificates** (list) - (应用型专用)服务器默认证书ID。仅HTTPS监听支持 + - **CompressionEnabled** (bool) - (应用型专用)是否开启数据压缩功能。目前只支持使用gzip对特定文件类型进行压缩 + - **HTTP2Enabled** (bool) - (应用型专用)是否开启HTTP/2特性。仅HTTPS监听支持开启 + - **HealthCheckConfig** (dict) - 见 **UpdateListenerAttributeParamHealthCheckConfig** 模型定义 + - **IdleTimeout** (int) - 连接空闲超时时间。单位:秒。应用型限定取值:[1-86400] + - **Name** (str) - 监听器的名称。限定字符长度:[1-255];限定特殊字符,仅支持:-_. + - **RedirectEnabled** (bool) - (应用型专用)是否开启HTTP重定向到HTTPS。仅HTTP监听支持开启 + - **RedirectPort** (int) - (应用型专用)重定向端口。限定取值:[1-65535] + - **Remark** (str) - 监听器的备注信息。限定字符长度:[0-255] + - **Scheduler** (str) - 负载均衡算法。应用型限定取值:"Roundrobin"/"Source"/"WeightRoundrobin"/" Leastconn"/"Backup" + - **SecurityPolicyId** (str) - (应用型专用)安全策略组ID。仅HTTPS监听支持绑定。“Default”,表示绑定原生策略 + - **StickinessConfig** (dict) - 见 **UpdateListenerAttributeParamStickinessConfig** 模型定义 + + **Response** + + + **Request Model** + + **UpdateListenerAttributeParamStickinessConfig** + - **CookieName** (str) - (应用型专用)自定义Cookie。当StickinessType取值"UserDefined"时有效;限定字符长度:[0-255] + - **Enabled** (bool) - 是否开启会话保持功能。应用型负载均衡实例基于Cookie实现,网络型负载均衡则基于源IP,保证在对应的空闲超时时间内,同一个源IP送到同一个服务节点。默认值为:false + - **Type** (str) - (应用型专用)Cookie处理方式。限定枚举值:"ServerInsert" / "UserDefined",不传值则不修改 + + + **UpdateListenerAttributeParamHealthCheckConfig** + - **Domain** (str) - (应用型专用)HTTP检查域名 + - **Enabled** (bool) - 是否开启健康检查功能。暂时不支持关闭;默认值为:true + - **Method** (str) - (应用型专用)HTTP检查方法。只支持GET和HEAD。 + - **Path** (str) - (应用型专用)HTTP检查路径 + - **ResponseCode** (str) - (应用型专用)GRPC检查响应码 + - **Type** (str) - 健康检查方式。应用型限定取值:“Port”/"HTTP";默认值:“Port” + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateListenerAttributeRequestSchema().dumps(d) + + resp = self.invoke("UpdateListenerAttribute", d, **kwargs) + return apis.UpdateListenerAttributeResponseSchema().loads(resp) + + def update_load_balancer_attribute( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateLoadBalancerAttribute - 更新一个应用型负载均衡实例的属性 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **LoadBalancerId** (str) - (Required) 负载均衡实例的ID + - **AccessLogConfig** (dict) - 见 **UpdateLoadBalancerAttributeParamAccessLogConfig** 模型定义 + - **Name** (str) - 负载均衡实例的名称,不传则默认不修改 + - **Remark** (str) - 负载均衡实例的备注信息,不传则默认不修改,限定字符长度:[0-255] + - **Tag** (str) - 负载均衡实例所属的业务组ID,不传则默认不修改 + + **Response** + + + **Request Model** + + **UpdateLoadBalancerAttributeParamAccessLogConfig** + - **Enabled** (bool) - (应用型专用)是否开启访问日志记录功能 + - **US3BucketName** (str) - (应用型专用)用于存储访问日志的bucket + - **US3TokenId** (str) - (应用型专用)上传访问日志到bucket所需的token + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateLoadBalancerAttributeRequestSchema().dumps(d) + + resp = self.invoke("UpdateLoadBalancerAttribute", d, **kwargs) + return apis.UpdateLoadBalancerAttributeResponseSchema().loads(resp) + + def update_policy( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdatePolicy - 更新传统型负载均衡内容转发规则,包括转发规则后的服务节点 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Match** (str) - (Required) 内容转发匹配字段 + - **ULBId** (str) - (Required) 需要添加内容转发策略的传统型负载均衡实例ID + - **VServerId** (str) - (Required) 需要添加内容转发策略的VServer实例ID,只支持请求代理模式下,HTTP或HTTPS协议的CLB下的VServer + - **BackendId** (list) - 内容转发策略应用的后端资源实例的ID(CLB的后端节点Id),来源于 AllocateBackend 返回的 BackendId,不传表示更新转发节点为空 + - **DomainMatchMode** (str) - 内容转发规则中域名的匹配方式,默认与原本一致。枚举值:Regular,正则;Wildcard,泛域名 + - **PolicyId** (str) - 传统型负载均衡转发规则的ID,当Type为Default时,可以不传或为空 + - **PolicyPriority** (int) - 策略优先级,1-9999;只针对路径规则生效 + - **Type** (str) - 内容转发匹配字段的类型,枚举值:Domain -> 域名转发规则;Path -> 路径转发规则;Default -> 默认转发规则,不传默认值Domain + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdatePolicyRequestSchema().dumps(d) + + resp = self.invoke("UpdatePolicy", d, **kwargs) + return apis.UpdatePolicyResponseSchema().loads(resp) + + def update_rule_attribute( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateRuleAttribute - 更新应用型负载均衡监听器的一条转发规则的属性 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ListenerId** (str) - (Required) 监听器的ID + - **LoadBalancerId** (str) - (Required) 负载均衡实例的ID + - **RuleId** (str) - (Required) 转发规则的ID + - **Pass** (bool) - 当转发的服务节点为空时,规则是否忽略。默认转发规则不可更改 + - **RuleActions** (list) - 见 **UpdateRuleAttributeParamRuleActions** 模型定义 + - **RuleConditions** (list) - 见 **UpdateRuleAttributeParamRuleConditions** 模型定义 + + **Response** + + + **Request Model** + + **UpdateRuleAttributeParamRuleActionsForwardConfigTargets** + - **Id** (str) - 转发的后端服务节点的标识ID。限定在监听器的服务节点池里;数组长度可以是0;转发服务节点配置的数组长度不为0时,Id必填 + - **Weight** (int) - 转发的后端服务节点的权重。仅监听器负载均衡算法是加权轮询是有效 + + + **UpdateRuleAttributeParamRuleActionsCorsConfig** + - **AllowCredentials** (str) - 是否允许携带凭证信息。取值:on:是。off:否。 + - **AllowHeaders** (list) - 允许跨域的 Header 列表。支持配置为*或配置一个或多个 value 值。单个 value 值只允许包含大小写字母、数字,不能以下划线(_)和短划线(-)开头或结尾,最大长度限制为 32 个字符。最多支持20个值 + - **AllowMethods** (list) - 选择跨域访问时允许的 HTTP 方法。取值:GET。POST。PUT。DELETE。HEAD。OPTIONS。PATCH。 + - **AllowOrigin** (list) - 允许的访问来源列表。支持只配置一个元素*,或配置一个或多个值。单个值必须以http://或者https://开头,后边加一个正确的域名或一级泛域名。(例:http://*.test.abc.example.com)单个值可以不加端口,也可以指定端口,端口范围:1~65535。最多支持5个值 + - **ExposeHeaders** (list) - 允许暴露的 Header 列表。支持配置为*或配置一个或多个 value 值。单个 value 值只允许包含大小写字母、数字,不能以下划线(_)和短划线(-)开头或结尾,最大长度限制为 32 个字符。最多支持20个值 + - **MaxAge** (int) - 预检请求在浏览器的最大缓存时间,单位:秒。取值范围:-1~172800。 + + + **UpdateRuleAttributeParamRuleActionsFixedResponseConfig** + - **Content** (str) - 返回的固定内容。最大支持存储 1 KB,只支持 ASCII 码值ch >= 32 && ch < 127范围内、不包括 $ 的可打印字符。 + - **HttpCode** (int) - 返回的 HTTP 响应码,仅支持 2xx、4xx、5xx 数字,x 为任意数字。 + + + **UpdateRuleAttributeParamRuleActionsInsertHeaderConfig** + - **Key** (str) - 插入的 header 字段名称,长度为 1~40 个字符,支持大小写字母 a~z、数字、下划线(_)和短划线(-)。头字段名称不能重复用于InsertHeader中。header 字段不能使用以下(此处判断大小写不敏感)x-real-ip、x-forwarded-for、x-forwarded-proto、x-forwarded-srcport、ucloud-alb-trace、connection、upgrade、content-length、transfer-encoding、keep-alive、te、host、cookie、remoteip、authority + - **Value** (str) - 插入的 header 字段内容。ValueType 取值为 SystemDefined 时取值如下:ClientSrcPort:客户端端口。ClientSrcIp:客户端 IP 地址。Protocol:客户端请求的协议(HTTP 或 HTTPS)。RuleID:客户端请求命中的转发规则ID。ALBID:ALB ID。ALBPort:ALB 端口。ValueType 取值为 UserDefined 时:可以自定义头字段内容,限制长度为 1~128 个字符,只支持 ASCII 码值ch >= 32 && ch < 127范围内、不包括 $ 的可打印字符。ValueType 取值为 ReferenceHeader 时:可以引用请求头字段中的某一个字段,限制长度限制为 1~128 个字符,支持小写字母 a~z、数字、短划线(-)和下划线(_)。 + - **ValueType** (str) - 头字段内容类型。取值:UserDefined:用户指定。ReferenceHeader:引用用户请求头中的某一个字段。SystemDefined:系统定义。 + + + **UpdateRuleAttributeParamRuleActionsRemoveHeaderConfig** + - **Key** (str) - 删除的 header 字段名称,目前只能删除以下几个默认配置的字段X-Real-IP、X-Forwarded-For、X-Forwarded-Proto、X-Forwarded-SrcPort + + + **UpdateRuleAttributeParamRuleActionsForwardConfig** + - **Targets** (list) - 见 **UpdateRuleAttributeParamRuleActionsForwardConfigTargets** 模型定义 + + + **UpdateRuleAttributeParamRuleActions** + - **CorsConfig** (dict) - 见 **UpdateRuleAttributeParamRuleActionsCorsConfig** 模型定义 + - **FixedResponseConfig** (dict) - 见 **UpdateRuleAttributeParamRuleActionsFixedResponseConfig** 模型定义 + - **ForwardConfig** (dict) - 见 **UpdateRuleAttributeParamRuleActionsForwardConfig** 模型定义 + - **InsertHeaderConfig** (dict) - 见 **UpdateRuleAttributeParamRuleActionsInsertHeaderConfig** 模型定义 + - **Order** (int) - 转发规则动作执行的顺序,取值为1~1000,按值从小到大执行动作。值不能为空,不能重复。Forward、FixedResponse 类型的动作不判断 Order,最后一个执行 + - **RemoveHeaderConfig** (dict) - 见 **UpdateRuleAttributeParamRuleActionsRemoveHeaderConfig** 模型定义 + - **Type** (str) - 动作类型。限定枚举值:"Forward";RuleActions数组长度不为0时必填 + + + **UpdateRuleAttributeParamRuleConditionsHostConfig** + - **MatchMode** (str) - 匹配方式。限定枚举值:"Regular"/"Wildcard",默认值:"Regular" + - **Values** (list) - 取值。暂时只支持数组长度为1;取值需符合相关匹配方式的条件;修改域名匹配时必填 + + + **UpdateRuleAttributeParamRuleConditionsPathConfig** + - **Values** (list) - 取值。暂时只支持数组长度为1;取值需符合相关条件;修改路径匹配时必填 + + + **UpdateRuleAttributeParamRuleConditions** + - **HostConfig** (dict) - 见 **UpdateRuleAttributeParamRuleConditionsHostConfig** 模型定义 + - **PathConfig** (dict) - 见 **UpdateRuleAttributeParamRuleConditionsPathConfig** 模型定义 + - **Type** (str) - 匹配条件类型。限定枚举值:"Host"/"Path";RuleConditions数组长度不为0时必填 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateRuleAttributeRequestSchema().dumps(d) + + resp = self.invoke("UpdateRuleAttribute", d, **kwargs) + return apis.UpdateRuleAttributeResponseSchema().loads(resp) + + def update_ssl_attribute( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateSSLAttribute - 更新修改SSL的属性,如:修改SSLName + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SSLId** (str) - (Required) SSL的资源id + - **SSLName** (str) - (Required) SSL实例名称,不允许传空 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateSSLAttributeRequestSchema().dumps(d) + + resp = self.invoke("UpdateSSLAttribute", d, **kwargs) + return apis.UpdateSSLAttributeResponseSchema().loads(resp) + + def update_ssl_binding( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateSSLBinding - 将传统型或应用型负载均衡监听器绑定的证书更换为另一个证书, + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **NewSSLId** (str) - (Required) 监听器实例需要绑定的新的证书 + - **OldSSLId** (str) - (Required) 监听器实例绑定的旧的证书 + - **ListenerId** (str) - 所操作监听器实例ID(仅ListenerId传参时,将更换该监听器所有原证书为OldSSLId的绑定关系;LoadBalancerId和ListenerId都不传参则将更新该项目下所有原证书为OldSSLId的绑定关系;若LoadBalancerId与ListenerId皆有传参,则会强校验ULB与Vsserver的所属关系,将更换该ulb下vserver所绑定的OldSSLId为NewSSLId)(监听器指VServer或Listener) + - **LoadBalancerId** (str) - 所操作LB实例ID(仅LoadBalancerId传参时,将更换该LB所有原证书为OldSSLId的绑定关系;LoadBalancerId和ListenerId都不传参则将更新该项目下所有原证书为OldSSLId的绑定关系)(LB指CLB或ALB) + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateSSLBindingRequestSchema().dumps(d) + + resp = self.invoke("UpdateSSLBinding", d, **kwargs) + return apis.UpdateSSLBindingResponseSchema().loads(resp) + + def update_security_policy( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateSecurityPolicy - 更新安全策略 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SecurityPolicyId** (str) - (Required) 安全策略ID + - **SSLCiphers** (list) - 加密套件,TLS最低版本和加密套件必须全不为空或全为空 + - **SecurityPolicyName** (str) - 安全策略名称 + - **TLSVersion** (str) - TLS最低版本,TLS最低版本和加密套件必须全不为空或全为空 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateSecurityPolicyRequestSchema().dumps(d) + + resp = self.invoke("UpdateSecurityPolicy", d, **kwargs) + return apis.UpdateSecurityPolicyResponseSchema().loads(resp) + + def update_targets_attribute( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateTargetsAttribute - 更新应用型负载均衡监听器后端服务节点的属性 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ListenerId** (str) - (Required) 监听器的ID + - **LoadBalancerId** (str) - (Required) 负载均衡实例的ID + - **Targets** (list) - 见 **UpdateTargetsAttributeParamTargets** 模型定义 + + **Response** + + + **Request Model** + + **UpdateTargetsAttributeParamTargets** + - **Enabled** (bool) - 服务节点是否启用。默认值true;要更新的Targets数组长度至少为1,不超过20个 + - **Id** (str) - 服务节点的标识ID。限定枚举值:"UHost" / "UNI"/"UPM"/"IP";要更新的Targets数组长度至少为1,不超过20个 + - **IsBackup** (bool) - 服务节点是否为备节点。默认值false;要更新的Targets数组长度至少为1,不超过20个 + - **Weight** (int) - 服务节点的权重。限定取值:[1-100],默认值1;仅在加权轮询算法时有效;要更新的Targets数组长度至少为1,不超过20个 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateTargetsAttributeRequestSchema().dumps(d) + + resp = self.invoke("UpdateTargetsAttribute", d, **kwargs) + return apis.UpdateTargetsAttributeResponseSchema().loads(resp) + + def update_ulb_attribute( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateULBAttribute - 更新CLB名字业务组备注等属性字段 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ULBId** (str) - (Required) CLB资源ID + - **BucketName** (str) - 设置用于存储ulb日志的bucket + - **EnableLog** (int) - 日志开关,1代表开启日志,0代表关闭日志,传1时必须同时传BucketName,TokenName与TokenId二选一 + - **IsWAFOn** (str) - 是否开启WAF。枚举类型:Yes,No,默认值为No + - **Name** (str) - 名字,不传则默认不修改 + - **Remark** (str) - 备注,不传则默认不修改 + - **Tag** (str) - 业务,不传则默认不修改 + - **TokenId** (str) - 用于指定上传到bucket所需的token,与TokenName选填其一即可 + - **TokenName** (str) - 用于指定上传到bucket所需的token,与TokenId选填其一即可 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateULBAttributeRequestSchema().dumps(d) + + resp = self.invoke("UpdateULBAttribute", d, **kwargs) + return apis.UpdateULBAttributeResponseSchema().loads(resp) + + def update_vserver_attribute( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateVServerAttribute - 更新传统型负载均衡VServer实例属性 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ULBId** (str) - (Required) 传统型负载均衡实例ID + - **VServerId** (str) - (Required) 传统型负载均衡VServer实例ID + - **ClientTimeout** (int) - 请求代理的VServer下表示空闲连接的回收时间,单位:秒,取值范围:时(0,86400],默认值为60;报文转发的VServer下表示回话保持的时间,单位:秒,取值范围:[60,900],0 表示禁用连接保持 + - **Domain** (str) - MonitorType 为 Path 时指定健康检查发送请求时HTTP HEADER 里的域名 + - **EnableCompression** (int) - 0:关闭 1:开启,用于数据压缩功能 + - **EnableHTTP2** (int) - 0:关闭 1:开启,用于开启http2功能;默认值为0 + - **ForwardPort** (int) - 重定向端口,取值范围[0-65535];默认值为0,代表关闭;仅HTTP协议支持开启重定向功能 + - **Method** (str) - VServer负载均衡模式,枚举值:Roundrobin -> 轮询;Source -> 源地址;ConsistentHash -> 一致性哈希;SourcePort -> 源地址(计算端口);ConsistentHashPort -> 一致性哈希(计算端口); WeightRoundrobin -> 加权轮询; Leastconn -> 最小连接数;Backup -> 主备模式。ConsistentHash,SourcePort,ConsistentHashPort 只在报文转发中使用;Leastconn只在请求代理中使用;Roundrobin、Source和WeightRoundrobin,Backup在请求代理和报文转发中使用。默认为:"Roundrobin" + - **MonitorType** (str) - 健康检查类型,枚举值:Port -> 端口检查;Path -> 路径检查;Ping -> Ping探测,Customize -> UDP检查请求代理型默认值为Port,其中TCP协议仅支持Port,其他协议支持Port和Path;报文转发型TCP协议仅支持Port,UDP协议支持Ping、Port和Customize,默认值为Ping + - **Path** (str) - MonitorType 为 Path 时指定健康检查发送请求时的路径,默认为 / + - **PersistenceInfo** (str) - 根据PersistenceType确定: None或ServerInsert, 此字段无意义; UserDefined, 则此字段传入用户自定义会话保持String. 若无此字段则不做修改 + - **PersistenceType** (str) - VServer会话保持模式,若无此字段则不做修改。枚举值:None:关闭;ServerInsert:自动生成KEY;UserDefined:用户自定义KEY。 + - **RequestMsg** (str) - 根据MonitorType确认; 当MonitorType为Customize时,此字段有意义,代表UDP检查发出的请求报文 + - **ResponseMsg** (str) - 根据MonitorType确认; 当MonitorType为Customize时,此字段有意义,代表UDP检查请求应收到的响应报文 + - **SecurityPolicyId** (str) - 安全策略组ID + - **VServerName** (str) - VServer实例名称,若无此字段则不做修改 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateVServerAttributeRequestSchema().dumps(d) + + resp = self.invoke("UpdateVServerAttribute", d, **kwargs) + return apis.UpdateVServerAttributeResponseSchema().loads(resp) diff --git a/ucloud/services/ulb/schemas/apis.py b/ucloud/services/ulb/schemas/apis.py index edf0c425..974c9505 100644 --- a/ucloud/services/ulb/schemas/apis.py +++ b/ucloud/services/ulb/schemas/apis.py @@ -3,52 +3,124 @@ from ucloud.core.typesystem import schema, fields from ucloud.services.ulb.schemas import models - """ ULB API Schema """ +""" +API: AddSSLBinding + +ALB的监听器绑定SSL证书 +""" + + +class AddSSLBindingRequestSchema(schema.RequestSchema): + """AddSSLBinding - ALB的监听器绑定SSL证书""" + + fields = { + "ListenerId": fields.Str(required=True, dump_to="ListenerId"), + "LoadBalancerId": fields.Str(required=True, dump_to="LoadBalancerId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SSLIds": fields.List(fields.Str()), + } + + +class AddSSLBindingResponseSchema(schema.ResponseSchema): + """AddSSLBinding - ALB的监听器绑定SSL证书""" + + fields = {} + + +""" +API: AddTargets + +给应用型负载均衡监听器添加后端服务节点 +""" + + +class AddTargetsParamTargetsSchema(schema.RequestSchema): + """AddTargetsParamTargets -""" + + fields = { + "Enabled": fields.Bool(required=False, dump_to="Enabled"), + "IsBackup": fields.Bool(required=False, dump_to="IsBackup"), + "Port": fields.Int(required=False, dump_to="Port"), + "ResourceIP": fields.Str(required=False, dump_to="ResourceIP"), + "ResourceId": fields.Str(required=False, dump_to="ResourceId"), + "ResourceType": fields.Str(required=False, dump_to="ResourceType"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + "Weight": fields.Int(required=False, dump_to="Weight"), + } + + +class AddTargetsRequestSchema(schema.RequestSchema): + """AddTargets - 给应用型负载均衡监听器添加后端服务节点""" + + fields = { + "ListenerId": fields.Str(required=True, dump_to="ListenerId"), + "LoadBalancerId": fields.Str(required=True, dump_to="LoadBalancerId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Targets": fields.List(AddTargetsParamTargetsSchema()), + } + + +class AddTargetsResponseSchema(schema.ResponseSchema): + """AddTargets - 给应用型负载均衡监听器添加后端服务节点""" + + fields = { + "Targets": fields.List( + models.TargetSetSchema(), required=False, load_from="Targets" + ), + } + + """ API: AllocateBackend -添加ULB后端资源实例 +添加CLB后端资源实例 """ class AllocateBackendRequestSchema(schema.RequestSchema): - """ AllocateBackend - 添加ULB后端资源实例 - """ + """AllocateBackend - 添加CLB后端资源实例""" fields = { "Enabled": fields.Int(required=False, dump_to="Enabled"), + "IsBackup": fields.Int(required=False, dump_to="IsBackup"), "Port": fields.Int(required=False, dump_to="Port"), "ProjectId": fields.Str(required=True, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + "ResourceIP": fields.Str(required=False, dump_to="ResourceIP"), + "ResourceId": fields.Str(required=False, dump_to="ResourceId"), "ResourceType": fields.Str(required=True, dump_to="ResourceType"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), "ULBId": fields.Str(required=True, dump_to="ULBId"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), "VServerId": fields.Str(required=True, dump_to="VServerId"), "Weight": fields.Int(required=False, dump_to="Weight"), } class AllocateBackendResponseSchema(schema.ResponseSchema): - """ AllocateBackend - 添加ULB后端资源实例 - """ + """AllocateBackend - 添加CLB后端资源实例""" - fields = {"BackendId": fields.Str(required=False, load_from="BackendId")} + fields = { + "BackendId": fields.Str(required=False, load_from="BackendId"), + } """ API: AllocateBackendBatch -批量添加VServer后端节点 + """ class AllocateBackendBatchRequestSchema(schema.RequestSchema): - """ AllocateBackendBatch - 批量添加VServer后端节点 - """ + """AllocateBackendBatch -""" fields = { "ApiVersion": fields.Int(required=False, dump_to="ApiVersion"), @@ -61,26 +133,24 @@ class AllocateBackendBatchRequestSchema(schema.RequestSchema): class AllocateBackendBatchResponseSchema(schema.ResponseSchema): - """ AllocateBackendBatch - 批量添加VServer后端节点 - """ + """AllocateBackendBatch -""" fields = { "BackendSet": fields.List( models.BackendSetSchema(), required=False, load_from="BackendSet" - ) + ), } """ API: BindSSL -将SSL证书绑定到VServer +将SSL证书绑定到传统型负载均衡VServer """ class BindSSLRequestSchema(schema.RequestSchema): - """ BindSSL - 将SSL证书绑定到VServer - """ + """BindSSL - 将SSL证书绑定到传统型负载均衡VServer""" fields = { "ProjectId": fields.Str(required=True, dump_to="ProjectId"), @@ -91,488 +161,1660 @@ class BindSSLRequestSchema(schema.RequestSchema): } -class BindSSLResponseSchema(schema.ResponseSchema): - """ BindSSL - 将SSL证书绑定到VServer - """ +class BindSSLResponseSchema(schema.ResponseSchema): + """BindSSL - 将SSL证书绑定到传统型负载均衡VServer""" + + fields = {} + + +""" +API: CreateListener + +创建一个应用型负载均衡的监听器 +""" + + +class CreateListenerParamHealthCheckConfigSchema(schema.RequestSchema): + """CreateListenerParamHealthCheckConfig -""" + + fields = { + "Domain": fields.Str(required=False, dump_to="Domain"), + "Enabled": fields.Bool(required=False, dump_to="Enabled"), + "Method": fields.Str(required=False, dump_to="Method"), + "Path": fields.Str(required=False, dump_to="Path"), + "ResponseCode": fields.Str(required=False, dump_to="ResponseCode"), + "Type": fields.Str(required=False, dump_to="Type"), + } + + +class CreateListenerParamStickinessConfigSchema(schema.RequestSchema): + """CreateListenerParamStickinessConfig -""" + + fields = { + "CookieName": fields.Str(required=False, dump_to="CookieName"), + "Enabled": fields.Bool(required=False, dump_to="Enabled"), + "Type": fields.Str(required=False, dump_to="Type"), + } + + +class CreateListenerRequestSchema(schema.RequestSchema): + """CreateListener - 创建一个应用型负载均衡的监听器""" + + fields = { + "Certificates": fields.List(fields.Str()), + "CompressionEnabled": fields.Bool( + required=False, dump_to="CompressionEnabled" + ), + "HTTP2Enabled": fields.Bool(required=False, dump_to="HTTP2Enabled"), + "HealthCheckConfig": CreateListenerParamHealthCheckConfigSchema( + required=False, dump_to="HealthCheckConfig" + ), + "IdleTimeout": fields.Int(required=False, dump_to="IdleTimeout"), + "ListenerPort": fields.Int(required=False, dump_to="ListenerPort"), + "ListenerProtocol": fields.Str( + required=False, dump_to="ListenerProtocol" + ), + "LoadBalancerId": fields.Str(required=True, dump_to="LoadBalancerId"), + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "RedirectEnabled": fields.Bool( + required=False, dump_to="RedirectEnabled" + ), + "RedirectPort": fields.Int(required=False, dump_to="RedirectPort"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "Scheduler": fields.Str(required=False, dump_to="Scheduler"), + "SecurityPolicyId": fields.Str( + required=False, dump_to="SecurityPolicyId" + ), + "StickinessConfig": CreateListenerParamStickinessConfigSchema( + required=False, dump_to="StickinessConfig" + ), + } + + +class CreateListenerResponseSchema(schema.ResponseSchema): + """CreateListener - 创建一个应用型负载均衡的监听器""" + + fields = { + "ListenerId": fields.Str(required=True, load_from="ListenerId"), + } + + +""" +API: CreateLoadBalancer + +创建一个应用型负载均衡实例 +""" + + +class CreateLoadBalancerParamSecGroupsSchema(schema.RequestSchema): + """CreateLoadBalancerParamSecGroups -""" + + fields = { + "Priority": fields.Int(required=False, dump_to="Priority"), + "SecGroupId": fields.Str(required=False, dump_to="SecGroupId"), + } + + +class CreateLoadBalancerParamLabelInfosSchema(schema.RequestSchema): + """CreateLoadBalancerParamLabelInfos -""" + + fields = { + "Key": fields.Str(required=False, dump_to="Key"), + "Value": fields.Str(required=False, dump_to="Value"), + } + + +class CreateLoadBalancerRequestSchema(schema.RequestSchema): + """CreateLoadBalancer - 创建一个应用型负载均衡实例""" + + fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "IPVersion": fields.Str(required=False, dump_to="IPVersion"), + "LabelInfos": fields.List(CreateLoadBalancerParamLabelInfosSchema()), + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "SecGroups": fields.List(CreateLoadBalancerParamSecGroupsSchema()), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "Type": fields.Str(required=False, dump_to="Type"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + } + + +class CreateLoadBalancerResponseSchema(schema.ResponseSchema): + """CreateLoadBalancer - 创建一个应用型负载均衡实例""" + + fields = { + "LoadBalancerId": fields.Str( + required=False, load_from="LoadBalancerId" + ), + } + + +""" +API: CreatePolicy + +传统型负载均衡创建VServer内容转发策略 +""" + + +class CreatePolicyRequestSchema(schema.RequestSchema): + """CreatePolicy - 传统型负载均衡创建VServer内容转发策略""" + + fields = { + "BackendId": fields.List(fields.Str()), + "DomainMatchMode": fields.Str( + required=False, dump_to="DomainMatchMode" + ), + "Match": fields.Str(required=True, dump_to="Match"), + "PolicyPriority": fields.Int(required=False, dump_to="PolicyPriority"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Type": fields.Str(required=False, dump_to="Type"), + "ULBId": fields.Str(required=True, dump_to="ULBId"), + "VServerId": fields.Str(required=True, dump_to="VServerId"), + } + + +class CreatePolicyResponseSchema(schema.ResponseSchema): + """CreatePolicy - 传统型负载均衡创建VServer内容转发策略""" + + fields = { + "PolicyId": fields.Str(required=False, load_from="PolicyId"), + } + + +""" +API: CreateRule + +给应用型负载均衡监听器创建一条转发规则 +""" + + +class CreateRuleParamRuleConditionsHostConfigSchema(schema.RequestSchema): + """CreateRuleParamRuleConditionsHostConfig -""" + + fields = { + "MatchMode": fields.Str(required=False, dump_to="MatchMode"), + "Values": fields.List(fields.Str()), + } + + +class CreateRuleParamRuleActionsForwardConfigTargetsSchema( + schema.RequestSchema +): + """CreateRuleParamRuleActionsForwardConfigTargets -""" + + fields = { + "Id": fields.Str(required=False, dump_to="Id"), + "Weight": fields.Int(required=False, dump_to="Weight"), + } + + +class CreateRuleParamRuleActionsInsertHeaderConfigSchema(schema.RequestSchema): + """CreateRuleParamRuleActionsInsertHeaderConfig -""" + + fields = { + "Key": fields.Str(required=False, dump_to="Key"), + "Value": fields.Str(required=False, dump_to="Value"), + "ValueType": fields.Str(required=False, dump_to="ValueType"), + } + + +class CreateRuleParamRuleActionsRemoveHeaderConfigSchema(schema.RequestSchema): + """CreateRuleParamRuleActionsRemoveHeaderConfig -""" + + fields = { + "Key": fields.Str(required=False, dump_to="Key"), + } + + +class CreateRuleParamRuleActionsForwardConfigSchema(schema.RequestSchema): + """CreateRuleParamRuleActionsForwardConfig -""" + + fields = { + "Targets": fields.List( + CreateRuleParamRuleActionsForwardConfigTargetsSchema() + ), + } + + +class CreateRuleParamRuleActionsCorsConfigSchema(schema.RequestSchema): + """CreateRuleParamRuleActionsCorsConfig -""" + + fields = { + "AllowCredentials": fields.Str( + required=False, dump_to="AllowCredentials" + ), + "AllowHeaders": fields.List(fields.Str()), + "AllowMethods": fields.List(fields.Str()), + "AllowOrigin": fields.List(fields.Str()), + "ExposeHeaders": fields.List(fields.Str()), + "MaxAge": fields.Int(required=False, dump_to="MaxAge"), + } + + +class CreateRuleParamRuleActionsFixedResponseConfigSchema(schema.RequestSchema): + """CreateRuleParamRuleActionsFixedResponseConfig -""" + + fields = { + "Content": fields.Str(required=False, dump_to="Content"), + "HttpCode": fields.Int(required=False, dump_to="HttpCode"), + } + + +class CreateRuleParamRuleActionsSchema(schema.RequestSchema): + """CreateRuleParamRuleActions -""" + + fields = { + "CorsConfig": CreateRuleParamRuleActionsCorsConfigSchema( + required=False, dump_to="CorsConfig" + ), + "FixedResponseConfig": CreateRuleParamRuleActionsFixedResponseConfigSchema( + required=False, dump_to="FixedResponseConfig" + ), + "ForwardConfig": CreateRuleParamRuleActionsForwardConfigSchema( + required=False, dump_to="ForwardConfig" + ), + "InsertHeaderConfig": CreateRuleParamRuleActionsInsertHeaderConfigSchema( + required=False, dump_to="InsertHeaderConfig" + ), + "Order": fields.Int(required=False, dump_to="Order"), + "RemoveHeaderConfig": CreateRuleParamRuleActionsRemoveHeaderConfigSchema( + required=False, dump_to="RemoveHeaderConfig" + ), + "Type": fields.Str(required=True, dump_to="Type"), + } + + +class CreateRuleParamRuleConditionsPathConfigSchema(schema.RequestSchema): + """CreateRuleParamRuleConditionsPathConfig -""" + + fields = { + "Values": fields.List(fields.Str()), + } + + +class CreateRuleParamRuleConditionsSchema(schema.RequestSchema): + """CreateRuleParamRuleConditions -""" + + fields = { + "HostConfig": CreateRuleParamRuleConditionsHostConfigSchema( + required=False, dump_to="HostConfig" + ), + "PathConfig": CreateRuleParamRuleConditionsPathConfigSchema( + required=False, dump_to="PathConfig" + ), + "Type": fields.Str(required=True, dump_to="Type"), + } + + +class CreateRuleRequestSchema(schema.RequestSchema): + """CreateRule - 给应用型负载均衡监听器创建一条转发规则""" + + fields = { + "ListenerId": fields.Str(required=True, dump_to="ListenerId"), + "LoadBalancerId": fields.Str(required=True, dump_to="LoadBalancerId"), + "Pass": fields.Bool(required=False, dump_to="Pass"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "RuleActions": fields.List(CreateRuleParamRuleActionsSchema()), + "RuleConditions": fields.List(CreateRuleParamRuleConditionsSchema()), + } + + +class CreateRuleResponseSchema(schema.ResponseSchema): + """CreateRule - 给应用型负载均衡监听器创建一条转发规则""" + + fields = { + "RuleId": fields.Str(required=True, load_from="RuleId"), + } + + +""" +API: CreateSSL + +创建SSL证书,可以把整个 Pem 证书内容传过来,或者把证书、私钥、CA证书分别传过来 +""" + + +class CreateSSLRequestSchema(schema.RequestSchema): + """CreateSSL - 创建SSL证书,可以把整个 Pem 证书内容传过来,或者把证书、私钥、CA证书分别传过来""" + + fields = { + "CaCert": fields.Str(required=False, dump_to="CaCert"), + "PrivateKey": fields.Str(required=False, dump_to="PrivateKey"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SSLContent": fields.Str(required=False, dump_to="SSLContent"), + "SSLName": fields.Str(required=True, dump_to="SSLName"), + "SSLType": fields.Str(required=False, dump_to="SSLType"), + "USSLId": fields.Str(required=False, dump_to="USSLId"), + "UserCert": fields.Str(required=False, dump_to="UserCert"), + } + + +class CreateSSLResponseSchema(schema.ResponseSchema): + """CreateSSL - 创建SSL证书,可以把整个 Pem 证书内容传过来,或者把证书、私钥、CA证书分别传过来""" + + fields = { + "SSLId": fields.Str(required=False, load_from="SSLId"), + } + + +""" +API: CreateSecurityPolicy + +创建安全策略 +""" + + +class CreateSecurityPolicyRequestSchema(schema.RequestSchema): + """CreateSecurityPolicy - 创建安全策略""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SSLCiphers": fields.List(fields.Str()), + "SecurityPolicyName": fields.Str( + required=True, dump_to="SecurityPolicyName" + ), + "TLSVersion": fields.Str(required=True, dump_to="TLSVersion"), + } + + +class CreateSecurityPolicyResponseSchema(schema.ResponseSchema): + """CreateSecurityPolicy - 创建安全策略""" + + fields = { + "SecurityPolicyId": fields.Str( + required=True, load_from="SecurityPolicyId" + ), + } + + +""" +API: CreateULB + +创建传统型负载均衡负载均衡实例,可以选择内网或者外网 +""" + + +class CreateULBRequestSchema(schema.RequestSchema): + """CreateULB - 创建传统型负载均衡负载均衡实例,可以选择内网或者外网""" + + fields = { + "BusinessId": fields.Str(required=False, dump_to="BusinessId"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "FirewallId": fields.Str(required=False, dump_to="FirewallId"), + "IPVersion": fields.Str( + required=False, dump_to="IPVersion" + ), # Deprecated, will be removed at 1.0 + "InnerMode": fields.Str(required=False, dump_to="InnerMode"), + "ListenType": fields.Str(required=False, dump_to="ListenType"), + "OuterMode": fields.Str(required=False, dump_to="OuterMode"), + "PrivateIp": fields.Str( + required=False, dump_to="PrivateIp" + ), # Deprecated, will be removed at 1.0 + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "ULBName": fields.Str(required=False, dump_to="ULBName"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + } + + +class CreateULBResponseSchema(schema.ResponseSchema): + """CreateULB - 创建传统型负载均衡负载均衡实例,可以选择内网或者外网""" + + fields = { + "IPv6AddressId": fields.Str(required=False, load_from="IPv6AddressId"), + "ULBId": fields.Str(required=False, load_from="ULBId"), + } + + +""" +API: CreateVServer + +创建CLB的VServer实例,定义监听的协议和端口以及负载均衡算法 +""" + + +class CreateVServerRequestSchema(schema.RequestSchema): + """CreateVServer - 创建CLB的VServer实例,定义监听的协议和端口以及负载均衡算法""" + + fields = { + "ClientTimeout": fields.Int(required=False, dump_to="ClientTimeout"), + "Domain": fields.Str(required=False, dump_to="Domain"), + "EnableCompression": fields.Int( + required=False, dump_to="EnableCompression" + ), + "EnableHTTP2": fields.Int(required=False, dump_to="EnableHTTP2"), + "ForwardPort": fields.Int(required=False, dump_to="ForwardPort"), + "FrontendPort": fields.Int(required=False, dump_to="FrontendPort"), + "ListenType": fields.Str(required=False, dump_to="ListenType"), + "Method": fields.Str(required=False, dump_to="Method"), + "MonitorType": fields.Str(required=False, dump_to="MonitorType"), + "Path": fields.Str(required=False, dump_to="Path"), + "PersistenceInfo": fields.Str( + required=False, dump_to="PersistenceInfo" + ), + "PersistenceType": fields.Str( + required=False, dump_to="PersistenceType" + ), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Protocol": fields.Str(required=False, dump_to="Protocol"), + "Region": fields.Str(required=True, dump_to="Region"), + "RequestMsg": fields.Str(required=False, dump_to="RequestMsg"), + "ResponseMsg": fields.Str(required=False, dump_to="ResponseMsg"), + "SecurityPolicyId": fields.Str( + required=False, dump_to="SecurityPolicyId" + ), + "ULBId": fields.Str(required=True, dump_to="ULBId"), + "VServerName": fields.Str(required=False, dump_to="VServerName"), + } + + +class CreateVServerResponseSchema(schema.ResponseSchema): + """CreateVServer - 创建CLB的VServer实例,定义监听的协议和端口以及负载均衡算法""" + + fields = { + "VServerId": fields.Str(required=False, load_from="VServerId"), + } + + +""" +API: DeleteListener + +删除一个应用型负载均衡监听器 +""" + + +class DeleteListenerRequestSchema(schema.RequestSchema): + """DeleteListener - 删除一个应用型负载均衡监听器""" + + fields = { + "ListenerId": fields.Str(required=True, dump_to="ListenerId"), + "LoadBalancerId": fields.Str(required=True, dump_to="LoadBalancerId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "RelatedRedirectDisabled": fields.Bool( + required=True, dump_to="RelatedRedirectDisabled" + ), + } + + +class DeleteListenerResponseSchema(schema.ResponseSchema): + """DeleteListener - 删除一个应用型负载均衡监听器""" + + fields = {} + + +""" +API: DeleteLoadBalancer + +删除一个应用型负载均衡实例 +""" + + +class DeleteLoadBalancerRequestSchema(schema.RequestSchema): + """DeleteLoadBalancer - 删除一个应用型负载均衡实例""" + + fields = { + "LoadBalancerId": fields.Str(required=True, dump_to="LoadBalancerId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DeleteLoadBalancerResponseSchema(schema.ResponseSchema): + """DeleteLoadBalancer - 删除一个应用型负载均衡实例""" + + fields = {} + + +""" +API: DeletePolicy + +删除传统型负载均衡的内容转发策略 +""" + + +class DeletePolicyRequestSchema(schema.RequestSchema): + """DeletePolicy - 删除传统型负载均衡的内容转发策略""" + + fields = { + "GroupId": fields.Str( + required=False, dump_to="GroupId" + ), # Deprecated, will be removed at 1.0 + "PolicyId": fields.Str(required=True, dump_to="PolicyId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "VServerId": fields.Str(required=False, dump_to="VServerId"), + } + + +class DeletePolicyResponseSchema(schema.ResponseSchema): + """DeletePolicy - 删除传统型负载均衡的内容转发策略""" + + fields = {} + + +""" +API: DeleteRule + +删除应用型负载均衡监听器的一条转发规则 +""" + + +class DeleteRuleRequestSchema(schema.RequestSchema): + """DeleteRule - 删除应用型负载均衡监听器的一条转发规则""" + + fields = { + "ListenerId": fields.Str(required=True, dump_to="ListenerId"), + "LoadBalancerId": fields.Str(required=True, dump_to="LoadBalancerId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "RuleId": fields.Str(required=True, dump_to="RuleId"), + } + + +class DeleteRuleResponseSchema(schema.ResponseSchema): + """DeleteRule - 删除应用型负载均衡监听器的一条转发规则""" + + fields = {} + + +""" +API: DeleteSSL + +删除SSL证书 +""" + + +class DeleteSSLRequestSchema(schema.RequestSchema): + """DeleteSSL - 删除SSL证书""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SSLId": fields.Str(required=True, dump_to="SSLId"), + } + + +class DeleteSSLResponseSchema(schema.ResponseSchema): + """DeleteSSL - 删除SSL证书""" + + fields = {} + + +""" +API: DeleteSSLBinding + +删除监听器绑定的扩展证书 +""" + + +class DeleteSSLBindingRequestSchema(schema.RequestSchema): + """DeleteSSLBinding - 删除监听器绑定的扩展证书""" + + fields = { + "ListenerId": fields.Str(required=True, dump_to="ListenerId"), + "LoadBalancerId": fields.Str(required=True, dump_to="LoadBalancerId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SSLIds": fields.List(fields.Str()), + } + + +class DeleteSSLBindingResponseSchema(schema.ResponseSchema): + """DeleteSSLBinding - 删除监听器绑定的扩展证书""" + + fields = {} + + +""" +API: DeleteSecurityPolicy + +删除安全策略 +""" + + +class DeleteSecurityPolicyRequestSchema(schema.RequestSchema): + """DeleteSecurityPolicy - 删除安全策略""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SecurityPolicyId": fields.Str( + required=True, dump_to="SecurityPolicyId" + ), + } + + +class DeleteSecurityPolicyResponseSchema(schema.ResponseSchema): + """DeleteSecurityPolicy - 删除安全策略""" + + fields = {} + + +""" +API: DeleteULB + +删除传统型负载均衡实例 +""" + + +class DeleteULBRequestSchema(schema.RequestSchema): + """DeleteULB - 删除传统型负载均衡实例""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ReleaseEip": fields.Bool(required=False, dump_to="ReleaseEip"), + "ULBId": fields.Str(required=True, dump_to="ULBId"), + } + + +class DeleteULBResponseSchema(schema.ResponseSchema): + """DeleteULB - 删除传统型负载均衡实例""" + + fields = {} + + +""" +API: DeleteVServer + +删除CLB的VServer实例 +""" + + +class DeleteVServerRequestSchema(schema.RequestSchema): + """DeleteVServer - 删除CLB的VServer实例""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ULBId": fields.Str(required=True, dump_to="ULBId"), + "VServerId": fields.Str(required=True, dump_to="VServerId"), + } + + +class DeleteVServerResponseSchema(schema.ResponseSchema): + """DeleteVServer - 删除CLB的VServer实例""" + + fields = {} + + +""" +API: DescribeListeners + +描述一个指定的监听器或者一个应用型负载均衡实例下的所有监听器 +""" + + +class DescribeListenersRequestSchema(schema.RequestSchema): + """DescribeListeners - 描述一个指定的监听器或者一个应用型负载均衡实例下的所有监听器""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "ListenerId": fields.Str(required=False, dump_to="ListenerId"), + "LoadBalancerId": fields.Str(required=False, dump_to="LoadBalancerId"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DescribeListenersResponseSchema(schema.ResponseSchema): + """DescribeListeners - 描述一个指定的监听器或者一个应用型负载均衡实例下的所有监听器""" + + fields = { + "Listeners": fields.List( + models.ListenerSchema(), required=False, load_from="Listeners" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeLoadBalancers + +描述特定条件下的应用型负载均衡实例或者全部的应用型负载均衡实例 +""" + + +class DescribeLoadBalancersRequestSchema(schema.RequestSchema): + """DescribeLoadBalancers - 描述特定条件下的应用型负载均衡实例或者全部的应用型负载均衡实例""" + + fields = { + "Limit": fields.Str(required=False, dump_to="Limit"), + "LoadBalancerIds": fields.List(fields.Str()), + "Offset": fields.Str(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ShowDetail": fields.Bool(required=False, dump_to="ShowDetail"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "Type": fields.Str(required=False, dump_to="Type"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + } + + +class DescribeLoadBalancersResponseSchema(schema.ResponseSchema): + """DescribeLoadBalancers - 描述特定条件下的应用型负载均衡实例或者全部的应用型负载均衡实例""" + + fields = { + "LoadBalancers": fields.List( + models.LoadBalancerSchema(), + required=True, + load_from="LoadBalancers", + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeRules + +描述一条指定的转发规则或者一个应用型负载均衡监听器下的所有转发规则 +""" + + +class DescribeRulesRequestSchema(schema.RequestSchema): + """DescribeRules - 描述一条指定的转发规则或者一个应用型负载均衡监听器下的所有转发规则""" + + fields = { + "ListenerId": fields.Str(required=True, dump_to="ListenerId"), + "LoadBalancerId": fields.Str(required=True, dump_to="LoadBalancerId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "RuleId": fields.Str(required=False, dump_to="RuleId"), + } + + +class DescribeRulesResponseSchema(schema.ResponseSchema): + """DescribeRules - 描述一条指定的转发规则或者一个应用型负载均衡监听器下的所有转发规则""" + + fields = { + "Rules": fields.List( + models.RuleSchema(), required=True, load_from="Rules" + ), + } + + +""" +API: DescribeSSL + +获取SSL证书信息,仅能获取SSL证书与传统型负载均衡监听器的绑定关系 +""" + + +class DescribeSSLRequestSchema(schema.RequestSchema): + """DescribeSSL - 获取SSL证书信息,仅能获取SSL证书与传统型负载均衡监听器的绑定关系""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SSLId": fields.Str(required=False, dump_to="SSLId"), + } + + +class DescribeSSLResponseSchema(schema.ResponseSchema): + """DescribeSSL - 获取SSL证书信息,仅能获取SSL证书与传统型负载均衡监听器的绑定关系""" + + fields = { + "DataSet": fields.List( + models.ULBSSLSetSchema(), required=False, load_from="DataSet" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeSSLV2 + +获取SSL证书信息,该接口可以同时获取SSL与传统型和应用型负载均衡监听器的绑定关系 +""" + + +class DescribeSSLV2RequestSchema(schema.RequestSchema): + """DescribeSSLV2 - 获取SSL证书信息,该接口可以同时获取SSL与传统型和应用型负载均衡监听器的绑定关系""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SSLId": fields.Str(required=False, dump_to="SSLId"), + } + + +class DescribeSSLV2ResponseSchema(schema.ResponseSchema): + """DescribeSSLV2 - 获取SSL证书信息,该接口可以同时获取SSL与传统型和应用型负载均衡监听器的绑定关系""" + + fields = { + "DataSet": fields.List( + models.SSLInfoSchema(), required=False, load_from="DataSet" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeSecurityPolicies + +获取安全策略的信息,绑定关系仅能获取安全策略与传统型负载均衡监听器的绑定关系 +""" + + +class DescribeSecurityPoliciesRequestSchema(schema.RequestSchema): + """DescribeSecurityPolicies - 获取安全策略的信息,绑定关系仅能获取安全策略与传统型负载均衡监听器的绑定关系""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SecurityPolicyId": fields.Str( + required=False, dump_to="SecurityPolicyId" + ), + } + + +class DescribeSecurityPoliciesResponseSchema(schema.ResponseSchema): + """DescribeSecurityPolicies - 获取安全策略的信息,绑定关系仅能获取安全策略与传统型负载均衡监听器的绑定关系""" + + fields = { + "DataSet": fields.List( + models.SecurityPolicySchema(), required=False, load_from="DataSet" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeSecurityPoliciesV2 + +获取安全策略的信息,可以同时获取安全策略与传统型和应用性负载均衡监听器的绑定关系 +""" + + +class DescribeSecurityPoliciesV2RequestSchema(schema.RequestSchema): + """DescribeSecurityPoliciesV2 - 获取安全策略的信息,可以同时获取安全策略与传统型和应用性负载均衡监听器的绑定关系""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SecurityPolicyId": fields.Str( + required=False, dump_to="SecurityPolicyId" + ), + } + + +class DescribeSecurityPoliciesV2ResponseSchema(schema.ResponseSchema): + """DescribeSecurityPoliciesV2 - 获取安全策略的信息,可以同时获取安全策略与传统型和应用性负载均衡监听器的绑定关系""" + + fields = { + "DataSet": fields.List( + models.SecurityPolicyInfoSchema(), + required=False, + load_from="DataSet", + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeSupportCiphers + +返回安全策略所有支持的加密套件 +""" + + +class DescribeSupportCiphersRequestSchema(schema.RequestSchema): + """DescribeSupportCiphers - 返回安全策略所有支持的加密套件""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DescribeSupportCiphersResponseSchema(schema.ResponseSchema): + """DescribeSupportCiphers - 返回安全策略所有支持的加密套件""" + + fields = { + "DataSet": fields.List( + models.TLSAndCiphersSchema(), required=False, load_from="DataSet" + ), + } + + +""" +API: DescribeULB + +获取CLB详细信息 +""" + + +class DescribeULBRequestSchema(schema.RequestSchema): + """DescribeULB - 获取CLB详细信息""" + + fields = { + "BusinessId": fields.Str(required=False, dump_to="BusinessId"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "ULBId": fields.Str(required=False, dump_to="ULBId"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + } + + +class DescribeULBResponseSchema(schema.ResponseSchema): + """DescribeULB - 获取CLB详细信息""" + + fields = { + "DataSet": fields.List( + models.ULBSetSchema(), required=False, load_from="DataSet" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeULBSimple + +获取CLB信息 +""" + + +class DescribeULBSimpleRequestSchema(schema.RequestSchema): + """DescribeULBSimple - 获取CLB信息""" + + fields = { + "BusinessId": fields.Str(required=False, dump_to="BusinessId"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "ULBId": fields.Str(required=False, dump_to="ULBId"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + } + + +class DescribeULBSimpleResponseSchema(schema.ResponseSchema): + """DescribeULBSimple - 获取CLB信息""" + + fields = { + "DataSet": fields.List( + models.ULBSimpleSetSchema(), required=True, load_from="DataSet" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeVServer + +获取CLB下的VServer的详细信息 +""" + + +class DescribeVServerRequestSchema(schema.RequestSchema): + """DescribeVServer - 获取CLB下的VServer的详细信息""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ULBId": fields.Str(required=False, dump_to="ULBId"), + "VServerId": fields.Str(required=False, dump_to="VServerId"), + } + + +class DescribeVServerResponseSchema(schema.ResponseSchema): + """DescribeVServer - 获取CLB下的VServer的详细信息""" + + fields = { + "DataSet": fields.List( + models.ULBVServerSetSchema(), required=False, load_from="DataSet" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: ReleaseBackend + +从CLB的VServer释放后端资源实例 +""" + + +class ReleaseBackendRequestSchema(schema.RequestSchema): + """ReleaseBackend - 从CLB的VServer释放后端资源实例""" + + fields = { + "BackendId": fields.Str(required=True, dump_to="BackendId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ULBId": fields.Str(required=True, dump_to="ULBId"), + } + + +class ReleaseBackendResponseSchema(schema.ResponseSchema): + """ReleaseBackend - 从CLB的VServer释放后端资源实例""" + + fields = {} + + +""" +API: RemoveTargets + +从应用型负载均衡监听器删除后端服务节点 +""" + + +class RemoveTargetsRequestSchema(schema.RequestSchema): + """RemoveTargets - 从应用型负载均衡监听器删除后端服务节点""" + + fields = { + "Ids": fields.List(fields.Str()), + "ListenerId": fields.Str(required=True, dump_to="ListenerId"), + "LoadBalancerId": fields.Str(required=True, dump_to="LoadBalancerId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class RemoveTargetsResponseSchema(schema.ResponseSchema): + """RemoveTargets - 从应用型负载均衡监听器删除后端服务节点""" + + fields = {} + + +""" +API: UnBindSecurityPolicy + +批量解绑安全策略,会同时解绑与传统型和应用型负载均衡监听器的绑定关系 +""" + + +class UnBindSecurityPolicyRequestSchema(schema.RequestSchema): + """UnBindSecurityPolicy - 批量解绑安全策略,会同时解绑与传统型和应用型负载均衡监听器的绑定关系""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SecurityPolicyId": fields.Str( + required=True, dump_to="SecurityPolicyId" + ), + } + + +class UnBindSecurityPolicyResponseSchema(schema.ResponseSchema): + """UnBindSecurityPolicy - 批量解绑安全策略,会同时解绑与传统型和应用型负载均衡监听器的绑定关系""" fields = {} """ -API: CreatePolicy +API: UnbindSSL -创建VServer内容转发策略 +从CLB下的VServer解绑SSL证书 """ -class CreatePolicyRequestSchema(schema.RequestSchema): - """ CreatePolicy - 创建VServer内容转发策略 - """ +class UnbindSSLRequestSchema(schema.RequestSchema): + """UnbindSSL - 从CLB下的VServer解绑SSL证书""" fields = { - "BackendId": fields.List(fields.Str()), - "Match": fields.Str(required=True, dump_to="Match"), "ProjectId": fields.Str(required=True, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "Type": fields.Str(required=False, dump_to="Type"), + "SSLId": fields.Str(required=True, dump_to="SSLId"), "ULBId": fields.Str(required=True, dump_to="ULBId"), "VServerId": fields.Str(required=True, dump_to="VServerId"), } -class CreatePolicyResponseSchema(schema.ResponseSchema): - """ CreatePolicy - 创建VServer内容转发策略 - """ +class UnbindSSLResponseSchema(schema.ResponseSchema): + """UnbindSSL - 从CLB下的VServer解绑SSL证书""" - fields = {"PolicyId": fields.Str(required=False, load_from="PolicyId")} + fields = {} """ -API: CreateSSL +API: UpdateBackendAttribute -创建SSL证书,可以把整个 Pem 证书内容传过来,或者把证书、私钥、CA证书分别传过来 +更新CLB后端资源实例(服务节点)属性 """ -class CreateSSLRequestSchema(schema.RequestSchema): - """ CreateSSL - 创建SSL证书,可以把整个 Pem 证书内容传过来,或者把证书、私钥、CA证书分别传过来 - """ +class UpdateBackendAttributeRequestSchema(schema.RequestSchema): + """UpdateBackendAttribute - 更新CLB后端资源实例(服务节点)属性""" fields = { - "CaCert": fields.Str(required=False, dump_to="CaCert"), - "PrivateKey": fields.Str(required=False, dump_to="PrivateKey"), + "BackendId": fields.Str(required=True, dump_to="BackendId"), + "Enabled": fields.Int(required=False, dump_to="Enabled"), + "IsBackup": fields.Int(required=False, dump_to="IsBackup"), + "Port": fields.Int(required=False, dump_to="Port"), "ProjectId": fields.Str(required=True, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "SSLContent": fields.Str(required=False, dump_to="SSLContent"), - "SSLName": fields.Str(required=True, dump_to="SSLName"), - "SSLType": fields.Str(required=False, dump_to="SSLType"), - "UserCert": fields.Str(required=False, dump_to="UserCert"), + "ULBId": fields.Str(required=True, dump_to="ULBId"), + "Weight": fields.Int(required=False, dump_to="Weight"), } -class CreateSSLResponseSchema(schema.ResponseSchema): - """ CreateSSL - 创建SSL证书,可以把整个 Pem 证书内容传过来,或者把证书、私钥、CA证书分别传过来 - """ +class UpdateBackendAttributeResponseSchema(schema.ResponseSchema): + """UpdateBackendAttribute - 更新CLB后端资源实例(服务节点)属性""" - fields = {"SSLId": fields.Str(required=False, load_from="SSLId")} + fields = {} """ -API: CreateULB +API: UpdateBackendBatch -创建负载均衡实例,可以选择内网或者外网 +批量更新ULB后端资源实例(服务节点)属性 """ -class CreateULBRequestSchema(schema.RequestSchema): - """ CreateULB - 创建负载均衡实例,可以选择内网或者外网 - """ +class UpdateBackendBatchParamAttributesSchema(schema.RequestSchema): + """UpdateBackendBatchParamAttributes -""" fields = { - "BusinessId": fields.Str(required=False, dump_to="BusinessId"), - "ChargeType": fields.Str(required=False, dump_to="ChargeType"), - "IPVersion": fields.Str(required=False, dump_to="IPVersion"), - "InnerMode": fields.Str(required=False, dump_to="InnerMode"), - "ListenType": fields.Str(required=False, dump_to="ListenType"), - "OuterMode": fields.Str(required=False, dump_to="OuterMode"), - "PrivateIp": fields.Str(required=False, dump_to="PrivateIp"), + "BackendId": fields.Str(required=True, dump_to="BackendId"), + "Enabled": fields.Int(required=False, dump_to="Enabled"), + "IsBackup": fields.Int(required=False, dump_to="IsBackup"), + "Port": fields.Int(required=False, dump_to="Port"), + "Weight": fields.Int(required=False, dump_to="Weight"), + } + + +class UpdateBackendBatchRequestSchema(schema.RequestSchema): + """UpdateBackendBatch - 批量更新ULB后端资源实例(服务节点)属性""" + + fields = { + "Attributes": fields.List(UpdateBackendBatchParamAttributesSchema()), "ProjectId": fields.Str(required=True, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "Remark": fields.Str(required=False, dump_to="Remark"), - "SubnetId": fields.Str(required=False, dump_to="SubnetId"), - "Tag": fields.Str(required=False, dump_to="Tag"), - "ULBName": fields.Str(required=False, dump_to="ULBName"), - "VPCId": fields.Str(required=False, dump_to="VPCId"), + "ULBId": fields.Str(required=True, dump_to="ULBId"), } -class CreateULBResponseSchema(schema.ResponseSchema): - """ CreateULB - 创建负载均衡实例,可以选择内网或者外网 - """ +class UpdateBackendBatchResponseSchema(schema.ResponseSchema): + """UpdateBackendBatch - 批量更新ULB后端资源实例(服务节点)属性""" - fields = {"ULBId": fields.Str(required=False, load_from="ULBId")} + fields = { + "BackendSet": fields.List( + models.BackendMsgSchema(), required=False, load_from="BackendSet" + ), + } """ -API: CreateVServer +API: UpdateListenerAttribute -创建VServer实例,定义监听的协议和端口以及负载均衡算法 +更新一个应用型负载均衡监听器的属性 """ -class CreateVServerRequestSchema(schema.RequestSchema): - """ CreateVServer - 创建VServer实例,定义监听的协议和端口以及负载均衡算法 - """ +class UpdateListenerAttributeParamStickinessConfigSchema(schema.RequestSchema): + """UpdateListenerAttributeParamStickinessConfig -""" fields = { - "ClientTimeout": fields.Int(required=False, dump_to="ClientTimeout"), - "Domain": fields.Str(required=False, dump_to="Domain"), - "FrontendPort": fields.Int(required=False, dump_to="FrontendPort"), - "ListenType": fields.Str(required=False, dump_to="ListenType"), - "Method": fields.Str(required=False, dump_to="Method"), - "MonitorType": fields.Str(required=False, dump_to="MonitorType"), - "Path": fields.Str(required=False, dump_to="Path"), - "PersistenceInfo": fields.Str( - required=False, dump_to="PersistenceInfo" - ), - "PersistenceType": fields.Str( - required=False, dump_to="PersistenceType" - ), - "ProjectId": fields.Str(required=False, dump_to="ProjectId"), - "Protocol": fields.Str(required=False, dump_to="Protocol"), - "Region": fields.Str(required=True, dump_to="Region"), - "ULBId": fields.Str(required=True, dump_to="ULBId"), - "VServerName": fields.Str(required=False, dump_to="VServerName"), + "CookieName": fields.Str(required=False, dump_to="CookieName"), + "Enabled": fields.Bool(required=False, dump_to="Enabled"), + "Type": fields.Str(required=False, dump_to="Type"), } -class CreateVServerResponseSchema(schema.ResponseSchema): - """ CreateVServer - 创建VServer实例,定义监听的协议和端口以及负载均衡算法 - """ - - fields = {"VServerId": fields.Str(required=False, load_from="VServerId")} - - -""" -API: DeletePolicy +class UpdateListenerAttributeParamHealthCheckConfigSchema(schema.RequestSchema): + """UpdateListenerAttributeParamHealthCheckConfig -""" -删除内容转发策略 -""" + fields = { + "Domain": fields.Str(required=False, dump_to="Domain"), + "Enabled": fields.Bool(required=False, dump_to="Enabled"), + "Method": fields.Str(required=False, dump_to="Method"), + "Path": fields.Str(required=False, dump_to="Path"), + "ResponseCode": fields.Str(required=False, dump_to="ResponseCode"), + "Type": fields.Str(required=False, dump_to="Type"), + } -class DeletePolicyRequestSchema(schema.RequestSchema): - """ DeletePolicy - 删除内容转发策略 - """ +class UpdateListenerAttributeRequestSchema(schema.RequestSchema): + """UpdateListenerAttribute - 更新一个应用型负载均衡监听器的属性""" fields = { - "GroupId": fields.Str(required=False, dump_to="GroupId"), - "PolicyId": fields.Str(required=True, dump_to="PolicyId"), + "Certificates": fields.List(fields.Str()), + "CompressionEnabled": fields.Bool( + required=False, dump_to="CompressionEnabled" + ), + "HTTP2Enabled": fields.Bool(required=False, dump_to="HTTP2Enabled"), + "HealthCheckConfig": UpdateListenerAttributeParamHealthCheckConfigSchema( + required=False, dump_to="HealthCheckConfig" + ), + "IdleTimeout": fields.Int(required=False, dump_to="IdleTimeout"), + "ListenerId": fields.Str(required=True, dump_to="ListenerId"), + "LoadBalancerId": fields.Str(required=True, dump_to="LoadBalancerId"), + "Name": fields.Str(required=False, dump_to="Name"), "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "RedirectEnabled": fields.Bool( + required=False, dump_to="RedirectEnabled" + ), + "RedirectPort": fields.Int(required=False, dump_to="RedirectPort"), "Region": fields.Str(required=True, dump_to="Region"), - "VServerId": fields.Str(required=False, dump_to="VServerId"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "Scheduler": fields.Str(required=False, dump_to="Scheduler"), + "SecurityPolicyId": fields.Str( + required=False, dump_to="SecurityPolicyId" + ), + "StickinessConfig": UpdateListenerAttributeParamStickinessConfigSchema( + required=False, dump_to="StickinessConfig" + ), } -class DeletePolicyResponseSchema(schema.ResponseSchema): - """ DeletePolicy - 删除内容转发策略 - """ +class UpdateListenerAttributeResponseSchema(schema.ResponseSchema): + """UpdateListenerAttribute - 更新一个应用型负载均衡监听器的属性""" fields = {} """ -API: DeleteSSL +API: UpdateLoadBalancerAttribute -删除SSL证书 +更新一个应用型负载均衡实例的属性 """ -class DeleteSSLRequestSchema(schema.RequestSchema): - """ DeleteSSL - 删除SSL证书 - """ +class UpdateLoadBalancerAttributeParamAccessLogConfigSchema( + schema.RequestSchema +): + """UpdateLoadBalancerAttributeParamAccessLogConfig -""" + + fields = { + "Enabled": fields.Bool(required=False, dump_to="Enabled"), + "US3BucketName": fields.Str(required=False, dump_to="US3BucketName"), + "US3TokenId": fields.Str(required=False, dump_to="US3TokenId"), + } + + +class UpdateLoadBalancerAttributeRequestSchema(schema.RequestSchema): + """UpdateLoadBalancerAttribute - 更新一个应用型负载均衡实例的属性""" fields = { + "AccessLogConfig": UpdateLoadBalancerAttributeParamAccessLogConfigSchema( + required=False, dump_to="AccessLogConfig" + ), + "LoadBalancerId": fields.Str(required=True, dump_to="LoadBalancerId"), + "Name": fields.Str(required=False, dump_to="Name"), "ProjectId": fields.Str(required=True, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "SSLId": fields.Str(required=True, dump_to="SSLId"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "Tag": fields.Str(required=False, dump_to="Tag"), } -class DeleteSSLResponseSchema(schema.ResponseSchema): - """ DeleteSSL - 删除SSL证书 - """ +class UpdateLoadBalancerAttributeResponseSchema(schema.ResponseSchema): + """UpdateLoadBalancerAttribute - 更新一个应用型负载均衡实例的属性""" fields = {} """ -API: DeleteULB +API: UpdatePolicy -删除负载均衡实例 +更新传统型负载均衡内容转发规则,包括转发规则后的服务节点 """ -class DeleteULBRequestSchema(schema.RequestSchema): - """ DeleteULB - 删除负载均衡实例 - """ +class UpdatePolicyRequestSchema(schema.RequestSchema): + """UpdatePolicy - 更新传统型负载均衡内容转发规则,包括转发规则后的服务节点""" fields = { + "BackendId": fields.List(fields.Str()), + "DomainMatchMode": fields.Str( + required=False, dump_to="DomainMatchMode" + ), + "Match": fields.Str(required=True, dump_to="Match"), + "PolicyId": fields.Str(required=False, dump_to="PolicyId"), + "PolicyPriority": fields.Int(required=False, dump_to="PolicyPriority"), "ProjectId": fields.Str(required=True, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "ReleaseEip": fields.Bool(required=False, dump_to="ReleaseEip"), + "Type": fields.Str(required=False, dump_to="Type"), "ULBId": fields.Str(required=True, dump_to="ULBId"), + "VServerId": fields.Str(required=True, dump_to="VServerId"), } -class DeleteULBResponseSchema(schema.ResponseSchema): - """ DeleteULB - 删除负载均衡实例 - """ +class UpdatePolicyResponseSchema(schema.ResponseSchema): + """UpdatePolicy - 更新传统型负载均衡内容转发规则,包括转发规则后的服务节点""" - fields = {} + fields = { + "PolicyId": fields.Str( + required=False, load_from="PolicyId" + ), # Deprecated, will be removed at 1.0 + } """ -API: DeleteVServer +API: UpdateRuleAttribute -删除VServer实例 +更新应用型负载均衡监听器的一条转发规则的属性 """ -class DeleteVServerRequestSchema(schema.RequestSchema): - """ DeleteVServer - 删除VServer实例 - """ +class UpdateRuleAttributeParamRuleActionsForwardConfigTargetsSchema( + schema.RequestSchema +): + """UpdateRuleAttributeParamRuleActionsForwardConfigTargets -""" fields = { - "ProjectId": fields.Str(required=True, dump_to="ProjectId"), - "Region": fields.Str(required=True, dump_to="Region"), - "ULBId": fields.Str(required=True, dump_to="ULBId"), - "VServerId": fields.Str(required=True, dump_to="VServerId"), + "Id": fields.Str(required=False, dump_to="Id"), + "Weight": fields.Int(required=False, dump_to="Weight"), } -class DeleteVServerResponseSchema(schema.ResponseSchema): - """ DeleteVServer - 删除VServer实例 - """ +class UpdateRuleAttributeParamRuleActionsCorsConfigSchema(schema.RequestSchema): + """UpdateRuleAttributeParamRuleActionsCorsConfig -""" - fields = {} + fields = { + "AllowCredentials": fields.Str( + required=False, dump_to="AllowCredentials" + ), + "AllowHeaders": fields.List(fields.Str()), + "AllowMethods": fields.List(fields.Str()), + "AllowOrigin": fields.List(fields.Str()), + "ExposeHeaders": fields.List(fields.Str()), + "MaxAge": fields.Int(required=False, dump_to="MaxAge"), + } -""" -API: DescribeSSL +class UpdateRuleAttributeParamRuleActionsFixedResponseConfigSchema( + schema.RequestSchema +): + """UpdateRuleAttributeParamRuleActionsFixedResponseConfig -""" -获取SSL证书信息 -""" + fields = { + "Content": fields.Str(required=False, dump_to="Content"), + "HttpCode": fields.Int(required=False, dump_to="HttpCode"), + } -class DescribeSSLRequestSchema(schema.RequestSchema): - """ DescribeSSL - 获取SSL证书信息 - """ +class UpdateRuleAttributeParamRuleActionsInsertHeaderConfigSchema( + schema.RequestSchema +): + """UpdateRuleAttributeParamRuleActionsInsertHeaderConfig -""" fields = { - "Limit": fields.Int(required=False, dump_to="Limit"), - "Offset": fields.Int(required=False, dump_to="Offset"), - "ProjectId": fields.Str(required=True, dump_to="ProjectId"), - "Region": fields.Str(required=True, dump_to="Region"), - "SSLId": fields.Str(required=False, dump_to="SSLId"), + "Key": fields.Str(required=False, dump_to="Key"), + "Value": fields.Str(required=False, dump_to="Value"), + "ValueType": fields.Str(required=False, dump_to="ValueType"), } -class DescribeSSLResponseSchema(schema.ResponseSchema): - """ DescribeSSL - 获取SSL证书信息 - """ +class UpdateRuleAttributeParamRuleActionsRemoveHeaderConfigSchema( + schema.RequestSchema +): + """UpdateRuleAttributeParamRuleActionsRemoveHeaderConfig -""" fields = { - "DataSet": fields.List( - models.ULBSSLSetSchema(), required=False, load_from="DataSet" - ), - "TotalCount": fields.Int(required=False, load_from="TotalCount"), + "Key": fields.Str(required=False, dump_to="Key"), } -""" -API: DescribeULB +class UpdateRuleAttributeParamRuleActionsForwardConfigSchema( + schema.RequestSchema +): + """UpdateRuleAttributeParamRuleActionsForwardConfig -""" -获取ULB详细信息 -""" + fields = { + "Targets": fields.List( + UpdateRuleAttributeParamRuleActionsForwardConfigTargetsSchema() + ), + } -class DescribeULBRequestSchema(schema.RequestSchema): - """ DescribeULB - 获取ULB详细信息 - """ +class UpdateRuleAttributeParamRuleActionsSchema(schema.RequestSchema): + """UpdateRuleAttributeParamRuleActions -""" fields = { - "BusinessId": fields.Str(required=False, dump_to="BusinessId"), - "Limit": fields.Int(required=False, dump_to="Limit"), - "Offset": fields.Int(required=False, dump_to="Offset"), - "ProjectId": fields.Str(required=True, dump_to="ProjectId"), - "Region": fields.Str(required=True, dump_to="Region"), - "SubnetId": fields.Str(required=False, dump_to="SubnetId"), - "ULBId": fields.Str(required=False, dump_to="ULBId"), - "VPCId": fields.Str(required=False, dump_to="VPCId"), + "CorsConfig": UpdateRuleAttributeParamRuleActionsCorsConfigSchema( + required=False, dump_to="CorsConfig" + ), + "FixedResponseConfig": UpdateRuleAttributeParamRuleActionsFixedResponseConfigSchema( + required=False, dump_to="FixedResponseConfig" + ), + "ForwardConfig": UpdateRuleAttributeParamRuleActionsForwardConfigSchema( + required=False, dump_to="ForwardConfig" + ), + "InsertHeaderConfig": UpdateRuleAttributeParamRuleActionsInsertHeaderConfigSchema( + required=False, dump_to="InsertHeaderConfig" + ), + "Order": fields.Int(required=False, dump_to="Order"), + "RemoveHeaderConfig": UpdateRuleAttributeParamRuleActionsRemoveHeaderConfigSchema( + required=False, dump_to="RemoveHeaderConfig" + ), + "Type": fields.Str(required=False, dump_to="Type"), } -class DescribeULBResponseSchema(schema.ResponseSchema): - """ DescribeULB - 获取ULB详细信息 - """ +class UpdateRuleAttributeParamRuleConditionsHostConfigSchema( + schema.RequestSchema +): + """UpdateRuleAttributeParamRuleConditionsHostConfig -""" fields = { - "DataSet": fields.List( - models.ULBSetSchema(), required=False, load_from="DataSet" - ), - "TotalCount": fields.Int(required=False, load_from="TotalCount"), + "MatchMode": fields.Str(required=False, dump_to="MatchMode"), + "Values": fields.List(fields.Str()), } -""" -API: DescribeVServer +class UpdateRuleAttributeParamRuleConditionsPathConfigSchema( + schema.RequestSchema +): + """UpdateRuleAttributeParamRuleConditionsPathConfig -""" -获取ULB下的VServer的详细信息 -""" + fields = { + "Values": fields.List(fields.Str()), + } -class DescribeVServerRequestSchema(schema.RequestSchema): - """ DescribeVServer - 获取ULB下的VServer的详细信息 - """ +class UpdateRuleAttributeParamRuleConditionsSchema(schema.RequestSchema): + """UpdateRuleAttributeParamRuleConditions -""" fields = { - "Limit": fields.Int(required=False, dump_to="Limit"), - "Offset": fields.Int(required=False, dump_to="Offset"), - "ProjectId": fields.Str(required=True, dump_to="ProjectId"), - "Region": fields.Str(required=True, dump_to="Region"), - "ULBId": fields.Str(required=True, dump_to="ULBId"), - "VServerId": fields.Str(required=False, dump_to="VServerId"), + "HostConfig": UpdateRuleAttributeParamRuleConditionsHostConfigSchema( + required=False, dump_to="HostConfig" + ), + "PathConfig": UpdateRuleAttributeParamRuleConditionsPathConfigSchema( + required=False, dump_to="PathConfig" + ), + "Type": fields.Str(required=False, dump_to="Type"), } -class DescribeVServerResponseSchema(schema.ResponseSchema): - """ DescribeVServer - 获取ULB下的VServer的详细信息 - """ +class UpdateRuleAttributeRequestSchema(schema.RequestSchema): + """UpdateRuleAttribute - 更新应用型负载均衡监听器的一条转发规则的属性""" fields = { - "DataSet": fields.List( - models.ULBVServerSetSchema(), required=False, load_from="DataSet" + "ListenerId": fields.Str(required=True, dump_to="ListenerId"), + "LoadBalancerId": fields.Str(required=True, dump_to="LoadBalancerId"), + "Pass": fields.Bool(required=False, dump_to="Pass"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "RuleActions": fields.List(UpdateRuleAttributeParamRuleActionsSchema()), + "RuleConditions": fields.List( + UpdateRuleAttributeParamRuleConditionsSchema() ), - "TotalCount": fields.Int(required=False, load_from="TotalCount"), + "RuleId": fields.Str(required=True, dump_to="RuleId"), } +class UpdateRuleAttributeResponseSchema(schema.ResponseSchema): + """UpdateRuleAttribute - 更新应用型负载均衡监听器的一条转发规则的属性""" + + fields = {} + + """ -API: ReleaseBackend +API: UpdateSSLAttribute -从VServer释放后端资源实例 +更新修改SSL的属性,如:修改SSLName """ -class ReleaseBackendRequestSchema(schema.RequestSchema): - """ ReleaseBackend - 从VServer释放后端资源实例 - """ +class UpdateSSLAttributeRequestSchema(schema.RequestSchema): + """UpdateSSLAttribute - 更新修改SSL的属性,如:修改SSLName""" fields = { - "BackendId": fields.Str(required=True, dump_to="BackendId"), "ProjectId": fields.Str(required=True, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "ULBId": fields.Str(required=True, dump_to="ULBId"), + "SSLId": fields.Str(required=True, dump_to="SSLId"), + "SSLName": fields.Str(required=True, dump_to="SSLName"), } -class ReleaseBackendResponseSchema(schema.ResponseSchema): - """ ReleaseBackend - 从VServer释放后端资源实例 - """ +class UpdateSSLAttributeResponseSchema(schema.ResponseSchema): + """UpdateSSLAttribute - 更新修改SSL的属性,如:修改SSLName""" fields = {} """ -API: UnbindSSL +API: UpdateSSLBinding -从VServer解绑SSL证书 +将传统型或应用型负载均衡监听器绑定的证书更换为另一个证书, """ -class UnbindSSLRequestSchema(schema.RequestSchema): - """ UnbindSSL - 从VServer解绑SSL证书 - """ +class UpdateSSLBindingRequestSchema(schema.RequestSchema): + """UpdateSSLBinding - 将传统型或应用型负载均衡监听器绑定的证书更换为另一个证书,""" fields = { + "ListenerId": fields.Str(required=False, dump_to="ListenerId"), + "LoadBalancerId": fields.Str(required=False, dump_to="LoadBalancerId"), + "NewSSLId": fields.Str(required=True, dump_to="NewSSLId"), + "OldSSLId": fields.Str(required=True, dump_to="OldSSLId"), "ProjectId": fields.Str(required=True, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "SSLId": fields.Str(required=True, dump_to="SSLId"), - "ULBId": fields.Str(required=True, dump_to="ULBId"), - "VServerId": fields.Str(required=True, dump_to="VServerId"), } -class UnbindSSLResponseSchema(schema.ResponseSchema): - """ UnbindSSL - 从VServer解绑SSL证书 - """ +class UpdateSSLBindingResponseSchema(schema.ResponseSchema): + """UpdateSSLBinding - 将传统型或应用型负载均衡监听器绑定的证书更换为另一个证书,""" fields = {} """ -API: UpdateBackendAttribute +API: UpdateSecurityPolicy -更新ULB后端资源实例(服务节点)属性 +更新安全策略 """ -class UpdateBackendAttributeRequestSchema(schema.RequestSchema): - """ UpdateBackendAttribute - 更新ULB后端资源实例(服务节点)属性 - """ +class UpdateSecurityPolicyRequestSchema(schema.RequestSchema): + """UpdateSecurityPolicy - 更新安全策略""" fields = { - "BackendId": fields.Str(required=True, dump_to="BackendId"), - "Enabled": fields.Int(required=False, dump_to="Enabled"), - "Port": fields.Int(required=False, dump_to="Port"), "ProjectId": fields.Str(required=True, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "ULBId": fields.Str(required=True, dump_to="ULBId"), - "Weight": fields.Int(required=False, dump_to="Weight"), + "SSLCiphers": fields.List(fields.Str()), + "SecurityPolicyId": fields.Str( + required=True, dump_to="SecurityPolicyId" + ), + "SecurityPolicyName": fields.Str( + required=False, dump_to="SecurityPolicyName" + ), + "TLSVersion": fields.Str(required=False, dump_to="TLSVersion"), } -class UpdateBackendAttributeResponseSchema(schema.ResponseSchema): - """ UpdateBackendAttribute - 更新ULB后端资源实例(服务节点)属性 - """ +class UpdateSecurityPolicyResponseSchema(schema.ResponseSchema): + """UpdateSecurityPolicy - 更新安全策略""" fields = {} """ -API: UpdatePolicy +API: UpdateTargetsAttribute -更新内容转发规则,包括转发规则后的服务节点 +更新应用型负载均衡监听器后端服务节点的属性 """ -class UpdatePolicyRequestSchema(schema.RequestSchema): - """ UpdatePolicy - 更新内容转发规则,包括转发规则后的服务节点 - """ +class UpdateTargetsAttributeParamTargetsSchema(schema.RequestSchema): + """UpdateTargetsAttributeParamTargets -""" fields = { - "BackendId": fields.List(fields.Str()), - "Match": fields.Str(required=True, dump_to="Match"), - "PolicyId": fields.Str(required=True, dump_to="PolicyId"), + "Enabled": fields.Bool(required=False, dump_to="Enabled"), + "Id": fields.Str(required=False, dump_to="Id"), + "IsBackup": fields.Bool(required=False, dump_to="IsBackup"), + "Weight": fields.Int(required=False, dump_to="Weight"), + } + + +class UpdateTargetsAttributeRequestSchema(schema.RequestSchema): + """UpdateTargetsAttribute - 更新应用型负载均衡监听器后端服务节点的属性""" + + fields = { + "ListenerId": fields.Str(required=True, dump_to="ListenerId"), + "LoadBalancerId": fields.Str(required=True, dump_to="LoadBalancerId"), "ProjectId": fields.Str(required=True, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "Type": fields.Str(required=False, dump_to="Type"), - "ULBId": fields.Str(required=True, dump_to="ULBId"), - "VServerId": fields.Str(required=True, dump_to="VServerId"), + "Targets": fields.List(UpdateTargetsAttributeParamTargetsSchema()), } -class UpdatePolicyResponseSchema(schema.ResponseSchema): - """ UpdatePolicy - 更新内容转发规则,包括转发规则后的服务节点 - """ +class UpdateTargetsAttributeResponseSchema(schema.ResponseSchema): + """UpdateTargetsAttribute - 更新应用型负载均衡监听器后端服务节点的属性""" - fields = {"PolicyId": fields.Str(required=False, load_from="PolicyId")} + fields = {} """ API: UpdateULBAttribute -更新ULB名字业务组备注等属性字段 +更新CLB名字业务组备注等属性字段 """ class UpdateULBAttributeRequestSchema(schema.RequestSchema): - """ UpdateULBAttribute - 更新ULB名字业务组备注等属性字段 - """ + """UpdateULBAttribute - 更新CLB名字业务组备注等属性字段""" fields = { + "BucketName": fields.Str(required=False, dump_to="BucketName"), + "EnableLog": fields.Int(required=False, dump_to="EnableLog"), + "IsWAFOn": fields.Str(required=False, dump_to="IsWAFOn"), "Name": fields.Str(required=False, dump_to="Name"), "ProjectId": fields.Str(required=True, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "Remark": fields.Str(required=False, dump_to="Remark"), "Tag": fields.Str(required=False, dump_to="Tag"), + "TokenId": fields.Str(required=False, dump_to="TokenId"), + "TokenName": fields.Str(required=False, dump_to="TokenName"), "ULBId": fields.Str(required=True, dump_to="ULBId"), } class UpdateULBAttributeResponseSchema(schema.ResponseSchema): - """ UpdateULBAttribute - 更新ULB名字业务组备注等属性字段 - """ + """UpdateULBAttribute - 更新CLB名字业务组备注等属性字段""" fields = {} @@ -580,17 +1822,21 @@ class UpdateULBAttributeResponseSchema(schema.ResponseSchema): """ API: UpdateVServerAttribute -更新VServer实例属性 +更新传统型负载均衡VServer实例属性 """ class UpdateVServerAttributeRequestSchema(schema.RequestSchema): - """ UpdateVServerAttribute - 更新VServer实例属性 - """ + """UpdateVServerAttribute - 更新传统型负载均衡VServer实例属性""" fields = { "ClientTimeout": fields.Int(required=False, dump_to="ClientTimeout"), "Domain": fields.Str(required=False, dump_to="Domain"), + "EnableCompression": fields.Int( + required=False, dump_to="EnableCompression" + ), + "EnableHTTP2": fields.Int(required=False, dump_to="EnableHTTP2"), + "ForwardPort": fields.Int(required=False, dump_to="ForwardPort"), "Method": fields.Str(required=False, dump_to="Method"), "MonitorType": fields.Str(required=False, dump_to="MonitorType"), "Path": fields.Str(required=False, dump_to="Path"), @@ -601,8 +1847,15 @@ class UpdateVServerAttributeRequestSchema(schema.RequestSchema): required=False, dump_to="PersistenceType" ), "ProjectId": fields.Str(required=True, dump_to="ProjectId"), - "Protocol": fields.Str(required=False, dump_to="Protocol"), + "Protocol": fields.Str( + required=False, dump_to="Protocol" + ), # Deprecated, will be removed at 1.0 "Region": fields.Str(required=True, dump_to="Region"), + "RequestMsg": fields.Str(required=False, dump_to="RequestMsg"), + "ResponseMsg": fields.Str(required=False, dump_to="ResponseMsg"), + "SecurityPolicyId": fields.Str( + required=False, dump_to="SecurityPolicyId" + ), "ULBId": fields.Str(required=True, dump_to="ULBId"), "VServerId": fields.Str(required=True, dump_to="VServerId"), "VServerName": fields.Str(required=False, dump_to="VServerName"), @@ -610,7 +1863,6 @@ class UpdateVServerAttributeRequestSchema(schema.RequestSchema): class UpdateVServerAttributeResponseSchema(schema.ResponseSchema): - """ UpdateVServerAttribute - 更新VServer实例属性 - """ + """UpdateVServerAttribute - 更新传统型负载均衡VServer实例属性""" fields = {} diff --git a/ucloud/services/ulb/schemas/models.py b/ucloud/services/ulb/schemas/models.py index 9ddaceca..a5c38e8b 100644 --- a/ucloud/services/ulb/schemas/models.py +++ b/ucloud/services/ulb/schemas/models.py @@ -1,146 +1,653 @@ -""" Code is generated by ucloud-model, DO NOT EDIT IT. """ - -from ucloud.core.typesystem import schema, fields - - -class BackendSetSchema(schema.ResponseSchema): - """ BackendSet - ulb添加rs时返回的信息 - """ - - fields = { - "BackendId": fields.Str(required=True, load_from="BackendId"), - "ResourceId": fields.Str(required=True, load_from="ResourceId"), - } - - -class ULBSSLSetSchema(schema.ResponseSchema): - """ ULBSSLSet - DescribeULB - """ - - fields = { - "HashValue": fields.Str(required=False, load_from="HashValue"), - "SSLId": fields.Str(required=False, load_from="SSLId"), - "SSLName": fields.Str(required=False, load_from="SSLName"), - } - - -class PolicyBackendSetSchema(schema.ResponseSchema): - """ PolicyBackendSet - 内容转发下rs详细信息 - """ - - fields = { - "BackendId": fields.Str(required=False, load_from="BackendId"), - "ObjectId": fields.Str(required=False, load_from="ObjectId"), - "Port": fields.Int(required=False, load_from="Port"), - "PrivateIP": fields.Str(required=False, load_from="PrivateIP"), - "ResourceName": fields.Str(required=False, load_from="ResourceName"), - } - - -class ULBBackendSetSchema(schema.ResponseSchema): - """ ULBBackendSet - DescribeULB - """ - - fields = { - "BackendId": fields.Str(required=False, load_from="BackendId"), - "Enabled": fields.Int(required=False, load_from="Enabled"), - "Port": fields.Int(required=False, load_from="Port"), - "PrivateIP": fields.Str(required=False, load_from="PrivateIP"), - "ResourceId": fields.Str(required=False, load_from="ResourceId"), - "ResourceName": fields.Str(required=False, load_from="ResourceName"), - "ResourceType": fields.Str(required=False, load_from="ResourceType"), - "Status": fields.Int(required=False, load_from="Status"), - "SubResourceId": fields.Str(required=False, load_from="SubResourceId"), - "SubResourceName": fields.Str( - required=False, load_from="SubResourceName" - ), - "SubResourceType": fields.Str( - required=False, load_from="SubResourceType" - ), - "SubnetId": fields.Str(required=False, load_from="SubnetId"), - "Weight": fields.Int(required=False, load_from="Weight"), - } - - -class ULBPolicySetSchema(schema.ResponseSchema): - """ ULBPolicySet - 内容转发详细列表 - """ - - fields = { - "BackendSet": fields.List(PolicyBackendSetSchema()), - "Match": fields.Str(required=False, load_from="Match"), - "PolicyId": fields.Str(required=False, load_from="PolicyId"), - "PolicyPriority": fields.Int( - required=False, load_from="PolicyPriority" - ), - "PolicyType": fields.Str(required=False, load_from="PolicyType"), - "TotalCount": fields.Int(required=False, load_from="TotalCount"), - "Type": fields.Str(required=False, load_from="Type"), - "VServerId": fields.Str(required=False, load_from="VServerId"), - } - - -class ULBVServerSetSchema(schema.ResponseSchema): - """ ULBVServerSet - DescribeULB - """ - - fields = { - "BackendSet": fields.List(ULBBackendSetSchema()), - "ClientTimeout": fields.Int(required=False, load_from="ClientTimeout"), - "Domain": fields.Str(required=True, load_from="Domain"), - "FrontendPort": fields.Int(required=False, load_from="FrontendPort"), - "ListenType": fields.Str(required=False, load_from="ListenType"), - "Method": fields.Str(required=False, load_from="Method"), - "MonitorType": fields.Str(required=True, load_from="MonitorType"), - "Path": fields.Str(required=True, load_from="Path"), - "PersistenceInfo": fields.Str( - required=False, load_from="PersistenceInfo" - ), - "PersistenceType": fields.Str( - required=False, load_from="PersistenceType" - ), - "PolicySet": fields.List(ULBPolicySetSchema()), - "Protocol": fields.Str(required=False, load_from="Protocol"), - "SSLSet": fields.List(ULBSSLSetSchema()), - "Status": fields.Int(required=False, load_from="Status"), - "VServerId": fields.Str(required=False, load_from="VServerId"), - "VServerName": fields.Str(required=False, load_from="VServerName"), - } - - -class ULBIPSetSchema(schema.ResponseSchema): - """ ULBIPSet - DescribeULB - """ - - fields = { - "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), - "BandwidthType": fields.Int(required=False, load_from="BandwidthType"), - "EIP": fields.Str(required=False, load_from="EIP"), - "EIPId": fields.Str(required=False, load_from="EIPId"), - "OperatorName": fields.Str(required=False, load_from="OperatorName"), - } - - -class ULBSetSchema(schema.ResponseSchema): - """ ULBSet - DescribeULB - """ - - fields = { - "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), - "BandwidthType": fields.Int(required=False, load_from="BandwidthType"), - "BusinessId": fields.Str(required=False, load_from="BusinessId"), - "CreateTime": fields.Int(required=False, load_from="CreateTime"), - "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), - "IPSet": fields.List(ULBIPSetSchema()), - "Name": fields.Str(required=False, load_from="Name"), - "PrivateIP": fields.Str(required=False, load_from="PrivateIP"), - "Remark": fields.Str(required=False, load_from="Remark"), - "Resource": fields.List(fields.Str()), - "SubnetId": fields.Str(required=False, load_from="SubnetId"), - "Tag": fields.Str(required=False, load_from="Tag"), - "ULBId": fields.Str(required=False, load_from="ULBId"), - "ULBName": fields.Str(required=False, load_from="ULBName"), - "ULBType": fields.Str(required=False, load_from="ULBType"), - "VPCId": fields.Str(required=False, load_from="VPCId"), - "VServerSet": fields.List(ULBVServerSetSchema()), - } +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class TargetSetSchema(schema.ResponseSchema): + """TargetSet - 服务节点信息""" + + fields = { + "Enabled": fields.Bool(required=False, load_from="Enabled"), + "Id": fields.Str(required=False, load_from="Id"), + "IsBackup": fields.Bool(required=False, load_from="IsBackup"), + "Port": fields.Int(required=False, load_from="Port"), + "ResourceIP": fields.Str(required=False, load_from="ResourceIP"), + "ResourceId": fields.Str(required=False, load_from="ResourceId"), + "ResourceType": fields.Str(required=False, load_from="ResourceType"), + "State": fields.Str(required=False, load_from="State"), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + "Weight": fields.Int(required=False, load_from="Weight"), + } + + +class BackendSetSchema(schema.ResponseSchema): + """BackendSet -""" + + fields = { + "BackendId": fields.Str(required=True, load_from="BackendId"), + "ResourceId": fields.Str(required=True, load_from="ResourceId"), + } + + +class TargetSchema(schema.ResponseSchema): + """Target - 服务节点信息""" + + fields = { + "Enabled": fields.Bool(required=False, load_from="Enabled"), + "Id": fields.Str(required=False, load_from="Id"), + "IsBackup": fields.Bool(required=False, load_from="IsBackup"), + "Port": fields.Int(required=False, load_from="Port"), + "ResourceIP": fields.Str(required=False, load_from="ResourceIP"), + "ResourceId": fields.Str(required=False, load_from="ResourceId"), + "ResourceName": fields.Str(required=False, load_from="ResourceName"), + "ResourceType": fields.Str(required=False, load_from="ResourceType"), + "State": fields.Str(required=False, load_from="State"), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + "Weight": fields.Int(required=False, load_from="Weight"), + } + + +class CertificateSchema(schema.ResponseSchema): + """Certificate - (应用型专用)服务器证书信息""" + + fields = { + "IsDefault": fields.Bool(required=False, load_from="IsDefault"), + "SSLId": fields.Str(required=False, load_from="SSLId"), + } + + +class PathConfigSetSchema(schema.ResponseSchema): + """PathConfigSet - 路径相关配置""" + + fields = { + "Values": fields.List(fields.Str()), + } + + +class FixedResponseConfigSetSchema(schema.ResponseSchema): + """FixedResponseConfigSet - 静态返回相关配置""" + + fields = { + "Content": fields.Str(required=False, load_from="Content"), + "HttpCode": fields.Int(required=True, load_from="HttpCode"), + } + + +class HealthCheckConfigSetSchema(schema.ResponseSchema): + """HealthCheckConfigSet - 健康检查相关配置""" + + fields = { + "Domain": fields.Str(required=False, load_from="Domain"), + "Enabled": fields.Bool(required=False, load_from="Enabled"), + "Method": fields.Str(required=False, load_from="Method"), + "Path": fields.Str(required=False, load_from="Path"), + "ResponseCode": fields.Str(required=False, load_from="ResponseCode"), + "Type": fields.Str(required=False, load_from="Type"), + } + + +class CorsConfigSetSchema(schema.ResponseSchema): + """CorsConfigSet - 跨域相关配置""" + + fields = { + "AllowCredentials": fields.Str( + required=False, load_from="AllowCredentials" + ), + "AllowHeaders": fields.List(fields.Str()), + "AllowMethods": fields.List(fields.Str()), + "AllowOrigin": fields.List(fields.Str()), + "ExposeHeaders": fields.List(fields.Str()), + "MaxAge": fields.Int(required=False, load_from="MaxAge"), + } + + +class ForwardTargetSetSchema(schema.ResponseSchema): + """ForwardTargetSet - 转发的后端服务节点""" + + fields = { + "Id": fields.Str(required=True, load_from="Id"), + "Weight": fields.Int(required=False, load_from="Weight"), + } + + +class ForwardConfigSetSchema(schema.ResponseSchema): + """ForwardConfigSet - 转发服务节点相关配置""" + + fields = { + "Targets": fields.List(ForwardTargetSetSchema()), + } + + +class InsertHeaderConfigSetSchema(schema.ResponseSchema): + """InsertHeaderConfigSet - 插入 header 相关配置""" + + fields = { + "Key": fields.Str(required=True, load_from="Key"), + "Value": fields.Str(required=True, load_from="Value"), + "ValueType": fields.Str(required=True, load_from="ValueType"), + } + + +class RemoveHeaderConfigSetSchema(schema.ResponseSchema): + """RemoveHeaderConfigSet - 删除 header 相关配置""" + + fields = { + "Key": fields.Str(required=True, load_from="Key"), + } + + +class RuleActionSchema(schema.ResponseSchema): + """RuleAction - 转发动作""" + + fields = { + "CorsConfig": CorsConfigSetSchema(), + "FixedResponseConfig": FixedResponseConfigSetSchema(), + "ForwardConfig": ForwardConfigSetSchema(), + "InsertHeaderConfig": InsertHeaderConfigSetSchema(), + "Order": fields.Int(required=False, load_from="Order"), + "RemoveHeaderConfig": RemoveHeaderConfigSetSchema(), + "Type": fields.Str(required=True, load_from="Type"), + } + + +class HostConfigSetSchema(schema.ResponseSchema): + """HostConfigSet - 域名相关配置""" + + fields = { + "MatchMode": fields.Str(required=False, load_from="MatchMode"), + "Values": fields.List(fields.Str()), + } + + +class RuleConditionSchema(schema.ResponseSchema): + """RuleCondition - 转发规则匹配条件""" + + fields = { + "HostConfig": HostConfigSetSchema(), + "PathConfig": PathConfigSetSchema(), + "Type": fields.Str(required=True, load_from="Type"), + } + + +class RuleSchema(schema.ResponseSchema): + """Rule - (应用型专用)转发规则信息""" + + fields = { + "IsDefault": fields.Bool(required=False, load_from="IsDefault"), + "Pass": fields.Bool(required=False, load_from="Pass"), + "RuleActions": fields.List(RuleActionSchema()), + "RuleConditions": fields.List(RuleConditionSchema()), + "RuleId": fields.Str(required=False, load_from="RuleId"), + } + + +class StickinessConfigSetSchema(schema.ResponseSchema): + """StickinessConfigSet - 会话保持相关配置""" + + fields = { + "CookieName": fields.Str(required=False, load_from="CookieName"), + "Enabled": fields.Bool(required=False, load_from="Enabled"), + "Type": fields.Str(required=False, load_from="Type"), + } + + +class ListenerSchema(schema.ResponseSchema): + """Listener - 负载均衡监听器信息""" + + fields = { + "Certificates": fields.List(CertificateSchema()), + "CompressionEnabled": fields.Bool( + required=False, load_from="CompressionEnabled" + ), + "HTTP2Enabled": fields.Bool(required=False, load_from="HTTP2Enabled"), + "HealthCheckConfig": HealthCheckConfigSetSchema(), + "IdleTimeout": fields.Int(required=False, load_from="IdleTimeout"), + "ListenerId": fields.Str(required=False, load_from="ListenerId"), + "ListenerPort": fields.Int(required=False, load_from="ListenerPort"), + "ListenerProtocol": fields.Str( + required=False, load_from="ListenerProtocol" + ), + "Name": fields.Str(required=False, load_from="Name"), + "RedirectEnabled": fields.Bool( + required=False, load_from="RedirectEnabled" + ), + "RedirectPort": fields.Int(required=False, load_from="RedirectPort"), + "Remark": fields.Str(required=False, load_from="Remark"), + "Rules": fields.List(RuleSchema()), + "Scheduler": fields.Str(required=False, load_from="Scheduler"), + "SecurityPolicyId": fields.Str( + required=False, load_from="SecurityPolicyId" + ), + "State": fields.Str(required=False, load_from="State"), + "StickinessConfig": StickinessConfigSetSchema(), + "Targets": fields.List(TargetSchema()), + } + + +class SecGroupInfoSchema(schema.ResponseSchema): + """SecGroupInfo - 安全组详细信息""" + + fields = { + "Name": fields.Str(required=False, load_from="Name"), + "Priority": fields.Int(required=False, load_from="Priority"), + "SecgroupId": fields.Str(required=False, load_from="SecgroupId"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + } + + +class AccessLogConfigSetSchema(schema.ResponseSchema): + """AccessLogConfigSet - (应用型专用)访问日志相关配置""" + + fields = { + "Enabled": fields.Bool(required=False, load_from="Enabled"), + "US3BucketName": fields.Str(required=False, load_from="US3BucketName"), + "US3TokenId": fields.Str(required=False, load_from="US3TokenId"), + } + + +class IPInfoSchema(schema.ResponseSchema): + """IPInfo - 绑定的IP信息""" + + fields = { + "AddressType": fields.Str(required=False, load_from="AddressType"), + "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), + "BandwidthType": fields.Int(required=False, load_from="BandwidthType"), + "IP": fields.Str(required=False, load_from="IP"), + "IPVersion": fields.Str(required=False, load_from="IPVersion"), + "Id": fields.Str(required=False, load_from="Id"), + "OperatorName": fields.Str(required=False, load_from="OperatorName"), + } + + +class FirewallSetSchema(schema.ResponseSchema): + """FirewallSet - ulb防火墙信息""" + + fields = { + "FirewallId": fields.Str(required=False, load_from="FirewallId"), + "FirewallName": fields.Str(required=False, load_from="FirewallName"), + } + + +class LoadBalancerSchema(schema.ResponseSchema): + """LoadBalancer - 负载均衡实例信息""" + + fields = { + "AccessLogConfig": AccessLogConfigSetSchema(), + "AutoRenewEnabled": fields.Bool( + required=False, load_from="AutoRenewEnabled" + ), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "Firewall": FirewallSetSchema(), + "IPInfos": fields.List(IPInfoSchema()), + "IPVersion": fields.Str(required=False, load_from="IPVersion"), + "Listeners": fields.List(ListenerSchema()), + "LoadBalancerId": fields.Str( + required=False, load_from="LoadBalancerId" + ), + "Name": fields.Str(required=False, load_from="Name"), + "PurchaseValue": fields.Int(required=False, load_from="PurchaseValue"), + "Remark": fields.Str(required=False, load_from="Remark"), + "SecGroup": fields.List(SecGroupInfoSchema()), + "SnatIPs": fields.List(fields.Str()), + "Status": fields.Str(required=False, load_from="Status"), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "Tag": fields.Str(required=False, load_from="Tag"), + "Type": fields.Str(required=False, load_from="Type"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + } + + +class SSLBindedTargetSetSchema(schema.ResponseSchema): + """SSLBindedTargetSet - DescribeSSL""" + + fields = { + "ULBId": fields.Str(required=False, load_from="ULBId"), + "ULBName": fields.Str(required=False, load_from="ULBName"), + "VServerId": fields.Str(required=False, load_from="VServerId"), + "VServerName": fields.Str(required=False, load_from="VServerName"), + } + + +class ULBSSLSetSchema(schema.ResponseSchema): + """ULBSSLSet - DescribeSSL""" + + fields = { + "BindedTargetSet": fields.List(SSLBindedTargetSetSchema()), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "Domains": fields.Str(required=False, load_from="Domains"), + "HashValue": fields.Str(required=False, load_from="HashValue"), + "NotAfter": fields.Int(required=False, load_from="NotAfter"), + "NotBefore": fields.Int(required=False, load_from="NotBefore"), + "SSLContent": fields.Str(required=False, load_from="SSLContent"), + "SSLId": fields.Str(required=False, load_from="SSLId"), + "SSLName": fields.Str(required=False, load_from="SSLName"), + "SSLSource": fields.Int(required=False, load_from="SSLSource"), + "SSLType": fields.Str(required=False, load_from="SSLType"), + "USSLId": fields.Str(required=False, load_from="USSLId"), + } + + +class SSLRelationSchema(schema.ResponseSchema): + """SSLRelation - SSL证书绑定到的对象""" + + fields = { + "IsDefault": fields.Bool(required=False, load_from="IsDefault"), + "ListenerId": fields.Str(required=False, load_from="ListenerId"), + "ListenerName": fields.Str(required=False, load_from="ListenerName"), + "LoadBalancerId": fields.Str( + required=False, load_from="LoadBalancerId" + ), + "LoadBalancerName": fields.Str( + required=False, load_from="LoadBalancerName" + ), + } + + +class SSLInfoSchema(schema.ResponseSchema): + """SSLInfo - SSL返回信息""" + + fields = { + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DNSNames": fields.Str(required=False, load_from="DNSNames"), + "Domains": fields.Str(required=False, load_from="Domains"), + "HashValue": fields.Str(required=False, load_from="HashValue"), + "NotAfter": fields.Int(required=False, load_from="NotAfter"), + "NotBefore": fields.Int(required=False, load_from="NotBefore"), + "Relations": fields.List(SSLRelationSchema()), + "SSLContent": fields.Str(required=False, load_from="SSLContent"), + "SSLId": fields.Str(required=False, load_from="SSLId"), + "SSLName": fields.Str(required=False, load_from="SSLName"), + "SSLSource": fields.Int(required=False, load_from="SSLSource"), + "SSLType": fields.Str(required=False, load_from="SSLType"), + "USSLId": fields.Str(required=False, load_from="USSLId"), + } + + +class BindVServerInfoSchema(schema.ResponseSchema): + """BindVServerInfo - 绑定安全策略的VServer信息""" + + fields = { + "Port": fields.Int(required=True, load_from="Port"), + "ULBId": fields.Str(required=True, load_from="ULBId"), + "VServerId": fields.Str(required=True, load_from="VServerId"), + "VServerName": fields.Str(required=True, load_from="VServerName"), + } + + +class SecurityPolicySchema(schema.ResponseSchema): + """SecurityPolicy - 安全策略组""" + + fields = { + "SSLCiphers": fields.List(fields.Str()), + "SecurityPolicyId": fields.Str( + required=True, load_from="SecurityPolicyId" + ), + "SecurityPolicyName": fields.Str( + required=True, load_from="SecurityPolicyName" + ), + "SecurityPolicyType": fields.Int( + required=True, load_from="SecurityPolicyType" + ), + "TLSVersion": fields.Str(required=True, load_from="TLSVersion"), + "VServerSet": fields.List(BindVServerInfoSchema()), + } + + +class SecurityPolicyRelationSchema(schema.ResponseSchema): + """SecurityPolicyRelation - 关联的监听""" + + fields = { + "ListenerId": fields.Str(required=False, load_from="ListenerId"), + "ListenerName": fields.Str(required=False, load_from="ListenerName"), + "ListenerPort": fields.Int(required=False, load_from="ListenerPort"), + "LoadBalancerId": fields.Str( + required=False, load_from="LoadBalancerId" + ), + } + + +class SecurityPolicyInfoSchema(schema.ResponseSchema): + """SecurityPolicyInfo - 安全策略信息""" + + fields = { + "Relations": fields.List(SecurityPolicyRelationSchema()), + "SSLCiphers": fields.List(fields.Str()), + "SecurityPolicyId": fields.Str( + required=False, load_from="SecurityPolicyId" + ), + "SecurityPolicyName": fields.Str( + required=False, load_from="SecurityPolicyName" + ), + "SecurityPolicyType": fields.Int( + required=False, load_from="SecurityPolicyType" + ), + "TLSVersion": fields.Str(required=False, load_from="TLSVersion"), + } + + +class TLSAndCiphersSchema(schema.ResponseSchema): + """TLSAndCiphers -""" + + fields = { + "SSLCiphers": fields.List(fields.Str()), + "TLSVersion": fields.Str(required=False, load_from="TLSVersion"), + } + + +class ULBIPSetSchema(schema.ResponseSchema): + """ULBIPSet - DescribeULB""" + + fields = { + "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), + "BandwidthType": fields.Int(required=False, load_from="BandwidthType"), + "EIP": fields.Str(required=False, load_from="EIP"), + "EIPId": fields.Str(required=False, load_from="EIPId"), + "OperatorName": fields.Str(required=False, load_from="OperatorName"), + } + + +class PolicyBackendSetSchema(schema.ResponseSchema): + """PolicyBackendSet - 内容转发下rs详细信息""" + + fields = { + "BackendId": fields.Str(required=False, load_from="BackendId"), + "ObjectId": fields.Str(required=False, load_from="ObjectId"), + "Port": fields.Int(required=False, load_from="Port"), + "PrivateIP": fields.Str(required=False, load_from="PrivateIP"), + "ResourceName": fields.Str(required=False, load_from="ResourceName"), + "ResourceType": fields.Str(required=False, load_from="ResourceType"), + "SubResourceId": fields.Str(required=False, load_from="SubResourceId"), + "SubResourceName": fields.Str( + required=False, load_from="SubResourceName" + ), + "SubResourceType": fields.Str( + required=False, load_from="SubResourceType" + ), + } + + +class ULBPolicySetSchema(schema.ResponseSchema): + """ULBPolicySet - 内容转发详细列表""" + + fields = { + "BackendSet": fields.List(PolicyBackendSetSchema()), + "DomainMatchMode": fields.Str( + required=False, load_from="DomainMatchMode" + ), + "Match": fields.Str(required=False, load_from="Match"), + "PolicyId": fields.Str(required=False, load_from="PolicyId"), + "PolicyPriority": fields.Int( + required=False, load_from="PolicyPriority" + ), + "PolicyType": fields.Str(required=False, load_from="PolicyType"), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + "Type": fields.Str(required=False, load_from="Type"), + "VServerId": fields.Str(required=False, load_from="VServerId"), + } + + +class LoggerSetSchema(schema.ResponseSchema): + """LoggerSet - ulb日志信息""" + + fields = { + "BucketName": fields.Str(required=False, load_from="BucketName"), + "TokenID": fields.Str(required=False, load_from="TokenID"), + "TokenName": fields.Str(required=False, load_from="TokenName"), + } + + +class ULBBackendSetSchema(schema.ResponseSchema): + """ULBBackendSet - DescribeULB""" + + fields = { + "BackendId": fields.Str(required=False, load_from="BackendId"), + "Enabled": fields.Int(required=False, load_from="Enabled"), + "IsBackup": fields.Int(required=False, load_from="IsBackup"), + "Port": fields.Int(required=False, load_from="Port"), + "PrivateIP": fields.Str(required=False, load_from="PrivateIP"), + "ResourceId": fields.Str(required=False, load_from="ResourceId"), + "ResourceName": fields.Str(required=False, load_from="ResourceName"), + "ResourceType": fields.Str(required=False, load_from="ResourceType"), + "Status": fields.Int(required=False, load_from="Status"), + "SubResourceId": fields.Str(required=False, load_from="SubResourceId"), + "SubResourceName": fields.Str( + required=False, load_from="SubResourceName" + ), + "SubResourceType": fields.Str( + required=False, load_from="SubResourceType" + ), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + "Weight": fields.Int(required=False, load_from="Weight"), + } + + +class BindSecurityPolicySchema(schema.ResponseSchema): + """BindSecurityPolicy - VServer绑定的安全策略组信息""" + + fields = { + "SSLCiphers": fields.List(fields.Str()), + "SecurityPolicyId": fields.Str( + required=False, load_from="SecurityPolicyId" + ), + "SecurityPolicyName": fields.Str( + required=False, load_from="SecurityPolicyName" + ), + "SecurityPolicyType": fields.Int( + required=False, load_from="SecurityPolicyType" + ), + "TLSVersion": fields.Str(required=False, load_from="TLSVersion"), + } + + +class ULBVServerSetSchema(schema.ResponseSchema): + """ULBVServerSet - DescribeULB""" + + fields = { + "BackendSet": fields.List(ULBBackendSetSchema()), + "ClientTimeout": fields.Int(required=False, load_from="ClientTimeout"), + "Domain": fields.Str(required=False, load_from="Domain"), + "EnableCompression": fields.Int( + required=False, load_from="EnableCompression" + ), + "EnableHTTP2": fields.Int(required=False, load_from="EnableHTTP2"), + "ForwardPort": fields.Int(required=False, load_from="ForwardPort"), + "FrontendPort": fields.Int(required=False, load_from="FrontendPort"), + "ListenType": fields.Str(required=False, load_from="ListenType"), + "Method": fields.Str(required=False, load_from="Method"), + "MonitorType": fields.Str(required=True, load_from="MonitorType"), + "Path": fields.Str(required=False, load_from="Path"), + "PersistenceInfo": fields.Str( + required=False, load_from="PersistenceInfo" + ), + "PersistenceType": fields.Str( + required=True, load_from="PersistenceType" + ), + "PolicySet": fields.List(ULBPolicySetSchema()), + "Protocol": fields.Str(required=False, load_from="Protocol"), + "RequestMsg": fields.Str(required=False, load_from="RequestMsg"), + "ResponseMsg": fields.Str(required=False, load_from="ResponseMsg"), + "SSLSet": fields.List(ULBSSLSetSchema()), + "SecurityPolicy": BindSecurityPolicySchema(), + "Status": fields.Int(required=False, load_from="Status"), + "ULBId": fields.Str(required=False, load_from="ULBId"), + "VServerId": fields.Str(required=False, load_from="VServerId"), + "VServerName": fields.Str(required=False, load_from="VServerName"), + } + + +class ULBSetSchema(schema.ResponseSchema): + """ULBSet - DescribeULB""" + + fields = { + "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), + "BandwidthType": fields.Int(required=False, load_from="BandwidthType"), + "BusinessId": fields.Str(required=False, load_from="BusinessId"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "EnableLog": fields.Int(required=False, load_from="EnableLog"), + "ExpireTime": fields.Int( + required=False, load_from="ExpireTime" + ), # Deprecated, will be removed at 1.0 + "FirewallSet": fields.List(FirewallSetSchema()), + "IPSet": fields.List(ULBIPSetSchema()), + "IPVersion": fields.Str(required=False, load_from="IPVersion"), + "ListenType": fields.Str(required=False, load_from="ListenType"), + "LogSet": LoggerSetSchema(), + "Name": fields.Str(required=False, load_from="Name"), + "PrivateIP": fields.Str(required=False, load_from="PrivateIP"), + "Remark": fields.Str(required=False, load_from="Remark"), + "Resource": fields.List( + fields.Str() + ), # Deprecated, will be removed at 1.0 + "SnatIps": fields.List(fields.Str()), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "Tag": fields.Str(required=False, load_from="Tag"), + "ULBId": fields.Str(required=False, load_from="ULBId"), + "ULBName": fields.Str( + required=False, load_from="ULBName" + ), # Deprecated, will be removed at 1.0 + "ULBType": fields.Str(required=False, load_from="ULBType"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + "VServerSet": fields.List(ULBVServerSetSchema()), + } + + +class ULBSimpleSetSchema(schema.ResponseSchema): + """ULBSimpleSet - ulb简明信息""" + + fields = { + "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), + "BandwidthType": fields.Int(required=False, load_from="BandwidthType"), + "BusinessId": fields.Str(required=False, load_from="BusinessId"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "EnableLog": fields.Int(required=False, load_from="EnableLog"), + "FirewallSet": fields.List(FirewallSetSchema()), + "IPSet": fields.List(ULBIPSetSchema()), + "IPVersion": fields.Str(required=True, load_from="IPVersion"), + "ListenType": fields.Str(required=True, load_from="ListenType"), + "LogSet": LoggerSetSchema(), + "Name": fields.Str(required=False, load_from="Name"), + "PrivateIP": fields.Str(required=False, load_from="PrivateIP"), + "Remark": fields.Str(required=False, load_from="Remark"), + "SnatIps": fields.List(fields.Str()), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "Tag": fields.Str(required=False, load_from="Tag"), + "ULBId": fields.Str(required=False, load_from="ULBId"), + "ULBType": fields.Str(required=False, load_from="ULBType"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + "VServerCount": fields.Int(required=False, load_from="VServerCount"), + "WAFMode": fields.Str(required=False, load_from="WAFMode"), + } + + +class BackendMsgSchema(schema.ResponseSchema): + """BackendMsg - ulb修rs状态时返回的信息""" + + fields = { + "BackendId": fields.Str(required=True, load_from="BackendId"), + "SubMessage": fields.Str(required=True, load_from="SubMessage"), + "SubRetCode": fields.Int(required=True, load_from="SubRetCode"), + } diff --git a/ucloud/services/ulighthost/__init__.py b/ucloud/services/ulighthost/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/ulighthost/client.py b/ucloud/services/ulighthost/client.py new file mode 100644 index 00000000..6a3d8ba1 --- /dev/null +++ b/ucloud/services/ulighthost/client.py @@ -0,0 +1,576 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.ulighthost.schemas import apis + + +class ULightHostClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(ULightHostClient, self).__init__( + config, transport, middleware, logger + ) + + def check_ul_host_resource_capacity( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CheckULHostResourceCapacity - 检查轻量应用云主机资源余量 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BundleId** (str) - (Required) 套餐ID。如:"ulh.c1m1s40b30t800" + - **ImageId** (str) - (Required) 镜像ID。 请通过 `DescribeImage `_ 获取 + - **ChargeType** (str) - 计费模式。枚举值: \\ > Year,按年付费; \\ > Month,按月付费;\\ > ThirtyDay,30天期付费,跨境电商相关套餐使用此计费方式;默认:Month + - **CouponId** (str) - 主机代金券ID。请通过DescribeCoupon接口查询,或登录用户中心查看 + - **Name** (str) - 轻量应用主机名称。默认:套餐ID。请遵照 `字段规范 `_ 设定实例名称。 + - **Quantity** (int) - 购买时长。默认:1。不支持购买到月末 + - **SecurityGroupId** (str) - 防火墙ID,默认:Web推荐防火墙。如何查询SecurityGroupId请参见 `DescribeFirewall `_ 。 + - **SubnetId** (str) - 子网 ID。默认为当前地域的默认子网。 + - **VPCId** (str) - VPC ID。默认为当前地域的默认VPC。 + + **Response** + + - **Message** (str) - 错误信息 + - **ResourceEnough** (bool) - 资源是否充足 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CheckULHostResourceCapacityRequestSchema().dumps(d) + + resp = self.invoke("CheckULHostResourceCapacity", d, **kwargs) + return apis.CheckULHostResourceCapacityResponseSchema().loads(resp) + + def create_ul_host_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateULHostInstance - 创建轻量应用云主机 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BundleId** (str) - (Required) 套餐ID。如:"ulh.c1m1s40b30t800" + - **ImageId** (str) - (Required) 镜像ID。 请通过 `DescribeImage `_ 获取 + - **Password** (str) - (Required) ULHost密码。请遵照 `字段规范 `_ 设定密码。密码需使用base64进行编码,举例如下:# echo -n Password1 | base64 + - **ChargeType** (str) - 计费模式。枚举值: \\ > Year,按年付费; \\ > Month,按月付费;\\ > ThirtyDay,30天期付费,跨境电商相关套餐使用此计费方式;默认:Month + - **CouponId** (str) - 主机代金券ID。请通过DescribeCoupon接口查询,或登录用户中心查看 + - **Name** (str) - 轻量应用主机名称。默认:套餐ID。请遵照 `字段规范 `_ 设定实例名称。 + - **Quantity** (int) - 购买时长。默认:1。不支持购买到月末 + - **SecurityGroupId** (str) - 防火墙ID,默认:Web推荐防火墙。如何查询SecurityGroupId请参见 `DescribeFirewall `_ 。 + - **SubnetId** (str) - 子网 ID。默认为当前地域的默认子网。 + - **VPCId** (str) - VPC ID。默认为当前地域的默认VPC。 + + **Response** + + - **Message** (str) - 错误信息 + - **ULHostId** (str) - 实例ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateULHostInstanceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateULHostInstance", d, **kwargs) + return apis.CreateULHostInstanceResponseSchema().loads(resp) + + def describe_ul_host_bundles( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeULHostBundles - 获取轻量应用云主机套餐列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + + **Response** + + - **Bundles** (list) - 见 **Bundle** 模型定义 + - **Message** (str) - 错误信息 + + **Response Model** + + **Bundle** + - **Bandwidth** (int) - 外网带宽。单位:Mbps。 + - **BundleId** (str) - 套餐ID。 + - **CPU** (int) - CPU核数。 + - **Memory** (int) - 内存大小。单位:MB。 + - **SysDiskSpace** (int) - 系统盘大小。单位:GB。 + - **TrafficPacket** (int) - 流量包大小。单位:GB。 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeULHostBundlesRequestSchema().dumps(d) + + resp = self.invoke("DescribeULHostBundles", d, **kwargs) + return apis.DescribeULHostBundlesResponseSchema().loads(resp) + + def describe_ul_host_image( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeULHostImage - 获取指定数据中心镜像列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ImageId** (str) - 镜像Id + - **ImageIds** (list) - 镜像Id列表 + - **ImageType** (str) - 镜像类型。标准镜像:Base,应用镜像:App, 自定义镜像:Custom,默认返回所有类型 + - **Limit** (int) - 返回数据长度,默认为20 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **OsType** (str) - 操作系统类型:Linux, Windows 默认返回所有类型 + - **Scene** (str) - 使用场景,当ImageType为"App"时生效。- Normal 常规专区- CrossBorder 跨境专区默认返回所有 + - **Tag** (str) - 业务组Id。默认:Default + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **ImageSet** (list) - 见 **ULHostImageSet** 模型定义 + - **TotalCount** (int) - 满足条件的镜像总数 + + **Response Model** + + **ULHostImageSet** + - **CreateTime** (int) - 创建时间,格式为Unix时间戳 + - **DisplayName** (str) - 用于控制台显示的名称 + - **Features** (list) - 特殊状态标识,目前包含NetEnhnced(网络增强1.0), NetEnhanced_Ultra(网络增强2.0), NetEnhanced_Extreme(网络增强3.0), HotPlug(热升级), GPU(GPU镜像),CloudInit, IPv6(支持IPv6网络),RssdAttachable(支持RSSD云盘),Vgpu_AMD(支持AMD的vgpu),Vgpu_NVIDIA(支持NVIDIA的vgpu),Aarch64_Type(支持arm64架构) + - **ImageDescription** (str) - 镜像描述 + - **ImageId** (str) - 镜像ID + - **ImageLogoLink** (str) - 应用镜像图标url + - **ImageName** (str) - 镜像名称 + - **ImageSize** (int) - 镜像大小 + - **ImageType** (str) - 镜像类型 标准镜像:Base, 行业镜像:Business,自定义镜像:Custom + - **IntegratedSoftware** (str) - 集成软件名称(仅行业镜像将返回这个值) + - **MaintainEol** (str) - 系统EOL的时间,格式:YYYY/MM/DD + - **MinimalCPU** (str) - 默认值为空'''。当CentOS 7.3/7.4/7.5等镜像会标记为“Broadwell” + - **OsName** (str) - 操作系统名称 + - **OsType** (str) - 操作系统类型:Linux,Windows + - **SceneCategories** (list) - 场景分类,目前包含Featured(精选),PreInstalledDrivers(预装驱动),AIPainting(AI绘画),AIModels(AI模型),HPC(高性能计算) + - **State** (str) - 镜像状态, 可用:Available,制作中:Making, 不可用:Unavailable,复制中:Copying + - **Tag** (str) - 业务组 + - **Zone** (str) - 可用区,参见 `可用区列表 `_ + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeULHostImageRequestSchema().dumps(d) + + resp = self.invoke("DescribeULHostImage", d, **kwargs) + return apis.DescribeULHostImageResponseSchema().loads(resp) + + def describe_ul_host_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeULHostInstance - 获取轻量应用云主机列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - 返回数据长度,默认为20,最大100 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **ULHostIds** (list) - 【数组】轻量应用云主机ID。 + + **Response** + + - **Message** (str) - 错误信息 + - **ULHostInstanceSets** (list) - 见 **ULHostInstanceSet** 模型定义 + + **Response Model** + + **ExclusiveUTPInfo** + - **AvailableSize** (int) - 当前周期剩余流量 + - **CreateTime** (int) - 创建时间 + - **ExcessSize** (int) - 当前周期超出限额的流量 + - **LastResetTime** (int) - 上次重置时间 + - **NextResetTime** (int) - 下次重置时间 + - **TotalSize** (int) - 当前周期总流量 + - **UsedSize** (int) - 当前周期已使用流量 + + + **ULHostDiskSet** + - **DiskId** (str) - 磁盘Id + - **DiskType** (str) - 磁盘类型。如:"CLOUD_RSSD"、"CLOUD_SSD" + - **Drive** (str) - 磁盘盘符。系统盘:"vda" + - **IsBoot** (str) - 是否为系统盘。是:"True";否:"False" + - **Size** (int) - 磁盘大小。单位:GB + - **Type** (str) - 磁盘类型。系统盘:"Boot";数据盘:"Data" + + + **UHostIPSet** + - **Bandwidth** (int) - IP对应的带宽, 单位: Mb (内网IP不显示带宽信息) + - **Default** (str) - 内网 Private 类型下,表示是否为默认网卡。true: 是默认网卡;其他值:不是。 + - **IP** (str) - IP地址 + - **IPId** (str) - 外网IP资源ID 。(内网IP无对应的资源ID) + - **IPMode** (str) - IPv4/IPv6; + - **Mac** (str) - 内网 Private 类型下,当前网卡的Mac。 + - **NetworkInterfaceId** (str) - 弹性网卡为默认网卡时,返回对应的 ID 值 + - **SubnetId** (str) - IP地址对应的子网 ID。(北京一不支持,字段返回为空) + - **Type** (str) - 国际: Internation,BGP: Bgp,内网: Private + - **VPCId** (str) - IP地址对应的VPC ID。(北京一不支持,字段返回为空) + - **Weight** (int) - 当前EIP的权重。权重最大的为当前的出口IP。 + + + **ULHostInstanceSet** + - **Apps** (list) - 【数组】镜像包含的应用列表。 + - **AutoRenew** (str) - 是否自动续费。枚举值:Yes/No + - **CPU** (int) - CPU核数。 + - **ChargeType** (str) - 计费模式。枚举值:Month/Year + - **CreateTime** (int) - 创建时间。Unix时间戳 + - **DiskSet** (list) - 见 **ULHostDiskSet** 模型定义 + - **EIPExclusiveUTPInfo** (dict) - 见 **ExclusiveUTPInfo** 模型定义 + - **ExpireTime** (int) - 过期时间。Unix时间戳 + - **IPSet** (list) - 见 **UHostIPSet** 模型定义 + - **ImageId** (str) - 镜像Id。 + - **ImageName** (str) - 镜像名称。 + - **IsExpire** (str) - 是否过期。枚举值:Yes/No + - **Memory** (int) - 内存。单位:MB + - **Name** (str) - 实例名称。默认套餐Id + - **Remark** (str) - 备注。 + - **State** (str) - 实例状态。枚举值:\\ >初始化: Initializing; \\ >启动中: Starting; \\> 运行中: Running; \\> 关机中: Stopping; \\ >关机: Stopped \\ >安装失败: Install Fail; \\ >重启中: Rebooting; \\ > 未知(空字符串,获取状态超时或出错):"" + - **Tag** (str) - 业务组。 + - **ULHostId** (str) - 实例Id。 + - **Zone** (str) - 可用区。 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeULHostInstanceRequestSchema().dumps(d) + + resp = self.invoke("DescribeULHostInstance", d, **kwargs) + return apis.DescribeULHostInstanceResponseSchema().loads(resp) + + def get_ul_host_instance_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetULHostInstancePrice - 获取轻量应用云主机套餐价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BundleId** (str) - (Required) 套餐ID + - **ChargeType** (str) - 获取指定计费模式的价格。枚举值:\\ > Year,按年付费; \\ > Month。未指定时,返回所有计费模式价格 + - **Count** (int) - 购买台数,范围[1,5]。默认:1 + - **Quantity** (int) - 购买时长。默认: 1。不支持购买到月末 + + **Response** + + - **Message** (str) - 错误信息 + - **PriceSet** (list) - 见 **ULHostPriceSet** 模型定义 + + **Response Model** + + **ULHostPriceSet** + - **ChargeType** (str) - 计费模式 + - **OriginalPrice** (float) - 原价 + - **Price** (float) - 价格 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetULHostInstancePriceRequestSchema().dumps(d) + + resp = self.invoke("GetULHostInstancePrice", d, **kwargs) + return apis.GetULHostInstancePriceResponseSchema().loads(resp) + + def get_ul_host_renew_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetULHostRenewPrice - 获取主机续费价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ULHostId** (str) - (Required) ULHost实例ID + - **ChargeType** (str) - 计费类型。支持:Year/Month;默认:Month + + **Response** + + - **PriceSet** (list) - 见 **ULHostPriceSet** 模型定义 + + **Response Model** + + **ULHostPriceSet** + - **ChargeType** (str) - 计费模式 + - **OriginalPrice** (float) - 原价 + - **Price** (float) - 价格 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetULHostRenewPriceRequestSchema().dumps(d) + + resp = self.invoke("GetULHostRenewPrice", d, **kwargs) + return apis.GetULHostRenewPriceResponseSchema().loads(resp) + + def modify_ul_host_attribute( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyULHostAttribute - 修改指定ULHost实例属性信息,包含名称和备注 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ULHostId** (str) - (Required) ULHost实例Id + - **Name** (str) - 名称。和Remark至少选择一个进行修改 + - **Remark** (str) - 备注。和Name至少选择一个进行修改 + + **Response** + + - **Message** (str) - 错误信息 + - **ULHostId** (str) - ULHost实例Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyULHostAttributeRequestSchema().dumps(d) + + resp = self.invoke("ModifyULHostAttribute", d, **kwargs) + return apis.ModifyULHostAttributeResponseSchema().loads(resp) + + def poweroff_ul_host_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """PoweroffULHostInstance - 直接关闭UHost实例电源,无需等待实例正常关闭。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ULHostId** (str) - (Required) ULHost实例ID + + **Response** + + - **ULHostId** (str) - ULHost实例ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.PoweroffULHostInstanceRequestSchema().dumps(d) + + resp = self.invoke("PoweroffULHostInstance", d, **kwargs) + return apis.PoweroffULHostInstanceResponseSchema().loads(resp) + + def reboot_ul_host_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RebootULHostInstance - 重新启动UHost实例。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ULHostId** (str) - (Required) ULHost实例ID + + **Response** + + - **ULHostId** (str) - ULHost实例ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.RebootULHostInstanceRequestSchema().dumps(d) + + resp = self.invoke("RebootULHostInstance", d, **kwargs) + return apis.RebootULHostInstanceResponseSchema().loads(resp) + + def reinstall_ul_host_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ReinstallULHostInstance - 重装轻量应用云主机 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ImageId** (str) - (Required) 镜像Id。暂不支持使用自定义镜像重装 + - **Password** (str) - (Required) 登陆密码。密码需使用base64进行编码,举例如下:# echo -n Password1 | base64 UGFzc3dvcmQx + - **ULHostId** (str) - (Required) 实例Id + + **Response** + + - **Message** (str) - 错误信息 + - **ULHostId** (str) - 实例Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ReinstallULHostInstanceRequestSchema().dumps(d) + + resp = self.invoke("ReinstallULHostInstance", d, **kwargs) + return apis.ReinstallULHostInstanceResponseSchema().loads(resp) + + def reset_ul_host_instance_password( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ResetULHostInstancePassword - 重置轻量应用云主机管理员密码。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Password** (str) - (Required) ULHost新密码(密码格式使用BASE64编码) + - **ULHostId** (str) - (Required) ULHost实例ID + + **Response** + + - **ULHostId** (str) - ULHost实例ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ResetULHostInstancePasswordRequestSchema().dumps(d) + + resp = self.invoke("ResetULHostInstancePassword", d, **kwargs) + return apis.ResetULHostInstancePasswordResponseSchema().loads(resp) + + def start_ul_host_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """StartULHostInstance - 启动处于关闭状态的UHost实例。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ULHostId** (str) - (Required) ULHost实例ID + + **Response** + + - **ULHostId** (str) - ULHost实例ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.StartULHostInstanceRequestSchema().dumps(d) + + resp = self.invoke("StartULHostInstance", d, **kwargs) + return apis.StartULHostInstanceResponseSchema().loads(resp) + + def stop_ul_host_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """StopULHostInstance - 指停止处于运行状态的ULHost实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ULHostId** (str) - (Required) ULHost实例ID。 + + **Response** + + - **ULHostId** (str) - ULHost实例ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.StopULHostInstanceRequestSchema().dumps(d) + + resp = self.invoke("StopULHostInstance", d, **kwargs) + return apis.StopULHostInstanceResponseSchema().loads(resp) + + def terminate_ul_host_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """TerminateULHostInstance - 删除指定数据中心的ULHost实例。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ULHostId** (str) - (Required) ULHost资源Id + - **ReleaseUDisk** (bool) - 删除主机时是否同时删除挂载的数据盘。默认为false。 + + **Response** + + - **InRecycle** (str) - 用于判断主机删除时是否进入回收站。放入回收站:"Yes", 彻底删除:“No”。 + - **ULHostId** (str) - ULHost 实例 Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.TerminateULHostInstanceRequestSchema().dumps(d) + + resp = self.invoke("TerminateULHostInstance", d, **kwargs) + return apis.TerminateULHostInstanceResponseSchema().loads(resp) diff --git a/ucloud/services/ulighthost/schemas/__init__.py b/ucloud/services/ulighthost/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/ulighthost/schemas/apis.py b/ucloud/services/ulighthost/schemas/apis.py new file mode 100644 index 00000000..93bcc594 --- /dev/null +++ b/ucloud/services/ulighthost/schemas/apis.py @@ -0,0 +1,445 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.ulighthost.schemas import models + +""" ULightHost API Schema +""" + + +""" +API: CheckULHostResourceCapacity + +检查轻量应用云主机资源余量 +""" + + +class CheckULHostResourceCapacityRequestSchema(schema.RequestSchema): + """CheckULHostResourceCapacity - 检查轻量应用云主机资源余量""" + + fields = { + "BundleId": fields.Str(required=True, dump_to="BundleId"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "ImageId": fields.Str(required=True, dump_to="ImageId"), + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "SecurityGroupId": fields.Str( + required=False, dump_to="SecurityGroupId" + ), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + } + + +class CheckULHostResourceCapacityResponseSchema(schema.ResponseSchema): + """CheckULHostResourceCapacity - 检查轻量应用云主机资源余量""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "ResourceEnough": fields.Bool( + required=True, load_from="ResourceEnough" + ), + } + + +""" +API: CreateULHostInstance + +创建轻量应用云主机 +""" + + +class CreateULHostInstanceRequestSchema(schema.RequestSchema): + """CreateULHostInstance - 创建轻量应用云主机""" + + fields = { + "BundleId": fields.Str(required=True, dump_to="BundleId"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "ImageId": fields.Str(required=True, dump_to="ImageId"), + "Name": fields.Str(required=False, dump_to="Name"), + "Password": fields.Str(required=True, dump_to="Password"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "SecurityGroupId": fields.Str( + required=False, dump_to="SecurityGroupId" + ), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + } + + +class CreateULHostInstanceResponseSchema(schema.ResponseSchema): + """CreateULHostInstance - 创建轻量应用云主机""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "ULHostId": fields.Str(required=True, load_from="ULHostId"), + } + + +""" +API: DescribeULHostBundles + +获取轻量应用云主机套餐列表 +""" + + +class DescribeULHostBundlesRequestSchema(schema.RequestSchema): + """DescribeULHostBundles - 获取轻量应用云主机套餐列表""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DescribeULHostBundlesResponseSchema(schema.ResponseSchema): + """DescribeULHostBundles - 获取轻量应用云主机套餐列表""" + + fields = { + "Bundles": fields.List( + models.BundleSchema(), required=True, load_from="Bundles" + ), + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: DescribeULHostImage + +获取指定数据中心镜像列表 +""" + + +class DescribeULHostImageRequestSchema(schema.RequestSchema): + """DescribeULHostImage - 获取指定数据中心镜像列表""" + + fields = { + "ImageId": fields.Str(required=False, dump_to="ImageId"), + "ImageIds": fields.List(fields.Str()), + "ImageType": fields.Str(required=False, dump_to="ImageType"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "OsType": fields.Str(required=False, dump_to="OsType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Scene": fields.Str(required=False, dump_to="Scene"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DescribeULHostImageResponseSchema(schema.ResponseSchema): + """DescribeULHostImage - 获取指定数据中心镜像列表""" + + fields = { + "ImageSet": fields.List( + models.ULHostImageSetSchema(), required=False, load_from="ImageSet" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeULHostInstance + +获取轻量应用云主机列表 +""" + + +class DescribeULHostInstanceRequestSchema(schema.RequestSchema): + """DescribeULHostInstance - 获取轻量应用云主机列表""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ULHostIds": fields.List(fields.Str()), + } + + +class DescribeULHostInstanceResponseSchema(schema.ResponseSchema): + """DescribeULHostInstance - 获取轻量应用云主机列表""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "ULHostInstanceSets": fields.List( + models.ULHostInstanceSetSchema(), + required=True, + load_from="ULHostInstanceSets", + ), + } + + +""" +API: GetULHostInstancePrice + +获取轻量应用云主机套餐价格 +""" + + +class GetULHostInstancePriceRequestSchema(schema.RequestSchema): + """GetULHostInstancePrice - 获取轻量应用云主机套餐价格""" + + fields = { + "BundleId": fields.Str(required=True, dump_to="BundleId"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "Count": fields.Int(required=False, dump_to="Count"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class GetULHostInstancePriceResponseSchema(schema.ResponseSchema): + """GetULHostInstancePrice - 获取轻量应用云主机套餐价格""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "PriceSet": fields.List( + models.ULHostPriceSetSchema(), required=True, load_from="PriceSet" + ), + } + + +""" +API: GetULHostRenewPrice + +获取主机续费价格 +""" + + +class GetULHostRenewPriceRequestSchema(schema.RequestSchema): + """GetULHostRenewPrice - 获取主机续费价格""" + + fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ULHostId": fields.Str(required=True, dump_to="ULHostId"), + } + + +class GetULHostRenewPriceResponseSchema(schema.ResponseSchema): + """GetULHostRenewPrice - 获取主机续费价格""" + + fields = { + "PriceSet": fields.List( + models.ULHostPriceSetSchema(), required=True, load_from="PriceSet" + ), + } + + +""" +API: ModifyULHostAttribute + +修改指定ULHost实例属性信息,包含名称和备注 +""" + + +class ModifyULHostAttributeRequestSchema(schema.RequestSchema): + """ModifyULHostAttribute - 修改指定ULHost实例属性信息,包含名称和备注""" + + fields = { + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "ULHostId": fields.Str(required=True, dump_to="ULHostId"), + } + + +class ModifyULHostAttributeResponseSchema(schema.ResponseSchema): + """ModifyULHostAttribute - 修改指定ULHost实例属性信息,包含名称和备注""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "ULHostId": fields.Str(required=True, load_from="ULHostId"), + } + + +""" +API: PoweroffULHostInstance + +直接关闭UHost实例电源,无需等待实例正常关闭。 +""" + + +class PoweroffULHostInstanceRequestSchema(schema.RequestSchema): + """PoweroffULHostInstance - 直接关闭UHost实例电源,无需等待实例正常关闭。""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ULHostId": fields.Str(required=True, dump_to="ULHostId"), + } + + +class PoweroffULHostInstanceResponseSchema(schema.ResponseSchema): + """PoweroffULHostInstance - 直接关闭UHost实例电源,无需等待实例正常关闭。""" + + fields = { + "ULHostId": fields.Str(required=True, load_from="ULHostId"), + } + + +""" +API: RebootULHostInstance + +重新启动UHost实例。 +""" + + +class RebootULHostInstanceRequestSchema(schema.RequestSchema): + """RebootULHostInstance - 重新启动UHost实例。""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ULHostId": fields.Str(required=True, dump_to="ULHostId"), + } + + +class RebootULHostInstanceResponseSchema(schema.ResponseSchema): + """RebootULHostInstance - 重新启动UHost实例。""" + + fields = { + "ULHostId": fields.Str(required=False, load_from="ULHostId"), + } + + +""" +API: ReinstallULHostInstance + +重装轻量应用云主机 +""" + + +class ReinstallULHostInstanceRequestSchema(schema.RequestSchema): + """ReinstallULHostInstance - 重装轻量应用云主机""" + + fields = { + "ImageId": fields.Str(required=True, dump_to="ImageId"), + "Password": fields.Str(required=True, dump_to="Password"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ULHostId": fields.Str(required=True, dump_to="ULHostId"), + } + + +class ReinstallULHostInstanceResponseSchema(schema.ResponseSchema): + """ReinstallULHostInstance - 重装轻量应用云主机""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "ULHostId": fields.Str(required=True, load_from="ULHostId"), + } + + +""" +API: ResetULHostInstancePassword + +重置轻量应用云主机管理员密码。 +""" + + +class ResetULHostInstancePasswordRequestSchema(schema.RequestSchema): + """ResetULHostInstancePassword - 重置轻量应用云主机管理员密码。""" + + fields = { + "Password": fields.Str(required=True, dump_to="Password"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ULHostId": fields.Str(required=True, dump_to="ULHostId"), + } + + +class ResetULHostInstancePasswordResponseSchema(schema.ResponseSchema): + """ResetULHostInstancePassword - 重置轻量应用云主机管理员密码。""" + + fields = { + "ULHostId": fields.Str(required=True, load_from="ULHostId"), + } + + +""" +API: StartULHostInstance + +启动处于关闭状态的UHost实例。 +""" + + +class StartULHostInstanceRequestSchema(schema.RequestSchema): + """StartULHostInstance - 启动处于关闭状态的UHost实例。""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ULHostId": fields.Str(required=True, dump_to="ULHostId"), + } + + +class StartULHostInstanceResponseSchema(schema.ResponseSchema): + """StartULHostInstance - 启动处于关闭状态的UHost实例。""" + + fields = { + "ULHostId": fields.Str(required=False, load_from="ULHostId"), + } + + +""" +API: StopULHostInstance + +指停止处于运行状态的ULHost实例 +""" + + +class StopULHostInstanceRequestSchema(schema.RequestSchema): + """StopULHostInstance - 指停止处于运行状态的ULHost实例""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ULHostId": fields.Str(required=True, dump_to="ULHostId"), + } + + +class StopULHostInstanceResponseSchema(schema.ResponseSchema): + """StopULHostInstance - 指停止处于运行状态的ULHost实例""" + + fields = { + "ULHostId": fields.Str(required=False, load_from="ULHostId"), + } + + +""" +API: TerminateULHostInstance + +删除指定数据中心的ULHost实例。 +""" + + +class TerminateULHostInstanceRequestSchema(schema.RequestSchema): + """TerminateULHostInstance - 删除指定数据中心的ULHost实例。""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ReleaseUDisk": fields.Bool(required=False, dump_to="ReleaseUDisk"), + "ULHostId": fields.Str(required=True, dump_to="ULHostId"), + } + + +class TerminateULHostInstanceResponseSchema(schema.ResponseSchema): + """TerminateULHostInstance - 删除指定数据中心的ULHost实例。""" + + fields = { + "InRecycle": fields.Str(required=True, load_from="InRecycle"), + "ULHostId": fields.Str(required=False, load_from="ULHostId"), + } diff --git a/ucloud/services/ulighthost/schemas/models.py b/ucloud/services/ulighthost/schemas/models.py new file mode 100644 index 00000000..59b1781f --- /dev/null +++ b/ucloud/services/ulighthost/schemas/models.py @@ -0,0 +1,133 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class BundleSchema(schema.ResponseSchema): + """Bundle - 轻量应用云主机套餐""" + + fields = { + "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), + "BundleId": fields.Str(required=False, load_from="BundleId"), + "CPU": fields.Int(required=False, load_from="CPU"), + "Memory": fields.Int(required=False, load_from="Memory"), + "SysDiskSpace": fields.Int(required=False, load_from="SysDiskSpace"), + "TrafficPacket": fields.Int(required=False, load_from="TrafficPacket"), + } + + +class ULHostImageSetSchema(schema.ResponseSchema): + """ULHostImageSet - DescribeULHostImage""" + + fields = { + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DisplayName": fields.Str(required=False, load_from="DisplayName"), + "Features": fields.List(fields.Str()), + "ImageDescription": fields.Str( + required=False, load_from="ImageDescription" + ), + "ImageId": fields.Str(required=False, load_from="ImageId"), + "ImageLogoLink": fields.Str(required=False, load_from="ImageLogoLink"), + "ImageName": fields.Str(required=False, load_from="ImageName"), + "ImageSize": fields.Int(required=False, load_from="ImageSize"), + "ImageType": fields.Str(required=False, load_from="ImageType"), + "IntegratedSoftware": fields.Str( + required=False, load_from="IntegratedSoftware" + ), + "MaintainEol": fields.Str(required=False, load_from="MaintainEol"), + "MinimalCPU": fields.Str(required=False, load_from="MinimalCPU"), + "OsName": fields.Str(required=False, load_from="OsName"), + "OsType": fields.Str(required=False, load_from="OsType"), + "SceneCategories": fields.List(fields.Str()), + "State": fields.Str(required=False, load_from="State"), + "Tag": fields.Str(required=False, load_from="Tag"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class UHostIPSetSchema(schema.ResponseSchema): + """UHostIPSet -""" + + fields = { + "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), + "Default": fields.Str(required=False, load_from="Default"), + "IP": fields.Str(required=False, load_from="IP"), + "IPId": fields.Str(required=False, load_from="IPId"), + "IPMode": fields.Str(required=True, load_from="IPMode"), + "Mac": fields.Str(required=False, load_from="Mac"), + "NetworkInterfaceId": fields.Str( + required=False, load_from="NetworkInterfaceId" + ), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "Type": fields.Str(required=False, load_from="Type"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + "Weight": fields.Int(required=False, load_from="Weight"), + } + + +class ExclusiveUTPInfoSchema(schema.ResponseSchema): + """ExclusiveUTPInfo - 流量包详情""" + + fields = { + "AvailableSize": fields.Int(required=False, load_from="AvailableSize"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "ExcessSize": fields.Int(required=False, load_from="ExcessSize"), + "LastResetTime": fields.Int(required=False, load_from="LastResetTime"), + "NextResetTime": fields.Int(required=False, load_from="NextResetTime"), + "TotalSize": fields.Int(required=False, load_from="TotalSize"), + "UsedSize": fields.Int(required=False, load_from="UsedSize"), + } + + +class ULHostDiskSetSchema(schema.ResponseSchema): + """ULHostDiskSet - 轻量应用主机的磁盘信息""" + + fields = { + "DiskId": fields.Str(required=False, load_from="DiskId"), + "DiskType": fields.Str(required=False, load_from="DiskType"), + "Drive": fields.Str(required=False, load_from="Drive"), + "IsBoot": fields.Str(required=False, load_from="IsBoot"), + "Size": fields.Int(required=False, load_from="Size"), + "Type": fields.Str(required=False, load_from="Type"), + } + + +class ULHostInstanceSetSchema(schema.ResponseSchema): + """ULHostInstanceSet - 轻量应用云主机详情""" + + fields = { + "Apps": fields.List(fields.Str()), + "AutoRenew": fields.Str(required=False, load_from="AutoRenew"), + "CPU": fields.Int(required=False, load_from="CPU"), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DiskSet": fields.List(ULHostDiskSetSchema()), + "EIPExclusiveUTPInfo": ExclusiveUTPInfoSchema(), + "ExclusiveUTPInfo": ExclusiveUTPInfoSchema( + required=False, load_from="ExclusiveUTPInfo" + ), # Deprecated, will be removed at 1.0 + "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "IPSet": fields.List(UHostIPSetSchema()), + "ImageId": fields.Str(required=False, load_from="ImageId"), + "ImageName": fields.Str(required=False, load_from="ImageName"), + "IsExpire": fields.Str(required=False, load_from="IsExpire"), + "Memory": fields.Int(required=False, load_from="Memory"), + "Name": fields.Str(required=False, load_from="Name"), + "Remark": fields.Str(required=False, load_from="Remark"), + "State": fields.Str(required=False, load_from="State"), + "Tag": fields.Str(required=False, load_from="Tag"), + "ULHostId": fields.Str(required=False, load_from="ULHostId"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class ULHostPriceSetSchema(schema.ResponseSchema): + """ULHostPriceSet - 轻量应用主机价格详情""" + + fields = { + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "OriginalPrice": fields.Float( + required=False, load_from="OriginalPrice" + ), + "Price": fields.Float(required=False, load_from="Price"), + } diff --git a/ucloud/services/ulogservice/__init__.py b/ucloud/services/ulogservice/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/ulogservice/client.py b/ucloud/services/ulogservice/client.py new file mode 100644 index 00000000..e9de6ba8 --- /dev/null +++ b/ucloud/services/ulogservice/client.py @@ -0,0 +1,266 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.ulogservice.schemas import apis + + +class ULogServiceClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(ULogServiceClient, self).__init__( + config, transport, middleware, logger + ) + + def create_u_log_service_log_set( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateULogServiceLogSet - 创建日志集 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **LogSetName** (str) - (Required) 日志集名称 长度为1~64位 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **LogSetRemark** (str) - 日志集备注 长度为0~255位 + + **Response** + + - **LogSetId** (str) - 日志集资源ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateULogServiceLogSetRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateULogServiceLogSet", d, **kwargs) + return apis.CreateULogServiceLogSetResponseSchema().loads(resp) + + def create_u_log_service_topic( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateULogServiceTopic - 创建ULogService主题 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ReserveAge** (int) - (Required) 保存时间 1~360 天,-1表示永久保存 + - **TopicName** (str) - (Required) 主题名称,校验规则"^[\w]{1,23}$" + - **LogSetId** (str) - 日志集ID + - **TopicShardNum** (int) - 分区数量 数字1~20 + + **Response** + + - **TopicId** (str) - 主题ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateULogServiceTopicRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateULogServiceTopic", d, **kwargs) + return apis.CreateULogServiceTopicResponseSchema().loads(resp) + + def delete_u_log_service_log_set( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteULogServiceLogSet - 删除日志集 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **LogSetId** (str) - (Required) 日志集ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteULogServiceLogSetRequestSchema().dumps(d) + + resp = self.invoke("DeleteULogServiceLogSet", d, **kwargs) + return apis.DeleteULogServiceLogSetResponseSchema().loads(resp) + + def delete_u_log_service_topic( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteULogServiceTopic - 删除ULogService主题 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **TopicId** (str) - (Required) 主题Id + + **Response** + + - **Message** (str) - 错误信息,成功情况下为空字符串 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteULogServiceTopicRequestSchema().dumps(d) + + resp = self.invoke("DeleteULogServiceTopic", d, **kwargs) + return apis.DeleteULogServiceTopicResponseSchema().loads(resp) + + def list_u_log_service_log_set( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListULogServiceLogSet - 查询日志集列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Data** (list) - 见 **LogSetInfo** 模型定义 + + **Response Model** + + **LogSetInfo** + - **CreateTime** (int) - 创建时间 + - **LogSetName** (str) - 日志集名称 + - **LogSetRemark** (str) - 日志集备注 + - **TopicCount** (int) - 日志集下主题数量 + - **UpdateTime** (int) - 更新时间 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListULogServiceLogSetRequestSchema().dumps(d) + + resp = self.invoke("ListULogServiceLogSet", d, **kwargs) + return apis.ListULogServiceLogSetResponseSchema().loads(resp) + + def list_u_log_service_topic( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListULogServiceTopic - 获取ULogService主题 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - 分页限制数,默认为30 + - **Offset** (int) - 分页起始条目数, 默认为0 + + **Response** + + - **Data** (list) - 见 **TopicInfo** 模型定义 + - **TotalCount** (int) - 主题总数 + + **Response Model** + + **TopicInfo** + - **IsReserved** (int) - 是否保留:0 - NORMAL, 1 - RESERVED + - **ReserveAge** (int) - 保存时间 1~360 天,-1表示永久保存 + - **TopicDesc** (str) - 主题描述 + - **TopicId** (str) - 主题ID + - **TopicName** (str) - 主题名称 + - **TopicShardNum** (int) - 分区数量 数字1~20 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListULogServiceTopicRequestSchema().dumps(d) + + resp = self.invoke("ListULogServiceTopic", d, **kwargs) + return apis.ListULogServiceTopicResponseSchema().loads(resp) + + def query_u_log_service_log( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """QueryULogServiceLog - 查询ULogService日志 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **QueryCriteria** (str) - (Required) 查询条件,使用Base64编码。目前只支持查询索引,多个索引查询使用AND。比如:index1:http AND index2:http2 + - **SortOrder** (str) - (Required) 日志时间排序;可选值ASC|DESC + - **TopicId** (str) - (Required) 主题ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **EndTime** (int) - 终止日志时间,秒级时间戳 + - **LastId** (str) - 滚动加载参数,上一页最后一条数据的ID + - **LastTimestamp** (str) - 滚动加载参数,上一页最后一条数据的timestamp + - **ScrollId** (str) - Deprecated. 滚动加载参数ScrollId + - **Size** (int) - 一次返回条数,默认20 + - **StartTime** (int) - 起始日志时间,秒级时间戳 + + **Response** + + - **Data** (dict) - 见 **LogQueryResult** 模型定义 + + **Response Model** + + **LogContent** + - **LogId** (str) - 日志标识ID + - **LogJson** (str) - JSON格式的日志内容 + - **Timestamp** (int) - 日志时间 + + + **LogQueryResult** + - **Contents** (dict) - 见 **LogContent** 模型定义 + - **IsOver** (bool) - 检索结果是否到底 + - **LastId** (str) - 滚动检索,当前页最后一条数据ID + - **LastTimestamp** (str) - 滚动检索,当前页最后一条数据Timestamp + - **ScrollId** (str) - 滚动检索Id Deprecated + - **TopicId** (str) - 所属日志ID + - **TopicName** (str) - 所属日志名称 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.QueryULogServiceLogRequestSchema().dumps(d) + + resp = self.invoke("QueryULogServiceLog", d, **kwargs) + return apis.QueryULogServiceLogResponseSchema().loads(resp) diff --git a/ucloud/services/ulogservice/schemas/__init__.py b/ucloud/services/ulogservice/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/ulogservice/schemas/apis.py b/ucloud/services/ulogservice/schemas/apis.py new file mode 100644 index 00000000..db9f3087 --- /dev/null +++ b/ucloud/services/ulogservice/schemas/apis.py @@ -0,0 +1,201 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.ulogservice.schemas import models + +""" ULogService API Schema +""" + + +""" +API: CreateULogServiceLogSet + +创建日志集 +""" + + +class CreateULogServiceLogSetRequestSchema(schema.RequestSchema): + """CreateULogServiceLogSet - 创建日志集""" + + fields = { + "LogSetName": fields.Str(required=True, dump_to="LogSetName"), + "LogSetRemark": fields.Str(required=False, dump_to="LogSetRemark"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateULogServiceLogSetResponseSchema(schema.ResponseSchema): + """CreateULogServiceLogSet - 创建日志集""" + + fields = { + "LogSetId": fields.Str(required=False, load_from="LogSetId"), + } + + +""" +API: CreateULogServiceTopic + +创建ULogService主题 +""" + + +class CreateULogServiceTopicRequestSchema(schema.RequestSchema): + """CreateULogServiceTopic - 创建ULogService主题""" + + fields = { + "LogSetId": fields.Str(required=False, dump_to="LogSetId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ReserveAge": fields.Int(required=True, dump_to="ReserveAge"), + "TopicName": fields.Str(required=True, dump_to="TopicName"), + "TopicShardNum": fields.Int(required=False, dump_to="TopicShardNum"), + } + + +class CreateULogServiceTopicResponseSchema(schema.ResponseSchema): + """CreateULogServiceTopic - 创建ULogService主题""" + + fields = { + "TopicId": fields.Str(required=False, load_from="TopicId"), + } + + +""" +API: DeleteULogServiceLogSet + +删除日志集 +""" + + +class DeleteULogServiceLogSetRequestSchema(schema.RequestSchema): + """DeleteULogServiceLogSet - 删除日志集""" + + fields = { + "LogSetId": fields.Str(required=True, dump_to="LogSetId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DeleteULogServiceLogSetResponseSchema(schema.ResponseSchema): + """DeleteULogServiceLogSet - 删除日志集""" + + fields = {} + + +""" +API: DeleteULogServiceTopic + +删除ULogService主题 +""" + + +class DeleteULogServiceTopicRequestSchema(schema.RequestSchema): + """DeleteULogServiceTopic - 删除ULogService主题""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "TopicId": fields.Str(required=True, dump_to="TopicId"), + } + + +class DeleteULogServiceTopicResponseSchema(schema.ResponseSchema): + """DeleteULogServiceTopic - 删除ULogService主题""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: ListULogServiceLogSet + +查询日志集列表 +""" + + +class ListULogServiceLogSetRequestSchema(schema.RequestSchema): + """ListULogServiceLogSet - 查询日志集列表""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ListULogServiceLogSetResponseSchema(schema.ResponseSchema): + """ListULogServiceLogSet - 查询日志集列表""" + + fields = { + "Data": fields.List( + models.LogSetInfoSchema(), required=False, load_from="Data" + ), + } + + +""" +API: ListULogServiceTopic + +获取ULogService主题 +""" + + +class ListULogServiceTopicRequestSchema(schema.RequestSchema): + """ListULogServiceTopic - 获取ULogService主题""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class ListULogServiceTopicResponseSchema(schema.ResponseSchema): + """ListULogServiceTopic - 获取ULogService主题""" + + fields = { + "Data": fields.List( + models.TopicInfoSchema(), required=True, load_from="Data" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: QueryULogServiceLog + +查询ULogService日志 +""" + + +class QueryULogServiceLogRequestSchema(schema.RequestSchema): + """QueryULogServiceLog - 查询ULogService日志""" + + fields = { + "EndTime": fields.Int(required=False, dump_to="EndTime"), + "LastId": fields.Str(required=False, dump_to="LastId"), + "LastTimestamp": fields.Str(required=False, dump_to="LastTimestamp"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "QueryCriteria": fields.Str(required=True, dump_to="QueryCriteria"), + "Region": fields.Str(required=True, dump_to="Region"), + "ScrollId": fields.Str(required=False, dump_to="ScrollId"), + "Size": fields.Int(required=False, dump_to="Size"), + "SortOrder": fields.Str(required=True, dump_to="SortOrder"), + "StartTime": fields.Int(required=False, dump_to="StartTime"), + "TopicId": fields.Str(required=True, dump_to="TopicId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class QueryULogServiceLogResponseSchema(schema.ResponseSchema): + """QueryULogServiceLog - 查询ULogService日志""" + + fields = { + "Data": models.LogQueryResultSchema(), + } diff --git a/ucloud/services/ulogservice/schemas/models.py b/ucloud/services/ulogservice/schemas/models.py new file mode 100644 index 00000000..dcf1d0f3 --- /dev/null +++ b/ucloud/services/ulogservice/schemas/models.py @@ -0,0 +1,52 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class LogSetInfoSchema(schema.ResponseSchema): + """LogSetInfo -""" + + fields = { + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "LogSetName": fields.Str(required=False, load_from="LogSetName"), + "LogSetRemark": fields.Str(required=False, load_from="LogSetRemark"), + "TopicCount": fields.Int(required=False, load_from="TopicCount"), + "UpdateTime": fields.Int(required=False, load_from="UpdateTime"), + } + + +class TopicInfoSchema(schema.ResponseSchema): + """TopicInfo - 主题信息""" + + fields = { + "IsReserved": fields.Int(required=False, load_from="IsReserved"), + "ReserveAge": fields.Int(required=False, load_from="ReserveAge"), + "TopicDesc": fields.Str(required=False, load_from="TopicDesc"), + "TopicId": fields.Str(required=False, load_from="TopicId"), + "TopicName": fields.Str(required=False, load_from="TopicName"), + "TopicShardNum": fields.Int(required=False, load_from="TopicShardNum"), + } + + +class LogContentSchema(schema.ResponseSchema): + """LogContent - 日志内容""" + + fields = { + "LogId": fields.Str(required=True, load_from="LogId"), + "LogJson": fields.Str(required=True, load_from="LogJson"), + "Timestamp": fields.Int(required=True, load_from="Timestamp"), + } + + +class LogQueryResultSchema(schema.ResponseSchema): + """LogQueryResult - 日志检索结果""" + + fields = { + "Contents": LogContentSchema(), + "IsOver": fields.Bool(required=True, load_from="IsOver"), + "LastId": fields.Str(required=False, load_from="LastId"), + "LastTimestamp": fields.Str(required=False, load_from="LastTimestamp"), + "ScrollId": fields.Str(required=False, load_from="ScrollId"), + "TopicId": fields.Str(required=True, load_from="TopicId"), + "TopicName": fields.Str(required=True, load_from="TopicName"), + } diff --git a/ucloud/services/umem/client.py b/ucloud/services/umem/client.py index 6846b647..07783b18 100644 --- a/ucloud/services/umem/client.py +++ b/ucloud/services/umem/client.py @@ -13,35 +13,177 @@ def __init__( ): super(UMemClient, self).__init__(config, transport, middleware, logger) + def check_udredis_space_allowance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CheckUDredisSpaceAllowance - 检查高性能UMem剩余资源,以及分片扩容前的资源预检查 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Count** (str) - (Required) 创建实例的数量,[1-10] + - **Size** (int) - (Required) 创建实例的容量大小,,扩容时的分片目标容量大小 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **GroupId** (str) - 资源ID,扩缩容时的必传参数 + + **Response** + + - **Count** (int) - 创建实例资源时,表示可创建的数量;扩容资源时,返回1表示可以扩容,0表示可用区资源不足不能扩容 + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.CheckUDredisSpaceAllowanceRequestSchema().dumps(d) + + resp = self.invoke("CheckUDredisSpaceAllowance", d, **kwargs) + return apis.CheckUDredisSpaceAllowanceResponseSchema().loads(resp) + + def check_uredis_allowance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CheckURedisAllowance - 检查主备Redis的资源是否足够创建新实例,以及主备Redis的扩容资源预检查 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Count** (int) - (Required) 创建实例的数量,[1-10] + - **Size** (int) - (Required) 创建实例的容量大小, 单位:GB 目前仅支持1/2/4/8/16/32六种规格;扩缩容时,表示实例的目标资源大小 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **GroupId** (str) - 资源ID,扩容实例资源时的必传参数 + - **Protocol** (str) - + - **RegionFlag** (bool) - 是否是跨机房URedis(默认false) + - **SlaveZone** (str) - + + **Response** + + - **Count** (int) - 创建实例资源时,表示可创建的数量;扩容资源时,返回1表示可以扩容,0表示可用区资源不足不能扩容 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CheckURedisAllowanceRequestSchema().dumps(d) + + resp = self.invoke("CheckURedisAllowance", d, **kwargs) + return apis.CheckURedisAllowanceResponseSchema().loads(resp) + + def create_scan_hot_big_keys( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateScanHotBigKeys - 创建执行扫大key和热key的任务 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **GroupId** (str) - (Required) 资源id + - **Type** (str) - (Required) 任务类型。"ScanBigKeys":扫大key,"ScanHotKeys":扫热key + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **IsRetry** (bool) - 是否要重试任务,如果是的话,TaskId必填 + - **TaskId** (str) - 要重试的任务id + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateScanHotBigKeysRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateScanHotBigKeys", d, **kwargs) + return apis.CreateScanHotBigKeysResponseSchema().loads(resp) + + def create_umem_backup( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUMemBackup - 创建分布式redis备份 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BackupName** (str) - (Required) 请求创建备份的名称 (范围[6-63],只能包含英文、数字以及符号-和_) + - **SpaceId** (str) - (Required) 资源id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **BackupId** (str) - 备份Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateUMemBackupRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUMemBackup", d, **kwargs) + return apis.CreateUMemBackupResponseSchema().loads(resp) + def create_umem_space( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateUMemSpace - 创建UMem内存空间 + """CreateUMemSpace - 创建UMem内存空间 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Name** (str) - (Required) 空间名称,长度(6<=size<=63) - **Size** (int) - (Required) 内存大小, 单位:GB, 范围[1~1024] - - **ChargeType** (str) - Year , Month, Dynamic, Trial 默认: Month + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **BackupId** (str) - 备份ID,选择从该备份新建集群 + - **BlockCnt** (int) - 分片个数 + - **ChargeType** (str) - Year , Month, Dynamic 默认: Month + - **ClusterMode** (str) - "RWMode":表示创建读写分离版本;其他为创建普通版本 - **CouponId** (str) - 使用的代金券id + - **HighPerformance** (bool) - 是否创建性能增强性。默认为false,或者不填,填true为性能增强型。 - **Password** (str) - URedis密码。请遵照 `字段规范 `_ 设定密码。密码需使用base64进行编码,举例如下:# echo -n Password1 | base64UGFzc3dvcmQx。 + - **Port** (int) - 分片端口, 默认为 6379 - **Protocol** (str) - 协议:memcache, redis (默认redis).注意:redis无single类型 + - **ProxyPort** (int) - 代理端口, 默认为 6379 + - **ProxySize** (int) - 分布式代理CPU核数,不填或者传0时默认不创建代理 - **Quantity** (int) - 购买时长 默认: 1 - - **SubnetId** (str) - - - **Tag** (str) - + - **RollbackSpaceId** (str) - 如果是通过回档创建,该实例ID不为空 + - **RollbackTime** (int) - 要回档的时间戳 + - **SlaveZone** (str) - 跨机房UDRedis,slave所在可用区(必须和Zone在同一Region,且不可相同) + - **SpaceId** (str) - 集群ID,选择某个备份创建时,需要填写源集群ID + - **SubnetId** (str) - 子网ID + - **Tag** (str) - 业务组名称 - **Type** (str) - 空间类型:single(无热备),double(热备)(默认: double) - - **VPCId** (str) - - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **UlbMode** (bool) - 是否创建负载均衡型分布式代理,true时表示创建负载均衡型代理 + - **VPCId** (str) - VPC的ID + - **Version** (str) - 分布式分片版本(默认版本是4.0,其他版本见DescribeUDRedisBlockVersion) + **Response** - **SpaceId** (str) - 创建内存空间ID列表 - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.CreateUMemSpaceRequestSchema().dumps(d) @@ -54,32 +196,35 @@ def create_umem_space( def create_umem_cache_group( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateUMemcacheGroup - 创建单机Memcache + """CreateUMemcacheGroup - 创建单机Memcache **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Name** (str) - (Required) 请求创建组的名称 范围[6-60] - **ChargeType** (str) - 计费模式,Year , Month, Dynamic 默认: Month - **ConfigId** (str) - 配置ID,目前仅支持默认配置id 默认配置id:"9a891891-c245-4b66-bce8-67e59430d67c" - **CouponId** (str) - 代金券ID - - **Protocol** (str) - + - **Protocol** (str) - - **Quantity** (int) - 购买时长,默认为1 - **Size** (int) - 每个节点的内存大小,单位GB,默认1GB 目前仅支持1/2/4/8/16/32这几档 - - **SubnetId** (str) - + - **SubnetId** (str) - - **Tag** (str) - 业务组 默认:Default - - **VPCId** (str) - + - **VPCId** (str) - - **Version** (str) - Memcache版本信息,默认为1.4.31 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **GroupId** (str) - 创建的组ID - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.CreateUMemcacheGroupRequestSchema().dumps(d) @@ -89,41 +234,83 @@ def create_umem_cache_group( resp = self.invoke("CreateUMemcacheGroup", d, **kwargs) return apis.CreateUMemcacheGroupResponseSchema().loads(resp) + def create_uredis_backup( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateURedisBackup - 创建主备Redis备份 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BackupName** (str) - (Required) 请求创建组的名称 (范围[6-63],只能包含英文、数字以及符号-和_) + - **GroupId** (str) - (Required) 资源id + - **SlaveZone** (str) - 跨机房URedis,slave所在可用区(必须和Zone在同一Region,且不可相同) + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **BackupId** (str) - 备份id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateURedisBackupRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateURedisBackup", d, **kwargs) + return apis.CreateURedisBackupResponseSchema().loads(resp) + def create_uredis_group( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateURedisGroup - 创建主备redis + """CreateURedisGroup - 创建主备redis **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **HighAvailability** (str) - (Required) 是否开启高可用,enable或disable - **Name** (str) - (Required) 请求创建组的名称 (范围[6-63],只能包含英文、数字以及符号-和_) - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **AOFID** (str) - 回档的AOF文件ID - **AutoBackup** (str) - 是否自动备份,enable或disable,默认disable - **BackupId** (str) - 有此项代表从备份中创建,无代表正常创建 - **BackupTime** (int) - 自动备份开始时间,范围[0-23],默认3点 - **ChargeType** (str) - 计费模式,Year , Month, Dynamic 默认: Month - - **ConfigId** (str) - 配置ID,目前支持 3.0版本配置ID:"03f58ca9-b64d-4bdd-abc7-c6b9a46fd801",3.2版本配置ID:"3e45ac48-f8a2-a9q2-261d-l342dab130gf", 4.0版本配置ID:"6c9298a3-9d7f-428c-b1d0-e87ab3b8a1ea",默认版本3.0,从备份创建为必传项 + - **ConfigId** (str) - 配置ID,目前支持 4.0版本配置ID:"6c9298a3-9d7f-428c-b1d0-e87ab3b8a1ea", 5.0版本配置ID:"3cdeeb90-dcbf-46e8-95cd-a05d8860a22c",6.0版本配置ID:"1d990520-aac8-4e0f-9384-f58611e8eb28",7.0版本配置ID:"48dcf534-db41-11ec-a1a6-52670028d520",默认版本4.0,从备份创建为必传项 - **CouponId** (str) - 代金券ID + - **EnableIpV6** (bool) - 【即将下线,请勿使用】是否创建使用ipv6 资源, 默认为false, 或者不填, 创建ipv6为true + - **HighPerformance** (bool) - 是否创建高性能Redis, 默认为false, 或者不填, 创建高性能为true - **MasterGroupId** (str) - Master Redis Group的ID,创建只读Slave时,必须填写 - **Password** (str) - 初始化密码,需要 base64 编码 + - **Port** (int) - 端口 - **Quantity** (int) - 购买时长,默认为1 + - **RollbackGroupId** (str) - 如果是通过回档创建实例,需要传回档实例的GroupId + - **RollbackTime** (int) - 回档时间点 - **Size** (int) - 每个节点的内存大小,单位GB,默认1GB,目前仅支持1/2/4/8/16/32,六种 - **SlaveZone** (str) - 跨机房URedis,slave所在可用区(必须和Zone在同一Region,且不可相同) - - **SubnetId** (str) - + - **SubnetId** (str) - 子网ID - **Tag** (str) - 业务组名称 - - **VPCId** (str) - - - **Version** (str) - Redis版本信息(详见DescribeURedisVersion返回结果),默认版本3.0 - + - **VPCId** (str) - VPC的ID + - **Version** (str) - Redis版本信息(详见DescribeURedisVersion返回结果),默认版本4.0 + **Response** - **GroupId** (str) - 创建的组ID - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.CreateURedisGroupRequestSchema().dumps(d) @@ -136,21 +323,24 @@ def create_uredis_group( def delete_umem_space( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeleteUMemSpace - 删除UMem内存空间 + """DeleteUMemSpace - 删除UMem内存空间 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **SpaceId** (str) - (Required) UMem内存空间ID - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DeleteUMemSpaceRequestSchema().dumps(d) @@ -160,21 +350,24 @@ def delete_umem_space( def delete_umem_cache_group( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeleteUMemcacheGroup - 删除单机Memcache + """DeleteUMemcacheGroup - 删除单机Memcache **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **GroupId** (str) - (Required) 组ID - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DeleteUMemcacheGroupRequestSchema().dumps(d) @@ -184,57 +377,360 @@ def delete_umem_cache_group( def delete_uredis_group( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeleteURedisGroup - 删除主备redis + """DeleteURedisGroup - 删除主备redis **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **GroupId** (str) - (Required) 组ID - + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DeleteURedisGroupRequestSchema().dumps(d) resp = self.invoke("DeleteURedisGroup", d, **kwargs) return apis.DeleteURedisGroupResponseSchema().loads(resp) + def describe_ud_redis_proxy_info( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUDRedisProxyInfo - 拉取udredis所有的代理信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SpaceId** (str) - (Required) udredis实例id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **DataSet** (list) - 见 **UDRedisProxyInfo** 模型定义 + + **Response Model** + + **UDRedisProxyInfo** + - **ProxyId** (str) - 代理id + - **ResourceId** (str) - 代理资源id + - **State** (str) - 代理状态 + - **Vip** (str) - 代理ip + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUDRedisProxyInfoRequestSchema().dumps(d) + + resp = self.invoke("DescribeUDRedisProxyInfo", d, **kwargs) + return apis.DescribeUDRedisProxyInfoResponseSchema().loads(resp) + + def describe_ud_redis_slowlog( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUDRedisSlowlog - 查询UDRedis慢日志 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceId** (str) - (Required) 实例id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Limit** (int) - 分页显示的条目数,默认为10 + - **ProxyId** (str) - 代理Id + + **Response** + + - **DataSet** (list) - 见 **UDRedisSlowlogSet** 模型定义 + - **TotalCount** (int) - 总条目数 + + **Response Model** + + **UDRedisSlowlogSet** + - **BlockId** (str) - 分片id + - **Client** (str) - 慢日志的的客户信息 + - **Command** (str) - 查询命令 + - **SpendTime** (int) - 查询消耗的时间 + - **StartTime** (int) - 查询发生的时间 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUDRedisSlowlogRequestSchema().dumps(d) + + resp = self.invoke("DescribeUDRedisSlowlog", d, **kwargs) + return apis.DescribeUDRedisSlowlogResponseSchema().loads(resp) + + def describe_umem( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUMem - 获取UMem列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Protocol** (str) - (Required) 协议类型: memcache, redis + - **Limit** (int) - 分页显示的条目数, 默认值为20 + - **Offset** (int) - 分页显示的起始偏移, 默认值为0 + - **ResourceId** (str) - 资源ID + - **ResourceType** (str) - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **DataSet** (list) - 见 **UMemDataSet** 模型定义 + - **TotalCount** (int) - 根据过滤条件得到的总数 + + **Response Model** + + **UMemDataSet** + - **Address** (list) - 见 **UMemSpaceAddressSet** 模型定义 + - **AutoBackup** (str) - 是否需要自动备份,enable,disable + - **BackupTime** (int) - 自动备份开始时间,单位小时计,范围[0-23] + - **ChargeType** (str) - 计费模式,Year, Month, Dynamic, Trial + - **ConfigId** (str) - 节点的配置ID + - **CreateTime** (int) - 创建时间 + - **DataSet** (list) - 见 **UMemSlaveDataSet** 模型定义 + - **ExpireTime** (int) - 到期时间 + - **HighAvailability** (str) - 是否开启高可用,enable,disable + - **Name** (str) - 资源名称 + - **OwnSlave** (str) - 是否拥有只读Slave“Yes” 包含“No” 不包含 + - **Protocol** (str) - 协议类型: memcache, redis + - **ResourceId** (str) - 资源ID + - **ResourceType** (str) - distributed: 分布式版Redis,或者分布式Memcache;single:主备版Redis,或者单机Memcache;performance:高性能版 + - **RewriteTime** (int) - 主备redis和分布式redis运维时间0 //0点1 //1点以此类推单机版memcache不返回该项 + - **Role** (str) - 表示实例是主库还是从库,master,slave仅主备redis返回该项参数 + - **Size** (int) - 容量单位GB + - **SlaveZone** (str) - 跨机房URedis,slave redis所在可用区,参见 `可用区列表 `_ + - **State** (str) - 实例状态 Starting // 创建中 Creating // 初始化中 CreateFail // 创建失败 Fail // 创建失败 Deleting // 删除中 DeleteFail // 删除失败 Running // 运行 Resizing // 容量调整中 ResizeFail // 容量调整失败 Configing // 配置中 ConfigFail // 配置失败Restarting // 重启中SetPasswordFail //设置密码失败 + - **SubnetId** (str) - 子网 + - **Tag** (str) - 业务组名称 + - **Type** (str) - 空间类型:single(无热备),double(热备) + - **UsedSize** (int) - 使用量单位MB + - **VPCId** (str) - vpc + - **Version** (str) - Redis版本信息 + - **Zone** (str) - 实例所在可用区,或者master redis所在可用区,参见 `可用区列表 `_ + + + **UMemSpaceAddressSet** + - **IP** (str) - UMem实例访问IP + - **Port** (int) - UMem实例访问Port + + + **UMemSlaveDataSet** + - **ChargeType** (str) - 计费模式,Year, Month, Dynamic, Trial + - **ConfigId** (str) - 节点的配置ID + - **CreateTime** (int) - 创建时间 + - **ExpireTime** (int) - 到期时间 + - **GroupId** (str) - 资源id + - **GroupName** (str) - 资源名称 + - **MasterGroupId** (str) - 主实例id + - **MemorySize** (int) - 实力大小 + - **ModifyTime** (int) - 修改时间 + - **Name** (str) - 资源名称 + - **Port** (int) - 端口 + - **ResourceType** (str) - distributed: 分布式版Redis,或者分布式Memcache;single:主备版Redis,或者单机Memcache;performance:高性能版 + - **RewriteTime** (int) - 主备Redis返回运维时间 0//0点 1 //1点 以此类推 + - **Role** (str) - 表示实例是主库还是从库,master,slave + - **Size** (int) - 容量单位GB + - **State** (str) - 实例状态 Starting // 创建中 Creating // 初始化中 CreateFail // 创建失败 Fail // 创建失败 Deleting // 删除中 DeleteFail // 删除失败 Running // 运行 Resizing // 容量调整中 ResizeFail // 容量调整失败 Configing // 配置中 ConfigFail // 配置失败Restarting // 重启中SetPasswordFail //设置密码失败 + - **SubnetId** (str) - 子网 + - **Tag** (str) - 业务组名称 + - **UsedSize** (int) - 使用量单位MB + - **VPCId** (str) - vpc + - **Version** (str) - Redis版本信息 + - **VirtualIP** (str) - + - **Zone** (str) - 实例所在可用区,或者master redis所在可用区,参见 `可用区列表 `_ + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUMemRequestSchema().dumps(d) + + resp = self.invoke("DescribeUMem", d, **kwargs) + return apis.DescribeUMemResponseSchema().loads(resp) + + def describe_umem_backup( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUMemBackup - 查询分布式redis备份 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SpaceId** (str) - (Required) 资源id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Limit** (int) - 分页显示的条目数, 默认值为10 + - **Offset** (int) - 分页显示的起始偏移, 默认值为0 + + **Response** + + - **DataSet** (list) - 见 **UMemBackupSet** 模型定义 + - **TotalCount** (int) - 备份总数 + + **Response Model** + + **UMemBackupSet** + - **BackupId** (str) - 空间的备份ID + - **BackupName** (str) - 备份名称 + - **BackupType** (str) - 备份类型: auto(自动) ,manual(手动) + - **BlockCount** (int) - 本次备份,分片的数量 + - **BlockSize** (int) - 备份大小 + - **CreateTime** (int) - 创建时间 + - **State** (str) - Starting:备份中 Done:完成 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUMemBackupRequestSchema().dumps(d) + + resp = self.invoke("DescribeUMemBackup", d, **kwargs) + return apis.DescribeUMemBackupResponseSchema().loads(resp) + + def describe_umem_backup_url( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUMemBackupURL - 获取分布式redis 备份下载链接 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BackupId** (str) - (Required) 备份Id + - **SpaceId** (str) - (Required) 资源id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **BlockId** (str) - 分片id + + **Response** + + - **BackupURL** (list) - 备份url,每个分片一个下载URL + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUMemBackupURLRequestSchema().dumps(d) + + resp = self.invoke("DescribeUMemBackupURL", d, **kwargs) + return apis.DescribeUMemBackupURLResponseSchema().loads(resp) + + def describe_umem_block_info( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUMemBlockInfo - 拉取UDRedis分片信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - (Required) 分页显示的条目数, 默认值为10 + - **Offset** (int) - (Required) 分页显示的起始偏移, 默认值为0 + - **SpaceId** (str) - (Required) UMem内存资源ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **DataSet** (list) - 见 **UMemBlockInfo** 模型定义 + - **ReadMode** (str) - 集群读写分离策略。 枚举值[ "Custom": 用户自定义节点权重, "Uniform": 包括主节点在内的所有节点平均读请求, "ReadOnly": 读请求均分至只读节点] + + **Response Model** + + **UMemBlockInfo** + - **BlockId** (str) - 分片id + - **BlockName** (str) - 分片名称 + - **BlockPort** (int) - 分片端口 + - **BlockReadWeight** (int) - 分片读权重 + - **BlockSize** (int) - 容量单位GB + - **BlockSlotBegin** (int) - 分片维护的键槽起始值 + - **BlockSlotEnd** (int) - 分片维护的键槽结束值 + - **BlockState** (str) - 实例状态 Starting // 创建中 Creating // 初始化中 CreateFail // 创建失败 Fail // 创建失败 Deleting // 删除中 DeleteFail // 删除失败 Running // 运行 Resizing // 容量调整中 ResizeFail // 容量调整失败 Configing // 配置中 ConfigFail // 配置失败Restarting // 重启中 SetPasswordFail //设置密码失败UpgradeMemInit //任务初始化 + - **BlockType** (str) - 分片类型,master 或者 slave + - **BlockUsedSize** (int) - 使用量单位MB + - **BlockVip** (str) - 分片ip + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUMemBlockInfoRequestSchema().dumps(d) + + resp = self.invoke("DescribeUMemBlockInfo", d, **kwargs) + return apis.DescribeUMemBlockInfoResponseSchema().loads(resp) + def describe_umem_price( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUMemPrice - 获取UMem实例价格信息 + """DescribeUMemPrice - 获取UMem实例价格信息 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Size** (int) - (Required) 购买umem大小,单位:GB,范围[1~1024] - **Type** (str) - (Required) 空间类型:single(无热备),double(热备)(默认: double) - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - - **ChargeType** (str) - Year, Month, Dynamic,Trial 如果不指定,则一次性获取三种计费 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **BlockCnt** (int) - umem 分片个数 + - **ChargeType** (str) - Year, Month, Dynamic 如果不指定,则一次性获取三种计费 + - **ClusterMode** (str) - 数据库类型,RWMode为读写分离 + - **HighPerformance** (bool) - 实例类型是否为性能增强型。默认为false,或者不填,true为性能增强型。 + - **ProxySize** (int) - umem 代理CPU核心数 - **Quantity** (int) - 购买UMem的时长,默认值为1 - - **RegionFlag** (bool) - - + - **UlbMode** (str) - umem分布式代理类型,默认false,true为负载均衡型代理 + **Response** - **DataSet** (list) - 见 **UMemPriceSet** 模型定义 - + **Response Model** - - **UMemPriceSet** - + + **UMemPriceSet** - **ChargeType** (str) - Year, Month, Dynamic,Trial - **OriginalPrice** (int) - 原价 - - **Price** (int) - 现价,单位: 元,保留小数点后两位有效数字 + - **Price** (int) - 现价 + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUMemPriceRequestSchema().dumps(d) @@ -244,32 +740,28 @@ def describe_umem_price( def describe_umem_space( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUMemSpace - 获取UMem内存空间列表 + """DescribeUMemSpace - 获取UMem内存空间列表(已废弃,建议是使用DescribeUMem接口) **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Limit** (int) - 返回数据长度, 默认为20 - **Offset** (int) - 数据偏移量, 默认为0 + - **Protocol** (str) - 协议类型: memcache, redis - **SpaceId** (str) - 内存空间ID (无ID,则获取所有) - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **DataSet** (list) - 见 **UMemSpaceSet** 模型定义 - **TotalCount** (int) - 根据过滤条件得到的总数 - + **Response Model** - - **UMemSpaceAddressSet** - - - **IP** (str) - UMem实例访问IP - - **Port** (int) - UMem实例访问Port - **UMemSpaceSet** - + **UMemSpaceSet** - **Address** (list) - 见 **UMemSpaceAddressSet** 模型定义 + - **AofRollbackEnable** (bool) - 实例是否开启了回档 - **ChargeType** (str) - Year, Month, Dynamic, Trial - **CreateTime** (int) - 创建时间 - **ExpireTime** (int) - 到期时间 @@ -279,16 +771,26 @@ def describe_umem_space( - **Size** (int) - 容量单位GB - **SpaceId** (str) - 内存空间ID - **State** (str) - Starting:创建中 Running:运行中 Fail:失败 - - **SubnetId** (str) - - - **Tag** (str) - + - **SubnetId** (str) - 子网ID + - **SupportAofRollback** (bool) - 实例是否支持回档 + - **Tag** (str) - 实例tag - **Type** (str) - 空间类型:single(无热备),double(热备) - **UsedSize** (int) - 使用量单位MB - - **VPCId** (str) - - - **Zone** (str) - 可用区,参见 `可用区列表 `_ + - **VPCId** (str) - VPC ID + - **Zone** (str) - 可用区,参见 `可用区列表 `_ + + + **UMemSpaceAddressSet** + - **IP** (str) - UMem实例访问IP + - **Port** (int) - UMem实例访问Port + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUMemSpaceRequestSchema().dumps(d) @@ -298,33 +800,43 @@ def describe_umem_space( def describe_umem_upgrade_price( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUMemUpgradePrice - 获取UMem升级价格信息 + """DescribeUMemUpgradePrice - 获取UMem升级价格信息 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Size** (int) - (Required) 购买UMem大小,单位:GB - **SpaceId** (str) - (Required) 需要升级的空间的SpaceId - **Type** (str) - (Required) 空间类型:single(无热备),double(热备)(默认: double) - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **BlockIds** (list) - 进行容量调整分片的分片ID(性能增强型不需要传入) + - **BlockSize** (list) - 进行容量调整的分片的目标容量,单位 GB(性能增强型不需要传入) + - **HighPerformance** (str) - 是否为性能增强型。默认为false,或者不填,true为性能增强型。 + - **IsSplit** (str) - 如果是拆分按钮查询价格就填 true, 否则就填 false,默认为 false + - **NewCPU** (int) - 代理升级后CPU核数 + - **ProxyId** (str) - 代理id + - **ReplicaSize** (int) - 新增读写分离节点容量大小 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - - **DataSet** (dict) - 见 **PriceDataSet** 模型定义 - - **Price** (int) - 价格(兼容老版本) - + - **OriginalPrice** (int) - 原价 + - **Price** (int) - 价格 + **Response Model** - - **PriceDataSet** - - - **CustomPrice** (int) - 用户折后价 - - **PurchaseValue** (int) - 资源有效期 - - **TotalPrice** (int) - 升降级资源的价格 + + **PriceDataSet** + - **CustomPrice** (int) - + - **PurchaseValue** (int) - + - **TotalPrice** (int) - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUMemUpgradePriceRequestSchema().dumps(d) @@ -334,26 +846,25 @@ def describe_umem_upgrade_price( def describe_umem_cache_group( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUMemcacheGroup - 显示Memcache + """DescribeUMemcacheGroup - 显示Memcache **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **GroupId** (str) - 组的ID,如果指定则获取描述,否则为列表操 作,需指定Offset/Limit - **Limit** (int) - 分页显示的条目数, 默认值为20 - **Offset** (int) - 分页显示的起始偏移, 默认值为0 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **DataSet** (list) - 见 **UMemcacheGroupSet** 模型定义 - **TotalCount** (int) - 组的总的节点个数 - + **Response Model** - - **UMemcacheGroupSet** - + + **UMemcacheGroupSet** - **ChargeType** (str) - 计费类型:Year,Month,Dynamic 默认Dynamic - **ConfigId** (str) - 节点的配置ID - **CreateTime** (int) - 创建时间 (UNIX时间戳) @@ -364,16 +875,20 @@ def describe_umem_cache_group( - **Port** (int) - 节点分配的服务端口 - **Size** (int) - 容量单位GB - **State** (str) - 状态标记 Creating // 初始化中 CreateFail // 创建失败 Deleting // 删除中 DeleteFail // 删除失败 Running // 运行 Resizing // 容量调整中 ResizeFail // 容量调整失败 Configing // 配置中 ConfigFail // 配置失败Restarting // 重启中 - - **SubnetId** (str) - + - **SubnetId** (str) - - **Tag** (str) - 业务组名称 - **UsedSize** (int) - 使用量单位MB - - **VPCId** (str) - + - **VPCId** (str) - - **Version** (str) - Memcache版本信息,默认为1.4.31 - **VirtualIP** (str) - 节点的虚拟IP地址 + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUMemcacheGroupRequestSchema().dumps(d) @@ -383,33 +898,37 @@ def describe_umem_cache_group( def describe_umem_cache_price( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUMemcachePrice - 获取umemcache组价格信息 + """DescribeUMemcachePrice - 获取umemcache组价格信息 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Size** (int) - (Required) 容量大小,单位:GB 取值范围[1-32] - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - **ChargeType** (str) - 计费模式,Year, Month, Dynamic,默认: Dynamic 默认: 获取所有计费模式的价格 - **Quantity** (int) - 购买umemcache的时长,默认值为1 - **Type** (str) - 空间类型:single(无热备),double(热备)(默认: double) - + **Response** - **DataSet** (list) - 见 **UMemcachePriceSet** 模型定义 - + **Response Model** - - **UMemcachePriceSet** - + + **UMemcachePriceSet** - **ChargeType** (str) - 计费模式,Year, Month, Dynamic + - **ListPrice** (int) - 产品列表价 - **OriginalPrice** (int) - 原价 - - **Price** (int) - 总价格,单位: 元,保留小数点后两位有效数字 + - **Price** (int) - 总价格 + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUMemcachePriceRequestSchema().dumps(d) @@ -419,32 +938,28 @@ def describe_umem_cache_price( def describe_umem_cache_upgrade_price( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeUMemcacheUpgradePrice - 获取umemcache升级价格信息 + """DescribeUMemcacheUpgradePrice - 获取umemcache升级价格信息 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **GroupId** (str) - (Required) 需要升级的空间的GroupId,请参考DescribeUMemcacheGroup接口 - **Size** (int) - (Required) 购买umemcache大小,单位:GB - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - - **DataSet** (dict) - 见 **PriceDataSet** 模型定义 - - **Price** (int) - 价格,单位:元 - - **Response Model** - - **PriceDataSet** - - - **CustomPrice** (int) - 用户折后价 - - **PurchaseValue** (int) - 资源有效期 - - **TotalPrice** (int) - 升降级资源的价格 + - **ListPrice** (int) - 列表价格 + - **OriginalPrice** (int) - 原价 + - **Price** (int) - 价格 """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeUMemcacheUpgradePriceRequestSchema().dumps(d) @@ -454,25 +969,25 @@ def describe_umem_cache_upgrade_price( def describe_uredis_backup( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeURedisBackup - 查询主备redis备份 + """DescribeURedisBackup - 查询主备redis备份 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **GroupId** (str) - 组的ID + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **GroupId** (str) - (Required) 组的ID - **Limit** (int) - 分页显示的条目数, 默认值为10 - **Offset** (int) - 分页显示的起始偏移, 默认值为0 - + - **SlaveZone** (str) - 跨机房URedis,slave所在可用区(必须和Zone在同一Region,且不可相同) + **Response** - **DataSet** (list) - 见 **URedisBackupSet** 模型定义 - **TotalCount** (int) - 用户名下总的备份个数 - + **Response Model** - - **URedisBackupSet** - + + **URedisBackupSet** - **BackupId** (str) - 备份ID - **BackupName** (str) - 备份的名称 - **BackupSize** (int) - 备份文件大小, 以字节为单位 @@ -481,11 +996,15 @@ def describe_uredis_backup( - **GroupId** (str) - 对应的实例ID - **GroupName** (str) - 组名称 - **State** (str) - 备份的状态: Backuping 备份中 Success 备份成功 Error 备份失败 Expired 备份过期 - - **Zone** (str) - 可用区,参见 `可用区列表 `_ + - **Zone** (str) - 可用区,参见 `可用区列表 `_ + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeURedisBackupRequestSchema().dumps(d) @@ -495,55 +1014,105 @@ def describe_uredis_backup( def describe_uredis_backup_url( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeURedisBackupURL - 获取主备Redis备份下载链接 + """DescribeURedisBackupURL - 获取主备Redis备份下载链接 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **BackupId** (str) - (Required) 备份ID - - **GroupId** (str) - 实例名称 + - **GroupId** (str) - 实例ID - **RegionFlag** (bool) - 是否是跨机房URedis(默认false) - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **SlaveZone** (str) - 跨机房URedis,slave所在可用区(必须和Zone在同一Region,且不可相同) + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **BackupPath** (str) - 备份文件公网的地址 - - **BackupURL** (str) - 备份文件公网的地址 - - **InnerBackupPath** (str) - - + - **BackupURL** (str) - [即将下线,请使用BackupPath] + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeURedisBackupURLRequestSchema().dumps(d) resp = self.invoke("DescribeURedisBackupURL", d, **kwargs) return apis.DescribeURedisBackupURLResponseSchema().loads(resp) + def describe_uredis_config( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeURedisConfig - 查询主备Redis所有配置文件 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **RegionFlag** (bool) - (Required) 是否是跨机房URedis(默认false) + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ConfigId** (str) - 配置文件ID + - **Limit** (int) - 页显示的条目数, 默认值为10 + - **Offset** (int) - 页显示的起始偏移, 默认值为0 + - **Version** (str) - Redis版本号 + + **Response** + + - **DataSet** (list) - 见 **URedisConfigSet** 模型定义 + - **TotalCount** (int) - 根据过滤条件得到的总数 + + **Response Model** + + **URedisConfigSet** + - **ConfigId** (str) - 配置ID + - **CreateTime** (int) - 创建时间 (UNIX时间戳) + - **Description** (str) - 配置描述 + - **IsModify** (str) - 置是否可以修改 + - **ModifyTime** (int) - 修改时间 (UNIX时间戳) + - **Name** (str) - 配置名称 + - **RegionFlag** (bool) - 是否是跨机房URedis(默认false) + - **State** (str) - 配置所处的状态 + - **Version** (str) - 配置对应的Redis版本 + - **Zone** (str) - Zone + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeURedisConfigRequestSchema().dumps(d) + + resp = self.invoke("DescribeURedisConfig", d, **kwargs) + return apis.DescribeURedisConfigResponseSchema().loads(resp) + def describe_uredis_group( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeURedisGroup - 查询主备Redis + """DescribeURedisGroup - 查询主备Redis(已废弃,建议使用DescribeUMem) **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **GroupId** (str) - 组的ID,如果指定则获取描述,否则为列表操 作,需指定Offset/Limit - **Limit** (int) - 分页显示的条目数, 默认值为20 - **Offset** (int) - 分页显示的起始偏移, 默认值为0 - - **Zone** (str) - - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **DataSet** (list) - 见 **URedisGroupSet** 模型定义 - **TotalCount** (int) - 组的总的节点个数 - + **Response Model** - - **URedisGroupSet** - + + **URedisGroupSet** - **AutoBackup** (str) - 是否需要自动备份,enable,disable - **BackupTime** (int) - 组自动备份开始时间,单位小时计,范围[0-23] - **ChargeType** (str) - 计费类型:Year,Month,Dynamic 默认Dynamic @@ -551,29 +1120,39 @@ def describe_uredis_group( - **CreateTime** (int) - 创建时间 (UNIX时间戳) - **ExpireTime** (int) - 过期时间 (UNIX时间戳) - **GroupId** (str) - 组ID - - **GroupName** (str) - 组名称 + - **GroupName** (str) - [即将下线,请使用Name] 组名称 - **HighAvailability** (str) - 是否开启高可用,enable,disable - - **MemorySize** (int) - 容量单位GB + - **IsHighPerformance** (bool) - 是否是高性能Redis, true表示是; false表示否 + - **MemorySize** (int) - [即将下线,请使用Size] 容量单位GB - **ModifyTime** (int) - 修改时间 (UNIX时间戳) - **Name** (str) - 组名称 - **Port** (int) - 节点分配的服务端口 - **Protocol** (str) - 协议 - **RewriteTime** (int) - 返回运维时间 0 //0点 1 //1点 以此类推 + - **Role** (str) - 实例类型 + - **SSLCertExpireTime** (int) - 证书过期时间 + - **SSLEnable** (bool) - 实例是否开启SSL + - **SSLVersion** (str) - SSL版本 + - **SecPolicy** (int) - 安全策略。1:内网隔离,2:加密通信,3:内网隔离+加密通信 - **Size** (int) - 容量单位GB - - **SlaveZone** (str) - 跨机房URedis,slave redis所在可用区,参见 `可用区列表 `_ - - **State** (str) - 状态标记 Creating // 初始化中 CreateFail // 创建失败 Deleting // 删除中 DeleteFail // 删除失败 Running // 运行 Resizing // 容量调整中 ResizeFail // 容量调整失败 Configing // 配置中 ConfigFail // 配置失败 - - **SubnetId** (str) - + - **SlaveZone** (str) - 跨机房URedis,slave redis所在可用区,参见 `可用区列表 `_ + - **State** (str) - 状态标记 Creating // 初始化中 CreateFail // 创建失败 Deleting // 删除中 DeleteFail // 删除失败 Running // 运行 Resizing // 容量调整中 ResizeFail // 容量调整失败 Configing // 配置中 ConfigFail // 配置失败// 修改SSL中SSLSwitching //SSLSwitchFail修改SSL失败 + - **SubnetId** (str) - subnetid - **Tag** (str) - 业务组名称 - - **Type** (str) - + - **Type** (str) - 空间类型:single(无热备),double(热备) - **UsedSize** (int) - 使用量单位MB - - **VPCId** (str) - + - **VPCId** (str) - vpcid - **Version** (str) - Redis版本信息 - **VirtualIP** (str) - 节点的虚拟IP地址 - - **Zone** (str) - 实例所在可用区,或者master redis所在可用区,参见 `可用区列表 `_ + - **Zone** (str) - 实例所在可用区,或者master redis所在可用区,参见 `可用区列表 `_ + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeURedisGroupRequestSchema().dumps(d) @@ -583,200 +1162,472 @@ def describe_uredis_group( def describe_uredis_price( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeURedisPrice - 取uredis价格信息 + """DescribeURedisPrice - 获取URedis价格信息 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Size** (int) - (Required) 量大小,单位:GB 取值范围[1-32] - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - **ChargeType** (str) - 计费模式,Year, Month, Dynamic;如果不指定,则一次性获取三种计费 + - **HighPerformance** (bool) - 查询高性能Redis, 默认为false, 或者不填, 查询高性能为true - **ProductType** (str) - 产品类型:MS_Redis(标准主备版),S_Redis(从库),默认为MS_Redis - **Quantity** (int) - 计费模式为Dynamic时,购买的时长, 默认为1 - **RegionFlag** (bool) - 是否是跨机房URedis(默认false) - - **Type** (str) - - + **Response** - **DataSet** (list) - 见 **URedisPriceSet** 模型定义 - + **Response Model** - - **URedisPriceSet** - + + **URedisPriceSet** - **ChargeType** (str) - Year, Month, Dynamic,Trial + - **ListPrice** (int) - 产品列表价 - **OriginalPrice** (int) - 原价 - - **Price** (int) - 总价格,单位: 元,保留小数点后两位有效数字 + - **Price** (int) - 总价格 + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeURedisPriceRequestSchema().dumps(d) resp = self.invoke("DescribeURedisPrice", d, **kwargs) return apis.DescribeURedisPriceResponseSchema().loads(resp) + def describe_uredis_slowlog( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeURedisSlowlog - 查询URedis慢日志 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **GroupId** (str) - (Required) 资源ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Limit** (int) - 分页显示的条目数,默认为10 + + **Response** + + - **DataSet** (list) - 见 **URedisSlowlogSet** 模型定义 + - **TotalCount** (int) - 总条目数 + + **Response Model** + + **URedisSlowlogSet** + - **Command** (str) - 查询命令 + - **SpendTime** (int) - 查询消耗的时间 + - **StartTime** (int) - 查询发生的时间 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeURedisSlowlogRequestSchema().dumps(d) + + resp = self.invoke("DescribeURedisSlowlog", d, **kwargs) + return apis.DescribeURedisSlowlogResponseSchema().loads(resp) + def describe_uredis_upgrade_price( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeURedisUpgradePrice - 获取uredis升级价格信息 + """DescribeURedisUpgradePrice - 获取uredis升级价格信息 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **GroupId** (str) - (Required) 要升级的空间的GroupId,请参考DescribeURedisGroup接口 - **Size** (int) - (Required) 购买uredis大小,单位:GB,范围是[1-32] - - **Type** (str) - - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **HighPerformance** (bool) - 查询高性能Redis, 默认为false, 或者不填, 查询高性能为true + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - - **DataSet** (dict) - 见 **PriceDataSet** 模型定义 - - **Price** (int) - 扩容差价,单位: 元,保留小数点后两位有效数字(兼容老版本) - - **Response Model** - - **PriceDataSet** - - - **CustomPrice** (int) - 用户折后价 - - **PurchaseValue** (int) - 资源有效期 - - **TotalPrice** (int) - 升降级资源的价格 + - **OriginalPrice** (int) - 原价 + - **Price** (float) - 价格 """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeURedisUpgradePriceRequestSchema().dumps(d) resp = self.invoke("DescribeURedisUpgradePrice", d, **kwargs) return apis.DescribeURedisUpgradePriceResponseSchema().loads(resp) + def describe_uredis_version( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeURedisVersion - 获取主Redis可用版本 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **DataSet** (list) - 见 **URedisVersionSet** 模型定义 + - **TotalCount** (int) - 总版本个数 + + **Response Model** + + **URedisVersionSet** + - **Version** (str) - Redis版本 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeURedisVersionRequestSchema().dumps(d) + + resp = self.invoke("DescribeURedisVersion", d, **kwargs) + return apis.DescribeURedisVersionResponseSchema().loads(resp) + + def flushall_uredis_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """FlushallURedisGroup - 清除主备redis数据 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **FlushType** (str) - (Required) FlushDb或FlushAll + - **GroupId** (str) - (Required) 组的ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **DbNum** (int) - 清空的db,FlushType为FlushDb,此项为必传项 + - **OrganizationId** (int) - OrganizationId + - **SlaveZone** (str) - 跨机房URedis,slave所在可用区(必须和Zone在同一Region,且不可相同) + - **TopOrganizationId** (int) - company_id + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.FlushallURedisGroupRequestSchema().dumps(d) + + resp = self.invoke("FlushallURedisGroup", d, **kwargs) + return apis.FlushallURedisGroupResponseSchema().loads(resp) + def get_umem_space_state( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetUMemSpaceState - 获取UMem内存空间列表 + """GetUMemSpaceState - 获取UMem内存空间列表 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **SpaceId** (str) - (Required) 内存空间ID - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **State** (str) - Starting:创建中 Running:运行中 Fail:失败 - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.GetUMemSpaceStateRequestSchema().dumps(d) resp = self.invoke("GetUMemSpaceState", d, **kwargs) return apis.GetUMemSpaceStateResponseSchema().loads(resp) + def i_solation_uredis_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ISolationURedisGroup - 打开/关闭URedis + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **GroupId** (str) - (Required) 组的ID + - **TransformType** (str) - (Required) UNBind(关闭)或Bind(打开) + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **SlaveZone** (str) - 跨机房URedis,slave所在可用区(必须和Zone在同一Region,且不可相同) + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ISolationURedisGroupRequestSchema().dumps(d) + + resp = self.invoke("ISolationURedisGroup", d, **kwargs) + return apis.ISolationURedisGroupResponseSchema().loads(resp) + def modify_umem_space_name( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ModifyUMemSpaceName - 修改UMem内存空间名称 + """ModifyUMemSpaceName - 修改UMem内存空间名称 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Name** (str) - (Required) 新的名称,长度(6<=size<=63) - **SpaceId** (str) - (Required) UMem内存空间ID - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.ModifyUMemSpaceNameRequestSchema().dumps(d) resp = self.invoke("ModifyUMemSpaceName", d, **kwargs) return apis.ModifyUMemSpaceNameResponseSchema().loads(resp) + def modify_uredis_config( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyURedisConfig - 修改主备Redis配置文件参数 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ConfigId** (str) - (Required) 配置文件的ID + - **Key** (str) - (Required) 参数名称 + - **Value** (str) - (Required) 对应参数的值 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **GroupId** (str) - 如果实例使用默认配置创建,修改配置信息需要填写GroupId + - **RegionFlag** (bool) - 是否是跨机房URedis(默认false) + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyURedisConfigRequestSchema().dumps(d) + + resp = self.invoke("ModifyURedisConfig", d, **kwargs) + return apis.ModifyURedisConfigResponseSchema().loads(resp) + def modify_uredis_group_name( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ModifyURedisGroupName - 修改主备redis名称 + """ModifyURedisGroupName - 修改主备redis名称 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **GroupId** (str) - (Required) 组的ID - **Name** (str) - (Required) Redis组名称 (范围[6-63],只能包含英文、数字以及符号-和_) - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.ModifyURedisGroupNameRequestSchema().dumps(d) resp = self.invoke("ModifyURedisGroupName", d, **kwargs) return apis.ModifyURedisGroupNameResponseSchema().loads(resp) - def resize_udredis_space( + def modify_uredis_group_password( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ResizeUDredisSpace - 调整内存空间容量 + """ModifyURedisGroupPassword - 修改主备密码/重置密码 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **Size** (int) - (Required) 内存大小, 单位:GB (需要大于原size,<= 1024) - - **SpaceId** (str) - (Required) 高性能UMem 内存空间Id - - **CouponId** (str) - 使用的代金券Id - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **GroupId** (str) - (Required) 组的ID + - **Password** (str) - (Required) 新密码字符串,要求长度为6~36个字符,且只能包含英文、数字以及-和下划线;并且需要base64加密;如要取消密码,此值为空字符串, + - **ResourceType** (str) - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyURedisGroupPasswordRequestSchema().dumps(d) + + resp = self.invoke("ModifyURedisGroupPassword", d, **kwargs) + return apis.ModifyURedisGroupPasswordResponseSchema().loads(resp) + + def register_umem_defrag( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RegisterUMemDefrag - 动态开关redis碎片整理选项 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ResourceId** (str) - (Required) 资源ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **EndHour** (int) - 结束整点数值(分布式实例该参数无效)。 + - **EndMin** (int) - 结束分钟数(分布式实例该参数无效)。 + - **EndTime** (int) - 关闭时间戳 + - **FragSize** (int) - 碎片整理阈值,范围为 100-200(分布式实例该参数无效)。 + - **FragTime** (int) - 任务时间周期,单位为分钟。 + - **IsUnion** (bool) - AND逻辑字段,表示 阈值和时间段都满足(分布式实例该参数无效)。 + - **OperateType** (str) - 操作类型:“Once”: 表示单次执行, “Open”:表示开启策略“Close”: 表示关闭策略(分布式实例只支持Once)。 + - **StartHour** (int) - 开始整点数值(分布式实例该参数无效)。 + - **StartMin** (int) - 开始分钟数(分布式实例该参数无效)。 + - **StartTime** (int) - 开始时间戳 + + **Response** + + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.RegisterUMemDefragRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("RegisterUMemDefrag", d, **kwargs) + return apis.RegisterUMemDefragResponseSchema().loads(resp) + + def remove_ud_redis_data( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RemoveUDRedisData - 清除udredis实例数据 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SpaceId** (str) - (Required) 实例id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) - d = apis.ResizeUDredisSpaceRequestSchema().dumps(d) + d = apis.RemoveUDRedisDataRequestSchema().dumps(d) + + resp = self.invoke("RemoveUDRedisData", d, **kwargs) + return apis.RemoveUDRedisDataResponseSchema().loads(resp) - resp = self.invoke("ResizeUDredisSpace", d, **kwargs) - return apis.ResizeUDredisSpaceResponseSchema().loads(resp) + def resize_ud_redis_block_size( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ResizeUDRedisBlockSize - 更改udredis分片容量 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BlockId** (str) - (Required) 分片id + - **BlockSize** (int) - (Required) 分片容量(单位GB)4/8/12/16/20 + - **SpaceId** (str) - (Required) spaceid + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **HighPerformance** (bool) - 是否为性能增强型。默认为false,或者不填,true为性能增强型。 + - **StartTime** (int) - 任务执行时间戳,时间戳需满足未来一天时间范围内。默认不传或者值为0时,即为立即执行 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ResizeUDRedisBlockSizeRequestSchema().dumps(d) + + resp = self.invoke("ResizeUDRedisBlockSize", d, **kwargs) + return apis.ResizeUDRedisBlockSizeResponseSchema().loads(resp) def resize_umem_space( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ResizeUMemSpace - 调整内存空间容量 + """ResizeUMemSpace - 调整内存空间容量,只支持存量老分布式产品,不支持高性能分布式。(已废弃,不建议使用) **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Size** (int) - (Required) 内存大小, 单位:GB (需要大于原size,<= 1024) - **SpaceId** (str) - (Required) UMem 内存空间Id - - **ChargeType** (str) - + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - **CouponId** (str) - 使用的代金券Id - **Type** (str) - 空间类型:single(无热备),double(热备)(默认: double) - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.ResizeUMemSpaceRequestSchema().dumps(d) @@ -786,25 +1637,30 @@ def resize_umem_space( def resize_uredis_group( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ResizeURedisGroup - 调整主备redis容量 + """ResizeURedisGroup - 通过调用CheckURedisAllowance接口,检查资源情况,根据不同情形来调整主备redis容量,其中主要包括可用区资源不足无法扩容,主备所在宿主机资源不足需要迁移完成扩容(需要主从切换,会闪断及负载升高),以及直接扩容(业务无感知) **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **GroupId** (str) - (Required) 组ID - **Size** (int) - (Required) 内存大小, 单位:GB (需要大于原size,且小于等于32) 目前仅支持1/2/4/8/16/32 G 六种容量规格 - - **ChargeType** (str) - + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ChargeType** (str) - 计费类型 - **CouponId** (int) - 代金券ID 请参考DescribeCoupon接口 + - **HighPerformance** (bool) - 高性能Redis, 默认为false, 或者不填, 高性能为true + - **StartTime** (int) - 任务执行时间戳,默认为0或者不传时,为立即执行,传入时间需满足未来一天范围 - **Type** (str) - 空间类型:single(无热备),double(热备)(默认: double) - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.ResizeURedisGroupRequestSchema().dumps(d) @@ -814,23 +1670,160 @@ def resize_uredis_group( def restart_umem_cache_group( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ RestartUMemcacheGroup - 重启单机Memcache + """RestartUMemcacheGroup - 重启单机Memcache **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **GroupId** (str) - (Required) 组的ID - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.RestartUMemcacheGroupRequestSchema().dumps(d) resp = self.invoke("RestartUMemcacheGroup", d, **kwargs) return apis.RestartUMemcacheGroupResponseSchema().loads(resp) + + def restart_uredis_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RestartURedisGroup - 重启主备实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **GroupId** (str) - (Required) 资源ID + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.RestartURedisGroupRequestSchema().dumps(d) + + resp = self.invoke("RestartURedisGroup", d, **kwargs) + return apis.RestartURedisGroupResponseSchema().loads(resp) + + def shutdown_uredis_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ShutdownURedisGroup - 关闭主备实例 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **GroupId** (str) - (Required) 资源ID + + **Response** + + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.ShutdownURedisGroupRequestSchema().dumps(d) + + resp = self.invoke("ShutdownURedisGroup", d, **kwargs) + return apis.ShutdownURedisGroupResponseSchema().loads(resp) + + def start_uredis_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """StartURedisGroup - 实例关闭状态下,启动实例 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **GroupId** (str) - (Required) 资源ID + + **Response** + + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.StartURedisGroupRequestSchema().dumps(d) + + resp = self.invoke("StartURedisGroup", d, **kwargs) + return apis.StartURedisGroupResponseSchema().loads(resp) + + def update_uredis_backup_strategy( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateURedisBackupStrategy - URedisBackupStrategy + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BackupTime** (str) - (Required) 备份时间,默认为0 + - **GroupId** (str) - (Required) 组的ID + - **AutoBackup** (str) - 是否打开默认备份功能。enable(打开),disable(关闭),默认enable + - **SlaveZone** (str) - 跨机房URedis,slave所在可用区(必须和Zone在同一Region,且不可相同) + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateURedisBackupStrategyRequestSchema().dumps(d) + + resp = self.invoke("UpdateURedisBackupStrategy", d, **kwargs) + return apis.UpdateURedisBackupStrategyResponseSchema().loads(resp) + + def update_uredis_rewrite_time( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateURedisRewriteTime - 修改主备redis重写时间 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **GroupId** (str) - (Required) 实例名称 + - **RewriteTime** (int) - (Required) 重写时间 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **SlaveZone** (str) - 跨机房URedis,slave所在可用区(必须和Zone在同一Region,且不可相同) + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateURedisRewriteTimeRequestSchema().dumps(d) + + resp = self.invoke("UpdateURedisRewriteTime", d, **kwargs) + return apis.UpdateURedisRewriteTimeResponseSchema().loads(resp) diff --git a/ucloud/services/umem/schemas/apis.py b/ucloud/services/umem/schemas/apis.py index 85724f4c..4a57bd05 100644 --- a/ucloud/services/umem/schemas/apis.py +++ b/ucloud/services/umem/schemas/apis.py @@ -3,11 +3,122 @@ from ucloud.core.typesystem import schema, fields from ucloud.services.umem.schemas import models - """ UMem API Schema """ +""" +API: CheckUDredisSpaceAllowance + +检查高性能UMem剩余资源,以及分片扩容前的资源预检查 +""" + + +class CheckUDredisSpaceAllowanceRequestSchema(schema.RequestSchema): + """CheckUDredisSpaceAllowance - 检查高性能UMem剩余资源,以及分片扩容前的资源预检查""" + + fields = { + "Count": fields.Str(required=True, dump_to="Count"), + "GroupId": fields.Str(required=False, dump_to="GroupId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Size": fields.Int(required=True, dump_to="Size"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CheckUDredisSpaceAllowanceResponseSchema(schema.ResponseSchema): + """CheckUDredisSpaceAllowance - 检查高性能UMem剩余资源,以及分片扩容前的资源预检查""" + + fields = { + "Count": fields.Int(required=True, load_from="Count"), + } + + +""" +API: CheckURedisAllowance + +检查主备Redis的资源是否足够创建新实例,以及主备Redis的扩容资源预检查 +""" + + +class CheckURedisAllowanceRequestSchema(schema.RequestSchema): + """CheckURedisAllowance - 检查主备Redis的资源是否足够创建新实例,以及主备Redis的扩容资源预检查""" + + fields = { + "Count": fields.Int(required=True, dump_to="Count"), + "GroupId": fields.Str(required=False, dump_to="GroupId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Protocol": fields.Str(required=False, dump_to="Protocol"), + "Region": fields.Str(required=True, dump_to="Region"), + "RegionFlag": fields.Bool(required=False, dump_to="RegionFlag"), + "Size": fields.Int(required=True, dump_to="Size"), + "SlaveZone": fields.Str(required=False, dump_to="SlaveZone"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CheckURedisAllowanceResponseSchema(schema.ResponseSchema): + """CheckURedisAllowance - 检查主备Redis的资源是否足够创建新实例,以及主备Redis的扩容资源预检查""" + + fields = { + "Count": fields.Int(required=True, load_from="Count"), + } + + +""" +API: CreateScanHotBigKeys + +创建执行扫大key和热key的任务 +""" + + +class CreateScanHotBigKeysRequestSchema(schema.RequestSchema): + """CreateScanHotBigKeys - 创建执行扫大key和热key的任务""" + + fields = { + "GroupId": fields.Str(required=True, dump_to="GroupId"), + "IsRetry": fields.Bool(required=False, dump_to="IsRetry"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "TaskId": fields.Str(required=False, dump_to="TaskId"), + "Type": fields.Str(required=True, dump_to="Type"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateScanHotBigKeysResponseSchema(schema.ResponseSchema): + """CreateScanHotBigKeys - 创建执行扫大key和热key的任务""" + + fields = {} + + +""" +API: CreateUMemBackup + +创建分布式redis备份 +""" + + +class CreateUMemBackupRequestSchema(schema.RequestSchema): + """CreateUMemBackup - 创建分布式redis备份""" + + fields = { + "BackupName": fields.Str(required=True, dump_to="BackupName"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SpaceId": fields.Str(required=True, dump_to="SpaceId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateUMemBackupResponseSchema(schema.ResponseSchema): + """CreateUMemBackup - 创建分布式redis备份""" + + fields = { + "BackupId": fields.Str(required=False, load_from="BackupId"), + } + + """ API: CreateUMemSpace @@ -16,32 +127,49 @@ class CreateUMemSpaceRequestSchema(schema.RequestSchema): - """ CreateUMemSpace - 创建UMem内存空间 - """ + """CreateUMemSpace - 创建UMem内存空间""" fields = { + "BackupId": fields.Str(required=False, dump_to="BackupId"), + "BlockCnt": fields.Int(required=False, dump_to="BlockCnt"), "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "ClusterMode": fields.Str(required=False, dump_to="ClusterMode"), "CouponId": fields.Str(required=False, dump_to="CouponId"), + "HighPerformance": fields.Bool( + required=False, dump_to="HighPerformance" + ), "Name": fields.Str(required=True, dump_to="Name"), "Password": fields.Base64(required=False, dump_to="Password"), + "Port": fields.Int(required=False, dump_to="Port"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Protocol": fields.Str(required=False, dump_to="Protocol"), + "ProxyPort": fields.Int(required=False, dump_to="ProxyPort"), + "ProxySize": fields.Int(required=False, dump_to="ProxySize"), "Quantity": fields.Int(required=False, dump_to="Quantity"), "Region": fields.Str(required=True, dump_to="Region"), + "RollbackSpaceId": fields.Str( + required=False, dump_to="RollbackSpaceId" + ), + "RollbackTime": fields.Int(required=False, dump_to="RollbackTime"), "Size": fields.Int(required=True, dump_to="Size"), + "SlaveZone": fields.Str(required=False, dump_to="SlaveZone"), + "SpaceId": fields.Str(required=False, dump_to="SpaceId"), "SubnetId": fields.Str(required=False, dump_to="SubnetId"), "Tag": fields.Str(required=False, dump_to="Tag"), "Type": fields.Str(required=False, dump_to="Type"), + "UlbMode": fields.Bool(required=False, dump_to="UlbMode"), "VPCId": fields.Str(required=False, dump_to="VPCId"), - "Zone": fields.Str(required=False, dump_to="Zone"), + "Version": fields.Str(required=False, dump_to="Version"), + "Zone": fields.Str(required=True, dump_to="Zone"), } class CreateUMemSpaceResponseSchema(schema.ResponseSchema): - """ CreateUMemSpace - 创建UMem内存空间 - """ + """CreateUMemSpace - 创建UMem内存空间""" - fields = {"SpaceId": fields.Str(required=False, load_from="SpaceId")} + fields = { + "SpaceId": fields.Str(required=False, load_from="SpaceId"), + } """ @@ -52,8 +180,7 @@ class CreateUMemSpaceResponseSchema(schema.ResponseSchema): class CreateUMemcacheGroupRequestSchema(schema.RequestSchema): - """ CreateUMemcacheGroup - 创建单机Memcache - """ + """CreateUMemcacheGroup - 创建单机Memcache""" fields = { "ChargeType": fields.Str(required=False, dump_to="ChargeType"), @@ -74,10 +201,39 @@ class CreateUMemcacheGroupRequestSchema(schema.RequestSchema): class CreateUMemcacheGroupResponseSchema(schema.ResponseSchema): - """ CreateUMemcacheGroup - 创建单机Memcache - """ + """CreateUMemcacheGroup - 创建单机Memcache""" + + fields = { + "GroupId": fields.Str(required=False, load_from="GroupId"), + } + + +""" +API: CreateURedisBackup + +创建主备Redis备份 +""" + + +class CreateURedisBackupRequestSchema(schema.RequestSchema): + """CreateURedisBackup - 创建主备Redis备份""" + + fields = { + "BackupName": fields.Str(required=True, dump_to="BackupName"), + "GroupId": fields.Str(required=True, dump_to="GroupId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SlaveZone": fields.Str(required=False, dump_to="SlaveZone"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + - fields = {"GroupId": fields.Str(required=False, load_from="GroupId")} +class CreateURedisBackupResponseSchema(schema.ResponseSchema): + """CreateURedisBackup - 创建主备Redis备份""" + + fields = { + "BackupId": fields.Str(required=True, load_from="BackupId"), + } """ @@ -88,25 +244,34 @@ class CreateUMemcacheGroupResponseSchema(schema.ResponseSchema): class CreateURedisGroupRequestSchema(schema.RequestSchema): - """ CreateURedisGroup - 创建主备redis - """ + """CreateURedisGroup - 创建主备redis""" fields = { + "AOFID": fields.Str(required=False, dump_to="AOFID"), "AutoBackup": fields.Str(required=False, dump_to="AutoBackup"), "BackupId": fields.Str(required=False, dump_to="BackupId"), "BackupTime": fields.Int(required=False, dump_to="BackupTime"), "ChargeType": fields.Str(required=False, dump_to="ChargeType"), "ConfigId": fields.Str(required=False, dump_to="ConfigId"), "CouponId": fields.Str(required=False, dump_to="CouponId"), + "EnableIpV6": fields.Bool(required=False, dump_to="EnableIpV6"), "HighAvailability": fields.Str( required=True, dump_to="HighAvailability" ), + "HighPerformance": fields.Bool( + required=False, dump_to="HighPerformance" + ), "MasterGroupId": fields.Str(required=False, dump_to="MasterGroupId"), "Name": fields.Str(required=True, dump_to="Name"), "Password": fields.Base64(required=False, dump_to="Password"), + "Port": fields.Int(required=False, dump_to="Port"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Quantity": fields.Int(required=False, dump_to="Quantity"), "Region": fields.Str(required=True, dump_to="Region"), + "RollbackGroupId": fields.Str( + required=False, dump_to="RollbackGroupId" + ), + "RollbackTime": fields.Int(required=False, dump_to="RollbackTime"), "Size": fields.Int(required=False, dump_to="Size"), "SlaveZone": fields.Str(required=False, dump_to="SlaveZone"), "SubnetId": fields.Str(required=False, dump_to="SubnetId"), @@ -118,10 +283,11 @@ class CreateURedisGroupRequestSchema(schema.RequestSchema): class CreateURedisGroupResponseSchema(schema.ResponseSchema): - """ CreateURedisGroup - 创建主备redis - """ + """CreateURedisGroup - 创建主备redis""" - fields = {"GroupId": fields.Str(required=False, load_from="GroupId")} + fields = { + "GroupId": fields.Str(required=False, load_from="GroupId"), + } """ @@ -132,8 +298,7 @@ class CreateURedisGroupResponseSchema(schema.ResponseSchema): class DeleteUMemSpaceRequestSchema(schema.RequestSchema): - """ DeleteUMemSpace - 删除UMem内存空间 - """ + """DeleteUMemSpace - 删除UMem内存空间""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -144,8 +309,7 @@ class DeleteUMemSpaceRequestSchema(schema.RequestSchema): class DeleteUMemSpaceResponseSchema(schema.ResponseSchema): - """ DeleteUMemSpace - 删除UMem内存空间 - """ + """DeleteUMemSpace - 删除UMem内存空间""" fields = {} @@ -158,8 +322,7 @@ class DeleteUMemSpaceResponseSchema(schema.ResponseSchema): class DeleteUMemcacheGroupRequestSchema(schema.RequestSchema): - """ DeleteUMemcacheGroup - 删除单机Memcache - """ + """DeleteUMemcacheGroup - 删除单机Memcache""" fields = { "GroupId": fields.Str(required=True, dump_to="GroupId"), @@ -170,8 +333,7 @@ class DeleteUMemcacheGroupRequestSchema(schema.RequestSchema): class DeleteUMemcacheGroupResponseSchema(schema.ResponseSchema): - """ DeleteUMemcacheGroup - 删除单机Memcache - """ + """DeleteUMemcacheGroup - 删除单机Memcache""" fields = {} @@ -184,8 +346,7 @@ class DeleteUMemcacheGroupResponseSchema(schema.ResponseSchema): class DeleteURedisGroupRequestSchema(schema.RequestSchema): - """ DeleteURedisGroup - 删除主备redis - """ + """DeleteURedisGroup - 删除主备redis""" fields = { "GroupId": fields.Str(required=True, dump_to="GroupId"), @@ -195,12 +356,195 @@ class DeleteURedisGroupRequestSchema(schema.RequestSchema): class DeleteURedisGroupResponseSchema(schema.ResponseSchema): - """ DeleteURedisGroup - 删除主备redis - """ + """DeleteURedisGroup - 删除主备redis""" fields = {} +""" +API: DescribeUDRedisProxyInfo + +拉取udredis所有的代理信息 +""" + + +class DescribeUDRedisProxyInfoRequestSchema(schema.RequestSchema): + """DescribeUDRedisProxyInfo - 拉取udredis所有的代理信息""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SpaceId": fields.Str(required=True, dump_to="SpaceId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeUDRedisProxyInfoResponseSchema(schema.ResponseSchema): + """DescribeUDRedisProxyInfo - 拉取udredis所有的代理信息""" + + fields = { + "DataSet": fields.List( + models.UDRedisProxyInfoSchema(), required=True, load_from="DataSet" + ), + } + + +""" +API: DescribeUDRedisSlowlog + +查询UDRedis慢日志 +""" + + +class DescribeUDRedisSlowlogRequestSchema(schema.RequestSchema): + """DescribeUDRedisSlowlog - 查询UDRedis慢日志""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ProxyId": fields.Str(required=False, dump_to="ProxyId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeUDRedisSlowlogResponseSchema(schema.ResponseSchema): + """DescribeUDRedisSlowlog - 查询UDRedis慢日志""" + + fields = { + "DataSet": fields.List( + models.UDRedisSlowlogSetSchema(), required=True, load_from="DataSet" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeUMem + +获取UMem列表 +""" + + +class DescribeUMemRequestSchema(schema.RequestSchema): + """DescribeUMem - 获取UMem列表""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Protocol": fields.Str(required=True, dump_to="Protocol"), + "Region": fields.Str(required=True, dump_to="Region"), + "ResourceId": fields.Str(required=False, dump_to="ResourceId"), + "ResourceType": fields.Str(required=False, dump_to="ResourceType"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DescribeUMemResponseSchema(schema.ResponseSchema): + """DescribeUMem - 获取UMem列表""" + + fields = { + "DataSet": fields.List( + models.UMemDataSetSchema(), required=False, load_from="DataSet" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeUMemBackup + +查询分布式redis备份 +""" + + +class DescribeUMemBackupRequestSchema(schema.RequestSchema): + """DescribeUMemBackup - 查询分布式redis备份""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SpaceId": fields.Str(required=True, dump_to="SpaceId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeUMemBackupResponseSchema(schema.ResponseSchema): + """DescribeUMemBackup - 查询分布式redis备份""" + + fields = { + "DataSet": fields.List( + models.UMemBackupSetSchema(), required=False, load_from="DataSet" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeUMemBackupURL + +获取分布式redis 备份下载链接 +""" + + +class DescribeUMemBackupURLRequestSchema(schema.RequestSchema): + """DescribeUMemBackupURL - 获取分布式redis 备份下载链接""" + + fields = { + "BackupId": fields.Str(required=True, dump_to="BackupId"), + "BlockId": fields.Str(required=False, dump_to="BlockId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SpaceId": fields.Str(required=True, dump_to="SpaceId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeUMemBackupURLResponseSchema(schema.ResponseSchema): + """DescribeUMemBackupURL - 获取分布式redis 备份下载链接""" + + fields = { + "BackupURL": fields.List( + fields.Str(), required=True, load_from="BackupURL" + ), + } + + +""" +API: DescribeUMemBlockInfo + +拉取UDRedis分片信息 +""" + + +class DescribeUMemBlockInfoRequestSchema(schema.RequestSchema): + """DescribeUMemBlockInfo - 拉取UDRedis分片信息""" + + fields = { + "Limit": fields.Int(required=True, dump_to="Limit"), + "Offset": fields.Int(required=True, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SpaceId": fields.Str(required=True, dump_to="SpaceId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeUMemBlockInfoResponseSchema(schema.ResponseSchema): + """DescribeUMemBlockInfo - 拉取UDRedis分片信息""" + + fields = { + "DataSet": fields.List( + models.UMemBlockInfoSchema(), required=False, load_from="DataSet" + ), + "ReadMode": fields.Str(required=False, load_from="ReadMode"), + } + + """ API: DescribeUMemPrice @@ -209,47 +553,51 @@ class DeleteURedisGroupResponseSchema(schema.ResponseSchema): class DescribeUMemPriceRequestSchema(schema.RequestSchema): - """ DescribeUMemPrice - 获取UMem实例价格信息 - """ + """DescribeUMemPrice - 获取UMem实例价格信息""" fields = { + "BlockCnt": fields.Int(required=False, dump_to="BlockCnt"), "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "ClusterMode": fields.Str(required=False, dump_to="ClusterMode"), + "HighPerformance": fields.Bool( + required=False, dump_to="HighPerformance" + ), "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "ProxySize": fields.Int(required=False, dump_to="ProxySize"), "Quantity": fields.Int(required=False, dump_to="Quantity"), "Region": fields.Str(required=True, dump_to="Region"), - "RegionFlag": fields.Bool(required=False, dump_to="RegionFlag"), "Size": fields.Int(required=True, dump_to="Size"), "Type": fields.Str(required=True, dump_to="Type"), + "UlbMode": fields.Str(required=False, dump_to="UlbMode"), "Zone": fields.Str(required=True, dump_to="Zone"), } class DescribeUMemPriceResponseSchema(schema.ResponseSchema): - """ DescribeUMemPrice - 获取UMem实例价格信息 - """ + """DescribeUMemPrice - 获取UMem实例价格信息""" fields = { "DataSet": fields.List( models.UMemPriceSetSchema(), required=False, load_from="DataSet" - ) + ), } """ API: DescribeUMemSpace -获取UMem内存空间列表 +获取UMem内存空间列表(已废弃,建议是使用DescribeUMem接口) """ class DescribeUMemSpaceRequestSchema(schema.RequestSchema): - """ DescribeUMemSpace - 获取UMem内存空间列表 - """ + """DescribeUMemSpace - 获取UMem内存空间列表(已废弃,建议是使用DescribeUMem接口)""" fields = { "Limit": fields.Int(required=False, dump_to="Limit"), "Offset": fields.Int(required=False, dump_to="Offset"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Protocol": fields.Str(required=False, dump_to="Protocol"), "Region": fields.Str(required=True, dump_to="Region"), "SpaceId": fields.Str(required=False, dump_to="SpaceId"), "Zone": fields.Str(required=False, dump_to="Zone"), @@ -257,8 +605,7 @@ class DescribeUMemSpaceRequestSchema(schema.RequestSchema): class DescribeUMemSpaceResponseSchema(schema.ResponseSchema): - """ DescribeUMemSpace - 获取UMem内存空间列表 - """ + """DescribeUMemSpace - 获取UMem内存空间列表(已废弃,建议是使用DescribeUMem接口)""" fields = { "DataSet": fields.List( @@ -276,12 +623,20 @@ class DescribeUMemSpaceResponseSchema(schema.ResponseSchema): class DescribeUMemUpgradePriceRequestSchema(schema.RequestSchema): - """ DescribeUMemUpgradePrice - 获取UMem升级价格信息 - """ + """DescribeUMemUpgradePrice - 获取UMem升级价格信息""" fields = { + "BlockIds": fields.List(fields.Str()), + "BlockSize": fields.List(fields.Int()), + "HighPerformance": fields.Str( + required=False, dump_to="HighPerformance" + ), + "IsSplit": fields.Str(required=False, dump_to="IsSplit"), + "NewCPU": fields.Int(required=False, dump_to="NewCPU"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ProxyId": fields.Str(required=False, dump_to="ProxyId"), "Region": fields.Str(required=True, dump_to="Region"), + "ReplicaSize": fields.Int(required=False, dump_to="ReplicaSize"), "Size": fields.Int(required=True, dump_to="Size"), "SpaceId": fields.Str(required=True, dump_to="SpaceId"), "Type": fields.Str(required=True, dump_to="Type"), @@ -290,11 +645,13 @@ class DescribeUMemUpgradePriceRequestSchema(schema.RequestSchema): class DescribeUMemUpgradePriceResponseSchema(schema.ResponseSchema): - """ DescribeUMemUpgradePrice - 获取UMem升级价格信息 - """ + """DescribeUMemUpgradePrice - 获取UMem升级价格信息""" fields = { - "DataSet": models.PriceDataSetSchema(), + "DataSet": models.PriceDataSetSchema( + required=False, load_from="DataSet" + ), # Deprecated, will be removed at 1.0 + "OriginalPrice": fields.Int(required=False, load_from="OriginalPrice"), "Price": fields.Int(required=False, load_from="Price"), } @@ -307,8 +664,7 @@ class DescribeUMemUpgradePriceResponseSchema(schema.ResponseSchema): class DescribeUMemcacheGroupRequestSchema(schema.RequestSchema): - """ DescribeUMemcacheGroup - 显示Memcache - """ + """DescribeUMemcacheGroup - 显示Memcache""" fields = { "GroupId": fields.Str(required=False, dump_to="GroupId"), @@ -321,8 +677,7 @@ class DescribeUMemcacheGroupRequestSchema(schema.RequestSchema): class DescribeUMemcacheGroupResponseSchema(schema.ResponseSchema): - """ DescribeUMemcacheGroup - 显示Memcache - """ + """DescribeUMemcacheGroup - 显示Memcache""" fields = { "DataSet": fields.List( @@ -342,8 +697,7 @@ class DescribeUMemcacheGroupResponseSchema(schema.ResponseSchema): class DescribeUMemcachePriceRequestSchema(schema.RequestSchema): - """ DescribeUMemcachePrice - 获取umemcache组价格信息 - """ + """DescribeUMemcachePrice - 获取umemcache组价格信息""" fields = { "ChargeType": fields.Str(required=False, dump_to="ChargeType"), @@ -357,15 +711,14 @@ class DescribeUMemcachePriceRequestSchema(schema.RequestSchema): class DescribeUMemcachePriceResponseSchema(schema.ResponseSchema): - """ DescribeUMemcachePrice - 获取umemcache组价格信息 - """ + """DescribeUMemcachePrice - 获取umemcache组价格信息""" fields = { "DataSet": fields.List( models.UMemcachePriceSetSchema(), required=False, load_from="DataSet", - ) + ), } @@ -377,8 +730,7 @@ class DescribeUMemcachePriceResponseSchema(schema.ResponseSchema): class DescribeUMemcacheUpgradePriceRequestSchema(schema.RequestSchema): - """ DescribeUMemcacheUpgradePrice - 获取umemcache升级价格信息 - """ + """DescribeUMemcacheUpgradePrice - 获取umemcache升级价格信息""" fields = { "GroupId": fields.Str(required=True, dump_to="GroupId"), @@ -390,11 +742,11 @@ class DescribeUMemcacheUpgradePriceRequestSchema(schema.RequestSchema): class DescribeUMemcacheUpgradePriceResponseSchema(schema.ResponseSchema): - """ DescribeUMemcacheUpgradePrice - 获取umemcache升级价格信息 - """ + """DescribeUMemcacheUpgradePrice - 获取umemcache升级价格信息""" fields = { - "DataSet": models.PriceDataSetSchema(), + "ListPrice": fields.Int(required=False, load_from="ListPrice"), + "OriginalPrice": fields.Int(required=False, load_from="OriginalPrice"), "Price": fields.Int(required=False, load_from="Price"), } @@ -407,21 +759,20 @@ class DescribeUMemcacheUpgradePriceResponseSchema(schema.ResponseSchema): class DescribeURedisBackupRequestSchema(schema.RequestSchema): - """ DescribeURedisBackup - 查询主备redis备份 - """ + """DescribeURedisBackup - 查询主备redis备份""" fields = { - "GroupId": fields.Str(required=False, dump_to="GroupId"), + "GroupId": fields.Str(required=True, dump_to="GroupId"), "Limit": fields.Int(required=False, dump_to="Limit"), "Offset": fields.Int(required=False, dump_to="Offset"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), + "SlaveZone": fields.Str(required=False, dump_to="SlaveZone"), } class DescribeURedisBackupResponseSchema(schema.ResponseSchema): - """ DescribeURedisBackup - 查询主备redis备份 - """ + """DescribeURedisBackup - 查询主备redis备份""" fields = { "DataSet": fields.List( @@ -439,8 +790,7 @@ class DescribeURedisBackupResponseSchema(schema.ResponseSchema): class DescribeURedisBackupURLRequestSchema(schema.RequestSchema): - """ DescribeURedisBackupURL - 获取主备Redis备份下载链接 - """ + """DescribeURedisBackupURL - 获取主备Redis备份下载链接""" fields = { "BackupId": fields.Str(required=True, dump_to="BackupId"), @@ -448,33 +798,62 @@ class DescribeURedisBackupURLRequestSchema(schema.RequestSchema): "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "RegionFlag": fields.Bool(required=False, dump_to="RegionFlag"), + "SlaveZone": fields.Str(required=False, dump_to="SlaveZone"), "Zone": fields.Str(required=False, dump_to="Zone"), } class DescribeURedisBackupURLResponseSchema(schema.ResponseSchema): - """ DescribeURedisBackupURL - 获取主备Redis备份下载链接 - """ + """DescribeURedisBackupURL - 获取主备Redis备份下载链接""" fields = { "BackupPath": fields.Str(required=False, load_from="BackupPath"), "BackupURL": fields.Str(required=False, load_from="BackupURL"), - "InnerBackupPath": fields.Str( - required=False, load_from="InnerBackupPath" + } + + +""" +API: DescribeURedisConfig + +查询主备Redis所有配置文件 +""" + + +class DescribeURedisConfigRequestSchema(schema.RequestSchema): + """DescribeURedisConfig - 查询主备Redis所有配置文件""" + + fields = { + "ConfigId": fields.Str(required=False, dump_to="ConfigId"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "RegionFlag": fields.Bool(required=True, dump_to="RegionFlag"), + "Version": fields.Str(required=False, dump_to="Version"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeURedisConfigResponseSchema(schema.ResponseSchema): + """DescribeURedisConfig - 查询主备Redis所有配置文件""" + + fields = { + "DataSet": fields.List( + models.URedisConfigSetSchema(), required=False, load_from="DataSet" ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), } """ API: DescribeURedisGroup -查询主备Redis +查询主备Redis(已废弃,建议使用DescribeUMem) """ class DescribeURedisGroupRequestSchema(schema.RequestSchema): - """ DescribeURedisGroup - 查询主备Redis - """ + """DescribeURedisGroup - 查询主备Redis(已废弃,建议使用DescribeUMem)""" fields = { "GroupId": fields.Str(required=False, dump_to="GroupId"), @@ -487,8 +866,7 @@ class DescribeURedisGroupRequestSchema(schema.RequestSchema): class DescribeURedisGroupResponseSchema(schema.ResponseSchema): - """ DescribeURedisGroup - 查询主备Redis - """ + """DescribeURedisGroup - 查询主备Redis(已废弃,建议使用DescribeUMem)""" fields = { "DataSet": fields.List( @@ -501,35 +879,65 @@ class DescribeURedisGroupResponseSchema(schema.ResponseSchema): """ API: DescribeURedisPrice -取uredis价格信息 +获取URedis价格信息 """ class DescribeURedisPriceRequestSchema(schema.RequestSchema): - """ DescribeURedisPrice - 取uredis价格信息 - """ + """DescribeURedisPrice - 获取URedis价格信息""" fields = { "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "HighPerformance": fields.Bool( + required=False, dump_to="HighPerformance" + ), "ProductType": fields.Str(required=False, dump_to="ProductType"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Quantity": fields.Int(required=False, dump_to="Quantity"), "Region": fields.Str(required=True, dump_to="Region"), "RegionFlag": fields.Bool(required=False, dump_to="RegionFlag"), "Size": fields.Int(required=True, dump_to="Size"), - "Type": fields.Str(required=False, dump_to="Type"), "Zone": fields.Str(required=True, dump_to="Zone"), } class DescribeURedisPriceResponseSchema(schema.ResponseSchema): - """ DescribeURedisPrice - 取uredis价格信息 - """ + """DescribeURedisPrice - 获取URedis价格信息""" fields = { "DataSet": fields.List( models.URedisPriceSetSchema(), required=False, load_from="DataSet" - ) + ), + } + + +""" +API: DescribeURedisSlowlog + +查询URedis慢日志 +""" + + +class DescribeURedisSlowlogRequestSchema(schema.RequestSchema): + """DescribeURedisSlowlog - 查询URedis慢日志""" + + fields = { + "GroupId": fields.Str(required=True, dump_to="GroupId"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeURedisSlowlogResponseSchema(schema.ResponseSchema): + """DescribeURedisSlowlog - 查询URedis慢日志""" + + fields = { + "DataSet": fields.List( + models.URedisSlowlogSetSchema(), required=False, load_from="DataSet" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), } @@ -541,29 +949,88 @@ class DescribeURedisPriceResponseSchema(schema.ResponseSchema): class DescribeURedisUpgradePriceRequestSchema(schema.RequestSchema): - """ DescribeURedisUpgradePrice - 获取uredis升级价格信息 - """ + """DescribeURedisUpgradePrice - 获取uredis升级价格信息""" fields = { "GroupId": fields.Str(required=True, dump_to="GroupId"), + "HighPerformance": fields.Bool( + required=False, dump_to="HighPerformance" + ), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "Size": fields.Int(required=True, dump_to="Size"), - "Type": fields.Str(required=False, dump_to="Type"), "Zone": fields.Str(required=False, dump_to="Zone"), } class DescribeURedisUpgradePriceResponseSchema(schema.ResponseSchema): - """ DescribeURedisUpgradePrice - 获取uredis升级价格信息 - """ + """DescribeURedisUpgradePrice - 获取uredis升级价格信息""" fields = { - "DataSet": models.PriceDataSetSchema(), - "Price": fields.Int(required=False, load_from="Price"), + "OriginalPrice": fields.Int(required=False, load_from="OriginalPrice"), + "Price": fields.Float(required=False, load_from="Price"), + } + + +""" +API: DescribeURedisVersion + +获取主Redis可用版本 +""" + + +class DescribeURedisVersionRequestSchema(schema.RequestSchema): + """DescribeURedisVersion - 获取主Redis可用版本""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeURedisVersionResponseSchema(schema.ResponseSchema): + """DescribeURedisVersion - 获取主Redis可用版本""" + + fields = { + "DataSet": fields.List( + models.URedisVersionSetSchema(), required=False, load_from="DataSet" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), } +""" +API: FlushallURedisGroup + +清除主备redis数据 +""" + + +class FlushallURedisGroupRequestSchema(schema.RequestSchema): + """FlushallURedisGroup - 清除主备redis数据""" + + fields = { + "DbNum": fields.Int(required=False, dump_to="DbNum"), + "FlushType": fields.Str(required=True, dump_to="FlushType"), + "GroupId": fields.Str(required=True, dump_to="GroupId"), + "OrganizationId": fields.Int(required=False, dump_to="OrganizationId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SlaveZone": fields.Str(required=False, dump_to="SlaveZone"), + "TopOrganizationId": fields.Int( + required=False, dump_to="TopOrganizationId" + ), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class FlushallURedisGroupResponseSchema(schema.ResponseSchema): + """FlushallURedisGroup - 清除主备redis数据""" + + fields = {} + + """ API: GetUMemSpaceState @@ -572,8 +1039,7 @@ class DescribeURedisUpgradePriceResponseSchema(schema.ResponseSchema): class GetUMemSpaceStateRequestSchema(schema.RequestSchema): - """ GetUMemSpaceState - 获取UMem内存空间列表 - """ + """GetUMemSpaceState - 获取UMem内存空间列表""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -584,10 +1050,37 @@ class GetUMemSpaceStateRequestSchema(schema.RequestSchema): class GetUMemSpaceStateResponseSchema(schema.ResponseSchema): - """ GetUMemSpaceState - 获取UMem内存空间列表 - """ + """GetUMemSpaceState - 获取UMem内存空间列表""" + + fields = { + "State": fields.Str(required=False, load_from="State"), + } - fields = {"State": fields.Str(required=False, load_from="State")} + +""" +API: ISolationURedisGroup + +打开/关闭URedis +""" + + +class ISolationURedisGroupRequestSchema(schema.RequestSchema): + """ISolationURedisGroup - 打开/关闭URedis""" + + fields = { + "GroupId": fields.Str(required=True, dump_to="GroupId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SlaveZone": fields.Str(required=False, dump_to="SlaveZone"), + "TransformType": fields.Str(required=True, dump_to="TransformType"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ISolationURedisGroupResponseSchema(schema.ResponseSchema): + """ISolationURedisGroup - 打开/关闭URedis""" + + fields = {} """ @@ -598,8 +1091,7 @@ class GetUMemSpaceStateResponseSchema(schema.ResponseSchema): class ModifyUMemSpaceNameRequestSchema(schema.RequestSchema): - """ ModifyUMemSpaceName - 修改UMem内存空间名称 - """ + """ModifyUMemSpaceName - 修改UMem内存空间名称""" fields = { "Name": fields.Str(required=True, dump_to="Name"), @@ -611,8 +1103,35 @@ class ModifyUMemSpaceNameRequestSchema(schema.RequestSchema): class ModifyUMemSpaceNameResponseSchema(schema.ResponseSchema): - """ ModifyUMemSpaceName - 修改UMem内存空间名称 - """ + """ModifyUMemSpaceName - 修改UMem内存空间名称""" + + fields = {} + + +""" +API: ModifyURedisConfig + +修改主备Redis配置文件参数 +""" + + +class ModifyURedisConfigRequestSchema(schema.RequestSchema): + """ModifyURedisConfig - 修改主备Redis配置文件参数""" + + fields = { + "ConfigId": fields.Str(required=True, dump_to="ConfigId"), + "GroupId": fields.Str(required=False, dump_to="GroupId"), + "Key": fields.Str(required=True, dump_to="Key"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "RegionFlag": fields.Bool(required=False, dump_to="RegionFlag"), + "Value": fields.Str(required=True, dump_to="Value"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ModifyURedisConfigResponseSchema(schema.ResponseSchema): + """ModifyURedisConfig - 修改主备Redis配置文件参数""" fields = {} @@ -625,49 +1144,131 @@ class ModifyUMemSpaceNameResponseSchema(schema.ResponseSchema): class ModifyURedisGroupNameRequestSchema(schema.RequestSchema): - """ ModifyURedisGroupName - 修改主备redis名称 - """ + """ModifyURedisGroupName - 修改主备redis名称""" fields = { "GroupId": fields.Str(required=True, dump_to="GroupId"), "Name": fields.Str(required=True, dump_to="Name"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "Zone": fields.Str(required=False, dump_to="Zone"), } class ModifyURedisGroupNameResponseSchema(schema.ResponseSchema): - """ ModifyURedisGroupName - 修改主备redis名称 - """ + """ModifyURedisGroupName - 修改主备redis名称""" fields = {} """ -API: ResizeUDredisSpace +API: ModifyURedisGroupPassword -调整内存空间容量 +修改主备密码/重置密码 """ -class ResizeUDredisSpaceRequestSchema(schema.RequestSchema): - """ ResizeUDredisSpace - 调整内存空间容量 - """ +class ModifyURedisGroupPasswordRequestSchema(schema.RequestSchema): + """ModifyURedisGroupPassword - 修改主备密码/重置密码""" fields = { - "CouponId": fields.Str(required=False, dump_to="CouponId"), + "GroupId": fields.Str(required=True, dump_to="GroupId"), + "Password": fields.Str(required=True, dump_to="Password"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "Size": fields.Int(required=True, dump_to="Size"), - "SpaceId": fields.Str(required=True, dump_to="SpaceId"), + "ResourceType": fields.Str(required=False, dump_to="ResourceType"), "Zone": fields.Str(required=False, dump_to="Zone"), } -class ResizeUDredisSpaceResponseSchema(schema.ResponseSchema): - """ ResizeUDredisSpace - 调整内存空间容量 - """ +class ModifyURedisGroupPasswordResponseSchema(schema.ResponseSchema): + """ModifyURedisGroupPassword - 修改主备密码/重置密码""" + + fields = {} + + +""" +API: RegisterUMemDefrag + +动态开关redis碎片整理选项 +""" + + +class RegisterUMemDefragRequestSchema(schema.RequestSchema): + """RegisterUMemDefrag - 动态开关redis碎片整理选项""" + + fields = { + "EndHour": fields.Int(required=False, dump_to="EndHour"), + "EndMin": fields.Int(required=False, dump_to="EndMin"), + "EndTime": fields.Int(required=False, dump_to="EndTime"), + "FragSize": fields.Int(required=False, dump_to="FragSize"), + "FragTime": fields.Int(required=False, dump_to="FragTime"), + "IsUnion": fields.Bool(required=False, dump_to="IsUnion"), + "OperateType": fields.Str(required=False, dump_to="OperateType"), + "Region": fields.Str(required=True, dump_to="Region"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + "StartHour": fields.Int(required=False, dump_to="StartHour"), + "StartMin": fields.Int(required=False, dump_to="StartMin"), + "StartTime": fields.Int(required=False, dump_to="StartTime"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class RegisterUMemDefragResponseSchema(schema.ResponseSchema): + """RegisterUMemDefrag - 动态开关redis碎片整理选项""" + + fields = {} + + +""" +API: RemoveUDRedisData + +清除udredis实例数据 +""" + + +class RemoveUDRedisDataRequestSchema(schema.RequestSchema): + """RemoveUDRedisData - 清除udredis实例数据""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SpaceId": fields.Str(required=True, dump_to="SpaceId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class RemoveUDRedisDataResponseSchema(schema.ResponseSchema): + """RemoveUDRedisData - 清除udredis实例数据""" + + fields = {} + + +""" +API: ResizeUDRedisBlockSize + +更改udredis分片容量 +""" + + +class ResizeUDRedisBlockSizeRequestSchema(schema.RequestSchema): + """ResizeUDRedisBlockSize - 更改udredis分片容量""" + + fields = { + "BlockId": fields.Str(required=True, dump_to="BlockId"), + "BlockSize": fields.Int(required=True, dump_to="BlockSize"), + "HighPerformance": fields.Bool( + required=False, dump_to="HighPerformance" + ), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SpaceId": fields.Str(required=True, dump_to="SpaceId"), + "StartTime": fields.Int(required=False, dump_to="StartTime"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ResizeUDRedisBlockSizeResponseSchema(schema.ResponseSchema): + """ResizeUDRedisBlockSize - 更改udredis分片容量""" fields = {} @@ -675,29 +1276,26 @@ class ResizeUDredisSpaceResponseSchema(schema.ResponseSchema): """ API: ResizeUMemSpace -调整内存空间容量 +调整内存空间容量,只支持存量老分布式产品,不支持高性能分布式。(已废弃,不建议使用) """ class ResizeUMemSpaceRequestSchema(schema.RequestSchema): - """ ResizeUMemSpace - 调整内存空间容量 - """ + """ResizeUMemSpace - 调整内存空间容量,只支持存量老分布式产品,不支持高性能分布式。(已废弃,不建议使用)""" fields = { - "ChargeType": fields.Str(required=False, dump_to="ChargeType"), "CouponId": fields.Str(required=False, dump_to="CouponId"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "Size": fields.Int(required=True, dump_to="Size"), "SpaceId": fields.Str(required=True, dump_to="SpaceId"), "Type": fields.Str(required=False, dump_to="Type"), - "Zone": fields.Str(required=False, dump_to="Zone"), + "Zone": fields.Str(required=True, dump_to="Zone"), } class ResizeUMemSpaceResponseSchema(schema.ResponseSchema): - """ ResizeUMemSpace - 调整内存空间容量 - """ + """ResizeUMemSpace - 调整内存空间容量,只支持存量老分布式产品,不支持高性能分布式。(已废弃,不建议使用)""" fields = {} @@ -705,29 +1303,31 @@ class ResizeUMemSpaceResponseSchema(schema.ResponseSchema): """ API: ResizeURedisGroup -调整主备redis容量 +通过调用CheckURedisAllowance接口,检查资源情况,根据不同情形来调整主备redis容量,其中主要包括可用区资源不足无法扩容,主备所在宿主机资源不足需要迁移完成扩容(需要主从切换,会闪断及负载升高),以及直接扩容(业务无感知) """ class ResizeURedisGroupRequestSchema(schema.RequestSchema): - """ ResizeURedisGroup - 调整主备redis容量 - """ + """ResizeURedisGroup - 通过调用CheckURedisAllowance接口,检查资源情况,根据不同情形来调整主备redis容量,其中主要包括可用区资源不足无法扩容,主备所在宿主机资源不足需要迁移完成扩容(需要主从切换,会闪断及负载升高),以及直接扩容(业务无感知)""" fields = { "ChargeType": fields.Str(required=False, dump_to="ChargeType"), "CouponId": fields.Int(required=False, dump_to="CouponId"), "GroupId": fields.Str(required=True, dump_to="GroupId"), + "HighPerformance": fields.Bool( + required=False, dump_to="HighPerformance" + ), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "Size": fields.Int(required=True, dump_to="Size"), + "StartTime": fields.Int(required=False, dump_to="StartTime"), "Type": fields.Str(required=False, dump_to="Type"), - "Zone": fields.Str(required=False, dump_to="Zone"), + "Zone": fields.Str(required=True, dump_to="Zone"), } class ResizeURedisGroupResponseSchema(schema.ResponseSchema): - """ ResizeURedisGroup - 调整主备redis容量 - """ + """ResizeURedisGroup - 通过调用CheckURedisAllowance接口,检查资源情况,根据不同情形来调整主备redis容量,其中主要包括可用区资源不足无法扩容,主备所在宿主机资源不足需要迁移完成扩容(需要主从切换,会闪断及负载升高),以及直接扩容(业务无感知)""" fields = {} @@ -740,19 +1340,138 @@ class ResizeURedisGroupResponseSchema(schema.ResponseSchema): class RestartUMemcacheGroupRequestSchema(schema.RequestSchema): - """ RestartUMemcacheGroup - 重启单机Memcache - """ + """RestartUMemcacheGroup - 重启单机Memcache""" fields = { "GroupId": fields.Str(required=True, dump_to="GroupId"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "Zone": fields.Str(required=False, dump_to="Zone"), + "Zone": fields.Str(required=True, dump_to="Zone"), } class RestartUMemcacheGroupResponseSchema(schema.ResponseSchema): - """ RestartUMemcacheGroup - 重启单机Memcache - """ + """RestartUMemcacheGroup - 重启单机Memcache""" + + fields = {} + + +""" +API: RestartURedisGroup + +重启主备实例 +""" + + +class RestartURedisGroupRequestSchema(schema.RequestSchema): + """RestartURedisGroup - 重启主备实例""" + + fields = { + "GroupId": fields.Str(required=True, dump_to="GroupId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class RestartURedisGroupResponseSchema(schema.ResponseSchema): + """RestartURedisGroup - 重启主备实例""" + + fields = {} + + +""" +API: ShutdownURedisGroup + +关闭主备实例 +""" + + +class ShutdownURedisGroupRequestSchema(schema.RequestSchema): + """ShutdownURedisGroup - 关闭主备实例""" + + fields = { + "GroupId": fields.Str(required=True, dump_to="GroupId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class ShutdownURedisGroupResponseSchema(schema.ResponseSchema): + """ShutdownURedisGroup - 关闭主备实例""" + + fields = {} + + +""" +API: StartURedisGroup + +实例关闭状态下,启动实例 +""" + + +class StartURedisGroupRequestSchema(schema.RequestSchema): + """StartURedisGroup - 实例关闭状态下,启动实例""" + + fields = { + "GroupId": fields.Str(required=True, dump_to="GroupId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class StartURedisGroupResponseSchema(schema.ResponseSchema): + """StartURedisGroup - 实例关闭状态下,启动实例""" + + fields = {} + + +""" +API: UpdateURedisBackupStrategy + +URedisBackupStrategy +""" + + +class UpdateURedisBackupStrategyRequestSchema(schema.RequestSchema): + """UpdateURedisBackupStrategy - URedisBackupStrategy""" + + fields = { + "AutoBackup": fields.Str(required=False, dump_to="AutoBackup"), + "BackupTime": fields.Str(required=True, dump_to="BackupTime"), + "GroupId": fields.Str(required=True, dump_to="GroupId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SlaveZone": fields.Str(required=False, dump_to="SlaveZone"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class UpdateURedisBackupStrategyResponseSchema(schema.ResponseSchema): + """UpdateURedisBackupStrategy - URedisBackupStrategy""" + + fields = {} + + +""" +API: UpdateURedisRewriteTime + +修改主备redis重写时间 +""" + + +class UpdateURedisRewriteTimeRequestSchema(schema.RequestSchema): + """UpdateURedisRewriteTime - 修改主备redis重写时间""" + + fields = { + "GroupId": fields.Str(required=True, dump_to="GroupId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "RewriteTime": fields.Int(required=True, dump_to="RewriteTime"), + "SlaveZone": fields.Str(required=False, dump_to="SlaveZone"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class UpdateURedisRewriteTimeResponseSchema(schema.ResponseSchema): + """UpdateURedisRewriteTime - 修改主备redis重写时间""" fields = {} diff --git a/ucloud/services/umem/schemas/models.py b/ucloud/services/umem/schemas/models.py index cc653564..7b8161cd 100644 --- a/ucloud/services/umem/schemas/models.py +++ b/ucloud/services/umem/schemas/models.py @@ -1,158 +1,327 @@ -""" Code is generated by ucloud-model, DO NOT EDIT IT. """ - -from ucloud.core.typesystem import schema, fields - - -class UMemPriceSetSchema(schema.ResponseSchema): - """ UMemPriceSet - DescribeUMemPrice - """ - - fields = { - "ChargeType": fields.Str(required=False, load_from="ChargeType"), - "OriginalPrice": fields.Int(required=False, load_from="OriginalPrice"), - "Price": fields.Int(required=False, load_from="Price"), - } - - -class UMemSpaceAddressSetSchema(schema.ResponseSchema): - """ UMemSpaceAddressSet - DescribeUMemSpace - """ - - fields = { - "IP": fields.Str(required=False, load_from="IP"), - "Port": fields.Int(required=False, load_from="Port"), - } - - -class UMemSpaceSetSchema(schema.ResponseSchema): - """ UMemSpaceSet - DescribeUMemSpace - """ - - fields = { - "Address": fields.List(UMemSpaceAddressSetSchema()), - "ChargeType": fields.Str(required=False, load_from="ChargeType"), - "CreateTime": fields.Int(required=False, load_from="CreateTime"), - "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), - "Name": fields.Str(required=False, load_from="Name"), - "Protocol": fields.Str(required=False, load_from="Protocol"), - "RewriteTime": fields.Int(required=True, load_from="RewriteTime"), - "Size": fields.Int(required=False, load_from="Size"), - "SpaceId": fields.Str(required=False, load_from="SpaceId"), - "State": fields.Str(required=False, load_from="State"), - "SubnetId": fields.Str(required=False, load_from="SubnetId"), - "Tag": fields.Str(required=True, load_from="Tag"), - "Type": fields.Str(required=False, load_from="Type"), - "UsedSize": fields.Int(required=False, load_from="UsedSize"), - "VPCId": fields.Str(required=False, load_from="VPCId"), - "Zone": fields.Str(required=False, load_from="Zone"), - } - - -class PriceDataSetSchema(schema.ResponseSchema): - """ PriceDataSet - 升降级价格 - """ - - fields = { - "CustomPrice": fields.Int(required=False, load_from="CustomPrice"), - "PurchaseValue": fields.Int(required=False, load_from="PurchaseValue"), - "TotalPrice": fields.Int(required=False, load_from="TotalPrice"), - } - - -class UMemcacheGroupSetSchema(schema.ResponseSchema): - """ UMemcacheGroupSet - DescribeUMemcacheGroup - """ - - fields = { - "ChargeType": fields.Str(required=False, load_from="ChargeType"), - "ConfigId": fields.Str(required=False, load_from="ConfigId"), - "CreateTime": fields.Int(required=False, load_from="CreateTime"), - "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), - "GroupId": fields.Str(required=False, load_from="GroupId"), - "ModifyTime": fields.Int(required=False, load_from="ModifyTime"), - "Name": fields.Str(required=False, load_from="Name"), - "Port": fields.Int(required=False, load_from="Port"), - "Size": fields.Int(required=False, load_from="Size"), - "State": fields.Str(required=False, load_from="State"), - "SubnetId": fields.Str(required=False, load_from="SubnetId"), - "Tag": fields.Str(required=False, load_from="Tag"), - "UsedSize": fields.Int(required=False, load_from="UsedSize"), - "VPCId": fields.Str(required=False, load_from="VPCId"), - "Version": fields.Str(required=False, load_from="Version"), - "VirtualIP": fields.Str(required=False, load_from="VirtualIP"), - } - - -class UMemcachePriceSetSchema(schema.ResponseSchema): - """ UMemcachePriceSet - DescribeUMemcachePrice - """ - - fields = { - "ChargeType": fields.Str(required=False, load_from="ChargeType"), - "OriginalPrice": fields.Int(required=False, load_from="OriginalPrice"), - "Price": fields.Int(required=False, load_from="Price"), - } - - -class URedisBackupSetSchema(schema.ResponseSchema): - """ URedisBackupSet - DescribeURedisBackup - """ - - fields = { - "BackupId": fields.Str(required=False, load_from="BackupId"), - "BackupName": fields.Str(required=False, load_from="BackupName"), - "BackupSize": fields.Int(required=False, load_from="BackupSize"), - "BackupTime": fields.Int(required=False, load_from="BackupTime"), - "BackupType": fields.Str(required=False, load_from="BackupType"), - "GroupId": fields.Str(required=False, load_from="GroupId"), - "GroupName": fields.Str(required=False, load_from="GroupName"), - "State": fields.Str(required=False, load_from="State"), - "Zone": fields.Str(required=False, load_from="Zone"), - } - - -class URedisGroupSetSchema(schema.ResponseSchema): - """ URedisGroupSet - DescribeURedisGroup - """ - - fields = { - "AutoBackup": fields.Str(required=False, load_from="AutoBackup"), - "BackupTime": fields.Int(required=False, load_from="BackupTime"), - "ChargeType": fields.Str(required=False, load_from="ChargeType"), - "ConfigId": fields.Str(required=False, load_from="ConfigId"), - "CreateTime": fields.Int(required=False, load_from="CreateTime"), - "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), - "GroupId": fields.Str(required=False, load_from="GroupId"), - "GroupName": fields.Str(required=False, load_from="GroupName"), - "HighAvailability": fields.Str( - required=False, load_from="HighAvailability" - ), - "MemorySize": fields.Int(required=False, load_from="MemorySize"), - "ModifyTime": fields.Int(required=False, load_from="ModifyTime"), - "Name": fields.Str(required=False, load_from="Name"), - "Port": fields.Int(required=False, load_from="Port"), - "Protocol": fields.Str(required=False, load_from="Protocol"), - "RewriteTime": fields.Int(required=True, load_from="RewriteTime"), - "Size": fields.Int(required=False, load_from="Size"), - "SlaveZone": fields.Str(required=False, load_from="SlaveZone"), - "State": fields.Str(required=False, load_from="State"), - "SubnetId": fields.Str(required=False, load_from="SubnetId"), - "Tag": fields.Str(required=False, load_from="Tag"), - "Type": fields.Str(required=False, load_from="Type"), - "UsedSize": fields.Int(required=False, load_from="UsedSize"), - "VPCId": fields.Str(required=True, load_from="VPCId"), - "Version": fields.Str(required=False, load_from="Version"), - "VirtualIP": fields.Str(required=False, load_from="VirtualIP"), - "Zone": fields.Str(required=False, load_from="Zone"), - } - - -class URedisPriceSetSchema(schema.ResponseSchema): - """ URedisPriceSet - 主备Redis价格 - """ - - fields = { - "ChargeType": fields.Str(required=False, load_from="ChargeType"), - "OriginalPrice": fields.Int(required=True, load_from="OriginalPrice"), - "Price": fields.Int(required=False, load_from="Price"), - } +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class UDRedisProxyInfoSchema(schema.ResponseSchema): + """UDRedisProxyInfo - udredis代理信息""" + + fields = { + "ProxyId": fields.Str(required=True, load_from="ProxyId"), + "ResourceId": fields.Str(required=True, load_from="ResourceId"), + "State": fields.Str(required=True, load_from="State"), + "Vip": fields.Str(required=True, load_from="Vip"), + } + + +class UDRedisSlowlogSetSchema(schema.ResponseSchema): + """UDRedisSlowlogSet - DescribeUDRedisSlowlog""" + + fields = { + "BlockId": fields.Str(required=False, load_from="BlockId"), + "Client": fields.Str(required=False, load_from="Client"), + "Command": fields.Str(required=False, load_from="Command"), + "SpendTime": fields.Int(required=False, load_from="SpendTime"), + "StartTime": fields.Int(required=False, load_from="StartTime"), + } + + +class UMemSlaveDataSetSchema(schema.ResponseSchema): + """UMemSlaveDataSet - DescribeUMem""" + + fields = { + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "ConfigId": fields.Str(required=False, load_from="ConfigId"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "GroupId": fields.Str(required=False, load_from="GroupId"), + "GroupName": fields.Str(required=False, load_from="GroupName"), + "MasterGroupId": fields.Str(required=False, load_from="MasterGroupId"), + "MemorySize": fields.Int(required=False, load_from="MemorySize"), + "ModifyTime": fields.Int(required=False, load_from="ModifyTime"), + "Name": fields.Str(required=False, load_from="Name"), + "Port": fields.Int(required=False, load_from="Port"), + "ResourceType": fields.Str(required=False, load_from="ResourceType"), + "RewriteTime": fields.Int(required=False, load_from="RewriteTime"), + "Role": fields.Str(required=False, load_from="Role"), + "Size": fields.Int(required=False, load_from="Size"), + "State": fields.Str(required=False, load_from="State"), + "SubnetId": fields.Str(required=True, load_from="SubnetId"), + "Tag": fields.Str(required=False, load_from="Tag"), + "UsedSize": fields.Int(required=False, load_from="UsedSize"), + "VPCId": fields.Str(required=True, load_from="VPCId"), + "Version": fields.Str(required=False, load_from="Version"), + "VirtualIP": fields.Str(required=True, load_from="VirtualIP"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class UMemSpaceAddressSetSchema(schema.ResponseSchema): + """UMemSpaceAddressSet - DescribeUMemSpace""" + + fields = { + "IP": fields.Str(required=False, load_from="IP"), + "Port": fields.Int(required=False, load_from="Port"), + } + + +class UMemDataSetSchema(schema.ResponseSchema): + """UMemDataSet - DescribeUMem""" + + fields = { + "Address": fields.List(UMemSpaceAddressSetSchema()), + "AutoBackup": fields.Str(required=False, load_from="AutoBackup"), + "BackupTime": fields.Int(required=False, load_from="BackupTime"), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "ConfigId": fields.Str(required=False, load_from="ConfigId"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DataSet": fields.List(UMemSlaveDataSetSchema()), + "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "HighAvailability": fields.Str( + required=False, load_from="HighAvailability" + ), + "Name": fields.Str(required=False, load_from="Name"), + "OwnSlave": fields.Str(required=True, load_from="OwnSlave"), + "Protocol": fields.Str(required=False, load_from="Protocol"), + "ResourceId": fields.Str(required=False, load_from="ResourceId"), + "ResourceType": fields.Str(required=False, load_from="ResourceType"), + "RewriteTime": fields.Int(required=False, load_from="RewriteTime"), + "Role": fields.Str(required=False, load_from="Role"), + "Size": fields.Int(required=False, load_from="Size"), + "SlaveZone": fields.Str(required=False, load_from="SlaveZone"), + "State": fields.Str(required=False, load_from="State"), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "Tag": fields.Str(required=False, load_from="Tag"), + "Type": fields.Str(required=False, load_from="Type"), + "UsedSize": fields.Int(required=False, load_from="UsedSize"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + "Version": fields.Str(required=False, load_from="Version"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class UMemBackupSetSchema(schema.ResponseSchema): + """UMemBackupSet - DescribeUMemBackup""" + + fields = { + "BackupId": fields.Str(required=True, load_from="BackupId"), + "BackupName": fields.Str(required=True, load_from="BackupName"), + "BackupType": fields.Str(required=True, load_from="BackupType"), + "BlockCount": fields.Int(required=True, load_from="BlockCount"), + "BlockSize": fields.Int(required=False, load_from="BlockSize"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "State": fields.Str(required=True, load_from="State"), + } + + +class UMemBlockInfoSchema(schema.ResponseSchema): + """UMemBlockInfo - 分布式redis 分片信息""" + + fields = { + "BlockId": fields.Str(required=True, load_from="BlockId"), + "BlockName": fields.Str(required=False, load_from="BlockName"), + "BlockPort": fields.Int(required=True, load_from="BlockPort"), + "BlockReadWeight": fields.Int( + required=False, load_from="BlockReadWeight" + ), + "BlockSize": fields.Int(required=True, load_from="BlockSize"), + "BlockSlotBegin": fields.Int(required=True, load_from="BlockSlotBegin"), + "BlockSlotEnd": fields.Int(required=True, load_from="BlockSlotEnd"), + "BlockState": fields.Str(required=True, load_from="BlockState"), + "BlockType": fields.Str(required=False, load_from="BlockType"), + "BlockUsedSize": fields.Int(required=False, load_from="BlockUsedSize"), + "BlockVip": fields.Str(required=False, load_from="BlockVip"), + } + + +class UMemPriceSetSchema(schema.ResponseSchema): + """UMemPriceSet - DescribeUMemPrice""" + + fields = { + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "ListPrice": fields.Int( + required=False, load_from="ListPrice" + ), # Deprecated, will be removed at 1.0 + "OriginalPrice": fields.Int(required=False, load_from="OriginalPrice"), + "Price": fields.Int(required=False, load_from="Price"), + } + + +class UMemSpaceSetSchema(schema.ResponseSchema): + """UMemSpaceSet - DescribeUMemSpace""" + + fields = { + "Address": fields.List(UMemSpaceAddressSetSchema()), + "AofRollbackEnable": fields.Bool( + required=False, load_from="AofRollbackEnable" + ), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "Name": fields.Str(required=False, load_from="Name"), + "Protocol": fields.Str(required=False, load_from="Protocol"), + "RewriteTime": fields.Int(required=True, load_from="RewriteTime"), + "Size": fields.Int(required=False, load_from="Size"), + "SpaceId": fields.Str(required=False, load_from="SpaceId"), + "State": fields.Str(required=False, load_from="State"), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "SupportAofRollback": fields.Bool( + required=False, load_from="SupportAofRollback" + ), + "Tag": fields.Str(required=True, load_from="Tag"), + "Type": fields.Str(required=False, load_from="Type"), + "UsedSize": fields.Int(required=False, load_from="UsedSize"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class PriceDataSetSchema(schema.ResponseSchema): + """PriceDataSet -""" + + fields = { + "CustomPrice": fields.Int(required=False, load_from="CustomPrice"), + "PurchaseValue": fields.Int(required=False, load_from="PurchaseValue"), + "TotalPrice": fields.Int(required=False, load_from="TotalPrice"), + } + + +class UMemcacheGroupSetSchema(schema.ResponseSchema): + """UMemcacheGroupSet - DescribeUMemcacheGroup""" + + fields = { + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "ConfigId": fields.Str(required=False, load_from="ConfigId"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "GroupId": fields.Str(required=False, load_from="GroupId"), + "ModifyTime": fields.Int(required=False, load_from="ModifyTime"), + "Name": fields.Str(required=False, load_from="Name"), + "Port": fields.Int(required=False, load_from="Port"), + "Size": fields.Int(required=False, load_from="Size"), + "State": fields.Str(required=False, load_from="State"), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "Tag": fields.Str(required=False, load_from="Tag"), + "UsedSize": fields.Int(required=False, load_from="UsedSize"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + "Version": fields.Str(required=False, load_from="Version"), + "VirtualIP": fields.Str(required=False, load_from="VirtualIP"), + } + + +class UMemcachePriceSetSchema(schema.ResponseSchema): + """UMemcachePriceSet - DescribeUMemcachePrice""" + + fields = { + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "ListPrice": fields.Int(required=False, load_from="ListPrice"), + "OriginalPrice": fields.Int(required=False, load_from="OriginalPrice"), + "Price": fields.Int(required=False, load_from="Price"), + } + + +class URedisBackupSetSchema(schema.ResponseSchema): + """URedisBackupSet - DescribeURedisBackup""" + + fields = { + "BackupId": fields.Str(required=False, load_from="BackupId"), + "BackupName": fields.Str(required=False, load_from="BackupName"), + "BackupSize": fields.Int(required=False, load_from="BackupSize"), + "BackupTime": fields.Int(required=False, load_from="BackupTime"), + "BackupType": fields.Str(required=False, load_from="BackupType"), + "GroupId": fields.Str(required=False, load_from="GroupId"), + "GroupName": fields.Str(required=False, load_from="GroupName"), + "State": fields.Str(required=False, load_from="State"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class URedisConfigSetSchema(schema.ResponseSchema): + """URedisConfigSet - 主备Redis配置文件信息""" + + fields = { + "ConfigId": fields.Str(required=False, load_from="ConfigId"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "Description": fields.Str(required=False, load_from="Description"), + "IsModify": fields.Str(required=False, load_from="IsModify"), + "ModifyTime": fields.Int(required=False, load_from="ModifyTime"), + "Name": fields.Str(required=False, load_from="Name"), + "RegionFlag": fields.Bool(required=False, load_from="RegionFlag"), + "State": fields.Str(required=False, load_from="State"), + "Version": fields.Str(required=False, load_from="Version"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class URedisGroupSetSchema(schema.ResponseSchema): + """URedisGroupSet - DescribeURedisGroup""" + + fields = { + "AutoBackup": fields.Str(required=False, load_from="AutoBackup"), + "BackupTime": fields.Int(required=False, load_from="BackupTime"), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "ConfigId": fields.Str(required=False, load_from="ConfigId"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "GroupId": fields.Str(required=False, load_from="GroupId"), + "GroupName": fields.Str(required=False, load_from="GroupName"), + "HighAvailability": fields.Str( + required=False, load_from="HighAvailability" + ), + "IsHighPerformance": fields.Bool( + required=False, load_from="IsHighPerformance" + ), + "MemorySize": fields.Int(required=False, load_from="MemorySize"), + "ModifyTime": fields.Int(required=False, load_from="ModifyTime"), + "Name": fields.Str(required=False, load_from="Name"), + "Port": fields.Int(required=False, load_from="Port"), + "Protocol": fields.Str(required=False, load_from="Protocol"), + "RewriteTime": fields.Int(required=True, load_from="RewriteTime"), + "Role": fields.Str(required=True, load_from="Role"), + "SSLCertExpireTime": fields.Int( + required=False, load_from="SSLCertExpireTime" + ), + "SSLEnable": fields.Bool(required=False, load_from="SSLEnable"), + "SSLVersion": fields.Str(required=False, load_from="SSLVersion"), + "SecPolicy": fields.Int(required=False, load_from="SecPolicy"), + "Size": fields.Int(required=False, load_from="Size"), + "SlaveZone": fields.Str(required=False, load_from="SlaveZone"), + "State": fields.Str(required=False, load_from="State"), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "Tag": fields.Str(required=False, load_from="Tag"), + "Type": fields.Str(required=False, load_from="Type"), + "UsedSize": fields.Int(required=False, load_from="UsedSize"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + "Version": fields.Str(required=False, load_from="Version"), + "VirtualIP": fields.Str(required=False, load_from="VirtualIP"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class URedisPriceSetSchema(schema.ResponseSchema): + """URedisPriceSet - 主备Redis价格""" + + fields = { + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "ListPrice": fields.Int(required=False, load_from="ListPrice"), + "OriginalPrice": fields.Int(required=True, load_from="OriginalPrice"), + "Price": fields.Int(required=False, load_from="Price"), + } + + +class URedisSlowlogSetSchema(schema.ResponseSchema): + """URedisSlowlogSet - DescribeURedisSlowlog""" + + fields = { + "Command": fields.Str(required=False, load_from="Command"), + "SpendTime": fields.Int(required=False, load_from="SpendTime"), + "StartTime": fields.Int(required=False, load_from="StartTime"), + } + + +class URedisVersionSetSchema(schema.ResponseSchema): + """URedisVersionSet - DescribeURedisVersion""" + + fields = { + "Version": fields.Str(required=False, load_from="Version"), + } diff --git a/ucloud/services/umongodb/__init__.py b/ucloud/services/umongodb/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/umongodb/client.py b/ucloud/services/umongodb/client.py new file mode 100644 index 00000000..8ddfdf2d --- /dev/null +++ b/ucloud/services/umongodb/client.py @@ -0,0 +1,1046 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.umongodb.schemas import apis + + +class UMongoDBClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UMongoDBClient, self).__init__( + config, transport, middleware, logger + ) + + def backup_umon_go_db_cluster( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """BackupUMongoDBCluster - 备份集群数据库 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BackupName** (str) - (Required) 备份名称 + - **ClusterId** (str) - (Required) 实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **BackupId** (str) - 备份ID + - **ClusterId** (str) - 实例ID + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.BackupUMongoDBClusterRequestSchema().dumps(d) + + resp = self.invoke("BackupUMongoDBCluster", d, **kwargs) + return apis.BackupUMongoDBClusterResponseSchema().loads(resp) + + def backup_umon_go_db_log( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """BackupUMongoDBLog - 日志打包 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Begin** (int) - (Required) 日志开始时间,最早为7x24小时前 + - **ClusterId** (str) - (Required) 集群id + - **End** (int) - (Required) 日志结束时间,时间区间不能超过24小时 + - **LogType** (str) - (Required) 日志类型:SlowLog,ErrorLog + - **Name** (str) - (Required) 日志包名称 + - **NodeId** (str) - (Required) 节点id, 慢日志 mongos 节点不可选 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.BackupUMongoDBLogRequestSchema().dumps(d) + + resp = self.invoke("BackupUMongoDBLog", d, **kwargs) + return apis.BackupUMongoDBLogResponseSchema().loads(resp) + + def create_umon_go_db_config_template( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUMongoDBConfigTemplate - 创建配置模板 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BaseTemplateId** (str) - (Required) 基础模板 + - **ClusterType** (str) - (Required) 集群类型 + - **MongodbVersion** (str) - (Required) mongo版本 + - **TemplateName** (str) - (Required) 模板名称 + - **Description** (str) - 模板描述 + + **Response** + + - **Message** (str) - 错误信息 + - **TemplateId** (str) - 模板Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateUMongoDBConfigTemplateRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUMongoDBConfigTemplate", d, **kwargs) + return apis.CreateUMongoDBConfigTemplateResponseSchema().loads(resp) + + def create_umon_go_db_repl_set( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUMongoDBReplSet - 创建一个Mongodb副本集群 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **AdminPassword** (str) - (Required) 管理员密码 + - **DBVersion** (str) - (Required) 副本集的Mongodb的版本,例如MongoDB 3.6, MongoDB 4.2 + - **DiskSpace** (int) - (Required) 磁盘空间 (GB):取值范围 20~32000,仅支持 10 的整数倍 + - **MachineTypeId** (str) - (Required) 机型配置,如 o.mongo2m.medium + - **Name** (str) - (Required) 副本集实例名称,至少6位 + - **NodeCount** (int) - (Required) 副本集节点数量:仅支持 3、5、7 奇数节点 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ChargeType** (str) - 付费方式:Year, Month, Dynamic,Trial,默认: Month + - **CrossZones** (list) - 跨可用区列表 + - **Labels** (list) - 见 **CreateUMongoDBReplSetParamLabels** 模型定义 + - **ListenPort** (int) - mongo服务端口 + - **Quantity** (int) - 购买时长,默认值1 + - **SecGroupId** (list) - 见 **CreateUMongoDBReplSetParamSecGroupId** 模型定义 + - **SubnetId** (str) - 子网ID + - **Tag** (str) - 实例所在的业务组名称 + - **VPCId** (str) - VPC的ID + + **Response** + + + **Request Model** + + **CreateUMongoDBReplSetParamSecGroupId** + - **Id** (str) - 安全组 ID。至多可以同时绑定5个安全组。 + - **Priority** (int) - 安全组优先级。取值范围[1, 5] + + + **CreateUMongoDBReplSetParamLabels** + - **Key** (str) - 用户资源标签的键值 + - **Value** (str) - 用户资源标签值 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateUMongoDBReplSetRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUMongoDBReplSet", d, **kwargs) + return apis.CreateUMongoDBReplSetResponseSchema().loads(resp) + + def create_umon_go_db_sharded_cluster( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUMongoDBShardedCluster - 创建一个Mongodb分片集群 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **AdminPassword** (str) - (Required) 管理员密码 + - **DBVersion** (str) - (Required) 副本集的Mongodb的版本,例如MongoDB 3.6, MongoDB 4.2 + - **DiskSpace** (int) - (Required) 数据节点磁盘空间(GB):取值范围 20~32000,仅支持 10 的整数倍 + - **MachineTypeId** (str) - (Required) 数据节点机型配置,如 o.mongo2m.medium + - **MongosNodeCount** (int) - (Required) Mongos节点数量 + - **Name** (str) - (Required) 副本集实例名称,至少6位 + - **NodeCount** (int) - (Required) 每个分片中节点数量 + - **ShardCount** (int) - (Required) 分片数量 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ChargeType** (str) - 付费方式:Year, Month, Dynamic,Trial,默认: Month + - **Labels** (list) - 见 **CreateUMongoDBShardedClusterParamLabels** 模型定义 + - **ListenPort** (int) - mongo服务端口 + - **MongosMachineTypeId** (str) - Mongos节点机型配置 + - **Quantity** (int) - 购买时长,默认值1 + - **SecGroupId** (list) - 见 **CreateUMongoDBShardedClusterParamSecGroupId** 模型定义 + - **SubnetId** (str) - 子网ID + - **Tag** (str) - 实例所在的业务组名称 + - **TemplateId** (str) - 参数配置模版id + - **VPCId** (str) - VPC的ID + + **Response** + + + **Request Model** + + **CreateUMongoDBShardedClusterParamSecGroupId** + - **Id** (str) - 安全组 ID。至多可以同时绑定5个安全组。 + - **Priority** (int) - 安全组优先级。取值范围[1, 5] + + + **CreateUMongoDBShardedClusterParamLabels** + - **Key** (str) - 用户资源标签的键值 + - **Value** (str) - 用户资源标签值 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateUMongoDBShardedClusterRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUMongoDBShardedCluster", d, **kwargs) + return apis.CreateUMongoDBShardedClusterResponseSchema().loads(resp) + + def describe_umon_go_db_backup_url( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUMongoDBBackupURL - 获取实例备份下载链接 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) 集群ID + - **BackupId** (str) - 文件备份ID + - **Category** (str) - 类型:如 oplog + - **PackageId** (int) - 打包ID + - **ValidTime** (int) - 备份链接过期时间(单位秒) + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **InternetAddress** (str) - 备份文件公网地址 + - **IntranetAddress** (str) - 备份文件内网地址 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUMongoDBBackupURLRequestSchema().dumps(d) + + resp = self.invoke("DescribeUMongoDBBackupURL", d, **kwargs) + return apis.DescribeUMongoDBBackupURLResponseSchema().loads(resp) + + def describe_umon_go_db_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUMongoDBInstance - 描述MongoDB实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) 实例资源ID + - **ClusterType** (str) - 集群类型,ReplicaSet:副本集,SharedCluster:分片集群 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **ClusterInfo** (dict) - 见 **ClusterInfo** 模型定义 + + **Response Model** + + **DiskInfo** + - **DiskId** (str) - 磁盘id + - **DiskSize** (int) - 磁盘容量单位GB + + + **NodeInfo** + - **ClusterId** (str) - 节点所属副本集ID + - **CreateTime** (int) - DB实例创建时间 + - **DBVersion** (str) - 副本集的Mongodb的版本 + - **DataDisk** (dict) - 见 **DiskInfo** 模型定义 + - **MachineType** (str) - 机型信息 + - **MachineTypeId** (str) - 机型信息ID + - **NodeId** (str) - 节点ID + - **NodeRole** (str) - 节点角色,Primary/Secondary/Arbiter/Startup等等 + - **NodeType** (str) - 节点类型 + - **State** (str) - 副本集/分片集群状态标记 Initing:初始化中,InitFailed:安装失败,Starting:启动中,StartFailed:启动失败,Running:运行,Stopping:关闭中,Stopped:已关闭, StopFailed:关闭失败,Deleting:删除中,Deleted:已删除,DeleteFailed:删除失败,Restarting:重启中,RestartFailed:重启失败。 + - **SysDisk** (dict) - 见 **DiskInfo** 模型定义 + - **VirtualClusterId** (str) - 虚拟节点ID + - **Zone** (str) - 可用区 + - **ZoneId** (int) - 可用区ID + + + **ReplicaInfo** + - **ClusterId** (str) - 集群ID + - **CreateTime** (int) - 副本集创建时间 + - **DeleteTime** (int) - 副本集删除时间 + - **IsolationGroupId** (str) - 隔离组ID + - **MachineType** (str) - 机器类型 + - **MachineTypeId** (str) - 机器类型Id + - **ModifyTime** (int) - 副本集修改时间 + - **NodeCount** (int) - 副本集下的节点数量 + - **NodeInfos** (list) - 见 **NodeInfo** 模型定义 + - **ReplicaId** (str) - 副本集ID + - **ReplicaType** (str) - 副本类型,ConfigRepl或者DataRepl + - **State** (str) - 副本集/分片集群状态标记 Initing:初始化中,InitFailed:安装失败,Starting:启动中,StartFailed:启动失败,Running:运行,Stopping:关闭中,Stopped:已关闭, StopFailed:关闭失败,Deleting:删除中,Deleted:已删除,DeleteFailed:删除失败,Restarting:重启中,RestartFailed:重启失败。 + + + **MongodbMachineType** + - **Cpu** (int) - cpu核数 + - **Description** (str) - 配置简称 2C4G + - **Group** (str) - 配置分组,2m , 4m + - **MachineTypeId** (str) - 机器类型ID o.mongo2m.medium,o.mongo2m.xlarge + - **Memory** (int) - 内存用量(GB) + - **UHhostMachineType** (str) - 机器类型,N/O + + + **ClusterInfo** + - **ClusterId** (str) - 集群ID + - **ClusterType** (str) - 集群类型,ReplicaSet :副本集,SharedCluster:分片集 + - **ConfigComputeType** (dict) - 见 **MongodbMachineType** 模型定义 + - **ConfigMachineType** (str) - Config配置集群节点配置,分片集有效 + - **ConfigNodeCount** (int) - Config配置集群节点数量,分片集有效 + - **ConfigReplicaInfo** (dict) - 见 **ReplicaInfo** 模型定义 + - **ConnectURL** (str) - 副本集的访问地址 + - **CreateTime** (int) - DB实例创建时间 + - **CrossZones** (list) - 跨用区列表 + - **DBVersion** (str) - 副本集的Mongodb的版本 + - **DataComputeType** (dict) - 见 **MongodbMachineType** 模型定义 + - **DataReplicaInfos** (list) - 见 **ReplicaInfo** 模型定义 + - **DeleteTime** (int) - DB实例删除时间 + - **DiskSpace** (int) - 磁盘空间(GB), 默认根据配置机型 + - **EnableSSL** (int) - 是否开启了SSL;1->未开启 2->开启 + - **InstanceName** (str) - 实例名称 + - **MachineTypeId** (str) - 计算规格 + - **MongosComputeType** (dict) - 见 **MongodbMachineType** 模型定义 + - **MongosCount** (int) - Mongos节点数量,分片集有效 + - **MongosInfo** (list) - 见 **NodeInfo** 模型定义 + - **SSLExpirationTime** (int) - SSL到期时间 + - **ShardCount** (int) - 分片数量,分片集有效 + - **ShardNodeCount** (int) - 每分片节点数量,分片集有效 + - **State** (str) - 副本集/分片集群状态标记 Initing:初始化中,InitFailed:安装失败,Starting:启动中,StartFailed:启动失败,Running:运行,Stopping:关闭中,Stopped:已关闭, StopFailed:关闭失败,Deleting:删除中,Deleted:已删除,DeleteFailed:删除失败,Restarting:重启中,RestartFailed:重启失败,Upgrading: 升降级中,UpgradeFailed: 升降级失败,Switching:主备切换中,UpdatingSSL:修改SSL中,UpdateSSLFail:修改SSL失败 + - **SubnetId** (str) - 子网ID + - **Tag** (str) - 实例业务组 + - **VPCId** (str) - VPC的ID + - **Zone** (str) - 可用区 + - **ZoneId** (int) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUMongoDBInstanceRequestSchema().dumps(d) + + resp = self.invoke("DescribeUMongoDBInstance", d, **kwargs) + return apis.DescribeUMongoDBInstanceResponseSchema().loads(resp) + + def get_umon_go_db_backup_param( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUMongoDBBackupParam - 获取实例备份策略 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) 实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **DataSet** (dict) - 见 **BackupParam** 模型定义 + - **Message** (str) - 错误信息 + + **Response Model** + + **BackupParam** + - **AutoBackupCopies** (int) - 自动备份保存份数 + - **AutoBackupToggleTime** (str) - 自动备份预期时间范围 (24小时制,精确到分钟,00:00~23:59) + - **AutoBackupToggleWeek** (str) - 自动备份预期周几 (1-7 表示 周一到周末,多个数据用','分割,eg: 3,7) + - **ClusterId** (str) - 实例ID + - **Disabled** (bool) - 是否禁用(false:未禁用;true:禁用) + - **ManualBackupCopies** (int) - 手动备份保存份数 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUMongoDBBackupParamRequestSchema().dumps(d) + + resp = self.invoke("GetUMongoDBBackupParam", d, **kwargs) + return apis.GetUMongoDBBackupParamResponseSchema().loads(resp) + + def get_umon_go_db_cfg_temp_item( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUMongoDBCfgTempItem - 获取配置模板内容 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **TemplateId** (str) - (Required) 配置模板Id + + **Response** + + - **DataSet** (list) - 见 **ConfigTemplateItem** 模型定义 + - **Message** (str) - 错误信息 + + **Response Model** + + **ConfigOptions** + - **AllowedApplyType** (str) - 允许应用类型 + - **Description** (str) - 描述 + - **EnableDisplay** (bool) - 是否前端展示 + - **EnableModify** (bool) - 是否可修改 + - **ForceRestart** (bool) - 是否需重启 + - **IsDefaultOption** (bool) - 是否为默认选项 + - **MongodbVersion** (str) - mongo版本 + - **OptionDefaultValue** (str) - 默认值 + - **OptionFormatType** (str) - 选项值格式 + - **OptionName** (str) - 配置选项名 + - **OptionValueType** (str) - 配置选项类型 string,int,bool + - **OptionValues** (str) - 配置选项值范围 + + + **ConfigTemplateItem** + - **ConfigName** (str) - 配置名称 + - **ConfigOption** (dict) - 见 **ConfigOptions** 模型定义 + - **ConfigValue** (str) - 配置值 + - **CreateTime** (int) - 创建时间 + - **ItemId** (str) - itemId + - **ModifyTime** (int) - 修改时间 + - **NodeType** (str) - 节点类型: DataNode:数据节点 | ConfigSrvNode:配置节点 | MongosNode:路由节点 + - **TemplateId** (str) - 模板ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUMongoDBCfgTempItemRequestSchema().dumps(d) + + resp = self.invoke("GetUMongoDBCfgTempItem", d, **kwargs) + return apis.GetUMongoDBCfgTempItemResponseSchema().loads(resp) + + def get_umon_go_db_log( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUMongoDBLog - 查询某一段时间内集群节点的错误日志或慢查询日志 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Begin** (int) - (Required) 查询的日志开始的时间戳(Unix Timestamp)。对于实时查询,这个参数应该是上次轮询请求时的时间戳,后台会返回从该值到当前时间的日志内容 + - **ClusterId** (str) - (Required) 集群id + - **LogType** (str) - (Required) 日志类型:SlowLog,ErrorLog + - **NodeId** (str) - (Required) 节点id, 慢日志 mongos 节点不可选 + - **End** (int) - 查询日志的结束时间戳(Unix Timestamp),对于实时查询不传该值,与BeginTime的差值不超过24小时:(EndTime-BeginTime) < 24*60*60 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **IsTruncate** (bool) - 是否已被截断 + - **Log** (str) - 查询到的日志内容,一段纯文本 + - **MaxLine** (int) - 支持的最大行数 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUMongoDBLogRequestSchema().dumps(d) + + resp = self.invoke("GetUMongoDBLog", d, **kwargs) + return apis.GetUMongoDBLogResponseSchema().loads(resp) + + def get_umon_go_db_recover_time_range( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUMongoDBRecoverTimeRange - 获取UMongoDB可回档时间范围 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) 集群id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **EarliestTime** (int) - 最早可回档时间点 + - **LatestTime** (int) - 最晚可回档时间点 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUMongoDBRecoverTimeRangeRequestSchema().dumps(d) + + resp = self.invoke("GetUMongoDBRecoverTimeRange", d, **kwargs) + return apis.GetUMongoDBRecoverTimeRangeResponseSchema().loads(resp) + + def list_umon_go_db_backup( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUMongoDBBackup - 拉取实例备份列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) 实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **DataSet** (list) - 见 **BackupInfo** 模型定义 + - **Message** (str) - 错误信息 + + **Response Model** + + **BackupInfo** + - **BackupId** (str) - 备份ID + - **BackupName** (str) - 备份名称 + - **BackupSize** (int) - 备份数据大小 + - **BackupType** (str) - 备份类型 + - **BatchId** (str) - 批次id + - **ClusterId** (str) - 实例ID + - **DiskSize** (int) - 磁盘大小 + - **EndTime** (int) - 备份结束时间 + - **ReplicaType** (str) - 副本类型,ConfigRepl或者DataRepl + - **StartTime** (int) - 备份开始时间 + - **State** (str) - 备份状态 + - **VirtualClusterId** (str) - 虚拟节点id + - **Zone** (str) - 可用区 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUMongoDBBackupRequestSchema().dumps(d) + + resp = self.invoke("ListUMongoDBBackup", d, **kwargs) + return apis.ListUMongoDBBackupResponseSchema().loads(resp) + + def list_umon_go_db_config_template( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUMongoDBConfigTemplate - 拉取配置模板 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + + **Response** + + - **DataSet** (list) - 见 **ConfigTemplate** 模型定义 + - **Message** (str) - 错误信息 + + **Response Model** + + **ConfigTemplate** + - **ClusterType** (str) - 集群类型 + - **CreateTime** (int) - 创建时间 + - **DeleteTime** (int) - 删除时间 + - **Description** (str) - 模板描述 + - **ModifyTime** (int) - 修改时间 + - **MongodbVersion** (str) - mongo版本 + - **TemplateId** (str) - 模板ID + - **TemplateName** (str) - 模板名称 + - **TemplateType** (str) - 模板类型 UsersTemplate DefaultTemplate + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUMongoDBConfigTemplateRequestSchema().dumps(d) + + resp = self.invoke("ListUMongoDBConfigTemplate", d, **kwargs) + return apis.ListUMongoDBConfigTemplateResponseSchema().loads(resp) + + def list_umon_go_db_instances( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUMongoDBInstances - 获取副本集/分片集群列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - 集群ID + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **DataSet** (list) - 见 **MongodbInstance** 模型定义 + - **Message** (str) - 错误信息 + + **Response Model** + + **MongodbMachineType** + - **Cpu** (int) - cpu核数 + - **Description** (str) - 配置简称 2C4G + - **Group** (str) - 配置分组,2m , 4m + - **MachineTypeId** (str) - 机器类型ID o.mongo2m.medium,o.mongo2m.xlarge + - **Memory** (int) - 内存用量(GB) + - **UHhostMachineType** (str) - 机器类型,N/O + + + **MongodbInstance** + - **ClusterId** (str) - 副本集/分片集群ID + - **ClusterType** (str) - 集群类型,ReplicaSet :副本集,SharedCluster:分片集 + - **ConnectURL** (str) - 副本集/分片集群的访问地址 + - **CreateTime** (int) - 副本集/分片集群的创建时间 + - **CrossZones** (list) - 跨可用区列表 + - **DBVersion** (str) - 副本集/分片集群的Mongodb的版本,包括MongoDB-3.6, MongoDB-4.2 + - **DataComputeType** (dict) - 见 **MongodbMachineType** 模型定义 + - **DiskSpace** (int) - 数据节点磁盘空间(GB) + - **ExpiredTime** (int) - DB实例过期时间,采用UTC计时时间戳 + - **IPv6ConnectURL** (str) - 副本集/分片集IPv6访问地址 + - **Name** (str) - 副本集/分片集群实例名称 + - **State** (str) - 副本集/分片集群状态标记 Initing:初始化中,InitFailed:安装失败,Starting:启动中,StartFailed:启动失败,Running:运行,Stopping:关闭中,Stopped:已关闭, StopFailed:关闭失败,Deleting:删除中,Deleted:已删除,DeleteFailed:删除失败,Restarting:重启中,RestartFailed:重启失败,Upgrading: 升降级中,UpgradeFailed: 升降级失败,Switching:主备切换中 + - **SubnetId** (str) - 子网ID + - **Tag** (str) - 业务组 + - **VPCId** (str) - VPC的ID + - **Zone** (str) - 可用区 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUMongoDBInstancesRequestSchema().dumps(d) + + resp = self.invoke("ListUMongoDBInstances", d, **kwargs) + return apis.ListUMongoDBInstancesResponseSchema().loads(resp) + + def list_umon_go_db_log_package( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUMongoDBLogPackage - 日志打包列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) 集群id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **NodeId** (str) - 节点id + + **Response** + + - **DataSet** (list) - 见 **PackageInfo** 模型定义 + + **Response Model** + + **PackageInfo** + - **Begin** (int) - 开始时间 + - **ClusterId** (str) - 集群id + - **CreateTime** (int) - 创建时间 + - **End** (int) - 结束时间 + - **FinishTime** (int) - 完成时间 + - **Id** (int) - id + - **Name** (str) - 名称 + - **NodeId** (str) - 节点id + - **PackageType** (str) - SlowLog,ErrorLog + - **Role** (str) - 角色 + - **Size** (int) - 大小,单位字节 + - **State** (str) - Package_Running,Package_Success,Package_Failed,Package_Deleting,Package_Deleted,Package_DeleteFailed + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUMongoDBLogPackageRequestSchema().dumps(d) + + resp = self.invoke("ListUMongoDBLogPackage", d, **kwargs) + return apis.ListUMongoDBLogPackageResponseSchema().loads(resp) + + def list_umon_go_db_machine_spec( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUMongoDBMachineSpec - 获取UMongoDB支持机器类型列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ClassType** (str) - 机型,如O + - **DiskType** (str) - 磁盘类型,如CLOUD_RSSD + + **Response** + + - **DataSet** (list) - 见 **MongodbMachineSpec** 模型定义 + + **Response Model** + + **MongodbMachineType** + - **Cpu** (int) - cpu核数 + - **Description** (str) - 配置简称 2C4G + - **Group** (str) - 配置分组,2m , 4m + - **MachineTypeId** (str) - 机器类型ID o.mongo2m.medium,o.mongo2m.xlarge + - **Memory** (int) - 内存用量(GB) + - **UHhostMachineType** (str) - 机器类型,N/O + + + **MongodbMachineSpec** + - **ClassType** (str) - 规格类型;O | N + - **ComputeType** (list) - 见 **MongodbMachineType** 模型定义 + - **DefaultMachineType** (dict) - 见 **MongodbMachineType** 模型定义 + - **DiskType** (list) - 磁盘类型;CLOUD_RSSD | CLOUD_SSD | LOCAL_SSD + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUMongoDBMachineSpecRequestSchema().dumps(d) + + resp = self.invoke("ListUMongoDBMachineSpec", d, **kwargs) + return apis.ListUMongoDBMachineSpecResponseSchema().loads(resp) + + def list_umon_go_db_machine_type( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUMongoDBMachineType - 获取UmongDB支持机器类型列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **DataSet** (list) - 见 **MongodbMachineType** 模型定义 + + **Response Model** + + **MongodbMachineType** + - **Cpu** (int) - cpu核数 + - **Description** (str) - 配置简称 2C4G + - **Group** (str) - 配置分组,2m , 4m + - **MachineTypeId** (str) - 机器类型ID o.mongo2m.medium,o.mongo2m.xlarge + - **Memory** (int) - 内存用量(GB) + - **UHhostMachineType** (str) - 机器类型,N/O + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUMongoDBMachineTypeRequestSchema().dumps(d) + + resp = self.invoke("ListUMongoDBMachineType", d, **kwargs) + return apis.ListUMongoDBMachineTypeResponseSchema().loads(resp) + + def list_umon_go_db_version( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUMongoDBVersion - 获取UMongoDB支持版本列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **DataSet** (list) - 见 **MongoDBVersion** 模型定义 + + **Response Model** + + **MongoDBVersion** + - **DBVersion** (str) - MongoDB版本 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUMongoDBVersionRequestSchema().dumps(d) + + resp = self.invoke("ListUMongoDBVersion", d, **kwargs) + return apis.ListUMongoDBVersionResponseSchema().loads(resp) + + def modify_umon_go_db_admin_password( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUMongoDBAdminPassword - 修改MongoDB集群root密码 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) 集群ID + - **Password** (str) - (Required) 集群新密码(密码格式使用BASE64编码) + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyUMongoDBAdminPasswordRequestSchema().dumps(d) + + resp = self.invoke("ModifyUMongoDBAdminPassword", d, **kwargs) + return apis.ModifyUMongoDBAdminPasswordResponseSchema().loads(resp) + + def modify_umon_go_db_attribute( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUMongoDBAttribute - 修改MongoDB集群名称 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) 集群id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Name** (str) - 集群新名称(输入长度为6~63位名称) + - **RemarkName** (str) - 集群备注(Name和RemarkName必传其一) + + **Response** + + - **Message** (str) - 返回错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyUMongoDBAttributeRequestSchema().dumps(d) + + resp = self.invoke("ModifyUMongoDBAttribute", d, **kwargs) + return apis.ModifyUMongoDBAttributeResponseSchema().loads(resp) + + def modify_umon_go_db_backup_param( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUMongoDBBackupParam - 修改实例备份策略 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) 实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **AutoBackupToggleTime** (str) - 自动备份预期开始时间范围(00:00~23:59),默认 5:00~6:00 + - **AutoBackupToggleWeek** (str) - 自动备份预期星期几(1~7),默认 3,7 (周三,周日) + - **Disabled** (bool) - 是否禁用,true:禁用;false:开启 + + **Response** + + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyUMongoDBBackupParamRequestSchema().dumps(d) + + resp = self.invoke("ModifyUMongoDBBackupParam", d, **kwargs) + return apis.ModifyUMongoDBBackupParamResponseSchema().loads(resp) + + def resize_umon_go_db_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ResizeUMongoDBInstance - 集群配置升降级 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) 集群资源ID + - **DiskSpace** (int) - 集群数据节点磁盘配置 + - **MachineTypeId** (str) - 集群数据节点机型配置 + - **MongosMachineTypeId** (str) - 集群Mongos节点机型配置 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ResizeUMongoDBInstanceRequestSchema().dumps(d) + + resp = self.invoke("ResizeUMongoDBInstance", d, **kwargs) + return apis.ResizeUMongoDBInstanceResponseSchema().loads(resp) + + def restart_umon_go_db_cluster( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RestartUMongoDBCluster - 重启集群 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) 集群ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **ClusterId** (str) - 集群ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.RestartUMongoDBClusterRequestSchema().dumps(d) + + resp = self.invoke("RestartUMongoDBCluster", d, **kwargs) + return apis.RestartUMongoDBClusterResponseSchema().loads(resp) + + def start_umon_go_db_cluster( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """StartUMongoDBCluster - 启动集群 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) 集群ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **ClusterId** (str) - 集群ID + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.StartUMongoDBClusterRequestSchema().dumps(d) + + resp = self.invoke("StartUMongoDBCluster", d, **kwargs) + return apis.StartUMongoDBClusterResponseSchema().loads(resp) + + def stop_umon_go_db_cluster( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """StopUMongoDBCluster - 停止集群 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ClusterId** (str) - (Required) 集群ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **ClusterId** (str) - 集群ID + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.StopUMongoDBClusterRequestSchema().dumps(d) + + resp = self.invoke("StopUMongoDBCluster", d, **kwargs) + return apis.StopUMongoDBClusterResponseSchema().loads(resp) diff --git a/ucloud/services/umongodb/schemas/__init__.py b/ucloud/services/umongodb/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/umongodb/schemas/apis.py b/ucloud/services/umongodb/schemas/apis.py new file mode 100644 index 00000000..9e2ac062 --- /dev/null +++ b/ucloud/services/umongodb/schemas/apis.py @@ -0,0 +1,789 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.umongodb.schemas import models + +""" UMongoDB API Schema +""" + + +""" +API: BackupUMongoDBCluster + +备份集群数据库 +""" + + +class BackupUMongoDBClusterRequestSchema(schema.RequestSchema): + """BackupUMongoDBCluster - 备份集群数据库""" + + fields = { + "BackupName": fields.Str(required=True, dump_to="BackupName"), + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class BackupUMongoDBClusterResponseSchema(schema.ResponseSchema): + """BackupUMongoDBCluster - 备份集群数据库""" + + fields = { + "BackupId": fields.Str(required=True, load_from="BackupId"), + "ClusterId": fields.Str(required=True, load_from="ClusterId"), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: BackupUMongoDBLog + +日志打包 +""" + + +class BackupUMongoDBLogRequestSchema(schema.RequestSchema): + """BackupUMongoDBLog - 日志打包""" + + fields = { + "Begin": fields.Int(required=True, dump_to="Begin"), + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "End": fields.Int(required=True, dump_to="End"), + "LogType": fields.Str(required=True, dump_to="LogType"), + "Name": fields.Str(required=True, dump_to="Name"), + "NodeId": fields.Str(required=True, dump_to="NodeId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class BackupUMongoDBLogResponseSchema(schema.ResponseSchema): + """BackupUMongoDBLog - 日志打包""" + + fields = {} + + +""" +API: CreateUMongoDBConfigTemplate + +创建配置模板 +""" + + +class CreateUMongoDBConfigTemplateRequestSchema(schema.RequestSchema): + """CreateUMongoDBConfigTemplate - 创建配置模板""" + + fields = { + "BaseTemplateId": fields.Str(required=True, dump_to="BaseTemplateId"), + "ClusterType": fields.Str(required=True, dump_to="ClusterType"), + "Description": fields.Str(required=False, dump_to="Description"), + "MongodbVersion": fields.Str(required=True, dump_to="MongodbVersion"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "TemplateName": fields.Str(required=True, dump_to="TemplateName"), + } + + +class CreateUMongoDBConfigTemplateResponseSchema(schema.ResponseSchema): + """CreateUMongoDBConfigTemplate - 创建配置模板""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "TemplateId": fields.Str(required=True, load_from="TemplateId"), + } + + +""" +API: CreateUMongoDBReplSet + +创建一个Mongodb副本集群 +""" + + +class CreateUMongoDBReplSetParamSecGroupIdSchema(schema.RequestSchema): + """CreateUMongoDBReplSetParamSecGroupId -""" + + fields = { + "Id": fields.Str(required=False, dump_to="Id"), + "Priority": fields.Int(required=False, dump_to="Priority"), + } + + +class CreateUMongoDBReplSetParamLabelsSchema(schema.RequestSchema): + """CreateUMongoDBReplSetParamLabels -""" + + fields = { + "Key": fields.Str(required=False, dump_to="Key"), + "Value": fields.Str(required=False, dump_to="Value"), + } + + +class CreateUMongoDBReplSetRequestSchema(schema.RequestSchema): + """CreateUMongoDBReplSet - 创建一个Mongodb副本集群""" + + fields = { + "AdminPassword": fields.Str(required=True, dump_to="AdminPassword"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CrossZones": fields.List(fields.Str()), + "DBVersion": fields.Str(required=True, dump_to="DBVersion"), + "DiskSpace": fields.Int(required=True, dump_to="DiskSpace"), + "Labels": fields.List(CreateUMongoDBReplSetParamLabelsSchema()), + "ListenPort": fields.Int(required=False, dump_to="ListenPort"), + "MachineTypeId": fields.Str(required=True, dump_to="MachineTypeId"), + "Name": fields.Str(required=True, dump_to="Name"), + "NodeCount": fields.Int(required=True, dump_to="NodeCount"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "SecGroupId": fields.List(CreateUMongoDBReplSetParamSecGroupIdSchema()), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateUMongoDBReplSetResponseSchema(schema.ResponseSchema): + """CreateUMongoDBReplSet - 创建一个Mongodb副本集群""" + + fields = {} + + +""" +API: CreateUMongoDBShardedCluster + +创建一个Mongodb分片集群 +""" + + +class CreateUMongoDBShardedClusterParamSecGroupIdSchema(schema.RequestSchema): + """CreateUMongoDBShardedClusterParamSecGroupId -""" + + fields = { + "Id": fields.Str(required=False, dump_to="Id"), + "Priority": fields.Int(required=False, dump_to="Priority"), + } + + +class CreateUMongoDBShardedClusterParamLabelsSchema(schema.RequestSchema): + """CreateUMongoDBShardedClusterParamLabels -""" + + fields = { + "Key": fields.Str(required=False, dump_to="Key"), + "Value": fields.Str(required=False, dump_to="Value"), + } + + +class CreateUMongoDBShardedClusterRequestSchema(schema.RequestSchema): + """CreateUMongoDBShardedCluster - 创建一个Mongodb分片集群""" + + fields = { + "AdminPassword": fields.Str(required=True, dump_to="AdminPassword"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "DBVersion": fields.Str(required=True, dump_to="DBVersion"), + "DiskSpace": fields.Int(required=True, dump_to="DiskSpace"), + "Labels": fields.List(CreateUMongoDBShardedClusterParamLabelsSchema()), + "ListenPort": fields.Int(required=False, dump_to="ListenPort"), + "MachineTypeId": fields.Str(required=True, dump_to="MachineTypeId"), + "MongosMachineTypeId": fields.Str( + required=False, dump_to="MongosMachineTypeId" + ), + "MongosNodeCount": fields.Int(required=True, dump_to="MongosNodeCount"), + "Name": fields.Str(required=True, dump_to="Name"), + "NodeCount": fields.Int(required=True, dump_to="NodeCount"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "SecGroupId": fields.List( + CreateUMongoDBShardedClusterParamSecGroupIdSchema() + ), + "ShardCount": fields.Int(required=True, dump_to="ShardCount"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "TemplateId": fields.Str(required=False, dump_to="TemplateId"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateUMongoDBShardedClusterResponseSchema(schema.ResponseSchema): + """CreateUMongoDBShardedCluster - 创建一个Mongodb分片集群""" + + fields = {} + + +""" +API: DescribeUMongoDBBackupURL + +获取实例备份下载链接 +""" + + +class DescribeUMongoDBBackupURLRequestSchema(schema.RequestSchema): + """DescribeUMongoDBBackupURL - 获取实例备份下载链接""" + + fields = { + "BackupId": fields.Str(required=False, dump_to="BackupId"), + "Category": fields.Str(required=False, dump_to="Category"), + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "PackageId": fields.Int(required=False, dump_to="PackageId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ValidTime": fields.Int(required=False, dump_to="ValidTime"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DescribeUMongoDBBackupURLResponseSchema(schema.ResponseSchema): + """DescribeUMongoDBBackupURL - 获取实例备份下载链接""" + + fields = { + "InternetAddress": fields.Str( + required=True, load_from="InternetAddress" + ), + "IntranetAddress": fields.Str( + required=True, load_from="IntranetAddress" + ), + } + + +""" +API: DescribeUMongoDBInstance + +描述MongoDB实例 +""" + + +class DescribeUMongoDBInstanceRequestSchema(schema.RequestSchema): + """DescribeUMongoDBInstance - 描述MongoDB实例""" + + fields = { + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "ClusterType": fields.Str(required=False, dump_to="ClusterType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DescribeUMongoDBInstanceResponseSchema(schema.ResponseSchema): + """DescribeUMongoDBInstance - 描述MongoDB实例""" + + fields = { + "ClusterInfo": models.ClusterInfoSchema(), + } + + +""" +API: GetUMongoDBBackupParam + +获取实例备份策略 +""" + + +class GetUMongoDBBackupParamRequestSchema(schema.RequestSchema): + """GetUMongoDBBackupParam - 获取实例备份策略""" + + fields = { + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetUMongoDBBackupParamResponseSchema(schema.ResponseSchema): + """GetUMongoDBBackupParam - 获取实例备份策略""" + + fields = { + "DataSet": models.BackupParamSchema(), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: GetUMongoDBCfgTempItem + +获取配置模板内容 +""" + + +class GetUMongoDBCfgTempItemRequestSchema(schema.RequestSchema): + """GetUMongoDBCfgTempItem - 获取配置模板内容""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "TemplateId": fields.Str(required=True, dump_to="TemplateId"), + } + + +class GetUMongoDBCfgTempItemResponseSchema(schema.ResponseSchema): + """GetUMongoDBCfgTempItem - 获取配置模板内容""" + + fields = { + "DataSet": fields.List( + models.ConfigTemplateItemSchema(), + required=True, + load_from="DataSet", + ), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: GetUMongoDBLog + +查询某一段时间内集群节点的错误日志或慢查询日志 +""" + + +class GetUMongoDBLogRequestSchema(schema.RequestSchema): + """GetUMongoDBLog - 查询某一段时间内集群节点的错误日志或慢查询日志""" + + fields = { + "Begin": fields.Int(required=True, dump_to="Begin"), + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "End": fields.Int(required=False, dump_to="End"), + "LogType": fields.Str(required=True, dump_to="LogType"), + "NodeId": fields.Str(required=True, dump_to="NodeId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class GetUMongoDBLogResponseSchema(schema.ResponseSchema): + """GetUMongoDBLog - 查询某一段时间内集群节点的错误日志或慢查询日志""" + + fields = { + "IsTruncate": fields.Bool(required=False, load_from="IsTruncate"), + "Log": fields.Str(required=True, load_from="Log"), + "MaxLine": fields.Int(required=False, load_from="MaxLine"), + } + + +""" +API: GetUMongoDBRecoverTimeRange + +获取UMongoDB可回档时间范围 +""" + + +class GetUMongoDBRecoverTimeRangeRequestSchema(schema.RequestSchema): + """GetUMongoDBRecoverTimeRange - 获取UMongoDB可回档时间范围""" + + fields = { + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetUMongoDBRecoverTimeRangeResponseSchema(schema.ResponseSchema): + """GetUMongoDBRecoverTimeRange - 获取UMongoDB可回档时间范围""" + + fields = { + "EarliestTime": fields.Int(required=True, load_from="EarliestTime"), + "LatestTime": fields.Int(required=True, load_from="LatestTime"), + } + + +""" +API: ListUMongoDBBackup + +拉取实例备份列表 +""" + + +class ListUMongoDBBackupRequestSchema(schema.RequestSchema): + """ListUMongoDBBackup - 拉取实例备份列表""" + + fields = { + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ListUMongoDBBackupResponseSchema(schema.ResponseSchema): + """ListUMongoDBBackup - 拉取实例备份列表""" + + fields = { + "DataSet": fields.List( + models.BackupInfoSchema(), required=True, load_from="DataSet" + ), + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: ListUMongoDBConfigTemplate + +拉取配置模板 +""" + + +class ListUMongoDBConfigTemplateRequestSchema(schema.RequestSchema): + """ListUMongoDBConfigTemplate - 拉取配置模板""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class ListUMongoDBConfigTemplateResponseSchema(schema.ResponseSchema): + """ListUMongoDBConfigTemplate - 拉取配置模板""" + + fields = { + "DataSet": fields.List( + models.ConfigTemplateSchema(), required=True, load_from="DataSet" + ), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: ListUMongoDBInstances + +获取副本集/分片集群列表 +""" + + +class ListUMongoDBInstancesRequestSchema(schema.RequestSchema): + """ListUMongoDBInstances - 获取副本集/分片集群列表""" + + fields = { + "ClusterId": fields.Str(required=False, dump_to="ClusterId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class ListUMongoDBInstancesResponseSchema(schema.ResponseSchema): + """ListUMongoDBInstances - 获取副本集/分片集群列表""" + + fields = { + "DataSet": fields.List( + models.MongodbInstanceSchema(), required=False, load_from="DataSet" + ), + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: ListUMongoDBLogPackage + +日志打包列表 +""" + + +class ListUMongoDBLogPackageRequestSchema(schema.RequestSchema): + """ListUMongoDBLogPackage - 日志打包列表""" + + fields = { + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "NodeId": fields.Str(required=False, dump_to="NodeId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ListUMongoDBLogPackageResponseSchema(schema.ResponseSchema): + """ListUMongoDBLogPackage - 日志打包列表""" + + fields = { + "DataSet": fields.List( + models.PackageInfoSchema(), required=True, load_from="DataSet" + ), + } + + +""" +API: ListUMongoDBMachineSpec + +获取UMongoDB支持机器类型列表 +""" + + +class ListUMongoDBMachineSpecRequestSchema(schema.RequestSchema): + """ListUMongoDBMachineSpec - 获取UMongoDB支持机器类型列表""" + + fields = { + "ClassType": fields.Str(required=False, dump_to="ClassType"), + "DiskType": fields.Str(required=False, dump_to="DiskType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ListUMongoDBMachineSpecResponseSchema(schema.ResponseSchema): + """ListUMongoDBMachineSpec - 获取UMongoDB支持机器类型列表""" + + fields = { + "DataSet": fields.List( + models.MongodbMachineSpecSchema(), + required=True, + load_from="DataSet", + ), + } + + +""" +API: ListUMongoDBMachineType + +获取UmongDB支持机器类型列表 +""" + + +class ListUMongoDBMachineTypeRequestSchema(schema.RequestSchema): + """ListUMongoDBMachineType - 获取UmongDB支持机器类型列表""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ListUMongoDBMachineTypeResponseSchema(schema.ResponseSchema): + """ListUMongoDBMachineType - 获取UmongDB支持机器类型列表""" + + fields = { + "DataSet": fields.List( + models.MongodbMachineTypeSchema(), + required=True, + load_from="DataSet", + ), + } + + +""" +API: ListUMongoDBVersion + +获取UMongoDB支持版本列表 +""" + + +class ListUMongoDBVersionRequestSchema(schema.RequestSchema): + """ListUMongoDBVersion - 获取UMongoDB支持版本列表""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ListUMongoDBVersionResponseSchema(schema.ResponseSchema): + """ListUMongoDBVersion - 获取UMongoDB支持版本列表""" + + fields = { + "DataSet": fields.List( + models.MongoDBVersionSchema(), required=True, load_from="DataSet" + ), + } + + +""" +API: ModifyUMongoDBAdminPassword + +修改MongoDB集群root密码 +""" + + +class ModifyUMongoDBAdminPasswordRequestSchema(schema.RequestSchema): + """ModifyUMongoDBAdminPassword - 修改MongoDB集群root密码""" + + fields = { + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "Password": fields.Str(required=True, dump_to="Password"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ModifyUMongoDBAdminPasswordResponseSchema(schema.ResponseSchema): + """ModifyUMongoDBAdminPassword - 修改MongoDB集群root密码""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: ModifyUMongoDBAttribute + +修改MongoDB集群名称 +""" + + +class ModifyUMongoDBAttributeRequestSchema(schema.RequestSchema): + """ModifyUMongoDBAttribute - 修改MongoDB集群名称""" + + fields = { + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "RemarkName": fields.Str(required=False, dump_to="RemarkName"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ModifyUMongoDBAttributeResponseSchema(schema.ResponseSchema): + """ModifyUMongoDBAttribute - 修改MongoDB集群名称""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: ModifyUMongoDBBackupParam + +修改实例备份策略 +""" + + +class ModifyUMongoDBBackupParamRequestSchema(schema.RequestSchema): + """ModifyUMongoDBBackupParam - 修改实例备份策略""" + + fields = { + "AutoBackupToggleTime": fields.Str( + required=False, dump_to="AutoBackupToggleTime" + ), + "AutoBackupToggleWeek": fields.Str( + required=False, dump_to="AutoBackupToggleWeek" + ), + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "Disabled": fields.Bool(required=False, dump_to="Disabled"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ModifyUMongoDBBackupParamResponseSchema(schema.ResponseSchema): + """ModifyUMongoDBBackupParam - 修改实例备份策略""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: ResizeUMongoDBInstance + +集群配置升降级 +""" + + +class ResizeUMongoDBInstanceRequestSchema(schema.RequestSchema): + """ResizeUMongoDBInstance - 集群配置升降级""" + + fields = { + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "DiskSpace": fields.Int(required=False, dump_to="DiskSpace"), + "MachineTypeId": fields.Str(required=False, dump_to="MachineTypeId"), + "MongosMachineTypeId": fields.Str( + required=False, dump_to="MongosMachineTypeId" + ), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class ResizeUMongoDBInstanceResponseSchema(schema.ResponseSchema): + """ResizeUMongoDBInstance - 集群配置升降级""" + + fields = {} + + +""" +API: RestartUMongoDBCluster + +重启集群 +""" + + +class RestartUMongoDBClusterRequestSchema(schema.RequestSchema): + """RestartUMongoDBCluster - 重启集群""" + + fields = { + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class RestartUMongoDBClusterResponseSchema(schema.ResponseSchema): + """RestartUMongoDBCluster - 重启集群""" + + fields = { + "ClusterId": fields.Str(required=True, load_from="ClusterId"), + } + + +""" +API: StartUMongoDBCluster + +启动集群 +""" + + +class StartUMongoDBClusterRequestSchema(schema.RequestSchema): + """StartUMongoDBCluster - 启动集群""" + + fields = { + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class StartUMongoDBClusterResponseSchema(schema.ResponseSchema): + """StartUMongoDBCluster - 启动集群""" + + fields = { + "ClusterId": fields.Str(required=True, load_from="ClusterId"), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: StopUMongoDBCluster + +停止集群 +""" + + +class StopUMongoDBClusterRequestSchema(schema.RequestSchema): + """StopUMongoDBCluster - 停止集群""" + + fields = { + "ClusterId": fields.Str(required=True, dump_to="ClusterId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class StopUMongoDBClusterResponseSchema(schema.ResponseSchema): + """StopUMongoDBCluster - 停止集群""" + + fields = { + "ClusterId": fields.Str(required=True, load_from="ClusterId"), + "Message": fields.Str(required=True, load_from="Message"), + } diff --git a/ucloud/services/umongodb/schemas/models.py b/ucloud/services/umongodb/schemas/models.py new file mode 100644 index 00000000..5f5e44f1 --- /dev/null +++ b/ucloud/services/umongodb/schemas/models.py @@ -0,0 +1,285 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class MongodbMachineTypeSchema(schema.ResponseSchema): + """MongodbMachineType -""" + + fields = { + "Cpu": fields.Int(required=True, load_from="Cpu"), + "Description": fields.Str(required=True, load_from="Description"), + "Group": fields.Str(required=False, load_from="Group"), + "MachineTypeId": fields.Str(required=True, load_from="MachineTypeId"), + "Memory": fields.Int(required=True, load_from="Memory"), + "UHhostMachineType": fields.Str( + required=False, load_from="UHhostMachineType" + ), + } + + +class DiskInfoSchema(schema.ResponseSchema): + """DiskInfo - 磁盘信息""" + + fields = { + "DiskId": fields.Str(required=False, load_from="DiskId"), + "DiskSize": fields.Int(required=False, load_from="DiskSize"), + } + + +class NodeInfoSchema(schema.ResponseSchema): + """NodeInfo - 节点信息""" + + fields = { + "ClusterId": fields.Str(required=False, load_from="ClusterId"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DBVersion": fields.Str(required=False, load_from="DBVersion"), + "DataDisk": DiskInfoSchema(), + "MachineType": fields.Str(required=False, load_from="MachineType"), + "MachineTypeId": fields.Str(required=False, load_from="MachineTypeId"), + "NodeId": fields.Str(required=False, load_from="NodeId"), + "NodeRole": fields.Str(required=False, load_from="NodeRole"), + "NodeType": fields.Str(required=False, load_from="NodeType"), + "State": fields.Str(required=False, load_from="State"), + "SysDisk": DiskInfoSchema(), + "VirtualClusterId": fields.Str( + required=False, load_from="VirtualClusterId" + ), + "Zone": fields.Str(required=False, load_from="Zone"), + "ZoneId": fields.Int(required=False, load_from="ZoneId"), + } + + +class ReplicaInfoSchema(schema.ResponseSchema): + """ReplicaInfo - 副本集群信息""" + + fields = { + "ClusterId": fields.Str(required=False, load_from="ClusterId"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DeleteTime": fields.Int(required=False, load_from="DeleteTime"), + "IsolationGroupId": fields.Str( + required=False, load_from="IsolationGroupId" + ), + "MachineType": fields.Str(required=False, load_from="MachineType"), + "MachineTypeId": fields.Str(required=False, load_from="MachineTypeId"), + "ModifyTime": fields.Int(required=False, load_from="ModifyTime"), + "NodeCount": fields.Int(required=False, load_from="NodeCount"), + "NodeInfos": fields.List(NodeInfoSchema()), + "ReplicaId": fields.Str(required=False, load_from="ReplicaId"), + "ReplicaType": fields.Str(required=False, load_from="ReplicaType"), + "State": fields.Str(required=False, load_from="State"), + } + + +class ClusterInfoSchema(schema.ResponseSchema): + """ClusterInfo - 集群信息""" + + fields = { + "ClusterId": fields.Str(required=False, load_from="ClusterId"), + "ClusterType": fields.Str(required=False, load_from="ClusterType"), + "ConfigComputeType": MongodbMachineTypeSchema(), + "ConfigMachineType": fields.Str( + required=False, load_from="ConfigMachineType" + ), + "ConfigNodeCount": fields.Int( + required=False, load_from="ConfigNodeCount" + ), + "ConfigReplicaInfo": ReplicaInfoSchema(), + "ConnectURL": fields.Str(required=False, load_from="ConnectURL"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "CrossZones": fields.List(fields.Str()), + "DBVersion": fields.Str(required=False, load_from="DBVersion"), + "DataComputeType": MongodbMachineTypeSchema(), + "DataReplicaInfos": fields.List(ReplicaInfoSchema()), + "DeleteTime": fields.Int(required=False, load_from="DeleteTime"), + "DiskSpace": fields.Int(required=False, load_from="DiskSpace"), + "EnableSSL": fields.Int(required=False, load_from="EnableSSL"), + "InstanceName": fields.Str(required=False, load_from="InstanceName"), + "MachineTypeId": fields.Str(required=False, load_from="MachineTypeId"), + "MongosComputeType": MongodbMachineTypeSchema(), + "MongosCount": fields.Int(required=False, load_from="MongosCount"), + "MongosInfo": fields.List(NodeInfoSchema()), + "SSLExpirationTime": fields.Int( + required=False, load_from="SSLExpirationTime" + ), + "ShardCount": fields.Int(required=False, load_from="ShardCount"), + "ShardNodeCount": fields.Int( + required=False, load_from="ShardNodeCount" + ), + "State": fields.Str(required=False, load_from="State"), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "Tag": fields.Str(required=False, load_from="Tag"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + "Zone": fields.Str(required=False, load_from="Zone"), + "ZoneId": fields.Int(required=False, load_from="ZoneId"), + } + + +class BackupParamSchema(schema.ResponseSchema): + """BackupParam - 备份策略模型""" + + fields = { + "AutoBackupCopies": fields.Int( + required=False, load_from="AutoBackupCopies" + ), + "AutoBackupToggleTime": fields.Str( + required=False, load_from="AutoBackupToggleTime" + ), + "AutoBackupToggleWeek": fields.Str( + required=False, load_from="AutoBackupToggleWeek" + ), + "ClusterId": fields.Str(required=True, load_from="ClusterId"), + "Disabled": fields.Bool(required=False, load_from="Disabled"), + "ManualBackupCopies": fields.Int( + required=False, load_from="ManualBackupCopies" + ), + } + + +class ConfigOptionsSchema(schema.ResponseSchema): + """ConfigOptions - 配置选项""" + + fields = { + "AllowedApplyType": fields.Str( + required=False, load_from="AllowedApplyType" + ), + "Description": fields.Str(required=False, load_from="Description"), + "EnableDisplay": fields.Bool(required=False, load_from="EnableDisplay"), + "EnableModify": fields.Bool(required=False, load_from="EnableModify"), + "ForceRestart": fields.Bool(required=False, load_from="ForceRestart"), + "IsDefaultOption": fields.Bool( + required=False, load_from="IsDefaultOption" + ), + "MongodbVersion": fields.Str( + required=False, load_from="MongodbVersion" + ), + "OptionDefaultValue": fields.Str( + required=False, load_from="OptionDefaultValue" + ), + "OptionFormatType": fields.Str( + required=False, load_from="OptionFormatType" + ), + "OptionName": fields.Str(required=False, load_from="OptionName"), + "OptionValueType": fields.Str( + required=False, load_from="OptionValueType" + ), + "OptionValues": fields.Str(required=False, load_from="OptionValues"), + } + + +class ConfigTemplateItemSchema(schema.ResponseSchema): + """ConfigTemplateItem - 配置模板项""" + + fields = { + "ConfigName": fields.Str(required=False, load_from="ConfigName"), + "ConfigOption": ConfigOptionsSchema(), + "ConfigValue": fields.Str(required=False, load_from="ConfigValue"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "ItemId": fields.Str(required=False, load_from="ItemId"), + "ModifyTime": fields.Int(required=False, load_from="ModifyTime"), + "NodeType": fields.Str(required=False, load_from="NodeType"), + "TemplateId": fields.Str(required=False, load_from="TemplateId"), + } + + +class BackupInfoSchema(schema.ResponseSchema): + """BackupInfo - 备份数据模型""" + + fields = { + "BackupId": fields.Str(required=True, load_from="BackupId"), + "BackupName": fields.Str(required=False, load_from="BackupName"), + "BackupSize": fields.Int(required=False, load_from="BackupSize"), + "BackupType": fields.Str(required=False, load_from="BackupType"), + "BatchId": fields.Str(required=False, load_from="BatchId"), + "ClusterId": fields.Str(required=False, load_from="ClusterId"), + "DiskSize": fields.Int(required=False, load_from="DiskSize"), + "EndTime": fields.Int(required=False, load_from="EndTime"), + "ReplicaType": fields.Str(required=False, load_from="ReplicaType"), + "StartTime": fields.Int(required=False, load_from="StartTime"), + "State": fields.Str(required=False, load_from="State"), + "VirtualClusterId": fields.Str( + required=False, load_from="VirtualClusterId" + ), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class ConfigTemplateSchema(schema.ResponseSchema): + """ConfigTemplate - 配置模板""" + + fields = { + "ClusterType": fields.Str(required=False, load_from="ClusterType"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DeleteTime": fields.Int(required=False, load_from="DeleteTime"), + "Description": fields.Str(required=False, load_from="Description"), + "ModifyTime": fields.Int(required=False, load_from="ModifyTime"), + "MongodbVersion": fields.Str( + required=False, load_from="MongodbVersion" + ), + "TemplateId": fields.Str(required=False, load_from="TemplateId"), + "TemplateName": fields.Str(required=False, load_from="TemplateName"), + "TemplateType": fields.Str(required=False, load_from="TemplateType"), + } + + +class MongodbInstanceSchema(schema.ResponseSchema): + """MongodbInstance - 集群信息""" + + fields = { + "ClusterId": fields.Str(required=True, load_from="ClusterId"), + "ClusterType": fields.Str(required=True, load_from="ClusterType"), + "ConnectURL": fields.Str(required=True, load_from="ConnectURL"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "CrossZones": fields.List(fields.Str()), + "DBVersion": fields.Str(required=True, load_from="DBVersion"), + "DataComputeType": MongodbMachineTypeSchema(), + "DiskSpace": fields.Int(required=False, load_from="DiskSpace"), + "ExpiredTime": fields.Int(required=False, load_from="ExpiredTime"), + "IPv6ConnectURL": fields.Str( + required=False, load_from="IPv6ConnectURL" + ), + "Name": fields.Str(required=True, load_from="Name"), + "State": fields.Str(required=True, load_from="State"), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "Tag": fields.Str(required=False, load_from="Tag"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + "Zone": fields.Str(required=True, load_from="Zone"), + } + + +class PackageInfoSchema(schema.ResponseSchema): + """PackageInfo - 打包模型""" + + fields = { + "Begin": fields.Int(required=False, load_from="Begin"), + "ClusterId": fields.Str(required=False, load_from="ClusterId"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "End": fields.Int(required=False, load_from="End"), + "FinishTime": fields.Int(required=False, load_from="FinishTime"), + "Id": fields.Int(required=False, load_from="Id"), + "Name": fields.Str(required=False, load_from="Name"), + "NodeId": fields.Str(required=False, load_from="NodeId"), + "PackageType": fields.Str(required=False, load_from="PackageType"), + "Role": fields.Str(required=False, load_from="Role"), + "Size": fields.Int(required=False, load_from="Size"), + "State": fields.Str(required=False, load_from="State"), + } + + +class MongodbMachineSpecSchema(schema.ResponseSchema): + """MongodbMachineSpec - 规格类型""" + + fields = { + "ClassType": fields.Str(required=False, load_from="ClassType"), + "ComputeType": fields.List(MongodbMachineTypeSchema()), + "DefaultMachineType": MongodbMachineTypeSchema(), + "DiskType": fields.List(fields.Str()), + } + + +class MongoDBVersionSchema(schema.ResponseSchema): + """MongoDBVersion -""" + + fields = { + "DBVersion": fields.Str(required=False, load_from="DBVersion"), + } diff --git a/ucloud/services/unet/client.py b/ucloud/services/unet/client.py index 5427db61..8996d590 100644 --- a/ucloud/services/unet/client.py +++ b/ucloud/services/unet/client.py @@ -2,6 +2,7 @@ import typing + from ucloud.core.client import Client from ucloud.services.unet.schemas import apis @@ -13,42 +14,46 @@ def __init__( super(UNetClient, self).__init__(config, transport, middleware, logger) def allocate_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ AllocateEIP - 根据提供信息, 申请弹性IP + """AllocateEIP - 根据提供信息, 申请弹性IP **Request** - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 - **Region** (str) - (Config) 地域。 - - **Bandwidth** (int) - (Required) 弹性IP的外网带宽, 单位为Mbps. 共享带宽模式必须指定0M带宽, 非共享带宽模式必须指定非0Mbps带宽. 各地域非共享带宽的带宽范围如下: 流量计费[1-200],带宽计费[1-800] - - **OperatorName** (str) - (Required) 弹性IP的线路如下: 国际: International BGP: Bgp 各地域允许的线路参数如下: cn-sh1: Bgp cn-sh2: Bgp cn-gd: Bgp cn-bj1: Bgp cn-bj2: Bgp hk: International us-ca: International th-bkk: International kr-seoul:International us-ws:International ge-fra:International sg:International tw-kh:International.其他海外线路均为 International - - **ChargeType** (str) - 付费方式, 枚举值为: Year, 按年付费; Month, 按月付费; Dynamic, 按需付费(需开启权限); Trial, 试用(需开启权限) 默认为按月付费 + - **Bandwidth** (int) - (Required) 弹性IP的外网带宽, 单位为Mbps. 共享带宽模式必须指定0M带宽, 非共享带宽模式必须指定非0Mbps带宽. 各地域非共享带宽的带宽范围如下: 流量计费[1-300],带宽计费[1-10000] + - **OperatorName** (str) - (Required) 弹性IP线路,枚举值:国际线路, International;BGP线路:Bgp;精品BGP:BGPPro。使用BGP线路的地域:北京二、上海金融云、上海二、广州等,其他地域均使用国际线路。使用BGPPro线路的地域:香港 + - **ChargeType** (str) - 付费方式, 枚举值为: Year, 按年付费; Month, 按月付费; Dynamic, 按时付费,默认为按月付费。 + - **Count** (int) - 购买EIP数量,默认值为1 - **CouponId** (str) - 代金券ID, 默认不使用 - **Name** (str) - 弹性IP的名称, 默认为 "EIP" - - **PayMode** (str) - 弹性IP的计费模式. 枚举值: "Traffic", 流量计费; "Bandwidth", 带宽计费; "ShareBandwidth",共享带宽模式. 默认为 "Bandwidth". - - **Quantity** (int) - 购买时长, 默认: 1 + - **PayMode** (str) - 弹性IP的计费模式. 枚举值: "Traffic", 流量计费; "Bandwidth", 带宽计费; "ShareBandwidth",共享带宽模式. 默认为 "Bandwidth".“PostAccurateBandwidth”:带宽后付费模式 + - **Quantity** (int) - 购买的时长, 默认: 1 - **Remark** (str) - 弹性IP的备注, 默认为空 - - **ShareBandwidthId** (str) - 绑定的共享带宽Id,仅当PayMode为ShareBandwidth时有效 + - **ShareBandwidthId** (str) - 绑定的共享带宽Id,仅当PayMode为ShareBandwidth时有效 - **Tag** (str) - 业务组名称, 默认为 "Default" - + **Response** - **EIPSet** (list) - 见 **UnetAllocateEIPSet** 模型定义 - + **Response Model** - - **UnetEIPAddrSet** - - - **IP** (str) - IP地址 - - **OperatorName** (str) - 运营商信息如: 电信: Telecom, 联通: Unicom, 国际: International, Duplet: 双线IP(电信+联通), BGP: Bgp - **UnetAllocateEIPSet** - + **UnetAllocateEIPSet** - **EIPAddr** (list) - 见 **UnetEIPAddrSet** 模型定义 - **EIPId** (str) - 申请到的EIP资源ID + + **UnetEIPAddrSet** + - **IP** (str) - IP地址 + - **OperatorName** (str) - 运营商信息如: 电信: Telecom, 联通: Unicom, 国际: International, Duplet: 双线IP(电信+联通), BGP: Bgp + + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.AllocateEIPRequestSchema().dumps(d) @@ -61,26 +66,30 @@ def allocate_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def allocate_share_bandwidth( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ AllocateShareBandwidth - 开通共享带宽 + """AllocateShareBandwidth - 开通共享带宽 **Request** - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **ChargeType** (str) - (Required) 付费方式:Year 按年,Month 按月,Dynamic 按时; - **Name** (str) - (Required) 共享带宽名字 - **ShareBandwidth** (int) - (Required) 共享带宽值 - - **BwType** (str) - 共享带宽类型,ipv4或者ipv6,不传默认ipv4 + - **IPVersion** (str) - 共享带宽类型,IPv4或者IPv6,不传默认IPv4 + - **OperatorName** (str) - 共享带宽线路:BGP 国内多线,International 国际多线,ChinaMobile 移动单线,Unicom 联通单线,Telecom 电信单线,BGPPro 精品BGP(仅香港支持精品BGP) - **Quantity** (int) - 购买时长 - - **ShareBandwidthGuarantee** (int) - 共享带宽保底值(后付费) - + - **Tag** (str) - 业务组名称, 默认为 "Default" + **Response** - **ShareBandwidthId** (str) - 共享带宽资源Id - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.AllocateShareBandwidthRequestSchema().dumps(d) @@ -90,52 +99,10 @@ def allocate_share_bandwidth( resp = self.invoke("AllocateShareBandwidth", d, **kwargs) return apis.AllocateShareBandwidthResponseSchema().loads(resp) - def allocate_vip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ AllocateVIP - 根据提供信息,申请内网VIP(Virtual IP),多用于高可用程序作为漂移IP。 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域 - - **SubnetId** (str) - (Required) 子网id - - **VPCId** (str) - (Required) 指定vip所属的VPC - - **BusinessId** (str) - 业务组 - - **Count** (int) - 申请数量,默认: 1 - - **Ip** (str) - 指定ip - - **Name** (str) - vip名,默认为VIP - - **Remark** (str) - 备注 - - **Tag** (str) - 业务组名称,默认为Default - - **Zone** (str) - 可用区 - - **Response** - - - **DataSet** (list) - 申请到的VIP地址 - - **VIPSet** (list) - 见 **VIPSet** 模型定义 - - **Response Model** - - **VIPSet** - - - **VIP** (str) - 虚拟ip - - **VIPId** (str) - 虚拟ip id - - **VPCId** (str) - VPC id - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.AllocateVIPRequestSchema().dumps(d) - - # build options - kwargs["max_retries"] = 0 # ignore retry when api is not idempotent - - resp = self.invoke("AllocateVIP", d, **kwargs) - return apis.AllocateVIPResponseSchema().loads(resp) - def associate_eip_with_share_bandwidth( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ AssociateEIPWithShareBandwidth - 将EIP加入共享带宽 + """AssociateEIPWithShareBandwidth - 将EIP加入共享带宽 **Request** @@ -143,13 +110,17 @@ def associate_eip_with_share_bandwidth( - **Region** (str) - (Config) 地域。 - **EIPIds** (list) - (Required) 要加入共享带宽的EIP的资源Id - **ShareBandwidthId** (str) - (Required) 共享带宽ID - + - **IPVersion** (str) - 共享带宽类型,IPv4或者IPv6,不传默认IPv4 + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.AssociateEIPWithShareBandwidthRequestSchema().dumps(d) @@ -157,7 +128,7 @@ def associate_eip_with_share_bandwidth( return apis.AssociateEIPWithShareBandwidthResponseSchema().loads(resp) def bind_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ BindEIP - 将尚未使用的弹性IP绑定到指定的资源 + """BindEIP - 将尚未使用的弹性IP绑定到指定的资源 **Request** @@ -165,14 +136,18 @@ def bind_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **Region** (str) - (Config) 地域 - **EIPId** (str) - (Required) 弹性IP的资源Id - **ResourceId** (str) - (Required) 弹性IP请求绑定的资源ID - - **ResourceType** (str) - (Required) 弹性IP请求绑定的资源类型, 枚举值为: uhost: 云主机; ulb, 负载均衡器 upm: 物理机; hadoophost: 大数据集群;fortresshost:堡垒机;udockhost:容器;udhost:私有专区主机;natgw:natgw;udb:udb;vpngw:ipsec vpn;ucdr:云灾备;dbaudit:数据库审计;uni:虚拟网卡。 - + - **ResourceType** (str) - (Required) 弹性IP请求绑定的资源类型, 枚举值为: uhost: 云主机; ulb, 负载均衡器 upm: 物理机; hadoophost: 大数据集群;fortresshost:堡垒机;udockhost:容器;udhost:私有专区主机;natgw:natgw;udb:udb;vpngw:ipsec vpn;ucdr:云灾备;dbaudit:数据库审计;uni:虚拟网卡;cube,Cube容器。如果EIP为普通带宽计费,且带宽值高于2G,则只允许绑定在快杰型云主机和ULB + - **PrivateIP** (str) - EIP与内网IP进行绑定时需要传入UNI下未绑定过EIP的内网IP + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.BindEIPRequestSchema().dumps(d) @@ -182,25 +157,28 @@ def bind_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def create_bandwidth_package( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateBandwidthPackage - 为非共享带宽模式下, 已绑定资源实例的带宽计费弹性IP附加临时带宽包 + """CreateBandwidthPackage - 为非共享带宽模式下, 已绑定资源实例的带宽计费弹性IP附加临时带宽包 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 - - **Region** (str) - (Config) 地域 + - **ProjectId** (str) - (Config) + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Bandwidth** (int) - (Required) 带宽大小(单位Mbps), 取值范围[2,800] (最大值受地域限制) - **EIPId** (str) - (Required) 所绑定弹性IP的资源ID - **TimeRange** (int) - (Required) 带宽包有效时长, 取值范围为大于0的整数, 即该带宽包在EnableTime到 EnableTime+TimeRange时间段内生效 - **CouponId** (str) - 代金券ID - **EnableTime** (int) - 生效时间, 格式为 Unix timestamp, 默认为立即开通 - + **Response** - **BandwidthPackageId** (str) - 所创建带宽包的资源ID - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.CreateBandwidthPackageRequestSchema().dumps(d) @@ -213,24 +191,27 @@ def create_bandwidth_package( def create_firewall( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateFirewall - 创建防火墙 + """CreateFirewall - 创建防火墙 **Request** - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写 - **Region** (str) - (Config) 地域 - **Name** (str) - (Required) 防火墙名称 - - **Rule** (list) - (Required) 防火墙规则,例如:TCP|22|192.168.1.1/22|DROP|LOW|禁用22端口,第一个参数代表协议:第二个参数代表端口号,第三个参数为ip,第四个参数为ACCEPT(接受)和DROP(拒绝),第五个参数优先级:HIGH(高),MEDIUM(中),LOW(低),第六个参数为该条规则的自定义备注 + - **Rule** (list) - (Required) 防火墙规则,例如:TCP|22|192.168.1.1/22|DROP|LOW|禁用22端口,第一个参数代表协议:第二个参数代表端口号,第三个参数为ip,第四个参数为ACCEPT(接受)和DROP(拒绝),第五个参数优先级:HIGH(高),MEDIUM(中),LOW(低),第六个参数为该条规则的自定义备注,备注最大长度64 - **Remark** (str) - 防火墙描述,默认为空 - **Tag** (str) - 防火墙业务组,默认为Default - + **Response** - **FWId** (str) - 防火墙ID - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.CreateFirewallRequestSchema().dumps(d) @@ -243,20 +224,23 @@ def create_firewall( def delete_bandwidth_package( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeleteBandwidthPackage - 删除弹性IP上已附加带宽包 + """DeleteBandwidthPackage - 删除弹性IP上已附加带宽包 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写 - - **Region** (str) - (Config) 地域 + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **BandwidthPackageId** (str) - (Required) 带宽包资源ID - + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DeleteBandwidthPackageRequestSchema().dumps(d) @@ -266,20 +250,23 @@ def delete_bandwidth_package( def delete_firewall( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeleteFirewall - 删除防火墙 + """DeleteFirewall - 删除防火墙 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写 - - **Region** (str) - (Config) 地域 + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **FWId** (str) - (Required) 防火墙资源ID - + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DeleteFirewallRequestSchema().dumps(d) @@ -289,29 +276,23 @@ def delete_firewall( def describe_bandwidth_package( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeBandwidthPackage - 获取某地域下的带宽包信息 + """DescribeBandwidthPackage - 获取某地域下的带宽包信息 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Limit** (int) - 返回数据分页值, 取值范围为 [0,10000000] 之间的整数, 默认为20 - **Offset** (int) - 返回数据偏移量, 默认为0 - + **Response** - **DataSets** (list) - 见 **UnetBandwidthPackageSet** 模型定义 - **TotalCount** (int) - 满足条件的带宽包总数 - + **Response Model** - - **EIPAddrSet** - - - **IP** (str) - 弹性IP地址 - - **OperatorName** (str) - 运营商信息, 枚举值为: Telecom 电信; Unicom: 联通; Duplet: 双线; Bgp: BGP; International: 国际. - **UnetBandwidthPackageSet** - + **UnetBandwidthPackageSet** - **Bandwidth** (int) - 带宽包的临时带宽值, 单位Mbps - **BandwidthPackageId** (str) - 带宽包的资源ID - **CreateTime** (int) - 创建时间, 格式为 Unix Timestamp @@ -320,9 +301,18 @@ def describe_bandwidth_package( - **EIPId** (str) - 带宽包所绑定弹性IP的资源ID - **EnableTime** (int) - 生效时间, 格式为 Unix Timestamp + + **EIPAddrSet** + - **IP** (str) - 弹性IP地址 + - **OperatorName** (str) - 运营商信息, 枚举值为: BGP: BGP; International: 国际. + + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeBandwidthPackageRequestSchema().dumps(d) @@ -332,31 +322,36 @@ def describe_bandwidth_package( def describe_bandwidth_usage( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeBandwidthUsage - 获取带宽用量信息 + """DescribeBandwidthUsage - 获取带宽用量信息 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BeginTime** (int) - 统计开始时间 - **EIPIds** (list) - 弹性IP的资源Id. 如果为空, 则返回当前 Region中符合条件的所有EIP的带宽用量, n为自然数 + - **EndTime** (int) - 统计结束时间 - **Limit** (int) - 返回数据分页值, 取值范围为 [0,10000000] 之间的整数, 默认为20 - **OffSet** (int) - 返回数据偏移量, 默认为0 - + **Response** - **EIPSet** (list) - 见 **UnetBandwidthUsageEIPSet** 模型定义 - **TotalCount** (int) - EIPSet中的元素个数 - + **Response Model** - - **UnetBandwidthUsageEIPSet** - + + **UnetBandwidthUsageEIPSet** - **CurBandwidth** (float) - 最近5分钟带宽用量, 单位Mbps - **EIPId** (str) - 弹性IP资源ID + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeBandwidthUsageRequestSchema().dumps(d) @@ -364,52 +359,33 @@ def describe_bandwidth_usage( return apis.DescribeBandwidthUsageResponseSchema().loads(resp) def describe_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ DescribeEIP - 获取弹性IP信息 + """DescribeEIP - 获取弹性IP信息 **Request** - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写 - **Region** (str) - (Config) 地域 - **EIPIds** (list) - 弹性IP的资源ID如果为空, 则返回当前 Region中符合条件的的所有EIP + - **IPs** (list) - IP地址,支持通过ip查询,如果ip与EIP都传,会取并集查询 - **Limit** (int) - 数据分页值, 默认为20 - **Offset** (int) - 数据偏移量, 默认为0 - + **Response** - **EIPSet** (list) - 见 **UnetEIPSet** 模型定义 - **TotalBandwidth** (int) - 满足条件的弹性IP带宽总和, 单位Mbps - **TotalCount** (int) - 满足条件的弹性IP总数 - - **Response Model** - - **ShareBandwidthSet** - - - **ShareBandwidth** (int) - 共享带宽带宽值 - - **ShareBandwidthId** (str) - 共享带宽ID - - **ShareBandwidthName** (str) - 共享带宽的资源名称 - - **UnetEIPAddrSet** - - - **IP** (str) - IP地址 - - **OperatorName** (str) - 运营商信息如: 电信: Telecom, 联通: Unicom, 国际: International, Duplet: 双线IP(电信+联通), BGP: Bgp + - **UnbindCount** (int) - 未绑定的弹性IP总数 - **UnetEIPResourceSet** - - - **EIPId** (str) - 弹性IP的资源ID - - **ResourceId** (str) - 已绑定资源的资源ID - - **ResourceName** (str) - 已绑定的资源名称 - - **ResourceType** (str) - 已绑定的资源类型, 枚举值为: uhost, 云主机;natgw:NAT网关;ulb:负载均衡器;upm: 物理机; hadoophost: 大数据集群;fortresshost:堡垒机;udockhost:容器;udhost:私有专区主机;vpngw:IPSec VPN;ucdr:云灾备;dbaudit:数据库审计,uni:虚拟网卡。 - - **SubResourceId** (str) - 资源绑定的虚拟网卡的ID - - **SubResourceName** (str) - 资源绑定的虚拟网卡的名称 - - **SubResourceType** (str) - 资源绑定的虚拟网卡的类型。uni,虚拟网卡。 + **Response Model** - **UnetEIPSet** - + **UnetEIPSet** - **Bandwidth** (int) - 弹性IP的带宽, 单位为Mbps, 当BandwidthType=1时, 该处显示为共享带宽值. 当BandwidthType=0时, 该处显示这个弹性IP的带宽. - **BandwidthType** (int) - 带宽模式, 枚举值为: 0: 非共享带宽模式, 1: 共享带宽模式 - **ChargeType** (str) - 付费方式, 枚举值为: Year, 按年付费; Month, 按月付费; Dynamic, 按小时付费; Trial, 试用. 按小时付费和试用这两种付费模式需要开通权限. - **CreateTime** (int) - 弹性IP的创建时间, 格式为Unix Timestamp - **EIPAddr** (list) - 见 **UnetEIPAddrSet** 模型定义 + - **EIPBinding** (dict) - 见 **EIPBinding** 模型定义 - **EIPId** (str) - 弹性IP的资源ID - **Expire** (bool) - 弹性IP是否到期 - **ExpireTime** (int) - 弹性IP的到期时间, 格式为Unix Timestamp @@ -422,9 +398,40 @@ def describe_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - **Tag** (str) - 弹性IP的业务组标识, 缺省值为 "Default" - **Weight** (int) - 外网出口权重, 默认为50, 范围[0-100] + + **UnetEIPAddrSet** + - **IP** (str) - IP地址 + - **OperatorName** (str) - 运营商信息如: 国际: International, BGP: BGP + + + **EIPBinding** + - **EIP** (str) - 外网ip + - **PrivateIP** (str) - 内网ip + - **PrivateIPType** (str) - 内网ip类型:PrimaryIP(默认)、SecondaryIP(非默认) + + + **UnetEIPResourceSet** + - **EIPId** (str) - 弹性IP的资源ID + - **ResourceID** (str) - 已绑定资源的资源ID + - **ResourceName** (str) - 已绑定的资源名称 + - **ResourceType** (str) - 已绑定的资源类型, 枚举值为: uhost, 云主机;natgw:NAT网关;ulb:负载均衡器;upm: 物理机; hadoophost: 大数据集群;fortresshost:堡垒机;udockhost:容器;udhost:私有专区主机;vpngw:IPSec VPN;ucdr:云灾备;dbaudit:数据库审计,uni:虚拟网卡。 + - **SubResourceId** (str) - 资源绑定的虚拟网卡的ID + - **SubResourceName** (str) - 资源绑定的虚拟网卡的名称 + - **SubResourceType** (str) - 资源绑定的虚拟网卡的类型。uni,虚拟网卡。 + + + **ShareBandwidthSet** + - **ShareBandwidth** (int) - 共享带宽带宽值 + - **ShareBandwidthId** (str) - 共享带宽ID + - **ShareBandwidthName** (str) - 共享带宽的资源名称 + + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeEIPRequestSchema().dumps(d) @@ -434,7 +441,7 @@ def describe_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def describe_firewall( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeFirewall - 获取防火墙组信息 + """DescribeFirewall - 获取防火墙组信息 **Request** @@ -443,27 +450,17 @@ def describe_firewall( - **FWId** (str) - 防火墙ID,默认为返回所有防火墙 - **Limit** (int) - 返回数据长度,默认为20,最大10000000 - **Offset** (int) - 列表起始位置偏移量,默认为0 - - **ResourceId** (str) - 绑定防火墙组的资源ID - - **ResourceType** (str) - 绑定防火墙组的资源类型,默认为全部资源类型。枚举值为:"unatgw",NAT网关; "uhost",云主机; "upm",物理云主机; "hadoophost",hadoop节点; "fortresshost",堡垒机; "udhost",私有专区主机;"udockhost",容器;"dbaudit",数据库审计. - + - **ResourceId** (str) - 绑定防火墙组的资源ID。 + - **ResourceType** (str) - 绑定防火墙的资源类型,仅获取资源对应防火墙信息时需要。枚举值为:"unatgw",NAT网关; "uhost",云主机; "upm",物理云主机; "hadoophost",hadoop节点; "fortresshost",堡垒机; "udhost",私有专区主机;"udockhost",容器;"dbaudit",数据库审计;”uni“,虚拟网卡;“cube”,Cube容器实例;“ulb”,负载均衡实例。 + **Response** - **DataSet** (list) - 见 **FirewallDataSet** 模型定义 - - **TotalCount** (int) - - + - **TotalCount** (int) - 防火墙资源数量 + **Response Model** - - **FirewallRuleSet** - - - **DstPort** (str) - 目标端口 - - **Priority** (str) - 优先级 - - **ProtocolType** (str) - 协议类型 - - **Remark** (str) - 防火墙规则备注 - - **RuleAction** (str) - 防火墙动作 - - **SrcIP** (str) - 源地址 - **FirewallDataSet** - + **FirewallDataSet** - **CreateTime** (int) - 防火墙组创建时间,格式为Unix Timestamp - **FWId** (str) - 防火墙ID - **GroupId** (str) - 安全组ID(即将废弃) @@ -474,9 +471,22 @@ def describe_firewall( - **Tag** (str) - 防火墙业务组 - **Type** (str) - 防火墙组类型,枚举值为: "user defined", 用户自定义防火墙; "recommend web", 默认Web防火墙; "recommend non web", 默认非Web防火墙 + + **FirewallRuleSet** + - **DstPort** (str) - 目标端口 + - **Priority** (str) - 优先级 + - **ProtocolType** (str) - 协议类型 + - **Remark** (str) - 防火墙规则备注 + - **RuleAction** (str) - 防火墙动作 + - **SrcIP** (str) - 源地址 + + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeFirewallRequestSchema().dumps(d) @@ -486,154 +496,228 @@ def describe_firewall( def describe_firewall_resource( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeFirewallResource - 获取防火墙组所绑定资源的外网IP + """DescribeFirewallResource - 获取防火墙组所绑定资源的外网IP **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **FWId** (str) - (Required) 防火墙ID - - **Limit** (int) - 返回数据长度,默认为20,最大10000000 + - **Limit** (int) - 返回数据长度,默认为20,最大1000 - **Offset** (int) - 列表起始位置偏移量,默认为0 - + **Response** - **ResourceSet** (list) - 见 **ResourceSet** 模型定义 - **TotalCount** (int) - 绑定资源总数 - + **Response Model** - - **ResourceSet** - + + **ResourceSet** - **Name** (str) - 名称 - **PrivateIP** (str) - 内网IP - **Remark** (str) - 备注 - **ResourceID** (str) - 绑定该防火墙的资源id - - **ResourceType** (str) - 绑定资源的资源类型,如"uhost","upm","umem","uhive","uvip","uredis","uhadoop","ufortress","dbaudit","udw","udocker", "umemcache" + - **ResourceType** (str) - 绑定防火墙组的资源类型。"unatgw",NAT网关; "uhost",云主机; "upm",物理云主机; "hadoophost",hadoop节点; "fortresshost",堡垒机; "udhost",私有专区主机;"udockhost",容器;"dbaudit",数据库审计,“uni”,虚拟网卡。 - **Status** (int) - 状态 + - **SubResourceId** (str) - 资源绑定的虚拟网卡的ID + - **SubResourceName** (str) - 资源绑定的虚拟网卡的名称 + - **SubResourceType** (str) - 资源绑定的虚拟网卡的类型,“uni”,虚拟网卡。 - **Tag** (str) - 业务组 - **Zone** (int) - 可用区 + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeFirewallResourceRequestSchema().dumps(d) resp = self.invoke("DescribeFirewallResource", d, **kwargs) return apis.DescribeFirewallResourceResponseSchema().loads(resp) + def describe_private_ip( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribePrivateIP - 获取资源绑定的内网IP信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - 获取信息数量 ,默认20;不允许为0 + - **ObjectId** (str) - 虚拟网卡的资源ID; ObjectId为空时,则获取项目下所有的虚拟网卡主辅IP信息 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **SubnetId** (str) - 子网的ID + - **VPCId** (str) - VPC的ID + + **Response** + + - **DataSet** (list) - 见 **DescribeSecondaryIPDataSet** 模型定义 + - **TotalCount** (int) - 返回资源数量 + + **Response Model** + + **DescribeSecondaryIPDataSet** + - **EIP** (str) - 外网IP + - **EIPId** (str) - EIP资源ID + - **PrivateIP** (str) - 内网IP + - **PrivateIPType** (str) - 内网IP类型;枚举值:PrimaryIP:主内网IP,SecondaryIP:辅助内网IP + - **ResourceID** (str) - 资源ID + - **ResourceName** (str) - 资源名称 + - **SubnetID** (str) - 子网ID + - **VPCID** (str) - VPCID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribePrivateIPRequestSchema().dumps(d) + + resp = self.invoke("DescribePrivateIP", d, **kwargs) + return apis.DescribePrivateIPResponseSchema().loads(resp) + def describe_share_bandwidth( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeShareBandwidth - 获取共享带宽信息 + """DescribeShareBandwidth - 获取共享带宽信息 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **ShareBandwidthIds** (list) - 需要返回的共享带宽Id - + **Response** - **DataSet** (list) - 见 **UnetShareBandwidthSet** 模型定义 - **TotalCount** (int) - 符合条件的共享带宽总数,大于等于返回DataSet长度 - - **Response Model** - - **EIPAddrSet** - - - **IP** (str) - 弹性IP地址 - - **OperatorName** (str) - 运营商信息, 枚举值为: Telecom 电信; Unicom: 联通; Duplet: 双线; Bgp: BGP; International: 国际. - **EIPSetData** - - - **Bandwidth** (int) - EIP带宽值 - - **EIPAddr** (list) - 见 **EIPAddrSet** 模型定义 - - **EIPId** (str) - EIP资源Id + **Response Model** - **UnetShareBandwidthSet** - - - **BandwidthGuarantee** (int) - 共享带宽保底值(后付费) + **UnetShareBandwidthSet** - **ChargeType** (str) - 付费方式, 预付费:Year 按年,Month 按月,Dynamic 按需;后付费:PostPay(按月) - **CreateTime** (int) - 创建时间, 格式为Unix Timestamp - **EIPSet** (list) - 见 **EIPSetData** 模型定义 - **ExpireTime** (int) - 过期时间, 格式为Unix Timestamp + - **IPVersion** (str) - 共享带宽类型 - **Name** (str) - 共享带宽名称 - - **PostPayStartTime** (int) - 共享带宽后付费开始计费时间(后付费) - **ShareBandwidth** (int) - 共享带宽值(预付费)/共享带宽峰值(后付费), 单位Mbps - **ShareBandwidthId** (str) - 共享带宽的资源ID + + **EIPSetData** + - **Bandwidth** (int) - EIP带宽值 + - **EIPAddr** (list) - 见 **EIPAddrSet** 模型定义 + - **EIPId** (str) - EIP资源Id + + + **EIPAddrSet** + - **IP** (str) - 弹性IP地址 + - **OperatorName** (str) - 运营商信息, 枚举值为: BGP: BGP; International: 国际. + + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribeShareBandwidthRequestSchema().dumps(d) resp = self.invoke("DescribeShareBandwidth", d, **kwargs) return apis.DescribeShareBandwidthResponseSchema().loads(resp) - def describe_vip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ DescribeVIP - 获取内网VIP详细信息 + def describe_share_bandwidth_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeShareBandwidthPrice - 获取共享带宽价格 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **BusinessId** (str) - 业务组 - - **SubnetId** (str) - 子网id,不指定则获取VPCId下的所有vip - - **Tag** (str) - 业务组名称, 默认为 Default - - **VPCId** (str) - vpc的id,指定SubnetId时必填 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ChargeType** (str) - (Required) 付费方式, 预付费:Year 按年,Month 按月,Dynamic 按需; + - **ShareBandwidth** (int) - (Required) 共享带宽值 + - **OperatorName** (str) - 香港地域支持:BGPPro和International。其他地域无需填写该字段 + - **Quantity** (int) - 购买数量 + **Response** - - **DataSet** (list) - 内网VIP地址列表 - - **TotalCount** (int) - vip数量 - - **VIPSet** (list) - 见 **VIPDetailSet** 模型定义 - - **Response Model** - - **VIPDetailSet** - - - **CreateTime** (int) - 创建时间 - - **Name** (str) - - - **RealIp** (str) - 真实主机ip - - **SubnetId** (str) - 子网id - - **VIP** (str) - 虚拟ip - - **VIPId** (str) - 虚拟ip id - - **VPCId** (str) - VPC id - - **Zone** (str) - 地域 + - **TotalPrice** (int) - 共享带宽总价格 """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) - d = apis.DescribeVIPRequestSchema().dumps(d) + d = apis.DescribeShareBandwidthPriceRequestSchema().dumps(d) + + resp = self.invoke("DescribeShareBandwidthPrice", d, **kwargs) + return apis.DescribeShareBandwidthPriceResponseSchema().loads(resp) - resp = self.invoke("DescribeVIP", d, **kwargs) - return apis.DescribeVIPResponseSchema().loads(resp) + def describe_share_bandwidth_update_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeShareBandwidthUpdatePrice - 获取共享带宽升级价格 + + **Request** + + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ShareBandwidth** (int) - (Required) 共享带宽值 + - **ShareBandwidthId** (str) - (Required) 共享带宽Id + + **Response** + + - **Price** (float) - 共享带宽升降级价格 + + """ + # build request + d = { + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeShareBandwidthUpdatePriceRequestSchema().dumps(d) + + resp = self.invoke("DescribeShareBandwidthUpdatePrice", d, **kwargs) + return apis.DescribeShareBandwidthUpdatePriceResponseSchema().loads( + resp + ) def disassociate_eip_with_share_bandwidth( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DisassociateEIPWithShareBandwidth - 将EIP移出共享带宽 + """DisassociateEIPWithShareBandwidth - 将EIP移出共享带宽 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Bandwidth** (int) - (Required) 移出共享带宽后,EIP的外网带宽, 单位为Mbps. 各地域带宽范围如下: 流量计费[1-200],带宽计费[1-800] - **ShareBandwidthId** (str) - (Required) 共享带宽ID - **EIPIds** (list) - EIP的资源Id;默认移出该共享带宽下所有的EIP + - **IPVersion** (str) - 共享带宽类型,IPv4或者IPv6,不传默认IPv4 - **PayMode** (str) - 移出共享带宽后,EIP的计费模式. 枚举值: "Traffic", 流量计费; "Bandwidth", 带宽计费; 默认为 "Bandwidth". - + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DisassociateEIPWithShareBandwidthRequestSchema().dumps(d) @@ -642,31 +726,103 @@ def disassociate_eip_with_share_bandwidth( resp ) + def disassociate_firewall( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DisassociateFirewall - 解绑资源上的防火墙 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **FWId** (str) - (Required) 防火墙ID + - **ResourceId** (str) - (Required) 需要解绑的资源ID + - **ResourceType** (str) - (Required) 资源类型:ULB 表示负载均衡 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DisassociateFirewallRequestSchema().dumps(d) + + resp = self.invoke("DisassociateFirewall", d, **kwargs) + return apis.DisassociateFirewallResponseSchema().loads(resp) + + def get_eip_exclusive_utp_info( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetEIPExclusiveUTPInfo - 获取EIP专属流量包信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **EIPId** (str) - (Required) EIP资源Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **EIPExclusiveInfo** (dict) - 见 **EIPExclusiveInfo** 模型定义 + + **Response Model** + + **EIPExclusiveInfo** + - **AccountId** (int) - + - **AvailableSize** (int) - 专属流量包剩余可用规格(单位MB) + - **CreateTime** (int) - 资源创建时间 + - **EIPId** (str) - EIP资源Id + - **LastResetTime** (int) - 专属流量包上次重置时间 + - **NextResetTime** (int) - 专属流量包下次重置时间 + - **ResetPolicy** (str) - 专属流量包重置策略枚举:Day、Month、Year + - **TotalSize** (int) - 专属流量包总规格(单位MB) + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetEIPExclusiveUTPInfoRequestSchema().dumps(d) + + resp = self.invoke("GetEIPExclusiveUTPInfo", d, **kwargs) + return apis.GetEIPExclusiveUTPInfoResponseSchema().loads(resp) + def get_eip_pay_mode( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetEIPPayMode - 获取弹性IP计费模式 + """GetEIPPayMode - 获取弹性IP计费模式 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写 - - **Region** (str) - (Config) 地域 + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **EIPId** (list) - (Required) 弹性IP的资源Id - + **Response** - **EIPPayMode** (list) - 见 **EIPPayModeSet** 模型定义 - + **Response Model** - - **EIPPayModeSet** - + + **EIPPayModeSet** - **EIPId** (str) - EIP的资源ID - **EIPPayMode** (str) - EIP的计费模式. 枚举值为:Bandwidth, 带宽计费;Traffic, 流量计费; "ShareBandwidth",共享带宽模式 + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.GetEIPPayModeRequestSchema().dumps(d) @@ -676,33 +832,37 @@ def get_eip_pay_mode( def get_eip_price( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetEIPPrice - 获取弹性IP价格 + """GetEIPPrice - 获取弹性IP价格 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Bandwidth** (int) - (Required) 弹性IP的外网带宽, 单位为Mbps, 范围 [0-800] - **OperatorName** (str) - (Required) 弹性IP的线路如下: 国际: International BGP: Bgp 各地域允许的线路参数如下: cn-sh1: Bgp cn-sh2: Bgp cn-gd: Bgp cn-bj1: Bgp cn-bj2: Bgp hk: International us-ca: International th-bkk: International kr-seoul:International us-ws:International ge-fra:International sg:International tw-kh:International.其他海外线路均为 International,泉州为移动单线cn-qz:ChinaMobile - **ChargeType** (str) - 付费方式, 枚举值为: Year, 按年付费; Month, 按月付费; Dynamic, 按时付费; 默认为获取三种价格 - **PayMode** (str) - 弹性IP计费方式r. 枚举值为: Traffic, 流量计费; Bandwidth, 带宽计费; "ShareBandwidth",共享带宽模式. 默认为Bandwidth - **Quantity** (int) - 购买时长。默认: 1。按小时购买(Dynamic)时无需此参数。 月付时,此参数传0,代表了购买至月末 - + **Response** - **PriceSet** (list) - 见 **EIPPriceDetailSet** 模型定义 - + **Response Model** - - **EIPPriceDetailSet** - + + **EIPPriceDetailSet** - **ChargeType** (str) - 弹性IP付费方式 - - **Price** (float) - 弹性IP价格, 单位"元" + - **OriginalPrice** (float) - 弹性IP的原价,单位“元” + - **Price** (float) - 购买弹性IP的实际价格, 单位"元" - **PurchaseValue** (int) - 资源有效期, 以Unix Timestamp表示 + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.GetEIPPriceRequestSchema().dumps(d) @@ -712,47 +872,93 @@ def get_eip_price( def get_eip_upgrade_price( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetEIPUpgradePrice - 获取弹性IP带宽改动价格 + """GetEIPUpgradePrice - 获取弹性IP带宽改动价格 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Bandwidth** (int) - (Required) 弹性IP的外网带宽, 单位为Mbps, 范围 [1-800] - **EIPId** (str) - (Required) 弹性IP的资源ID - + **Response** - **Price** (float) - 调整带宽后的EIP价格, 单位为"元", 如需退费此处为负值 - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.GetEIPUpgradePriceRequestSchema().dumps(d) resp = self.invoke("GetEIPUpgradePrice", d, **kwargs) return apis.GetEIPUpgradePriceResponseSchema().loads(resp) + def get_throughput_daily_billing_info( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetThroughputDailyBillingInfo - 获取流量计费EIP每日流量计费信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **EIPId** (str) - (Required) EIP的资源ID + - **EndTime** (int) - (Required) 查询结束时间时间戳 + - **StartTime** (int) - (Required) 查询开始时间时间戳 + + **Response** + + - **EIPId** (str) - 资源ID + - **Stats** (list) - 见 **ThroughputDailyBillingInfo** 模型定义 + - **TotalOut** (int) - 计费总流量 + + **Response Model** + + **ThroughputDailyBillingInfo** + - **BillingState** (str) - 是否已计费,“Yes”或者“No” + - **EndTime** (int) - 计费结束时间 + - **QuantityOut** (int) - 计费流量,单位“GB” + - **StartTime** (int) - 计费开始时间 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetThroughputDailyBillingInfoRequestSchema().dumps(d) + + resp = self.invoke("GetThroughputDailyBillingInfo", d, **kwargs) + return apis.GetThroughputDailyBillingInfoResponseSchema().loads(resp) + def grant_firewall( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GrantFirewall - 将防火墙应用到资源上 + """GrantFirewall - 将防火墙应用到资源上 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **FWId** (str) - (Required) 防火墙资源ID - **ResourceId** (str) - (Required) 所应用资源ID - - **ResourceType** (str) - (Required) 绑定防火墙组的资源类型,默认为全部资源类型。枚举值为:"unatgw",NAT网关; "uhost",云主机; "upm",物理云主机; "hadoophost",hadoop节点; "fortresshost",堡垒机; "udhost",私有专区主机;"udockhost",容器;"dbaudit",数据库审计,”uni“,虚拟网卡。 - + - **ResourceType** (str) - (Required) 绑定防火墙的资源类型,枚举值为:"unatgw",NAT网关; "uhost",云主机; "upm",物理云主机; "hadoophost",hadoop节点; "fortresshost",堡垒机; "udhost",私有专区主机;"udockhost",容器;"dbaudit",数据库审计;”uni“,虚拟网卡;“cube”,Cube容器实例;“ulb”,负载均衡实例。 + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.GrantFirewallRequestSchema().dumps(d) @@ -762,21 +968,24 @@ def grant_firewall( def modify_eip_bandwidth( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ModifyEIPBandwidth - 调整弹性IP的外网带宽 + """ModifyEIPBandwidth - 调整弹性IP的外网带宽 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Bandwidth** (int) - (Required) 弹性IP的外网带宽, 单位为Mbps. 各地域的带宽值范围如下:流量计费[1-200],带宽计费[1-800] - **EIPId** (str) - (Required) 弹性IP的资源ID - + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.ModifyEIPBandwidthRequestSchema().dumps(d) @@ -786,21 +995,24 @@ def modify_eip_bandwidth( def modify_eip_weight( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ModifyEIPWeight - 修改弹性IP的外网出口权重 + """ModifyEIPWeight - 修改弹性IP的外网出口权重 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **EIPId** (str) - (Required) 弹性IP的资源ID - - **Weight** (int) - (Required) 外网出口权重, 范围[0-100] 取值为0时, 该弹性IP不会被使用. 取值为100时, 同主机下只会使用这个弹性IP,其他弹性IP不会被使用 请勿将多个绑定在同一资源的弹性IP设置为相同权重 - + - **Weight** (int) - (Required) 外网出口权重,范围[0-100];该权重值只在EIP绑定资源为主机/网卡(非直通模式)时有效;同一个主机/网卡主动访问外网时,将使用权重最高的EIP作为源IP;权重相同时,行为不确定 + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.ModifyEIPWeightRequestSchema().dumps(d) @@ -808,20 +1020,23 @@ def modify_eip_weight( return apis.ModifyEIPWeightResponseSchema().loads(resp) def release_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ ReleaseEIP - 释放弹性IP资源, 所释放弹性IP必须为非绑定状态. + """ReleaseEIP - 释放弹性IP资源, 所释放弹性IP必须为非绑定状态. **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **EIPId** (str) - (Required) 弹性IP的资源ID - + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.ReleaseEIPRequestSchema().dumps(d) @@ -831,68 +1046,52 @@ def release_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def release_share_bandwidth( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ReleaseShareBandwidth - 关闭共享带宽 + """ReleaseShareBandwidth - 关闭共享带宽 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **EIPBandwidth** (int) - (Required) 关闭共享带宽后,各EIP恢复为的带宽值 - **ShareBandwidthId** (str) - (Required) 共享带宽ID - - **PayMode** (str) - Bandwidth 带宽计费, Traffic 转流量计费 - + - **PayMode** (str) - 默认为 Bandwidth 带宽计费 + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.ReleaseShareBandwidthRequestSchema().dumps(d) resp = self.invoke("ReleaseShareBandwidth", d, **kwargs) return apis.ReleaseShareBandwidthResponseSchema().loads(resp) - def release_vip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ ReleaseVIP - 释放VIP资源 - - **Request** - - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写 - - **Region** (str) - (Config) 地域 - - **VIPId** (str) - (Required) 内网VIP的id - - **Zone** (str) - 可用区 - - **Response** - - - """ - # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} - req and d.update(req) - d = apis.ReleaseVIPRequestSchema().dumps(d) - - resp = self.invoke("ReleaseVIP", d, **kwargs) - return apis.ReleaseVIPResponseSchema().loads(resp) - def resize_share_bandwidth( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ResizeShareBandwidth - 调整共享带宽的带宽值 + """ResizeShareBandwidth - 调整共享带宽的带宽值 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **ShareBandwidth** (int) - (Required) 带宽值,单位为Mb,范围 [20-5000] (最大值受地域限制) - **ShareBandwidthId** (str) - (Required) 共享带宽的Id - + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.ResizeShareBandwidthRequestSchema().dumps(d) @@ -902,22 +1101,25 @@ def resize_share_bandwidth( def set_eip_pay_mode( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ SetEIPPayMode - 设置弹性IP计费模式, 切换时会涉及付费/退费. + """SetEIPPayMode - 设置弹性IP计费模式, 切换时会涉及付费/退费. **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Bandwidth** (int) - (Required) 调整的目标带宽值, 单位Mbps. 各地域的带宽值范围如下: 流量计费[1-200],其余情况[1-800] - **EIPId** (str) - (Required) 弹性IP的资源Id - **PayMode** (str) - (Required) 计费模式. 枚举值:"Traffic", 流量计费模式; "Bandwidth", 带宽计费模式 - + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.SetEIPPayModeRequestSchema().dumps(d) @@ -925,22 +1127,25 @@ def set_eip_pay_mode( return apis.SetEIPPayModeResponseSchema().loads(resp) def un_bind_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ UnBindEIP - 将弹性IP从资源上解绑 + """UnBindEIP - 将弹性IP从资源上解绑 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **EIPId** (str) - (Required) 弹性IP的资源Id - **ResourceId** (str) - (Required) 弹性IP请求解绑的资源ID - - **ResourceType** (str) - (Required) 弹性IP请求解绑的资源类型, 枚举值为: uhost: 云主机; ulb, 负载均衡器 upm: 物理机; hadoophost: 大数据集群;fortresshost:堡垒机;udockhost:容器;udhost:私有专区主机;natgw:NAT网关;udb:udb;vpngw:ipsec vpn;ucdr:云灾备;dbaudit:数据库审计;uni,虚拟网卡。 - + - **ResourceType** (str) - (Required) 弹性IP请求解绑的资源类型, 枚举值为: uhost: 云主机; ulb, 负载均衡器 upm: 物理机; hadoophost: 大数据集群;fortresshost:堡垒机;udockhost:容器;udhost:私有专区主机;natgw:NAT网关;udb:udb;vpngw:ipsec vpn;ucdr:云灾备;dbaudit:数据库审计; + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.UnBindEIPRequestSchema().dumps(d) @@ -950,23 +1155,26 @@ def un_bind_eip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def update_eip_attribute( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ UpdateEIPAttribute - 更新弹性IP名称,业务组,备注等属性字段 + """UpdateEIPAttribute - 更新弹性IP名称,业务组,备注等属性字段 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **EIPId** (str) - (Required) EIP资源ID - **Name** (str) - 名字(Name Tag Remark都为空则报错) - **Remark** (str) - 备注 - **Tag** (str) - 业务 - + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.UpdateEIPAttributeRequestSchema().dumps(d) @@ -976,22 +1184,25 @@ def update_eip_attribute( def update_firewall( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ UpdateFirewall - 更新防火墙规则 + """UpdateFirewall - 更新防火墙规则 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **FWId** (str) - (Required) 防火墙资源ID - - **Rule** (list) - (Required) 防火墙规则,例如:TCP|22|192.168.1.1/22|DROP|LOW|禁用22端口,第一个参数代表协议:第二个参数代表端口号,第三个参数为ip,第四个参数为ACCEPT(接受)和DROP(拒绝),第五个参数优先级:HIGH(高),MEDIUM(中),LOW(低),第六个参数为该条规则的自定义备注 - + - **Rule** (list) - (Required) 防火墙规则,例如:TCP|22|192.168.1.1/22|DROP|LOW|禁用22端口,第一个参数代表协议:第二个参数代表端口号,第三个参数为ip,第四个参数为ACCEPT(接受)和DROP(拒绝),第五个参数优先级:HIGH(高),MEDIUM(中),LOW(低),第六个参数为该条规则的自定义备注, 备注最大长度64 + **Response** - **FWId** (str) - 防火墙id - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.UpdateFirewallRequestSchema().dumps(d) @@ -1001,23 +1212,26 @@ def update_firewall( def update_firewall_attribute( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ UpdateFirewallAttribute - 更新防火墙规则 + """UpdateFirewallAttribute - 更新防火墙规则 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **FWId** (str) - (Required) 防火墙资源ID - **Name** (str) - 防火墙名称,默认为空,为空则不做修改。Name,Tag,Remark必须填写1个及以上 - **Remark** (str) - 防火墙备注,默认为空,为空则不做修改。Name,Tag,Remark必须填写1个及以上 - **Tag** (str) - 防火墙业务组,默认为空,为空则不做修改。Name,Tag,Remark必须填写1个及以上 - + **Response** - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.UpdateFirewallAttributeRequestSchema().dumps(d) diff --git a/ucloud/services/unet/schemas/apis.py b/ucloud/services/unet/schemas/apis.py index 410962aa..116844f2 100644 --- a/ucloud/services/unet/schemas/apis.py +++ b/ucloud/services/unet/schemas/apis.py @@ -3,7 +3,6 @@ from ucloud.core.typesystem import schema, fields from ucloud.services.unet.schemas import models - """ UNet API Schema """ @@ -16,12 +15,12 @@ class AllocateEIPRequestSchema(schema.RequestSchema): - """ AllocateEIP - 根据提供信息, 申请弹性IP - """ + """AllocateEIP - 根据提供信息, 申请弹性IP""" fields = { "Bandwidth": fields.Int(required=True, dump_to="Bandwidth"), "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "Count": fields.Int(required=False, dump_to="Count"), "CouponId": fields.Str(required=False, dump_to="CouponId"), "Name": fields.Str(required=False, dump_to="Name"), "OperatorName": fields.Str(required=True, dump_to="OperatorName"), @@ -38,15 +37,14 @@ class AllocateEIPRequestSchema(schema.RequestSchema): class AllocateEIPResponseSchema(schema.ResponseSchema): - """ AllocateEIP - 根据提供信息, 申请弹性IP - """ + """AllocateEIP - 根据提供信息, 申请弹性IP""" fields = { "EIPSet": fields.List( models.UnetAllocateEIPSetSchema(), required=False, load_from="EIPSet", - ) + ), } @@ -58,70 +56,33 @@ class AllocateEIPResponseSchema(schema.ResponseSchema): class AllocateShareBandwidthRequestSchema(schema.RequestSchema): - """ AllocateShareBandwidth - 开通共享带宽 - """ + """AllocateShareBandwidth - 开通共享带宽""" fields = { - "BwType": fields.Str(required=False, dump_to="BwType"), + "BwType": fields.Str( + required=False, dump_to="BwType" + ), # Deprecated, will be removed at 1.0 "ChargeType": fields.Str(required=True, dump_to="ChargeType"), + "IPVersion": fields.Str(required=False, dump_to="IPVersion"), "Name": fields.Str(required=True, dump_to="Name"), + "OperatorName": fields.Str(required=False, dump_to="OperatorName"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Quantity": fields.Int(required=False, dump_to="Quantity"), "Region": fields.Str(required=True, dump_to="Region"), "ShareBandwidth": fields.Int(required=True, dump_to="ShareBandwidth"), "ShareBandwidthGuarantee": fields.Int( required=False, dump_to="ShareBandwidthGuarantee" - ), + ), # Deprecated, will be removed at 1.0 + "Tag": fields.Str(required=False, dump_to="Tag"), } class AllocateShareBandwidthResponseSchema(schema.ResponseSchema): - """ AllocateShareBandwidth - 开通共享带宽 - """ + """AllocateShareBandwidth - 开通共享带宽""" fields = { "ShareBandwidthId": fields.Str( required=False, load_from="ShareBandwidthId" - ) - } - - -""" -API: AllocateVIP - -根据提供信息,申请内网VIP(Virtual IP),多用于高可用程序作为漂移IP。 -""" - - -class AllocateVIPRequestSchema(schema.RequestSchema): - """ AllocateVIP - 根据提供信息,申请内网VIP(Virtual IP),多用于高可用程序作为漂移IP。 - """ - - fields = { - "BusinessId": fields.Str(required=False, dump_to="BusinessId"), - "Count": fields.Int(required=False, dump_to="Count"), - "Ip": fields.Str(required=False, dump_to="Ip"), - "Name": fields.Str(required=False, dump_to="Name"), - "ProjectId": fields.Str(required=False, dump_to="ProjectId"), - "Region": fields.Str(required=True, dump_to="Region"), - "Remark": fields.Str(required=False, dump_to="Remark"), - "SubnetId": fields.Str(required=True, dump_to="SubnetId"), - "Tag": fields.Str(required=False, dump_to="Tag"), - "VPCId": fields.Str(required=True, dump_to="VPCId"), - "Zone": fields.Str(required=False, dump_to="Zone"), - } - - -class AllocateVIPResponseSchema(schema.ResponseSchema): - """ AllocateVIP - 根据提供信息,申请内网VIP(Virtual IP),多用于高可用程序作为漂移IP。 - """ - - fields = { - "DataSet": fields.List( - fields.Str(), required=False, load_from="DataSet" - ), - "VIPSet": fields.List( - models.VIPSetSchema(), required=False, load_from="VIPSet" ), } @@ -134,11 +95,11 @@ class AllocateVIPResponseSchema(schema.ResponseSchema): class AssociateEIPWithShareBandwidthRequestSchema(schema.RequestSchema): - """ AssociateEIPWithShareBandwidth - 将EIP加入共享带宽 - """ + """AssociateEIPWithShareBandwidth - 将EIP加入共享带宽""" fields = { "EIPIds": fields.List(fields.Str()), + "IPVersion": fields.Str(required=False, dump_to="IPVersion"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "ShareBandwidthId": fields.Str( @@ -148,8 +109,7 @@ class AssociateEIPWithShareBandwidthRequestSchema(schema.RequestSchema): class AssociateEIPWithShareBandwidthResponseSchema(schema.ResponseSchema): - """ AssociateEIPWithShareBandwidth - 将EIP加入共享带宽 - """ + """AssociateEIPWithShareBandwidth - 将EIP加入共享带宽""" fields = {} @@ -162,11 +122,11 @@ class AssociateEIPWithShareBandwidthResponseSchema(schema.ResponseSchema): class BindEIPRequestSchema(schema.RequestSchema): - """ BindEIP - 将尚未使用的弹性IP绑定到指定的资源 - """ + """BindEIP - 将尚未使用的弹性IP绑定到指定的资源""" fields = { "EIPId": fields.Str(required=True, dump_to="EIPId"), + "PrivateIP": fields.Str(required=False, dump_to="PrivateIP"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "ResourceId": fields.Str(required=True, dump_to="ResourceId"), @@ -175,8 +135,7 @@ class BindEIPRequestSchema(schema.RequestSchema): class BindEIPResponseSchema(schema.ResponseSchema): - """ BindEIP - 将尚未使用的弹性IP绑定到指定的资源 - """ + """BindEIP - 将尚未使用的弹性IP绑定到指定的资源""" fields = {} @@ -189,28 +148,28 @@ class BindEIPResponseSchema(schema.ResponseSchema): class CreateBandwidthPackageRequestSchema(schema.RequestSchema): - """ CreateBandwidthPackage - 为非共享带宽模式下, 已绑定资源实例的带宽计费弹性IP附加临时带宽包 - """ + """CreateBandwidthPackage - 为非共享带宽模式下, 已绑定资源实例的带宽计费弹性IP附加临时带宽包""" fields = { "Bandwidth": fields.Int(required=True, dump_to="Bandwidth"), "CouponId": fields.Str(required=False, dump_to="CouponId"), "EIPId": fields.Str(required=True, dump_to="EIPId"), "EnableTime": fields.Int(required=False, dump_to="EnableTime"), - "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ProjectId": fields.Str( + required=False, dump_to="ProjectId" + ), # Deprecated, will be removed at 1.0 "Region": fields.Str(required=True, dump_to="Region"), "TimeRange": fields.Int(required=True, dump_to="TimeRange"), } class CreateBandwidthPackageResponseSchema(schema.ResponseSchema): - """ CreateBandwidthPackage - 为非共享带宽模式下, 已绑定资源实例的带宽计费弹性IP附加临时带宽包 - """ + """CreateBandwidthPackage - 为非共享带宽模式下, 已绑定资源实例的带宽计费弹性IP附加临时带宽包""" fields = { "BandwidthPackageId": fields.Str( required=False, load_from="BandwidthPackageId" - ) + ), } @@ -222,8 +181,7 @@ class CreateBandwidthPackageResponseSchema(schema.ResponseSchema): class CreateFirewallRequestSchema(schema.RequestSchema): - """ CreateFirewall - 创建防火墙 - """ + """CreateFirewall - 创建防火墙""" fields = { "Name": fields.Str(required=True, dump_to="Name"), @@ -236,10 +194,11 @@ class CreateFirewallRequestSchema(schema.RequestSchema): class CreateFirewallResponseSchema(schema.ResponseSchema): - """ CreateFirewall - 创建防火墙 - """ + """CreateFirewall - 创建防火墙""" - fields = {"FWId": fields.Str(required=False, load_from="FWId")} + fields = { + "FWId": fields.Str(required=False, load_from="FWId"), + } """ @@ -250,8 +209,7 @@ class CreateFirewallResponseSchema(schema.ResponseSchema): class DeleteBandwidthPackageRequestSchema(schema.RequestSchema): - """ DeleteBandwidthPackage - 删除弹性IP上已附加带宽包 - """ + """DeleteBandwidthPackage - 删除弹性IP上已附加带宽包""" fields = { "BandwidthPackageId": fields.Str( @@ -263,8 +221,7 @@ class DeleteBandwidthPackageRequestSchema(schema.RequestSchema): class DeleteBandwidthPackageResponseSchema(schema.ResponseSchema): - """ DeleteBandwidthPackage - 删除弹性IP上已附加带宽包 - """ + """DeleteBandwidthPackage - 删除弹性IP上已附加带宽包""" fields = {} @@ -277,8 +234,7 @@ class DeleteBandwidthPackageResponseSchema(schema.ResponseSchema): class DeleteFirewallRequestSchema(schema.RequestSchema): - """ DeleteFirewall - 删除防火墙 - """ + """DeleteFirewall - 删除防火墙""" fields = { "FWId": fields.Str(required=True, dump_to="FWId"), @@ -288,8 +244,7 @@ class DeleteFirewallRequestSchema(schema.RequestSchema): class DeleteFirewallResponseSchema(schema.ResponseSchema): - """ DeleteFirewall - 删除防火墙 - """ + """DeleteFirewall - 删除防火墙""" fields = {} @@ -302,8 +257,7 @@ class DeleteFirewallResponseSchema(schema.ResponseSchema): class DescribeBandwidthPackageRequestSchema(schema.RequestSchema): - """ DescribeBandwidthPackage - 获取某地域下的带宽包信息 - """ + """DescribeBandwidthPackage - 获取某地域下的带宽包信息""" fields = { "Limit": fields.Int(required=False, dump_to="Limit"), @@ -314,8 +268,7 @@ class DescribeBandwidthPackageRequestSchema(schema.RequestSchema): class DescribeBandwidthPackageResponseSchema(schema.ResponseSchema): - """ DescribeBandwidthPackage - 获取某地域下的带宽包信息 - """ + """DescribeBandwidthPackage - 获取某地域下的带宽包信息""" fields = { "DataSets": fields.List( @@ -335,11 +288,12 @@ class DescribeBandwidthPackageResponseSchema(schema.ResponseSchema): class DescribeBandwidthUsageRequestSchema(schema.RequestSchema): - """ DescribeBandwidthUsage - 获取带宽用量信息 - """ + """DescribeBandwidthUsage - 获取带宽用量信息""" fields = { + "BeginTime": fields.Int(required=False, dump_to="BeginTime"), "EIPIds": fields.List(fields.Str()), + "EndTime": fields.Int(required=False, dump_to="EndTime"), "Limit": fields.Int(required=False, dump_to="Limit"), "OffSet": fields.Int(required=False, dump_to="OffSet"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -348,8 +302,7 @@ class DescribeBandwidthUsageRequestSchema(schema.RequestSchema): class DescribeBandwidthUsageResponseSchema(schema.ResponseSchema): - """ DescribeBandwidthUsage - 获取带宽用量信息 - """ + """DescribeBandwidthUsage - 获取带宽用量信息""" fields = { "EIPSet": fields.List( @@ -364,16 +317,16 @@ class DescribeBandwidthUsageResponseSchema(schema.ResponseSchema): """ API: DescribeEIP -获取弹性IP信息 +获取弹性IP信息 """ class DescribeEIPRequestSchema(schema.RequestSchema): - """ DescribeEIP - 获取弹性IP信息 - """ + """DescribeEIP - 获取弹性IP信息""" fields = { "EIPIds": fields.List(fields.Str()), + "IPs": fields.List(fields.Str()), "Limit": fields.Int(required=False, dump_to="Limit"), "Offset": fields.Int(required=False, dump_to="Offset"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -382,8 +335,7 @@ class DescribeEIPRequestSchema(schema.RequestSchema): class DescribeEIPResponseSchema(schema.ResponseSchema): - """ DescribeEIP - 获取弹性IP信息 - """ + """DescribeEIP - 获取弹性IP信息""" fields = { "EIPSet": fields.List( @@ -393,6 +345,7 @@ class DescribeEIPResponseSchema(schema.ResponseSchema): required=False, load_from="TotalBandwidth" ), "TotalCount": fields.Int(required=False, load_from="TotalCount"), + "UnbindCount": fields.Int(required=False, load_from="UnbindCount"), } @@ -404,8 +357,7 @@ class DescribeEIPResponseSchema(schema.ResponseSchema): class DescribeFirewallRequestSchema(schema.RequestSchema): - """ DescribeFirewall - 获取防火墙组信息 - """ + """DescribeFirewall - 获取防火墙组信息""" fields = { "FWId": fields.Str(required=False, dump_to="FWId"), @@ -419,8 +371,7 @@ class DescribeFirewallRequestSchema(schema.RequestSchema): class DescribeFirewallResponseSchema(schema.ResponseSchema): - """ DescribeFirewall - 获取防火墙组信息 - """ + """DescribeFirewall - 获取防火墙组信息""" fields = { "DataSet": fields.List( @@ -438,8 +389,7 @@ class DescribeFirewallResponseSchema(schema.ResponseSchema): class DescribeFirewallResourceRequestSchema(schema.RequestSchema): - """ DescribeFirewallResource - 获取防火墙组所绑定资源的外网IP - """ + """DescribeFirewallResource - 获取防火墙组所绑定资源的外网IP""" fields = { "FWId": fields.Str(required=True, dump_to="FWId"), @@ -451,8 +401,7 @@ class DescribeFirewallResourceRequestSchema(schema.RequestSchema): class DescribeFirewallResourceResponseSchema(schema.ResponseSchema): - """ DescribeFirewallResource - 获取防火墙组所绑定资源的外网IP - """ + """DescribeFirewallResource - 获取防火墙组所绑定资源的外网IP""" fields = { "ResourceSet": fields.List( @@ -462,6 +411,40 @@ class DescribeFirewallResourceResponseSchema(schema.ResponseSchema): } +""" +API: DescribePrivateIP + +获取资源绑定的内网IP信息 +""" + + +class DescribePrivateIPRequestSchema(schema.RequestSchema): + """DescribePrivateIP - 获取资源绑定的内网IP信息""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "ObjectId": fields.Str(required=False, dump_to="ObjectId"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + } + + +class DescribePrivateIPResponseSchema(schema.ResponseSchema): + """DescribePrivateIP - 获取资源绑定的内网IP信息""" + + fields = { + "DataSet": fields.List( + models.DescribeSecondaryIPDataSetSchema(), + required=True, + load_from="DataSet", + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + """ API: DescribeShareBandwidth @@ -470,8 +453,7 @@ class DescribeFirewallResourceResponseSchema(schema.ResponseSchema): class DescribeShareBandwidthRequestSchema(schema.RequestSchema): - """ DescribeShareBandwidth - 获取共享带宽信息 - """ + """DescribeShareBandwidth - 获取共享带宽信息""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -481,8 +463,7 @@ class DescribeShareBandwidthRequestSchema(schema.RequestSchema): class DescribeShareBandwidthResponseSchema(schema.ResponseSchema): - """ DescribeShareBandwidth - 获取共享带宽信息 - """ + """DescribeShareBandwidth - 获取共享带宽信息""" fields = { "DataSet": fields.List( @@ -495,42 +476,60 @@ class DescribeShareBandwidthResponseSchema(schema.ResponseSchema): """ -API: DescribeVIP +API: DescribeShareBandwidthPrice -获取内网VIP详细信息 +获取共享带宽价格 """ -class DescribeVIPRequestSchema(schema.RequestSchema): - """ DescribeVIP - 获取内网VIP详细信息 - """ +class DescribeShareBandwidthPriceRequestSchema(schema.RequestSchema): + """DescribeShareBandwidthPrice - 获取共享带宽价格""" fields = { - "BusinessId": fields.Str(required=False, dump_to="BusinessId"), + "ChargeType": fields.Str(required=True, dump_to="ChargeType"), + "OperatorName": fields.Str(required=False, dump_to="OperatorName"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), "Region": fields.Str(required=True, dump_to="Region"), - "SubnetId": fields.Str(required=False, dump_to="SubnetId"), - "Tag": fields.Str(required=False, dump_to="Tag"), - "VPCId": fields.Str(required=False, dump_to="VPCId"), - "Zone": fields.Str(required=False, dump_to="Zone"), + "ShareBandwidth": fields.Int(required=True, dump_to="ShareBandwidth"), } -class DescribeVIPResponseSchema(schema.ResponseSchema): - """ DescribeVIP - 获取内网VIP详细信息 - """ +class DescribeShareBandwidthPriceResponseSchema(schema.ResponseSchema): + """DescribeShareBandwidthPrice - 获取共享带宽价格""" fields = { - "DataSet": fields.List( - fields.Str(), required=False, load_from="DataSet" - ), - "TotalCount": fields.Int(required=False, load_from="TotalCount"), - "VIPSet": fields.List( - models.VIPDetailSetSchema(), required=False, load_from="VIPSet" + "TotalPrice": fields.Int(required=False, load_from="TotalPrice"), + } + + +""" +API: DescribeShareBandwidthUpdatePrice + +获取共享带宽升级价格 +""" + + +class DescribeShareBandwidthUpdatePriceRequestSchema(schema.RequestSchema): + """DescribeShareBandwidthUpdatePrice - 获取共享带宽升级价格""" + + fields = { + "Region": fields.Str(required=True, dump_to="Region"), + "ShareBandwidth": fields.Int(required=True, dump_to="ShareBandwidth"), + "ShareBandwidthId": fields.Str( + required=True, dump_to="ShareBandwidthId" ), } +class DescribeShareBandwidthUpdatePriceResponseSchema(schema.ResponseSchema): + """DescribeShareBandwidthUpdatePrice - 获取共享带宽升级价格""" + + fields = { + "Price": fields.Float(required=True, load_from="Price"), + } + + """ API: DisassociateEIPWithShareBandwidth @@ -539,12 +538,12 @@ class DescribeVIPResponseSchema(schema.ResponseSchema): class DisassociateEIPWithShareBandwidthRequestSchema(schema.RequestSchema): - """ DisassociateEIPWithShareBandwidth - 将EIP移出共享带宽 - """ + """DisassociateEIPWithShareBandwidth - 将EIP移出共享带宽""" fields = { "Bandwidth": fields.Int(required=True, dump_to="Bandwidth"), "EIPIds": fields.List(fields.Str()), + "IPVersion": fields.Str(required=False, dump_to="IPVersion"), "PayMode": fields.Str(required=False, dump_to="PayMode"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), @@ -555,12 +554,62 @@ class DisassociateEIPWithShareBandwidthRequestSchema(schema.RequestSchema): class DisassociateEIPWithShareBandwidthResponseSchema(schema.ResponseSchema): - """ DisassociateEIPWithShareBandwidth - 将EIP移出共享带宽 - """ + """DisassociateEIPWithShareBandwidth - 将EIP移出共享带宽""" + + fields = {} + + +""" +API: DisassociateFirewall + +解绑资源上的防火墙 +""" + + +class DisassociateFirewallRequestSchema(schema.RequestSchema): + """DisassociateFirewall - 解绑资源上的防火墙""" + + fields = { + "FWId": fields.Str(required=True, dump_to="FWId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + "ResourceType": fields.Str(required=True, dump_to="ResourceType"), + } + + +class DisassociateFirewallResponseSchema(schema.ResponseSchema): + """DisassociateFirewall - 解绑资源上的防火墙""" fields = {} +""" +API: GetEIPExclusiveUTPInfo + +获取EIP专属流量包信息 +""" + + +class GetEIPExclusiveUTPInfoRequestSchema(schema.RequestSchema): + """GetEIPExclusiveUTPInfo - 获取EIP专属流量包信息""" + + fields = { + "EIPId": fields.Str(required=True, dump_to="EIPId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetEIPExclusiveUTPInfoResponseSchema(schema.ResponseSchema): + """GetEIPExclusiveUTPInfo - 获取EIP专属流量包信息""" + + fields = { + "EIPExclusiveInfo": models.EIPExclusiveInfoSchema(), + } + + """ API: GetEIPPayMode @@ -569,8 +618,7 @@ class DisassociateEIPWithShareBandwidthResponseSchema(schema.ResponseSchema): class GetEIPPayModeRequestSchema(schema.RequestSchema): - """ GetEIPPayMode - 获取弹性IP计费模式 - """ + """GetEIPPayMode - 获取弹性IP计费模式""" fields = { "EIPId": fields.List(fields.Str()), @@ -580,13 +628,12 @@ class GetEIPPayModeRequestSchema(schema.RequestSchema): class GetEIPPayModeResponseSchema(schema.ResponseSchema): - """ GetEIPPayMode - 获取弹性IP计费模式 - """ + """GetEIPPayMode - 获取弹性IP计费模式""" fields = { "EIPPayMode": fields.List( models.EIPPayModeSetSchema(), required=False, load_from="EIPPayMode" - ) + ), } @@ -598,8 +645,7 @@ class GetEIPPayModeResponseSchema(schema.ResponseSchema): class GetEIPPriceRequestSchema(schema.RequestSchema): - """ GetEIPPrice - 获取弹性IP价格 - """ + """GetEIPPrice - 获取弹性IP价格""" fields = { "Bandwidth": fields.Int(required=True, dump_to="Bandwidth"), @@ -613,15 +659,14 @@ class GetEIPPriceRequestSchema(schema.RequestSchema): class GetEIPPriceResponseSchema(schema.ResponseSchema): - """ GetEIPPrice - 获取弹性IP价格 - """ + """GetEIPPrice - 获取弹性IP价格""" fields = { "PriceSet": fields.List( models.EIPPriceDetailSetSchema(), required=False, load_from="PriceSet", - ) + ), } @@ -633,8 +678,7 @@ class GetEIPPriceResponseSchema(schema.ResponseSchema): class GetEIPUpgradePriceRequestSchema(schema.RequestSchema): - """ GetEIPUpgradePrice - 获取弹性IP带宽改动价格 - """ + """GetEIPUpgradePrice - 获取弹性IP带宽改动价格""" fields = { "Bandwidth": fields.Int(required=True, dump_to="Bandwidth"), @@ -645,10 +689,44 @@ class GetEIPUpgradePriceRequestSchema(schema.RequestSchema): class GetEIPUpgradePriceResponseSchema(schema.ResponseSchema): - """ GetEIPUpgradePrice - 获取弹性IP带宽改动价格 - """ + """GetEIPUpgradePrice - 获取弹性IP带宽改动价格""" - fields = {"Price": fields.Float(required=False, load_from="Price")} + fields = { + "Price": fields.Float(required=False, load_from="Price"), + } + + +""" +API: GetThroughputDailyBillingInfo + +获取流量计费EIP每日流量计费信息 +""" + + +class GetThroughputDailyBillingInfoRequestSchema(schema.RequestSchema): + """GetThroughputDailyBillingInfo - 获取流量计费EIP每日流量计费信息""" + + fields = { + "EIPId": fields.Str(required=True, dump_to="EIPId"), + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "StartTime": fields.Int(required=True, dump_to="StartTime"), + } + + +class GetThroughputDailyBillingInfoResponseSchema(schema.ResponseSchema): + """GetThroughputDailyBillingInfo - 获取流量计费EIP每日流量计费信息""" + + fields = { + "EIPId": fields.Str(required=False, load_from="EIPId"), + "Stats": fields.List( + models.ThroughputDailyBillingInfoSchema(), + required=False, + load_from="Stats", + ), + "TotalOut": fields.Int(required=False, load_from="TotalOut"), + } """ @@ -659,8 +737,7 @@ class GetEIPUpgradePriceResponseSchema(schema.ResponseSchema): class GrantFirewallRequestSchema(schema.RequestSchema): - """ GrantFirewall - 将防火墙应用到资源上 - """ + """GrantFirewall - 将防火墙应用到资源上""" fields = { "FWId": fields.Str(required=True, dump_to="FWId"), @@ -672,8 +749,7 @@ class GrantFirewallRequestSchema(schema.RequestSchema): class GrantFirewallResponseSchema(schema.ResponseSchema): - """ GrantFirewall - 将防火墙应用到资源上 - """ + """GrantFirewall - 将防火墙应用到资源上""" fields = {} @@ -686,8 +762,7 @@ class GrantFirewallResponseSchema(schema.ResponseSchema): class ModifyEIPBandwidthRequestSchema(schema.RequestSchema): - """ ModifyEIPBandwidth - 调整弹性IP的外网带宽 - """ + """ModifyEIPBandwidth - 调整弹性IP的外网带宽""" fields = { "Bandwidth": fields.Int(required=True, dump_to="Bandwidth"), @@ -698,8 +773,7 @@ class ModifyEIPBandwidthRequestSchema(schema.RequestSchema): class ModifyEIPBandwidthResponseSchema(schema.ResponseSchema): - """ ModifyEIPBandwidth - 调整弹性IP的外网带宽 - """ + """ModifyEIPBandwidth - 调整弹性IP的外网带宽""" fields = {} @@ -712,8 +786,7 @@ class ModifyEIPBandwidthResponseSchema(schema.ResponseSchema): class ModifyEIPWeightRequestSchema(schema.RequestSchema): - """ ModifyEIPWeight - 修改弹性IP的外网出口权重 - """ + """ModifyEIPWeight - 修改弹性IP的外网出口权重""" fields = { "EIPId": fields.Str(required=True, dump_to="EIPId"), @@ -724,8 +797,7 @@ class ModifyEIPWeightRequestSchema(schema.RequestSchema): class ModifyEIPWeightResponseSchema(schema.ResponseSchema): - """ ModifyEIPWeight - 修改弹性IP的外网出口权重 - """ + """ModifyEIPWeight - 修改弹性IP的外网出口权重""" fields = {} @@ -738,8 +810,7 @@ class ModifyEIPWeightResponseSchema(schema.ResponseSchema): class ReleaseEIPRequestSchema(schema.RequestSchema): - """ ReleaseEIP - 释放弹性IP资源, 所释放弹性IP必须为非绑定状态. - """ + """ReleaseEIP - 释放弹性IP资源, 所释放弹性IP必须为非绑定状态.""" fields = { "EIPId": fields.Str(required=True, dump_to="EIPId"), @@ -749,8 +820,7 @@ class ReleaseEIPRequestSchema(schema.RequestSchema): class ReleaseEIPResponseSchema(schema.ResponseSchema): - """ ReleaseEIP - 释放弹性IP资源, 所释放弹性IP必须为非绑定状态. - """ + """ReleaseEIP - 释放弹性IP资源, 所释放弹性IP必须为非绑定状态.""" fields = {} @@ -763,8 +833,7 @@ class ReleaseEIPResponseSchema(schema.ResponseSchema): class ReleaseShareBandwidthRequestSchema(schema.RequestSchema): - """ ReleaseShareBandwidth - 关闭共享带宽 - """ + """ReleaseShareBandwidth - 关闭共享带宽""" fields = { "EIPBandwidth": fields.Int(required=True, dump_to="EIPBandwidth"), @@ -778,34 +847,7 @@ class ReleaseShareBandwidthRequestSchema(schema.RequestSchema): class ReleaseShareBandwidthResponseSchema(schema.ResponseSchema): - """ ReleaseShareBandwidth - 关闭共享带宽 - """ - - fields = {} - - -""" -API: ReleaseVIP - -释放VIP资源 -""" - - -class ReleaseVIPRequestSchema(schema.RequestSchema): - """ ReleaseVIP - 释放VIP资源 - """ - - fields = { - "ProjectId": fields.Str(required=False, dump_to="ProjectId"), - "Region": fields.Str(required=True, dump_to="Region"), - "VIPId": fields.Str(required=True, dump_to="VIPId"), - "Zone": fields.Str(required=False, dump_to="Zone"), - } - - -class ReleaseVIPResponseSchema(schema.ResponseSchema): - """ ReleaseVIP - 释放VIP资源 - """ + """ReleaseShareBandwidth - 关闭共享带宽""" fields = {} @@ -818,8 +860,7 @@ class ReleaseVIPResponseSchema(schema.ResponseSchema): class ResizeShareBandwidthRequestSchema(schema.RequestSchema): - """ ResizeShareBandwidth - 调整共享带宽的带宽值 - """ + """ResizeShareBandwidth - 调整共享带宽的带宽值""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -832,8 +873,7 @@ class ResizeShareBandwidthRequestSchema(schema.RequestSchema): class ResizeShareBandwidthResponseSchema(schema.ResponseSchema): - """ ResizeShareBandwidth - 调整共享带宽的带宽值 - """ + """ResizeShareBandwidth - 调整共享带宽的带宽值""" fields = {} @@ -846,8 +886,7 @@ class ResizeShareBandwidthResponseSchema(schema.ResponseSchema): class SetEIPPayModeRequestSchema(schema.RequestSchema): - """ SetEIPPayMode - 设置弹性IP计费模式, 切换时会涉及付费/退费. - """ + """SetEIPPayMode - 设置弹性IP计费模式, 切换时会涉及付费/退费.""" fields = { "Bandwidth": fields.Int(required=True, dump_to="Bandwidth"), @@ -859,8 +898,7 @@ class SetEIPPayModeRequestSchema(schema.RequestSchema): class SetEIPPayModeResponseSchema(schema.ResponseSchema): - """ SetEIPPayMode - 设置弹性IP计费模式, 切换时会涉及付费/退费. - """ + """SetEIPPayMode - 设置弹性IP计费模式, 切换时会涉及付费/退费.""" fields = {} @@ -873,8 +911,7 @@ class SetEIPPayModeResponseSchema(schema.ResponseSchema): class UnBindEIPRequestSchema(schema.RequestSchema): - """ UnBindEIP - 将弹性IP从资源上解绑 - """ + """UnBindEIP - 将弹性IP从资源上解绑""" fields = { "EIPId": fields.Str(required=True, dump_to="EIPId"), @@ -886,8 +923,7 @@ class UnBindEIPRequestSchema(schema.RequestSchema): class UnBindEIPResponseSchema(schema.ResponseSchema): - """ UnBindEIP - 将弹性IP从资源上解绑 - """ + """UnBindEIP - 将弹性IP从资源上解绑""" fields = {} @@ -900,8 +936,7 @@ class UnBindEIPResponseSchema(schema.ResponseSchema): class UpdateEIPAttributeRequestSchema(schema.RequestSchema): - """ UpdateEIPAttribute - 更新弹性IP名称,业务组,备注等属性字段 - """ + """UpdateEIPAttribute - 更新弹性IP名称,业务组,备注等属性字段""" fields = { "EIPId": fields.Str(required=True, dump_to="EIPId"), @@ -914,8 +949,7 @@ class UpdateEIPAttributeRequestSchema(schema.RequestSchema): class UpdateEIPAttributeResponseSchema(schema.ResponseSchema): - """ UpdateEIPAttribute - 更新弹性IP名称,业务组,备注等属性字段 - """ + """UpdateEIPAttribute - 更新弹性IP名称,业务组,备注等属性字段""" fields = {} @@ -928,8 +962,7 @@ class UpdateEIPAttributeResponseSchema(schema.ResponseSchema): class UpdateFirewallRequestSchema(schema.RequestSchema): - """ UpdateFirewall - 更新防火墙规则 - """ + """UpdateFirewall - 更新防火墙规则""" fields = { "FWId": fields.Str(required=True, dump_to="FWId"), @@ -940,10 +973,11 @@ class UpdateFirewallRequestSchema(schema.RequestSchema): class UpdateFirewallResponseSchema(schema.ResponseSchema): - """ UpdateFirewall - 更新防火墙规则 - """ + """UpdateFirewall - 更新防火墙规则""" - fields = {"FWId": fields.Str(required=False, load_from="FWId")} + fields = { + "FWId": fields.Str(required=False, load_from="FWId"), + } """ @@ -954,8 +988,7 @@ class UpdateFirewallResponseSchema(schema.ResponseSchema): class UpdateFirewallAttributeRequestSchema(schema.RequestSchema): - """ UpdateFirewallAttribute - 更新防火墙规则 - """ + """UpdateFirewallAttribute - 更新防火墙规则""" fields = { "FWId": fields.Str(required=True, dump_to="FWId"), @@ -968,7 +1001,6 @@ class UpdateFirewallAttributeRequestSchema(schema.RequestSchema): class UpdateFirewallAttributeResponseSchema(schema.ResponseSchema): - """ UpdateFirewallAttribute - 更新防火墙规则 - """ + """UpdateFirewallAttribute - 更新防火墙规则""" fields = {} diff --git a/ucloud/services/unet/schemas/models.py b/ucloud/services/unet/schemas/models.py index 0c3ec4f0..0d36a1e9 100644 --- a/ucloud/services/unet/schemas/models.py +++ b/ucloud/services/unet/schemas/models.py @@ -4,8 +4,7 @@ class UnetEIPAddrSetSchema(schema.ResponseSchema): - """ UnetEIPAddrSet - DescribeEIP - """ + """UnetEIPAddrSet - AllocateEIP""" fields = { "IP": fields.Str(required=False, load_from="IP"), @@ -14,8 +13,7 @@ class UnetEIPAddrSetSchema(schema.ResponseSchema): class UnetAllocateEIPSetSchema(schema.ResponseSchema): - """ UnetAllocateEIPSet - AllocateEIP - """ + """UnetAllocateEIPSet - AllocateEIP""" fields = { "EIPAddr": fields.List(UnetEIPAddrSetSchema()), @@ -23,20 +21,8 @@ class UnetAllocateEIPSetSchema(schema.ResponseSchema): } -class VIPSetSchema(schema.ResponseSchema): - """ VIPSet - VIPSet - """ - - fields = { - "VIP": fields.Str(required=False, load_from="VIP"), - "VIPId": fields.Str(required=False, load_from="VIPId"), - "VPCId": fields.Str(required=False, load_from="VPCId"), - } - - class EIPAddrSetSchema(schema.ResponseSchema): - """ EIPAddrSet - DescribeShareBandwidth - """ + """EIPAddrSet - DescribeBandwidthPackage""" fields = { "IP": fields.Str(required=False, load_from="IP"), @@ -45,8 +31,7 @@ class EIPAddrSetSchema(schema.ResponseSchema): class UnetBandwidthPackageSetSchema(schema.ResponseSchema): - """ UnetBandwidthPackageSet - DescribeBandwidthPackage - """ + """UnetBandwidthPackageSet - DescribeBandwidthPackage""" fields = { "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), @@ -62,8 +47,7 @@ class UnetBandwidthPackageSetSchema(schema.ResponseSchema): class UnetBandwidthUsageEIPSetSchema(schema.ResponseSchema): - """ UnetBandwidthUsageEIPSet - DescribeBandwidthUsage - """ + """UnetBandwidthUsageEIPSet - DescribeBandwidthUsage""" fields = { "CurBandwidth": fields.Float(required=False, load_from="CurBandwidth"), @@ -71,9 +55,29 @@ class UnetBandwidthUsageEIPSetSchema(schema.ResponseSchema): } +class UnetEIPResourceSetSchema(schema.ResponseSchema): + """UnetEIPResourceSet - DescribeEIP""" + + fields = { + "EIPId": fields.Str(required=False, load_from="EIPId"), + "ResourceID": fields.Str(required=False, load_from="ResourceID"), + "ResourceId": fields.Str( + required=False, load_from="ResourceId" + ), # Deprecated, will be removed at 1.0 + "ResourceName": fields.Str(required=False, load_from="ResourceName"), + "ResourceType": fields.Str(required=False, load_from="ResourceType"), + "SubResourceId": fields.Str(required=False, load_from="SubResourceId"), + "SubResourceName": fields.Str( + required=False, load_from="SubResourceName" + ), + "SubResourceType": fields.Str( + required=False, load_from="SubResourceType" + ), + } + + class ShareBandwidthSetSchema(schema.ResponseSchema): - """ ShareBandwidthSet - DescribeEIP - """ + """ShareBandwidthSet - DescribeEIP""" fields = { "ShareBandwidth": fields.Int( @@ -88,28 +92,18 @@ class ShareBandwidthSetSchema(schema.ResponseSchema): } -class UnetEIPResourceSetSchema(schema.ResponseSchema): - """ UnetEIPResourceSet - DescribeEIP - """ +class EIPBindingSchema(schema.ResponseSchema): + """EIPBinding - EIP绑定内网IP关系数据""" fields = { - "EIPId": fields.Str(required=False, load_from="EIPId"), - "ResourceId": fields.Str(required=False, load_from="ResourceId"), - "ResourceName": fields.Str(required=False, load_from="ResourceName"), - "ResourceType": fields.Str(required=False, load_from="ResourceType"), - "SubResourceId": fields.Str(required=False, load_from="SubResourceId"), - "SubResourceName": fields.Str( - required=False, load_from="SubResourceName" - ), - "SubResourceType": fields.Str( - required=False, load_from="SubResourceType" - ), + "EIP": fields.Str(required=False, load_from="EIP"), + "PrivateIP": fields.Str(required=False, load_from="PrivateIP"), + "PrivateIPType": fields.Str(required=False, load_from="PrivateIPType"), } class UnetEIPSetSchema(schema.ResponseSchema): - """ UnetEIPSet - DescribeEIP - """ + """UnetEIPSet - DescribeEIP""" fields = { "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), @@ -117,6 +111,7 @@ class UnetEIPSetSchema(schema.ResponseSchema): "ChargeType": fields.Str(required=False, load_from="ChargeType"), "CreateTime": fields.Int(required=False, load_from="CreateTime"), "EIPAddr": fields.List(UnetEIPAddrSetSchema()), + "EIPBinding": EIPBindingSchema(), "EIPId": fields.Str(required=False, load_from="EIPId"), "Expire": fields.Bool(required=False, load_from="Expire"), "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), @@ -132,8 +127,7 @@ class UnetEIPSetSchema(schema.ResponseSchema): class FirewallRuleSetSchema(schema.ResponseSchema): - """ FirewallRuleSet - DescribeFirewall - """ + """FirewallRuleSet - DescribeFirewall""" fields = { "DstPort": fields.Str(required=False, load_from="DstPort"), @@ -146,8 +140,7 @@ class FirewallRuleSetSchema(schema.ResponseSchema): class FirewallDataSetSchema(schema.ResponseSchema): - """ FirewallDataSet - DescribeFirewall - """ + """FirewallDataSet - DescribeFirewall""" fields = { "CreateTime": fields.Int(required=False, load_from="CreateTime"), @@ -163,8 +156,7 @@ class FirewallDataSetSchema(schema.ResponseSchema): class ResourceSetSchema(schema.ResponseSchema): - """ ResourceSet - 资源信息 - """ + """ResourceSet - 资源信息""" fields = { "Name": fields.Str(required=False, load_from="Name"), @@ -173,14 +165,35 @@ class ResourceSetSchema(schema.ResponseSchema): "ResourceID": fields.Str(required=False, load_from="ResourceID"), "ResourceType": fields.Str(required=False, load_from="ResourceType"), "Status": fields.Int(required=False, load_from="Status"), + "SubResourceId": fields.Str(required=True, load_from="SubResourceId"), + "SubResourceName": fields.Str( + required=True, load_from="SubResourceName" + ), + "SubResourceType": fields.Str( + required=True, load_from="SubResourceType" + ), "Tag": fields.Str(required=False, load_from="Tag"), "Zone": fields.Int(required=False, load_from="Zone"), } +class DescribeSecondaryIPDataSetSchema(schema.ResponseSchema): + """DescribeSecondaryIPDataSet - 描述内网IP的具体信息""" + + fields = { + "EIP": fields.Str(required=False, load_from="EIP"), + "EIPId": fields.Str(required=False, load_from="EIPId"), + "PrivateIP": fields.Str(required=False, load_from="PrivateIP"), + "PrivateIPType": fields.Str(required=False, load_from="PrivateIPType"), + "ResourceID": fields.Str(required=False, load_from="ResourceID"), + "ResourceName": fields.Str(required=False, load_from="ResourceName"), + "SubnetID": fields.Str(required=False, load_from="SubnetID"), + "VPCID": fields.Str(required=False, load_from="VPCID"), + } + + class EIPSetDataSchema(schema.ResponseSchema): - """ EIPSetData - describeShareBandwidth - """ + """EIPSetData - describeShareBandwidth""" fields = { "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), @@ -190,21 +203,21 @@ class EIPSetDataSchema(schema.ResponseSchema): class UnetShareBandwidthSetSchema(schema.ResponseSchema): - """ UnetShareBandwidthSet - DescribeShareBandwidth - """ + """UnetShareBandwidthSet - DescribeShareBandwidth""" fields = { "BandwidthGuarantee": fields.Int( required=False, load_from="BandwidthGuarantee" - ), + ), # Deprecated, will be removed at 1.0 "ChargeType": fields.Str(required=False, load_from="ChargeType"), "CreateTime": fields.Int(required=False, load_from="CreateTime"), "EIPSet": fields.List(EIPSetDataSchema()), "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "IPVersion": fields.Str(required=True, load_from="IPVersion"), "Name": fields.Str(required=False, load_from="Name"), "PostPayStartTime": fields.Int( required=False, load_from="PostPayStartTime" - ), + ), # Deprecated, will be removed at 1.0 "ShareBandwidth": fields.Int( required=False, load_from="ShareBandwidth" ), @@ -214,25 +227,23 @@ class UnetShareBandwidthSetSchema(schema.ResponseSchema): } -class VIPDetailSetSchema(schema.ResponseSchema): - """ VIPDetailSet - VIPDetailSet - """ +class EIPExclusiveInfoSchema(schema.ResponseSchema): + """EIPExclusiveInfo - EIP专属流量包信息""" fields = { + "AccountId": fields.Int(required=False, load_from="AccountId"), + "AvailableSize": fields.Int(required=False, load_from="AvailableSize"), "CreateTime": fields.Int(required=False, load_from="CreateTime"), - "Name": fields.Str(required=False, load_from="Name"), - "RealIp": fields.Str(required=False, load_from="RealIp"), - "SubnetId": fields.Str(required=False, load_from="SubnetId"), - "VIP": fields.Str(required=False, load_from="VIP"), - "VIPId": fields.Str(required=False, load_from="VIPId"), - "VPCId": fields.Str(required=False, load_from="VPCId"), - "Zone": fields.Str(required=False, load_from="Zone"), + "EIPId": fields.Str(required=False, load_from="EIPId"), + "LastResetTime": fields.Int(required=False, load_from="LastResetTime"), + "NextResetTime": fields.Int(required=False, load_from="NextResetTime"), + "ResetPolicy": fields.Str(required=False, load_from="ResetPolicy"), + "TotalSize": fields.Int(required=False, load_from="TotalSize"), } class EIPPayModeSetSchema(schema.ResponseSchema): - """ EIPPayModeSet - GetEIPPayModeEIP - """ + """EIPPayModeSet - GetEIPPayModeEIP""" fields = { "EIPId": fields.Str(required=False, load_from="EIPId"), @@ -241,11 +252,24 @@ class EIPPayModeSetSchema(schema.ResponseSchema): class EIPPriceDetailSetSchema(schema.ResponseSchema): - """ EIPPriceDetailSet - GetEIPPrice - """ + """EIPPriceDetailSet - GetEIPPrice""" fields = { "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "OriginalPrice": fields.Float( + required=False, load_from="OriginalPrice" + ), "Price": fields.Float(required=False, load_from="Price"), "PurchaseValue": fields.Int(required=False, load_from="PurchaseValue"), } + + +class ThroughputDailyBillingInfoSchema(schema.ResponseSchema): + """ThroughputDailyBillingInfo - 流量计费EIP计费信息""" + + fields = { + "BillingState": fields.Str(required=False, load_from="BillingState"), + "EndTime": fields.Int(required=False, load_from="EndTime"), + "QuantityOut": fields.Int(required=False, load_from="QuantityOut"), + "StartTime": fields.Int(required=False, load_from="StartTime"), + } diff --git a/ucloud/services/unvs/__init__.py b/ucloud/services/unvs/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/unvs/client.py b/ucloud/services/unvs/client.py new file mode 100644 index 00000000..aae71cb8 --- /dev/null +++ b/ucloud/services/unvs/client.py @@ -0,0 +1,87 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.unvs.schemas import apis + + +class UNVSClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UNVSClient, self).__init__(config, transport, middleware, logger) + + def get_mobile(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """GetMobile - 一键登录 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BusinessId** (str) - (Required) 业务ID + - **Token** (str) - (Required) token + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **Data** (dict) - 见 **PhoneInfo** 模型定义 + - **Message** (str) - 发生错误时表示错误字符串 + - **ReqUuid** (str) - 本次请求Uuid + + **Response Model** + + **PhoneInfo** + - **Phone** (str) - 返回的电话号码 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetMobileRequestSchema().dumps(d) + + resp = self.invoke("GetMobile", d, **kwargs) + return apis.GetMobileResponseSchema().loads(resp) + + def verify_mobile( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """VerifyMobile - 号码检测 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BusinessId** (str) - (Required) 业务ID + - **Phone** (str) - (Required) 需要检测的手机号 + - **Token** (str) - (Required) token + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **Data** (dict) - 见 **VerifyInfo** 模型定义 + - **Message** (str) - 发生错误时表示错误字符串 + - **ReqUuid** (str) - 本次请求Uuid + + **Response Model** + + **VerifyInfo** + - **VerifyResult** (str) - 检测结果:PASS:一致,REJECT:不一致 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.VerifyMobileRequestSchema().dumps(d) + + resp = self.invoke("VerifyMobile", d, **kwargs) + return apis.VerifyMobileResponseSchema().loads(resp) diff --git a/ucloud/services/unvs/schemas/__init__.py b/ucloud/services/unvs/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/unvs/schemas/apis.py b/ucloud/services/unvs/schemas/apis.py new file mode 100644 index 00000000..5c1ec780 --- /dev/null +++ b/ucloud/services/unvs/schemas/apis.py @@ -0,0 +1,66 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.unvs.schemas import models + +""" UNVS API Schema +""" + + +""" +API: GetMobile + +一键登录 +""" + + +class GetMobileRequestSchema(schema.RequestSchema): + """GetMobile - 一键登录""" + + fields = { + "BusinessId": fields.Str(required=True, dump_to="BusinessId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "Token": fields.Str(required=True, dump_to="Token"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class GetMobileResponseSchema(schema.ResponseSchema): + """GetMobile - 一键登录""" + + fields = { + "Data": models.PhoneInfoSchema(), + "Message": fields.Str(required=False, load_from="Message"), + "ReqUuid": fields.Str(required=False, load_from="ReqUuid"), + } + + +""" +API: VerifyMobile + +号码检测 +""" + + +class VerifyMobileRequestSchema(schema.RequestSchema): + """VerifyMobile - 号码检测""" + + fields = { + "BusinessId": fields.Str(required=True, dump_to="BusinessId"), + "Phone": fields.Str(required=True, dump_to="Phone"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "Token": fields.Str(required=True, dump_to="Token"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class VerifyMobileResponseSchema(schema.ResponseSchema): + """VerifyMobile - 号码检测""" + + fields = { + "Data": models.VerifyInfoSchema(), + "Message": fields.Str(required=False, load_from="Message"), + "ReqUuid": fields.Str(required=False, load_from="ReqUuid"), + } diff --git a/ucloud/services/unvs/schemas/models.py b/ucloud/services/unvs/schemas/models.py new file mode 100644 index 00000000..316a734e --- /dev/null +++ b/ucloud/services/unvs/schemas/models.py @@ -0,0 +1,19 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class PhoneInfoSchema(schema.ResponseSchema): + """PhoneInfo - 号码信息""" + + fields = { + "Phone": fields.Str(required=False, load_from="Phone"), + } + + +class VerifyInfoSchema(schema.ResponseSchema): + """VerifyInfo - 检测结果信息""" + + fields = { + "VerifyResult": fields.Str(required=False, load_from="VerifyResult"), + } diff --git a/ucloud/services/upfs/__init__.py b/ucloud/services/upfs/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/upfs/client.py b/ucloud/services/upfs/client.py new file mode 100644 index 00000000..89b956fa --- /dev/null +++ b/ucloud/services/upfs/client.py @@ -0,0 +1,252 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.upfs.schemas import apis + + +class UPFSClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UPFSClient, self).__init__(config, transport, middleware, logger) + + def create_upfs_volume( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUPFSVolume - 创建UPFS文件系统 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProtocolType** (str) - (Required) 文件系统协议,目前仅支持POSIX + - **Size** (int) - (Required) 文件系统大小,单位为GB,必须为100的整数倍,Size最小为500GB + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ChargeType** (str) - 计费模式,枚举值为: Year,按年付费; Month,按月付费 + - **CouponId** (str) - 使用的代金券id + - **Quantity** (int) - 购买时长 默认: 1 + - **Remark** (str) - 备注 + - **Tag** (str) - 文件系统所属业务组 + - **VolumeName** (str) - 文件系统名称 + + **Response** + + - **VolumeId** (str) - UPFS文件系统ID + - **VolumeName** (str) - UPFS文件系统名称 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateUPFSVolumeRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUPFSVolume", d, **kwargs) + return apis.CreateUPFSVolumeResponseSchema().loads(resp) + + def describe_upfs_volume( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUPFSVolume - 获取UPFS文件系统列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Limit** (int) - 文件列表长度 + - **Offset** (int) - 文件列表起始 + - **VolumeId** (str) - 文件系统ID + + **Response** + + - **DataSet** (list) - 见 **UPFSVolumeInfo** 模型定义 + - **TotalCount** (int) - UPFS文件系统总数 + + **Response Model** + + **UPFSVolumeInfo** + - **ChargeType** (str) - 计费类型 + - **CreateTime** (int) - 文件系统创建时间(unix时间戳) + - **ExpiredTime** (int) - 文件系统过期时间(unix时间戳) + - **IsExpired** (str) - 是否过期 + - **MountAddress** (str) - 文件系统挂载地址 + - **MountStatus** (int) - 文件系统挂载状态 + - **ProtocolType** (str) - 文件系统协议类型 + - **Remark** (str) - 文件系统备注信息 + - **Size** (int) - 文件系统大小,单位GB + - **Tag** (str) - 文件系统所属业务组 + - **VolumeId** (str) - 文件系统ID + - **VolumeName** (str) - 文件系统名称 + - **Zone** (str) - 可用区名字 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUPFSVolumeRequestSchema().dumps(d) + + resp = self.invoke("DescribeUPFSVolume", d, **kwargs) + return apis.DescribeUPFSVolumeResponseSchema().loads(resp) + + def describe_upfs_volume_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUPFSVolumePrice - 获取UPFS文件系统价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Size** (int) - (Required) 文件系统大小,单位为GB,新架构容量型最小容量为500GB,以100GB递增,最大不超过100TB。 + - **ChargeType** (str) - Year, Month默认: Month + - **Quantity** (int) - 购买UPFS的时长, 默认为1 + - **VolumeId** (str) - UPFS文件系统id,第一次创建文件系统时不需要传这个参数 + + **Response** + + - **DataSet** (list) - 见 **UPFSPriceDataSet** 模型定义 + + **Response Model** + + **UPFSPriceDataSet** + - **ChargeName** (str) - “upfs” + - **ChargeType** (str) - Year, Month + - **OriginalPrice** (float) - 原价格 (单位: 分) + - **Price** (float) - 价格 (单位: 分) + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUPFSVolumePriceRequestSchema().dumps(d) + + resp = self.invoke("DescribeUPFSVolumePrice", d, **kwargs) + return apis.DescribeUPFSVolumePriceResponseSchema().loads(resp) + + def describe_upfs_volume_upgrade_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUPFSVolumeUpgradePrice - UPFS文件系统扩容价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Size** (str) - (Required) 文件系统大小 + - **VolumeId** (str) - (Required) 文件系统ID + + **Response** + + - **OriginalPrice** (float) - 原价格(单位:分) + - **Price** (float) - 价格(单位:分) + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUPFSVolumeUpgradePriceRequestSchema().dumps(d) + + resp = self.invoke("DescribeUPFSVolumeUpgradePrice", d, **kwargs) + return apis.DescribeUPFSVolumeUpgradePriceResponseSchema().loads(resp) + + def extend_upfs_volume( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ExtendUPFSVolume - UPFS文件系统扩容 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Size** (int) - (Required) 文件系统大小,单位为GB,最小为6000GB,最大为10PB,必须为1000的整数倍 + - **VolumeId** (str) - (Required) 文件系统ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ExtendUPFSVolumeRequestSchema().dumps(d) + + resp = self.invoke("ExtendUPFSVolume", d, **kwargs) + return apis.ExtendUPFSVolumeResponseSchema().loads(resp) + + def remove_upfs_volume( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RemoveUPFSVolume - 删除UPFS文件系统 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **VolumeId** (str) - (Required) 文件系统ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.RemoveUPFSVolumeRequestSchema().dumps(d) + + resp = self.invoke("RemoveUPFSVolume", d, **kwargs) + return apis.RemoveUPFSVolumeResponseSchema().loads(resp) + + def update_upfs_volume_info( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateUPFSVolumeInfo - 更改UPFS文件系统相关信息(名称/备注) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **VolumeId** (str) - (Required) UPFS文件系统ID + - **Remark** (str) - UPFS文件系统备注(文件系统名称/备注至少传入其中一个) + - **VolumeName** (str) - UPFS文件系统名称(文件系统名称/备注至少传入其中一个) + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateUPFSVolumeInfoRequestSchema().dumps(d) + + resp = self.invoke("UpdateUPFSVolumeInfo", d, **kwargs) + return apis.UpdateUPFSVolumeInfoResponseSchema().loads(resp) diff --git a/ucloud/services/upfs/schemas/__init__.py b/ucloud/services/upfs/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/upfs/schemas/apis.py b/ucloud/services/upfs/schemas/apis.py new file mode 100644 index 00000000..90823277 --- /dev/null +++ b/ucloud/services/upfs/schemas/apis.py @@ -0,0 +1,204 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.upfs.schemas import models + +""" UPFS API Schema +""" + + +""" +API: CreateUPFSVolume + +创建UPFS文件系统 +""" + + +class CreateUPFSVolumeRequestSchema(schema.RequestSchema): + """CreateUPFSVolume - 创建UPFS文件系统""" + + fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ProtocolType": fields.Str(required=True, dump_to="ProtocolType"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "Size": fields.Int(required=True, dump_to="Size"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "VolumeName": fields.Str(required=False, dump_to="VolumeName"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateUPFSVolumeResponseSchema(schema.ResponseSchema): + """CreateUPFSVolume - 创建UPFS文件系统""" + + fields = { + "VolumeId": fields.Str(required=True, load_from="VolumeId"), + "VolumeName": fields.Str(required=True, load_from="VolumeName"), + } + + +""" +API: DescribeUPFSVolume + +获取UPFS文件系统列表 +""" + + +class DescribeUPFSVolumeRequestSchema(schema.RequestSchema): + """DescribeUPFSVolume - 获取UPFS文件系统列表""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "VolumeId": fields.Str(required=False, dump_to="VolumeId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeUPFSVolumeResponseSchema(schema.ResponseSchema): + """DescribeUPFSVolume - 获取UPFS文件系统列表""" + + fields = { + "DataSet": fields.List( + models.UPFSVolumeInfoSchema(), required=True, load_from="DataSet" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeUPFSVolumePrice + +获取UPFS文件系统价格 +""" + + +class DescribeUPFSVolumePriceRequestSchema(schema.RequestSchema): + """DescribeUPFSVolumePrice - 获取UPFS文件系统价格""" + + fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "Size": fields.Int(required=True, dump_to="Size"), + "VolumeId": fields.Str(required=False, dump_to="VolumeId"), + } + + +class DescribeUPFSVolumePriceResponseSchema(schema.ResponseSchema): + """DescribeUPFSVolumePrice - 获取UPFS文件系统价格""" + + fields = { + "DataSet": fields.List( + models.UPFSPriceDataSetSchema(), required=False, load_from="DataSet" + ), + } + + +""" +API: DescribeUPFSVolumeUpgradePrice + +UPFS文件系统扩容价格 +""" + + +class DescribeUPFSVolumeUpgradePriceRequestSchema(schema.RequestSchema): + """DescribeUPFSVolumeUpgradePrice - UPFS文件系统扩容价格""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Size": fields.Str(required=True, dump_to="Size"), + "VolumeId": fields.Str(required=True, dump_to="VolumeId"), + } + + +class DescribeUPFSVolumeUpgradePriceResponseSchema(schema.ResponseSchema): + """DescribeUPFSVolumeUpgradePrice - UPFS文件系统扩容价格""" + + fields = { + "OriginalPrice": fields.Float( + required=False, load_from="OriginalPrice" + ), + "Price": fields.Float(required=True, load_from="Price"), + } + + +""" +API: ExtendUPFSVolume + +UPFS文件系统扩容 +""" + + +class ExtendUPFSVolumeRequestSchema(schema.RequestSchema): + """ExtendUPFSVolume - UPFS文件系统扩容""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Size": fields.Int(required=True, dump_to="Size"), + "VolumeId": fields.Str(required=True, dump_to="VolumeId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ExtendUPFSVolumeResponseSchema(schema.ResponseSchema): + """ExtendUPFSVolume - UPFS文件系统扩容""" + + fields = {} + + +""" +API: RemoveUPFSVolume + +删除UPFS文件系统 +""" + + +class RemoveUPFSVolumeRequestSchema(schema.RequestSchema): + """RemoveUPFSVolume - 删除UPFS文件系统""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "VolumeId": fields.Str(required=True, dump_to="VolumeId"), + } + + +class RemoveUPFSVolumeResponseSchema(schema.ResponseSchema): + """RemoveUPFSVolume - 删除UPFS文件系统""" + + fields = {} + + +""" +API: UpdateUPFSVolumeInfo + +更改UPFS文件系统相关信息(名称/备注) +""" + + +class UpdateUPFSVolumeInfoRequestSchema(schema.RequestSchema): + """UpdateUPFSVolumeInfo - 更改UPFS文件系统相关信息(名称/备注)""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "VolumeId": fields.Str(required=True, dump_to="VolumeId"), + "VolumeName": fields.Str(required=False, dump_to="VolumeName"), + } + + +class UpdateUPFSVolumeInfoResponseSchema(schema.ResponseSchema): + """UpdateUPFSVolumeInfo - 更改UPFS文件系统相关信息(名称/备注)""" + + fields = {} diff --git a/ucloud/services/upfs/schemas/models.py b/ucloud/services/upfs/schemas/models.py new file mode 100644 index 00000000..98663e85 --- /dev/null +++ b/ucloud/services/upfs/schemas/models.py @@ -0,0 +1,36 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class UPFSVolumeInfoSchema(schema.ResponseSchema): + """UPFSVolumeInfo - UPFS文件系统信息""" + + fields = { + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "ExpiredTime": fields.Int(required=False, load_from="ExpiredTime"), + "IsExpired": fields.Str(required=False, load_from="IsExpired"), + "MountAddress": fields.Str(required=False, load_from="MountAddress"), + "MountStatus": fields.Int(required=False, load_from="MountStatus"), + "ProtocolType": fields.Str(required=False, load_from="ProtocolType"), + "Remark": fields.Str(required=False, load_from="Remark"), + "Size": fields.Int(required=False, load_from="Size"), + "Tag": fields.Str(required=False, load_from="Tag"), + "VolumeId": fields.Str(required=False, load_from="VolumeId"), + "VolumeName": fields.Str(required=False, load_from="VolumeName"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class UPFSPriceDataSetSchema(schema.ResponseSchema): + """UPFSPriceDataSet - upfs 价格信息""" + + fields = { + "ChargeName": fields.Str(required=False, load_from="ChargeName"), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "OriginalPrice": fields.Float( + required=False, load_from="OriginalPrice" + ), + "Price": fields.Float(required=False, load_from="Price"), + } diff --git a/ucloud/services/upgsql/__init__.py b/ucloud/services/upgsql/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/upgsql/client.py b/ucloud/services/upgsql/client.py new file mode 100644 index 00000000..36b589f0 --- /dev/null +++ b/ucloud/services/upgsql/client.py @@ -0,0 +1,1007 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.upgsql.schemas import apis + + +class UPgSQLClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UPgSQLClient, self).__init__( + config, transport, middleware, logger + ) + + def backup_u_pg_sql_log( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """BackupUPgSQLLog - 备份日志包 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BackupFile** (str) - (Required) 备份查询结果文件名称 + - **BackupName** (str) - (Required) 备份导出文件名称 + - **InstanceID** (str) - (Required) 资源ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **BeginTime** (int) - 日志开始时间 + - **EndTime** (int) - 日志结束时间 + - **LogType** (str) - 日志类型:slow(慢日志),error(错误日志) + + **Response** + + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.BackupUPgSQLLogRequestSchema().dumps(d) + + resp = self.invoke("BackupUPgSQLLog", d, **kwargs) + return apis.BackupUPgSQLLogResponseSchema().loads(resp) + + def create_u_pg_sql_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUPgSQLInstance - 创建PG云数据库 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **AdminPassword** (str) - (Required) 管理员密码 + - **DBVersion** (str) - (Required) PostgreSQL的版本,pg10.4:postgresql-10.4,pg13.4:postgresql-13.4 + - **DiskSpace** (str) - (Required) 磁盘空间(GB) + - **MachineType** (str) - (Required) 机器配置类型,2核4G的机器:o.pgsql2m.medium + - **Name** (str) - (Required) 实例名称,至少6位 + - **ParamGroupID** (int) - (Required) DB实例使用的配置参数组id + - **Port** (int) - (Required) 端口默认为5432 + - **SubnetID** (str) - (Required) 子网ID + - **VPCID** (str) - (Required) VPC的ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **InstanceMode** (str) - UDB实例模式类型, 可选值如下: "Normal": 普通版UDB实例 "HA": 高可用版UDB实例 默认是"Normal" + + **Response** + + - **InstanceID** (str) - 资源ID + - **Message** (str) - 返回信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateUPgSQLInstanceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUPgSQLInstance", d, **kwargs) + return apis.CreateUPgSQLInstanceResponseSchema().loads(resp) + + def create_u_pg_sql_param_template( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUPgSQLParamTemplate - 创建PG参数模板 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DBVersion** (str) - (Required) 什么版本,以及类型的DB + - **GroupName** (str) - (Required) 模板名称 + - **SrcGroupID** (int) - (Required) 基准模板 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Description** (str) - 描述信息 + + **Response** + + - **GroupID** (int) - 创建的模板ID + - **Message** (str) - 描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateUPgSQLParamTemplateRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUPgSQLParamTemplate", d, **kwargs) + return apis.CreateUPgSQLParamTemplateResponseSchema().loads(resp) + + def create_u_pg_sql_readonly( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUPgSQLReadonly - 创建PG从库 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DiskSpace** (int) - (Required) 磁盘空间 + - **MachineType** (str) - (Required) 机器配置类型,2核4G的机器:o.pgsql2m.medium + - **Name** (str) - (Required) Db名称 + - **Port** (int) - (Required) DB端口 + - **SrcInstanceID** (str) - (Required) 同步的源库 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **SubnetID** (str) - 子网ID + - **VPCID** (str) - VPCID + + **Response** + + - **InstanceID** (str) - 资源ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateUPgSQLReadonlyRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUPgSQLReadonly", d, **kwargs) + return apis.CreateUPgSQLReadonlyResponseSchema().loads(resp) + + def delete_u_pg_sql_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUPgSQLInstance - 删除PG实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceID** (str) - (Required) 实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteUPgSQLInstanceRequestSchema().dumps(d) + + resp = self.invoke("DeleteUPgSQLInstance", d, **kwargs) + return apis.DeleteUPgSQLInstanceResponseSchema().loads(resp) + + def delete_u_pg_sql_param_template( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUPgSQLParamTemplate - 删除参数模板 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **GroupID** (int) - (Required) 模板ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteUPgSQLParamTemplateRequestSchema().dumps(d) + + resp = self.invoke("DeleteUPgSQLParamTemplate", d, **kwargs) + return apis.DeleteUPgSQLParamTemplateResponseSchema().loads(resp) + + def download_u_pg_sql_param_template( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DownloadUPgSQLParamTemplate - 下载参数模板信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **GroupID** (int) - (Required) 参数模板id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Content** (str) - base64编码过的 + - **Message** (str) - 描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DownloadUPgSQLParamTemplateRequestSchema().dumps(d) + + resp = self.invoke("DownloadUPgSQLParamTemplate", d, **kwargs) + return apis.DownloadUPgSQLParamTemplateResponseSchema().loads(resp) + + def get_u_pg_sql_backup_strategy( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUPgSQLBackupStrategy - 获取备份策略 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceID** (str) - (Required) DB实例Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **BackupMethod** (str) - 默认的备份方式 + - **BackupTimeRange** (str) - 自动备份预计开始时间范围 + - **BackupWeek** (str) - 自动备份预期星期几(1~7)开始 + - **Message** (str) - 返回的详细信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUPgSQLBackupStrategyRequestSchema().dumps(d) + + resp = self.invoke("GetUPgSQLBackupStrategy", d, **kwargs) + return apis.GetUPgSQLBackupStrategyResponseSchema().loads(resp) + + def get_u_pg_sql_backup_url( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUPgSQLBackupURL - 获取备份下载地址 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BackupID** (str) - (Required) 备份Id + - **InstanceID** (str) - (Required) DB实例Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **BackupPath** (str) - DB实例备份文件公网的地址 + - **InnerBackupPath** (str) - DB实例备份文件内网的地址 + - **Message** (str) - 返回的详细信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUPgSQLBackupURLRequestSchema().dumps(d) + + resp = self.invoke("GetUPgSQLBackupURL", d, **kwargs) + return apis.GetUPgSQLBackupURLResponseSchema().loads(resp) + + def get_u_pg_sql_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUPgSQLInstance - 获取PG云数据库实例描述 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceID** (str) - (Required) 资源ID + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **DataSet** (dict) - 见 **UDBInstance** 模型定义 + - **Message** (str) - 返回信息 + + **Response Model** + + **UDBInstance** + - **AdminUser** (str) - 管理员帐户名,默认root + - **BackupBeginTime** (int) - 备份开始时间,单位小时计,默认3点 + - **BackupCount** (int) - 备份文件保留的数量,默认7次 + - **BackupDate** (str) - 用于设置备份策略的备份日期标记位。共7位,每一位为一周中一天的备份情况 0表示关闭当天备份,1表示打开当天备份。最右边的一位 为星期天的备份开关,其余从右到左依次为星期一到星期 六的备份配置开关,每周必须至少设置两天备份。 例如:1100000 表示打开星期六和星期五的自动备份功能 + - **BackupTimeRange** (int) - 备份的时间段,范围[0,23] + - **BackupZone** (str) - 跨可用区高可用备库所在可用区 + - **CreateTime** (int) - DB实例创建时间,采用UTC计时时间戳 + - **DBVersion** (str) - DB 版本 + - **DataFileSize** (float) - DB实例数据文件大小,单位GB + - **DiskSpace** (int) - 磁盘空间(GB), 默认根据配置机型 + - **DiskUsedSize** (float) - DB实例磁盘已使用空间,单位GB + - **ExpiredTime** (int) - DB实例过期时间,采用UTC计时时间戳 + - **IP** (str) - DBip + - **InstanceID** (str) - DB实例id + - **InstanceMode** (str) - Normal/HA,普通/高可用 + - **LogFileSize** (float) - DB实例日志文件大小,单位GB + - **MemoryLimit** (int) - 内存限制(MB),默认根据配置机型 + - **ModifyTime** (int) - DB实例修改时间,采用UTC计时时间戳 + - **Name** (str) - 实例名称 + - **ParamGroupID** (int) - DB实例使用的配置参数组id + - **Port** (int) - DB port + - **Remark** (str) - 备注 + - **State** (str) - DB状态标记 Init:初始化中,Fail:安装失败,Starting:启动中,Running:运行,Shutdown:关闭中,Shutoff:已关闭,Delete:已删除,Upgrading:升级中,Promoting:提升为独库进行中,Recovering:恢复中,Recover fail:恢复失败 + - **SubnetID** (str) - 子网ID + - **SystemFileSize** (float) - DB实例系统文件大小,单位GB + - **VPCID** (str) - VPC的ID + - **Zone** (str) - DB实例所在可用区 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUPgSQLInstanceRequestSchema().dumps(d) + + resp = self.invoke("GetUPgSQLInstance", d, **kwargs) + return apis.GetUPgSQLInstanceResponseSchema().loads(resp) + + def get_u_pg_sql_instance_log( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUPgSQLInstanceLog - 可以查询DB的错误日志和满查询日志 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **AccountID** (int) - (Required) + - **BeginTime** (int) - (Required) 起始时间,需使用时间戳 + - **CompanyID** (int) - (Required) + - **DBId** (str) - (Required) 实例ClusterID + - **EndTime** (int) - (Required) 结束时间,需使用时间戳,结束时间需大于起始时间 + - **LogType** (str) - (Required) 日志类型 + - **ZoneID** (int) - (Required) 可用区 + + **Response** + + - **Log** (str) - 返回的日志信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUPgSQLInstanceLogRequestSchema().dumps(d) + + resp = self.invoke("GetUPgSQLInstanceLog", d, **kwargs) + return apis.GetUPgSQLInstanceLogResponseSchema().loads(resp) + + def get_u_pg_sql_instance_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUPgSQLInstancePrice - 获取创建PG云数据库价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DiskSpace** (int) - (Required) 磁盘空间(GB) + - **InstanceMode** (str) - (Required) UDB实例模式类型, 可选值如下: "Normal": 普通版UDB实例 "HA": 高可用版UDB实例 + - **MachineType** (str) - (Required) 机器配置类型 参考2C4G机器:o.pgsql2m.medium + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ChargeType** (str) - 计费模式。枚举值为: Year,按年付费; Month,按月付费; Dynamic,按小时付费(需开启权限)。默认为月付 + - **Quantity** (int) - 购买时长。默认: 1。按小时购买(Dynamic)时无需此参数。 月付时,此参数传0,代表了购买至月末。 + + **Response** + + - **PriceSet** (list) - 见 **UPgSQLInstancePriceSet** 模型定义 + + **Response Model** + + **UPgSQLInstancePriceSet** + - **ChargeType** (str) - 计费类型,Year,Month,Dynamic。 + - **OriginalPrice** (float) - 购买原价,单位:元。 + - **Price** (float) - 实际价格,单位:元,保留小数点后两位有效数字。 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUPgSQLInstancePriceRequestSchema().dumps(d) + + resp = self.invoke("GetUPgSQLInstancePrice", d, **kwargs) + return apis.GetUPgSQLInstancePriceResponseSchema().loads(resp) + + def get_u_pg_sql_param_template( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUPgSQLParamTemplate - 获取模板信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **GroupID** (int) - (Required) 模板ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Data** (list) - 见 **Param** 模型定义 + - **Message** (str) - 描述信息 + + **Response Model** + + **Param** + - **AllowedVal** (str) - 允许的值 + - **ApplyType** (int) - 允许类型 + - **FormatType** (int) - 参数格式类型 + - **Key** (str) - 参数Key + - **Modifiable** (bool) - 是否可以修改 + - **Value** (str) - 参数值 + - **ValueType** (int) - 值类型 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUPgSQLParamTemplateRequestSchema().dumps(d) + + resp = self.invoke("GetUPgSQLParamTemplate", d, **kwargs) + return apis.GetUPgSQLParamTemplateResponseSchema().loads(resp) + + def get_u_pg_sql_upgrade_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUPgSQLUpgradePrice - 获取 PG 云数据库升降级价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DiskSpace** (int) - (Required) 磁盘空间(GB) + - **InstanceID** (str) - (Required) 资源ID + - **MachineType** (str) - (Required) 机器配置类型 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **InstanceMode** (str) - UDB实例模式类型, 可选值如下: "normal": 普通版UDB实例 "ha": 高可用版UDB实例 默认是"normal" + + **Response** + + - **OriginalPrice** (float) - 限时优惠的折前原价 + - **Price** (float) - 规格调整差价。精确到小数点后2位。 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetUPgSQLUpgradePriceRequestSchema().dumps(d) + + resp = self.invoke("GetUPgSQLUpgradePrice", d, **kwargs) + return apis.GetUPgSQLUpgradePriceResponseSchema().loads(resp) + + def list_u_pg_sql_backup( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUPgSQLBackup - 获取备份列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceID** (str) - (Required) DB实例Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **BackupType** (int) - 备份类型,默认值是0(0:表示全部,1:自动备份,2:手动备份 + - **Limit** (int) - 返回数据长度,默认为20,最大100 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + + **Response** + + - **DataSet** (list) - 见 **UPgSQLBackup** 模型定义 + - **Message** (str) - 返回的详细信息 + - **TotalCount** (int) - 总个数 + + **Response Model** + + **UPgSQLBackup** + - **BackupEndTime** (int) - 备份完成时间(Unix时间戳) + - **BackupID** (str) - 备份id + - **BackupName** (str) - 备份名称 + - **BackupSize** (int) - 备份文件大小(字节) + - **BackupStartTime** (int) - 备份时间(Unix时间戳) + - **BackupType** (int) - 备份类型,手动或者自动 + - **InstanceID** (str) - DB实例Id + - **Region** (str) - 备份所在地域 + - **State** (str) - 备份状态 (Backuping:备份中,Success:备份成功, Failed:备份失败, Expired:备份过期) + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUPgSQLBackupRequestSchema().dumps(d) + + resp = self.invoke("ListUPgSQLBackup", d, **kwargs) + return apis.ListUPgSQLBackupResponseSchema().loads(resp) + + def list_u_pg_sql_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUPgSQLInstance - 获取PG云数据库列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **DataSet** (list) - 见 **UDBInstanceSet** 模型定义 + - **Message** (str) - 错误信息 + + **Response Model** + + **UDBInstanceSet** + - **CreateTime** (int) - DB实例创建时间,采用UTC计时时间戳 + - **DBVersion** (str) - 实例的版本,包括postgresql-10.4,postgresql-13.4 + - **DataSet** (list) - 见 **UDBReadonlyInstance** 模型定义 + - **ExpiredTime** (int) - DB实例过期时间,采用UTC计时时间戳 + - **IP** (str) - DB实例ip + - **InstanceID** (str) - 资源ID + - **InstanceMode** (str) - normal/ha/readonly,普通/高可用/只读从库 + - **MachineType** (str) - 机器规格,格式为nCmG,n代表cpu核数,m代表内存大小(GB) + - **Name** (str) - 实例名称 + - **Remark** (str) - 备注 + - **State** (str) - 实例状态标记 Initing:初始化中,InitFailed:安装失败,Starting:启动中, Running:运行,Stopping:关闭中,Stopped:已关闭,Deleted: 已删除,Upgrading: 升级中 ,Promoting:提升为主库进行中,Recovering:恢复中,RecoverFailed:恢复失败,StartFailed:启动失败,ShutdownFailed:关闭失败,Deleting:删除中,DeleteFailed:删除失败 + - **SubnetID** (str) - 子网ID + - **VPCID** (str) - VPC的ID + - **Zone** (str) - 可用区 + + + **UDBReadonlyInstance** + - **CreateTime** (int) - DB实例创建时间,采用UTC计时时间戳 + - **DBVersion** (str) - 实例的版本,包括postgresql-10.4,postgresql-13.4 + - **ExpiredTime** (int) - DB实例过期时间,采用UTC计时时间戳 + - **IP** (str) - DB实例ip + - **InstanceID** (str) - 资源ID + - **InstanceMode** (str) - normal/ha/readonly,普通/高可用/只读从库 + - **MachineType** (str) - 机器规格,格式为nCmG,n代表cpu核数,m代表内存大小(GB) + - **Name** (str) - 实例名称 + - **Remark** (str) - 备注 + - **State** (str) - 实例状态标记 Initing:初始化中,InitFailed:安装失败,Starting:启动中, Running:运行,Stopping:关闭中,Stopped:已关闭,Deleted: 已删除,Upgrading: 升级中 ,Promoting:提升为主库进行中,Recovering:恢复中,RecoverFailed:恢复失败,StartFailed:启动失败,ShutdownFailed:关闭失败,Deleting:删除中,DeleteFailed:删除失败 + - **SubnetID** (str) - 子网ID + - **VPCID** (str) - VPC的ID + - **Zone** (str) - 可用区 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUPgSQLInstanceRequestSchema().dumps(d) + + resp = self.invoke("ListUPgSQLInstance", d, **kwargs) + return apis.ListUPgSQLInstanceResponseSchema().loads(resp) + + def list_u_pg_sql_log( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUPgSQLLog - 获取数据库日志 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BeginTime** (int) - (Required) 查询的日志开始的时间戳 + - **EndTime** (int) - (Required) 查询日志的结束时间戳 + - **InstanceID** (str) - (Required) 资源ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **DataSet** (list) - 见 **LogSet** 模型定义 + - **Message** (str) - 错误信息 + + **Response Model** + + **LogSet** + - **BeginTime** (int) - + - **EndTime** (int) - + - **Name** (str) - + - **Size** (int) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUPgSQLLogRequestSchema().dumps(d) + + resp = self.invoke("ListUPgSQLLog", d, **kwargs) + return apis.ListUPgSQLLogResponseSchema().loads(resp) + + def list_u_pg_sql_machine_type( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUPgSQLMachineType - 获取UPgSQL支持机器类型列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **DataSet** (list) - 见 **PgSQLMachineType** 模型定义 + - **Message** (str) - 返回信息 + + **Response Model** + + **PgSQLMachineType** + - **Cpu** (int) - cpu核数 + - **Description** (str) - 格式为nCmG,n代表cpu核数,m代表内存大小(GB) + - **ID** (str) - 机器类型ID + - **Memory** (int) - 内存用量(GB) + - **Os** (str) - 机器类型,N/O + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUPgSQLMachineTypeRequestSchema().dumps(d) + + resp = self.invoke("ListUPgSQLMachineType", d, **kwargs) + return apis.ListUPgSQLMachineTypeResponseSchema().loads(resp) + + def list_u_pg_sql_version( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListUPgSQLVersion - 获取UPgSQL支持版本列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **DataSet** (list) - 见 **PgSQLVersion** 模型定义 + - **Message** (str) - 返回信息 + + **Response Model** + + **PgSQLVersion** + - **Available** (str) - 2位二进制控制是否开放单点和高可用,前一位控制单点是否开放,后一位控制高可用,例如"01"代表只开放高可用,"10"代表只开放单点,"11"代表全开放 + - **DBVersion** (str) - PgSQL版本 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListUPgSQLVersionRequestSchema().dumps(d) + + resp = self.invoke("ListUPgSQLVersion", d, **kwargs) + return apis.ListUPgSQLVersionResponseSchema().loads(resp) + + def restart_u_pg_sql_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RestartUPgSQLInstance - 重启PG实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceID** (str) - (Required) 实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ForceToRestart** (bool) - 是否强制重启 + - **RestartHost** (bool) - 是否一并重启主机 + + **Response** + + - **Message** (str) - 描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.RestartUPgSQLInstanceRequestSchema().dumps(d) + + resp = self.invoke("RestartUPgSQLInstance", d, **kwargs) + return apis.RestartUPgSQLInstanceResponseSchema().loads(resp) + + def start_u_pg_sql_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """StartUPgSQLInstance - 启动 PG实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceID** (str) - (Required) 实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 返回信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.StartUPgSQLInstanceRequestSchema().dumps(d) + + resp = self.invoke("StartUPgSQLInstance", d, **kwargs) + return apis.StartUPgSQLInstanceResponseSchema().loads(resp) + + def stop_u_pg_sql_creating_readonly( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """StopUPgSQLCreatingReadonly - 停止创建从库 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceID** (str) - (Required) 停止创建从库 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.StopUPgSQLCreatingReadonlyRequestSchema().dumps(d) + + resp = self.invoke("StopUPgSQLCreatingReadonly", d, **kwargs) + return apis.StopUPgSQLCreatingReadonlyResponseSchema().loads(resp) + + def stop_u_pg_sql_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """StopUPgSQLInstance - 关闭PG实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceID** (str) - (Required) 实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ForceToStop** (bool) - 是否强制关闭 + - **StopHost** (bool) - 是否将主机一并关闭 + + **Response** + + - **Message** (str) - 描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.StopUPgSQLInstanceRequestSchema().dumps(d) + + resp = self.invoke("StopUPgSQLInstance", d, **kwargs) + return apis.StopUPgSQLInstanceResponseSchema().loads(resp) + + def update_u_pg_sql_attribute( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateUPgSQLAttribute - 更新数据库属性 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceID** (str) - (Required) DB实例Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Name** (str) - 新的db名字(不能为空字符串) + - **Remark** (str) - 新的备注信息 + + **Response** + + - **Message** (str) - 返回的详细信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateUPgSQLAttributeRequestSchema().dumps(d) + + resp = self.invoke("UpdateUPgSQLAttribute", d, **kwargs) + return apis.UpdateUPgSQLAttributeResponseSchema().loads(resp) + + def update_u_pg_sql_backup_strategy( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateUPgSQLBackupStrategy - 修改备份策略 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceID** (str) - (Required) DB实例Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **BackupMethod** (str) - 选择默认的备份方式 + - **BackupTimeRange** (str) - 自动备份预计开始时间范围(00:00~23:59),例如:(3:00~4:00) + - **BackupWeek** (str) - 自动备份预期星期几(1~7)开始。默认1,2,3,4,5,6,7(星期一到星期日) + + **Response** + + - **Message** (str) - 返回的详细信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateUPgSQLBackupStrategyRequestSchema().dumps(d) + + resp = self.invoke("UpdateUPgSQLBackupStrategy", d, **kwargs) + return apis.UpdateUPgSQLBackupStrategyResponseSchema().loads(resp) + + def update_u_pg_sql_password( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateUPgSQLPassword - 更新数据库密码 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceID** (str) - (Required) DB实例Id + - **Password** (str) - (Required) 新的db密码 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 返回的详细信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateUPgSQLPasswordRequestSchema().dumps(d) + + resp = self.invoke("UpdateUPgSQLPassword", d, **kwargs) + return apis.UpdateUPgSQLPasswordResponseSchema().loads(resp) + + def upgrade_u_pg_sql_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpgradeUPgSQLInstance - 硬件规格升降级 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DiskSpace** (int) - (Required) 磁盘空间(GB) + - **InstanceID** (str) - (Required) 资源ID + - **MachineType** (str) - (Required) 机器配置类型 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 错误信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpgradeUPgSQLInstanceRequestSchema().dumps(d) + + resp = self.invoke("UpgradeUPgSQLInstance", d, **kwargs) + return apis.UpgradeUPgSQLInstanceResponseSchema().loads(resp) + + def upload_u_pg_sql_param_template( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UploadUPgSQLParamTemplate - 上传参数模板 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Content** (str) - (Required) base64编码过的 + - **DBVersion** (str) - (Required) 应用的DB版本 + - **GroupName** (str) - (Required) 模板名称 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Description** (str) - 模板描述 + - **ParamGroupType** (str) - 版本 + + **Response** + + - **GroupID** (int) - 生成的模板ID + - **Message** (str) - 描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UploadUPgSQLParamTemplateRequestSchema().dumps(d) + + resp = self.invoke("UploadUPgSQLParamTemplate", d, **kwargs) + return apis.UploadUPgSQLParamTemplateResponseSchema().loads(resp) diff --git a/ucloud/services/upgsql/schemas/__init__.py b/ucloud/services/upgsql/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/upgsql/schemas/apis.py b/ucloud/services/upgsql/schemas/apis.py new file mode 100644 index 00000000..22c2aed1 --- /dev/null +++ b/ucloud/services/upgsql/schemas/apis.py @@ -0,0 +1,827 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.upgsql.schemas import models + +""" UPgSQL API Schema +""" + + +""" +API: BackupUPgSQLLog + +备份日志包 +""" + + +class BackupUPgSQLLogRequestSchema(schema.RequestSchema): + """BackupUPgSQLLog - 备份日志包""" + + fields = { + "BackupFile": fields.Str(required=True, dump_to="BackupFile"), + "BackupName": fields.Str(required=True, dump_to="BackupName"), + "BeginTime": fields.Int(required=False, dump_to="BeginTime"), + "EndTime": fields.Int(required=False, dump_to="EndTime"), + "InstanceID": fields.Str(required=True, dump_to="InstanceID"), + "LogType": fields.Str(required=False, dump_to="LogType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class BackupUPgSQLLogResponseSchema(schema.ResponseSchema): + """BackupUPgSQLLog - 备份日志包""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: CreateUPgSQLInstance + +创建PG云数据库 +""" + + +class CreateUPgSQLInstanceRequestSchema(schema.RequestSchema): + """CreateUPgSQLInstance - 创建PG云数据库""" + + fields = { + "AdminPassword": fields.Str(required=True, dump_to="AdminPassword"), + "DBVersion": fields.Str(required=True, dump_to="DBVersion"), + "DiskSpace": fields.Str(required=True, dump_to="DiskSpace"), + "InstanceMode": fields.Str(required=False, dump_to="InstanceMode"), + "MachineType": fields.Str(required=True, dump_to="MachineType"), + "Name": fields.Str(required=True, dump_to="Name"), + "ParamGroupID": fields.Int(required=True, dump_to="ParamGroupID"), + "Port": fields.Int(required=True, dump_to="Port"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetID": fields.Str(required=True, dump_to="SubnetID"), + "VPCID": fields.Str(required=True, dump_to="VPCID"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateUPgSQLInstanceResponseSchema(schema.ResponseSchema): + """CreateUPgSQLInstance - 创建PG云数据库""" + + fields = { + "InstanceID": fields.Str(required=False, load_from="InstanceID"), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: CreateUPgSQLParamTemplate + +创建PG参数模板 +""" + + +class CreateUPgSQLParamTemplateRequestSchema(schema.RequestSchema): + """CreateUPgSQLParamTemplate - 创建PG参数模板""" + + fields = { + "DBVersion": fields.Str(required=True, dump_to="DBVersion"), + "Description": fields.Str(required=False, dump_to="Description"), + "GroupName": fields.Str(required=True, dump_to="GroupName"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SrcGroupID": fields.Int(required=True, dump_to="SrcGroupID"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateUPgSQLParamTemplateResponseSchema(schema.ResponseSchema): + """CreateUPgSQLParamTemplate - 创建PG参数模板""" + + fields = { + "GroupID": fields.Int(required=True, load_from="GroupID"), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: CreateUPgSQLReadonly + +创建PG从库 +""" + + +class CreateUPgSQLReadonlyRequestSchema(schema.RequestSchema): + """CreateUPgSQLReadonly - 创建PG从库""" + + fields = { + "DiskSpace": fields.Int(required=True, dump_to="DiskSpace"), + "MachineType": fields.Str(required=True, dump_to="MachineType"), + "Name": fields.Str(required=True, dump_to="Name"), + "Port": fields.Int(required=True, dump_to="Port"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SrcInstanceID": fields.Str(required=True, dump_to="SrcInstanceID"), + "SubnetID": fields.Str(required=False, dump_to="SubnetID"), + "VPCID": fields.Str(required=False, dump_to="VPCID"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateUPgSQLReadonlyResponseSchema(schema.ResponseSchema): + """CreateUPgSQLReadonly - 创建PG从库""" + + fields = { + "InstanceID": fields.Str(required=False, load_from="InstanceID"), + } + + +""" +API: DeleteUPgSQLInstance + +删除PG实例 +""" + + +class DeleteUPgSQLInstanceRequestSchema(schema.RequestSchema): + """DeleteUPgSQLInstance - 删除PG实例""" + + fields = { + "InstanceID": fields.Str(required=True, dump_to="InstanceID"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DeleteUPgSQLInstanceResponseSchema(schema.ResponseSchema): + """DeleteUPgSQLInstance - 删除PG实例""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DeleteUPgSQLParamTemplate + +删除参数模板 +""" + + +class DeleteUPgSQLParamTemplateRequestSchema(schema.RequestSchema): + """DeleteUPgSQLParamTemplate - 删除参数模板""" + + fields = { + "GroupID": fields.Int(required=True, dump_to="GroupID"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DeleteUPgSQLParamTemplateResponseSchema(schema.ResponseSchema): + """DeleteUPgSQLParamTemplate - 删除参数模板""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DownloadUPgSQLParamTemplate + +下载参数模板信息 +""" + + +class DownloadUPgSQLParamTemplateRequestSchema(schema.RequestSchema): + """DownloadUPgSQLParamTemplate - 下载参数模板信息""" + + fields = { + "GroupID": fields.Int(required=True, dump_to="GroupID"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DownloadUPgSQLParamTemplateResponseSchema(schema.ResponseSchema): + """DownloadUPgSQLParamTemplate - 下载参数模板信息""" + + fields = { + "Content": fields.Str(required=True, load_from="Content"), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: GetUPgSQLBackupStrategy + +获取备份策略 +""" + + +class GetUPgSQLBackupStrategyRequestSchema(schema.RequestSchema): + """GetUPgSQLBackupStrategy - 获取备份策略""" + + fields = { + "InstanceID": fields.Str(required=True, dump_to="InstanceID"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetUPgSQLBackupStrategyResponseSchema(schema.ResponseSchema): + """GetUPgSQLBackupStrategy - 获取备份策略""" + + fields = { + "BackupMethod": fields.Str(required=True, load_from="BackupMethod"), + "BackupTimeRange": fields.Str( + required=True, load_from="BackupTimeRange" + ), + "BackupWeek": fields.Str(required=True, load_from="BackupWeek"), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: GetUPgSQLBackupURL + +获取备份下载地址 +""" + + +class GetUPgSQLBackupURLRequestSchema(schema.RequestSchema): + """GetUPgSQLBackupURL - 获取备份下载地址""" + + fields = { + "BackupID": fields.Str(required=True, dump_to="BackupID"), + "InstanceID": fields.Str(required=True, dump_to="InstanceID"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetUPgSQLBackupURLResponseSchema(schema.ResponseSchema): + """GetUPgSQLBackupURL - 获取备份下载地址""" + + fields = { + "BackupPath": fields.Str(required=True, load_from="BackupPath"), + "InnerBackupPath": fields.Str( + required=True, load_from="InnerBackupPath" + ), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: GetUPgSQLInstance + +获取PG云数据库实例描述 +""" + + +class GetUPgSQLInstanceRequestSchema(schema.RequestSchema): + """GetUPgSQLInstance - 获取PG云数据库实例描述""" + + fields = { + "InstanceID": fields.Str(required=True, dump_to="InstanceID"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class GetUPgSQLInstanceResponseSchema(schema.ResponseSchema): + """GetUPgSQLInstance - 获取PG云数据库实例描述""" + + fields = { + "DataSet": models.UDBInstanceSchema(), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: GetUPgSQLInstanceLog + +可以查询DB的错误日志和满查询日志 +""" + + +class GetUPgSQLInstanceLogRequestSchema(schema.RequestSchema): + """GetUPgSQLInstanceLog - 可以查询DB的错误日志和满查询日志""" + + fields = { + "AccountID": fields.Int(required=True, dump_to="AccountID"), + "BeginTime": fields.Int(required=True, dump_to="BeginTime"), + "CompanyID": fields.Int(required=True, dump_to="CompanyID"), + "DBId": fields.Str(required=True, dump_to="DBId"), + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "LogType": fields.Str(required=True, dump_to="LogType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ZoneID": fields.Int(required=True, dump_to="ZoneID"), + } + + +class GetUPgSQLInstanceLogResponseSchema(schema.ResponseSchema): + """GetUPgSQLInstanceLog - 可以查询DB的错误日志和满查询日志""" + + fields = { + "Log": fields.Str(required=True, load_from="Log"), + } + + +""" +API: GetUPgSQLInstancePrice + +获取创建PG云数据库价格 +""" + + +class GetUPgSQLInstancePriceRequestSchema(schema.RequestSchema): + """GetUPgSQLInstancePrice - 获取创建PG云数据库价格""" + + fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "DiskSpace": fields.Int(required=True, dump_to="DiskSpace"), + "InstanceMode": fields.Str(required=True, dump_to="InstanceMode"), + "MachineType": fields.Str(required=True, dump_to="MachineType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetUPgSQLInstancePriceResponseSchema(schema.ResponseSchema): + """GetUPgSQLInstancePrice - 获取创建PG云数据库价格""" + + fields = { + "PriceSet": fields.List( + models.UPgSQLInstancePriceSetSchema(), + required=False, + load_from="PriceSet", + ), + } + + +""" +API: GetUPgSQLParamTemplate + +获取模板信息 +""" + + +class GetUPgSQLParamTemplateRequestSchema(schema.RequestSchema): + """GetUPgSQLParamTemplate - 获取模板信息""" + + fields = { + "GroupID": fields.Int(required=True, dump_to="GroupID"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetUPgSQLParamTemplateResponseSchema(schema.ResponseSchema): + """GetUPgSQLParamTemplate - 获取模板信息""" + + fields = { + "Data": fields.List( + models.ParamSchema(), required=False, load_from="Data" + ), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: GetUPgSQLUpgradePrice + + 获取 PG 云数据库升降级价格 +""" + + +class GetUPgSQLUpgradePriceRequestSchema(schema.RequestSchema): + """GetUPgSQLUpgradePrice - 获取 PG 云数据库升降级价格""" + + fields = { + "DiskSpace": fields.Int(required=True, dump_to="DiskSpace"), + "InstanceID": fields.Str(required=True, dump_to="InstanceID"), + "InstanceMode": fields.Str(required=False, dump_to="InstanceMode"), + "MachineType": fields.Str(required=True, dump_to="MachineType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetUPgSQLUpgradePriceResponseSchema(schema.ResponseSchema): + """GetUPgSQLUpgradePrice - 获取 PG 云数据库升降级价格""" + + fields = { + "OriginalPrice": fields.Float(required=True, load_from="OriginalPrice"), + "Price": fields.Float(required=True, load_from="Price"), + } + + +""" +API: ListUPgSQLBackup + +获取备份列表 +""" + + +class ListUPgSQLBackupRequestSchema(schema.RequestSchema): + """ListUPgSQLBackup - 获取备份列表""" + + fields = { + "BackupType": fields.Int(required=False, dump_to="BackupType"), + "InstanceID": fields.Str(required=True, dump_to="InstanceID"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ListUPgSQLBackupResponseSchema(schema.ResponseSchema): + """ListUPgSQLBackup - 获取备份列表""" + + fields = { + "DataSet": fields.List( + models.UPgSQLBackupSchema(), required=True, load_from="DataSet" + ), + "Message": fields.Str(required=True, load_from="Message"), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: ListUPgSQLInstance + +获取PG云数据库列表 +""" + + +class ListUPgSQLInstanceRequestSchema(schema.RequestSchema): + """ListUPgSQLInstance - 获取PG云数据库列表""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class ListUPgSQLInstanceResponseSchema(schema.ResponseSchema): + """ListUPgSQLInstance - 获取PG云数据库列表""" + + fields = { + "DataSet": fields.List( + models.UDBInstanceSetSchema(), required=True, load_from="DataSet" + ), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: ListUPgSQLLog + +获取数据库日志 +""" + + +class ListUPgSQLLogRequestSchema(schema.RequestSchema): + """ListUPgSQLLog - 获取数据库日志""" + + fields = { + "BeginTime": fields.Int(required=True, dump_to="BeginTime"), + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "InstanceID": fields.Str(required=True, dump_to="InstanceID"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ListUPgSQLLogResponseSchema(schema.ResponseSchema): + """ListUPgSQLLog - 获取数据库日志""" + + fields = { + "DataSet": fields.List( + models.LogSetSchema(), required=True, load_from="DataSet" + ), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: ListUPgSQLMachineType + +获取UPgSQL支持机器类型列表 +""" + + +class ListUPgSQLMachineTypeRequestSchema(schema.RequestSchema): + """ListUPgSQLMachineType - 获取UPgSQL支持机器类型列表""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ListUPgSQLMachineTypeResponseSchema(schema.ResponseSchema): + """ListUPgSQLMachineType - 获取UPgSQL支持机器类型列表""" + + fields = { + "DataSet": fields.List( + models.PgSQLMachineTypeSchema(), required=True, load_from="DataSet" + ), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: ListUPgSQLVersion + +获取UPgSQL支持版本列表 +""" + + +class ListUPgSQLVersionRequestSchema(schema.RequestSchema): + """ListUPgSQLVersion - 获取UPgSQL支持版本列表""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ListUPgSQLVersionResponseSchema(schema.ResponseSchema): + """ListUPgSQLVersion - 获取UPgSQL支持版本列表""" + + fields = { + "DataSet": fields.List( + models.PgSQLVersionSchema(), required=True, load_from="DataSet" + ), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: RestartUPgSQLInstance + +重启PG实例 +""" + + +class RestartUPgSQLInstanceRequestSchema(schema.RequestSchema): + """RestartUPgSQLInstance - 重启PG实例""" + + fields = { + "ForceToRestart": fields.Bool(required=False, dump_to="ForceToRestart"), + "InstanceID": fields.Str(required=True, dump_to="InstanceID"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "RestartHost": fields.Bool(required=False, dump_to="RestartHost"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class RestartUPgSQLInstanceResponseSchema(schema.ResponseSchema): + """RestartUPgSQLInstance - 重启PG实例""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: StartUPgSQLInstance + +启动 PG实例 +""" + + +class StartUPgSQLInstanceRequestSchema(schema.RequestSchema): + """StartUPgSQLInstance - 启动 PG实例""" + + fields = { + "InstanceID": fields.Str(required=True, dump_to="InstanceID"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class StartUPgSQLInstanceResponseSchema(schema.ResponseSchema): + """StartUPgSQLInstance - 启动 PG实例""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: StopUPgSQLCreatingReadonly + +停止创建从库 +""" + + +class StopUPgSQLCreatingReadonlyRequestSchema(schema.RequestSchema): + """StopUPgSQLCreatingReadonly - 停止创建从库""" + + fields = { + "InstanceID": fields.Str(required=True, dump_to="InstanceID"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class StopUPgSQLCreatingReadonlyResponseSchema(schema.ResponseSchema): + """StopUPgSQLCreatingReadonly - 停止创建从库""" + + fields = {} + + +""" +API: StopUPgSQLInstance + +关闭PG实例 +""" + + +class StopUPgSQLInstanceRequestSchema(schema.RequestSchema): + """StopUPgSQLInstance - 关闭PG实例""" + + fields = { + "ForceToStop": fields.Bool(required=False, dump_to="ForceToStop"), + "InstanceID": fields.Str(required=True, dump_to="InstanceID"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "StopHost": fields.Bool(required=False, dump_to="StopHost"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class StopUPgSQLInstanceResponseSchema(schema.ResponseSchema): + """StopUPgSQLInstance - 关闭PG实例""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: UpdateUPgSQLAttribute + +更新数据库属性 +""" + + +class UpdateUPgSQLAttributeRequestSchema(schema.RequestSchema): + """UpdateUPgSQLAttribute - 更新数据库属性""" + + fields = { + "InstanceID": fields.Str(required=True, dump_to="InstanceID"), + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class UpdateUPgSQLAttributeResponseSchema(schema.ResponseSchema): + """UpdateUPgSQLAttribute - 更新数据库属性""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: UpdateUPgSQLBackupStrategy + +修改备份策略 +""" + + +class UpdateUPgSQLBackupStrategyRequestSchema(schema.RequestSchema): + """UpdateUPgSQLBackupStrategy - 修改备份策略""" + + fields = { + "BackupMethod": fields.Str(required=False, dump_to="BackupMethod"), + "BackupTimeRange": fields.Str( + required=False, dump_to="BackupTimeRange" + ), + "BackupWeek": fields.Str(required=False, dump_to="BackupWeek"), + "InstanceID": fields.Str(required=True, dump_to="InstanceID"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class UpdateUPgSQLBackupStrategyResponseSchema(schema.ResponseSchema): + """UpdateUPgSQLBackupStrategy - 修改备份策略""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: UpdateUPgSQLPassword + +更新数据库密码 +""" + + +class UpdateUPgSQLPasswordRequestSchema(schema.RequestSchema): + """UpdateUPgSQLPassword - 更新数据库密码""" + + fields = { + "InstanceID": fields.Str(required=True, dump_to="InstanceID"), + "Password": fields.Str(required=True, dump_to="Password"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class UpdateUPgSQLPasswordResponseSchema(schema.ResponseSchema): + """UpdateUPgSQLPassword - 更新数据库密码""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: UpgradeUPgSQLInstance + +硬件规格升降级 +""" + + +class UpgradeUPgSQLInstanceRequestSchema(schema.RequestSchema): + """UpgradeUPgSQLInstance - 硬件规格升降级""" + + fields = { + "DiskSpace": fields.Int(required=True, dump_to="DiskSpace"), + "InstanceID": fields.Str(required=True, dump_to="InstanceID"), + "MachineType": fields.Str(required=True, dump_to="MachineType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class UpgradeUPgSQLInstanceResponseSchema(schema.ResponseSchema): + """UpgradeUPgSQLInstance - 硬件规格升降级""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: UploadUPgSQLParamTemplate + +上传参数模板 +""" + + +class UploadUPgSQLParamTemplateRequestSchema(schema.RequestSchema): + """UploadUPgSQLParamTemplate - 上传参数模板""" + + fields = { + "Content": fields.Str(required=True, dump_to="Content"), + "DBVersion": fields.Str(required=True, dump_to="DBVersion"), + "Description": fields.Str(required=False, dump_to="Description"), + "GroupName": fields.Str(required=True, dump_to="GroupName"), + "ParamGroupType": fields.Str(required=False, dump_to="ParamGroupType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class UploadUPgSQLParamTemplateResponseSchema(schema.ResponseSchema): + """UploadUPgSQLParamTemplate - 上传参数模板""" + + fields = { + "GroupID": fields.Int(required=True, load_from="GroupID"), + "Message": fields.Str(required=True, load_from="Message"), + } diff --git a/ucloud/services/upgsql/schemas/models.py b/ucloud/services/upgsql/schemas/models.py new file mode 100644 index 00000000..1e238842 --- /dev/null +++ b/ucloud/services/upgsql/schemas/models.py @@ -0,0 +1,158 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class UDBInstanceSchema(schema.ResponseSchema): + """UDBInstance - 数据库信息""" + + fields = { + "AdminUser": fields.Str(required=False, load_from="AdminUser"), + "BackupBeginTime": fields.Int( + required=False, load_from="BackupBeginTime" + ), + "BackupCount": fields.Int(required=False, load_from="BackupCount"), + "BackupDate": fields.Str(required=False, load_from="BackupDate"), + "BackupTimeRange": fields.Int( + required=False, load_from="BackupTimeRange" + ), + "BackupZone": fields.Str(required=False, load_from="BackupZone"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DBVersion": fields.Str(required=False, load_from="DBVersion"), + "DataFileSize": fields.Float(required=False, load_from="DataFileSize"), + "DiskSpace": fields.Int(required=False, load_from="DiskSpace"), + "DiskUsedSize": fields.Float(required=False, load_from="DiskUsedSize"), + "ExpiredTime": fields.Int(required=False, load_from="ExpiredTime"), + "IP": fields.Str(required=False, load_from="IP"), + "InstanceID": fields.Str(required=False, load_from="InstanceID"), + "InstanceMode": fields.Str(required=False, load_from="InstanceMode"), + "LogFileSize": fields.Float(required=False, load_from="LogFileSize"), + "MemoryLimit": fields.Int(required=False, load_from="MemoryLimit"), + "ModifyTime": fields.Int(required=False, load_from="ModifyTime"), + "Name": fields.Str(required=False, load_from="Name"), + "ParamGroupID": fields.Int(required=False, load_from="ParamGroupID"), + "Port": fields.Int(required=False, load_from="Port"), + "Remark": fields.Str(required=False, load_from="Remark"), + "State": fields.Str(required=False, load_from="State"), + "SubnetID": fields.Str(required=False, load_from="SubnetID"), + "SystemFileSize": fields.Float( + required=False, load_from="SystemFileSize" + ), + "VPCID": fields.Str(required=False, load_from="VPCID"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class UPgSQLInstancePriceSetSchema(schema.ResponseSchema): + """UPgSQLInstancePriceSet - PG云数据库价格""" + + fields = { + "ChargeType": fields.Str(required=True, load_from="ChargeType"), + "OriginalPrice": fields.Float(required=True, load_from="OriginalPrice"), + "Price": fields.Float(required=True, load_from="Price"), + } + + +class ParamSchema(schema.ResponseSchema): + """Param -""" + + fields = { + "AllowedVal": fields.Str(required=False, load_from="AllowedVal"), + "ApplyType": fields.Int(required=False, load_from="ApplyType"), + "FormatType": fields.Int(required=False, load_from="FormatType"), + "Key": fields.Str(required=False, load_from="Key"), + "Modifiable": fields.Bool(required=False, load_from="Modifiable"), + "Value": fields.Str(required=False, load_from="Value"), + "ValueType": fields.Int(required=False, load_from="ValueType"), + } + + +class UPgSQLBackupSchema(schema.ResponseSchema): + """UPgSQLBackup - 备份详情信息""" + + fields = { + "BackupEndTime": fields.Int(required=False, load_from="BackupEndTime"), + "BackupID": fields.Str(required=True, load_from="BackupID"), + "BackupName": fields.Str(required=False, load_from="BackupName"), + "BackupSize": fields.Int(required=False, load_from="BackupSize"), + "BackupStartTime": fields.Int( + required=False, load_from="BackupStartTime" + ), + "BackupType": fields.Int(required=False, load_from="BackupType"), + "InstanceID": fields.Str(required=True, load_from="InstanceID"), + "Region": fields.Str(required=False, load_from="Region"), + "State": fields.Str(required=False, load_from="State"), + } + + +class UDBReadonlyInstanceSchema(schema.ResponseSchema): + """UDBReadonlyInstance - 只读从库结构""" + + fields = { + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DBVersion": fields.Str(required=False, load_from="DBVersion"), + "ExpiredTime": fields.Int(required=False, load_from="ExpiredTime"), + "IP": fields.Str(required=False, load_from="IP"), + "InstanceID": fields.Str(required=False, load_from="InstanceID"), + "InstanceMode": fields.Str(required=False, load_from="InstanceMode"), + "MachineType": fields.Str(required=False, load_from="MachineType"), + "Name": fields.Str(required=False, load_from="Name"), + "Remark": fields.Str(required=False, load_from="Remark"), + "State": fields.Str(required=False, load_from="State"), + "SubnetID": fields.Str(required=False, load_from="SubnetID"), + "VPCID": fields.Str(required=False, load_from="VPCID"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class UDBInstanceSetSchema(schema.ResponseSchema): + """UDBInstanceSet - 数据库信息列表""" + + fields = { + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DBVersion": fields.Str(required=False, load_from="DBVersion"), + "DataSet": fields.List(UDBReadonlyInstanceSchema()), + "ExpiredTime": fields.Int(required=False, load_from="ExpiredTime"), + "IP": fields.Str(required=False, load_from="IP"), + "InstanceID": fields.Str(required=False, load_from="InstanceID"), + "InstanceMode": fields.Str(required=False, load_from="InstanceMode"), + "MachineType": fields.Str(required=False, load_from="MachineType"), + "Name": fields.Str(required=False, load_from="Name"), + "Remark": fields.Str(required=False, load_from="Remark"), + "State": fields.Str(required=False, load_from="State"), + "SubnetID": fields.Str(required=False, load_from="SubnetID"), + "VPCID": fields.Str(required=False, load_from="VPCID"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class LogSetSchema(schema.ResponseSchema): + """LogSet - 日志信息""" + + fields = { + "BeginTime": fields.Int(required=False, load_from="BeginTime"), + "EndTime": fields.Int(required=False, load_from="EndTime"), + "Name": fields.Str(required=False, load_from="Name"), + "Size": fields.Int(required=False, load_from="Size"), + } + + +class PgSQLMachineTypeSchema(schema.ResponseSchema): + """PgSQLMachineType - 机器类型信息列表""" + + fields = { + "Cpu": fields.Int(required=False, load_from="Cpu"), + "Description": fields.Str(required=False, load_from="Description"), + "ID": fields.Str(required=False, load_from="ID"), + "Memory": fields.Int(required=False, load_from="Memory"), + "Os": fields.Str(required=False, load_from="Os"), + } + + +class PgSQLVersionSchema(schema.ResponseSchema): + """PgSQLVersion - postgresql版本信息""" + + fields = { + "Available": fields.Str(required=False, load_from="Available"), + "DBVersion": fields.Str(required=False, load_from="DBVersion"), + } diff --git a/ucloud/services/uphone/__init__.py b/ucloud/services/uphone/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/uphone/client.py b/ucloud/services/uphone/client.py new file mode 100644 index 00000000..346faac8 --- /dev/null +++ b/ucloud/services/uphone/client.py @@ -0,0 +1,2122 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.uphone.schemas import apis + + +class UPhoneClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UPhoneClient, self).__init__( + config, transport, middleware, logger + ) + + def create_u_phone( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUPhone - 创建云手机 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CityId** (str) - (Required) 城市Id,通过 `获取城市列表 `_ 获取;新增一个oversea虚拟城市,可以用来绑定海外独立IP + - **ImageId** (str) - (Required) 云手机镜像ID,不超过32个字节。可通过[查询手机镜像]()查询云手机规格对应的镜像ID。 + - **Name** (str) - (Required) 云手机实例名称,默认:UPhone。如果同时创建多个,则增加数字后缀,如UPhone-1 + - **UPhoneCount** (int) - (Required) 创建云手机的个数 + - **UPhoneModelName** (str) - (Required) 云手机规格名称,不超过64个字节。可通过[查询云手机规格列表]()查询支持的云手机规格。 + - **BindIp** (bool) - 绑定独立IP + - **ChargeType** (str) - 计费模式。枚举值为: > 年 Year,按年付费; > Month,按月付费; > Dynamic,按小时预付费; 默认为月付 + - **CouponId** (str) - 云手机代金券ID。请通过DescribeCoupon接口查询,或登录用户中心查看。注:代金券对带宽不适用,仅适用于云手机计费 + - **IpDestRegion** (str) - 购买独立IP必须有此参数。绑定的目的地域。参见 `地域和可用区列表 `_ + - **IpProportion** (int) - 独立IP参数。需要独立IP的比例。eg: [4:1]->4, [3:1]->3。 + - **Quantity** (str) - 购买时长。默认值: 1。月付时,此参数传0,代表购买至月末。 + - **ShareBandwidthId** (str) - 共享带宽ID,使用现有共享带宽时需要传入此参数 + - **ShareBandwidthName** (str) - 共享带宽名称,可以在创建新的共享带宽时指定一个名称 + - **Tag** (str) - 业务组。默认:Default(Default即为未分组)。请遵照 `字段规范 `_ 设定业务组。 + - **UPhoneBandwidth** (int) - 单个云手机独立IP网络带宽,单位Kbps;CityId为oversea时不生效;手机规格为UPhone Store和UPhone Live时不生效 + - **UseGlobalBws** (bool) - 使用区域全局共享带宽 + - **UseKbps** (bool) - 使用Kbps限速 + + **Response** + + - **JobId** (str) - 任务ID,用来查询创建云手机任务状态 + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息 + - **UPhoneIds** (list) - 【数组】创建的云手机ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.CreateUPhoneRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUPhone", d, **kwargs) + return apis.CreateUPhoneResponseSchema().loads(resp) + + def create_u_phone_app( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUPhoneApp - 一个 app 对应多个 app_version。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Name** (str) - (Required) 应用名称。 + - **Description** (str) - 应用描述。 + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + + **Response** + + - **AppId** (str) - 应用的唯一标识ID + - **Message** (str) - 返回错误消息,当 `RetCode` 非 0 时提供详细的描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.CreateUPhoneAppRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUPhoneApp", d, **kwargs) + return apis.CreateUPhoneAppResponseSchema().loads(resp) + + def create_u_phone_app_version( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUPhoneAppVersion - 创建云手机应用版本。注:一个 app 对应多个 app_version。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **AppId** (str) - (Required) 应用的唯一标识ID。 + - **Name** (str) - (Required) 应用版本名称,最大字符长度为255。 + - **URL** (str) - (Required) 应用版本相关的Apk文件存放的公网URL地址。 + - **Description** (str) - 应用版本描述。 + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + + **Response** + + - **AppVersionId** (str) - 应用版本的唯一标识ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.CreateUPhoneAppVersionRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUPhoneAppVersion", d, **kwargs) + return apis.CreateUPhoneAppVersionResponseSchema().loads(resp) + + def create_u_phone_image( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUPhoneImage - 创建云手机镜像。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Name** (str) - (Required) 镜像名称。长度为2~128个英文或中文字符。 + - **UPhoneId** (str) - (Required) 手机实例的资源ID + - **CityId** (str) - 城市Id,通过 `获取城市列表 `_ 获取 + - **Description** (str) - 镜像的描述信息。长度为2~256个英文或中文字符 + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + + **Response** + + - **ImageId** (str) - 云手机自定义镜像资源 ID + - **JobId** (str) - 请求的唯一标识Id,`RetCode`为0时返回,可根据此ID查询请求的执行状态 + - **Message** (str) - 返回错误消息,当 `RetCode` 非 0 时提供详细的描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.CreateUPhoneImageRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUPhoneImage", d, **kwargs) + return apis.CreateUPhoneImageResponseSchema().loads(resp) + + def create_u_phone_server( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUPhoneServer - 创建云手机服务器 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CityId** (str) - (Required) 城市Id,通过 `获取城市列表 `_ 获取 + - **ImageId** (str) - (Required) 云手机镜像ID,不超过32个字节。可通过 `查询手机镜像 `_ 查询云手机规格对应的镜像ID。 + - **Name** (str) - (Required) 云手机服务器实例名称。默认:UPhone。请遵照字段规范设定实例名称。 + - **ServerModelName** (str) - (Required) 云手机服务器规格名称,不超过64个字节。可通过 `查询云手机服务器规格列表 `_ 查询支持的云手机服务器规格。 + - **UPhoneModelName** (str) - (Required) 云手机规格名称,不超过64个字节。可通过 `查询云手机规格列表 `_ 查询支持的云手机规格。 + - **ChargeType** (str) - 计费模式。枚举值为:> 年 Year,按年付费;> Month,按月付费;> Dynamic,按小时预付费;默认为月付 + - **CouponId** (str) - 云手机服务器代金券ID。请通过DescribeCoupon接口查询,或登录用户中心查看。注:代金券对带宽不适用,仅适用于云手机服务器计费 + - **IpDestRegion** (str) - 购买独立IP必须此参数。绑定的目的地域。参见 `地域和可用区列表 `_ + - **IpProportion** (int) - 独立IP参数。需要独立IP的比例。eg: [4:1]->4, [3:1]->3。 + - **Quantity** (str) - 购买时长。默认值: 1。月付时,此参数传0,代表购买至月末。 + - **ShareBandwidth** (int) - 独立IP参数。共享带宽值大小。传此参数需要和IpProportion同时传。 + - **Tag** (str) - 业务组。默认:Default(Default即为未分组)。请遵照 `字段规范 `_ 设定业务组。 + + **Response** + + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息 + - **ServerId** (str) - 云手机服务器的实例 ID + + **Request Model** + + **CreateUPhoneServerParamNetworkInterface** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.CreateUPhoneServerRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUPhoneServer", d, **kwargs) + return apis.CreateUPhoneServerResponseSchema().loads(resp) + + def delete_u_phone( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUPhone - 删除云手机 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **UPhoneIds** (list) - (Required) 【数组】云手机实例的资源 ID,N<200;调用方式举例:UPhoneIds.0=希望获取信息的云手机 1 的 UPhoneId,UPhoneIds.1=云手机实例 2 的 UPhoneId + - **CityId** (str) - 城市Id,通过 `获取城市列表 `_ 获取 + - **ProductType** (str) - 枚举值。表示当前操作的产品类型,目前固定值【uphone】,表示云手机场景。 + + **Response** + + - **JobId** (str) - 任务ID,用来查询删除云手机任务状态 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DeleteUPhoneRequestSchema().dumps(d) + + resp = self.invoke("DeleteUPhone", d, **kwargs) + return apis.DeleteUPhoneResponseSchema().loads(resp) + + def delete_u_phone_image( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUPhoneImage - 删除自制云手机镜像。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ImageId** (str) - (Required) 云手机自定义镜像资源ID + - **ProductType** (str) - 枚举值【必填项】。表示当前操作的产品类型,目前固定值【uphone】,表示云手机场景。 + + **Response** + + - **ImageId** (str) - 云手机自定义镜像资源ID + - **Message** (str) - 返回错误消息,当 `RetCode` 非 0 时提供详细的描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DeleteUPhoneImageRequestSchema().dumps(d) + + resp = self.invoke("DeleteUPhoneImage", d, **kwargs) + return apis.DeleteUPhoneImageResponseSchema().loads(resp) + + def delete_u_phone_server( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUPhoneServer - 删除云手机服务器。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CityId** (str) - (Required) 城市Id,通过 `获取城市列表 `_ 获取 + - **ServerId** (str) - (Required) 云手机服务器的实例ID 可通过 [DescribeUPhoneServer]()获取 + - **ReleaseEIP** (bool) - 删除云手机服务器时是否释放绑定的EIP。默认为false。 + - **ReleaseUDisk** (bool) - 删除云手机服务器时是否同时删除挂载的数据盘。默认为false。 + + **Response** + + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DeleteUPhoneServerRequestSchema().dumps(d) + + resp = self.invoke("DeleteUPhoneServer", d, **kwargs) + return apis.DeleteUPhoneServerResponseSchema().loads(resp) + + def delete_u_phone_share_bandwidth( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUPhoneShareBandwidth - 删除云手机共享带宽 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ShareBandwidthId** (str) - (Required) 共享带宽ID + + **Response** + + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DeleteUPhoneShareBandwidthRequestSchema().dumps(d) + + resp = self.invoke("DeleteUPhoneShareBandwidth", d, **kwargs) + return apis.DeleteUPhoneShareBandwidthResponseSchema().loads(resp) + + def describe_u_phone( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUPhone - 获取云手机列表信息。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CityId** (str) - 城市Id,通过 `获取城市列表 `_ 获取,没有该参数表示获取所有城市 + - **IsAll** (bool) - 是否返回全部。如果有此参数,分页不生效。 + - **Limit** (int) - 返回数据长度,默认为200,最大200 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **ProductType** (str) - 枚举值。【必填项】表示当前操作的产品类型,目前固定值【uphone】,表示云手机场景。 + - **ServerId** (str) - 云手机服务器的资源ID。 + - **Tag** (str) - 要查询的业务组名称 + - **UPhoneIds** (list) - 【数组】云手机实例的资源 ID,调用方式举例:UPhoneIds.0=希望获取信息的云手机 1 的 UPhoneId,UPhoneIds.1=云手机实例 2 的 UPhoneId。如果都不传入,则返回当前 城市 所有符合条件的云手机列表。 + + **Response** + + - **Message** (str) - 返回错误消息,当 `RetCode` 非 0 时提供详细的描述信息 + - **TotalCount** (int) - UPhoneInstance总数 + - **UPhones** (list) - 见 **UPhoneInstance** 模型定义 + + **Response Model** + + **UPhoneInstance** + - **ADB** (str) - 云手机的ADB信息 + - **CPU** (float) - 虚拟CPU核数。 + - **Callback** (str) - 云手机异步任务回调 + - **ChargeType** (str) - 计费模式。枚举值为: > 年 Year,按年付费; > Month,按月付费; > Dynamic,按小时预付费; 默认为月付 + - **CityId** (str) - 城市Id,eg: cn-shanghai, cn-jinan + - **CityName** (str) - 城市名称,eg:上海二、济南市 + - **CreateTime** (int) - 创建时间,格式为Unix时间戳。 + - **DiskSize** (int) - 磁盘大小,单位: GB + - **EipId** (str) - 云手机IP地址ID + - **ExpireTime** (int) - 到期时间;格式为Unix时间戳 + - **ImageId** (str) - 云手机镜像ID,不超过32个字节。 + - **Ip** (str) - 云手机IP地址 + - **IpRegion** (str) - IP所属地域Id,eg: hk,th-bkk + - **LockBandwidth** (bool) - 是否锁定带宽,true代表锁定不可更改,false代表未锁定可以修改带宽 + - **Memory** (int) - 内存大小。单位MB + - **OsType** (str) - 云手机镜像系统,如"Android armv8" + - **Refresh** (int) - 刷新率 + - **Remark** (str) - 备注 + - **Resolution** (str) - 分辨率 + - **ServerId** (str) - 云手机所在的服务器ID,不超过32个字节。 + - **ShareBandwidthId** (str) - 所属共享带宽ID + - **ShareBandwidthName** (str) - 所属共享带宽名称 + - **SplashScreen** (str) - 云手机启动图片URL链接 + - **State** (str) - 云手机状态
* 启动中: STARTING;
* 运行中: RUNNING;
* 关机中: STOPPING;
* 关机: STOPPED
* 重启中: REBOOTING;
* 重置中: RESETTING;
* 启动失败: START_FAILED;
* 关机失败: STOP_FAILED;
* 重启失败: REBOOT_FAILED;
* 重置失败: RESET_FAILED;
* 未知状态:UNDEFINED_STATE或"" + - **Tag** (str) - 业务组名称 + - **UPhoneBandwidth** (int) - 云手机带宽,单位Kbps + - **UPhoneId** (str) - 云手机的唯一标识,不超过32个字节。 + - **UPhoneModelName** (str) - 云手机规格名称 + - **UPhoneName** (str) - 云手机的名称,不超过65个字符。 + - **UPhoneScene** (str) - 云手机场景 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUPhoneRequestSchema().dumps(d) + + resp = self.invoke("DescribeUPhone", d, **kwargs) + return apis.DescribeUPhoneResponseSchema().loads(resp) + + def describe_u_phone_app( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUPhoneApp - 获取应用列表。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **AppIds** (list) - 数组】应用的唯一标识 ID,调用方式举例:AppIds.0=希望获取应用信息的应用 1,AppIds.1=应用 2。 如果不传入,则返回当前 城市 所有符合条件的应用列表。 + - **Limit** (int) - 返回数据长度,默认为20,最大100 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + + **Response** + + - **Apps** (list) - 见 **AppInstance** 模型定义 + - **Message** (str) - 返回错误消息,当 `RetCode` 非 0 时提供详细的描述信息 + - **TotalCount** (int) - AppInstance总数 + + **Response Model** + + **AppInstance** + - **AppId** (str) - 应用的唯一标识ID + - **AppName** (str) - 应用名称。 + - **CreateTime** (int) - 创建时间,格式为Unix时间戳。 + - **Description** (str) - 应用描述。 + - **ModifyTime** (int) - 修改时间,格式为Unix时间戳。 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUPhoneAppRequestSchema().dumps(d) + + resp = self.invoke("DescribeUPhoneApp", d, **kwargs) + return apis.DescribeUPhoneAppResponseSchema().loads(resp) + + def describe_u_phone_app_version( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUPhoneAppVersion - 获取应用版本列表。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **AppId** (str) - 应用的唯一标识ID + - **AppVersionIds** (list) - 【数组】应用版本的唯一标识 ID,调用方式举例:AppVersionIds.0=希望获取应用版本信息的应用版本 1,AppVersionIds.1=应用版本 2。 如果不传入,则返回当前 城市 所有符合条件的应用版本列表。 + - **Limit** (int) - 返回数据长度,默认为20,最大100 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + - **UPhoneId** (str) - 云手机Id。此参数表示查询手机上所安装的应用版本。 + + **Response** + + - **AppVersions** (list) - 见 **AppVersionInstance** 模型定义 + - **Message** (str) - 返回错误消息,当 `RetCode` 非 0 时提供详细的描述信息 + - **TotalCount** (int) - AppVersionInstance总数 + + **Response Model** + + **AppVersionInstance** + - **AppId** (str) - 应用的唯一标识ID + - **AppVersionId** (str) - 应用版本的唯一标识ID + - **AppVersionName** (str) - 应用版本名。 + - **CreateTime** (int) - 创建时间,格式为Unix时间戳。 + - **Description** (str) - 应用版本描述。 + - **ModifyTime** (int) - 修改时间,格式为Unix时间戳。 + - **PackageName** (str) - 应用包名。 + - **URL** (str) - 应用版本相关的Apk文件存放的公网URL地址。 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUPhoneAppVersionRequestSchema().dumps(d) + + resp = self.invoke("DescribeUPhoneAppVersion", d, **kwargs) + return apis.DescribeUPhoneAppVersionResponseSchema().loads(resp) + + def describe_u_phone_cities( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUPhoneCities - 获取云手机提供服务的城市列表 + + **Request** + + - **ProjectId** (str) - (Config) + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + + **Response** + + - **UPhoneCities** (list) - 见 **CityInstance** 模型定义 + + **Response Model** + + **CityInstance** + - **CityAlias** (str) - 城市别名。如cn-sh2 + - **CityId** (str) - 城市Id,eg: cn-shanghai, cn-jinan + - **CityName** (str) - 城市名称,eg:上海二、济南市 + - **CityType** (str) - 城市类型。枚举值:
* CENTER,中心城市
* EDGE,边缘计算城市 + - **IsSoldOut** (bool) - 表示该城市资源是否售罄 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUPhoneCitiesRequestSchema().dumps(d) + + resp = self.invoke("DescribeUPhoneCities", d, **kwargs) + return apis.DescribeUPhoneCitiesResponseSchema().loads(resp) + + def describe_u_phone_detail_by_app( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUPhoneDetailByApp - 根据AppId,查询安装该应用的云手机以及相关的应用版本信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **AppId** (str) - (Required) 应用的唯一标识ID + - **CityId** (str) - 城市Id,通过 `获取城市列表 `_ 获取 + - **Limit** (int) - 返回数据长度,默认为20,最大100 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + + **Response** + + - **Message** (str) - 返回错误消息,当 `RetCode` 非 0 时提供详细的描述信息 + - **TotalCount** (int) - UPhoneWithAppVersion总数 + - **UPhoneDetails** (list) - 见 **UPhoneDetailInstance** 模型定义 + + **Response Model** + + **UPhoneDetailInstance** + - **AppVersion** (dict) - 见 **AppVersionInstance** 模型定义 + - **CPU** (int) - 虚拟CPU核数。 + - **CityId** (str) - 城市Id,eg: cn-shanghai, cn-jinan + - **CityName** (str) - 城市名称,eg:上海二、济南市 + - **CreateTime** (int) - 创建时间,格式为Unix时间戳。 + - **DiskSize** (int) - 磁盘大小,单位: GB + - **ImageId** (str) - 云手机镜像ID,不超过32个字节。 + - **Memory** (int) - 内存大小。单位MB + - **OsType** (str) - 云手机镜像系统,如"Android armv8" + - **Refresh** (int) - 刷新率 + - **Remark** (str) - 备注 + - **Resolution** (str) - 分辨率 + - **ServerId** (str) - 云手机所在的服务器ID,不超过32个字节。 + - **State** (str) - 云手机状态
* 启动中: STARTING;
* 运行中: RUNNING;
* 关机中: STOPPING;
* 关机: STOPPED
* 重启中: REBOOTING;
* 重置中: RESETTING;
* 启动失败: START_FAILED;
* 关机失败: STOP_FAILED;
* 重启失败: REBOOT_FAILED;
* 重置失败: RESET_FAILED;
* 未知状态:UNDEFINED或"" + - **UPhoneId** (str) - 云手机的唯一标识,不超过32个字节。 + - **UPhoneModelName** (str) - 云手机规格名称 + - **UPhoneName** (str) - 云手机的名称,不超过65个字符。 + + + **AppVersionInstance** + - **AppId** (str) - 应用的唯一标识ID + - **AppVersionId** (str) - 应用版本的唯一标识ID + - **AppVersionName** (str) - 应用版本名。 + - **CreateTime** (int) - 创建时间,格式为Unix时间戳。 + - **Description** (str) - 应用版本描述。 + - **ModifyTime** (int) - 修改时间,格式为Unix时间戳。 + - **PackageName** (str) - 应用包名。 + - **URL** (str) - 应用版本相关的Apk文件存放的公网URL地址。 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUPhoneDetailByAppRequestSchema().dumps(d) + + resp = self.invoke("DescribeUPhoneDetailByApp", d, **kwargs) + return apis.DescribeUPhoneDetailByAppResponseSchema().loads(resp) + + def describe_u_phone_eip_list( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUPhoneEipList - 获取云手机Eip列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) Eip所属区域,没有该参数表示获取所有区域 + - **Proportion** (str) - 云手机与Eip绑定比例,没有该参数表示获取所有绑定比例 + + **Response** + + - **EipInfos** (list) - 见 **EipInfo** 模型定义 + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息 + - **TotalCount** (int) - Eip信息数量 + + **Response Model** + + **EipInfo** + - **BindCount** (int) - 当前绑定云手机数量 + - **ChargeType** (str) - 计费模式。枚举值为: > 年 Year,按年付费; > Month,按月付费; > Dynamic,按小时预付费; 默认为月付 + - **CreateTime** (int) - 创建时间;格式为Unix时间戳 + - **EipId** (str) - Eip资源ID + - **EipIp** (str) - Eip地址 + - **ExpireTime** (int) - 到期时间;格式为Unix时间戳 + - **Name** (str) - Eip名称 + - **Proportion** (int) - 云手机与Eip绑定比例 + - **Region** (str) - Eip所属区域 + - **RemainCount** (int) - 剩余可绑定手机数量 + - **Remark** (str) - Eip备注 + - **UPhoneIds** (list) - 绑定的云手机ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUPhoneEipListRequestSchema().dumps(d) + + resp = self.invoke("DescribeUPhoneEipList", d, **kwargs) + return apis.DescribeUPhoneEipListResponseSchema().loads(resp) + + def describe_u_phone_image( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUPhoneImage - 获取云手机镜像信息列表。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ImageIds** (list) - 【数组】云手机镜像资源 ID,调用方式举例:ImageIds.0=希望获取信息的云手机镜像 1,ImageIds.1=云手机镜像 2。 如果不传入,则返回当前 城市 所有符合条件的云手机镜像。 + - **Limit** (str) - 最大返回镜像数量,默认为20,最大100 + - **Offset** (str) - 列表起始位置偏移量,默认为0 + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + - **Type** (str) - 希望获取的镜像类型,枚举值,不传则返回全部类型的镜像:
>标准镜像: BASE;
>自制镜像: CUSTOM;
+ + **Response** + + - **Images** (list) - 见 **UPhoneImageInstance** 模型定义 + - **Message** (str) - 返回错误消息,当 `RetCode` 非 0 时提供详细的描述信息 + - **TotalCount** (int) - UPhoneImageInstance总数 + + **Response Model** + + **UPhoneImageInstance** + - **AppVersions** (list) - 见 **AppVersionInstance** 模型定义 + - **CreateTime** (int) - 创建时间,格式为Unix时间戳。 + - **Description** (str) - 云手机镜像描述信息 + - **ImageId** (str) - 云手机镜像资源Id + - **ImageName** (str) - 云手机镜像名称 + - **ImageState** (str) - 云手机镜像状态
* 制作中: 制作中;
* 可用的: CREATING;
* 制作失败: CREATE_FAILED;
* 上传中: UPLOADING
* 上传失败: UPLOAD_FAILED;
* 未知状态:UNDEFINED或"" + - **ImageType** (str) - 云手机镜像类型,枚举值:
> 用户自制镜像: CUSTOM;
> 标准镜像: BASE;; + - **ModifyTime** (int) - 修改时间,格式为Unix时间戳。 + - **OsType** (str) - 云手机镜像系统 + - **UPhoneId** (str) - 云手机镜像创建时所属云手机资源 Id + + + **AppVersionInstance** + - **AppId** (str) - 应用的唯一标识ID + - **AppVersionId** (str) - 应用版本的唯一标识ID + - **AppVersionName** (str) - 应用版本名。 + - **CreateTime** (int) - 创建时间,格式为Unix时间戳。 + - **Description** (str) - 应用版本描述。 + - **ModifyTime** (int) - 修改时间,格式为Unix时间戳。 + - **PackageName** (str) - 应用包名。 + - **URL** (str) - 应用版本相关的Apk文件存放的公网URL地址。 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUPhoneImageRequestSchema().dumps(d) + + resp = self.invoke("DescribeUPhoneImage", d, **kwargs) + return apis.DescribeUPhoneImageResponseSchema().loads(resp) + + def describe_u_phone_ip_regions( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUPhoneIpRegions - 获取云手机所在城市支持绑定独立IP的地域列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CityId** (str) - (Required) 城市Id,通过 `获取城市列表 `_ 获取;新增一个oversea虚拟城市,用来获取所有支持的海外独立IP地域 + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + + **Response** + + - **Regions** (list) - 见 **IpRegion** 模型定义 + - **TotalCount** (int) - 总数量 + + **Response Model** + + **IpRegion** + - **Id** (str) - 已开通地域。参见 `地域和可用区列表 `_ + - **StockStatus** (str) - 库存状态。枚举值:有库存:Available;无库存:SoldOut + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUPhoneIpRegionsRequestSchema().dumps(d) + + resp = self.invoke("DescribeUPhoneIpRegions", d, **kwargs) + return apis.DescribeUPhoneIpRegionsResponseSchema().loads(resp) + + def describe_u_phone_job( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUPhoneJob - 查询Job的执行状态。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CityId** (str) - 城市Id,通过 `获取城市列表 `_ 获取 + - **JobIds** (list) - 【数组】Job 的唯一标识 Id,调用方式举例:JobIds.0=希望查询状态的 Job1,JobIds.1=Job2。 如果不传入,则返回当前 城市 所有符合条件的 Job 。 + - **Limit** (int) - 返回数据长度,默认为20,最大100 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **ProductType** (str) - 枚举值。表示当前操作的产品类型,目前固定值【uphone】,表示云手机场景。 + - **State** (str) - Job状态,枚举值:* 等待状态: PENDING;* 运行状态: RUNNING;* 成功状态: SUCCESS* 失败状态: FAILED* 部分成功状态:PARTIAL_SUCCESS + - **Types** (list) - 【数组】Job 类型,调用方式举例:JobTypes.0=希望查询的 Job 类型 1,JobTypes.1=Job 类型 2。 如果不传入,则返回当前 城市 所有符合条件的 Job 类型。Job 类型仅支持 INSTALL_APP、UNINSTALL_APP、RUN_ASYNC_COMMAND、CREATE_SERVER_AND_UPHONE、SET_UPHONE_GPS、SET_UPHONE_CONFIG、UPLOAD_FILE、DELETE_UPHONE + + **Response** + + - **Jobs** (list) - 见 **Job** 模型定义 + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息 + - **TotalCount** (int) - Job总数 + + **Response Model** + + **Job** + - **AppVersionId** (str) - 安装/卸载Job相关的应用版本唯一标识 + - **BeginTime** (int) - Job处理开始时间,格式为Unix时间戳。 + - **CreateTime** (int) - Job创建时间,格式为Unix时间戳。 + - **EndTime** (int) - Job处理结束时间,格式为Unix时间戳。 + - **JobId** (str) - Job的唯一标识Id + - **JobType** (str) - Job类型,仅支持INSTALL_APP、UNINSTALL_APP、RUN_ASYNC_COMMAND。 + - **State** (str) - 任务状态* 等待中:PENDING* 运行中:RUNNING* 成功:SUCCESS* 部分成功:PARTIAL_SUCCESS* 失败:FAILED + - **Tasks** (list) - 见 **Task** 模型定义 + - **UPhoneIds** (list) - 此Job相关的云手机唯一标识 + + + **Task** + - **AppVersionId** (str) - 安装/卸载任务相关的应用版本唯一标识ID + - **BeginTime** (int) - 任务处理开始时间,格式为Unix时间戳。 + - **EndTime** (int) - 任务处理结束时间,格式为Unix时间戳。 + - **ErrorMsg** (str) - Task错误信息 + - **ExecuteMsg** (str) - 异步任务执行结果 + - **State** (str) - 任务状态* 等待中:PENDING* 运行中:RUNNING* 成功:SUCCESS* 失败:FAILED + - **TaskId** (str) - Task的唯一标识 + - **UPhoneId** (str) - 云手机的唯一标识,云手机相关任务包含此字段。 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUPhoneJobRequestSchema().dumps(d) + + resp = self.invoke("DescribeUPhoneJob", d, **kwargs) + return apis.DescribeUPhoneJobResponseSchema().loads(resp) + + def describe_u_phone_model( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUPhoneModel - 获取云手机规格列表。两种类型:uphone代表单云手机场景、uphone-server代表云手机服务器场景。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Limit** (int) - 返回数据长度,默认为20,最大100 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **ProductType** (str) - 枚举值。表示当前操作的产品类型,目前固定值【uphone】,表示云手机场景。 + - **Scene** (str) - 使用场景:海外(OVERSEA),境内(INLAND) + - **UPhoneModelNames** (list) - 【数组】要获得信息的 UPhoneModel 名称。调用方式举例:UPhoneModelNames.0=希望获取信息的 UPhoneModel1,UPhoneModelNames.1=UPhoneModel2。 如果不传入,则返回当前 城市 所有符合条件的 UPhoneModel。 + + **Response** + + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息 + - **TotalCount** (int) - UPhoneModelInstance总数 + - **UPhoneModels** (list) - 见 **UPhoneModelInstance** 模型定义 + + **Response Model** + + **UPhoneModelInstance** + - **CPU** (int) - 虚拟CPU核数。 + - **Description** (str) - 型号描述信息 + - **DiskSize** (int) - 磁盘大小,单位: GB + - **Dpi** (int) - DPI + - **Memory** (int) - 内存大小。单位MB + - **Refresh** (int) - 刷新率 + - **Resolution** (str) - 分辨率 + - **UPhoneModelName** (str) - UPhoneModel名称 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUPhoneModelRequestSchema().dumps(d) + + resp = self.invoke("DescribeUPhoneModel", d, **kwargs) + return apis.DescribeUPhoneModelResponseSchema().loads(resp) + + def describe_u_phone_server( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUPhoneServer - 获取云手机服务器列表信息。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CityId** (str) - (Required) 城市Id,通过 `获取城市列表 `_ 获取 + - **Limit** (int) - 返回数据长度,默认为20,最大100 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **ServerIds** (list) - 【数组】云手机服务器的资源 ID,调用方式举例:ServerIds.0=希望获取信息的服务器 1,ServerIds.1=服务器 2。 如果不传入,则返回当前 城市 所有符合条件的云手机服务器。 + + **Response** + + - **Message** (str) - 返回错误消息,当 `RetCode` 非 0 时提供详细的描述信息 + - **Servers** (list) - 见 **ServerInstance** 模型定义 + - **TotalCount** (int) - ServerInstance总数 + + **Response Model** + + **ServerInstance** + - **ChargeType** (str) - 计费模式。枚举值为:
*Year,按年付费;
* Month,按月付费;
默认为月付 + - **CityId** (str) - 城市Id,eg: cn-shanghai, cn-jinan + - **CityName** (str) - 城市名称,eg:上海二、济南市 + - **CreateTime** (int) - 创建时间,格式为Unix时间戳。 + - **ExpireTime** (int) - 到期时间,格式为Unix时间戳。 + - **IpSet** (list) - 见 **IpSet** 模型定义 + - **ModifyTime** (int) - 修改时间,格式为Unix时间戳。 + - **Remark** (str) - 云服务器备注。 + - **ServerId** (str) - 云手机服务器的唯一标识。 + - **ServerModel** (dict) - 见 **ServerModelInstance** 模型定义 + - **ServerName** (str) - 云手机服务器名称。 + - **State** (str) - 实例状态,枚举值: * 初始化: Initializing; * 云手机创建中: UPhoneCreating;* 运行中: Running; * 删除中: Deleting; * 创建失败: CreateFailed * 未知(空字符串,获取状态超时或出错):"" + - **UPhoneCount** (int) - 云手机开数。 + - **UPhoneModelName** (str) - 云手机规格名称。 + + + **IpSet** + - **Ip** (str) - IP地址 + - **IpMode** (str) - ipv4或者ipv6 + - **IpType** (str) - 共有或私有 + - **Isp** (str) - 运营商 + + + **ServerModelInstance** + - **CPU** (int) - 虚拟CPU核数。可选参数:1-64(具体机型与CPU的对应关系参照控制台)。 + - **DiskSet** (list) - 见 **ServerDiskSet** 模型定义 + - **GPU** (int) - GPU个数 + - **GPUType** (str) - GPU类型 + - **Memory** (int) - 内存大小。单位:MB。 + - **ServerModelName** (str) - ServerModel名称 + - **ServerModelState** (str) - 表示该机型是否上线,用于前端判断是否开放给用户。枚举值:>AVAILABLE,开放>UNAVAILABLE, 不开放 + - **UPhoneSpecs** (list) - 见 **UPhoneSpec** 模型定义 + + + **ServerDiskSet** + - **DiskType** (str) - 磁盘类型。请参考磁盘类型。 + - **IsBoot** (bool) - 是否是系统盘。枚举值:> True,是系统盘> False,是数据盘(默认)。Disks数组中有且只能有一块盘是系统盘。 + - **Size** (int) - 磁盘大小,单位: GB + + + **UPhoneSpec** + - **UPhoneCount** (int) - 手机开数,即该服务器规格能生成对应手机规格的云手机个数 + - **UPhoneModelName** (str) - 手机规格名 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUPhoneServerRequestSchema().dumps(d) + + resp = self.invoke("DescribeUPhoneServer", d, **kwargs) + return apis.DescribeUPhoneServerResponseSchema().loads(resp) + + def describe_u_phone_server_model( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUPhoneServerModel - 获取ServerModel列表。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CityId** (str) - (Required) 城市Id,通过 `获取城市列表 `_ 获取 + - **Limit** (int) - 返回数据长度,默认为20,最大100 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **ServerModelNames** (list) - 【数组】要获得信息的 ServerModel 名称。调用方式举例:ServerModelNames.0=希望获取信息的 ServerModel1,ServerModelNames.1=ServerModel2。 如果不传入,则返回当前 城市 所有符合条件的 ServerModel。 + + **Response** + + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息 + - **ServerModels** (list) - 见 **ServerModelInstance** 模型定义 + - **Stock** (list) - 见 **StockInfo** 模型定义 + - **TotalCount** (int) - ServerModelInstance总数 + + **Response Model** + + **ServerModelInstance** + - **CPU** (int) - 虚拟CPU核数。可选参数:1-64(具体机型与CPU的对应关系参照控制台)。 + - **DiskSet** (list) - 见 **ServerDiskSet** 模型定义 + - **GPU** (int) - GPU个数 + - **GPUType** (str) - GPU类型 + - **Memory** (int) - 内存大小。单位:MB。 + - **ServerModelName** (str) - ServerModel名称 + - **ServerModelState** (str) - 表示该机型是否上线,用于前端判断是否开放给用户。枚举值:>AVAILABLE,开放>UNAVAILABLE, 不开放 + - **UPhoneSpecs** (list) - 见 **UPhoneSpec** 模型定义 + + + **ServerDiskSet** + - **DiskType** (str) - 磁盘类型。请参考磁盘类型。 + - **IsBoot** (bool) - 是否是系统盘。枚举值:> True,是系统盘> False,是数据盘(默认)。Disks数组中有且只能有一块盘是系统盘。 + - **Size** (int) - 磁盘大小,单位: GB + + + **UPhoneSpec** + - **UPhoneCount** (int) - 手机开数,即该服务器规格能生成对应手机规格的云手机个数 + - **UPhoneModelName** (str) - 手机规格名 + + + **StockInfo** + - **ModelName** (str) - ServerModel名称 + - **StockCount** (int) - 资源余量 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeUPhoneServerModelRequestSchema().dumps(d) + + resp = self.invoke("DescribeUPhoneServerModel", d, **kwargs) + return apis.DescribeUPhoneServerModelResponseSchema().loads(resp) + + def describe_u_phone_share_bandwidth( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUPhoneShareBandwidth - 获取共享带宽列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 绑定的目的地域。参见 `地域和可用区列表 `_ ;不传代表获取所有区域 + - **ShareBandwidthId** (str) - 共享带宽ID,不传表示获取所有共享带宽信息 + + **Response** + + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息 + - **ShareBandwidth** (list) - 见 **ShareBandwidthInfo** 模型定义 + - **TotalCount** (int) - 共享带宽总数量 + + **Response Model** + + **ShareBandwidthInfo** + - **Bandwidth** (int) - 带宽大小,单位M + - **BindCount** (int) - 当前绑定手机数量 + - **ChargeType** (str) - 计费模式。枚举值为: > 年 Year,按年付费; > Month,按月付费; > Dynamic,按小时预付费; 默认为月付 + - **CreateTime** (int) - 创建时间;格式为Unix时间戳 + - **ExpireTime** (int) - 到期时间;格式为Unix时间戳 + - **Id** (str) - 共享带宽ID + - **IpCount** (int) - 当前绑定IP数量 + - **IpProportion** (int) - 云手机IP绑定比例 + - **Name** (str) - 共享带宽名称 + - **Region** (str) - 绑定的目的地域。参见 `地域和可用区列表 `_ + - **RemainCount** (int) - 剩余可绑定手机数量 + - **Remark** (str) - 备注 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUPhoneShareBandwidthRequestSchema().dumps(d) + + resp = self.invoke("DescribeUPhoneShareBandwidth", d, **kwargs) + return apis.DescribeUPhoneShareBandwidthResponseSchema().loads(resp) + + def get_u_phone_allowance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUPhoneAllowance - 获取云手机创建余量 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CityId** (str) - (Required) 城市Id,通过 `获取城市列表 `_ 获取 + + **Response** + + - **UPhoneAllowance** (list) - 见 **UPhoneAllowance** 模型定义 + + **Response Model** + + **UPhoneAllowance** + - **Allowance** (int) - 可创建云手机个数 + - **ModelName** (str) - 枚举值,云手机型号名称,取值:UPhone X,UPhone Plus,UPhone Pro + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUPhoneAllowanceRequestSchema().dumps(d) + + resp = self.invoke("GetUPhoneAllowance", d, **kwargs) + return apis.GetUPhoneAllowanceResponseSchema().loads(resp) + + def get_u_phone_bandwidth_upgrade_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUPhoneBandwidthUpgradePrice - 获取云手机带宽升降级价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Bandwidth** (int) - (Required) 带宽大小,单位Kbps,必须是100的整数倍 + - **ProductType** (str) - (Required) 枚举值。表示当前操作的产品类型,目前固定值【uphone】,表示云手机场景。 + - **UPhoneId** (str) - (Required) 云手机ID + + **Response** + + - **ListPrice** (float) - 产品列表价 + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息 + - **OriginalPrice** (float) - 限时优惠的折前原价(即列表价乘以商务折扣后的单价) + - **Price** (float) - 规格调整差价。单位: 元,保留小数点后两位有效数字 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUPhoneBandwidthUpgradePriceRequestSchema().dumps(d) + + resp = self.invoke("GetUPhoneBandwidthUpgradePrice", d, **kwargs) + return apis.GetUPhoneBandwidthUpgradePriceResponseSchema().loads(resp) + + def get_u_phone_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUPhonePrice - 根据云手机规格名称,获取UPhone实例的价格。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CityId** (str) - (Required) 城市Id,通过 `获取城市列表 `_ 获取 + - **BandwidthLine** (int) - 购买独立IP并且使用全局共享带宽时需要此参数,带宽线路数量,与云手机数量一致 + - **ChargeType** (str) - 计费模式。枚举值为: > Year,按年付费; > Month,按月付费;> Day,按天付费; > Dynamic,按小时预付费; 如果不传某个枚举值,默认返回年付、月付的价格组合集。 + - **INetBandwidth** (int) - 购买独立IP需要此参数,其中一个ip的带宽值。 + - **IpCount** (int) - 购买独立IP需要此参数。需要的eip数量。 + - **IpDestRegion** (str) - 购买独立IP必须此参数。绑定的目的地域。参见 `地域和可用区列表 `_ + - **Quantity** (int) - 购买时长。默认: 1。 月付时,此参数传0,代表了购买至月末。 + - **UPhoneBandwidth** (int) - 单个云手机带宽大小,单位Kbps,仅在UseKbps为true时生效 + - **UPhoneCount** (int) - 云手机个数 + - **UPhoneModelName** (int) - 云手机规格名称 + - **UseGlobalBws** (bool) - 使用全局共享带宽 + - **UseKbps** (bool) - 使用Kbps单位带宽,仅在使用全局共享带宽时生效,值为true时BandwidthLine参数不再生效 + + **Response** + + - **PriceSet** (list) - 见 **UPhonePriceSet** 模型定义 + + **Response Model** + + **UPhonePriceSet** + - **ChargeType** (str) - 计费类型,枚举值:Year,Month,Dynamic + - **ListPrice** (float) - 产品列表价 + - **OriginalPrice** (float) - 限时优惠的折前原价(即列表价乘以商务折扣后的单价) + - **Price** (float) - 价格,单位: 元,保留小数点后两位有效数字 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUPhonePriceRequestSchema().dumps(d) + + resp = self.invoke("GetUPhonePrice", d, **kwargs) + return apis.GetUPhonePriceResponseSchema().loads(resp) + + def get_u_phone_renew_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUPhoneRenewPrice - 获取云手机续费价格,不包括独立ip价格。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **UPhoneId** (str) - (Required) 云手机的唯一标识,可通过[查询云手机列表]获取。 + - **ChargeType** (str) - 计费模式。枚举值为: > Year,按年付费; > Month,按月付费; > Dynamic,按小时预付费; 默认返回全部计费方式对应的价格 + - **CityId** (str) - 城市Id,通过 `获取城市列表 `_ 获取 + + **Response** + + - **PriceSet** (list) - 见 **UPhonePriceSet** 模型定义 + + **Response Model** + + **UPhonePriceSet** + - **ChargeType** (str) - 计费类型,枚举值:Year,Month,Dynamic + - **ListPrice** (float) - 产品列表价 + - **OriginalPrice** (float) - 限时优惠的折前原价(即列表价乘以商务折扣后的单价) + - **Price** (float) - 价格,单位: 元,保留小数点后两位有效数字 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUPhoneRenewPriceRequestSchema().dumps(d) + + resp = self.invoke("GetUPhoneRenewPrice", d, **kwargs) + return apis.GetUPhoneRenewPriceResponseSchema().loads(resp) + + def get_u_phone_screen_capture( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUPhoneScreenCapture - 云手机截屏 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **UPhoneID** (str) - (Required) 云手机ID + - **CityId** (str) - 城市Id,通过 `获取城市列表 `_ 获取 + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + + **Response** + + - **URL** (str) - 云手机截图URL + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUPhoneScreenCaptureRequestSchema().dumps(d) + + resp = self.invoke("GetUPhoneScreenCapture", d, **kwargs) + return apis.GetUPhoneScreenCaptureResponseSchema().loads(resp) + + def get_u_phone_server_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUPhoneServerPrice - 根据服务器规格名称,获取UPhoneServer实例的价格。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CityId** (str) - (Required) 城市Id,通过 `获取城市列表 `_ 获取 + - **ServerModelName** (str) - (Required) 服务器规格名称 + - **Bandwidth** (int) - 购买独立IP需要此参数。共享带宽总值。 + - **ChargeType** (str) - 计费模式。枚举值为:> Year,按年付费;> Month,按月付费;> Dynamic,按小时预付费; 如果不传某个枚举值,默认返回年付、月付的价格组合集。 + - **IpCount** (int) - 购买独立IP需要此参数。需要的eip数量。 + - **IpDestRegion** (str) - 购买独立IP必须此参数。绑定的目的地域。参见 `地域和可用区列表 `_ + - **Quantity** (int) - 购买时长。默认: 1。 月付时,此参数传0,代表了购买至月末。 + + **Response** + + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息 + - **PriceSet** (list) - 见 **UPhoneServerPriceSet** 模型定义 + + **Response Model** + + **UPhoneServerPriceSet** + - **ChargeType** (str) - 计费类型,枚举值:Year,Month, Dynamic + - **ListPrice** (float) - 产品列表价 + - **OriginalPrice** (float) - 限时优惠的折前原价(即列表价乘以商务折扣后的单价) + - **Price** (float) - 价格,单位: 元,保留小数点后两位有效数字 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUPhoneServerPriceRequestSchema().dumps(d) + + resp = self.invoke("GetUPhoneServerPrice", d, **kwargs) + return apis.GetUPhoneServerPriceResponseSchema().loads(resp) + + def get_u_phone_server_renew_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUPhoneServerRenewPrice - 获取云手机服务器续费价格提示信息: 须按照控制台服务器模型配置创建服务器。详情请参考控制台。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CityId** (str) - (Required) 城市Id,通过 `获取城市列表 `_ 获取 + - **ServerId** (str) - (Required) 云手机服务器的唯一标识,可通过[查询云手机服务器列表]()获取。 + - **ChargeType** (str) - 计费模式。枚举值为:> Year,按年付费;> Month,按月付费; > Dynamic,按小时预付费; 默认返回全部计费方式对应的价格 + + **Response** + + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息 + - **PriceSet** (list) - 见 **UPhoneServerPriceSet** 模型定义 + + **Response Model** + + **UPhoneServerPriceSet** + - **ChargeType** (str) - 计费类型,枚举值:Year,Month, Dynamic + - **ListPrice** (float) - 产品列表价 + - **OriginalPrice** (float) - 限时优惠的折前原价(即列表价乘以商务折扣后的单价) + - **Price** (float) - 价格,单位: 元,保留小数点后两位有效数字 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUPhoneServerRenewPriceRequestSchema().dumps(d) + + resp = self.invoke("GetUPhoneServerRenewPrice", d, **kwargs) + return apis.GetUPhoneServerRenewPriceResponseSchema().loads(resp) + + def get_u_phone_share_bandwidth_upgrade_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUPhoneShareBandwidthUpgradePrice - 获取云手机共享带宽升降级价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Bandwidth** (int) - (Required) 需要升降级的带宽,默认是当前带宽大小 + - **ShareBandwidthId** (str) - (Required) 共享带宽的ID + + **Response** + + - **ListPrice** (float) - 产品列表价 + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息 + - **OriginalPrice** (float) - 限时优惠的折前原价(即列表价乘以商务折扣后的单价) + - **Price** (float) - 规格调整差价。单位: 元,保留小数点后两位有效数字 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUPhoneShareBandwidthUpgradePriceRequestSchema().dumps(d) + + resp = self.invoke("GetUPhoneShareBandwidthUpgradePrice", d, **kwargs) + return apis.GetUPhoneShareBandwidthUpgradePriceResponseSchema().loads( + resp + ) + + def import_file(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """ImportFile - 上传文件到云手机目录/sdcard/Download/并自动安装APK文件 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **FileName** (str) - (Required) 文件名 + - **UPhoneIds** (list) - (Required) 云手机ID + - **URL** (str) - (Required) 文件下载链接 + - **ABI** (str) - 上传文件为apk时,可强制指定32位还是64位运行。armeabi-v7a(32位);不填为系统默认值(64位) + - **CityId** (str) - 城市。 参见 `云手机城市列表 `_ + - **ProductType** (str) - 枚举值。表示当前操作的产品类型,目前固定值【uphone】,表示云手机场景。 + + **Response** + + - **JobId** (str) - 请求的唯一标识Id,`RetCode`为0时返回,可根据此ID查询请求的执行状态 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ImportFileRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("ImportFile", d, **kwargs) + return apis.ImportFileResponseSchema().loads(resp) + + def install_u_phone_app_version( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """InstallUPhoneAppVersion - 在云手机中安装应用版本相关的Apk文件。系统会根据AppVersionId将对应的Apk文件下载后安装到云手机中。一次只支持安装一个Apk。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **AppVersionId** (str) - (Required) 应用版本的唯一标识ID + - **UPhoneIds** (list) - (Required) 【数组】云手机实例的资源 ID,调用方式举例:UPhoneIds.0=希望安装应用的云手机实例 1 的 UPhoneId,UPhoneIds.1=云手机实例 2 的 UPhoneId。 + - **CityId** (str) - 城市Id,通过 `获取城市列表 `_ 获取 + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + + **Response** + + - **JobId** (str) - 请求的唯一标识Id,`RetCode`为0时返回,可根据此ID查询请求的执行状态 + - **Message** (str) - 返回错误消息,当 `RetCode` 非 0 时提供详细的描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.InstallUPhoneAppVersionRequestSchema().dumps(d) + + resp = self.invoke("InstallUPhoneAppVersion", d, **kwargs) + return apis.InstallUPhoneAppVersionResponseSchema().loads(resp) + + def modify_u_phone_bandwidth( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUPhoneBandwidth - 修改云手机带宽 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Bandwidth** (int) - (Required) 带宽大小,单位Kbps,必须是100的整数倍 + - **ProductType** (str) - (Required) 枚举值。表示当前操作的产品类型,目前固定值【uphone】,表示云手机场景。 + - **UPhoneId** (str) - (Required) 云手机ID + + **Response** + + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyUPhoneBandwidthRequestSchema().dumps(d) + + resp = self.invoke("ModifyUPhoneBandwidth", d, **kwargs) + return apis.ModifyUPhoneBandwidthResponseSchema().loads(resp) + + def modify_u_phone_name( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUPhoneName - 修改指定云手机实例名称。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Name** (str) - (Required) 云手机实例名称 + - **UPhoneId** (str) - (Required) 云手机实例的资源ID + - **CityId** (str) - 城市Id,通过 `获取城市列表 `_ 获取 + + **Response** + + - **Message** (str) - 返回错误消息,当 `RetCode` 非 0 时提供详细的描述信息 + - **UPhoneId** (str) - 云手机实例的资源ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyUPhoneNameRequestSchema().dumps(d) + + resp = self.invoke("ModifyUPhoneName", d, **kwargs) + return apis.ModifyUPhoneNameResponseSchema().loads(resp) + + def modify_u_phone_remark( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUPhoneRemark - 修改指定云手机实例备注信息。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **UPhoneId** (str) - (Required) 云手机实例的资源ID + - **CityId** (str) - 城市Id,通过 `获取城市列表 `_ 获取 + - **Remark** (str) - 备注 + + **Response** + + - **Message** (str) - 返回错误消息,当 `RetCode` 非 0 时提供详细的描述信息 + - **UPhoneId** (str) - 云手机实例的资源ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyUPhoneRemarkRequestSchema().dumps(d) + + resp = self.invoke("ModifyUPhoneRemark", d, **kwargs) + return apis.ModifyUPhoneRemarkResponseSchema().loads(resp) + + def modify_u_phone_server_name( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUPhoneServerName - 修改指定云手机服务器实例名称。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CityId** (str) - (Required) 城市Id,通过 `获取城市列表 `_ 获取 + - **ServerId** (str) - (Required) 云手机服务器的唯一标识 + - **Name** (str) - 云手机服务器实例名称 + + **Response** + + - **Message** (str) - 返回错误消息,当 `RetCode` 非 0 时提供详细的描述信息 + - **ServerId** (str) - 云手机服务器的唯一标识 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyUPhoneServerNameRequestSchema().dumps(d) + + resp = self.invoke("ModifyUPhoneServerName", d, **kwargs) + return apis.ModifyUPhoneServerNameResponseSchema().loads(resp) + + def modify_u_phone_server_remark( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUPhoneServerRemark - 修改指定云手机实例备注信息。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CityId** (str) - (Required) 城市Id,通过 `获取城市列表 `_ 获取 + - **ServerId** (str) - (Required) 云手机服务器的唯一标识 + - **Remark** (str) - 备注 + + **Response** + + - **Message** (str) - 返回错误消息,当 `RetCode` 非 0 时提供详细的描述信息 + - **ServerId** (str) - 云手机服务器的唯一标识 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyUPhoneServerRemarkRequestSchema().dumps(d) + + resp = self.invoke("ModifyUPhoneServerRemark", d, **kwargs) + return apis.ModifyUPhoneServerRemarkResponseSchema().loads(resp) + + def modify_u_phone_share_bandwidth( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUPhoneShareBandwidth - 修改云手机共享带宽 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Bandwidth** (str) - (Required) 共享带宽大小;单位M + - **ShareBandwidthId** (str) - (Required) 共享带宽ID + + **Response** + + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyUPhoneShareBandwidthRequestSchema().dumps(d) + + resp = self.invoke("ModifyUPhoneShareBandwidth", d, **kwargs) + return apis.ModifyUPhoneShareBandwidthResponseSchema().loads(resp) + + def modify_u_phone_share_bandwidth_name( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUPhoneShareBandwidthName - 修改云手机共享带宽名称 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Name** (str) - (Required) 共享带宽名称 + - **ShareBandwidthId** (str) - (Required) 共享带宽ID + + **Response** + + - **Message** (str) - 返回错误消息,当 `RetCode` 非 0 时提供详细的描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyUPhoneShareBandwidthNameRequestSchema().dumps(d) + + resp = self.invoke("ModifyUPhoneShareBandwidthName", d, **kwargs) + return apis.ModifyUPhoneShareBandwidthNameResponseSchema().loads(resp) + + def modify_u_phone_share_bandwidth_remark( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUPhoneShareBandwidthRemark - 修改云手机共享带宽备注 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Remark** (str) - (Required) 共享带宽备注 + - **ShareBandwidthId** (str) - (Required) 共享带宽ID + + **Response** + + - **Message** (str) - 返回错误消息,当 `RetCode` 非 0 时提供详细的描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ModifyUPhoneShareBandwidthRemarkRequestSchema().dumps(d) + + resp = self.invoke("ModifyUPhoneShareBandwidthRemark", d, **kwargs) + return apis.ModifyUPhoneShareBandwidthRemarkResponseSchema().loads(resp) + + def poweroff_u_phone( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """PoweroffUPhone - 关闭处于运行状态的云手机实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **UPhoneIds** (list) - (Required) 【数组】云手机实例的资源 ID,调用方式举例:UPhoneIds.0=希望关闭的云手机实例 1 的 UPhoneId,UPhoneIds.1=云手机实例 2 的 UPhoneId。 + - **CityId** (str) - 城市Id,通过 `获取城市列表 `_ 获取 + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + + **Response** + + - **JobId** (str) - 任务ID,用来查询当前任务状态 + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.PoweroffUPhoneRequestSchema().dumps(d) + + resp = self.invoke("PoweroffUPhone", d, **kwargs) + return apis.PoweroffUPhoneResponseSchema().loads(resp) + + def poweron_u_phone( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """PoweronUPhone - 启动处于关闭状态的云手机实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **UPhoneIds** (list) - (Required) 【数组】云手机实例的资源ID,调用方式举例:UPhoneIds.0=希望开启的云手机实例1的UPhoneId,UPhoneIds.1=云手机实例2的UPhoneId。 + - **CityId** (str) - 城市Id,通过 `获取城市列表 `_ 获取 + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + + **Response** + + - **JobId** (str) - 任务ID,用来查询当前任务状态 + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.PoweronUPhoneRequestSchema().dumps(d) + + resp = self.invoke("PoweronUPhone", d, **kwargs) + return apis.PoweronUPhoneResponseSchema().loads(resp) + + def reboot_u_phone( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RebootUPhone - 重新启动云手机实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **UPhoneIds** (list) - (Required) 【数组】云手机实例的资源 ID,调用方式举例:UPhoneIds.0=希望重启的云手机实例 1 的 UPhoneId,UPhoneIds.1=云手机实例 2 的 UPhoneId。 + - **CityId** (str) - 城市Id,通过 `获取城市列表 `_ 获取 + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + + **Response** + + - **JobId** (str) - 异步请求成功后返回JobId,用以查询Job状态 + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.RebootUPhoneRequestSchema().dumps(d) + + resp = self.invoke("RebootUPhone", d, **kwargs) + return apis.RebootUPhoneResponseSchema().loads(resp) + + def renew_u_phone( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RenewUPhone - 修改UPhone的device_id、imei、meid 以及其他相关配置,达到一键新机的效果 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **UPhoneIds** (list) - (Required) 【数组】云手机实例的资源 ID,调用方式举例:UPhoneIds.0=希望重启的云手机实例 1 的 UPhoneId,UPhoneIds.1=云手机实例 2 的 UPhoneId。 + - **AndroidID** (str) - AOSP唯一标识 + - **BSSID** (str) - Wi-Fi 物理地址 + - **BaseBand** (str) - 基带版本 + - **Board** (str) - 主板名 + - **BootLoader** (str) - bootloader版本号 + - **Brand** (str) - 品牌 + - **BuildHost** (str) - 固件编译主机 + - **BuildID** (str) - build的版本号 + - **BuildTags** (str) - 系统标记 + - **BuildVersionInc** (str) - 版本增加说明 + - **CityId** (str) - 城市Id,通过 `获取城市列表 `_ 获取 + - **Customize** (bool) - 自定义设备参数设置的开关,true时会读取用户设置的下列设备参数信息;false时随机读取ucloud内置设备参数。默认false + - **Device** (str) - 设备名 + - **DisplayID** (str) - 显示的版本号 + - **FingerPrint** (str) - 系统指纹 + - **ICCID** (str) - SIM卡唯一标识 + - **IMEI** (str) - 串号 + - **IMEISV** (str) - 移动设备标识码软件 + - **IMSI** (str) - 移动识别码 + - **Manufacture** (str) - 厂商 + - **Model** (str) - 设备型号 + - **PhoneNumber** (str) - 手机号码 + - **ProductName** (str) - 产品名称 + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + - **RadioMac** (str) - 移动网络mac地址 + - **SerialNumber** (str) - 序列号 + - **WiFiName** (str) - 当前连接Wi-Fi名称 + + **Response** + + - **JobId** (str) - 任务ID,用来查询一键新机任务状态 + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.RenewUPhoneRequestSchema().dumps(d) + + resp = self.invoke("RenewUPhone", d, **kwargs) + return apis.RenewUPhoneResponseSchema().loads(resp) + + def reset_u_phone( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ResetUPhone - 将云手机恢复为创建时的状态。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **UPhoneIds** (list) - (Required) 【数组】云手机实例的资源 ID,调用方式举例:UPhoneIds.0=希望重置的云手机实例 1 的 UPhoneId,UPhoneIds.1=云手机实例 2 的 UPhoneId。 + - **CityId** (str) - 城市Id,通过 `获取城市列表 `_ 获取 + - **ImageId** (str) - 镜像ID,默认为空。不为空则手机会以填写的镜像进行重置,为空则手机会以重置前的镜像重置 + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + + **Response** + + - **JobId** (str) - 异步请求成功后返回JobId,用以查询Job状态 + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.ResetUPhoneRequestSchema().dumps(d) + + resp = self.invoke("ResetUPhone", d, **kwargs) + return apis.ResetUPhoneResponseSchema().loads(resp) + + def run_async_command( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RunAsyncCommand - 在云手机中执行异步shell命令。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Content** (str) - (Required) 待执行的命令。 + - **UPhoneIds** (list) - (Required) 【数组】云手机实例的资源 ID,调用方式举例:UPhoneIds.0=希望执行命令的云手机实例 1 的 UPhoneId,UPhoneIds.1=云手机实例 2 的 UPhoneId。 + - **CityId** (str) - 城市Id,通过 `获取城市列表 `_ 获取 + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + + **Response** + + - **JobId** (str) - 请求的唯一标识Id,`RetCode`为0时返回,可根据此ID查询请求的执行状态 + - **Message** (str) - 返回错误消息,当 `RetCode` 非 0 时提供详细的描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.RunAsyncCommandRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("RunAsyncCommand", d, **kwargs) + return apis.RunAsyncCommandResponseSchema().loads(resp) + + def run_sync_command( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RunSyncCommand - 在云手机中执行同步shell命令。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Content** (str) - (Required) 待执行的命令。 + - **UPhoneIds** (list) - (Required) 【数组】云手机实例的资源 ID,调用方式举例:UPhoneIds.0=希望执行命令的云手机实例 1 的 UPhoneId,UPhoneIds.1=云手机实例 2 的 UPhoneId。 + - **CityId** (str) - 城市Id,通过 `获取城市列表 `_ 获取 + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + + **Response** + + - **Message** (str) - 返回错误消息,当 `RetCode` 非 0 时提供详细的描述信息 + - **Results** (list) - 见 **UPhoneCommandResult** 模型定义 + + **Response Model** + + **UPhoneCommandResult** + - **ExecuteMsg** (str) - 同步shell命令的执行结果。 + - **UPhoneId** (str) - 云手机实例的资源ID。 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.RunSyncCommandRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("RunSyncCommand", d, **kwargs) + return apis.RunSyncCommandResponseSchema().loads(resp) + + def set_u_phone_callback( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """SetUPhoneCallback - 设置云手机异步操作以及状态更新回调,支持云手机重置,安装应用,卸载应用,设备占用状态回调 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **UPhoneId** (str) - (Required) 云手机ID。 + - **URL** (str) - (Required) 接收POST请求的http接口。Content-Type:application/json; charset=UTF-8,Accept:application/json。 + - **CityId** (str) - 城市ID + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.SetUPhoneCallbackRequestSchema().dumps(d) + + resp = self.invoke("SetUPhoneCallback", d, **kwargs) + return apis.SetUPhoneCallbackResponseSchema().loads(resp) + + def set_u_phone_config( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """SetUPhoneConfig - 设置云手机画面参数(分辨率、DPI、帧率、码率) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **UPhoneIds** (list) - (Required) 【数组】云手机实例的资源 ID,调用方式举例:UPhoneIds.0=云手机实例 1 的 UPhoneId,UPhoneIds.1=云手机实例 2 的 UPhoneId。 + - **Async** (str) - 异步请求开关,只有为1的时候才是异步,不填或者其他数值为同步 + - **Bitrate** (str) - 云手机画面传输码率(例,8000)取值范围[100,50000] + - **CityId** (str) - 城市Id,通过 `获取城市列表 `_ 获取 + - **Dpi** (str) - 云手机dpi,取值范围[100,1000] + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + - **Refresh** (str) - 云手机画面刷新率,即帧率(例,30)取值范围[1,200] + - **Resolution** (str) - 云手机画面分辨率(宽x高) (例,1920x1080,中间是字母x)宽和高的取值范围[100,5000] + + **Response** + + - **JobId** (str) - 异步请求成功后返回JobId,用以查询Job状态 + - **Message** (str) - 失败后返回Message,错误信息 + - **RequestId** (str) - request_uuid,唯一值,用于区分request + - **Results** (list) - 见 **Results** 模型定义 + + **Response Model** + + **Results** + - **ExecuteMsg** (str) - + - **UPhoneId** (str) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.SetUPhoneConfigRequestSchema().dumps(d) + + resp = self.invoke("SetUPhoneConfig", d, **kwargs) + return apis.SetUPhoneConfigResponseSchema().loads(resp) + + def set_u_phone_gps( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """SetUPhoneGPS - 设置云手机GPS信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CityId** (str) - 城市Id,通过 `获取城市列表 `_ 获取 + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + - **UPhoneGPSs** (list) - 见 **SetUPhoneGPSParamUPhoneGPSs** 模型定义 + + **Response** + + - **JobId** (str) - 请求的唯一标识Id,`RetCode`为0时返回,可根据此ID查询请求的执行状态 + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息 + + **Request Model** + + **SetUPhoneGPSParamUPhoneGPSs** + - **Altitude** (float) - 海拔 + - **Enabled** (bool) - GPS开关,true开启,false关闭,默认false + - **Latitude** (float) - 纬度:-90~90 + - **Longitude** (float) - 经度:-180~180 + - **UPhoneId** (str) - 云手机ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.SetUPhoneGPSRequestSchema().dumps(d) + + resp = self.invoke("SetUPhoneGPS", d, **kwargs) + return apis.SetUPhoneGPSResponseSchema().loads(resp) + + def set_u_phone_manager_mode( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """SetUPhoneManagerMode - 管理员模式支持所有按键,普通用户模式禁用返回桌面 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Mode** (str) - (Required) 管理模式:管理员admin,普通用户user + - **UPhoneId** (str) - (Required) 云手机实例的资源ID + - **CityId** (str) - 城市Id,通过 `获取城市列表 `_ 获取 + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.SetUPhoneManagerModeRequestSchema().dumps(d) + + resp = self.invoke("SetUPhoneManagerMode", d, **kwargs) + return apis.SetUPhoneManagerModeResponseSchema().loads(resp) + + def set_u_phone_root_mode( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """SetUPhoneRootMode - 设置云手机Root模式 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Root** (bool) - (Required) true则打开Root权限;false则关闭Root权限 + - **UPhoneIds** (list) - (Required) 【数组】云手机实例的资源 ID,调用方式举例:UPhoneIds.0=希望重启的云手机实例 1 的 UPhoneId,UPhoneIds.1=云手机实例 2 的 UPhoneId。 + - **CityId** (str) - 城市Id,通过 `获取城市列表 `_ 获取 + - **PkgNames** (list) - 【数组】加入应用白名单的包名 + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + + **Response** + + - **JobId** (str) - 异步请求成功后返回JobId,用以查询Job状态 + - **Message** (str) - 返回错误消息,当 RetCode 非 0 时提供详细的描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.SetUPhoneRootModeRequestSchema().dumps(d) + + resp = self.invoke("SetUPhoneRootMode", d, **kwargs) + return apis.SetUPhoneRootModeResponseSchema().loads(resp) + + def set_u_phone_splash_screen( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """SetUPhoneSplashScreen - + + **Request** + + - **ProjectId** (str) - (Config) + - **CityId** (str) - (Required) + - **UPhoneId** (str) - (Required) + - **URL** (str) - (Required) + - **ProductType** (str) - + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.SetUPhoneSplashScreenRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("SetUPhoneSplashScreen", d, **kwargs) + return apis.SetUPhoneSplashScreenResponseSchema().loads(resp) + + def set_u_phone_token( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """SetUPhoneToken - 设置云手机RTC连接Token提高安全性 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **UPhoneId** (str) - (Required) 云手机ID + - **CityId** (str) - 城市Id,通过 `获取城市列表 `_ 获取 + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + - **Token** (str) - RTC连接Token,为空表示清空Token + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.SetUPhoneTokenRequestSchema().dumps(d) + + resp = self.invoke("SetUPhoneToken", d, **kwargs) + return apis.SetUPhoneTokenResponseSchema().loads(resp) + + def switch_u_phone_independent_ip( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """SwitchUPhoneIndependentIp - 更换云手机独立IP + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **EipId** (str) - (Required) 云手机独立IP地址ID + + **Response** + + - **Message** (str) - 返回错误消息,当 `RetCode` 非 0 时提供详细的描述信息 + - **NewIp** (str) - 更换后的新IP地址 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.SwitchUPhoneIndependentIpRequestSchema().dumps(d) + + resp = self.invoke("SwitchUPhoneIndependentIp", d, **kwargs) + return apis.SwitchUPhoneIndependentIpResponseSchema().loads(resp) + + def switch_u_phone_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """SwitchUPhoneInstance - + + **Request** + + - **ProjectId** (str) - (Config) + - **CityId** (str) - (Required) + - **SwitchInfos** (list) - 见 **SwitchUPhoneInstanceParamSwitchInfos** 模型定义 + + **Response** + + - **JobId** (str) - + - **Message** (str) - + + **Request Model** + + **SwitchUPhoneInstanceParamSwitchInfos** + - **ImageId** (str) - + - **UPhoneId** (str) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.SwitchUPhoneInstanceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("SwitchUPhoneInstance", d, **kwargs) + return apis.SwitchUPhoneInstanceResponseSchema().loads(resp) + + def un_install_u_phone_app_version( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UnInstallUPhoneAppVersion - 传入应用版本Id,在云手机中根据应用版本的PackageName卸载相关应用。一次只支持卸载一个应用。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **AppVersionId** (str) - (Required) 应用版本的唯一标识ID + - **UPhoneIds** (list) - (Required) 【数组】云手机实例的资源 ID,调用方式举例:UPhoneIds.0=希望卸载应用的云手机实例 1 的 UPhoneId,UPhoneIds.1=云手机实例 2 的 UPhoneId。 + - **CityId** (str) - 城市Id,通过 `获取城市列表 `_ 获取 + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + + **Response** + + - **JobId** (str) - 请求的唯一标识Id,`RetCode`为0时返回,可根据此ID查询请求的执行状态 + - **Message** (str) - 返回错误消息,当 `RetCode` 非 0 时提供详细的描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.UnInstallUPhoneAppVersionRequestSchema().dumps(d) + + resp = self.invoke("UnInstallUPhoneAppVersion", d, **kwargs) + return apis.UnInstallUPhoneAppVersionResponseSchema().loads(resp) + + def update_u_phone_image( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateUPhoneImage - 更新云手机镜像信息。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ImageId** (str) - (Required) 云手机自定义镜像资源ID + - **Description** (str) - 镜像的描述信息。长度为2~256个英文或中文字符 + - **Name** (str) - 镜像名称。长度为2~128个英文或中文字符。 + - **ProductType** (str) - 枚举值。当前操作的产品类型,1、uphone:云手机场景;2、uphone-server:云手机服务器场景。默认云手机服务器场景。 + + **Response** + + - **ImageId** (str) - 云手机自定义镜像资源ID + - **Message** (str) - 返回错误消息,当 `RetCode` 非 0 时提供详细的描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.UpdateUPhoneImageRequestSchema().dumps(d) + + resp = self.invoke("UpdateUPhoneImage", d, **kwargs) + return apis.UpdateUPhoneImageResponseSchema().loads(resp) diff --git a/ucloud/services/uphone/schemas/__init__.py b/ucloud/services/uphone/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/uphone/schemas/apis.py b/ucloud/services/uphone/schemas/apis.py new file mode 100644 index 00000000..f4ad6549 --- /dev/null +++ b/ucloud/services/uphone/schemas/apis.py @@ -0,0 +1,1799 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.uphone.schemas import models + +""" UPhone API Schema +""" + + +""" +API: CreateUPhone + +创建云手机 +""" + + +class CreateUPhoneRequestSchema(schema.RequestSchema): + """CreateUPhone - 创建云手机""" + + fields = { + "Bandwidth": fields.Int( + required=False, dump_to="Bandwidth" + ), # Deprecated, will be removed at 1.0 + "BindIp": fields.Bool(required=False, dump_to="BindIp"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CityId": fields.Str(required=True, dump_to="CityId"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "ImageId": fields.Str(required=True, dump_to="ImageId"), + "IpDestRegion": fields.Str(required=False, dump_to="IpDestRegion"), + "IpProportion": fields.Int(required=False, dump_to="IpProportion"), + "MediaBandwidth": fields.Int( + required=False, dump_to="MediaBandwidth" + ), # Deprecated, will be removed at 1.0 + "Name": fields.Str(required=True, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Str(required=False, dump_to="Quantity"), + "ShareBandwidthId": fields.Str( + required=False, dump_to="ShareBandwidthId" + ), + "ShareBandwidthName": fields.Str( + required=False, dump_to="ShareBandwidthName" + ), + "Tag": fields.Str(required=False, dump_to="Tag"), + "UPhoneBandwidth": fields.Int( + required=False, dump_to="UPhoneBandwidth" + ), + "UPhoneCount": fields.Int(required=True, dump_to="UPhoneCount"), + "UPhoneModelName": fields.Str(required=True, dump_to="UPhoneModelName"), + "UseGlobalBws": fields.Bool(required=False, dump_to="UseGlobalBws"), + "UseKbps": fields.Bool(required=False, dump_to="UseKbps"), + } + + +class CreateUPhoneResponseSchema(schema.ResponseSchema): + """CreateUPhone - 创建云手机""" + + fields = { + "JobId": fields.Str(required=True, load_from="JobId"), + "Message": fields.Str(required=False, load_from="Message"), + "UPhoneIds": fields.List( + fields.Str(), required=False, load_from="UPhoneIds" + ), + } + + +""" +API: CreateUPhoneApp + +一个 app 对应多个 app_version。 +""" + + +class CreateUPhoneAppRequestSchema(schema.RequestSchema): + """CreateUPhoneApp - 一个 app 对应多个 app_version。""" + + fields = { + "Description": fields.Str(required=False, dump_to="Description"), + "Name": fields.Str(required=True, dump_to="Name"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class CreateUPhoneAppResponseSchema(schema.ResponseSchema): + """CreateUPhoneApp - 一个 app 对应多个 app_version。""" + + fields = { + "AppId": fields.Str(required=True, load_from="AppId"), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: CreateUPhoneAppVersion + +创建云手机应用版本。 +注:一个 app 对应多个 app_version。 +""" + + +class CreateUPhoneAppVersionRequestSchema(schema.RequestSchema): + """CreateUPhoneAppVersion - 创建云手机应用版本。 + 注:一个 app 对应多个 app_version。 + """ + + fields = { + "AppId": fields.Str(required=True, dump_to="AppId"), + "Description": fields.Str(required=False, dump_to="Description"), + "Name": fields.Str(required=True, dump_to="Name"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "URL": fields.Str(required=True, dump_to="URL"), + } + + +class CreateUPhoneAppVersionResponseSchema(schema.ResponseSchema): + """CreateUPhoneAppVersion - 创建云手机应用版本。 + 注:一个 app 对应多个 app_version。 + """ + + fields = { + "AppVersionId": fields.Str(required=True, load_from="AppVersionId"), + } + + +""" +API: CreateUPhoneImage + +创建云手机镜像。 +""" + + +class CreateUPhoneImageRequestSchema(schema.RequestSchema): + """CreateUPhoneImage - 创建云手机镜像。""" + + fields = { + "CityId": fields.Str(required=False, dump_to="CityId"), + "Description": fields.Str(required=False, dump_to="Description"), + "Name": fields.Str(required=True, dump_to="Name"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UPhoneId": fields.Str(required=True, dump_to="UPhoneId"), + } + + +class CreateUPhoneImageResponseSchema(schema.ResponseSchema): + """CreateUPhoneImage - 创建云手机镜像。""" + + fields = { + "ImageId": fields.Str(required=False, load_from="ImageId"), + "JobId": fields.Str(required=False, load_from="JobId"), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: CreateUPhoneServer + +创建云手机服务器 +""" + + +class CreateUPhoneServerParamNetworkInterfaceSchema(schema.RequestSchema): + """CreateUPhoneServerParamNetworkInterface -""" + + fields = {} + + +class CreateUPhoneServerRequestSchema(schema.RequestSchema): + """CreateUPhoneServer - 创建云手机服务器""" + + fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CityId": fields.Str(required=True, dump_to="CityId"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "ImageId": fields.Str(required=True, dump_to="ImageId"), + "IpDestRegion": fields.Str(required=False, dump_to="IpDestRegion"), + "IpProportion": fields.Int(required=False, dump_to="IpProportion"), + "Name": fields.Str(required=True, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Str(required=False, dump_to="Quantity"), + "ServerModelName": fields.Str(required=True, dump_to="ServerModelName"), + "ShareBandwidth": fields.Int(required=False, dump_to="ShareBandwidth"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "UPhoneModelName": fields.Str(required=True, dump_to="UPhoneModelName"), + } + + +class CreateUPhoneServerResponseSchema(schema.ResponseSchema): + """CreateUPhoneServer - 创建云手机服务器""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "ServerId": fields.Str(required=True, load_from="ServerId"), + } + + +""" +API: DeleteUPhone + +删除云手机 +""" + + +class DeleteUPhoneRequestSchema(schema.RequestSchema): + """DeleteUPhone - 删除云手机""" + + fields = { + "CityId": fields.Str(required=False, dump_to="CityId"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UPhoneIds": fields.List(fields.Str()), + } + + +class DeleteUPhoneResponseSchema(schema.ResponseSchema): + """DeleteUPhone - 删除云手机""" + + fields = { + "JobId": fields.Str(required=True, load_from="JobId"), + } + + +""" +API: DeleteUPhoneImage + +删除自制云手机镜像。 +""" + + +class DeleteUPhoneImageRequestSchema(schema.RequestSchema): + """DeleteUPhoneImage - 删除自制云手机镜像。""" + + fields = { + "ImageId": fields.Str(required=True, dump_to="ImageId"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class DeleteUPhoneImageResponseSchema(schema.ResponseSchema): + """DeleteUPhoneImage - 删除自制云手机镜像。""" + + fields = { + "ImageId": fields.Str(required=True, load_from="ImageId"), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DeleteUPhoneServer + +删除云手机服务器。 +""" + + +class DeleteUPhoneServerRequestSchema(schema.RequestSchema): + """DeleteUPhoneServer - 删除云手机服务器。""" + + fields = { + "CityId": fields.Str(required=True, dump_to="CityId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ReleaseEIP": fields.Bool(required=False, dump_to="ReleaseEIP"), + "ReleaseUDisk": fields.Bool(required=False, dump_to="ReleaseUDisk"), + "ServerId": fields.Str(required=True, dump_to="ServerId"), + } + + +class DeleteUPhoneServerResponseSchema(schema.ResponseSchema): + """DeleteUPhoneServer - 删除云手机服务器。""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DeleteUPhoneShareBandwidth + +删除云手机共享带宽 +""" + + +class DeleteUPhoneShareBandwidthRequestSchema(schema.RequestSchema): + """DeleteUPhoneShareBandwidth - 删除云手机共享带宽""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ShareBandwidthId": fields.Str( + required=True, dump_to="ShareBandwidthId" + ), + } + + +class DeleteUPhoneShareBandwidthResponseSchema(schema.ResponseSchema): + """DeleteUPhoneShareBandwidth - 删除云手机共享带宽""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DescribeUPhone + +获取云手机列表信息。 +""" + + +class DescribeUPhoneRequestSchema(schema.RequestSchema): + """DescribeUPhone - 获取云手机列表信息。""" + + fields = { + "CityId": fields.Str(required=False, dump_to="CityId"), + "IsAll": fields.Bool(required=False, dump_to="IsAll"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ServerId": fields.Str(required=False, dump_to="ServerId"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "UPhoneIds": fields.List(fields.Str()), + } + + +class DescribeUPhoneResponseSchema(schema.ResponseSchema): + """DescribeUPhone - 获取云手机列表信息。""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + "UPhones": fields.List( + models.UPhoneInstanceSchema(), required=True, load_from="UPhones" + ), + } + + +""" +API: DescribeUPhoneApp + +获取应用列表。 +""" + + +class DescribeUPhoneAppRequestSchema(schema.RequestSchema): + """DescribeUPhoneApp - 获取应用列表。""" + + fields = { + "AppIds": fields.List(fields.Str()), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class DescribeUPhoneAppResponseSchema(schema.ResponseSchema): + """DescribeUPhoneApp - 获取应用列表。""" + + fields = { + "Apps": fields.List( + models.AppInstanceSchema(), required=False, load_from="Apps" + ), + "Message": fields.Str(required=True, load_from="Message"), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeUPhoneAppVersion + +获取应用版本列表。 +""" + + +class DescribeUPhoneAppVersionRequestSchema(schema.RequestSchema): + """DescribeUPhoneAppVersion - 获取应用版本列表。""" + + fields = { + "AppId": fields.Str(required=False, dump_to="AppId"), + "AppVersionIds": fields.List(fields.Str()), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UPhoneId": fields.Str(required=False, dump_to="UPhoneId"), + } + + +class DescribeUPhoneAppVersionResponseSchema(schema.ResponseSchema): + """DescribeUPhoneAppVersion - 获取应用版本列表。""" + + fields = { + "AppVersions": fields.List( + models.AppVersionInstanceSchema(), + required=True, + load_from="AppVersions", + ), + "Message": fields.Str(required=True, load_from="Message"), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeUPhoneCities + +获取云手机提供服务的城市列表 +""" + + +class DescribeUPhoneCitiesRequestSchema(schema.RequestSchema): + """DescribeUPhoneCities - 获取云手机提供服务的城市列表""" + + fields = { + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class DescribeUPhoneCitiesResponseSchema(schema.ResponseSchema): + """DescribeUPhoneCities - 获取云手机提供服务的城市列表""" + + fields = { + "UPhoneCities": fields.List( + models.CityInstanceSchema(), required=True, load_from="UPhoneCities" + ), + } + + +""" +API: DescribeUPhoneDetailByApp + +根据AppId,查询安装该应用的云手机以及相关的应用版本信息 +""" + + +class DescribeUPhoneDetailByAppRequestSchema(schema.RequestSchema): + """DescribeUPhoneDetailByApp - 根据AppId,查询安装该应用的云手机以及相关的应用版本信息""" + + fields = { + "AppId": fields.Str(required=True, dump_to="AppId"), + "CityId": fields.Str(required=False, dump_to="CityId"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class DescribeUPhoneDetailByAppResponseSchema(schema.ResponseSchema): + """DescribeUPhoneDetailByApp - 根据AppId,查询安装该应用的云手机以及相关的应用版本信息""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + "UPhoneDetails": fields.List( + models.UPhoneDetailInstanceSchema(), + required=True, + load_from="UPhoneDetails", + ), + } + + +""" +API: DescribeUPhoneEipList + +获取云手机Eip列表 +""" + + +class DescribeUPhoneEipListRequestSchema(schema.RequestSchema): + """DescribeUPhoneEipList - 获取云手机Eip列表""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Proportion": fields.Str(required=False, dump_to="Proportion"), + "Region": fields.Str(required=False, dump_to="Region"), + } + + +class DescribeUPhoneEipListResponseSchema(schema.ResponseSchema): + """DescribeUPhoneEipList - 获取云手机Eip列表""" + + fields = { + "EipInfos": fields.List( + models.EipInfoSchema(), required=True, load_from="EipInfos" + ), + "Message": fields.Str(required=True, load_from="Message"), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeUPhoneImage + +获取云手机镜像信息列表。 +""" + + +class DescribeUPhoneImageRequestSchema(schema.RequestSchema): + """DescribeUPhoneImage - 获取云手机镜像信息列表。""" + + fields = { + "ImageIds": fields.List(fields.Str()), + "Limit": fields.Str(required=False, dump_to="Limit"), + "Offset": fields.Str(required=False, dump_to="Offset"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Type": fields.Str(required=False, dump_to="Type"), + } + + +class DescribeUPhoneImageResponseSchema(schema.ResponseSchema): + """DescribeUPhoneImage - 获取云手机镜像信息列表。""" + + fields = { + "Images": fields.List( + models.UPhoneImageInstanceSchema(), + required=True, + load_from="Images", + ), + "Message": fields.Str(required=True, load_from="Message"), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeUPhoneIpRegions + +获取云手机所在城市支持绑定独立IP的地域列表 +""" + + +class DescribeUPhoneIpRegionsRequestSchema(schema.RequestSchema): + """DescribeUPhoneIpRegions - 获取云手机所在城市支持绑定独立IP的地域列表""" + + fields = { + "CityId": fields.Str(required=True, dump_to="CityId"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class DescribeUPhoneIpRegionsResponseSchema(schema.ResponseSchema): + """DescribeUPhoneIpRegions - 获取云手机所在城市支持绑定独立IP的地域列表""" + + fields = { + "Regions": fields.List( + models.IpRegionSchema(), required=True, load_from="Regions" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeUPhoneJob + +查询Job的执行状态。 +""" + + +class DescribeUPhoneJobRequestSchema(schema.RequestSchema): + """DescribeUPhoneJob - 查询Job的执行状态。""" + + fields = { + "CityId": fields.Str(required=False, dump_to="CityId"), + "JobIds": fields.List(fields.Str()), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "State": fields.Str(required=False, dump_to="State"), + "Types": fields.List(fields.Str()), + } + + +class DescribeUPhoneJobResponseSchema(schema.ResponseSchema): + """DescribeUPhoneJob - 查询Job的执行状态。""" + + fields = { + "Jobs": fields.List( + models.JobSchema(), required=False, load_from="Jobs" + ), + "Message": fields.Str(required=True, load_from="Message"), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeUPhoneModel + +获取云手机规格列表。两种类型:uphone代表单云手机场景、uphone-server代表云手机服务器场景。 +""" + + +class DescribeUPhoneModelRequestSchema(schema.RequestSchema): + """DescribeUPhoneModel - 获取云手机规格列表。两种类型:uphone代表单云手机场景、uphone-server代表云手机服务器场景。""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Scene": fields.Str(required=False, dump_to="Scene"), + "UPhoneModelNames": fields.List(fields.Str()), + } + + +class DescribeUPhoneModelResponseSchema(schema.ResponseSchema): + """DescribeUPhoneModel - 获取云手机规格列表。两种类型:uphone代表单云手机场景、uphone-server代表云手机服务器场景。""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + "UPhoneModels": fields.List( + models.UPhoneModelInstanceSchema(), + required=True, + load_from="UPhoneModels", + ), + } + + +""" +API: DescribeUPhoneServer + +获取云手机服务器列表信息。 +""" + + +class DescribeUPhoneServerRequestSchema(schema.RequestSchema): + """DescribeUPhoneServer - 获取云手机服务器列表信息。""" + + fields = { + "CityId": fields.Str(required=True, dump_to="CityId"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ServerIds": fields.List(fields.Str()), + } + + +class DescribeUPhoneServerResponseSchema(schema.ResponseSchema): + """DescribeUPhoneServer - 获取云手机服务器列表信息。""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + "Servers": fields.List( + models.ServerInstanceSchema(), required=True, load_from="Servers" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeUPhoneServerModel + +获取ServerModel列表。 +""" + + +class DescribeUPhoneServerModelRequestSchema(schema.RequestSchema): + """DescribeUPhoneServerModel - 获取ServerModel列表。""" + + fields = { + "CityId": fields.Str(required=True, dump_to="CityId"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ServerModelNames": fields.List(fields.Str()), + } + + +class DescribeUPhoneServerModelResponseSchema(schema.ResponseSchema): + """DescribeUPhoneServerModel - 获取ServerModel列表。""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "ServerModels": fields.List( + models.ServerModelInstanceSchema(), + required=False, + load_from="ServerModels", + ), + "Stock": fields.List( + models.StockInfoSchema(), required=False, load_from="Stock" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeUPhoneShareBandwidth + +获取共享带宽列表 +""" + + +class DescribeUPhoneShareBandwidthRequestSchema(schema.RequestSchema): + """DescribeUPhoneShareBandwidth - 获取共享带宽列表""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ShareBandwidthId": fields.Str( + required=False, dump_to="ShareBandwidthId" + ), + } + + +class DescribeUPhoneShareBandwidthResponseSchema(schema.ResponseSchema): + """DescribeUPhoneShareBandwidth - 获取共享带宽列表""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "ShareBandwidth": fields.List( + models.ShareBandwidthInfoSchema(), + required=True, + load_from="ShareBandwidth", + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: GetUPhoneAllowance + +获取云手机创建余量 +""" + + +class GetUPhoneAllowanceRequestSchema(schema.RequestSchema): + """GetUPhoneAllowance - 获取云手机创建余量""" + + fields = { + "CityId": fields.Str(required=True, dump_to="CityId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class GetUPhoneAllowanceResponseSchema(schema.ResponseSchema): + """GetUPhoneAllowance - 获取云手机创建余量""" + + fields = { + "UPhoneAllowance": fields.List( + models.UPhoneAllowanceSchema(), + required=True, + load_from="UPhoneAllowance", + ), + } + + +""" +API: GetUPhoneBandwidthUpgradePrice + +获取云手机带宽升降级价格 +""" + + +class GetUPhoneBandwidthUpgradePriceRequestSchema(schema.RequestSchema): + """GetUPhoneBandwidthUpgradePrice - 获取云手机带宽升降级价格""" + + fields = { + "Bandwidth": fields.Int(required=True, dump_to="Bandwidth"), + "ProductType": fields.Str(required=True, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UPhoneId": fields.Str(required=True, dump_to="UPhoneId"), + } + + +class GetUPhoneBandwidthUpgradePriceResponseSchema(schema.ResponseSchema): + """GetUPhoneBandwidthUpgradePrice - 获取云手机带宽升降级价格""" + + fields = { + "ListPrice": fields.Float(required=True, load_from="ListPrice"), + "Message": fields.Str(required=True, load_from="Message"), + "OriginalPrice": fields.Float(required=True, load_from="OriginalPrice"), + "Price": fields.Float(required=True, load_from="Price"), + } + + +""" +API: GetUPhonePrice + +根据云手机规格名称,获取UPhone实例的价格。 +""" + + +class GetUPhonePriceRequestSchema(schema.RequestSchema): + """GetUPhonePrice - 根据云手机规格名称,获取UPhone实例的价格。""" + + fields = { + "BandwidthLine": fields.Int(required=False, dump_to="BandwidthLine"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CityId": fields.Str(required=True, dump_to="CityId"), + "INetBandwidth": fields.Int(required=False, dump_to="INetBandwidth"), + "IpCount": fields.Int(required=False, dump_to="IpCount"), + "IpDestRegion": fields.Str(required=False, dump_to="IpDestRegion"), + "MediaBandwidth": fields.Int( + required=False, dump_to="MediaBandwidth" + ), # Deprecated, will be removed at 1.0 + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "UPhoneBandwidth": fields.Int( + required=False, dump_to="UPhoneBandwidth" + ), + "UPhoneCount": fields.Int(required=False, dump_to="UPhoneCount"), + "UPhoneModelName": fields.Int( + required=False, dump_to="UPhoneModelName" + ), + "UseGlobalBws": fields.Bool(required=False, dump_to="UseGlobalBws"), + "UseKbps": fields.Bool(required=False, dump_to="UseKbps"), + } + + +class GetUPhonePriceResponseSchema(schema.ResponseSchema): + """GetUPhonePrice - 根据云手机规格名称,获取UPhone实例的价格。""" + + fields = { + "PriceSet": fields.List( + models.UPhonePriceSetSchema(), required=True, load_from="PriceSet" + ), + } + + +""" +API: GetUPhoneRenewPrice + +获取云手机续费价格,不包括独立ip价格。 +""" + + +class GetUPhoneRenewPriceRequestSchema(schema.RequestSchema): + """GetUPhoneRenewPrice - 获取云手机续费价格,不包括独立ip价格。""" + + fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CityId": fields.Str(required=False, dump_to="CityId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UPhoneId": fields.Str(required=True, dump_to="UPhoneId"), + } + + +class GetUPhoneRenewPriceResponseSchema(schema.ResponseSchema): + """GetUPhoneRenewPrice - 获取云手机续费价格,不包括独立ip价格。""" + + fields = { + "PriceSet": fields.List( + models.UPhonePriceSetSchema(), required=True, load_from="PriceSet" + ), + } + + +""" +API: GetUPhoneScreenCapture + +云手机截屏 +""" + + +class GetUPhoneScreenCaptureRequestSchema(schema.RequestSchema): + """GetUPhoneScreenCapture - 云手机截屏""" + + fields = { + "CityId": fields.Str(required=False, dump_to="CityId"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UPhoneID": fields.Str(required=True, dump_to="UPhoneID"), + } + + +class GetUPhoneScreenCaptureResponseSchema(schema.ResponseSchema): + """GetUPhoneScreenCapture - 云手机截屏""" + + fields = { + "URL": fields.Str(required=True, load_from="URL"), + } + + +""" +API: GetUPhoneServerPrice + +根据服务器规格名称,获取UPhoneServer实例的价格。 +""" + + +class GetUPhoneServerPriceRequestSchema(schema.RequestSchema): + """GetUPhoneServerPrice - 根据服务器规格名称,获取UPhoneServer实例的价格。""" + + fields = { + "Bandwidth": fields.Int(required=False, dump_to="Bandwidth"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CityId": fields.Str(required=True, dump_to="CityId"), + "IpCount": fields.Int(required=False, dump_to="IpCount"), + "IpDestRegion": fields.Str(required=False, dump_to="IpDestRegion"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "ServerModelName": fields.Str(required=True, dump_to="ServerModelName"), + } + + +class GetUPhoneServerPriceResponseSchema(schema.ResponseSchema): + """GetUPhoneServerPrice - 根据服务器规格名称,获取UPhoneServer实例的价格。""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "PriceSet": fields.List( + models.UPhoneServerPriceSetSchema(), + required=True, + load_from="PriceSet", + ), + } + + +""" +API: GetUPhoneServerRenewPrice + +获取云手机服务器续费价格 + +提示信息: 须按照控制台服务器模型配置创建服务器。详情请参考控制台。 +""" + + +class GetUPhoneServerRenewPriceRequestSchema(schema.RequestSchema): + """GetUPhoneServerRenewPrice - 获取云手机服务器续费价格 + + 提示信息: 须按照控制台服务器模型配置创建服务器。详情请参考控制台。 + """ + + fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CityId": fields.Str(required=True, dump_to="CityId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ServerId": fields.Str(required=True, dump_to="ServerId"), + } + + +class GetUPhoneServerRenewPriceResponseSchema(schema.ResponseSchema): + """GetUPhoneServerRenewPrice - 获取云手机服务器续费价格 + + 提示信息: 须按照控制台服务器模型配置创建服务器。详情请参考控制台。 + """ + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "PriceSet": fields.List( + models.UPhoneServerPriceSetSchema(), + required=True, + load_from="PriceSet", + ), + } + + +""" +API: GetUPhoneShareBandwidthUpgradePrice + +获取云手机共享带宽升降级价格 +""" + + +class GetUPhoneShareBandwidthUpgradePriceRequestSchema(schema.RequestSchema): + """GetUPhoneShareBandwidthUpgradePrice - 获取云手机共享带宽升降级价格""" + + fields = { + "Bandwidth": fields.Int(required=True, dump_to="Bandwidth"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ShareBandwidthId": fields.Str( + required=True, dump_to="ShareBandwidthId" + ), + } + + +class GetUPhoneShareBandwidthUpgradePriceResponseSchema(schema.ResponseSchema): + """GetUPhoneShareBandwidthUpgradePrice - 获取云手机共享带宽升降级价格""" + + fields = { + "ListPrice": fields.Float(required=True, load_from="ListPrice"), + "Message": fields.Str(required=True, load_from="Message"), + "OriginalPrice": fields.Float(required=True, load_from="OriginalPrice"), + "Price": fields.Float(required=True, load_from="Price"), + } + + +""" +API: ImportFile + +上传文件到云手机目录/sdcard/Download/并自动安装APK文件 +""" + + +class ImportFileRequestSchema(schema.RequestSchema): + """ImportFile - 上传文件到云手机目录/sdcard/Download/并自动安装APK文件""" + + fields = { + "ABI": fields.Str(required=False, dump_to="ABI"), + "CityId": fields.Str(required=False, dump_to="CityId"), + "FileName": fields.Str(required=True, dump_to="FileName"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UPhoneIds": fields.List(fields.Str()), + "URL": fields.Str(required=True, dump_to="URL"), + } + + +class ImportFileResponseSchema(schema.ResponseSchema): + """ImportFile - 上传文件到云手机目录/sdcard/Download/并自动安装APK文件""" + + fields = { + "JobId": fields.Str(required=True, load_from="JobId"), + } + + +""" +API: InstallUPhoneAppVersion + +在云手机中安装应用版本相关的Apk文件。系统会根据AppVersionId将对应的Apk文件下载后安装到云手机中。一次只支持安装一个Apk。 +""" + + +class InstallUPhoneAppVersionRequestSchema(schema.RequestSchema): + """InstallUPhoneAppVersion - 在云手机中安装应用版本相关的Apk文件。系统会根据AppVersionId将对应的Apk文件下载后安装到云手机中。一次只支持安装一个Apk。""" + + fields = { + "AppVersionId": fields.Str(required=True, dump_to="AppVersionId"), + "CityId": fields.Str(required=False, dump_to="CityId"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UPhoneIds": fields.List(fields.Str()), + } + + +class InstallUPhoneAppVersionResponseSchema(schema.ResponseSchema): + """InstallUPhoneAppVersion - 在云手机中安装应用版本相关的Apk文件。系统会根据AppVersionId将对应的Apk文件下载后安装到云手机中。一次只支持安装一个Apk。""" + + fields = { + "JobId": fields.Str(required=True, load_from="JobId"), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: ModifyUPhoneBandwidth + +修改云手机带宽 +""" + + +class ModifyUPhoneBandwidthRequestSchema(schema.RequestSchema): + """ModifyUPhoneBandwidth - 修改云手机带宽""" + + fields = { + "Bandwidth": fields.Int(required=True, dump_to="Bandwidth"), + "ProductType": fields.Str(required=True, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UPhoneId": fields.Str(required=True, dump_to="UPhoneId"), + } + + +class ModifyUPhoneBandwidthResponseSchema(schema.ResponseSchema): + """ModifyUPhoneBandwidth - 修改云手机带宽""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: ModifyUPhoneName + +修改指定云手机实例名称。 +""" + + +class ModifyUPhoneNameRequestSchema(schema.RequestSchema): + """ModifyUPhoneName - 修改指定云手机实例名称。""" + + fields = { + "CityId": fields.Str(required=False, dump_to="CityId"), + "Name": fields.Str(required=True, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UPhoneId": fields.Str(required=True, dump_to="UPhoneId"), + } + + +class ModifyUPhoneNameResponseSchema(schema.ResponseSchema): + """ModifyUPhoneName - 修改指定云手机实例名称。""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "UPhoneId": fields.Str(required=True, load_from="UPhoneId"), + } + + +""" +API: ModifyUPhoneRemark + +修改指定云手机实例备注信息。 +""" + + +class ModifyUPhoneRemarkRequestSchema(schema.RequestSchema): + """ModifyUPhoneRemark - 修改指定云手机实例备注信息。""" + + fields = { + "CityId": fields.Str(required=False, dump_to="CityId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "UPhoneId": fields.Str(required=True, dump_to="UPhoneId"), + } + + +class ModifyUPhoneRemarkResponseSchema(schema.ResponseSchema): + """ModifyUPhoneRemark - 修改指定云手机实例备注信息。""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "UPhoneId": fields.Str(required=True, load_from="UPhoneId"), + } + + +""" +API: ModifyUPhoneServerName + +修改指定云手机服务器实例名称。 +""" + + +class ModifyUPhoneServerNameRequestSchema(schema.RequestSchema): + """ModifyUPhoneServerName - 修改指定云手机服务器实例名称。""" + + fields = { + "CityId": fields.Str(required=True, dump_to="CityId"), + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ServerId": fields.Str(required=True, dump_to="ServerId"), + } + + +class ModifyUPhoneServerNameResponseSchema(schema.ResponseSchema): + """ModifyUPhoneServerName - 修改指定云手机服务器实例名称。""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "ServerId": fields.Str(required=True, load_from="ServerId"), + } + + +""" +API: ModifyUPhoneServerRemark + +修改指定云手机实例备注信息。 +""" + + +class ModifyUPhoneServerRemarkRequestSchema(schema.RequestSchema): + """ModifyUPhoneServerRemark - 修改指定云手机实例备注信息。""" + + fields = { + "CityId": fields.Str(required=True, dump_to="CityId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "ServerId": fields.Str(required=True, dump_to="ServerId"), + } + + +class ModifyUPhoneServerRemarkResponseSchema(schema.ResponseSchema): + """ModifyUPhoneServerRemark - 修改指定云手机实例备注信息。""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "ServerId": fields.Str(required=True, load_from="ServerId"), + } + + +""" +API: ModifyUPhoneShareBandwidth + +修改云手机共享带宽 +""" + + +class ModifyUPhoneShareBandwidthRequestSchema(schema.RequestSchema): + """ModifyUPhoneShareBandwidth - 修改云手机共享带宽""" + + fields = { + "Bandwidth": fields.Str(required=True, dump_to="Bandwidth"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ShareBandwidthId": fields.Str( + required=True, dump_to="ShareBandwidthId" + ), + } + + +class ModifyUPhoneShareBandwidthResponseSchema(schema.ResponseSchema): + """ModifyUPhoneShareBandwidth - 修改云手机共享带宽""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: ModifyUPhoneShareBandwidthName + +修改云手机共享带宽名称 +""" + + +class ModifyUPhoneShareBandwidthNameRequestSchema(schema.RequestSchema): + """ModifyUPhoneShareBandwidthName - 修改云手机共享带宽名称""" + + fields = { + "Name": fields.Str(required=True, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ShareBandwidthId": fields.Str( + required=True, dump_to="ShareBandwidthId" + ), + } + + +class ModifyUPhoneShareBandwidthNameResponseSchema(schema.ResponseSchema): + """ModifyUPhoneShareBandwidthName - 修改云手机共享带宽名称""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: ModifyUPhoneShareBandwidthRemark + +修改云手机共享带宽备注 +""" + + +class ModifyUPhoneShareBandwidthRemarkRequestSchema(schema.RequestSchema): + """ModifyUPhoneShareBandwidthRemark - 修改云手机共享带宽备注""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Remark": fields.Str(required=True, dump_to="Remark"), + "ShareBandwidthId": fields.Str( + required=True, dump_to="ShareBandwidthId" + ), + } + + +class ModifyUPhoneShareBandwidthRemarkResponseSchema(schema.ResponseSchema): + """ModifyUPhoneShareBandwidthRemark - 修改云手机共享带宽备注""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: PoweroffUPhone + +关闭处于运行状态的云手机实例 +""" + + +class PoweroffUPhoneRequestSchema(schema.RequestSchema): + """PoweroffUPhone - 关闭处于运行状态的云手机实例""" + + fields = { + "CityId": fields.Str(required=False, dump_to="CityId"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UPhoneIds": fields.List(fields.Str()), + } + + +class PoweroffUPhoneResponseSchema(schema.ResponseSchema): + """PoweroffUPhone - 关闭处于运行状态的云手机实例""" + + fields = { + "JobId": fields.Str(required=False, load_from="JobId"), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: PoweronUPhone + +启动处于关闭状态的云手机实例 +""" + + +class PoweronUPhoneRequestSchema(schema.RequestSchema): + """PoweronUPhone - 启动处于关闭状态的云手机实例""" + + fields = { + "CityId": fields.Str(required=False, dump_to="CityId"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UPhoneIds": fields.List(fields.Str()), + } + + +class PoweronUPhoneResponseSchema(schema.ResponseSchema): + """PoweronUPhone - 启动处于关闭状态的云手机实例""" + + fields = { + "JobId": fields.Str(required=False, load_from="JobId"), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: RebootUPhone + +重新启动云手机实例 +""" + + +class RebootUPhoneRequestSchema(schema.RequestSchema): + """RebootUPhone - 重新启动云手机实例""" + + fields = { + "CityId": fields.Str(required=False, dump_to="CityId"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UPhoneIds": fields.List(fields.Str()), + } + + +class RebootUPhoneResponseSchema(schema.ResponseSchema): + """RebootUPhone - 重新启动云手机实例""" + + fields = { + "JobId": fields.Str(required=False, load_from="JobId"), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: RenewUPhone + +修改UPhone的device_id、imei、meid 以及其他相关配置,达到一键新机的效果 +""" + + +class RenewUPhoneRequestSchema(schema.RequestSchema): + """RenewUPhone - 修改UPhone的device_id、imei、meid 以及其他相关配置,达到一键新机的效果""" + + fields = { + "AndroidID": fields.Str(required=False, dump_to="AndroidID"), + "BSSID": fields.Str(required=False, dump_to="BSSID"), + "BaseBand": fields.Str(required=False, dump_to="BaseBand"), + "Board": fields.Str(required=False, dump_to="Board"), + "BootLoader": fields.Str(required=False, dump_to="BootLoader"), + "Brand": fields.Str(required=False, dump_to="Brand"), + "BuildHost": fields.Str(required=False, dump_to="BuildHost"), + "BuildID": fields.Str(required=False, dump_to="BuildID"), + "BuildTags": fields.Str(required=False, dump_to="BuildTags"), + "BuildVersionInc": fields.Str( + required=False, dump_to="BuildVersionInc" + ), + "CityId": fields.Str(required=False, dump_to="CityId"), + "Customize": fields.Bool(required=False, dump_to="Customize"), + "Device": fields.Str(required=False, dump_to="Device"), + "DisplayID": fields.Str(required=False, dump_to="DisplayID"), + "FingerPrint": fields.Str(required=False, dump_to="FingerPrint"), + "ICCID": fields.Str(required=False, dump_to="ICCID"), + "IMEI": fields.Str(required=False, dump_to="IMEI"), + "IMEISV": fields.Str(required=False, dump_to="IMEISV"), + "IMSI": fields.Str(required=False, dump_to="IMSI"), + "Manufacture": fields.Str(required=False, dump_to="Manufacture"), + "Model": fields.Str(required=False, dump_to="Model"), + "PhoneNumber": fields.Str(required=False, dump_to="PhoneNumber"), + "ProductName": fields.Str(required=False, dump_to="ProductName"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "RadioMac": fields.Str(required=False, dump_to="RadioMac"), + "SerialNumber": fields.Str(required=False, dump_to="SerialNumber"), + "UPhoneIds": fields.List(fields.Str()), + "WiFiName": fields.Str(required=False, dump_to="WiFiName"), + } + + +class RenewUPhoneResponseSchema(schema.ResponseSchema): + """RenewUPhone - 修改UPhone的device_id、imei、meid 以及其他相关配置,达到一键新机的效果""" + + fields = { + "JobId": fields.Str(required=False, load_from="JobId"), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: ResetUPhone + +将云手机恢复为创建时的状态。 +""" + + +class ResetUPhoneRequestSchema(schema.RequestSchema): + """ResetUPhone - 将云手机恢复为创建时的状态。""" + + fields = { + "CityId": fields.Str(required=False, dump_to="CityId"), + "ImageId": fields.Str(required=False, dump_to="ImageId"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UPhoneIds": fields.List(fields.Str()), + "UPhoneModelName": fields.Str( + required=False, dump_to="UPhoneModelName" + ), # Deprecated, will be removed at 1.0 + } + + +class ResetUPhoneResponseSchema(schema.ResponseSchema): + """ResetUPhone - 将云手机恢复为创建时的状态。""" + + fields = { + "JobId": fields.Str(required=False, load_from="JobId"), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: RunAsyncCommand + +在云手机中执行异步shell命令。 +""" + + +class RunAsyncCommandRequestSchema(schema.RequestSchema): + """RunAsyncCommand - 在云手机中执行异步shell命令。""" + + fields = { + "CityId": fields.Str(required=False, dump_to="CityId"), + "Content": fields.Str(required=True, dump_to="Content"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UPhoneIds": fields.List(fields.Str()), + } + + +class RunAsyncCommandResponseSchema(schema.ResponseSchema): + """RunAsyncCommand - 在云手机中执行异步shell命令。""" + + fields = { + "JobId": fields.Str(required=True, load_from="JobId"), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: RunSyncCommand + +在云手机中执行同步shell命令。 +""" + + +class RunSyncCommandRequestSchema(schema.RequestSchema): + """RunSyncCommand - 在云手机中执行同步shell命令。""" + + fields = { + "CityId": fields.Str(required=False, dump_to="CityId"), + "Content": fields.Str(required=True, dump_to="Content"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UPhoneIds": fields.List(fields.Str()), + } + + +class RunSyncCommandResponseSchema(schema.ResponseSchema): + """RunSyncCommand - 在云手机中执行同步shell命令。""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "Results": fields.List( + models.UPhoneCommandResultSchema(), + required=True, + load_from="Results", + ), + } + + +""" +API: SetUPhoneCallback + +设置云手机异步操作以及状态更新回调,支持云手机重置,安装应用,卸载应用,设备占用状态回调 +""" + + +class SetUPhoneCallbackRequestSchema(schema.RequestSchema): + """SetUPhoneCallback - 设置云手机异步操作以及状态更新回调,支持云手机重置,安装应用,卸载应用,设备占用状态回调""" + + fields = { + "CityId": fields.Str(required=False, dump_to="CityId"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UPhoneId": fields.Str(required=True, dump_to="UPhoneId"), + "URL": fields.Str(required=True, dump_to="URL"), + } + + +class SetUPhoneCallbackResponseSchema(schema.ResponseSchema): + """SetUPhoneCallback - 设置云手机异步操作以及状态更新回调,支持云手机重置,安装应用,卸载应用,设备占用状态回调""" + + fields = {} + + +""" +API: SetUPhoneConfig + +设置云手机画面参数(分辨率、DPI、帧率、码率) +""" + + +class SetUPhoneConfigRequestSchema(schema.RequestSchema): + """SetUPhoneConfig - 设置云手机画面参数(分辨率、DPI、帧率、码率)""" + + fields = { + "Async": fields.Str(required=False, dump_to="Async"), + "Bitrate": fields.Str(required=False, dump_to="Bitrate"), + "CityId": fields.Str(required=False, dump_to="CityId"), + "Dpi": fields.Str(required=False, dump_to="Dpi"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Refresh": fields.Str(required=False, dump_to="Refresh"), + "Resolution": fields.Str(required=False, dump_to="Resolution"), + "UPhoneIds": fields.List(fields.Str()), + } + + +class SetUPhoneConfigResponseSchema(schema.ResponseSchema): + """SetUPhoneConfig - 设置云手机画面参数(分辨率、DPI、帧率、码率)""" + + fields = { + "JobId": fields.Str(required=False, load_from="JobId"), + "Message": fields.Str(required=False, load_from="Message"), + "RequestId": fields.Str(required=True, load_from="RequestId"), + "Results": fields.List( + models.ResultsSchema(), required=False, load_from="Results" + ), + } + + +""" +API: SetUPhoneGPS + +设置云手机GPS信息 +""" + + +class SetUPhoneGPSParamUPhoneGPSsSchema(schema.RequestSchema): + """SetUPhoneGPSParamUPhoneGPSs -""" + + fields = { + "Altitude": fields.Float(required=False, dump_to="Altitude"), + "Enabled": fields.Bool(required=False, dump_to="Enabled"), + "Latitude": fields.Float(required=False, dump_to="Latitude"), + "Longitude": fields.Float(required=False, dump_to="Longitude"), + "UPhoneId": fields.Str(required=False, dump_to="UPhoneId"), + } + + +class SetUPhoneGPSRequestSchema(schema.RequestSchema): + """SetUPhoneGPS - 设置云手机GPS信息""" + + fields = { + "CityId": fields.Str(required=False, dump_to="CityId"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UPhoneGPSs": fields.List(SetUPhoneGPSParamUPhoneGPSsSchema()), + } + + +class SetUPhoneGPSResponseSchema(schema.ResponseSchema): + """SetUPhoneGPS - 设置云手机GPS信息""" + + fields = { + "JobId": fields.Str(required=False, load_from="JobId"), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: SetUPhoneManagerMode + +管理员模式支持所有按键,普通用户模式禁用返回桌面 +""" + + +class SetUPhoneManagerModeRequestSchema(schema.RequestSchema): + """SetUPhoneManagerMode - 管理员模式支持所有按键,普通用户模式禁用返回桌面""" + + fields = { + "CityId": fields.Str(required=False, dump_to="CityId"), + "Mode": fields.Str(required=True, dump_to="Mode"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UPhoneId": fields.Str(required=True, dump_to="UPhoneId"), + } + + +class SetUPhoneManagerModeResponseSchema(schema.ResponseSchema): + """SetUPhoneManagerMode - 管理员模式支持所有按键,普通用户模式禁用返回桌面""" + + fields = {} + + +""" +API: SetUPhoneRootMode + +设置云手机Root模式 +""" + + +class SetUPhoneRootModeRequestSchema(schema.RequestSchema): + """SetUPhoneRootMode - 设置云手机Root模式""" + + fields = { + "CityId": fields.Str(required=False, dump_to="CityId"), + "PkgNames": fields.List(fields.Str()), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Root": fields.Bool(required=True, dump_to="Root"), + "UPhoneIds": fields.List(fields.Str()), + } + + +class SetUPhoneRootModeResponseSchema(schema.ResponseSchema): + """SetUPhoneRootMode - 设置云手机Root模式""" + + fields = { + "JobId": fields.Str(required=True, load_from="JobId"), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: SetUPhoneSplashScreen + + +""" + + +class SetUPhoneSplashScreenRequestSchema(schema.RequestSchema): + """SetUPhoneSplashScreen -""" + + fields = { + "CityId": fields.Str(required=True, dump_to="CityId"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UPhoneId": fields.Str(required=True, dump_to="UPhoneId"), + "URL": fields.Str(required=True, dump_to="URL"), + } + + +class SetUPhoneSplashScreenResponseSchema(schema.ResponseSchema): + """SetUPhoneSplashScreen -""" + + fields = {} + + +""" +API: SetUPhoneToken + +设置云手机RTC连接Token提高安全性 +""" + + +class SetUPhoneTokenRequestSchema(schema.RequestSchema): + """SetUPhoneToken - 设置云手机RTC连接Token提高安全性""" + + fields = { + "CityId": fields.Str(required=False, dump_to="CityId"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Token": fields.Str(required=False, dump_to="Token"), + "UPhoneId": fields.Str(required=True, dump_to="UPhoneId"), + } + + +class SetUPhoneTokenResponseSchema(schema.ResponseSchema): + """SetUPhoneToken - 设置云手机RTC连接Token提高安全性""" + + fields = {} + + +""" +API: SwitchUPhoneIndependentIp + +更换云手机独立IP +""" + + +class SwitchUPhoneIndependentIpRequestSchema(schema.RequestSchema): + """SwitchUPhoneIndependentIp - 更换云手机独立IP""" + + fields = { + "EipId": fields.Str(required=True, dump_to="EipId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class SwitchUPhoneIndependentIpResponseSchema(schema.ResponseSchema): + """SwitchUPhoneIndependentIp - 更换云手机独立IP""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "NewIp": fields.Str(required=True, load_from="NewIp"), + } + + +""" +API: SwitchUPhoneInstance + + +""" + + +class SwitchUPhoneInstanceParamSwitchInfosSchema(schema.RequestSchema): + """SwitchUPhoneInstanceParamSwitchInfos -""" + + fields = { + "ImageId": fields.Str(required=False, dump_to="ImageId"), + "UPhoneId": fields.Str(required=True, dump_to="UPhoneId"), + } + + +class SwitchUPhoneInstanceRequestSchema(schema.RequestSchema): + """SwitchUPhoneInstance -""" + + fields = { + "CityId": fields.Str(required=True, dump_to="CityId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "SwitchInfos": fields.List( + SwitchUPhoneInstanceParamSwitchInfosSchema() + ), + } + + +class SwitchUPhoneInstanceResponseSchema(schema.ResponseSchema): + """SwitchUPhoneInstance -""" + + fields = { + "JobId": fields.Str(required=True, load_from="JobId"), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: UnInstallUPhoneAppVersion + +传入应用版本Id,在云手机中根据应用版本的PackageName卸载相关应用。一次只支持卸载一个应用。 +""" + + +class UnInstallUPhoneAppVersionRequestSchema(schema.RequestSchema): + """UnInstallUPhoneAppVersion - 传入应用版本Id,在云手机中根据应用版本的PackageName卸载相关应用。一次只支持卸载一个应用。""" + + fields = { + "AppVersionId": fields.Str(required=True, dump_to="AppVersionId"), + "CityId": fields.Str(required=False, dump_to="CityId"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "UPhoneIds": fields.List(fields.Str()), + } + + +class UnInstallUPhoneAppVersionResponseSchema(schema.ResponseSchema): + """UnInstallUPhoneAppVersion - 传入应用版本Id,在云手机中根据应用版本的PackageName卸载相关应用。一次只支持卸载一个应用。""" + + fields = { + "JobId": fields.Str(required=True, load_from="JobId"), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: UpdateUPhoneImage + +更新云手机镜像信息。 +""" + + +class UpdateUPhoneImageRequestSchema(schema.RequestSchema): + """UpdateUPhoneImage - 更新云手机镜像信息。""" + + fields = { + "Description": fields.Str(required=False, dump_to="Description"), + "ImageId": fields.Str(required=True, dump_to="ImageId"), + "Name": fields.Str(required=False, dump_to="Name"), + "ProductType": fields.Str(required=False, dump_to="ProductType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + } + + +class UpdateUPhoneImageResponseSchema(schema.ResponseSchema): + """UpdateUPhoneImage - 更新云手机镜像信息。""" + + fields = { + "ImageId": fields.Str(required=True, load_from="ImageId"), + "Message": fields.Str(required=True, load_from="Message"), + } diff --git a/ucloud/services/uphone/schemas/models.py b/ucloud/services/uphone/schemas/models.py new file mode 100644 index 00000000..64f7ff51 --- /dev/null +++ b/ucloud/services/uphone/schemas/models.py @@ -0,0 +1,357 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class UPhoneInstanceSchema(schema.ResponseSchema): + """UPhoneInstance -""" + + fields = { + "ADB": fields.Str(required=False, load_from="ADB"), + "CPU": fields.Float(required=True, load_from="CPU"), + "Callback": fields.Str(required=True, load_from="Callback"), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "CityId": fields.Str(required=True, load_from="CityId"), + "CityName": fields.Str(required=True, load_from="CityName"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "DiskSize": fields.Int(required=True, load_from="DiskSize"), + "EipId": fields.Str(required=False, load_from="EipId"), + "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "ImageId": fields.Str(required=True, load_from="ImageId"), + "Ip": fields.Str(required=False, load_from="Ip"), + "IpRegion": fields.Str(required=False, load_from="IpRegion"), + "LockBandwidth": fields.Bool(required=False, load_from="LockBandwidth"), + "Memory": fields.Int(required=True, load_from="Memory"), + "OsType": fields.Str(required=True, load_from="OsType"), + "Refresh": fields.Int(required=True, load_from="Refresh"), + "Remark": fields.Str(required=False, load_from="Remark"), + "Resolution": fields.Str(required=True, load_from="Resolution"), + "ServerId": fields.Str(required=True, load_from="ServerId"), + "ShareBandwidthId": fields.Str( + required=False, load_from="ShareBandwidthId" + ), + "ShareBandwidthName": fields.Str( + required=False, load_from="ShareBandwidthName" + ), + "SplashScreen": fields.Str(required=True, load_from="SplashScreen"), + "State": fields.Str(required=True, load_from="State"), + "Tag": fields.Str(required=True, load_from="Tag"), + "UPhoneBandwidth": fields.Int( + required=False, load_from="UPhoneBandwidth" + ), + "UPhoneId": fields.Str(required=True, load_from="UPhoneId"), + "UPhoneModelName": fields.Str( + required=True, load_from="UPhoneModelName" + ), + "UPhoneName": fields.Str(required=True, load_from="UPhoneName"), + "UPhoneScene": fields.Str(required=False, load_from="UPhoneScene"), + } + + +class AppInstanceSchema(schema.ResponseSchema): + """AppInstance -""" + + fields = { + "AppId": fields.Str(required=True, load_from="AppId"), + "AppName": fields.Str(required=True, load_from="AppName"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "Description": fields.Str(required=False, load_from="Description"), + "ModifyTime": fields.Int(required=True, load_from="ModifyTime"), + } + + +class AppVersionInstanceSchema(schema.ResponseSchema): + """AppVersionInstance -""" + + fields = { + "AppId": fields.Str(required=True, load_from="AppId"), + "AppVersionId": fields.Str(required=True, load_from="AppVersionId"), + "AppVersionName": fields.Str(required=True, load_from="AppVersionName"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "Description": fields.Str(required=False, load_from="Description"), + "ModifyTime": fields.Int(required=True, load_from="ModifyTime"), + "PackageName": fields.Str(required=True, load_from="PackageName"), + "URL": fields.Str(required=True, load_from="URL"), + } + + +class CityInstanceSchema(schema.ResponseSchema): + """CityInstance -""" + + fields = { + "CityAlias": fields.Str(required=False, load_from="CityAlias"), + "CityId": fields.Str(required=False, load_from="CityId"), + "CityName": fields.Str(required=False, load_from="CityName"), + "CityType": fields.Str(required=False, load_from="CityType"), + "IsSoldOut": fields.Bool(required=False, load_from="IsSoldOut"), + } + + +class UPhoneDetailInstanceSchema(schema.ResponseSchema): + """UPhoneDetailInstance -""" + + fields = { + "AppVersion": AppVersionInstanceSchema(), + "CPU": fields.Int(required=False, load_from="CPU"), + "CityId": fields.Str(required=False, load_from="CityId"), + "CityName": fields.Str(required=False, load_from="CityName"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DiskSize": fields.Int(required=False, load_from="DiskSize"), + "ImageId": fields.Str(required=False, load_from="ImageId"), + "Memory": fields.Int(required=False, load_from="Memory"), + "OsType": fields.Str(required=False, load_from="OsType"), + "Refresh": fields.Int(required=False, load_from="Refresh"), + "Remark": fields.Str(required=False, load_from="Remark"), + "Resolution": fields.Str(required=False, load_from="Resolution"), + "ServerId": fields.Str(required=False, load_from="ServerId"), + "State": fields.Str(required=False, load_from="State"), + "UPhoneId": fields.Str(required=False, load_from="UPhoneId"), + "UPhoneModelName": fields.Str( + required=False, load_from="UPhoneModelName" + ), + "UPhoneName": fields.Str(required=False, load_from="UPhoneName"), + } + + +class EipInfoSchema(schema.ResponseSchema): + """EipInfo - EIP信息""" + + fields = { + "BindCount": fields.Int(required=False, load_from="BindCount"), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "EipId": fields.Str(required=True, load_from="EipId"), + "EipIp": fields.Str(required=True, load_from="EipIp"), + "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "Name": fields.Str(required=False, load_from="Name"), + "Proportion": fields.Int(required=False, load_from="Proportion"), + "Region": fields.Str(required=True, load_from="Region"), + "RemainCount": fields.Int(required=False, load_from="RemainCount"), + "Remark": fields.Str(required=False, load_from="Remark"), + "UPhoneIds": fields.List(fields.Str()), + } + + +class UPhoneImageInstanceSchema(schema.ResponseSchema): + """UPhoneImageInstance -""" + + fields = { + "AppVersions": fields.List(AppVersionInstanceSchema()), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "Description": fields.Str(required=False, load_from="Description"), + "ImageId": fields.Str(required=True, load_from="ImageId"), + "ImageName": fields.Str(required=True, load_from="ImageName"), + "ImageState": fields.Str(required=True, load_from="ImageState"), + "ImageType": fields.Str(required=True, load_from="ImageType"), + "ModifyTime": fields.Int(required=True, load_from="ModifyTime"), + "OsType": fields.Str(required=True, load_from="OsType"), + "UPhoneId": fields.Str(required=False, load_from="UPhoneId"), + } + + +class IpRegionSchema(schema.ResponseSchema): + """IpRegion - 独立IP地域信息""" + + fields = { + "Id": fields.Str(required=True, load_from="Id"), + "StockStatus": fields.Str(required=True, load_from="StockStatus"), + } + + +class TaskSchema(schema.ResponseSchema): + """Task -""" + + fields = { + "AppVersionId": fields.Str(required=False, load_from="AppVersionId"), + "BeginTime": fields.Int(required=True, load_from="BeginTime"), + "EndTime": fields.Int(required=True, load_from="EndTime"), + "ErrorMsg": fields.Str(required=True, load_from="ErrorMsg"), + "ExecuteMsg": fields.Str(required=False, load_from="ExecuteMsg"), + "State": fields.Str(required=True, load_from="State"), + "TaskId": fields.Str(required=True, load_from="TaskId"), + "UPhoneId": fields.Str(required=False, load_from="UPhoneId"), + } + + +class JobSchema(schema.ResponseSchema): + """Job -""" + + fields = { + "AppVersionId": fields.Str(required=False, load_from="AppVersionId"), + "BeginTime": fields.Int(required=False, load_from="BeginTime"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "EndTime": fields.Int(required=False, load_from="EndTime"), + "JobId": fields.Str(required=False, load_from="JobId"), + "JobType": fields.Str(required=False, load_from="JobType"), + "State": fields.Str(required=False, load_from="State"), + "Tasks": fields.List(TaskSchema()), + "UPhoneIds": fields.List(fields.Str()), + } + + +class UPhoneModelInstanceSchema(schema.ResponseSchema): + """UPhoneModelInstance -""" + + fields = { + "CPU": fields.Int(required=True, load_from="CPU"), + "Description": fields.Str(required=False, load_from="Description"), + "DiskSize": fields.Int(required=True, load_from="DiskSize"), + "Dpi": fields.Int(required=False, load_from="Dpi"), + "Memory": fields.Int(required=True, load_from="Memory"), + "Refresh": fields.Int(required=True, load_from="Refresh"), + "Resolution": fields.Str(required=True, load_from="Resolution"), + "UPhoneModelName": fields.Str( + required=True, load_from="UPhoneModelName" + ), + } + + +class ServerDiskSetSchema(schema.ResponseSchema): + """ServerDiskSet -""" + + fields = { + "DiskType": fields.Str(required=True, load_from="DiskType"), + "IsBoot": fields.Bool(required=True, load_from="IsBoot"), + "Size": fields.Int(required=True, load_from="Size"), + } + + +class UPhoneSpecSchema(schema.ResponseSchema): + """UPhoneSpec -""" + + fields = { + "UPhoneCount": fields.Int(required=False, load_from="UPhoneCount"), + "UPhoneModelName": fields.Str( + required=False, load_from="UPhoneModelName" + ), + } + + +class ServerModelInstanceSchema(schema.ResponseSchema): + """ServerModelInstance -""" + + fields = { + "CPU": fields.Int(required=False, load_from="CPU"), + "DiskSet": fields.List(ServerDiskSetSchema()), + "GPU": fields.Int(required=False, load_from="GPU"), + "GPUType": fields.Str(required=False, load_from="GPUType"), + "Memory": fields.Int(required=False, load_from="Memory"), + "ServerModelName": fields.Str( + required=False, load_from="ServerModelName" + ), + "ServerModelState": fields.Str( + required=False, load_from="ServerModelState" + ), + "UPhoneSpecs": fields.List(UPhoneSpecSchema()), + } + + +class IpSetSchema(schema.ResponseSchema): + """IpSet -""" + + fields = { + "Ip": fields.Str(required=False, load_from="Ip"), + "IpMode": fields.Str(required=False, load_from="IpMode"), + "IpType": fields.Str(required=False, load_from="IpType"), + "Isp": fields.Str(required=False, load_from="Isp"), + } + + +class ServerInstanceSchema(schema.ResponseSchema): + """ServerInstance -""" + + fields = { + "ChargeType": fields.Str(required=True, load_from="ChargeType"), + "CityId": fields.Str(required=True, load_from="CityId"), + "CityName": fields.Str(required=True, load_from="CityName"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "ExpireTime": fields.Int(required=True, load_from="ExpireTime"), + "IpSet": fields.List(IpSetSchema()), + "ModifyTime": fields.Int(required=True, load_from="ModifyTime"), + "Remark": fields.Str(required=False, load_from="Remark"), + "ServerId": fields.Str(required=True, load_from="ServerId"), + "ServerModel": ServerModelInstanceSchema(), + "ServerName": fields.Str(required=True, load_from="ServerName"), + "State": fields.Str(required=False, load_from="State"), + "UPhoneCount": fields.Int(required=False, load_from="UPhoneCount"), + "UPhoneModelName": fields.Str( + required=True, load_from="UPhoneModelName" + ), + } + + +class StockInfoSchema(schema.ResponseSchema): + """StockInfo - model的可用量信息""" + + fields = { + "ModelName": fields.Str(required=False, load_from="ModelName"), + "StockCount": fields.Int(required=False, load_from="StockCount"), + } + + +class ShareBandwidthInfoSchema(schema.ResponseSchema): + """ShareBandwidthInfo - 共享带宽信息""" + + fields = { + "Bandwidth": fields.Int(required=True, load_from="Bandwidth"), + "BindCount": fields.Int(required=False, load_from="BindCount"), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "Id": fields.Str(required=True, load_from="Id"), + "IpCount": fields.Int(required=False, load_from="IpCount"), + "IpProportion": fields.Int(required=True, load_from="IpProportion"), + "Name": fields.Str(required=False, load_from="Name"), + "Region": fields.Str(required=True, load_from="Region"), + "RemainCount": fields.Int(required=False, load_from="RemainCount"), + "Remark": fields.Str(required=False, load_from="Remark"), + } + + +class UPhoneAllowanceSchema(schema.ResponseSchema): + """UPhoneAllowance - 云手机余量结构体""" + + fields = { + "Allowance": fields.Int(required=True, load_from="Allowance"), + "ModelName": fields.Str(required=True, load_from="ModelName"), + } + + +class UPhonePriceSetSchema(schema.ResponseSchema): + """UPhonePriceSet - 云手机价格列表""" + + fields = { + "ChargeType": fields.Str(required=True, load_from="ChargeType"), + "ListPrice": fields.Float(required=False, load_from="ListPrice"), + "OriginalPrice": fields.Float(required=True, load_from="OriginalPrice"), + "Price": fields.Float(required=True, load_from="Price"), + } + + +class UPhoneServerPriceSetSchema(schema.ResponseSchema): + """UPhoneServerPriceSet - 价格列表""" + + fields = { + "ChargeType": fields.Str(required=True, load_from="ChargeType"), + "ListPrice": fields.Float(required=False, load_from="ListPrice"), + "OriginalPrice": fields.Float(required=True, load_from="OriginalPrice"), + "Price": fields.Float(required=True, load_from="Price"), + } + + +class UPhoneCommandResultSchema(schema.ResponseSchema): + """UPhoneCommandResult -""" + + fields = { + "ExecuteMsg": fields.Str(required=False, load_from="ExecuteMsg"), + "UPhoneId": fields.Str(required=False, load_from="UPhoneId"), + } + + +class ResultsSchema(schema.ResponseSchema): + """Results -""" + + fields = { + "ExecuteMsg": fields.Str(required=False, load_from="ExecuteMsg"), + "UPhoneId": fields.Str(required=False, load_from="UPhoneId"), + } diff --git a/ucloud/services/uphost/client.py b/ucloud/services/uphost/client.py index 2efca4ec..e2ba0e11 100644 --- a/ucloud/services/uphost/client.py +++ b/ucloud/services/uphost/client.py @@ -16,97 +16,194 @@ def __init__( ) def create_phost(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ CreatePHost - 指定数据中心,根据资源使用量创建指定数量的UPHost物理云主机实例。 + """CreatePHost - 指定数据中心,根据资源使用量创建指定数量的UPHost物理云主机实例。 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **ImageId** (str) - (Required) 镜像ID。 请通过 [DescribePHostImage]获取 + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ImageId** (str) - (Required) ImageId,可以通过接口 `DescribePHostImage `_ 获取 - **Password** (str) - (Required) 密码(密码需使用base64进行编码) - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - - **ChargeType** (str) - 计费模式,枚举值为:year, 按年付费; month,按月付费;dynamic,按需付费,(需开启权限) trial, 试用(需开启权限)。默认为按月付费 - - **Cluster** (str) - 网络环境,可选千兆:1G ,万兆:10G, 默认1G - - **Count** (int) - 购买数量,默认为1,(暂不支持) + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ActivityId** (int) - 短期促销活动时所需参数 + - **CharacterName** (str) - 授权角色名, K8S专用,其他用户忽略 + - **ChargeType** (str) - 计费模式,枚举值为:Year, 按年付费; Month,按月付费;默认按月付费 + - **Cluster** (str) - 网络环境,可选千兆:1G ,万兆:10G, 默认1G。智能网卡可以选择25G。 - **CouponId** (str) - 代金券 + - **Disks** (list) - 见 **CreatePHostParamDisks** 模型定义 - **Name** (str) - 物理机名称,默认为phost - - **Quantity** (str) - 购买时长,默认为1,范围[1-10] - - **Raid** (str) - Raid配置,默认Raid10 支持:Raid0、Raid1、Raid5、Raid10,NoRaid + - **NetworkInterface** (list) - 见 **CreatePHostParamNetworkInterface** 模型定义 + - **Quantity** (str) - 购买时长,1-10个月或1-10年;默认值为1。月付时,此参数传0,代表购买至月末,1代表整月。 + - **Raid** (str) - 本地盘和裸金属1.0需要的参数。Raid配置,默认Raid10 支持:Raid0、Raid1、Raid5、Raid10,NoRaid - **Remark** (str) - 物理机备注,默认为空 - - **SecurityGroupId** (str) - 防火墙Id,默认:Web推荐防火墙。如何查询SecurityGroupId请参见 `DescribeSecurityGroup `_ + - **RuleId** (int) - 短期促销活动时所需参数 + - **SecurityGroupId** (str) - 防火墙ID,默认:Web推荐防火墙。如何查询SecurityGroupId请参见 `DescribeFirewall `_ 。 - **SubnetId** (str) - 子网ID,不填为默认,VPC2.0下需要填写此字段。 - **Tag** (str) - 业务组,默认为default - **Type** (str) - 物理机类型,默认为:db-2(基础型-SAS-V3) - **VPCId** (str) - VPC ID,不填为默认,VPC2.0下需要填写此字段。 - + - **VpcIp** (str) - 指定内网ip创建 + **Response** - **PHostId** (list) - PHost的资源ID数组 - + + **Request Model** + + **CreatePHostParamDisks** + - **CouponId** (str) - 裸金属机型参数->云盘代金券id。不适用于系统盘。请通过DescribeCoupon接口查询,或登录用户中心查看 + - **IsBoot** (str) - 裸金属机型参数->是否是系统盘。枚举值: True,是系统盘。 False,是数据盘(默认)。Disks数组中有且只能有一块盘是系统盘。 + - **Size** (int) - 裸金属机型参数->磁盘大小,单位GB,必须是10GB的整数倍。系统盘20-500GB,数据盘单块盘20-32000GB。 + - **Type** (str) - 裸金属机型参数->磁盘类型:枚举值:CLOUD_RSSD + + + **CreatePHostParamNetworkInterfaceEIP** + - **Bandwidth** (str) - 【若绑定EIP,此参数必填】弹性IP的外网带宽, 单位为Mbps. 共享带宽模式必须指定0M带宽, 非共享带宽模式必须指定非0Mbps带宽. 各地域非共享带宽的带宽范围如下: 流量计费[1-300],带宽计费[1-800] + - **CouponId** (str) - 当前EIP代金券id。请通过DescribeCoupon接口查询,或登录用户中心查看。 + - **OperatorName** (str) - 【若绑定EIP,此参数必填】弹性IP的线路。枚举值: 国际: International BGP: Bgp 各地域允许的线路参数如下: cn-sh1: Bgp cn-sh2: Bgp cn-gd: Bgp cn-bj1: Bgp cn-bj2: Bgp hk: International us-ca: International th-bkk: International kr-seoul:International us-ws:International ge-fra:International sg:International tw-kh:International.其他海外线路均为 International + - **PayMode** (str) - 弹性IP的计费模式. 枚举值: "Traffic", 流量计费; "Bandwidth", 带宽计费; "ShareBandwidth",共享带宽模式. "Free":免费带宽模式,默认为 "Bandwidth" + - **ShareBandwidthId** (str) - 绑定的共享带宽Id,仅当PayMode为ShareBandwidth时有效 + + + **CreatePHostParamNetworkInterface** + - **EIP** (dict) - 见 **CreatePHostParamNetworkInterfaceEIP** 模型定义 + + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.CreatePHostRequestSchema().dumps(d) + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + resp = self.invoke("CreatePHost", d, **kwargs) return apis.CreatePHostResponseSchema().loads(resp) - def describe_phost( + def create_phost_image( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribePHost - 获取物理机详细信息 + """CreatePHostImage - 创建裸金属2.0用户自定义镜像 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **Limit** (int) - 返回数据长度,默认为20 - - **Offset** (int) - 数据偏移量,默认为0 - - **PHostId** (list) - PHost资源ID,若为空,则返回当前Region所有PHost。 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ImageName** (str) - (Required) 镜像名称 + - **PHostId** (str) - (Required) UPHost实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ImageDescription** (str) - 镜像描述 + **Response** - - **PHostSet** (list) - 见 **PHostSet** 模型定义 - - **TotalCount** (int) - 满足条件的PHost总数 - + - **ImageId** (str) - 镜像ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreatePHostImageRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreatePHostImage", d, **kwargs) + return apis.CreatePHostImageResponseSchema().loads(resp) + + def describe_baremetal_machine_type( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeBaremetalMachineType - 获取裸金属机型的详细描述信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Type** (str) - 具体机型。若不填写,则返回全部机型 + + **Response** + + - **MachineTypes** (list) - 见 **PHostCloudMachineTypeSet** 模型定义 + **Response Model** - - **PHostCPUSet** - + + **PHostCloudMachineTypeSet** + - **CPU** (dict) - 见 **PHostCPUSet** 模型定义 + - **Clusters** (list) - 见 **PHostClusterSet** 模型定义 + - **Components** (dict) - 见 **PHostComponentSet** 模型定义 + - **Memory** (int) - 内存大小,单位MB + - **Type** (str) - 物理云主机机型别名,全网唯一。 + + + **PHostCPUSet** - **CoreCount** (int) - CPU核数 - **Count** (int) - CPU个数 - **Frequence** (float) - CPU主频 - **Model** (str) - CPU型号 - **PHostDiskSet** - - - **Count** (int) - 磁盘数量 - - **IOCap** (int) - 磁盘IO性能,单位MB/s(待废弃) - - **Name** (str) - 磁盘名称,sys/data - - **Space** (int) - 单盘大小,单位GB - - **Type** (str) - 磁盘属性 - **PHostIPSet** - - - **Bandwidth** (int) - IP对应带宽,单位Mb,内网IP不显示带宽信息 - - **IPAddr** (str) - IP地址, - - **IPId** (str) - IP资源ID(内网IP无资源ID)(待废弃) - - **MACAddr** (str) - MAC地址 - - **OperatorName** (str) - 国际: Internation, BGP: BGP, 内网: Private - - **SubnetId** (str) - 子网ID - - **VPCId** (str) - VPC ID + **PHostClusterSet** + - **Name** (str) - 集群名。枚举值:千兆网络集群:1G;万兆网络集群:10G;智能网卡网络:25G; + - **StockStatus** (str) - 库存状态。枚举值:有库存:Available;无库存:SoldOut - **PHostSet** - + + **PHostComponentSet** + - **Count** (int) - 组件数量 + - **Name** (str) - 组件名称 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeBaremetalMachineTypeRequestSchema().dumps(d) + + resp = self.invoke("DescribeBaremetalMachineType", d, **kwargs) + return apis.DescribeBaremetalMachineTypeResponseSchema().loads(resp) + + def describe_phost( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribePHost - 获取物理机详细信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - 返回数据长度,默认为20 + - **Offset** (int) - 数据偏移量,默认为0 + - **PHostId** (list) - PHost资源ID,若为空,则返回当前Region所有PHost。 + - **UDiskIdForAttachment** (str) - 要挂载的云盘id,过滤返回能被UDiskId挂载的云主机。目前主要针对rssd云盘使用 + - **VPCId** (str) - ULB使用参数,获取同VPC下机器信息。 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **PHostSet** (list) - 见 **PHostSet** 模型定义 + - **TotalCount** (int) - 满足条件的PHost总数 + + **Response Model** + + **PHostSet** - **AutoRenew** (str) - 自动续费 + - **BootDiskState** (str) - 裸金属机型字段。枚举值:Normal=>正常、ImageMaking=>镜像制作中。 - **CPUSet** (dict) - 见 **PHostCPUSet** 模型定义 - - **ChargeType** (str) - 计费模式,枚举值为: Year,按年付费; Month,按月付费; Dynamic,按需付费(需开启权限); Trial,试用(需开启权限)默认为月付 + - **ChargeType** (str) - 计费模式,枚举值为: Year,按年付费; Month,按月付费;默认为月付 - **Cluster** (str) - 网络环境。枚举值:千兆:1G ,万兆:10G - **Components** (str) - 组件信息(暂不支持) - **CreateTime** (int) - 创建时间 - - **DiskSet** (list) - 见 **PHostDiskSet** 模型定义 + - **DiskSet** (list) - 见 **PHostDescDiskSet** 模型定义 - **ExpireTime** (int) - 到期时间 - **IPSet** (list) - 见 **PHostIPSet** 模型定义 - **ImageName** (str) - 镜像名称 @@ -117,17 +214,51 @@ def describe_phost( - **OSname** (str) - 操作系统名称 - **PHostId** (str) - PHost资源ID - **PHostType** (str) - 物理机类型,参见DescribePHostMachineType返回值 - - **PMStatus** (str) - 物理云主机状态。枚举值:\\ > 初始化:Initializing; \\ > 启动中:Starting; \\ > 运行中:Running;\\ > 关机中:Stopping; \\ > 安装失败:InstallFailed; \\ > 重启中:Rebooting;\\ > 关机:Stopped; + - **PMStatus** (str) - 物理云主机状态。枚举值:\\ > 初始化:Initializing; \\ > 启动中:Starting; \\ > 运行中:Running;\\ > 关机中:Stopping; \\ > 安装失败:InstallFailed; \\ > 重启中:Rebooting;\\ > 关机:Stopped; \\ > 迁移中(裸金属云盘):Migrating + - **PhostClass** (str) - 物理云产品类型,枚举值:LocalDisk=>代表传统本地盘机型, CloudDisk=>云盘裸金属机型 - **PowerState** (str) - 电源状态,on 或 off - **RaidSupported** (str) - 是否支持Raid。枚举值:Yes:支持;No:不支持。 + - **RdmaClusterId** (str) - RDMA集群id,仅云盘裸金属返回该值;其他类型物理云主机返回""。当物理机的此值与RSSD云盘的RdmaClusterId相同时,RSSD可以挂载到这台物理机。 - **Remark** (str) - 物理机备注 - **SN** (str) - 物理机序列号 - **Tag** (str) - 业务组 - - **Zone** (str) - 可用区,参见 `可用区列表 `_ + - **Zone** (str) - 可用区,参见 `可用区列表 `_ + + + **PHostCPUSet** + - **CoreCount** (int) - CPU核数 + - **Count** (int) - CPU个数 + - **Frequence** (float) - CPU主频 + - **Model** (str) - CPU型号 + + + **PHostDescDiskSet** + - **Count** (int) - 磁盘数量 + - **DiskId** (str) - 裸金属机型参数:磁盘ID + - **Drive** (str) - 裸金属机型参数:磁盘盘符 + - **IOCap** (int) - 磁盘IO性能,单位MB/s(待废弃) + - **IsBoot** (str) - 裸金属机型参数:是否是启动盘。True/False + - **Name** (str) - 磁盘名称,sys/data + - **Space** (int) - 单盘大小,单位GB + - **Type** (str) - 磁盘属性 + + + **PHostIPSet** + - **Bandwidth** (int) - IP对应带宽,单位Mb,内网IP不显示带宽信息 + - **IPAddr** (str) - IP地址, + - **IPId** (str) - IP资源ID(内网IP无资源ID)(待废弃) + - **MACAddr** (str) - MAC地址 + - **OperatorName** (str) - 国际: Internation, BGP: BGP, 内网: Private + - **SubnetId** (str) - 子网ID + - **VPCId** (str) - VPC ID + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribePHostRequestSchema().dumps(d) @@ -137,131 +268,319 @@ def describe_phost( def describe_phost_image( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribePHostImage - 获取物理云主机镜像列表 + """DescribePHostImage - 获取物理云主机镜像列表 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ - **ImageId** (list) - 镜像ID - - **ImageType** (str) - 镜像类别,枚举为:Base,标准镜像;默认为标准镜像。 + - **ImageType** (str) - 镜像类别,枚举值,Base是基础镜像;Custom是自制镜像。 - **Limit** (int) - 返回数据长度,默认为20 + - **MachineType** (str) - 机器型号,只支持当前zone的展示机型 - **Offset** (int) - 数据偏移量,默认为0 - + **Response** - **ImageSet** (list) - 见 **PHostImageSet** 模型定义 - **TotalCount** (int) - 满足条件的镜像总数 - + **Response Model** - - **PHostImageSet** - + + **PHostImageSet** + - **CreateTime** (int) - 裸金属2.0参数。镜像创建时间。 + - **ImageDescription** (str) - 镜像描述 - **ImageId** (str) - 镜像ID - **ImageName** (str) - 镜像名称 + - **ImageSize** (int) - 裸金属2.0参数。镜像大小。 + - **ImageType** (str) - 枚举值:Base=>基础镜像,Custom=>自制镜像。 - **OsName** (str) - 操作系统名称 - **OsType** (str) - 操作系统类型 + - **State** (str) - 裸金属2.0参数。镜像当前状态。 + - **Support** (list) - 支持的机型 + - **Version** (str) - 当前版本 + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribePHostImageRequestSchema().dumps(d) resp = self.invoke("DescribePHostImage", d, **kwargs) return apis.DescribePHostImageResponseSchema().loads(resp) + def describe_phost_machine_type( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribePHostMachineType - 获取物理云机型的详细描述信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Type** (str) - 具体机型。若不填写,则返回全部机型 + + **Response** + + - **MachineTypes** (list) - 见 **PHostMachineTypeSet** 模型定义 + + **Response Model** + + **PHostMachineTypeSet** + - **CPU** (dict) - 见 **PHostCPUSet** 模型定义 + - **Clusters** (list) - 见 **PHostClusterSet** 模型定义 + - **Components** (dict) - 见 **PHostComponentSet** 模型定义 + - **Disks** (list) - 见 **PHostDiskSet** 模型定义 + - **Memory** (int) - 内存大小,单位MB + - **RaidSupported** (str) - 是否支持Raid。枚举值:支持:YES;不支持:NO + - **Type** (str) - 物理云主机机型别名,全网唯一。 + + + **PHostCPUSet** + - **CoreCount** (int) - CPU核数 + - **Count** (int) - CPU个数 + - **Frequence** (float) - CPU主频 + - **Model** (str) - CPU型号 + + + **PHostClusterSet** + - **Name** (str) - 集群名。枚举值:千兆网络集群:1G;万兆网络集群:10G;智能网卡网络:25G; + - **StockStatus** (str) - 库存状态。枚举值:有库存:Available;无库存:SoldOut + + + **PHostComponentSet** + - **Count** (int) - 组件数量 + - **Name** (str) - 组件名称 + + + **PHostDiskSet** + - **Count** (int) - 磁盘数量 + - **IOCap** (int) - 磁盘IO性能,单位MB/s(待废弃) + - **Name** (str) - 磁盘名称,sys/data + - **Space** (int) - 单盘大小,单位GB + - **Type** (str) - 磁盘属性 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribePHostMachineTypeRequestSchema().dumps(d) + + resp = self.invoke("DescribePHostMachineType", d, **kwargs) + return apis.DescribePHostMachineTypeResponseSchema().loads(resp) + def describe_phost_tags( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribePHostTags - 获取物理机tag列表(业务组) + """DescribePHostTags - 获取物理机tag列表(业务组) **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **TagSet** (list) - 见 **PHostTagSet** 模型定义 - **TotalCount** (int) - Tag的个数 - + **Response Model** - - **PHostTagSet** - + + **PHostTagSet** - **Tag** (str) - 业务组名称 - **TotalCount** (int) - 该业务组中包含的主机个数 + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DescribePHostTagsRequestSchema().dumps(d) resp = self.invoke("DescribePHostTags", d, **kwargs) return apis.DescribePHostTagsResponseSchema().loads(resp) + def get_phost_disk_upgrade_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetPHostDiskUpgradePrice - 获取物理云裸金属挂载磁盘的升级价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DiskSpace** (int) - (Required) 磁盘大小,单位GB,必须是10GB的整数倍。系统盘20-500GB,数据盘单块盘20-32000GB。 + - **PHostId** (str) - (Required) UPHost实例ID。 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ReinstallTag** (bool) - 是否重装价格获取。复用此接口。扩容只能增加云盘大小。重装不限制。枚举值:true/false + - **UDiskId** (str) - 磁盘 ID。获取扩容价格必填(只能扩不能减);重装时候不需要填(根据所选盘大小决定) + + **Response** + + - **OriginalPrice** (float) - 升价差价原价。精度为小数点后2位。 + - **Price** (float) - 升级差价。精度为小数点后2位。 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetPHostDiskUpgradePriceRequestSchema().dumps(d) + + resp = self.invoke("GetPHostDiskUpgradePrice", d, **kwargs) + return apis.GetPHostDiskUpgradePriceResponseSchema().loads(resp) + def get_phost_price( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetPHostPrice - 获取物理机价格列表 + """GetPHostPrice - 获取物理机价格列表 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **ChargeType** (str) - (Required) 计费模式,枚举值为: Year/Month/Trial/Dynamic + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ChargeType** (str) - (Required) 计费模式,枚举值为: Year/Month - **Count** (int) - (Required) 购买数量,范围[1-5] - - **Quantity** (int) - (Required) 购买时长,1-10个月或1-10年 - - **Cluster** (str) - 网络环境,可选千兆:1G ,万兆:10G - - **Type** (str) - 默认为:DB(数据库型) - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Quantity** (int) - (Required) 购买时长,1-10个月或1-10年;默认值为1。月付时,此参数传0,代表购买至月末,1代表整月。 + - **Cluster** (str) - 网络环境,可选千兆:1G ;万兆:10G;25G网络:25G。 + - **Disks** (list) - 见 **GetPHostPriceParamDisks** 模型定义 + - **Type** (str) - 默认为:DB(数据库型),可以通过接口 `DescribePHostMachineType `_ 获取 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **PriceSet** (list) - 见 **PHostPriceSet** 模型定义 - + + **Request Model** + + **GetPHostPriceParamDisks** + - **IsBoot** (str) - 裸金属机型参数->枚举值:\\ > True,是系统盘 \\ > False,是数据盘(默认)。Disks数组中有且只能有一块盘是系统盘。 + - **Size** (str) - 裸金属机型参数->磁盘大小,单位GB,必须是10GB的整数倍。系统盘20-500GB。数据盘是20-32000G。 + - **Type** (str) - 裸金属机型参数->磁盘类型:枚举值:CLOUD_RSSD + + **Response Model** - - **PHostPriceSet** - - - **ChargeType** (str) - Year/Month/Trial/Dynamic + + **PHostPriceSet** + - **ChargeType** (str) - Year/Month + - **OriginalPrice** (float) - 原价格, 单位:元, 保留小数点后两位有效数字 - **Price** (float) - 价格, 单位:元, 保留小数点后两位有效数字 + - **Product** (str) - 枚举值:phost=>为主机价格,如果是云盘包括了系统盘价格。cloudDisk=>所有数据盘价格,只是裸金属机型才返回此参数。 + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.GetPHostPriceRequestSchema().dumps(d) resp = self.invoke("GetPHostPrice", d, **kwargs) return apis.GetPHostPriceResponseSchema().loads(resp) + def get_phost_disk_upgrade_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetPhostDiskUpgradePrice - 获取物理云裸金属挂载磁盘的升级价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DiskId** (str) - (Required) 磁盘ID。 + - **DiskSpace** (int) - (Required) 裸金属机型参数->磁盘大小,单位GB,必须是10GB的整数倍。系统盘20-500GB,数据盘单块盘20-32000GB。 + - **PHostId** (str) - (Required) UPHost实例ID。 + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Price** (float) - 升级差价。精度为小数点后2位。 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetPhostDiskUpgradePriceRequestSchema().dumps(d) + + resp = self.invoke("GetPhostDiskUpgradePrice", d, **kwargs) + return apis.GetPhostDiskUpgradePriceResponseSchema().loads(resp) + + def modify_phost_image_info( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyPHostImageInfo - 修改自定义镜像名称和备注 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ImageId** (str) - (Required) 镜像ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Name** (str) - 镜像名称 + - **Remark** (str) - 备注 + + **Response** + + - **ImageId** (str) - 镜像ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyPHostImageInfoRequestSchema().dumps(d) + + resp = self.invoke("ModifyPHostImageInfo", d, **kwargs) + return apis.ModifyPHostImageInfoResponseSchema().loads(resp) + def modify_phost_info( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ModifyPHostInfo - 更改物理机信息 + """ModifyPHostInfo - 更改物理机信息 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **PHostId** (str) - (Required) 物理机资源ID - **Name** (str) - 物理机名称,默认不更改 - **Remark** (str) - 物理机备注,默认不更改 - **Tag** (str) - 业务组,默认不更改 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **PHostId** (str) - PHost 的资源ID - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.ModifyPHostInfoRequestSchema().dumps(d) @@ -271,22 +590,25 @@ def modify_phost_info( def poweroff_phost( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ PoweroffPHost - 断电物理云主机 + """PoweroffPHost - 断电物理云主机 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **PHostId** (str) - (Required) PHost资源ID - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **PHostId** (str) - PHost 的资源ID - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.PoweroffPHostRequestSchema().dumps(d) @@ -294,22 +616,25 @@ def poweroff_phost( return apis.PoweroffPHostResponseSchema().loads(resp) def reboot_phost(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ RebootPHost - 重启物理机 + """RebootPHost - 重启物理机 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **PHostId** (str) - (Required) PHost资源ID - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **PHostId** (str) - PHost 的资源ID - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.RebootPHostRequestSchema().dumps(d) @@ -319,80 +644,204 @@ def reboot_phost(self, req: typing.Optional[dict] = None, **kwargs) -> dict: def reinstall_phost( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ReinstallPHost - 重装物理机操作系统 + """ReinstallPHost - 重装物理机操作系统 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **PHostId** (str) - (Required) PHost资源ID - **Password** (str) - (Required) 密码 - - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **BootDiskSpace** (int) - 裸金属机型参数->系统盘大小。 单位:GB, 范围[20,500], 步长:10 - **ImageId** (str) - 镜像Id,参考镜像列表,默认使用原镜像 - **Name** (str) - 物理机名称,默认不更改 - **Raid** (str) - 不保留数据盘重装,可选Raid - **Remark** (str) - 物理机备注,默认为不更改。 - **ReserveDisk** (str) - 是否保留数据盘,保留:Yes,不报留:No, 默认:Yes - **Tag** (str) - 业务组,默认不更改。 - + **Response** - **PHostId** (str) - PHost 的资源ID - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.ReinstallPHostRequestSchema().dumps(d) resp = self.invoke("ReinstallPHost", d, **kwargs) return apis.ReinstallPHostResponseSchema().loads(resp) + def reset_phost_password( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ResetPHostPassword - 重置裸金属实例的管理员密码 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **PHostId** (str) - (Required) 裸金属实例ID + - **Password** (str) - (Required) PHost新密码(密码格式使用BASE64编码) + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **PHostId** (str) - 裸金属实例ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ResetPHostPasswordRequestSchema().dumps(d) + + resp = self.invoke("ResetPHostPassword", d, **kwargs) + return apis.ResetPHostPasswordResponseSchema().loads(resp) + + def resize_phost_attached_disk( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ResizePHostAttachedDisk - 修改裸金属物理云已经挂载的云盘容量大小 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **DiskSpace** (int) - 裸金属机型参数->磁盘大小,单位GB,必须是10GB的整数倍。系统盘20-500GB,数据盘单块盘20-32000GB。 + - **PHostId** (str) - UPHost实例ID。 + - **UDiskId** (str) - 磁盘ID。 + + **Response** + + - **UDiskId** (str) - 改配成功的磁盘id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ResizePHostAttachedDiskRequestSchema().dumps(d) + + resp = self.invoke("ResizePHostAttachedDisk", d, **kwargs) + return apis.ResizePHostAttachedDiskResponseSchema().loads(resp) + def start_phost(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ StartPHost - 启动物理机 + """StartPHost - 启动物理机 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **PHostId** (str) - (Required) PHost资源ID - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **PHostId** (str) - PHost 的资源ID - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.StartPHostRequestSchema().dumps(d) resp = self.invoke("StartPHost", d, **kwargs) return apis.StartPHostResponseSchema().loads(resp) + def stop_phost(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """StopPHost - 关闭物理机 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **PHostId** (str) - (Required) PHost资源ID + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **PHostId** (str) - PHost 的资源ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.StopPHostRequestSchema().dumps(d) + + resp = self.invoke("StopPHost", d, **kwargs) + return apis.StopPHostResponseSchema().loads(resp) + def terminate_phost( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ TerminatePHost - 删除物理云主机 + """TerminatePHost - 删除物理云主机 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **PHostId** (str) - (Required) PHost资源ID - **ReleaseEIP** (bool) - 是否释放绑定的EIP。true: 解绑EIP后,并释放;其他值或不填:解绑EIP。 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **ReleaseUDisk** (bool) - 裸金属机型参数->删除主机时是否同时删除挂载的数据盘。默认为false。 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **PHostId** (str) - PHost 的资源ID - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.TerminatePHostRequestSchema().dumps(d) resp = self.invoke("TerminatePHost", d, **kwargs) return apis.TerminatePHostResponseSchema().loads(resp) + + def terminate_phost_image( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """TerminatePHostImage - 删除裸金属2.0用户自定义镜像 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ImageId** (str) - (Required) 自制镜像ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **ImageId** (str) - 自制镜像ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.TerminatePHostImageRequestSchema().dumps(d) + + resp = self.invoke("TerminatePHostImage", d, **kwargs) + return apis.TerminatePHostImageResponseSchema().loads(resp) diff --git a/ucloud/services/uphost/schemas/apis.py b/ucloud/services/uphost/schemas/apis.py index 19ff4c8b..8eb82e19 100644 --- a/ucloud/services/uphost/schemas/apis.py +++ b/ucloud/services/uphost/schemas/apis.py @@ -3,7 +3,6 @@ from ucloud.core.typesystem import schema, fields from ucloud.services.uphost.schemas import models - """ UPHost API Schema """ @@ -15,23 +14,66 @@ """ +class CreatePHostParamDisksSchema(schema.RequestSchema): + """CreatePHostParamDisks -""" + + fields = { + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "IsBoot": fields.Str(required=False, dump_to="IsBoot"), + "Size": fields.Int(required=False, dump_to="Size"), + "Type": fields.Str(required=False, dump_to="Type"), + } + + +class CreatePHostParamNetworkInterfaceEIPSchema(schema.RequestSchema): + """CreatePHostParamNetworkInterfaceEIP -""" + + fields = { + "Bandwidth": fields.Str(required=False, dump_to="Bandwidth"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "OperatorName": fields.Str(required=False, dump_to="OperatorName"), + "PayMode": fields.Str(required=False, dump_to="PayMode"), + "ShareBandwidthId": fields.Str( + required=False, dump_to="ShareBandwidthId" + ), + } + + +class CreatePHostParamNetworkInterfaceSchema(schema.RequestSchema): + """CreatePHostParamNetworkInterface -""" + + fields = { + "EIP": CreatePHostParamNetworkInterfaceEIPSchema( + required=False, dump_to="EIP" + ), + } + + class CreatePHostRequestSchema(schema.RequestSchema): - """ CreatePHost - 指定数据中心,根据资源使用量创建指定数量的UPHost物理云主机实例。 - """ + """CreatePHost - 指定数据中心,根据资源使用量创建指定数量的UPHost物理云主机实例。""" fields = { + "ActivityId": fields.Int(required=False, dump_to="ActivityId"), + "CharacterName": fields.Str(required=False, dump_to="CharacterName"), "ChargeType": fields.Str(required=False, dump_to="ChargeType"), "Cluster": fields.Str(required=False, dump_to="Cluster"), - "Count": fields.Int(required=False, dump_to="Count"), + "Count": fields.Int( + required=False, dump_to="Count" + ), # Deprecated, will be removed at 1.0 "CouponId": fields.Str(required=False, dump_to="CouponId"), + "Disks": fields.List(CreatePHostParamDisksSchema()), "ImageId": fields.Str(required=True, dump_to="ImageId"), "Name": fields.Str(required=False, dump_to="Name"), + "NetworkInterface": fields.List( + CreatePHostParamNetworkInterfaceSchema() + ), "Password": fields.Str(required=True, dump_to="Password"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Quantity": fields.Str(required=False, dump_to="Quantity"), "Raid": fields.Str(required=False, dump_to="Raid"), "Region": fields.Str(required=True, dump_to="Region"), "Remark": fields.Str(required=False, dump_to="Remark"), + "RuleId": fields.Int(required=False, dump_to="RuleId"), "SecurityGroupId": fields.Str( required=False, dump_to="SecurityGroupId" ), @@ -39,18 +81,78 @@ class CreatePHostRequestSchema(schema.RequestSchema): "Tag": fields.Str(required=False, dump_to="Tag"), "Type": fields.Str(required=False, dump_to="Type"), "VPCId": fields.Str(required=False, dump_to="VPCId"), + "VpcIp": fields.Str(required=False, dump_to="VpcIp"), "Zone": fields.Str(required=True, dump_to="Zone"), } class CreatePHostResponseSchema(schema.ResponseSchema): - """ CreatePHost - 指定数据中心,根据资源使用量创建指定数量的UPHost物理云主机实例。 - """ + """CreatePHost - 指定数据中心,根据资源使用量创建指定数量的UPHost物理云主机实例。""" fields = { "PHostId": fields.List( fields.Str(), required=False, load_from="PHostId" - ) + ), + } + + +""" +API: CreatePHostImage + +创建裸金属2.0用户自定义镜像 +""" + + +class CreatePHostImageRequestSchema(schema.RequestSchema): + """CreatePHostImage - 创建裸金属2.0用户自定义镜像""" + + fields = { + "ImageDescription": fields.Str( + required=False, dump_to="ImageDescription" + ), + "ImageName": fields.Str(required=True, dump_to="ImageName"), + "PHostId": fields.Str(required=True, dump_to="PHostId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreatePHostImageResponseSchema(schema.ResponseSchema): + """CreatePHostImage - 创建裸金属2.0用户自定义镜像""" + + fields = { + "ImageId": fields.Str(required=True, load_from="ImageId"), + } + + +""" +API: DescribeBaremetalMachineType + +获取裸金属机型的详细描述信息 +""" + + +class DescribeBaremetalMachineTypeRequestSchema(schema.RequestSchema): + """DescribeBaremetalMachineType - 获取裸金属机型的详细描述信息""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Type": fields.Str(required=False, dump_to="Type"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeBaremetalMachineTypeResponseSchema(schema.ResponseSchema): + """DescribeBaremetalMachineType - 获取裸金属机型的详细描述信息""" + + fields = { + "MachineTypes": fields.List( + models.PHostCloudMachineTypeSetSchema(), + required=False, + load_from="MachineTypes", + ), } @@ -62,8 +164,7 @@ class CreatePHostResponseSchema(schema.ResponseSchema): class DescribePHostRequestSchema(schema.RequestSchema): - """ DescribePHost - 获取物理机详细信息 - """ + """DescribePHost - 获取物理机详细信息""" fields = { "Limit": fields.Int(required=False, dump_to="Limit"), @@ -71,13 +172,16 @@ class DescribePHostRequestSchema(schema.RequestSchema): "PHostId": fields.List(fields.Str()), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), + "UDiskIdForAttachment": fields.Str( + required=False, dump_to="UDiskIdForAttachment" + ), + "VPCId": fields.Str(required=False, dump_to="VPCId"), "Zone": fields.Str(required=False, dump_to="Zone"), } class DescribePHostResponseSchema(schema.ResponseSchema): - """ DescribePHost - 获取物理机详细信息 - """ + """DescribePHost - 获取物理机详细信息""" fields = { "PHostSet": fields.List( @@ -95,13 +199,13 @@ class DescribePHostResponseSchema(schema.ResponseSchema): class DescribePHostImageRequestSchema(schema.RequestSchema): - """ DescribePHostImage - 获取物理云主机镜像列表 - """ + """DescribePHostImage - 获取物理云主机镜像列表""" fields = { "ImageId": fields.List(fields.Str()), "ImageType": fields.Str(required=False, dump_to="ImageType"), "Limit": fields.Int(required=False, dump_to="Limit"), + "MachineType": fields.Str(required=False, dump_to="MachineType"), "Offset": fields.Int(required=False, dump_to="Offset"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), @@ -110,8 +214,7 @@ class DescribePHostImageRequestSchema(schema.RequestSchema): class DescribePHostImageResponseSchema(schema.ResponseSchema): - """ DescribePHostImage - 获取物理云主机镜像列表 - """ + """DescribePHostImage - 获取物理云主机镜像列表""" fields = { "ImageSet": fields.List( @@ -121,6 +224,36 @@ class DescribePHostImageResponseSchema(schema.ResponseSchema): } +""" +API: DescribePHostMachineType + +获取物理云机型的详细描述信息 +""" + + +class DescribePHostMachineTypeRequestSchema(schema.RequestSchema): + """DescribePHostMachineType - 获取物理云机型的详细描述信息""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Type": fields.Str(required=False, dump_to="Type"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribePHostMachineTypeResponseSchema(schema.ResponseSchema): + """DescribePHostMachineType - 获取物理云机型的详细描述信息""" + + fields = { + "MachineTypes": fields.List( + models.PHostMachineTypeSetSchema(), + required=True, + load_from="MachineTypes", + ), + } + + """ API: DescribePHostTags @@ -129,8 +262,7 @@ class DescribePHostImageResponseSchema(schema.ResponseSchema): class DescribePHostTagsRequestSchema(schema.RequestSchema): - """ DescribePHostTags - 获取物理机tag列表(业务组) - """ + """DescribePHostTags - 获取物理机tag列表(业务组)""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -140,8 +272,7 @@ class DescribePHostTagsRequestSchema(schema.RequestSchema): class DescribePHostTagsResponseSchema(schema.ResponseSchema): - """ DescribePHostTags - 获取物理机tag列表(业务组) - """ + """DescribePHostTags - 获取物理机tag列表(业务组)""" fields = { "TagSet": fields.List( @@ -151,6 +282,38 @@ class DescribePHostTagsResponseSchema(schema.ResponseSchema): } +""" +API: GetPHostDiskUpgradePrice + +获取物理云裸金属挂载磁盘的升级价格 +""" + + +class GetPHostDiskUpgradePriceRequestSchema(schema.RequestSchema): + """GetPHostDiskUpgradePrice - 获取物理云裸金属挂载磁盘的升级价格""" + + fields = { + "DiskSpace": fields.Int(required=True, dump_to="DiskSpace"), + "PHostId": fields.Str(required=True, dump_to="PHostId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ReinstallTag": fields.Bool(required=False, dump_to="ReinstallTag"), + "UDiskId": fields.Str(required=False, dump_to="UDiskId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetPHostDiskUpgradePriceResponseSchema(schema.ResponseSchema): + """GetPHostDiskUpgradePrice - 获取物理云裸金属挂载磁盘的升级价格""" + + fields = { + "OriginalPrice": fields.Float( + required=False, load_from="OriginalPrice" + ), + "Price": fields.Float(required=True, load_from="Price"), + } + + """ API: GetPHostPrice @@ -158,14 +321,24 @@ class DescribePHostTagsResponseSchema(schema.ResponseSchema): """ +class GetPHostPriceParamDisksSchema(schema.RequestSchema): + """GetPHostPriceParamDisks -""" + + fields = { + "IsBoot": fields.Str(required=False, dump_to="IsBoot"), + "Size": fields.Str(required=False, dump_to="Size"), + "Type": fields.Str(required=False, dump_to="Type"), + } + + class GetPHostPriceRequestSchema(schema.RequestSchema): - """ GetPHostPrice - 获取物理机价格列表 - """ + """GetPHostPrice - 获取物理机价格列表""" fields = { "ChargeType": fields.Str(required=True, dump_to="ChargeType"), "Cluster": fields.Str(required=False, dump_to="Cluster"), "Count": fields.Int(required=True, dump_to="Count"), + "Disks": fields.List(GetPHostPriceParamDisksSchema()), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Quantity": fields.Int(required=True, dump_to="Quantity"), "Region": fields.Str(required=True, dump_to="Region"), @@ -175,13 +348,68 @@ class GetPHostPriceRequestSchema(schema.RequestSchema): class GetPHostPriceResponseSchema(schema.ResponseSchema): - """ GetPHostPrice - 获取物理机价格列表 - """ + """GetPHostPrice - 获取物理机价格列表""" fields = { "PriceSet": fields.List( models.PHostPriceSetSchema(), required=False, load_from="PriceSet" - ) + ), + } + + +""" +API: GetPhostDiskUpgradePrice + +获取物理云裸金属挂载磁盘的升级价格 +""" + + +class GetPhostDiskUpgradePriceRequestSchema(schema.RequestSchema): + """GetPhostDiskUpgradePrice - 获取物理云裸金属挂载磁盘的升级价格""" + + fields = { + "DiskId": fields.Str(required=True, dump_to="DiskId"), + "DiskSpace": fields.Int(required=True, dump_to="DiskSpace"), + "PHostId": fields.Str(required=True, dump_to="PHostId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class GetPhostDiskUpgradePriceResponseSchema(schema.ResponseSchema): + """GetPhostDiskUpgradePrice - 获取物理云裸金属挂载磁盘的升级价格""" + + fields = { + "Price": fields.Float(required=True, load_from="Price"), + } + + +""" +API: ModifyPHostImageInfo + +修改自定义镜像名称和备注 +""" + + +class ModifyPHostImageInfoRequestSchema(schema.RequestSchema): + """ModifyPHostImageInfo - 修改自定义镜像名称和备注""" + + fields = { + "ImageId": fields.Str(required=True, dump_to="ImageId"), + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ModifyPHostImageInfoResponseSchema(schema.ResponseSchema): + """ModifyPHostImageInfo - 修改自定义镜像名称和备注""" + + fields = { + "ImageId": fields.Str(required=False, load_from="ImageId"), } @@ -193,8 +421,7 @@ class GetPHostPriceResponseSchema(schema.ResponseSchema): class ModifyPHostInfoRequestSchema(schema.RequestSchema): - """ ModifyPHostInfo - 更改物理机信息 - """ + """ModifyPHostInfo - 更改物理机信息""" fields = { "Name": fields.Str(required=False, dump_to="Name"), @@ -208,10 +435,11 @@ class ModifyPHostInfoRequestSchema(schema.RequestSchema): class ModifyPHostInfoResponseSchema(schema.ResponseSchema): - """ ModifyPHostInfo - 更改物理机信息 - """ + """ModifyPHostInfo - 更改物理机信息""" - fields = {"PHostId": fields.Str(required=False, load_from="PHostId")} + fields = { + "PHostId": fields.Str(required=False, load_from="PHostId"), + } """ @@ -222,8 +450,7 @@ class ModifyPHostInfoResponseSchema(schema.ResponseSchema): class PoweroffPHostRequestSchema(schema.RequestSchema): - """ PoweroffPHost - 断电物理云主机 - """ + """PoweroffPHost - 断电物理云主机""" fields = { "PHostId": fields.Str(required=True, dump_to="PHostId"), @@ -234,10 +461,11 @@ class PoweroffPHostRequestSchema(schema.RequestSchema): class PoweroffPHostResponseSchema(schema.ResponseSchema): - """ PoweroffPHost - 断电物理云主机 - """ + """PoweroffPHost - 断电物理云主机""" - fields = {"PHostId": fields.Str(required=False, load_from="PHostId")} + fields = { + "PHostId": fields.Str(required=False, load_from="PHostId"), + } """ @@ -248,8 +476,7 @@ class PoweroffPHostResponseSchema(schema.ResponseSchema): class RebootPHostRequestSchema(schema.RequestSchema): - """ RebootPHost - 重启物理机 - """ + """RebootPHost - 重启物理机""" fields = { "PHostId": fields.Str(required=True, dump_to="PHostId"), @@ -260,10 +487,11 @@ class RebootPHostRequestSchema(schema.RequestSchema): class RebootPHostResponseSchema(schema.ResponseSchema): - """ RebootPHost - 重启物理机 - """ + """RebootPHost - 重启物理机""" - fields = {"PHostId": fields.Str(required=False, load_from="PHostId")} + fields = { + "PHostId": fields.Str(required=False, load_from="PHostId"), + } """ @@ -274,10 +502,10 @@ class RebootPHostResponseSchema(schema.ResponseSchema): class ReinstallPHostRequestSchema(schema.RequestSchema): - """ ReinstallPHost - 重装物理机操作系统 - """ + """ReinstallPHost - 重装物理机操作系统""" fields = { + "BootDiskSpace": fields.Int(required=False, dump_to="BootDiskSpace"), "ImageId": fields.Str(required=False, dump_to="ImageId"), "Name": fields.Str(required=False, dump_to="Name"), "PHostId": fields.Str(required=True, dump_to="PHostId"), @@ -293,10 +521,66 @@ class ReinstallPHostRequestSchema(schema.RequestSchema): class ReinstallPHostResponseSchema(schema.ResponseSchema): - """ ReinstallPHost - 重装物理机操作系统 - """ + """ReinstallPHost - 重装物理机操作系统""" + + fields = { + "PHostId": fields.Str(required=False, load_from="PHostId"), + } + + +""" +API: ResetPHostPassword + +重置裸金属实例的管理员密码 +""" + + +class ResetPHostPasswordRequestSchema(schema.RequestSchema): + """ResetPHostPassword - 重置裸金属实例的管理员密码""" + + fields = { + "PHostId": fields.Str(required=True, dump_to="PHostId"), + "Password": fields.Str(required=True, dump_to="Password"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ResetPHostPasswordResponseSchema(schema.ResponseSchema): + """ResetPHostPassword - 重置裸金属实例的管理员密码""" + + fields = { + "PHostId": fields.Str(required=True, load_from="PHostId"), + } + + +""" +API: ResizePHostAttachedDisk + +修改裸金属物理云已经挂载的云盘容量大小 +""" + + +class ResizePHostAttachedDiskRequestSchema(schema.RequestSchema): + """ResizePHostAttachedDisk - 修改裸金属物理云已经挂载的云盘容量大小""" + + fields = { + "DiskSpace": fields.Int(required=False, dump_to="DiskSpace"), + "PHostId": fields.Str(required=False, dump_to="PHostId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UDiskId": fields.Str(required=False, dump_to="UDiskId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + - fields = {"PHostId": fields.Str(required=False, load_from="PHostId")} +class ResizePHostAttachedDiskResponseSchema(schema.ResponseSchema): + """ResizePHostAttachedDisk - 修改裸金属物理云已经挂载的云盘容量大小""" + + fields = { + "UDiskId": fields.Str(required=False, load_from="UDiskId"), + } """ @@ -307,8 +591,7 @@ class ReinstallPHostResponseSchema(schema.ResponseSchema): class StartPHostRequestSchema(schema.RequestSchema): - """ StartPHost - 启动物理机 - """ + """StartPHost - 启动物理机""" fields = { "PHostId": fields.Str(required=True, dump_to="PHostId"), @@ -319,10 +602,37 @@ class StartPHostRequestSchema(schema.RequestSchema): class StartPHostResponseSchema(schema.ResponseSchema): - """ StartPHost - 启动物理机 - """ + """StartPHost - 启动物理机""" + + fields = { + "PHostId": fields.Str(required=False, load_from="PHostId"), + } + + +""" +API: StopPHost + +关闭物理机 +""" + + +class StopPHostRequestSchema(schema.RequestSchema): + """StopPHost - 关闭物理机""" + + fields = { + "PHostId": fields.Str(required=True, dump_to="PHostId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + - fields = {"PHostId": fields.Str(required=False, load_from="PHostId")} +class StopPHostResponseSchema(schema.ResponseSchema): + """StopPHost - 关闭物理机""" + + fields = { + "PHostId": fields.Str(required=True, load_from="PHostId"), + } """ @@ -333,20 +643,47 @@ class StartPHostResponseSchema(schema.ResponseSchema): class TerminatePHostRequestSchema(schema.RequestSchema): - """ TerminatePHost - 删除物理云主机 - """ + """TerminatePHost - 删除物理云主机""" fields = { "PHostId": fields.Str(required=True, dump_to="PHostId"), "ProjectId": fields.Str(required=True, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "ReleaseEIP": fields.Bool(required=False, dump_to="ReleaseEIP"), + "ReleaseUDisk": fields.Bool(required=False, dump_to="ReleaseUDisk"), "Zone": fields.Str(required=False, dump_to="Zone"), } class TerminatePHostResponseSchema(schema.ResponseSchema): - """ TerminatePHost - 删除物理云主机 - """ + """TerminatePHost - 删除物理云主机""" + + fields = { + "PHostId": fields.Str(required=False, load_from="PHostId"), + } + + +""" +API: TerminatePHostImage - fields = {"PHostId": fields.Str(required=False, load_from="PHostId")} +删除裸金属2.0用户自定义镜像 +""" + + +class TerminatePHostImageRequestSchema(schema.RequestSchema): + """TerminatePHostImage - 删除裸金属2.0用户自定义镜像""" + + fields = { + "ImageId": fields.Str(required=True, dump_to="ImageId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class TerminatePHostImageResponseSchema(schema.ResponseSchema): + """TerminatePHostImage - 删除裸金属2.0用户自定义镜像""" + + fields = { + "ImageId": fields.Str(required=True, load_from="ImageId"), + } diff --git a/ucloud/services/uphost/schemas/models.py b/ucloud/services/uphost/schemas/models.py index efbe9d2e..ae2ff79a 100644 --- a/ucloud/services/uphost/schemas/models.py +++ b/ucloud/services/uphost/schemas/models.py @@ -1,107 +1,175 @@ -""" Code is generated by ucloud-model, DO NOT EDIT IT. """ - -from ucloud.core.typesystem import schema, fields - - -class PHostIPSetSchema(schema.ResponseSchema): - """ PHostIPSet - DescribePHost - """ - - fields = { - "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), - "IPAddr": fields.Str(required=False, load_from="IPAddr"), - "IPId": fields.Str(required=False, load_from="IPId"), - "MACAddr": fields.Str(required=False, load_from="MACAddr"), - "OperatorName": fields.Str(required=False, load_from="OperatorName"), - "SubnetId": fields.Str(required=False, load_from="SubnetId"), - "VPCId": fields.Str(required=False, load_from="VPCId"), - } - - -class PHostDiskSetSchema(schema.ResponseSchema): - """ PHostDiskSet - GetPHostTypeInfo - """ - - fields = { - "Count": fields.Int(required=False, load_from="Count"), - "IOCap": fields.Int(required=False, load_from="IOCap"), - "Name": fields.Str(required=False, load_from="Name"), - "Space": fields.Int(required=False, load_from="Space"), - "Type": fields.Str(required=False, load_from="Type"), - } - - -class PHostCPUSetSchema(schema.ResponseSchema): - """ PHostCPUSet - DescribePHost - """ - - fields = { - "CoreCount": fields.Int(required=False, load_from="CoreCount"), - "Count": fields.Int(required=False, load_from="Count"), - "Frequence": fields.Float(required=False, load_from="Frequence"), - "Model": fields.Str(required=False, load_from="Model"), - } - - -class PHostSetSchema(schema.ResponseSchema): - """ PHostSet - DescribePHost - """ - - fields = { - "AutoRenew": fields.Str(required=False, load_from="AutoRenew"), - "CPUSet": PHostCPUSetSchema(), - "ChargeType": fields.Str(required=False, load_from="ChargeType"), - "Cluster": fields.Str(required=False, load_from="Cluster"), - "Components": fields.Str(required=False, load_from="Components"), - "CreateTime": fields.Int(required=False, load_from="CreateTime"), - "DiskSet": fields.List(PHostDiskSetSchema()), - "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), - "IPSet": fields.List(PHostIPSetSchema()), - "ImageName": fields.Str(required=False, load_from="ImageName"), - "IsSupportKVM": fields.Str(required=False, load_from="IsSupportKVM"), - "Memory": fields.Int(required=False, load_from="Memory"), - "Name": fields.Str(required=False, load_from="Name"), - "OSType": fields.Str(required=False, load_from="OSType"), - "OSname": fields.Str(required=False, load_from="OSname"), - "PHostId": fields.Str(required=False, load_from="PHostId"), - "PHostType": fields.Str(required=False, load_from="PHostType"), - "PMStatus": fields.Str(required=False, load_from="PMStatus"), - "PowerState": fields.Str(required=False, load_from="PowerState"), - "RaidSupported": fields.Str(required=False, load_from="RaidSupported"), - "Remark": fields.Str(required=False, load_from="Remark"), - "SN": fields.Str(required=False, load_from="SN"), - "Tag": fields.Str(required=False, load_from="Tag"), - "Zone": fields.Str(required=False, load_from="Zone"), - } - - -class PHostImageSetSchema(schema.ResponseSchema): - """ PHostImageSet - DescribePHostImage - """ - - fields = { - "ImageId": fields.Str(required=False, load_from="ImageId"), - "ImageName": fields.Str(required=False, load_from="ImageName"), - "OsName": fields.Str(required=False, load_from="OsName"), - "OsType": fields.Str(required=False, load_from="OsType"), - } - - -class PHostTagSetSchema(schema.ResponseSchema): - """ PHostTagSet - DescribePHostTags - """ - - fields = { - "Tag": fields.Str(required=False, load_from="Tag"), - "TotalCount": fields.Int(required=False, load_from="TotalCount"), - } - - -class PHostPriceSetSchema(schema.ResponseSchema): - """ PHostPriceSet - GetPHostPrice - """ - - fields = { - "ChargeType": fields.Str(required=False, load_from="ChargeType"), - "Price": fields.Float(required=False, load_from="Price"), - } +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class PHostComponentSetSchema(schema.ResponseSchema): + """PHostComponentSet - GetPHostTypeInfo""" + + fields = { + "Count": fields.Int(required=False, load_from="Count"), + "Name": fields.Str(required=False, load_from="Name"), + } + + +class PHostClusterSetSchema(schema.ResponseSchema): + """PHostClusterSet - 物理云主机集群库存信息""" + + fields = { + "Name": fields.Str(required=False, load_from="Name"), + "StockStatus": fields.Str(required=False, load_from="StockStatus"), + } + + +class PHostCPUSetSchema(schema.ResponseSchema): + """PHostCPUSet - DescribePHost""" + + fields = { + "CoreCount": fields.Int(required=False, load_from="CoreCount"), + "Count": fields.Int(required=False, load_from="Count"), + "Frequence": fields.Float(required=False, load_from="Frequence"), + "Model": fields.Str(required=False, load_from="Model"), + } + + +class PHostCloudMachineTypeSetSchema(schema.ResponseSchema): + """PHostCloudMachineTypeSet - 裸金属云盘的MachineTypeSet""" + + fields = { + "CPU": PHostCPUSetSchema(), + "Clusters": fields.List(PHostClusterSetSchema()), + "Components": PHostComponentSetSchema(), + "Memory": fields.Int(required=False, load_from="Memory"), + "Type": fields.Str(required=True, load_from="Type"), + } + + +class PHostIPSetSchema(schema.ResponseSchema): + """PHostIPSet - DescribePHost""" + + fields = { + "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), + "IPAddr": fields.Str(required=False, load_from="IPAddr"), + "IPId": fields.Str(required=False, load_from="IPId"), + "MACAddr": fields.Str(required=False, load_from="MACAddr"), + "OperatorName": fields.Str(required=False, load_from="OperatorName"), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + } + + +class PHostDescDiskSetSchema(schema.ResponseSchema): + """PHostDescDiskSet - DescribePHost(包括传统和裸金属1、裸金属2)""" + + fields = { + "Count": fields.Int(required=False, load_from="Count"), + "DiskId": fields.Str(required=False, load_from="DiskId"), + "Drive": fields.Str(required=False, load_from="Drive"), + "IOCap": fields.Int(required=False, load_from="IOCap"), + "IsBoot": fields.Str(required=False, load_from="IsBoot"), + "Name": fields.Str(required=False, load_from="Name"), + "Space": fields.Int(required=False, load_from="Space"), + "Type": fields.Str(required=False, load_from="Type"), + } + + +class PHostSetSchema(schema.ResponseSchema): + """PHostSet - DescribePHost""" + + fields = { + "AutoRenew": fields.Str(required=False, load_from="AutoRenew"), + "BootDiskState": fields.Str(required=False, load_from="BootDiskState"), + "CPUSet": PHostCPUSetSchema(), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "Cluster": fields.Str(required=False, load_from="Cluster"), + "Components": fields.Str(required=False, load_from="Components"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DiskSet": fields.List(PHostDescDiskSetSchema()), + "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "IPSet": fields.List(PHostIPSetSchema()), + "ImageName": fields.Str(required=False, load_from="ImageName"), + "IsSupportKVM": fields.Str(required=False, load_from="IsSupportKVM"), + "Memory": fields.Int(required=False, load_from="Memory"), + "Name": fields.Str(required=False, load_from="Name"), + "OSType": fields.Str(required=False, load_from="OSType"), + "OSname": fields.Str(required=False, load_from="OSname"), + "PHostId": fields.Str(required=False, load_from="PHostId"), + "PHostType": fields.Str(required=False, load_from="PHostType"), + "PMStatus": fields.Str(required=False, load_from="PMStatus"), + "PhostClass": fields.Str(required=False, load_from="PhostClass"), + "PowerState": fields.Str(required=False, load_from="PowerState"), + "RaidSupported": fields.Str(required=False, load_from="RaidSupported"), + "RdmaClusterId": fields.Str(required=False, load_from="RdmaClusterId"), + "Remark": fields.Str(required=False, load_from="Remark"), + "SN": fields.Str(required=False, load_from="SN"), + "Tag": fields.Str(required=False, load_from="Tag"), + "Zone": fields.Str(required=False, load_from="Zone"), + } + + +class PHostImageSetSchema(schema.ResponseSchema): + """PHostImageSet - DescribePHostImage""" + + fields = { + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "ImageDescription": fields.Str( + required=False, load_from="ImageDescription" + ), + "ImageId": fields.Str(required=False, load_from="ImageId"), + "ImageName": fields.Str(required=False, load_from="ImageName"), + "ImageSize": fields.Int(required=False, load_from="ImageSize"), + "ImageType": fields.Str(required=False, load_from="ImageType"), + "OsName": fields.Str(required=False, load_from="OsName"), + "OsType": fields.Str(required=False, load_from="OsType"), + "State": fields.Str(required=False, load_from="State"), + "Support": fields.List(fields.Str()), + "Version": fields.Str(required=False, load_from="Version"), + } + + +class PHostDiskSetSchema(schema.ResponseSchema): + """PHostDiskSet - GetPHostTypeInfo""" + + fields = { + "Count": fields.Int(required=False, load_from="Count"), + "IOCap": fields.Int(required=False, load_from="IOCap"), + "Name": fields.Str(required=False, load_from="Name"), + "Space": fields.Int(required=False, load_from="Space"), + "Type": fields.Str(required=False, load_from="Type"), + } + + +class PHostMachineTypeSetSchema(schema.ResponseSchema): + """PHostMachineTypeSet - 物理云主机机型列表""" + + fields = { + "CPU": PHostCPUSetSchema(), + "Clusters": fields.List(PHostClusterSetSchema()), + "Components": PHostComponentSetSchema(), + "Disks": fields.List(PHostDiskSetSchema()), + "Memory": fields.Int(required=False, load_from="Memory"), + "RaidSupported": fields.Str(required=False, load_from="RaidSupported"), + "Type": fields.Str(required=True, load_from="Type"), + } + + +class PHostTagSetSchema(schema.ResponseSchema): + """PHostTagSet - DescribePHostTags""" + + fields = { + "Tag": fields.Str(required=False, load_from="Tag"), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +class PHostPriceSetSchema(schema.ResponseSchema): + """PHostPriceSet - GetPHostPrice""" + + fields = { + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "OriginalPrice": fields.Float( + required=False, load_from="OriginalPrice" + ), + "Price": fields.Float(required=False, load_from="Price"), + "Product": fields.Str(required=False, load_from="Product"), + } diff --git a/ucloud/services/urocketmq/__init__.py b/ucloud/services/urocketmq/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/urocketmq/client.py b/ucloud/services/urocketmq/client.py new file mode 100644 index 00000000..fe6c2148 --- /dev/null +++ b/ucloud/services/urocketmq/client.py @@ -0,0 +1,117 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.urocketmq.schemas import apis + + +class URocketMQClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(URocketMQClient, self).__init__( + config, transport, middleware, logger + ) + + def create_u_rocket_mq_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateURocketMQGroup - 创建一个 Group, 如果同名 Group 在当前 Service 中已存在, 则会失败. + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Name** (str) - (Required) Group 名称,支持大小写字母、数字及-, _ ,长度1~36 + - **ServiceId** (str) - (Required) Service ID + - **Remark** (str) - Group 描述. + + **Response** + + - **GroupId** (str) - 新建 Group 的 ID + - **Message** (str) - 返回信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateURocketMQGroupRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateURocketMQGroup", d, **kwargs) + return apis.CreateURocketMQGroupResponseSchema().loads(resp) + + def delete_u_rocket_mq_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteURocketMQGroup - 删除一个已存在的 Group + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **GroupName** (str) - (Required) Group名称 + - **ServiceId** (str) - (Required) Service ID + + **Response** + + - **Message** (str) - 返回信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteURocketMQGroupRequestSchema().dumps(d) + + resp = self.invoke("DeleteURocketMQGroup", d, **kwargs) + return apis.DeleteURocketMQGroupResponseSchema().loads(resp) + + def list_u_rocket_mq_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListURocketMQGroup - 获取一个 RocketMQ 服务下的所有 Group + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ServiceId** (str) - (Required) Service ID + - **Limit** (int) - 最多返回的条目数量, (0, 1000], 默认 50 条 + - **Offset** (int) - 查询起始位置, [0, ∞) + + **Response** + + - **GroupList** (list) - 见 **GroupBaseInfo** 模型定义 + - **Message** (str) - 返回信息 + - **TotalCount** (int) - 记录总数 + + **Response Model** + + **GroupBaseInfo** + - **CreateTime** (int) - Group 创建时间 + - **GroupName** (str) - Group 名称 + - **Id** (str) - Group ID + - **Remark** (str) - Group 描述 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListURocketMQGroupRequestSchema().dumps(d) + + resp = self.invoke("ListURocketMQGroup", d, **kwargs) + return apis.ListURocketMQGroupResponseSchema().loads(resp) diff --git a/ucloud/services/urocketmq/schemas/__init__.py b/ucloud/services/urocketmq/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/urocketmq/schemas/apis.py b/ucloud/services/urocketmq/schemas/apis.py new file mode 100644 index 00000000..17b7b111 --- /dev/null +++ b/ucloud/services/urocketmq/schemas/apis.py @@ -0,0 +1,92 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.urocketmq.schemas import models + +""" URocketMQ API Schema +""" + + +""" +API: CreateURocketMQGroup + +创建一个 Group, 如果同名 Group 在当前 Service 中已存在, 则会失败. +""" + + +class CreateURocketMQGroupRequestSchema(schema.RequestSchema): + """CreateURocketMQGroup - 创建一个 Group, 如果同名 Group 在当前 Service 中已存在, 则会失败.""" + + fields = { + "Name": fields.Str(required=True, dump_to="Name"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "ServiceId": fields.Str(required=True, dump_to="ServiceId"), + } + + +class CreateURocketMQGroupResponseSchema(schema.ResponseSchema): + """CreateURocketMQGroup - 创建一个 Group, 如果同名 Group 在当前 Service 中已存在, 则会失败.""" + + fields = { + "GroupId": fields.Str(required=True, load_from="GroupId"), + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: DeleteURocketMQGroup + +删除一个已存在的 Group +""" + + +class DeleteURocketMQGroupRequestSchema(schema.RequestSchema): + """DeleteURocketMQGroup - 删除一个已存在的 Group""" + + fields = { + "GroupName": fields.Str(required=True, dump_to="GroupName"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ServiceId": fields.Str(required=True, dump_to="ServiceId"), + } + + +class DeleteURocketMQGroupResponseSchema(schema.ResponseSchema): + """DeleteURocketMQGroup - 删除一个已存在的 Group""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + } + + +""" +API: ListURocketMQGroup + +获取一个 RocketMQ 服务下的所有 Group +""" + + +class ListURocketMQGroupRequestSchema(schema.RequestSchema): + """ListURocketMQGroup - 获取一个 RocketMQ 服务下的所有 Group""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ServiceId": fields.Str(required=True, dump_to="ServiceId"), + } + + +class ListURocketMQGroupResponseSchema(schema.ResponseSchema): + """ListURocketMQGroup - 获取一个 RocketMQ 服务下的所有 Group""" + + fields = { + "GroupList": fields.List( + models.GroupBaseInfoSchema(), required=False, load_from="GroupList" + ), + "Message": fields.Str(required=False, load_from="Message"), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } diff --git a/ucloud/services/urocketmq/schemas/models.py b/ucloud/services/urocketmq/schemas/models.py new file mode 100644 index 00000000..329f2028 --- /dev/null +++ b/ucloud/services/urocketmq/schemas/models.py @@ -0,0 +1,14 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class GroupBaseInfoSchema(schema.ResponseSchema): + """GroupBaseInfo - Group基础信息""" + + fields = { + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "GroupName": fields.Str(required=True, load_from="GroupName"), + "Id": fields.Str(required=True, load_from="Id"), + "Remark": fields.Str(required=True, load_from="Remark"), + } diff --git a/ucloud/services/uslk/__init__.py b/ucloud/services/uslk/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/uslk/client.py b/ucloud/services/uslk/client.py new file mode 100644 index 00000000..eff1635b --- /dev/null +++ b/ucloud/services/uslk/client.py @@ -0,0 +1,249 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.uslk.schemas import apis + + +class USLKClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(USLKClient, self).__init__(config, transport, middleware, logger) + + def batch_create_uslk_short_link( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """BatchCreateUSLKShortLink - 批量创建短链接【免审】 + + **Request** + + - **EndTime** (int) - (Required) 过期时间戳(秒级),传 3376656000 表示生成永久生效短链接 + - **LongLinks** (list) - (Required) 长链接数组,示例: "LongLinks.0": "http://ucloud.cn/0", "LongLinks.1": "http://ucloud.cn/1" + - **Proto** (str) - (Required) 协议名称:http/https + - **ScenarioID** (int) - (Required) 场景ID + - **ShortLinkDomain** (str) - (Required) 短链接域名 + - **StartTime** (int) - (Required) 开始生效时间戳(秒级), 传 3376656000 表示生成永久生效短链接 + + **Response** + + - **Message** (str) - Message + - **ShortLinks** (list) - 创建成功的短链接,根据传LongLinks顺序排列 + + """ + # build request + d = {} + req and d.update(req) + d = apis.BatchCreateUSLKShortLinkRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("BatchCreateUSLKShortLink", d, **kwargs) + return apis.BatchCreateUSLKShortLinkResponseSchema().loads(resp) + + def create_uslk_long_link( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUSLKLongLink - 报备长链接 + + **Request** + + - **LongLink** (str) - (Required) 要报备的长链接 + - **ScenarioID** (int) - (Required) 场景ID + + **Response** + + - **LongLinkID** (int) - 长链接ID + - **Message** (str) - Message + - **ReqUuid** (str) - ReqUuid + + """ + # build request + d = {} + req and d.update(req) + d = apis.CreateUSLKLongLinkRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUSLKLongLink", d, **kwargs) + return apis.CreateUSLKLongLinkResponseSchema().loads(resp) + + def create_uslk_scenario( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUSLKScenario - 长链接报备场景创建 + + **Request** + + - **Scenario** (str) - (Required) 场景名称 + - **ScenarioDesc** (str) - (Required) 场景说明 + + **Response** + + - **Message** (str) - Message + - **ReqUuid** (str) - ReqUuid + - **ScenarioID** (int) - 场景ID + + """ + # build request + d = {} + req and d.update(req) + d = apis.CreateUSLKScenarioRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUSLKScenario", d, **kwargs) + return apis.CreateUSLKScenarioResponseSchema().loads(resp) + + def create_uslk_short_link( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUSLKShortLink - 创建短链接 + + **Request** + + - **EndTime** (int) - (Required) 过期时间戳,传 3376656000 表示生成永久生效短链接 + - **LongLinkID** (int) - (Required) 长链接ID,状态必须为审核通过 + - **Proto** (str) - (Required) 协议名称:http/https + - **StartTime** (int) - (Required) 开始生效时间戳, 传 3376656000 表示生成永久生效短链接 + - **Type** (int) - (Required) 链接类型-预留:普通跳转、随机跳转,当前默认普通跳转 1: 普通跳转 + - **ShortLinkDomain** (str) - 短链接域名,默认:uslk.net + + **Response** + + - **Message** (str) - Message + - **ShortLink** (str) - 生成的短链接内容 + + """ + # build request + d = {} + req and d.update(req) + d = apis.CreateUSLKShortLinkRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUSLKShortLink", d, **kwargs) + return apis.CreateUSLKShortLinkResponseSchema().loads(resp) + + def describe_uslk_redirect_records( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUSLKRedirectRecords - 查询短链接访问明细列表 + + **Request** + + - **EndTime** (int) - (Required) 查询周期结束时间戳(ms级别) + - **ShortLink** (str) - (Required) 短链接 + - **StartTime** (int) - (Required) 查询周期开始时间戳(ms级别) + - **FuzzySearch** (str) - 模糊查询字段值,支持根据生成短链接进行模糊查询。支持字段(ShortLink,场景名称) + - **NumPerPage** (int) - 每页个数,用于分页查找,默认20 + - **OrderBy** (str) - 根据指定字段排序:默认按短链接访问时间:CreateTime 排序 + - **OrderType** (str) - 排序方式。asc-正序 desc-倒序 + - **Page** (int) - 页码,从0开始,用于分页查找 + + **Response** + + - **Data** (list) - 见 **RedirectRecords** 模型定义 + - **Message** (str) - Message + - **Total** (int) - 数据总量 + + **Response Model** + + **RedirectRecords** + - **AccountID** (int) - 账户ID + - **Browser** (str) - 访问设备 + - **ClientIP** (str) - 访问IP + - **Os** (str) - 访问操作系统 + - **ProvinceCode** (str) - 访问省份信息 + - **RedirectTime** (int) - 重定向时间戳 (ms) + - **RequestTime** (int) - 访问时间戳(ms) + - **Scenario** (str) - 报备场景 + - **ScenarioID** (int) - 场景ID + - **ShortLink** (str) - 短链接 + - **ShortLinkDomain** (str) - 短链接域名 + + + """ + # build request + d = {} + req and d.update(req) + d = apis.DescribeUSLKRedirectRecordsRequestSchema().dumps(d) + + resp = self.invoke("DescribeUSLKRedirectRecords", d, **kwargs) + return apis.DescribeUSLKRedirectRecordsResponseSchema().loads(resp) + + def describe_uslk_short_link_list( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUSLKShortLinkList - 查询短链接列表 + + **Request** + + - **EndTime** (int) - 查询周期结束时间戳 + - **FuzzySearch** (str) - 模糊查询字段值,支持根据生成短链接进行模糊查询。支持字段(LonkLink,场景名称) + - **LongLinkID** (int) - 长链接ID + - **NumPerPage** (int) - 每页个数,用于分页查找,默认20 + - **OrderBy** (str) - 根据指定字段排序:默认按创建时间:CreateTime 排序,支持值:CreateTime,StartTime,EndTime + - **OrderType** (str) - 排序方式。asc-正序 desc-倒序 + - **Page** (int) - 页码,从0开始,用于分页查找 + - **ScenarioID** (int) - 场景ID + - **ShortLink** (str) - 短链 + - **StartTime** (int) - 查询周期开始时间戳 + - **Status** (int) - 1: 待生效;2:已生效;3:已失效;4:已删除(预留);5:已封禁 + + **Response** + + - **Data** (list) - 见 **ShortLink** 模型定义 + - **Message** (str) - Message + + **Response Model** + + **ShortLink** + - **ClickCount** (int) - 累计访问量 + - **ClickCountToday** (int) - 当日访问量 + - **CreateTime** (int) - 短链接创建时间 + - **DeleteTime** (int) - 删除时间戳 + - **EndTime** (int) - 短链接过期时间戳 + - **ID** (int) - 短链接ID + - **LongLinks** (list) - 关联长链接列表 + - **Operator** (str) - 操作人 + - **Remark** (str) - 操作说明(封禁原因) + - **Scenario** (str) - 报备场景 + - **ScenarioDesc** (str) - 场景描述 + - **ScenarioID** (int) - 场景ID + - **SecondaryLinks** (list) - 见 **SecondaryLinkForQuery** 模型定义 + - **ShortLink** (str) - 短链接 + - **ShortLinkDomain** (str) - 短链接域名 + - **StartTime** (int) - 短链接开始生效时间戳 + - **Status** (int) - 短链接状态:1: 待生效;2:已生效;3:已失效;4:已删除(预留);5:已封禁 + - **Type** (int) - 链接类型-预留:1:普通跳转 3:智能跳转等 + - **UniqueClickCount** (int) - 累计独立访问量 + - **UniqueClickCountToday** (int) - 今日独立访问量 + - **UpdateTime** (int) - 更新时间戳 + + + **SecondaryLinkForQuery** + - **IsSecondary** (bool) - 是否是次链接 + - **LongLink** (str) - 长链接 + - **LongLinkID** (int) - 长链接ID + - **Oses** (str) - 操作系统,例如: Windows,Android,多个以逗号分隔 + - **ProvinceCodes** (str) - 省份codes,例如: Hebei,Shandong,多个以逗号分隔 + - **Scenario** (str) - 场景名称 + - **ScenarioID** (int) - 场景ID + - **ShortLongMapID** (int) - 长短链接映射ID + + + """ + # build request + d = {} + req and d.update(req) + d = apis.DescribeUSLKShortLinkListRequestSchema().dumps(d) + + resp = self.invoke("DescribeUSLKShortLinkList", d, **kwargs) + return apis.DescribeUSLKShortLinkListResponseSchema().loads(resp) diff --git a/ucloud/services/uslk/schemas/__init__.py b/ucloud/services/uslk/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/uslk/schemas/apis.py b/ucloud/services/uslk/schemas/apis.py new file mode 100644 index 00000000..d292a7b4 --- /dev/null +++ b/ucloud/services/uslk/schemas/apis.py @@ -0,0 +1,191 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.uslk.schemas import models + +""" USLK API Schema +""" + + +""" +API: BatchCreateUSLKShortLink + +批量创建短链接【免审】 +""" + + +class BatchCreateUSLKShortLinkRequestSchema(schema.RequestSchema): + """BatchCreateUSLKShortLink - 批量创建短链接【免审】""" + + fields = { + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "LongLinks": fields.List(fields.Str()), + "Proto": fields.Str(required=True, dump_to="Proto"), + "ScenarioID": fields.Int(required=True, dump_to="ScenarioID"), + "ShortLinkDomain": fields.Str(required=True, dump_to="ShortLinkDomain"), + "StartTime": fields.Int(required=True, dump_to="StartTime"), + } + + +class BatchCreateUSLKShortLinkResponseSchema(schema.ResponseSchema): + """BatchCreateUSLKShortLink - 批量创建短链接【免审】""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "ShortLinks": fields.List( + fields.Str(), required=True, load_from="ShortLinks" + ), + } + + +""" +API: CreateUSLKLongLink + +报备长链接 +""" + + +class CreateUSLKLongLinkRequestSchema(schema.RequestSchema): + """CreateUSLKLongLink - 报备长链接""" + + fields = { + "LongLink": fields.Str(required=True, dump_to="LongLink"), + "ScenarioID": fields.Int(required=True, dump_to="ScenarioID"), + } + + +class CreateUSLKLongLinkResponseSchema(schema.ResponseSchema): + """CreateUSLKLongLink - 报备长链接""" + + fields = { + "LongLinkID": fields.Int(required=False, load_from="LongLinkID"), + "Message": fields.Str(required=True, load_from="Message"), + "ReqUuid": fields.Str(required=False, load_from="ReqUuid"), + } + + +""" +API: CreateUSLKScenario + +长链接报备场景创建 +""" + + +class CreateUSLKScenarioRequestSchema(schema.RequestSchema): + """CreateUSLKScenario - 长链接报备场景创建""" + + fields = { + "Scenario": fields.Str(required=True, dump_to="Scenario"), + "ScenarioDesc": fields.Str(required=True, dump_to="ScenarioDesc"), + } + + +class CreateUSLKScenarioResponseSchema(schema.ResponseSchema): + """CreateUSLKScenario - 长链接报备场景创建""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "ReqUuid": fields.Str(required=False, load_from="ReqUuid"), + "ScenarioID": fields.Int(required=False, load_from="ScenarioID"), + } + + +""" +API: CreateUSLKShortLink + +创建短链接 +""" + + +class CreateUSLKShortLinkRequestSchema(schema.RequestSchema): + """CreateUSLKShortLink - 创建短链接""" + + fields = { + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "LongLinkID": fields.Int(required=True, dump_to="LongLinkID"), + "Proto": fields.Str(required=True, dump_to="Proto"), + "ShortLinkDomain": fields.Str( + required=False, dump_to="ShortLinkDomain" + ), + "StartTime": fields.Int(required=True, dump_to="StartTime"), + "Type": fields.Int(required=True, dump_to="Type"), + } + + +class CreateUSLKShortLinkResponseSchema(schema.ResponseSchema): + """CreateUSLKShortLink - 创建短链接""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "ShortLink": fields.Str(required=False, load_from="ShortLink"), + } + + +""" +API: DescribeUSLKRedirectRecords + +查询短链接访问明细列表 +""" + + +class DescribeUSLKRedirectRecordsRequestSchema(schema.RequestSchema): + """DescribeUSLKRedirectRecords - 查询短链接访问明细列表""" + + fields = { + "EndTime": fields.Int(required=True, dump_to="EndTime"), + "FuzzySearch": fields.Str(required=False, dump_to="FuzzySearch"), + "NumPerPage": fields.Int(required=False, dump_to="NumPerPage"), + "OrderBy": fields.Str(required=False, dump_to="OrderBy"), + "OrderType": fields.Str(required=False, dump_to="OrderType"), + "Page": fields.Int(required=False, dump_to="Page"), + "ShortLink": fields.Str(required=True, dump_to="ShortLink"), + "StartTime": fields.Int(required=True, dump_to="StartTime"), + } + + +class DescribeUSLKRedirectRecordsResponseSchema(schema.ResponseSchema): + """DescribeUSLKRedirectRecords - 查询短链接访问明细列表""" + + fields = { + "Data": fields.List( + models.RedirectRecordsSchema(), required=False, load_from="Data" + ), + "Message": fields.Str(required=True, load_from="Message"), + "Total": fields.Int(required=False, load_from="Total"), + } + + +""" +API: DescribeUSLKShortLinkList + +查询短链接列表 +""" + + +class DescribeUSLKShortLinkListRequestSchema(schema.RequestSchema): + """DescribeUSLKShortLinkList - 查询短链接列表""" + + fields = { + "EndTime": fields.Int(required=False, dump_to="EndTime"), + "FuzzySearch": fields.Str(required=False, dump_to="FuzzySearch"), + "LongLinkID": fields.Int(required=False, dump_to="LongLinkID"), + "NumPerPage": fields.Int(required=False, dump_to="NumPerPage"), + "OrderBy": fields.Str(required=False, dump_to="OrderBy"), + "OrderType": fields.Str(required=False, dump_to="OrderType"), + "Page": fields.Int(required=False, dump_to="Page"), + "ScenarioID": fields.Int(required=False, dump_to="ScenarioID"), + "ShortLink": fields.Str(required=False, dump_to="ShortLink"), + "StartTime": fields.Int(required=False, dump_to="StartTime"), + "Status": fields.Int(required=False, dump_to="Status"), + } + + +class DescribeUSLKShortLinkListResponseSchema(schema.ResponseSchema): + """DescribeUSLKShortLinkList - 查询短链接列表""" + + fields = { + "Data": fields.List( + models.ShortLinkSchema(), required=False, load_from="Data" + ), + "Message": fields.Str(required=True, load_from="Message"), + } diff --git a/ucloud/services/uslk/schemas/models.py b/ucloud/services/uslk/schemas/models.py new file mode 100644 index 00000000..066d4209 --- /dev/null +++ b/ucloud/services/uslk/schemas/models.py @@ -0,0 +1,74 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class RedirectRecordsSchema(schema.ResponseSchema): + """RedirectRecords - 访问明细""" + + fields = { + "AccountID": fields.Int(required=True, load_from="AccountID"), + "Browser": fields.Str(required=True, load_from="Browser"), + "ClientIP": fields.Str(required=True, load_from="ClientIP"), + "Os": fields.Str(required=True, load_from="Os"), + "ProvinceCode": fields.Str(required=True, load_from="ProvinceCode"), + "RedirectTime": fields.Int(required=True, load_from="RedirectTime"), + "RequestTime": fields.Int(required=True, load_from="RequestTime"), + "Scenario": fields.Str(required=True, load_from="Scenario"), + "ScenarioID": fields.Int(required=True, load_from="ScenarioID"), + "ShortLink": fields.Str(required=True, load_from="ShortLink"), + "ShortLinkDomain": fields.Str( + required=True, load_from="ShortLinkDomain" + ), + } + + +class SecondaryLinkForQuerySchema(schema.ResponseSchema): + """SecondaryLinkForQuery - SecondaryLink查询实体""" + + fields = { + "IsSecondary": fields.Bool(required=True, load_from="IsSecondary"), + "LongLink": fields.Str(required=True, load_from="LongLink"), + "LongLinkID": fields.Int(required=True, load_from="LongLinkID"), + "Oses": fields.Str(required=True, load_from="Oses"), + "ProvinceCodes": fields.Str(required=True, load_from="ProvinceCodes"), + "Scenario": fields.Str(required=True, load_from="Scenario"), + "ScenarioID": fields.Int(required=True, load_from="ScenarioID"), + "ShortLongMapID": fields.Int(required=True, load_from="ShortLongMapID"), + } + + +class ShortLinkSchema(schema.ResponseSchema): + """ShortLink - 短链接返回模型""" + + fields = { + "ClickCount": fields.Int(required=True, load_from="ClickCount"), + "ClickCountToday": fields.Int( + required=True, load_from="ClickCountToday" + ), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "DeleteTime": fields.Int(required=True, load_from="DeleteTime"), + "EndTime": fields.Int(required=True, load_from="EndTime"), + "ID": fields.Int(required=True, load_from="ID"), + "LongLinks": fields.List(fields.Str()), + "Operator": fields.Str(required=True, load_from="Operator"), + "Remark": fields.Str(required=True, load_from="Remark"), + "Scenario": fields.Str(required=True, load_from="Scenario"), + "ScenarioDesc": fields.Str(required=True, load_from="ScenarioDesc"), + "ScenarioID": fields.Int(required=True, load_from="ScenarioID"), + "SecondaryLinks": fields.List(SecondaryLinkForQuerySchema()), + "ShortLink": fields.Str(required=True, load_from="ShortLink"), + "ShortLinkDomain": fields.Str( + required=True, load_from="ShortLinkDomain" + ), + "StartTime": fields.Int(required=True, load_from="StartTime"), + "Status": fields.Int(required=True, load_from="Status"), + "Type": fields.Int(required=True, load_from="Type"), + "UniqueClickCount": fields.Int( + required=True, load_from="UniqueClickCount" + ), + "UniqueClickCountToday": fields.Int( + required=True, load_from="UniqueClickCountToday" + ), + "UpdateTime": fields.Int(required=True, load_from="UpdateTime"), + } diff --git a/ucloud/services/usms/client.py b/ucloud/services/usms/client.py index ace721fb..f6e0271f 100644 --- a/ucloud/services/usms/client.py +++ b/ucloud/services/usms/client.py @@ -13,31 +13,110 @@ def __init__( ): super(USMSClient, self).__init__(config, transport, middleware, logger) + def add_backfill(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """AddBackfill - 用户通过接口发送消息,当消息在终端被消费,调用该接口,进行记录。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SendNo** (str) - (Required) 发送Number,记录一次发送请求的唯一性 + - **Target** (str) - (Required) 短信的接收目标,手机号需要添加国家码,比如(1)231xxxx + - **BackfillTime** (int) - 回填时间,秒级别时间戳 + - **Content** (str) - 回填内容 + - **SendTime** (int) - 发送请求的时间,秒级别时间戳 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 返回错误消息。当 RetCode 非 0 时提供详细的描述信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.AddBackfillRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AddBackfill", d, **kwargs) + return apis.AddBackfillResponseSchema().loads(resp) + + def add_usms_signature_qualification( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AddUSMSSignatureQualification - 添加短信签名资质申请记录 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Attr** (int) - (Required) 资质属性,0-自用 1-他用 + - **Name** (str) - (Required) 资质名称 + - **Status** (int) - (Required) 状态:0-草稿,1-提交审核 + - **CompanyCertificateFileId** (str) - 公司证件文件FileId + - **CompanyCreditCode** (str) - 公司统一社会信用代码 + - **CompanyName** (str) - 公司名称,长度限制100 + - **CompanyWorkScenePhotosFileId** (str) - 公司工作现场照片FileId + - **HandlerHandHeldImageFileId** (str) - 经办人手持身份证图片FileId + - **HandlerIDCardBackImageFileId** (str) - 经办人身份证国徽面图片FileId + - **HandlerIDCardFrontImageFileId** (str) - 经办人身份证人像面图片FileId + - **HandlerIDNumber** (str) - 经办人身份证号码 + - **HandlerName** (str) - 经办人姓名 + - **ManagerIDNumber** (str) - 法人身份证号码 + - **ManagerName** (str) - 法人姓名 + + **Response** + + - **Message** (str) - 返回状态码描述,如果操作成功,默认返回为空 + - **QualificationId** (str) - 资质Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.AddUSMSSignatureQualificationRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AddUSMSSignatureQualification", d, **kwargs) + return apis.AddUSMSSignatureQualificationResponseSchema().loads(resp) + def create_usms_signature( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateUSMSSignature - 调用接口CreateUSMSSignature申请短信签名 + """CreateUSMSSignature - 调用接口CreateUSMSSignature申请短信签名 **Request** - - **ProjectId** (str) - (Config) 项目ID,不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ProjectId** (str) - (Config) 项目ID,不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **CertificateType** (int) - (Required) 签名的资质证明文件类型,需与签名类型保持一致,说明如下:0-三证合一/企业营业执照/组织机构代码证书/社会信用代码证书;1-应用商店后台开发者管理截图;2-备案服务商的备案成功截图(含域名,网站名称,备案号);3-公众号或小程序的管理界面截图;4-商标注册证书;5-组织机构代码证书、社会信用代码证书; - **Description** (str) - (Required) 短信签名申请原因 - - **File** (str) - (Required) 短信签名的资质证明文件,需先进行base64编码格式转换,此处填写转换后的字符串。文件大小不超过4 MB - - **SigContent** (str) - (Required) 短信签名名称;长度为2-12个字符, 可包含中文、数字和符号;无需填写【】或[],系统会自动添加 + - **SigContent** (str) - (Required) 签名内容 - **SigPurpose** (int) - (Required) 签名用途,0-自用,1-他用; - **SigType** (int) - (Required) 签名类型,说明如下:0-公司或企业的全称或简称;1-App应用的全称或简称;2-工信部备案网站的全称或简称;3-公众号或小程序的全称或简称;4-商标名的全称或简称;5-政府/机关事业单位/其他单位的全称或简称; + - **File** (str) - 短信签名的资质证明文件,需先进行base64编码格式转换,此处填写转换后的字符串。文件大小不超过4 MB + - **International** (bool) - 国内/国际短信。true:国际短信,false:国内短信,若不传值则默认该值为false - **ProxyFile** (str) - 短信签名授权委托文件,需先进行base64编码格式转换,此处填写转换后的字符串。文件大小不超过4 MB;当您是代理并使用第三方的签名时(也即SigPurpose为1-他用),该项为必填项; - + - **QualificationId** (str) - 资质ID + - **SceneDesc** (str) - 短信签名对应的场景说明 + **Response** - **Message** (str) - 返回状态码描述,如果操作成功,默认返回为空 - - **SigContent** (str) - 短信签名名称 - **SigId** (str) - 短信签名ID(短信签名申请时的工单ID) - + """ # build request - d = {"ProjectId": self.config.project_id} + d = { + "ProjectId": self.config.project_id, + } req and d.update(req) d = apis.CreateUSMSSignatureRequestSchema().dumps(d) @@ -50,27 +129,31 @@ def create_usms_signature( def create_usms_template( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateUSMSTemplate - 调用接口CreateUSMSTemplate申请短信模板 + """CreateUSMSTemplate - 调用接口CreateUSMSTemplate申请短信模板 **Request** - - **ProjectId** (str) - (Config) 项目ID,不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID,不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Purpose** (int) - (Required) 短信模板用途类型:1-验证码类短信模板;2-系统通知类短信模板;3-会员推广类短信模板; - **Template** (str) - (Required) 短信模板内容,说明如下:字数不超过500,每个中文、符号、英文、数组等都计为一个字;模板中的变量填写格式:{N},其中N为大于1的整数,有多个参数时,建议N从1开始顺次,例如:{1}、{2}等;短信模板禁止仅包括变量的情况; - **TemplateName** (str) - (Required) 短信模板名称,不超过32个字符,每个中文、符号、英文、数字等都计为1个字。 + - **Instruction** (str) - 模板变量属性说明 + - **International** (bool) - 标记是否为国际短信。true:国际短信,false:国内短信,若不传值则默认该值为false - **Remark** (str) - 短信模板申请原因说明,字数不超过128,每个中文、符号、英文、数字等都计为1个字。 - - **UnsubscribeInfo** (str) - 当Purpose为3时,也即会员推广类短信模板,该项必填。枚举值:TD退订、回T退订、回N退订、回TD退订、退订回T、退订回D、退订回TD、退订回复T、退订回复D、退订回复N、退订回复TD、拒收回T - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **UnsubscribeInfo** (str) - 当Purpose=3并且International=false时,也即国内会员推广类短信模板,该项必填。枚举值:【拒收请回复R】 + **Response** - **Message** (str) - 返回状态码描述,如果操作成功,默认返回为空 - **TemplateId** (str) - 短信模板ID(短信模板申请时的工单ID) - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.CreateUSMSTemplateRequestSchema().dumps(d) @@ -83,45 +166,74 @@ def create_usms_template( def delete_usms_signature( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeleteUSMSSignature - 调用接口DeleteUSMSSignature删除短信签名 + """DeleteUSMSSignature - 调用接口DeleteUSMSSignature删除短信签名 **Request** - - **ProjectId** (str) - (Config) 项目ID,不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ProjectId** (str) - (Config) 项目ID,不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **SigIds** (list) - (Required) 签名ID(也即短信签名申请时的工单ID),支持以数组的方式,举例,以SigIds.0、SigIds.1...SigIds.N方式传入 - + **Response** - **Message** (str) - 返回状态码描述,如果操作成功,默认返回为空 - + """ # build request - d = {"ProjectId": self.config.project_id} + d = { + "ProjectId": self.config.project_id, + } req and d.update(req) d = apis.DeleteUSMSSignatureRequestSchema().dumps(d) resp = self.invoke("DeleteUSMSSignature", d, **kwargs) return apis.DeleteUSMSSignatureResponseSchema().loads(resp) + def delete_usms_signature_qualification( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUSMSSignatureQualification - 删除短信签名资质申请记录 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **QualificationIds** (list) - (Required) 签名资质Id,支持以数组的方式,举例,以QualificationIds.0、QualificationIds.1...QualificationIds.N方式传入 + + **Response** + + - **Message** (str) - 返回状态码描述,如果操作成功,默认返回为空 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DeleteUSMSSignatureQualificationRequestSchema().dumps(d) + + resp = self.invoke("DeleteUSMSSignatureQualification", d, **kwargs) + return apis.DeleteUSMSSignatureQualificationResponseSchema().loads(resp) + def delete_usms_template( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeleteUSMSTemplate - 调用接口DeleteUSMSTemplate删除短信模板 + """DeleteUSMSTemplate - 调用接口DeleteUSMSTemplate删除短信模板 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **TemplateIds** (list) - (Required) 模板ID(也即短信模板申请时的工单ID),支持以数组的方式,举例,以TemplateIds.0、TemplateIds.1...TemplateIds.N方式传入 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + **Response** - **Message** (str) - 返回状态码描述,如果操作成功,默认返回为空 - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.DeleteUSMSTemplateRequestSchema().dumps(d) @@ -131,99 +243,279 @@ def delete_usms_template( def get_usms_send_receipt( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ GetUSMSSendReceipt - 获取短信发送回执信息。下游服务提供商回执信息返回会有一定延时,建议发送完短信以后,5-10分钟后再调用该接口拉取回执信息。若超过12小时未返回,则请联系技术支持确认原因 + """GetUSMSSendReceipt - 调用接口GetUSMSSendReceipt短信发送状态信息 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **SessionNoSet** (list) - (Required) 发送短信时返回的SessionNo集合,SessionNoSet.0,SessionNoSet.1....格式 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SessionNoSet** (list) - (Required) 发送短信时返回的SessionNo集合,SessionNoSet.0,SessionNoSet.1....格式,单次调用集合数需控制在100个以内 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + **Response** - **Data** (list) - 见 **ReceiptPerSession** 模型定义 - **Message** (str) - 错误描述 - + **Response Model** - - **ReceiptPerPhone** - + + **ReceiptPerSession** + - **ReceiptSet** (list) - 见 **ReceiptPerPhone** 模型定义 + - **SessionNo** (str) - 发送短信时返回的SessionNo + + + **ReceiptPerPhone** - **CostCount** (int) - 消耗短信条数 - **Phone** (str) - 手机号码 + - **ReceiptCode** (str) - 状态报告编码 - **ReceiptDesc** (str) - 回执结果描述 - - **ReceiptResult** (str) - 回执结果 + - **ReceiptResult** (str) - 回执结果,枚举值:\\ > 发送成功: 代表成功 \\ > Success: 代表成功 \\ > 发送失败: 代表失败 \\ > Fail: 代表失败 \\ > 状态未知: 代表未知 \\ > Unknow: 代表未知 - **ReceiptTime** (int) - 回执返回时间 + - **UserId** (str) - 自定义的业务标识ID,字符串 - **ReceiptPerSession** - - - **ReceiptSet** (list) - 见 **ReceiptPerPhone** 模型定义 - - **SessionNo** (str) - 发送短信时返回的SessionNo """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.GetUSMSSendReceiptRequestSchema().dumps(d) resp = self.invoke("GetUSMSSendReceipt", d, **kwargs) return apis.GetUSMSSendReceiptResponseSchema().loads(resp) + def get_usms_send_statistics( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUSMSSendStatistics - 获取发送统计数据 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID,不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Domestic** (int) - (Required) 国内标记,0-国际短信 1-国内短信 + - **EndDate** (str) - (Required) 结束日期,格式为YYYY-MM-DD + - **NumPerPage** (int) - (Required) 每页记录个数 + - **OrderBy** (str) - (Required) 排序字段,如BrevityCode表示按照BrevityCode排列,配合OrderType使用。目前支持SendDate、BrevityCode + - **OrderType** (str) - (Required) 排序方式,asc-正序 desc-倒序 + - **Page** (int) - (Required) 页编号,从0开始 + - **StartDate** (str) - (Required) 开始日期,格式为YYYY-MM-DD + - **BrevityCode** (str) - 国际简码,如CN表示中国,当需要查询多个国家时,使用-分割,如CN-ID。 + - **Purpose** (int) - 短信类型,1-验证码 2-通知类 3-营销类 + + **Response** + + - **Data** (list) - 见 **StatisticsDataInfo** 模型定义 + - **Message** (str) - 描述信息 + - **StatisticsData** (dict) - 见 **StatisticsData** 模型定义 + - **Total** (int) - 返回记录数 + + **Response Model** + + **StatisticsDataInfo** + - **BrevityCode** (str) - 国际/地区标识码 + - **CostCount** (int) - 发送总数(拆分条数) + - **Count** (int) - 发送总数(提交条数) + - **FailedCostCount** (int) - 发送失败数(拆分条数) + - **FailedCount** (int) - 发送失败数(提交条数) + - **SendDate** (str) - 发送时间 + - **SubmitFailedCostCount** (int) - 提交失败数(拆分条数) + - **SubmitFailedCount** (int) - 提交失败数(提交条数) + - **SuccessCostCount** (int) - 发送成功数(拆分条数) + - **SuccessCount** (int) - 发送成功数(提交条数) + - **SuccessRate** (float) - 发送成功率 + - **UnknownCostCount** (int) - 状态未知数(拆分条数) + - **UnknownCount** (int) - 状态未知数(提交条数) + - **UserId** (str) - UserId + + + **StatisticsData** + - **FailCostCount** (int) - 发送失败数(拆分条数) + - **FailCount** (int) - 发送失败数(提交条数) + - **SendCostCount** (int) - 发送总数(拆分条数) + - **SendCount** (int) - 发送总数(提交条数) + - **SubmitFailCostCount** (int) - 提交失败数(拆分条数) + - **SubmitFailCount** (int) - 提交失败数(提交条数) + - **SuccessCostCount** (int) - 发送成功数(拆分条数) + - **SuccessCount** (int) - 发送成功数(提交条数) + - **UnknownCostCount** (int) - 状态未知数(拆分条数) + - **UnknownCount** (int) - 状态未知数(提交条数) + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUSMSSendStatisticsRequestSchema().dumps(d) + + resp = self.invoke("GetUSMSSendStatistics", d, **kwargs) + return apis.GetUSMSSendStatisticsResponseSchema().loads(resp) + + def get_usms_signature_qualification( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUSMSSignatureQualification - 获取短信签名资质申请记录列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **NumPerPage** (int) - (Required) 每页个数 + - **OrderBy** (str) - (Required) 排序字段,QualificationId/CreateTime + - **OrderType** (str) - (Required) 排序类型: desc、asc + - **Page** (int) - (Required) 页索引 + - **InAccountIds** (list) - 项目ID列表 + - **QualificationAttr** (int) - 签名资质属性: 0-自用,1-他用 + - **Status** (int) - 签名资质状态: 0-草稿 1-审核中 2-审核通过 3-审核未通过 4-人工禁用 + + **Response** + + - **Data** (list) - 见 **OutSignatureQualification** 模型定义 + - **Message** (str) - 返回状态码描述,如果操作成功,默认返回为空 + - **Total** (int) - 签名资质总个数 + + **Response Model** + + **OutSignatureQualification** + - **AccountId** (int) - 项目Id + - **Attr** (int) - 资质属性: 0-自用 1-他用 + - **CompanyName** (str) - 公司名称 + - **CreateTime** (int) - 创建时间戳 + - **ErrCode** (int) - 审核未通过错误码 + - **ErrDesc** (str) - 审核未通过错误原因 + - **HandlerName** (str) - 经办人姓名 + - **ManagerName** (str) - 负责人姓名 + - **ModifyTime** (int) - 修改时间戳 + - **Name** (str) - 资质名称 + - **QualificationId** (str) - 资质Id + - **ReviewEndTime** (int) - 审核完成时间戳 + - **ReviewStartTime** (int) - 审核开始时间戳 + - **Status** (int) - 状态:0-草稿 1-审核中 2-审核通过 3-审核未通过 4-人工禁用 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUSMSSignatureQualificationRequestSchema().dumps(d) + + resp = self.invoke("GetUSMSSignatureQualification", d, **kwargs) + return apis.GetUSMSSignatureQualificationResponseSchema().loads(resp) + def query_usms_signature( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ QueryUSMSSignature - 调用接口QueryUSMSSignature查询短信签名申请状态 + """QueryUSMSSignature - 调用接口QueryUSMSSignature查询短信签名申请状态 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **SigContent** (str) - 签名内容;签名ID和签名至少需填写1项; - **SigId** (str) - 已申请的短信签名ID(短信签名申请时的工单ID);签名ID和签名至少需填写1项; - + **Response** - **Data** (dict) - 见 **OutSignature** 模型定义 - **Message** (str) - 发生错误时,表示具体错误描述 - + **Response Model** - - **OutSignature** - + + **OutSignature** - **ErrDesc** (str) - 签名审核失败原因 - **SigContent** (str) - 签名内容 - **SigId** (str) - 签名ID - **Status** (int) - 签名状态。0-待审核 1-审核中 2-审核通过 3-审核未通过 4-被禁用 + """ # build request - d = {"ProjectId": self.config.project_id} + d = { + "ProjectId": self.config.project_id, + } req and d.update(req) d = apis.QueryUSMSSignatureRequestSchema().dumps(d) resp = self.invoke("QueryUSMSSignature", d, **kwargs) return apis.QueryUSMSSignatureResponseSchema().loads(resp) + def query_usms_signature_qualification( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """QueryUSMSSignatureQualification - 获取短信签名资质申请记录详情 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **QualificationId** (str) - (Required) 签名资质Id + + **Response** + + - **Data** (dict) - 见 **OutSignatureQualificationDetail** 模型定义 + - **Message** (str) - 返回状态码描述,如果操作成功,默认返回为空 + + **Response Model** + + **OutSignatureQualificationDetail** + - **Attr** (int) - 资质属性:0-自用,1-他用 + - **CompanyCertificateFile** (str) - 公司证件文件链接 + - **CompanyCreditCode** (str) - 统一社会信用代码 + - **CompanyName** (str) - 公司名称 + - **CompanyWorkScenePhotos** (str) - 工作现场照片链接 + - **CreateTime** (int) - 创建时间戳 + - **ErrCode** (int) - 审核未通过错误码 + - **ErrDesc** (str) - 审核未通过错误原因 + - **HandlerHandHeldImage** (str) - 经办人手持身份证图片链接 + - **HandlerIDCardBackImage** (str) - 经办人身份证国徽面图片链接 + - **HandlerIDCardFrontImage** (str) - 经办人身份证人像面图片链接 + - **HandlerIDNumber** (str) - 经办人证件号码 + - **HandlerName** (str) - 经办人姓名 + - **ManagerIDNumber** (str) - 负责人证件号码 + - **ManagerName** (str) - 负责人姓名 + - **ModifyTime** (int) - 修改时间戳 + - **Name** (str) - 资质名称 + - **PowerOfAttorney** (str) - 授权委托书文件链接 + - **QualificationId** (str) - 资质Id + - **ReviewEndTime** (int) - 审核完成时间戳 + - **ReviewStartTime** (int) - 审核开始时间戳 + - **Status** (int) - 状态:0-草稿 1-审核中 2-审核通过 3-审核未通过 4-人工禁用 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.QueryUSMSSignatureQualificationRequestSchema().dumps(d) + + resp = self.invoke("QueryUSMSSignatureQualification", d, **kwargs) + return apis.QueryUSMSSignatureQualificationResponseSchema().loads(resp) + def query_usms_template( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ QueryUSMSTemplate - 调用接口QueryUSMSTemplate查询短信模板申请状态 + """QueryUSMSTemplate - 调用接口QueryUSMSTemplate查询短信模板申请状态 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **TemplateId** (str) - (Required) 模板ID - + **Response** - **Data** (dict) - 见 **OutTemplate** 模型定义 - **Message** (str) - 当RetCode不为0时,Message中显示具体错误描述 - + **Response Model** - - **OutTemplate** - + + **OutTemplate** - **CreateTime** (int) - 创建时间 - **ErrDesc** (str) - 审核失败原因 + - **Instruction** (str) - 模板变量属性说明 - **Purpose** (int) - 模板类型,选项:1-验证码类 2-通知类 3-会员推广类 - **Remark** (str) - 模板说明 - **Status** (int) - 短信模板状态;状态说明:0-待审核,1-审核中,2-审核通过,3-审核未通过,4-被禁用 @@ -232,40 +524,97 @@ def query_usms_template( - **TemplateName** (str) - 短信模板名称 - **UnsubscribeInfo** (str) - 退订信息;一般填写方式“回T退订”,当purpose为3(也即会员推广类)时,为必填项 + """ # build request - d = {"ProjectId": self.config.project_id} + d = { + "ProjectId": self.config.project_id, + } req and d.update(req) d = apis.QueryUSMSTemplateRequestSchema().dumps(d) resp = self.invoke("QueryUSMSTemplate", d, **kwargs) return apis.QueryUSMSTemplateResponseSchema().loads(resp) + def send_batch_usms_message( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """SendBatchUSMSMessage - 调用SendBatchUSMSMessage接口批量发送短信 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **TaskContent** (str) - (Required) 批量发送内容,该参数是json数组的base64编码结果。发送内容json数组中,每个“模板+签名”组合作为一个子项,每个子项内支持多个号码,示例:发送内容json数组(base64编码前):[{"TemplateId": "UTA20212831C85C", "SigContent": "UCloud", "Target": [{"TemplateParams": ["123456"], "Phone": "18500000123", "ExtendCode": "123", "UserId": "456"} ] } ] 。json数组中各参数的定义:"TemplateId":模板ID,"SigContent"短信签名内容,"Target"具体到号码粒度的发送内容。"Target"中的具体字段有:"TemplateParams"实际发送的模板参数(若使用的是无参数模板,该参数不能传值),"Phone"手机号码, "ExtendCode"短信扩展码, "UserId"自定义业务标识ID。其中必传参数为"TemplateId", "SigContent", "Target"("Target"中必传参数为"Phone")。实际调用本接口时TaskContent传值(发送内容base64编码后)为:W3siVGVtcGxhdGVJZCI6ICJVVEEyMDIxMjgzMUM4NUMiLCAiU2lnQ29udGVudCI6ICJVQ2xvdWQiLCAiVGFyZ2V0IjogW3siVGVtcGxhdGVQYXJhbXMiOiBbIjEyMzQ1NiJdLCAiUGhvbmUiOiAiMTg1MDAwMDAxMjMiLCAiRXh0ZW5kQ29kZSI6ICIxMjMiLCAiVXNlcklkIjogIjQ1NiJ9IF0gfSBdIA== + + **Response** + + - **FailContent** (list) - 见 **BatchInfo** 模型定义 + - **Message** (str) - 发生错误时表示错误描述 + - **ReqUuid** (str) - 本次请求Uuid + - **SessionNo** (str) - 本次提交发送任务的唯一ID,可根据该值查询本次发送的短信列表。注:成功提交短信数大于0时,才返回该字段 + - **SuccessCount** (int) - 成功提交短信(未拆分)条数 + + **Response Model** + + **BatchInfo** + - **FailureDetails** (str) - 未能成功发送的详情。注:模板/签名检验失败时,该字段有效 + - **SigContent** (str) - 签名 + - **Target** (list) - 见 **FailPhoneDetail** 模型定义 + - **TemplateId** (str) - 模板ID + + + **FailPhoneDetail** + - **ExtendCode** (str) - 扩展号码 + - **FailureDetails** (str) - 发送失败原因。注:若模板/签名校验失败,该字段为空 + - **Phone** (str) - 手机号 + - **TemplateParams** (list) - 模板参数 + - **UserId** (str) - 用户自定义ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.SendBatchUSMSMessageRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("SendBatchUSMSMessage", d, **kwargs) + return apis.SendBatchUSMSMessageResponseSchema().loads(resp) + def send_usms_message( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ SendUSMSMessage - 发送短信息。短信字数超过70个后,按照每66个进行切割(因为要加上1/3), 2/3)等字样,占用4个字长)。短信最大长度不能超过600个字。每个汉字、数字、字母、字符都按一个字计 + """SendUSMSMessage - 调用接口SendUSMSMessage发送短信 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **PhoneNumbers** (list) - (Required) 电话号码数组,电话号码格式为(60)1xxxxxxxx,()中为国际长途区号(如中国为86或0086,两种格式都支持),后面为电话号码.若不传入国际区号,如1851623xxxx,则默认为国内手机号 - - **TemplateId** (str) - (Required) 模板ID。若指定的模板ID审核未通过(status不等于2)则不允许发送 - - **TemplateParams** (list) - (Required) 模板参数数组,以TempalteParams.0,TempalteParams.1.。。格式。若模板ID指定的模板无可变参数,则不传入该参数。模板参数个数与模板不匹配,则不允许发送 - - **SigContent** (str) - 使用的签名,如果不输入则使用默认签名,若没有申请默认签名不允许发送;若输入的签名没有申请,则无法发送 - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + - **TemplateId** (str) - (Required) 模板ID(也即短信模板申请时的工单ID),请到 `USMS控制台 `_ 的模板管理页面查看;使用的短信模板必须是已申请并通过审核; + - **ExtendCode** (str) - 短信扩展码,格式为阿拉伯数字串,默认不开通,如需开通请联系 UCloud技术支持 + - **SigContent** (str) - 短信签名内容,请到 `USMS控制台 `_ 的签名管理页面查看;使用的短信签名必须是已申请并且通过审核;(注:国内短信为必选参数、国际短信为可选参数) + - **TemplateParams** (list) - 模板可变参数,以数组的方式填写,举例,TemplateParams.0,TemplateParams.1,... 若模板中无可变参数,则该项可不填写;若模板中有可变参数,则该项为必填项,参数个数需与变量个数保持一致,否则无法发送; + - **UserId** (str) - 自定义的业务标识ID,字符串( 长度不能超过32 位),不支持 单引号、表情包符号等特殊字符 + **Response** - - **Action** (str) - 操作名称 - **Message** (str) - 发生错误时表示错误描述 - - **RetCode** (int) - 返回码 - **SessionNo** (str) - 本次提交发送的短信的唯一ID,可根据该值查询本次发送的短信列表 - + - **UserId** (str) - 本次提交的自定义业务标识ID,仅当发送时传入有效的UserId,才返回该字段。 + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.SendUSMSMessageRequestSchema().dumps(d) @@ -278,57 +627,133 @@ def send_usms_message( def update_usms_signature( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ UpdateUSMSSignature - 调用接口UpdateUSMSSignature修改未通过审核的短信签名,并重新提交审核 + """UpdateUSMSSignature - 调用接口UpdateUSMSSignature修改未通过审核的短信签名,并重新提交审核 **Request** - - **ProjectId** (str) - (Config) 项目ID,不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **File** (str) - (Required) 短信签名的资质证明文件,需先进行base64编码格式转换,此处填写转换后的字符串。文件大小不超过4 MB - - **SigContent** (str) - (Required) 新的短信签名名称;长度为2-12个字符, 可包含中文、数字和符号;无需填写【】或[],系统会自动添加 + - **ProjectId** (str) - (Config) 项目ID,不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **SigContent** (str) - (Required) 新的短信签名内容;长度为2-12个字符, 可包含中文、数字和符号;无需填写【】或[],系统会自动添加 - **SigId** (str) - (Required) 签名ID(也即短信签名申请时的工单ID),支持以数组的方式,举例,以SigIds.0、SigIds.1...SigIds.N方式传入 - **SigPurpose** (int) - (Required) 签名用途,0-自用,1-他用; - **SigType** (int) - (Required) 签名类型,说明如下:0-公司或企业的全称或简称;1-App应用的全称或简称;2-工信部备案网站的全称或简称;3-公众号或小程序的全称或简称;4-商标名的全称或简称;5-政府/机关事业单位/其他单位的全称或简称; - **CertificateType** (int) - 签名的资质证明文件类型,需与签名类型保持一致,说明如下:0-三证合一/企业营业执照/组织机构代码证书/社会信用代码证书;1-应用商店后台开发者管理截图;2-备案服务商的备案成功截图(含域名,网站名称,备案号);3-公众号或小程序的管理界面截图;4-商标注册证书;5-组织机构代码证书、社会信用代码证书; - - **ProxyFile** (str) - 短信签名授权委托文件,需先进行base64编码格式转换,此处填写转换后的字符串。文件大小不超过4 MB;当您是代理并使用第三方的签名时(也即SigPurpose为1-他用),该项为必填项; - + - **Document** (str) - 短信签名的资质证明文件URL,若未更改审核材料,则该处使用已上传审核材料的URL链接,否则使用File参数 + - **File** (str) - 短信签名的资质证明文件内容,需先进行base64编码格式转换,此处填写转换后的字符串。文件大小不超过4 MB。内容格式如下: [file type];[code type],[base64] 如:image/jpeg;base64,5YaF5a65 + - **ProxyDoc** (str) - 短信签名授权委托文件URL,若未更改授权委托文件,则该处填写已上传的授权委托文件的URL链接,否则使用ProxyFile参数 + - **ProxyFile** (str) - 短信签名授权委托文件内容,需先进行base64编码格式转换,此处填写转换后的字符串。文件大小不超过4 MB;当您是代理并使用第三方的签名时(也即SigPurpose为1-他用),该项为必填项;格式和File类似。 + - **SceneDesc** (str) - 短信签名对应的场景说明 + **Response** - **Message** (str) - 返回状态码描述,如果操作成功,默认返回为空 - + """ # build request - d = {"ProjectId": self.config.project_id} + d = { + "ProjectId": self.config.project_id, + } req and d.update(req) d = apis.UpdateUSMSSignatureRequestSchema().dumps(d) resp = self.invoke("UpdateUSMSSignature", d, **kwargs) return apis.UpdateUSMSSignatureResponseSchema().loads(resp) + def update_usms_signature_qualification( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateUSMSSignatureQualification - 修改短信签名资质申请记录 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **QualificationId** (str) - (Required) 资质Id + - **Status** (int) - (Required) 状态:0-草稿,1-提交审核 + - **Attr** (int) - 资质属性,0-自用 1-他用 + - **CompanyCertificateFileId** (str) - 公司证件文件FileId + - **CompanyCreditCode** (str) - 公司统一社会信用代码 + - **CompanyName** (str) - 公司名称,长度限制100 + - **CompanyWorkScenePhotosFileId** (str) - 公司工作现场照片FileId + - **HandlerHandHeldImageFileId** (str) - 经办人手持身份证图片FileId + - **HandlerIDCardBackImageFileId** (str) - 经办人身份证国徽面图片FileId + - **HandlerIDCardFrontImageFileId** (str) - 经办人身份证人像面图片FileId + - **HandlerIDNumber** (str) - 经办人身份证号码 + - **HandlerName** (str) - 经办人姓名 + - **ManagerIDNumber** (str) - 法人身份证号码 + - **ManagerName** (str) - 法人姓名 + - **Name** (str) - 资质名称 + + **Response** + + - **Message** (str) - 返回状态码描述,如果操作成功,默认返回为空 + - **QualificationId** (str) - 资质Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.UpdateUSMSSignatureQualificationRequestSchema().dumps(d) + + resp = self.invoke("UpdateUSMSSignatureQualification", d, **kwargs) + return apis.UpdateUSMSSignatureQualificationResponseSchema().loads(resp) + def update_usms_template( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ UpdateUSMSTemplate - 调用接口UpdateUSMSTemplate修改未通过审核的短信模板,并重新提交审核 + """UpdateUSMSTemplate - 调用接口UpdateUSMSTemplate修改未通过审核的短信模板,并重新提交审核 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - **Template** (str) - (Required) 新的模板内容。模板名称和模板内容必须提供一个,否则会报错。小于等于600个字 - **TemplateId** (str) - (Required) 短信模板ID + - **Instruction** (str) - 模板变量属性说明 - **Remark** (str) - 短信模板申请原因说明,字数不超过128,每个中文、符号、英文、数字等都计为1个字。 - **TemplateName** (str) - 新的模板名称。小于等于32个字,每个中文、英文、数组、符合都计为一个字 - - **UnsubscribeInfo** (str) - 当Purpose为3时,也即会员推广类短信模板,该项必填。枚举值:TD退订、回T退订、回N退订、回TD退订、退订回T、退订回D、退订回TD、退订回复T、退订回复D、退订回复N、退订回复TD、拒收回T - - **Zone** (str) - 可用区。参见 `可用区列表 `_ - + **Response** - **Message** (str) - 发生错误时表示错误描述 - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.UpdateUSMSTemplateRequestSchema().dumps(d) resp = self.invoke("UpdateUSMSTemplate", d, **kwargs) return apis.UpdateUSMSTemplateResponseSchema().loads(resp) + + def upload_usms_file( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UploadUSMSFile - 上传文件 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **FileContent** (str) - (Required) 文件内容,base64编码 + - **FileName** (str) - (Required) 文件名称,携带文件后缀 + - **Source** (int) - (Required) 文件来源,0-签名资质 + - **FileType** (str) - 文件类型,mime格式 + + **Response** + + - **FileId** (str) - 文件FileId + - **Message** (str) - 返回状态码描述,如果操作成功,默认返回为空 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.UploadUSMSFileRequestSchema().dumps(d) + + resp = self.invoke("UploadUSMSFile", d, **kwargs) + return apis.UploadUSMSFileResponseSchema().loads(resp) diff --git a/ucloud/services/usms/schemas/apis.py b/ucloud/services/usms/schemas/apis.py index e966547b..0e675e62 100644 --- a/ucloud/services/usms/schemas/apis.py +++ b/ucloud/services/usms/schemas/apis.py @@ -3,11 +3,96 @@ from ucloud.core.typesystem import schema, fields from ucloud.services.usms.schemas import models - """ USMS API Schema """ +""" +API: AddBackfill + +用户通过接口发送消息,当消息在终端被消费,调用该接口,进行记录。 +""" + + +class AddBackfillRequestSchema(schema.RequestSchema): + """AddBackfill - 用户通过接口发送消息,当消息在终端被消费,调用该接口,进行记录。""" + + fields = { + "BackfillTime": fields.Int(required=False, dump_to="BackfillTime"), + "Content": fields.Str(required=False, dump_to="Content"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=False, dump_to="Region"), + "SendNo": fields.Str(required=True, dump_to="SendNo"), + "SendTime": fields.Int(required=False, dump_to="SendTime"), + "Target": fields.Str(required=True, dump_to="Target"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class AddBackfillResponseSchema(schema.ResponseSchema): + """AddBackfill - 用户通过接口发送消息,当消息在终端被消费,调用该接口,进行记录。""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: AddUSMSSignatureQualification + +添加短信签名资质申请记录 +""" + + +class AddUSMSSignatureQualificationRequestSchema(schema.RequestSchema): + """AddUSMSSignatureQualification - 添加短信签名资质申请记录""" + + fields = { + "Attr": fields.Int(required=True, dump_to="Attr"), + "CompanyCertificateFileId": fields.Str( + required=False, dump_to="CompanyCertificateFileId" + ), + "CompanyCreditCode": fields.Str( + required=False, dump_to="CompanyCreditCode" + ), + "CompanyName": fields.Str(required=False, dump_to="CompanyName"), + "CompanyWorkScenePhotosFileId": fields.Str( + required=False, dump_to="CompanyWorkScenePhotosFileId" + ), + "HandlerHandHeldImageFileId": fields.Str( + required=False, dump_to="HandlerHandHeldImageFileId" + ), + "HandlerIDCardBackImageFileId": fields.Str( + required=False, dump_to="HandlerIDCardBackImageFileId" + ), + "HandlerIDCardFrontImageFileId": fields.Str( + required=False, dump_to="HandlerIDCardFrontImageFileId" + ), + "HandlerIDNumber": fields.Str( + required=False, dump_to="HandlerIDNumber" + ), + "HandlerName": fields.Str(required=False, dump_to="HandlerName"), + "ManagerIDNumber": fields.Str( + required=False, dump_to="ManagerIDNumber" + ), + "ManagerName": fields.Str(required=False, dump_to="ManagerName"), + "Name": fields.Str(required=True, dump_to="Name"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Status": fields.Int(required=True, dump_to="Status"), + } + + +class AddUSMSSignatureQualificationResponseSchema(schema.ResponseSchema): + """AddUSMSSignatureQualification - 添加短信签名资质申请记录""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "QualificationId": fields.Str( + required=True, load_from="QualificationId" + ), + } + + """ API: CreateUSMSSignature @@ -16,15 +101,19 @@ class CreateUSMSSignatureRequestSchema(schema.RequestSchema): - """ CreateUSMSSignature - 调用接口CreateUSMSSignature申请短信签名 - """ + """CreateUSMSSignature - 调用接口CreateUSMSSignature申请短信签名""" fields = { "CertificateType": fields.Int(required=True, dump_to="CertificateType"), "Description": fields.Str(required=True, dump_to="Description"), - "File": fields.Str(required=True, dump_to="File"), + "File": fields.Str(required=False, dump_to="File"), + "International": fields.Bool(required=False, dump_to="International"), "ProjectId": fields.Str(required=True, dump_to="ProjectId"), "ProxyFile": fields.Str(required=False, dump_to="ProxyFile"), + "QualificationId": fields.Str( + required=False, dump_to="QualificationId" + ), + "SceneDesc": fields.Str(required=False, dump_to="SceneDesc"), "SigContent": fields.Str(required=True, dump_to="SigContent"), "SigPurpose": fields.Int(required=True, dump_to="SigPurpose"), "SigType": fields.Int(required=True, dump_to="SigType"), @@ -32,12 +121,13 @@ class CreateUSMSSignatureRequestSchema(schema.RequestSchema): class CreateUSMSSignatureResponseSchema(schema.ResponseSchema): - """ CreateUSMSSignature - 调用接口CreateUSMSSignature申请短信签名 - """ + """CreateUSMSSignature - 调用接口CreateUSMSSignature申请短信签名""" fields = { "Message": fields.Str(required=True, load_from="Message"), - "SigContent": fields.Str(required=False, load_from="SigContent"), + "SigContent": fields.Str( + required=False, load_from="SigContent" + ), # Deprecated, will be removed at 1.0 "SigId": fields.Str(required=False, load_from="SigId"), } @@ -50,26 +140,30 @@ class CreateUSMSSignatureResponseSchema(schema.ResponseSchema): class CreateUSMSTemplateRequestSchema(schema.RequestSchema): - """ CreateUSMSTemplate - 调用接口CreateUSMSTemplate申请短信模板 - """ + """CreateUSMSTemplate - 调用接口CreateUSMSTemplate申请短信模板""" fields = { + "Instruction": fields.Str(required=False, dump_to="Instruction"), + "International": fields.Bool(required=False, dump_to="International"), "ProjectId": fields.Str(required=True, dump_to="ProjectId"), "Purpose": fields.Int(required=True, dump_to="Purpose"), - "Region": fields.Str(required=False, dump_to="Region"), + "Region": fields.Str( + required=False, dump_to="Region" + ), # Deprecated, will be removed at 1.0 "Remark": fields.Str(required=False, dump_to="Remark"), "Template": fields.Str(required=True, dump_to="Template"), "TemplateName": fields.Str(required=True, dump_to="TemplateName"), "UnsubscribeInfo": fields.Str( required=False, dump_to="UnsubscribeInfo" ), - "Zone": fields.Str(required=False, dump_to="Zone"), + "Zone": fields.Str( + required=False, dump_to="Zone" + ), # Deprecated, will be removed at 1.0 } class CreateUSMSTemplateResponseSchema(schema.ResponseSchema): - """ CreateUSMSTemplate - 调用接口CreateUSMSTemplate申请短信模板 - """ + """CreateUSMSTemplate - 调用接口CreateUSMSTemplate申请短信模板""" fields = { "Message": fields.Str(required=True, load_from="Message"), @@ -85,8 +179,7 @@ class CreateUSMSTemplateResponseSchema(schema.ResponseSchema): class DeleteUSMSSignatureRequestSchema(schema.RequestSchema): - """ DeleteUSMSSignature - 调用接口DeleteUSMSSignature删除短信签名 - """ + """DeleteUSMSSignature - 调用接口DeleteUSMSSignature删除短信签名""" fields = { "ProjectId": fields.Str(required=True, dump_to="ProjectId"), @@ -95,10 +188,35 @@ class DeleteUSMSSignatureRequestSchema(schema.RequestSchema): class DeleteUSMSSignatureResponseSchema(schema.ResponseSchema): - """ DeleteUSMSSignature - 调用接口DeleteUSMSSignature删除短信签名 - """ + """DeleteUSMSSignature - 调用接口DeleteUSMSSignature删除短信签名""" - fields = {"Message": fields.Str(required=True, load_from="Message")} + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DeleteUSMSSignatureQualification + +删除短信签名资质申请记录 +""" + + +class DeleteUSMSSignatureQualificationRequestSchema(schema.RequestSchema): + """DeleteUSMSSignatureQualification - 删除短信签名资质申请记录""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "QualificationIds": fields.List(fields.Str()), + } + + +class DeleteUSMSSignatureQualificationResponseSchema(schema.ResponseSchema): + """DeleteUSMSSignatureQualification - 删除短信签名资质申请记录""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } """ @@ -109,34 +227,37 @@ class DeleteUSMSSignatureResponseSchema(schema.ResponseSchema): class DeleteUSMSTemplateRequestSchema(schema.RequestSchema): - """ DeleteUSMSTemplate - 调用接口DeleteUSMSTemplate删除短信模板 - """ + """DeleteUSMSTemplate - 调用接口DeleteUSMSTemplate删除短信模板""" fields = { "ProjectId": fields.Str(required=True, dump_to="ProjectId"), - "Region": fields.Str(required=False, dump_to="Region"), + "Region": fields.Str( + required=False, dump_to="Region" + ), # Deprecated, will be removed at 1.0 "TemplateIds": fields.List(fields.Str()), - "Zone": fields.Str(required=False, dump_to="Zone"), + "Zone": fields.Str( + required=False, dump_to="Zone" + ), # Deprecated, will be removed at 1.0 } class DeleteUSMSTemplateResponseSchema(schema.ResponseSchema): - """ DeleteUSMSTemplate - 调用接口DeleteUSMSTemplate删除短信模板 - """ + """DeleteUSMSTemplate - 调用接口DeleteUSMSTemplate删除短信模板""" - fields = {"Message": fields.Str(required=True, load_from="Message")} + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } """ API: GetUSMSSendReceipt -获取短信发送回执信息。下游服务提供商回执信息返回会有一定延时,建议发送完短信以后,5-10分钟后再调用该接口拉取回执信息。若超过12小时未返回,则请联系技术支持确认原因 +调用接口GetUSMSSendReceipt短信发送状态信息 """ class GetUSMSSendReceiptRequestSchema(schema.RequestSchema): - """ GetUSMSSendReceipt - 获取短信发送回执信息。下游服务提供商回执信息返回会有一定延时,建议发送完短信以后,5-10分钟后再调用该接口拉取回执信息。若超过12小时未返回,则请联系技术支持确认原因 - """ + """GetUSMSSendReceipt - 调用接口GetUSMSSendReceipt短信发送状态信息""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -147,8 +268,7 @@ class GetUSMSSendReceiptRequestSchema(schema.RequestSchema): class GetUSMSSendReceiptResponseSchema(schema.ResponseSchema): - """ GetUSMSSendReceipt - 获取短信发送回执信息。下游服务提供商回执信息返回会有一定延时,建议发送完短信以后,5-10分钟后再调用该接口拉取回执信息。若超过12小时未返回,则请联系技术支持确认原因 - """ + """GetUSMSSendReceipt - 调用接口GetUSMSSendReceipt短信发送状态信息""" fields = { "Data": fields.List( @@ -158,6 +278,81 @@ class GetUSMSSendReceiptResponseSchema(schema.ResponseSchema): } +""" +API: GetUSMSSendStatistics + +获取发送统计数据 +""" + + +class GetUSMSSendStatisticsRequestSchema(schema.RequestSchema): + """GetUSMSSendStatistics - 获取发送统计数据""" + + fields = { + "BrevityCode": fields.Str(required=False, dump_to="BrevityCode"), + "Domestic": fields.Int(required=True, dump_to="Domestic"), + "EndDate": fields.Str(required=True, dump_to="EndDate"), + "NumPerPage": fields.Int(required=True, dump_to="NumPerPage"), + "OrderBy": fields.Str(required=True, dump_to="OrderBy"), + "OrderType": fields.Str(required=True, dump_to="OrderType"), + "Page": fields.Int(required=True, dump_to="Page"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Purpose": fields.Int(required=False, dump_to="Purpose"), + "StartDate": fields.Str(required=True, dump_to="StartDate"), + } + + +class GetUSMSSendStatisticsResponseSchema(schema.ResponseSchema): + """GetUSMSSendStatistics - 获取发送统计数据""" + + fields = { + "Data": fields.List( + models.StatisticsDataInfoSchema(), required=False, load_from="Data" + ), + "Message": fields.Str(required=False, load_from="Message"), + "StatisticsData": models.StatisticsDataSchema(), + "Total": fields.Int(required=False, load_from="Total"), + } + + +""" +API: GetUSMSSignatureQualification + +获取短信签名资质申请记录列表 +""" + + +class GetUSMSSignatureQualificationRequestSchema(schema.RequestSchema): + """GetUSMSSignatureQualification - 获取短信签名资质申请记录列表""" + + fields = { + "InAccountIds": fields.List(fields.Str()), + "NumPerPage": fields.Int(required=True, dump_to="NumPerPage"), + "OrderBy": fields.Str(required=True, dump_to="OrderBy"), + "OrderType": fields.Str(required=True, dump_to="OrderType"), + "Page": fields.Int(required=True, dump_to="Page"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "QualificationAttr": fields.Int( + required=False, dump_to="QualificationAttr" + ), + "Status": fields.Int(required=False, dump_to="Status"), + } + + +class GetUSMSSignatureQualificationResponseSchema(schema.ResponseSchema): + """GetUSMSSignatureQualification - 获取短信签名资质申请记录列表""" + + fields = { + "Data": fields.List( + models.OutSignatureQualificationSchema(), + required=False, + load_from="Data", + ), + "Message": fields.Str(required=True, load_from="Message"), + "Total": fields.Int(required=False, load_from="Total"), + } + + """ API: QueryUSMSSignature @@ -166,8 +361,7 @@ class GetUSMSSendReceiptResponseSchema(schema.ResponseSchema): class QueryUSMSSignatureRequestSchema(schema.RequestSchema): - """ QueryUSMSSignature - 调用接口QueryUSMSSignature查询短信签名申请状态 - """ + """QueryUSMSSignature - 调用接口QueryUSMSSignature查询短信签名申请状态""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), @@ -177,8 +371,7 @@ class QueryUSMSSignatureRequestSchema(schema.RequestSchema): class QueryUSMSSignatureResponseSchema(schema.ResponseSchema): - """ QueryUSMSSignature - 调用接口QueryUSMSSignature查询短信签名申请状态 - """ + """QueryUSMSSignature - 调用接口QueryUSMSSignature查询短信签名申请状态""" fields = { "Data": models.OutSignatureSchema(), @@ -186,6 +379,31 @@ class QueryUSMSSignatureResponseSchema(schema.ResponseSchema): } +""" +API: QueryUSMSSignatureQualification + +获取短信签名资质申请记录详情 +""" + + +class QueryUSMSSignatureQualificationRequestSchema(schema.RequestSchema): + """QueryUSMSSignatureQualification - 获取短信签名资质申请记录详情""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "QualificationId": fields.Str(required=True, dump_to="QualificationId"), + } + + +class QueryUSMSSignatureQualificationResponseSchema(schema.ResponseSchema): + """QueryUSMSSignatureQualification - 获取短信签名资质申请记录详情""" + + fields = { + "Data": models.OutSignatureQualificationDetailSchema(), + "Message": fields.Str(required=True, load_from="Message"), + } + + """ API: QueryUSMSTemplate @@ -194,8 +412,7 @@ class QueryUSMSSignatureResponseSchema(schema.ResponseSchema): class QueryUSMSTemplateRequestSchema(schema.RequestSchema): - """ QueryUSMSTemplate - 调用接口QueryUSMSTemplate查询短信模板申请状态 - """ + """QueryUSMSTemplate - 调用接口QueryUSMSTemplate查询短信模板申请状态""" fields = { "ProjectId": fields.Str(required=True, dump_to="ProjectId"), @@ -204,8 +421,7 @@ class QueryUSMSTemplateRequestSchema(schema.RequestSchema): class QueryUSMSTemplateResponseSchema(schema.ResponseSchema): - """ QueryUSMSTemplate - 调用接口QueryUSMSTemplate查询短信模板申请状态 - """ + """QueryUSMSTemplate - 调用接口QueryUSMSTemplate查询短信模板申请状态""" fields = { "Data": models.OutTemplateSchema(), @@ -213,37 +429,70 @@ class QueryUSMSTemplateResponseSchema(schema.ResponseSchema): } +""" +API: SendBatchUSMSMessage + +调用SendBatchUSMSMessage接口批量发送短信 +""" + + +class SendBatchUSMSMessageRequestSchema(schema.RequestSchema): + """SendBatchUSMSMessage - 调用SendBatchUSMSMessage接口批量发送短信""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "TaskContent": fields.Str(required=True, dump_to="TaskContent"), + } + + +class SendBatchUSMSMessageResponseSchema(schema.ResponseSchema): + """SendBatchUSMSMessage - 调用SendBatchUSMSMessage接口批量发送短信""" + + fields = { + "FailContent": fields.List( + models.BatchInfoSchema(), required=False, load_from="FailContent" + ), + "Message": fields.Str(required=True, load_from="Message"), + "ReqUuid": fields.Str(required=False, load_from="ReqUuid"), + "SessionNo": fields.Str(required=False, load_from="SessionNo"), + "SuccessCount": fields.Int(required=False, load_from="SuccessCount"), + } + + """ API: SendUSMSMessage -发送短信息。短信字数超过70个后,按照每66个进行切割(因为要加上1/3), 2/3)等字样,占用4个字长)。短信最大长度不能超过600个字。每个汉字、数字、字母、字符都按一个字计 +调用接口SendUSMSMessage发送短信 """ class SendUSMSMessageRequestSchema(schema.RequestSchema): - """ SendUSMSMessage - 发送短信息。短信字数超过70个后,按照每66个进行切割(因为要加上1/3), 2/3)等字样,占用4个字长)。短信最大长度不能超过600个字。每个汉字、数字、字母、字符都按一个字计 - """ + """SendUSMSMessage - 调用接口SendUSMSMessage发送短信""" fields = { + "ExtendCode": fields.Str(required=False, dump_to="ExtendCode"), "PhoneNumbers": fields.List(fields.Str()), - "ProjectId": fields.Str(required=False, dump_to="ProjectId"), - "Region": fields.Str(required=False, dump_to="Region"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str( + required=False, dump_to="Region" + ), # Deprecated, will be removed at 1.0 "SigContent": fields.Str(required=False, dump_to="SigContent"), "TemplateId": fields.Str(required=True, dump_to="TemplateId"), "TemplateParams": fields.List(fields.Str()), - "Zone": fields.Str(required=False, dump_to="Zone"), + "UserId": fields.Str(required=False, dump_to="UserId"), + "Zone": fields.Str( + required=False, dump_to="Zone" + ), # Deprecated, will be removed at 1.0 } class SendUSMSMessageResponseSchema(schema.ResponseSchema): - """ SendUSMSMessage - 发送短信息。短信字数超过70个后,按照每66个进行切割(因为要加上1/3), 2/3)等字样,占用4个字长)。短信最大长度不能超过600个字。每个汉字、数字、字母、字符都按一个字计 - """ + """SendUSMSMessage - 调用接口SendUSMSMessage发送短信""" fields = { - "Action": fields.Str(required=True, load_from="Action"), "Message": fields.Str(required=True, load_from="Message"), - "RetCode": fields.Int(required=True, load_from="RetCode"), "SessionNo": fields.Str(required=False, load_from="SessionNo"), + "UserId": fields.Str(required=False, load_from="UserId"), } @@ -255,16 +504,18 @@ class SendUSMSMessageResponseSchema(schema.ResponseSchema): class UpdateUSMSSignatureRequestSchema(schema.RequestSchema): - """ UpdateUSMSSignature - 调用接口UpdateUSMSSignature修改未通过审核的短信签名,并重新提交审核 - """ + """UpdateUSMSSignature - 调用接口UpdateUSMSSignature修改未通过审核的短信签名,并重新提交审核""" fields = { "CertificateType": fields.Int( required=False, dump_to="CertificateType" ), - "File": fields.Str(required=True, dump_to="File"), + "Document": fields.Str(required=False, dump_to="Document"), + "File": fields.Str(required=False, dump_to="File"), "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "ProxyDoc": fields.Str(required=False, dump_to="ProxyDoc"), "ProxyFile": fields.Str(required=False, dump_to="ProxyFile"), + "SceneDesc": fields.Str(required=False, dump_to="SceneDesc"), "SigContent": fields.Str(required=True, dump_to="SigContent"), "SigId": fields.Str(required=True, dump_to="SigId"), "SigPurpose": fields.Int(required=True, dump_to="SigPurpose"), @@ -273,10 +524,68 @@ class UpdateUSMSSignatureRequestSchema(schema.RequestSchema): class UpdateUSMSSignatureResponseSchema(schema.ResponseSchema): - """ UpdateUSMSSignature - 调用接口UpdateUSMSSignature修改未通过审核的短信签名,并重新提交审核 - """ + """UpdateUSMSSignature - 调用接口UpdateUSMSSignature修改未通过审核的短信签名,并重新提交审核""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } - fields = {"Message": fields.Str(required=True, load_from="Message")} + +""" +API: UpdateUSMSSignatureQualification + +修改短信签名资质申请记录 +""" + + +class UpdateUSMSSignatureQualificationRequestSchema(schema.RequestSchema): + """UpdateUSMSSignatureQualification - 修改短信签名资质申请记录""" + + fields = { + "Attr": fields.Int(required=False, dump_to="Attr"), + "CompanyCertificateFileId": fields.Str( + required=False, dump_to="CompanyCertificateFileId" + ), + "CompanyCreditCode": fields.Str( + required=False, dump_to="CompanyCreditCode" + ), + "CompanyName": fields.Str(required=False, dump_to="CompanyName"), + "CompanyWorkScenePhotosFileId": fields.Str( + required=False, dump_to="CompanyWorkScenePhotosFileId" + ), + "HandlerHandHeldImageFileId": fields.Str( + required=False, dump_to="HandlerHandHeldImageFileId" + ), + "HandlerIDCardBackImageFileId": fields.Str( + required=False, dump_to="HandlerIDCardBackImageFileId" + ), + "HandlerIDCardFrontImageFileId": fields.Str( + required=False, dump_to="HandlerIDCardFrontImageFileId" + ), + "HandlerIDNumber": fields.Str( + required=False, dump_to="HandlerIDNumber" + ), + "HandlerName": fields.Str(required=False, dump_to="HandlerName"), + "ManagerIDNumber": fields.Str( + required=False, dump_to="ManagerIDNumber" + ), + "ManagerName": fields.Str(required=False, dump_to="ManagerName"), + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "QualificationId": fields.Str(required=True, dump_to="QualificationId"), + "Status": fields.Int(required=True, dump_to="Status"), + } + + +class UpdateUSMSSignatureQualificationResponseSchema(schema.ResponseSchema): + """UpdateUSMSSignatureQualification - 修改短信签名资质申请记录""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + "QualificationId": fields.Str( + required=False, load_from="QualificationId" + ), + } """ @@ -287,25 +596,58 @@ class UpdateUSMSSignatureResponseSchema(schema.ResponseSchema): class UpdateUSMSTemplateRequestSchema(schema.RequestSchema): - """ UpdateUSMSTemplate - 调用接口UpdateUSMSTemplate修改未通过审核的短信模板,并重新提交审核 - """ + """UpdateUSMSTemplate - 调用接口UpdateUSMSTemplate修改未通过审核的短信模板,并重新提交审核""" fields = { + "Instruction": fields.Str(required=False, dump_to="Instruction"), "ProjectId": fields.Str(required=True, dump_to="ProjectId"), - "Region": fields.Str(required=False, dump_to="Region"), + "Region": fields.Str( + required=False, dump_to="Region" + ), # Deprecated, will be removed at 1.0 "Remark": fields.Str(required=False, dump_to="Remark"), "Template": fields.Str(required=True, dump_to="Template"), "TemplateId": fields.Str(required=True, dump_to="TemplateId"), "TemplateName": fields.Str(required=False, dump_to="TemplateName"), "UnsubscribeInfo": fields.Str( required=False, dump_to="UnsubscribeInfo" - ), - "Zone": fields.Str(required=False, dump_to="Zone"), + ), # Deprecated, will be removed at 1.0 + "Zone": fields.Str( + required=False, dump_to="Zone" + ), # Deprecated, will be removed at 1.0 } class UpdateUSMSTemplateResponseSchema(schema.ResponseSchema): - """ UpdateUSMSTemplate - 调用接口UpdateUSMSTemplate修改未通过审核的短信模板,并重新提交审核 - """ + """UpdateUSMSTemplate - 调用接口UpdateUSMSTemplate修改未通过审核的短信模板,并重新提交审核""" - fields = {"Message": fields.Str(required=True, load_from="Message")} + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: UploadUSMSFile + +上传文件 +""" + + +class UploadUSMSFileRequestSchema(schema.RequestSchema): + """UploadUSMSFile - 上传文件""" + + fields = { + "FileContent": fields.Str(required=True, dump_to="FileContent"), + "FileName": fields.Str(required=True, dump_to="FileName"), + "FileType": fields.Str(required=False, dump_to="FileType"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Source": fields.Int(required=True, dump_to="Source"), + } + + +class UploadUSMSFileResponseSchema(schema.ResponseSchema): + """UploadUSMSFile - 上传文件""" + + fields = { + "FileId": fields.Str(required=True, load_from="FileId"), + "Message": fields.Str(required=True, load_from="Message"), + } diff --git a/ucloud/services/usms/schemas/models.py b/ucloud/services/usms/schemas/models.py index 02183df0..66214c44 100644 --- a/ucloud/services/usms/schemas/models.py +++ b/ucloud/services/usms/schemas/models.py @@ -4,21 +4,21 @@ class ReceiptPerPhoneSchema(schema.ResponseSchema): - """ ReceiptPerPhone - 每个目的手机号的发送回执信息 - """ + """ReceiptPerPhone - 每个目的手机号的发送回执信息""" fields = { "CostCount": fields.Int(required=True, load_from="CostCount"), "Phone": fields.Str(required=True, load_from="Phone"), + "ReceiptCode": fields.Str(required=True, load_from="ReceiptCode"), "ReceiptDesc": fields.Str(required=True, load_from="ReceiptDesc"), "ReceiptResult": fields.Str(required=True, load_from="ReceiptResult"), "ReceiptTime": fields.Int(required=True, load_from="ReceiptTime"), + "UserId": fields.Str(required=True, load_from="UserId"), } class ReceiptPerSessionSchema(schema.ResponseSchema): - """ ReceiptPerSession - 每个提交的回执结果集合 - """ + """ReceiptPerSession - 每个提交的回执结果集合""" fields = { "ReceiptSet": fields.List(ReceiptPerPhoneSchema()), @@ -26,9 +26,89 @@ class ReceiptPerSessionSchema(schema.ResponseSchema): } +class StatisticsDataInfoSchema(schema.ResponseSchema): + """StatisticsDataInfo - 统计信息按天聚合""" + + fields = { + "BrevityCode": fields.Str(required=True, load_from="BrevityCode"), + "CostCount": fields.Int(required=True, load_from="CostCount"), + "Count": fields.Int(required=True, load_from="Count"), + "FailedCostCount": fields.Int( + required=True, load_from="FailedCostCount" + ), + "FailedCount": fields.Int(required=True, load_from="FailedCount"), + "SendDate": fields.Str(required=True, load_from="SendDate"), + "SubmitFailedCostCount": fields.Int( + required=True, load_from="SubmitFailedCostCount" + ), + "SubmitFailedCount": fields.Int( + required=True, load_from="SubmitFailedCount" + ), + "SuccessCostCount": fields.Int( + required=True, load_from="SuccessCostCount" + ), + "SuccessCount": fields.Int(required=True, load_from="SuccessCount"), + "SuccessRate": fields.Float(required=True, load_from="SuccessRate"), + "UnknownCostCount": fields.Int( + required=True, load_from="UnknownCostCount" + ), + "UnknownCount": fields.Int(required=True, load_from="UnknownCount"), + "UserId": fields.Str(required=True, load_from="UserId"), + } + + +class StatisticsDataSchema(schema.ResponseSchema): + """StatisticsData - 统计信息""" + + fields = { + "FailCostCount": fields.Int(required=True, load_from="FailCostCount"), + "FailCount": fields.Int(required=True, load_from="FailCount"), + "SendCostCount": fields.Int(required=True, load_from="SendCostCount"), + "SendCount": fields.Int(required=True, load_from="SendCount"), + "SubmitFailCostCount": fields.Int( + required=True, load_from="SubmitFailCostCount" + ), + "SubmitFailCount": fields.Int( + required=True, load_from="SubmitFailCount" + ), + "SuccessCostCount": fields.Int( + required=True, load_from="SuccessCostCount" + ), + "SuccessCount": fields.Int(required=True, load_from="SuccessCount"), + "UnknownCostCount": fields.Int( + required=True, load_from="UnknownCostCount" + ), + "UnknownCount": fields.Int(required=True, load_from="UnknownCount"), + } + + +class OutSignatureQualificationSchema(schema.ResponseSchema): + """OutSignatureQualification -""" + + fields = { + "AccountId": fields.Int(required=False, load_from="AccountId"), + "Attr": fields.Int(required=False, load_from="Attr"), + "CompanyName": fields.Str(required=False, load_from="CompanyName"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "ErrCode": fields.Int(required=False, load_from="ErrCode"), + "ErrDesc": fields.Str(required=False, load_from="ErrDesc"), + "HandlerName": fields.Str(required=False, load_from="HandlerName"), + "ManagerName": fields.Str(required=False, load_from="ManagerName"), + "ModifyTime": fields.Int(required=False, load_from="ModifyTime"), + "Name": fields.Str(required=False, load_from="Name"), + "QualificationId": fields.Str( + required=False, load_from="QualificationId" + ), + "ReviewEndTime": fields.Int(required=False, load_from="ReviewEndTime"), + "ReviewStartTime": fields.Int( + required=False, load_from="ReviewStartTime" + ), + "Status": fields.Int(required=False, load_from="Status"), + } + + class OutSignatureSchema(schema.ResponseSchema): - """ OutSignature - 短信签名 - """ + """OutSignature - 短信签名""" fields = { "ErrDesc": fields.Str(required=True, load_from="ErrDesc"), @@ -38,13 +118,64 @@ class OutSignatureSchema(schema.ResponseSchema): } +class OutSignatureQualificationDetailSchema(schema.ResponseSchema): + """OutSignatureQualificationDetail -""" + + fields = { + "Attr": fields.Int(required=False, load_from="Attr"), + "CompanyCertificateFile": fields.Str( + required=False, load_from="CompanyCertificateFile" + ), + "CompanyCreditCode": fields.Str( + required=False, load_from="CompanyCreditCode" + ), + "CompanyName": fields.Str(required=False, load_from="CompanyName"), + "CompanyWorkScenePhotos": fields.Str( + required=False, load_from="CompanyWorkScenePhotos" + ), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "ErrCode": fields.Int(required=False, load_from="ErrCode"), + "ErrDesc": fields.Str(required=False, load_from="ErrDesc"), + "HandlerHandHeldImage": fields.Str( + required=False, load_from="HandlerHandHeldImage" + ), + "HandlerIDCardBackImage": fields.Str( + required=False, load_from="HandlerIDCardBackImage" + ), + "HandlerIDCardFrontImage": fields.Str( + required=False, load_from="HandlerIDCardFrontImage" + ), + "HandlerIDNumber": fields.Str( + required=False, load_from="HandlerIDNumber" + ), + "HandlerName": fields.Str(required=False, load_from="HandlerName"), + "ManagerIDNumber": fields.Str( + required=False, load_from="ManagerIDNumber" + ), + "ManagerName": fields.Str(required=False, load_from="ManagerName"), + "ModifyTime": fields.Int(required=False, load_from="ModifyTime"), + "Name": fields.Str(required=False, load_from="Name"), + "PowerOfAttorney": fields.Str( + required=False, load_from="PowerOfAttorney" + ), + "QualificationId": fields.Str( + required=False, load_from="QualificationId" + ), + "ReviewEndTime": fields.Int(required=False, load_from="ReviewEndTime"), + "ReviewStartTime": fields.Int( + required=False, load_from="ReviewStartTime" + ), + "Status": fields.Int(required=False, load_from="Status"), + } + + class OutTemplateSchema(schema.ResponseSchema): - """ OutTemplate - 短信模板 - """ + """OutTemplate - 短信模板""" fields = { "CreateTime": fields.Int(required=True, load_from="CreateTime"), "ErrDesc": fields.Str(required=True, load_from="ErrDesc"), + "Instruction": fields.Str(required=False, load_from="Instruction"), "Purpose": fields.Int(required=True, load_from="Purpose"), "Remark": fields.Str(required=True, load_from="Remark"), "Status": fields.Int(required=True, load_from="Status"), @@ -55,3 +186,30 @@ class OutTemplateSchema(schema.ResponseSchema): required=True, load_from="UnsubscribeInfo" ), } + + +class FailPhoneDetailSchema(schema.ResponseSchema): + """FailPhoneDetail - 批量任务中,未能成功发送的号码及其原因""" + + fields = { + "ExtendCode": fields.Str(required=False, load_from="ExtendCode"), + "FailureDetails": fields.Str( + required=False, load_from="FailureDetails" + ), + "Phone": fields.Str(required=True, load_from="Phone"), + "TemplateParams": fields.List(fields.Str()), + "UserId": fields.Str(required=False, load_from="UserId"), + } + + +class BatchInfoSchema(schema.ResponseSchema): + """BatchInfo - 批量发送任务中未能成功发送的信息详情,“模板+签名”粒度""" + + fields = { + "FailureDetails": fields.Str( + required=False, load_from="FailureDetails" + ), + "SigContent": fields.Str(required=True, load_from="SigContent"), + "Target": fields.List(FailPhoneDetailSchema()), + "TemplateId": fields.Str(required=True, load_from="TemplateId"), + } diff --git a/ucloud/services/utsdb/__init__.py b/ucloud/services/utsdb/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/utsdb/client.py b/ucloud/services/utsdb/client.py new file mode 100644 index 00000000..25566928 --- /dev/null +++ b/ucloud/services/utsdb/client.py @@ -0,0 +1,604 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.utsdb.schemas import apis + + +class UTSDBClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UTSDBClient, self).__init__(config, transport, middleware, logger) + + def check_uinfluxdb_allowance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CheckUInfluxdbAllowance - 检查UInfluxdb剩余资源 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Count** (int) - (Required) 创建实例的数量,[1-10] + - **CpuLimit** (int) - (Required) 核数 单位:个,范围[2C8G, 4C16G, 8C32G, 16C64G, 32C128G] + - **MemoryLimit** (int) - (Required) 内存限制 单位:G 范围 [2C8G, 4C16G, 8C32G, 16C64G, 32C128G] + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Count** (int) - 可创建的数量 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CheckUInfluxdbAllowanceRequestSchema().dumps(d) + + resp = self.invoke("CheckUInfluxdbAllowance", d, **kwargs) + return apis.CheckUInfluxdbAllowanceResponseSchema().loads(resp) + + def create_uinfluxdb_database( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUInfluxdbDatabase - 创建Influxdb数据库 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DatabaseName** (str) - (Required) Influxdb创建的数据库的名称 + - **UInfluxdbId** (str) - (Required) 实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **AccoutName** (str) - Influxdb数据库账号 + - **Description** (str) - Influxdb数据库的描述 + - **RetentionPolicy** (str) - 数据保留策略,以天为单位,比如(1d,2d,3d等,inf为永久保留策略,默认为inf) + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateUInfluxdbDatabaseRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUInfluxdbDatabase", d, **kwargs) + return apis.CreateUInfluxdbDatabaseResponseSchema().loads(resp) + + def create_uinfluxdb_database_rp( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUInfluxdbDatabaseRP - 给指定的database创建一个保留策略,最多可以创建10个RP + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DatabaseName** (str) - (Required) 要创建RP的数据库 + - **RetentionPolicy** (str) - (Required) 数据保留策略,以天为单位,比如(1d,2d,3d等,inf为永久保留策略,默认为inf) + - **RetentionPolicyName** (str) - (Required) 保留策略名 + - **UInfluxdbId** (str) - (Required) 实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 如果执行失败, 失败的错误消息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateUInfluxdbDatabaseRPRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUInfluxdbDatabaseRP", d, **kwargs) + return apis.CreateUInfluxdbDatabaseRPResponseSchema().loads(resp) + + def create_uinfluxdb_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateUInfluxdbInstance - 创建UInfluxdb实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **AccountName** (str) - (Required) 默认账户 + - **ChargeType** (str) - (Required) 付费类型,后付费阶段固定为:后付费(PostPaid) + - **CpuLimit** (int) - (Required) 核数 单位:个,范围[2C8G, 4C16G, 8C32G, 16C64G, 32C128G] + - **DatabaseName** (str) - (Required) 数据库名称 + - **MemoryLimit** (int) - (Required) 内存限制 单位:G 范围 [2C8G, 4C16G, 8C32G, 16C64G, 32C128G] + - **Name** (str) - (Required) 实例名称,长度(6<=size<=63) + - **Password** (str) - (Required) 默认账户的密码,需要 base64 编码 + - **Quantity** (int) - (Required) 购买时长,默认值1 + - **SubnetId** (str) - (Required) 子网 id + - **VPCId** (str) - (Required) VPC id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **CouponId** (str) - 使用的代金券id + - **Tag** (str) - 业务组名称 + + **Response** + + - **UInfluxdbId** (str) - 返回的实例id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateUInfluxdbInstanceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateUInfluxdbInstance", d, **kwargs) + return apis.CreateUInfluxdbInstanceResponseSchema().loads(resp) + + def delete_uinfluxdb_database( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUInfluxdbDatabase - 删除Influxdb实例的数据库 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DatabaseName** (str) - (Required) 数据库名称 + - **UInfluxdbId** (str) - (Required) 实例id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteUInfluxdbDatabaseRequestSchema().dumps(d) + + resp = self.invoke("DeleteUInfluxdbDatabase", d, **kwargs) + return apis.DeleteUInfluxdbDatabaseResponseSchema().loads(resp) + + def delete_uinfluxdb_database_rp( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUInfluxdbDatabaseRP - 删除指定数据库下面的一个数据保留策略 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DatabaseName** (str) - (Required) 要删除的RP所在数据库 + - **RetentionPolicyName** (str) - (Required) 要删除的保留策略 + - **UInfluxdbId** (str) - (Required) 实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 如果执行失败, 失败的错误消息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteUInfluxdbDatabaseRPRequestSchema().dumps(d) + + resp = self.invoke("DeleteUInfluxdbDatabaseRP", d, **kwargs) + return apis.DeleteUInfluxdbDatabaseRPResponseSchema().loads(resp) + + def delete_uinfluxdb_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteUInfluxdbInstance - 删除UInfluxdb实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UInfluxdbId** (str) - (Required) UInfluxdb 实例id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteUInfluxdbInstanceRequestSchema().dumps(d) + + resp = self.invoke("DeleteUInfluxdbInstance", d, **kwargs) + return apis.DeleteUInfluxdbInstanceResponseSchema().loads(resp) + + def describe_uinfluxdb_database( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUInfluxdbDatabase - 描述UInfluxdb数据库 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UInfluxdbId** (str) - (Required) + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **DatabaseName** (str) - + - **Limit** (int) - + - **Offset** (int) - + + **Response** + + - **DatabaseInfo** (list) - 见 **DatabaseInfo** 模型定义 + + **Response Model** + + **AccountInfo** + - **Account** (str) - 账户名 + - **Password** (str) - 密码 + - **Privilege** (str) - 权限 + + + **DatabaseInfo** + - **AccountInfo** (list) - 见 **AccountInfo** 模型定义 + - **DatabaseName** (str) - 数据库名 + - **Description** (str) - 数据库描述 + - **RetentionPolicy** (str) - 保留策略 + - **State** (str) - 数据库状态 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUInfluxdbDatabaseRequestSchema().dumps(d) + + resp = self.invoke("DescribeUInfluxdbDatabase", d, **kwargs) + return apis.DescribeUInfluxdbDatabaseResponseSchema().loads(resp) + + def describe_uinfluxdb_database_rp( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUInfluxdbDatabaseRP - 获取指定数据库下面的所有保留策略 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DatabaseName** (str) - (Required) 数据库名称 + - **UInfluxdbId** (str) - (Required) 实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **DataSet** (list) - 见 **RpData** 模型定义 + - **Message** (str) - 如果执行失败, 失败的错误消息 + + **Response Model** + + **RpData** + - **Policy** (str) - 保留策略 + - **RetentionPolicyName** (str) - 保留策略名 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUInfluxdbDatabaseRPRequestSchema().dumps(d) + + resp = self.invoke("DescribeUInfluxdbDatabaseRP", d, **kwargs) + return apis.DescribeUInfluxdbDatabaseRPResponseSchema().loads(resp) + + def describe_uinfluxdb_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUInfluxdbInstance - 拉取UInfluxdb实例列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Limit** (int) - 分页显示数量,列表操作则指定 + - **Offset** (int) - 分页显示起始偏移位置,列表操作则指定 + - **UInfluxdbId** (str) - 指定id的话,会拉取该实例信息,否则拉取该帐号所有信息 + + **Response** + + - **DataSet** (list) - 见 **UInfluxdbDataSet** 模型定义 + + **Response Model** + + **UInfluxdbDataSet** + - **AccountName** (str) - 账户名 + - **CPULimit** (int) - 实例核数 + - **ChargeType** (str) - 付费类型,可选值如下: Year: 按年付费 Month: 按月付费 Dynamic: 按需付费(单位: 小时) Trial: 免费试用 + - **CreateTime** (int) - 创建时间 + - **ExpiredTime** (int) - 修改时间 + - **MemoryLimit** (int) - 实例内存 + - **Name** (str) - 实例名称 + - **Port** (int) - 实例端口 + - **State** (str) - 实例状态 + - **SubnetId** (str) - 子网ID + - **Tag** (str) - 业务组信息 + - **UInfluxdbId** (str) - 实例id + - **UsedSize** (int) - 硬盘使用量 + - **VPCId** (str) - VPC的ID + - **VirtualIP** (str) - 实例ip + - **Zone** (str) - UInfluxdb实例所在可用区 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUInfluxdbInstanceRequestSchema().dumps(d) + + resp = self.invoke("DescribeUInfluxdbInstance", d, **kwargs) + return apis.DescribeUInfluxdbInstanceResponseSchema().loads(resp) + + def describe_uinfluxdb_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUInfluxdbPrice - 获取UInfluxdb价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **CpuLimit** (int) - (Required) 核数 单位:个,规格[2C8G, 4C16G, 8C32G, 16C64G, 32C128G] + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ChargeType** (str) - 付费类型,后付费。填:PostPaid (后付费) + - **MemoryLimit** (int) - 内存限制 单位:G 规格 [2C8G, 4C16G, 8C32G, 16C64G, 32C128G] + - **Quantity** (int) - 付费周期数量 + + **Response** + + - **OriginalPrice** (float) - 原价 + - **Price** (float) - 价格 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUInfluxdbPriceRequestSchema().dumps(d) + + resp = self.invoke("DescribeUInfluxdbPrice", d, **kwargs) + return apis.DescribeUInfluxdbPriceResponseSchema().loads(resp) + + def describe_uinfluxdb_upgrade_price( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeUInfluxdbUpgradePrice - 获取UIfluxdb升降级价格 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **CpuLimit** (int) - (Required) 核数 + - **MemoryLimit** (int) - (Required) 容量,单位GB + - **UInfluxdbId** (str) - (Required) UInfluxdb 实例id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + - **OriginalPrice** (float) - 原价 + - **TotalPrice** (float) - 升降级价格 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeUInfluxdbUpgradePriceRequestSchema().dumps(d) + + resp = self.invoke("DescribeUInfluxdbUpgradePrice", d, **kwargs) + return apis.DescribeUInfluxdbUpgradePriceResponseSchema().loads(resp) + + def modify_uinfluxdb_database_policy( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyUInfluxdbDatabasePolicy - 更改UInfluxdb实例数据库数据保留策略 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DatabaseName** (str) - (Required) 数据库名 + - **RetentionPolicy** (str) - (Required) 数据库数据保留策略。自定义格式如:10d(即10天),2w(即两周), + - **UInfluxdbId** (str) - (Required) Influxdb实例id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyUInfluxdbDatabasePolicyRequestSchema().dumps(d) + + resp = self.invoke("ModifyUInfluxdbDatabasePolicy", d, **kwargs) + return apis.ModifyUInfluxdbDatabasePolicyResponseSchema().loads(resp) + + def reboot_uinfluxdb_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """RebootUInfluxdbInstance - 重启UInfluxdb实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UInfluxdbId** (str) - (Required) UInfluxdb实例id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.RebootUInfluxdbInstanceRequestSchema().dumps(d) + + resp = self.invoke("RebootUInfluxdbInstance", d, **kwargs) + return apis.RebootUInfluxdbInstanceResponseSchema().loads(resp) + + def reset_uinfluxdb_instance_name( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ResetUInfluxdbInstanceName - 更改UIfluxdb实例名称 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **NewName** (str) - (Required) 实例的新名字, 长度要求为6~63位 + - **UInfluxdbId** (str) - (Required) UInfluxdb实例id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ResetUInfluxdbInstanceNameRequestSchema().dumps(d) + + resp = self.invoke("ResetUInfluxdbInstanceName", d, **kwargs) + return apis.ResetUInfluxdbInstanceNameResponseSchema().loads(resp) + + def start_uinfluxdb_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """StartUInfluxdbInstance - 启动UInfluxdb实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UInfluxdbId** (str) - (Required) UInfluxdb实例id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.StartUInfluxdbInstanceRequestSchema().dumps(d) + + resp = self.invoke("StartUInfluxdbInstance", d, **kwargs) + return apis.StartUInfluxdbInstanceResponseSchema().loads(resp) + + def stop_uinfluxdb_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """StopUInfluxdbInstance - 关闭UInfluxdb实例 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **UInfluxdbId** (str) - (Required) UInfluxdb实例id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.StopUInfluxdbInstanceRequestSchema().dumps(d) + + resp = self.invoke("StopUInfluxdbInstance", d, **kwargs) + return apis.StopUInfluxdbInstanceResponseSchema().loads(resp) + + def upgrade_uinfluxdb_instance( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpgradeUInfluxdbInstance - UInfluxdb实例配置升降级 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **CpuLimit** (int) - (Required) UInfluxdb 实例 新的核数,单位个 + - **MemoryLimit** (int) - (Required) UInfluxdb 实例 新的内存 + - **UInfluxdbId** (str) - (Required) 实例ID + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpgradeUInfluxdbInstanceRequestSchema().dumps(d) + + resp = self.invoke("UpgradeUInfluxdbInstance", d, **kwargs) + return apis.UpgradeUInfluxdbInstanceResponseSchema().loads(resp) diff --git a/ucloud/services/utsdb/schemas/__init__.py b/ucloud/services/utsdb/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/utsdb/schemas/apis.py b/ucloud/services/utsdb/schemas/apis.py new file mode 100644 index 00000000..8ef23a51 --- /dev/null +++ b/ucloud/services/utsdb/schemas/apis.py @@ -0,0 +1,515 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.utsdb.schemas import models + +""" UTSDB API Schema +""" + + +""" +API: CheckUInfluxdbAllowance + +检查UInfluxdb剩余资源 +""" + + +class CheckUInfluxdbAllowanceRequestSchema(schema.RequestSchema): + """CheckUInfluxdbAllowance - 检查UInfluxdb剩余资源""" + + fields = { + "Count": fields.Int(required=True, dump_to="Count"), + "CpuLimit": fields.Int(required=True, dump_to="CpuLimit"), + "MemoryLimit": fields.Int(required=True, dump_to="MemoryLimit"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CheckUInfluxdbAllowanceResponseSchema(schema.ResponseSchema): + """CheckUInfluxdbAllowance - 检查UInfluxdb剩余资源""" + + fields = { + "Count": fields.Int(required=True, load_from="Count"), + } + + +""" +API: CreateUInfluxdbDatabase + +创建Influxdb数据库 +""" + + +class CreateUInfluxdbDatabaseRequestSchema(schema.RequestSchema): + """CreateUInfluxdbDatabase - 创建Influxdb数据库""" + + fields = { + "AccoutName": fields.Str(required=False, dump_to="AccoutName"), + "DatabaseName": fields.Str(required=True, dump_to="DatabaseName"), + "Description": fields.Str(required=False, dump_to="Description"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "RetentionPolicy": fields.Str( + required=False, dump_to="RetentionPolicy" + ), + "UInfluxdbId": fields.Str(required=True, dump_to="UInfluxdbId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateUInfluxdbDatabaseResponseSchema(schema.ResponseSchema): + """CreateUInfluxdbDatabase - 创建Influxdb数据库""" + + fields = {} + + +""" +API: CreateUInfluxdbDatabaseRP + +给指定的database创建一个保留策略,最多可以创建10个RP +""" + + +class CreateUInfluxdbDatabaseRPRequestSchema(schema.RequestSchema): + """CreateUInfluxdbDatabaseRP - 给指定的database创建一个保留策略,最多可以创建10个RP""" + + fields = { + "DatabaseName": fields.Str(required=True, dump_to="DatabaseName"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "RetentionPolicy": fields.Str(required=True, dump_to="RetentionPolicy"), + "RetentionPolicyName": fields.Str( + required=True, dump_to="RetentionPolicyName" + ), + "UInfluxdbId": fields.Str(required=True, dump_to="UInfluxdbId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateUInfluxdbDatabaseRPResponseSchema(schema.ResponseSchema): + """CreateUInfluxdbDatabaseRP - 给指定的database创建一个保留策略,最多可以创建10个RP""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: CreateUInfluxdbInstance + +创建UInfluxdb实例 +""" + + +class CreateUInfluxdbInstanceRequestSchema(schema.RequestSchema): + """CreateUInfluxdbInstance - 创建UInfluxdb实例""" + + fields = { + "AccountName": fields.Str(required=True, dump_to="AccountName"), + "ChargeType": fields.Str(required=True, dump_to="ChargeType"), + "CouponId": fields.Str(required=False, dump_to="CouponId"), + "CpuLimit": fields.Int(required=True, dump_to="CpuLimit"), + "DatabaseName": fields.Str(required=True, dump_to="DatabaseName"), + "MemoryLimit": fields.Int(required=True, dump_to="MemoryLimit"), + "Name": fields.Str(required=True, dump_to="Name"), + "Password": fields.Str(required=True, dump_to="Password"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=True, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class CreateUInfluxdbInstanceResponseSchema(schema.ResponseSchema): + """CreateUInfluxdbInstance - 创建UInfluxdb实例""" + + fields = { + "UInfluxdbId": fields.Str(required=True, load_from="UInfluxdbId"), + } + + +""" +API: DeleteUInfluxdbDatabase + +删除Influxdb实例的数据库 +""" + + +class DeleteUInfluxdbDatabaseRequestSchema(schema.RequestSchema): + """DeleteUInfluxdbDatabase - 删除Influxdb实例的数据库""" + + fields = { + "DatabaseName": fields.Str(required=True, dump_to="DatabaseName"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UInfluxdbId": fields.Str(required=True, dump_to="UInfluxdbId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DeleteUInfluxdbDatabaseResponseSchema(schema.ResponseSchema): + """DeleteUInfluxdbDatabase - 删除Influxdb实例的数据库""" + + fields = {} + + +""" +API: DeleteUInfluxdbDatabaseRP + +删除指定数据库下面的一个数据保留策略 +""" + + +class DeleteUInfluxdbDatabaseRPRequestSchema(schema.RequestSchema): + """DeleteUInfluxdbDatabaseRP - 删除指定数据库下面的一个数据保留策略""" + + fields = { + "DatabaseName": fields.Str(required=True, dump_to="DatabaseName"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "RetentionPolicyName": fields.Str( + required=True, dump_to="RetentionPolicyName" + ), + "UInfluxdbId": fields.Str(required=True, dump_to="UInfluxdbId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DeleteUInfluxdbDatabaseRPResponseSchema(schema.ResponseSchema): + """DeleteUInfluxdbDatabaseRP - 删除指定数据库下面的一个数据保留策略""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DeleteUInfluxdbInstance + +删除UInfluxdb实例 +""" + + +class DeleteUInfluxdbInstanceRequestSchema(schema.RequestSchema): + """DeleteUInfluxdbInstance - 删除UInfluxdb实例""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UInfluxdbId": fields.Str(required=True, dump_to="UInfluxdbId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DeleteUInfluxdbInstanceResponseSchema(schema.ResponseSchema): + """DeleteUInfluxdbInstance - 删除UInfluxdb实例""" + + fields = {} + + +""" +API: DescribeUInfluxdbDatabase + +描述UInfluxdb数据库 +""" + + +class DescribeUInfluxdbDatabaseRequestSchema(schema.RequestSchema): + """DescribeUInfluxdbDatabase - 描述UInfluxdb数据库""" + + fields = { + "DatabaseName": fields.Str(required=False, dump_to="DatabaseName"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UInfluxdbId": fields.Str(required=True, dump_to="UInfluxdbId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeUInfluxdbDatabaseResponseSchema(schema.ResponseSchema): + """DescribeUInfluxdbDatabase - 描述UInfluxdb数据库""" + + fields = { + "DatabaseInfo": fields.List( + models.DatabaseInfoSchema(), required=True, load_from="DatabaseInfo" + ), + } + + +""" +API: DescribeUInfluxdbDatabaseRP + +获取指定数据库下面的所有保留策略 +""" + + +class DescribeUInfluxdbDatabaseRPRequestSchema(schema.RequestSchema): + """DescribeUInfluxdbDatabaseRP - 获取指定数据库下面的所有保留策略""" + + fields = { + "DatabaseName": fields.Str(required=True, dump_to="DatabaseName"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UInfluxdbId": fields.Str(required=True, dump_to="UInfluxdbId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeUInfluxdbDatabaseRPResponseSchema(schema.ResponseSchema): + """DescribeUInfluxdbDatabaseRP - 获取指定数据库下面的所有保留策略""" + + fields = { + "DataSet": fields.List( + models.RpDataSchema(), required=True, load_from="DataSet" + ), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DescribeUInfluxdbInstance + +拉取UInfluxdb实例列表 +""" + + +class DescribeUInfluxdbInstanceRequestSchema(schema.RequestSchema): + """DescribeUInfluxdbInstance - 拉取UInfluxdb实例列表""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UInfluxdbId": fields.Str(required=False, dump_to="UInfluxdbId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeUInfluxdbInstanceResponseSchema(schema.ResponseSchema): + """DescribeUInfluxdbInstance - 拉取UInfluxdb实例列表""" + + fields = { + "DataSet": fields.List( + models.UInfluxdbDataSetSchema(), required=True, load_from="DataSet" + ), + } + + +""" +API: DescribeUInfluxdbPrice + +获取UInfluxdb价格 +""" + + +class DescribeUInfluxdbPriceRequestSchema(schema.RequestSchema): + """DescribeUInfluxdbPrice - 获取UInfluxdb价格""" + + fields = { + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CpuLimit": fields.Int(required=True, dump_to="CpuLimit"), + "MemoryLimit": fields.Int(required=False, dump_to="MemoryLimit"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeUInfluxdbPriceResponseSchema(schema.ResponseSchema): + """DescribeUInfluxdbPrice - 获取UInfluxdb价格""" + + fields = { + "OriginalPrice": fields.Float( + required=False, load_from="OriginalPrice" + ), + "Price": fields.Float(required=True, load_from="Price"), + } + + +""" +API: DescribeUInfluxdbUpgradePrice + +获取UIfluxdb升降级价格 +""" + + +class DescribeUInfluxdbUpgradePriceRequestSchema(schema.RequestSchema): + """DescribeUInfluxdbUpgradePrice - 获取UIfluxdb升降级价格""" + + fields = { + "CpuLimit": fields.Int(required=True, dump_to="CpuLimit"), + "MemoryLimit": fields.Int(required=True, dump_to="MemoryLimit"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UInfluxdbId": fields.Str(required=True, dump_to="UInfluxdbId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DescribeUInfluxdbUpgradePriceResponseSchema(schema.ResponseSchema): + """DescribeUInfluxdbUpgradePrice - 获取UIfluxdb升降级价格""" + + fields = { + "OriginalPrice": fields.Float( + required=False, load_from="OriginalPrice" + ), + "TotalPrice": fields.Float(required=True, load_from="TotalPrice"), + } + + +""" +API: ModifyUInfluxdbDatabasePolicy + +更改UInfluxdb实例数据库数据保留策略 +""" + + +class ModifyUInfluxdbDatabasePolicyRequestSchema(schema.RequestSchema): + """ModifyUInfluxdbDatabasePolicy - 更改UInfluxdb实例数据库数据保留策略""" + + fields = { + "DatabaseName": fields.Str(required=True, dump_to="DatabaseName"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "RetentionPolicy": fields.Str(required=True, dump_to="RetentionPolicy"), + "UInfluxdbId": fields.Str(required=True, dump_to="UInfluxdbId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ModifyUInfluxdbDatabasePolicyResponseSchema(schema.ResponseSchema): + """ModifyUInfluxdbDatabasePolicy - 更改UInfluxdb实例数据库数据保留策略""" + + fields = {} + + +""" +API: RebootUInfluxdbInstance + +重启UInfluxdb实例 +""" + + +class RebootUInfluxdbInstanceRequestSchema(schema.RequestSchema): + """RebootUInfluxdbInstance - 重启UInfluxdb实例""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UInfluxdbId": fields.Str(required=True, dump_to="UInfluxdbId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class RebootUInfluxdbInstanceResponseSchema(schema.ResponseSchema): + """RebootUInfluxdbInstance - 重启UInfluxdb实例""" + + fields = {} + + +""" +API: ResetUInfluxdbInstanceName + +更改UIfluxdb实例名称 +""" + + +class ResetUInfluxdbInstanceNameRequestSchema(schema.RequestSchema): + """ResetUInfluxdbInstanceName - 更改UIfluxdb实例名称""" + + fields = { + "NewName": fields.Str(required=True, dump_to="NewName"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UInfluxdbId": fields.Str(required=True, dump_to="UInfluxdbId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class ResetUInfluxdbInstanceNameResponseSchema(schema.ResponseSchema): + """ResetUInfluxdbInstanceName - 更改UIfluxdb实例名称""" + + fields = {} + + +""" +API: StartUInfluxdbInstance + +启动UInfluxdb实例 +""" + + +class StartUInfluxdbInstanceRequestSchema(schema.RequestSchema): + """StartUInfluxdbInstance - 启动UInfluxdb实例""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UInfluxdbId": fields.Str(required=True, dump_to="UInfluxdbId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class StartUInfluxdbInstanceResponseSchema(schema.ResponseSchema): + """StartUInfluxdbInstance - 启动UInfluxdb实例""" + + fields = {} + + +""" +API: StopUInfluxdbInstance + +关闭UInfluxdb实例 +""" + + +class StopUInfluxdbInstanceRequestSchema(schema.RequestSchema): + """StopUInfluxdbInstance - 关闭UInfluxdb实例""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UInfluxdbId": fields.Str(required=True, dump_to="UInfluxdbId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class StopUInfluxdbInstanceResponseSchema(schema.ResponseSchema): + """StopUInfluxdbInstance - 关闭UInfluxdb实例""" + + fields = {} + + +""" +API: UpgradeUInfluxdbInstance + +UInfluxdb实例配置升降级 +""" + + +class UpgradeUInfluxdbInstanceRequestSchema(schema.RequestSchema): + """UpgradeUInfluxdbInstance - UInfluxdb实例配置升降级""" + + fields = { + "CpuLimit": fields.Int(required=True, dump_to="CpuLimit"), + "MemoryLimit": fields.Int(required=True, dump_to="MemoryLimit"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "UInfluxdbId": fields.Str(required=True, dump_to="UInfluxdbId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class UpgradeUInfluxdbInstanceResponseSchema(schema.ResponseSchema): + """UpgradeUInfluxdbInstance - UInfluxdb实例配置升降级""" + + fields = {} diff --git a/ucloud/services/utsdb/schemas/models.py b/ucloud/services/utsdb/schemas/models.py new file mode 100644 index 00000000..dcb627aa --- /dev/null +++ b/ucloud/services/utsdb/schemas/models.py @@ -0,0 +1,61 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class AccountInfoSchema(schema.ResponseSchema): + """AccountInfo - UInfluxdb 账户信息""" + + fields = { + "Account": fields.Str(required=False, load_from="Account"), + "Password": fields.Str(required=False, load_from="Password"), + "Privilege": fields.Str(required=False, load_from="Privilege"), + } + + +class DatabaseInfoSchema(schema.ResponseSchema): + """DatabaseInfo -""" + + fields = { + "AccountInfo": fields.List(AccountInfoSchema()), + "DatabaseName": fields.Str(required=False, load_from="DatabaseName"), + "Description": fields.Str(required=False, load_from="Description"), + "RetentionPolicy": fields.Str( + required=False, load_from="RetentionPolicy" + ), + "State": fields.Str(required=False, load_from="State"), + } + + +class RpDataSchema(schema.ResponseSchema): + """RpData - 保留策略信息""" + + fields = { + "Policy": fields.Str(required=True, load_from="Policy"), + "RetentionPolicyName": fields.Str( + required=True, load_from="RetentionPolicyName" + ), + } + + +class UInfluxdbDataSetSchema(schema.ResponseSchema): + """UInfluxdbDataSet - UInfluxdb信息的DataSet""" + + fields = { + "AccountName": fields.Str(required=True, load_from="AccountName"), + "CPULimit": fields.Int(required=False, load_from="CPULimit"), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "ExpiredTime": fields.Int(required=False, load_from="ExpiredTime"), + "MemoryLimit": fields.Int(required=False, load_from="MemoryLimit"), + "Name": fields.Str(required=False, load_from="Name"), + "Port": fields.Int(required=False, load_from="Port"), + "State": fields.Str(required=False, load_from="State"), + "SubnetId": fields.Str(required=True, load_from="SubnetId"), + "Tag": fields.Str(required=True, load_from="Tag"), + "UInfluxdbId": fields.Str(required=False, load_from="UInfluxdbId"), + "UsedSize": fields.Int(required=True, load_from="UsedSize"), + "VPCId": fields.Str(required=True, load_from="VPCId"), + "VirtualIP": fields.Str(required=False, load_from="VirtualIP"), + "Zone": fields.Str(required=False, load_from="Zone"), + } diff --git a/ucloud/services/uvms/__init__.py b/ucloud/services/uvms/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/uvms/client.py b/ucloud/services/uvms/client.py new file mode 100644 index 00000000..41392f17 --- /dev/null +++ b/ucloud/services/uvms/client.py @@ -0,0 +1,119 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.uvms.schemas import apis + + +class UVMSClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UVMSClient, self).__init__(config, transport, middleware, logger) + + def get_uvms_send_record( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetUVMSSendRecord - 获取语音发送记录 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **BrevityCode** (str) - 国际码,国内CN + - **CalledCityCode** (str) - 被叫城市编码 + - **CalledOperatorCode** (str) - 被叫运营商 cmcc中国移动,cucc中国联通,ctcc中国电信 + - **CallingCityCode** (str) - 主叫城市编码 + - **EndTime** (float) - 结束时间-拨打时间,时间戳(秒),默认当前 + - **ExcludeBrevityCode** (str) - 排除国际码 + - **FuzzySearch** (str) - 模糊搜索,支持 主叫号码和被叫号码 + - **NumPerPage** (int) - 每页数量,默认10 + - **OrderBy** (str) - call_start_time(拨打时间)/receive_time(回执时间) + - **OrderType** (str) - asc\desc + - **Page** (int) - 页码,默认0 + - **PhoneNumber** (str) - 被叫号码,精确查询 + - **Purpose** (int) - 目标1验证码2通知3营销 + - **StartTime** (float) - 开始时间-拨打时间,时间戳(秒),默认最近7天 + - **TaskNo** (str) - 任务编号 + - **TemplateId** (str) - 目标ID + + **Response** + + - **Data** (list) - 见 **SendRecordItem** 模型定义 + - **Total** (int) - 总数 + + **Response Model** + + **SendRecordItem** + - **BillPeriod** (int) - 计费周期(秒) + - **BillSecond** (int) - 计费时长(秒) + - **BrevityCode** (str) - 国际码 + - **CallEndTime** (float) - 呼叫结束时间(毫秒时间戳) + - **CallStartTime** (float) - 呼叫开始时间(毫秒时间戳) + - **CalledCityCode** (str) - 被叫所属城市码 + - **CalledOperatorCode** (str) - 被叫供应商码 cmcc中国移动,cucc中国联通,ctcc中国电信 + - **CallingCityCode** (str) - 主叫所属城市码 + - **ChannelId** (str) - 通道ID + - **CountryCode** (str) - 国家码 + - **Duration** (int) - 呼叫持续时间 + - **GroupType** (int) - 1随机号码组2专属号码组 + - **Phone** (str) - 被叫号码 + - **PreCost** (int) - 预扣量 + - **Purpose** (int) - 目标1验证码2通知3营销 + - **ReceiptDesc** (str) - 回执描述 + - **ReceiptResult** (int) - 回执结果1成功2失败3未知 + - **ReceiveTime** (float) - 回执时间 + - **ShowNumber** (str) - 主叫号码,如果是随机,可能为空 + - **SubmitTime** (float) - 客户提交时间 + - **TaskNo** (str) - 任务编号 + - **TemplateId** (str) - 模板ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.GetUVMSSendRecordRequestSchema().dumps(d) + + resp = self.invoke("GetUVMSSendRecord", d, **kwargs) + return apis.GetUVMSSendRecordResponseSchema().loads(resp) + + def send_uvms_message( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """SendUVMSMessage - 向指定号码拨打电话 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CalledNumber** (str) - (Required) 被叫号码,采用 E.164 标准,格式为+[国家代码][用户号码]。例如:+8613512345678, 其中前面有一个+号 ,86为国家码,13512345678为手机号 + - **TemplateId** (str) - (Required) 模板 ID,在控制台审核通过的模板 ID。 + - **DispatchRule** (int) - 调度规则,0-默认(归属地优先),1-随机。当不指定外显号码(主叫号码为空)时生效。如不填写,默认为归属地优先。 + - **FromNumber** (str) - 主叫号码,号码随机时不填。专属号码时传入已购买的号码,仅支持一个号码,在控制台查看已购买的号码。 + - **GroupType** (int) - 号码组类型,1-随机组,2-专属组。如不填写则根据主叫号码判断,若主叫号码为空,则为随机组,若不为空,则为专属组。 + - **TemplateParams** (list) - 模板可变参数,以数组的方式填写,举例,TemplateParams.0,TemplateParams.1,... 若模板中无可变参数,则该项可不填写;若模板中有可变参数,则该项为必填项,参数个数需与变量个数保持一致,否则无法发送; + - **UserId** (str) - 自定义的业务标识ID,字符串( 长度不能超过32 位),不支持 单引号、表情包符号等特殊字符 + + **Response** + + - **Message** (str) - 状态码的描述 + - **ReqUuid** (str) - 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 ReqUuid。 + - **SessionNo** (str) - 本次提交发送语音的唯一ID,可根据该值查询本次发送详情 + - **UserId** (str) - 本次提交的自定义业务标识ID,仅当发送时传入有效的UserId,才返回该字段。 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.SendUVMSMessageRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("SendUVMSMessage", d, **kwargs) + return apis.SendUVMSMessageResponseSchema().loads(resp) diff --git a/ucloud/services/uvms/schemas/__init__.py b/ucloud/services/uvms/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/uvms/schemas/apis.py b/ucloud/services/uvms/schemas/apis.py new file mode 100644 index 00000000..dd9fe877 --- /dev/null +++ b/ucloud/services/uvms/schemas/apis.py @@ -0,0 +1,88 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.uvms.schemas import models + +""" UVMS API Schema +""" + + +""" +API: GetUVMSSendRecord + +获取语音发送记录 +""" + + +class GetUVMSSendRecordRequestSchema(schema.RequestSchema): + """GetUVMSSendRecord - 获取语音发送记录""" + + fields = { + "BrevityCode": fields.Str(required=False, dump_to="BrevityCode"), + "CalledCityCode": fields.Str(required=False, dump_to="CalledCityCode"), + "CalledOperatorCode": fields.Str( + required=False, dump_to="CalledOperatorCode" + ), + "CallingCityCode": fields.Str( + required=False, dump_to="CallingCityCode" + ), + "EndTime": fields.Float(required=False, dump_to="EndTime"), + "ExcludeBrevityCode": fields.Str( + required=False, dump_to="ExcludeBrevityCode" + ), + "FuzzySearch": fields.Str(required=False, dump_to="FuzzySearch"), + "NumPerPage": fields.Int(required=False, dump_to="NumPerPage"), + "OrderBy": fields.Str(required=False, dump_to="OrderBy"), + "OrderType": fields.Str(required=False, dump_to="OrderType"), + "Page": fields.Int(required=False, dump_to="Page"), + "PhoneNumber": fields.Str(required=False, dump_to="PhoneNumber"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Purpose": fields.Int(required=False, dump_to="Purpose"), + "StartTime": fields.Float(required=False, dump_to="StartTime"), + "TaskNo": fields.Str(required=False, dump_to="TaskNo"), + "TemplateId": fields.Str(required=False, dump_to="TemplateId"), + } + + +class GetUVMSSendRecordResponseSchema(schema.ResponseSchema): + """GetUVMSSendRecord - 获取语音发送记录""" + + fields = { + "Data": fields.List( + models.SendRecordItemSchema(), required=False, load_from="Data" + ), + "Total": fields.Int(required=False, load_from="Total"), + } + + +""" +API: SendUVMSMessage + +向指定号码拨打电话 +""" + + +class SendUVMSMessageRequestSchema(schema.RequestSchema): + """SendUVMSMessage - 向指定号码拨打电话""" + + fields = { + "CalledNumber": fields.Str(required=True, dump_to="CalledNumber"), + "DispatchRule": fields.Int(required=False, dump_to="DispatchRule"), + "FromNumber": fields.Str(required=False, dump_to="FromNumber"), + "GroupType": fields.Int(required=False, dump_to="GroupType"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "TemplateId": fields.Str(required=True, dump_to="TemplateId"), + "TemplateParams": fields.List(fields.Str()), + "UserId": fields.Str(required=False, dump_to="UserId"), + } + + +class SendUVMSMessageResponseSchema(schema.ResponseSchema): + """SendUVMSMessage - 向指定号码拨打电话""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "ReqUuid": fields.Str(required=True, load_from="ReqUuid"), + "SessionNo": fields.Str(required=False, load_from="SessionNo"), + "UserId": fields.Str(required=False, load_from="UserId"), + } diff --git a/ucloud/services/uvms/schemas/models.py b/ucloud/services/uvms/schemas/models.py new file mode 100644 index 00000000..fdecfbd0 --- /dev/null +++ b/ucloud/services/uvms/schemas/models.py @@ -0,0 +1,40 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class SendRecordItemSchema(schema.ResponseSchema): + """SendRecordItem - 发送记录条目""" + + fields = { + "BillPeriod": fields.Int(required=False, load_from="BillPeriod"), + "BillSecond": fields.Int(required=False, load_from="BillSecond"), + "BrevityCode": fields.Str(required=False, load_from="BrevityCode"), + "CallEndTime": fields.Float(required=False, load_from="CallEndTime"), + "CallStartTime": fields.Float( + required=False, load_from="CallStartTime" + ), + "CalledCityCode": fields.Str( + required=False, load_from="CalledCityCode" + ), + "CalledOperatorCode": fields.Str( + required=False, load_from="CalledOperatorCode" + ), + "CallingCityCode": fields.Str( + required=False, load_from="CallingCityCode" + ), + "ChannelId": fields.Str(required=False, load_from="ChannelId"), + "CountryCode": fields.Str(required=False, load_from="CountryCode"), + "Duration": fields.Int(required=False, load_from="Duration"), + "GroupType": fields.Int(required=False, load_from="GroupType"), + "Phone": fields.Str(required=False, load_from="Phone"), + "PreCost": fields.Int(required=False, load_from="PreCost"), + "Purpose": fields.Int(required=False, load_from="Purpose"), + "ReceiptDesc": fields.Str(required=False, load_from="ReceiptDesc"), + "ReceiptResult": fields.Int(required=False, load_from="ReceiptResult"), + "ReceiveTime": fields.Float(required=False, load_from="ReceiveTime"), + "ShowNumber": fields.Str(required=False, load_from="ShowNumber"), + "SubmitTime": fields.Float(required=False, load_from="SubmitTime"), + "TaskNo": fields.Str(required=False, load_from="TaskNo"), + "TemplateId": fields.Str(required=False, load_from="TemplateId"), + } diff --git a/ucloud/services/uwsc/__init__.py b/ucloud/services/uwsc/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/uwsc/client.py b/ucloud/services/uwsc/client.py new file mode 100644 index 00000000..27ab64c8 --- /dev/null +++ b/ucloud/services/uwsc/client.py @@ -0,0 +1,387 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +import typing + + +from ucloud.core.client import Client +from ucloud.services.uwsc.schemas import apis + + +class UWSCClient(Client): + def __init__( + self, config: dict, transport=None, middleware=None, logger=None + ): + super(UWSCClient, self).__init__(config, transport, middleware, logger) + + def add_export_line_rules( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AddExportLineRules - 添加加速规则 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ResourceId** (str) - (Required) UReach资源ID + - **RuleTypes** (list) - (Required) 白名单类型:Developer、CrossBorder + + **Response** + + - **Message** (str) - 返回信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.AddExportLineRulesRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AddExportLineRules", d, **kwargs) + return apis.AddExportLineRulesResponseSchema().loads(resp) + + def bind_cpe(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """BindCPE - 绑定 CPE + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CPEId** (str) - (Required) cpe id + - **Sn** (str) - (Required) sn id + + **Response** + + - **Message** (str) - 返回信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.BindCPERequestSchema().dumps(d) + + resp = self.invoke("BindCPE", d, **kwargs) + return apis.BindCPEResponseSchema().loads(resp) + + def create_cpe(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """CreateCPE - 创建 CPE + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **DeviceType** (str) - (Required) 设备型号,枚举值: UCPE3600、UCPE3601 + - **Name** (str) - (Required) cpe 名称 + - **Remark** (str) - (Required) cpe 备注 + - **Count** (int) - 数量,默认为1 + - **Label** (str) - 标签:UReach智能网关:Access + - **UserInfo** (str) - 结构体,详见UserInfo模型 + + **Response** + + - **CPEId** (str) - cpe id + - **Message** (str) - 返回信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.CreateCPERequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateCPE", d, **kwargs) + return apis.CreateCPEResponseSchema().loads(resp) + + def create_export_line( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateExportLine - 创建加速线路 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CPEId** (str) - (Required) CPE Id + - **FromRegion** (str) - (Required) 本端地域 + - **IpType** (str) - (Required) IP类型:International、BGP、Native、Resident + - **ToRegion** (str) - (Required) 目标地域 + - **Bandwidth** (int) - 带宽大小 + - **ChargeType** (str) - 计费模式。枚举值为: Year,按年付费; Month,按月付费; Dynamic,按小时付费(需开启权限)。默认为月付 + - **CouponId** (int) - 代金券ID。请登录用户中心查看 + - **Name** (str) - 资源名称 + - **PayMode** (str) - 计费类型:fixed-bw,固定带宽;traffic,流量计费 + - **PkgType** (str) - 套餐类型:2M-Entry、5M-Basic、10M-Enterprise + - **Quantity** (int) - 购买时长。默认: 1。按小时购买(Dynamic)时无需此参数。 月付时,此参数传0,代表了购买至月末。 + - **Remark** (str) - 备注 + - **Tag** (str) - 业务组名称, 默认为 "Default" + + **Response** + + - **Message** (str) - 返回信息 + - **ResourceId** (str) - 资源ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.CreateExportLineRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateExportLine", d, **kwargs) + return apis.CreateExportLineResponseSchema().loads(resp) + + def delete_export_line( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteExportLine - 删除加速线路 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ResourceId** (str) - (Required) UReach资源ID + + **Response** + + - **Message** (str) - 返回信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DeleteExportLineRequestSchema().dumps(d) + + resp = self.invoke("DeleteExportLine", d, **kwargs) + return apis.DeleteExportLineResponseSchema().loads(resp) + + def delete_export_line_rules( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteExportLineRules - 删除加速规则 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ResourceId** (str) - (Required) UReach资源ID + - **RuleTypes** (list) - (Required) 白名单类型:Developer、CrossBorder + + **Response** + + - **Message** (str) - 返回信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DeleteExportLineRulesRequestSchema().dumps(d) + + resp = self.invoke("DeleteExportLineRules", d, **kwargs) + return apis.DeleteExportLineRulesResponseSchema().loads(resp) + + def describe_cpe(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """DescribeCPE - 查询 CPE 信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CPEId** (str) - cpe id + - **Label** (str) - 标签:Access、Network + + **Response** + + - **CPEInfos** (list) - 见 **CPEInfo** 模型定义 + - **Message** (str) - 返回信息 + + **Response Model** + + **CPEInfo** + - **CPEId** (str) - 资源ID + - **CPEName** (str) - 资源名称 + - **ConfUpdateTime** (int) - 配置更新时间 + - **CreateTime** (int) - 创建时间 + - **DeviceTypeName** (str) - 设备型号 + - **LineStatus** (str) - 是否与线路绑定 + - **LinkNum** (int) - 链路数量 + - **PopGwId** (list) - 绑定的UWAN资源ID + - **Ports** (list) - 端口 + - **Remark** (str) - 备注 + - **ResourceIds** (list) - 绑定的UReach线路资源ID + - **Sn** (str) - 设备SN + - **Status** (int) - 状态 + - **UseTime** (int) - 有效使用时间(天) + - **Vendor** (str) - 供应商 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeCPERequestSchema().dumps(d) + + resp = self.invoke("DescribeCPE", d, **kwargs) + return apis.DescribeCPEResponseSchema().loads(resp) + + def describe_export_line( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeExportLine - 查询CPE绑定的加速线路信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **CPEId** (str) - CPE资源ID + - **ResourceId** (str) - UReach资源ID + + **Response** + + - **LineInfos** (list) - 见 **LineInfo** 模型定义 + - **Message** (str) - 返回信息 + + **Response Model** + + **SocksInfo** + - **Account** (str) - + - **Addr** (str) - + - **Port** (int) - + + + **LineInfo** + - **Bandwidth** (int) - 带宽大小(Mbps) + - **CPEIds** (list) - 线路绑定的CPE资源ID + - **ChargeType** (str) - 付费方式(按月、按年等) + - **CreateTime** (int) - 创建时间 + - **ExpireTime** (int) - 到期时间 + - **FromRegion** (str) - 入口地域 + - **FromRegionName** (str) - 入口地域名称 + - **IP** (list) - + - **InstanceId** (str) - 线路资源ID对应的加速线路ID + - **InstanceStatus** (str) - 是否过期(normal/expire) + - **IpType** (str) - IP类型 + - **Name** (str) - 名称 + - **PayMode** (str) - 计费方式(固定带宽: fixed-bw;流量计费:traffic) + - **PkgType** (str) - 套餐类型 + - **Remark** (str) - 备注 + - **ResourceId** (str) - 线路资源ID + - **Socks** (dict) - 见 **SocksInfo** 模型定义 + - **Source** (list) - 源IP地址 + - **Status** (str) - 线路是否绑定CPE;"1":已绑定;"0"未绑定 + - **ToRegion** (str) - 出口地域 + - **ToRegionName** (str) - 出口地域名称 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeExportLineRequestSchema().dumps(d) + + resp = self.invoke("DescribeExportLine", d, **kwargs) + return apis.DescribeExportLineResponseSchema().loads(resp) + + def describe_export_line_rules( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeExportLineRules - 查询白名单 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ResourceId** (str) - UReach资源ID + - **RuleType** (str) - 白名单类型 + + **Response** + + - **Message** (str) - 返回信息 + - **WhiteListInfos** (list) - 见 **WhiteListInfo** 模型定义 + + **Response Model** + + **WhiteListInfo** + - **Name** (str) - + - **Remark** (str) - + - **RuleType** (str) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.DescribeExportLineRulesRequestSchema().dumps(d) + + resp = self.invoke("DescribeExportLineRules", d, **kwargs) + return apis.DescribeExportLineRulesResponseSchema().loads(resp) + + def update_export_line( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateExportLine - 修改加速线路 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Bandwidth** (str) - (Required) 带宽大小(仅自定义套餐支持修改) + - **ResourceId** (str) - (Required) UReach资源ID + + **Response** + + - **Message** (str) - 返回信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.UpdateExportLineRequestSchema().dumps(d) + + resp = self.invoke("UpdateExportLine", d, **kwargs) + return apis.UpdateExportLineResponseSchema().loads(resp) + + def upgrade_export_line( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpgradeExportLine - 升级加速线路 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **IpType** (str) - (Required) 原IP类型:International、BGP、Native、Resident + - **PkgType** (str) - (Required) 目标套餐类型:2M-Entry、5M-Basic、10M-Enterprise + - **ResourceId** (str) - (Required) UReach资源ID + - **Bandwidth** (int) - 带宽大小 + - **ChargeType** (str) - 计费模式。枚举值为: Year,按年付费; Month,按月付费; Dynamic,按小时付费(需开启权限)。默认为月付 + - **CouponId** (int) - 代金券ID。请登录用户中心查看 + - **Quantity** (int) - 购买时长。默认: 1。按小时购买(Dynamic)时无需此参数。 月付时,此参数传0,代表了购买至月末。 + + **Response** + + - **Message** (str) - 返回信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + } + req and d.update(req) + d = apis.UpgradeExportLineRequestSchema().dumps(d) + + resp = self.invoke("UpgradeExportLine", d, **kwargs) + return apis.UpgradeExportLineResponseSchema().loads(resp) diff --git a/ucloud/services/uwsc/schemas/__init__.py b/ucloud/services/uwsc/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ucloud/services/uwsc/schemas/apis.py b/ucloud/services/uwsc/schemas/apis.py new file mode 100644 index 00000000..e33e9c58 --- /dev/null +++ b/ucloud/services/uwsc/schemas/apis.py @@ -0,0 +1,314 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields +from ucloud.services.uwsc.schemas import models + +""" UWSC API Schema +""" + + +""" +API: AddExportLineRules + +添加加速规则 +""" + + +class AddExportLineRulesRequestSchema(schema.RequestSchema): + """AddExportLineRules - 添加加速规则""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + "RuleTypes": fields.List(fields.Str()), + } + + +class AddExportLineRulesResponseSchema(schema.ResponseSchema): + """AddExportLineRules - 添加加速规则""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: BindCPE + +绑定 CPE +""" + + +class BindCPERequestSchema(schema.RequestSchema): + """BindCPE - 绑定 CPE""" + + fields = { + "CPEId": fields.Str(required=True, dump_to="CPEId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Sn": fields.Str(required=True, dump_to="Sn"), + } + + +class BindCPEResponseSchema(schema.ResponseSchema): + """BindCPE - 绑定 CPE""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: CreateCPE + +创建 CPE +""" + + +class CreateCPERequestSchema(schema.RequestSchema): + """CreateCPE - 创建 CPE""" + + fields = { + "Count": fields.Int(required=False, dump_to="Count"), + "DeviceType": fields.Str(required=True, dump_to="DeviceType"), + "Label": fields.Str(required=False, dump_to="Label"), + "Name": fields.Str(required=True, dump_to="Name"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Remark": fields.Str(required=True, dump_to="Remark"), + "UserInfo": fields.Str(required=False, dump_to="UserInfo"), + } + + +class CreateCPEResponseSchema(schema.ResponseSchema): + """CreateCPE - 创建 CPE""" + + fields = { + "CPEId": fields.Str(required=True, load_from="CPEId"), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: CreateExportLine + +创建加速线路 +""" + + +class CreateExportLineRequestSchema(schema.RequestSchema): + """CreateExportLine - 创建加速线路""" + + fields = { + "Bandwidth": fields.Int(required=False, dump_to="Bandwidth"), + "CPEId": fields.Str(required=True, dump_to="CPEId"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CouponId": fields.Int(required=False, dump_to="CouponId"), + "FromRegion": fields.Str(required=True, dump_to="FromRegion"), + "IpType": fields.Str(required=True, dump_to="IpType"), + "Name": fields.Str(required=False, dump_to="Name"), + "PayMode": fields.Str(required=False, dump_to="PayMode"), + "PkgType": fields.Str(required=False, dump_to="PkgType"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "ToRegion": fields.Str(required=True, dump_to="ToRegion"), + } + + +class CreateExportLineResponseSchema(schema.ResponseSchema): + """CreateExportLine - 创建加速线路""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "ResourceId": fields.Str(required=True, load_from="ResourceId"), + } + + +""" +API: DeleteExportLine + +删除加速线路 +""" + + +class DeleteExportLineRequestSchema(schema.RequestSchema): + """DeleteExportLine - 删除加速线路""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class DeleteExportLineResponseSchema(schema.ResponseSchema): + """DeleteExportLine - 删除加速线路""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DeleteExportLineRules + +删除加速规则 +""" + + +class DeleteExportLineRulesRequestSchema(schema.RequestSchema): + """DeleteExportLineRules - 删除加速规则""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + "RuleTypes": fields.List(fields.Str()), + } + + +class DeleteExportLineRulesResponseSchema(schema.ResponseSchema): + """DeleteExportLineRules - 删除加速规则""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DescribeCPE + +查询 CPE 信息 +""" + + +class DescribeCPERequestSchema(schema.RequestSchema): + """DescribeCPE - 查询 CPE 信息""" + + fields = { + "CPEId": fields.Str(required=False, dump_to="CPEId"), + "Label": fields.Str(required=False, dump_to="Label"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + } + + +class DescribeCPEResponseSchema(schema.ResponseSchema): + """DescribeCPE - 查询 CPE 信息""" + + fields = { + "CPEInfos": fields.List( + models.CPEInfoSchema(), required=False, load_from="CPEInfos" + ), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DescribeExportLine + +查询CPE绑定的加速线路信息 +""" + + +class DescribeExportLineRequestSchema(schema.RequestSchema): + """DescribeExportLine - 查询CPE绑定的加速线路信息""" + + fields = { + "CPEId": fields.Str(required=False, dump_to="CPEId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ResourceId": fields.Str(required=False, dump_to="ResourceId"), + } + + +class DescribeExportLineResponseSchema(schema.ResponseSchema): + """DescribeExportLine - 查询CPE绑定的加速线路信息""" + + fields = { + "LineInfos": fields.List( + models.LineInfoSchema(), required=False, load_from="LineInfos" + ), + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DescribeExportLineRules + +查询白名单 +""" + + +class DescribeExportLineRulesRequestSchema(schema.RequestSchema): + """DescribeExportLineRules - 查询白名单""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ResourceId": fields.Str(required=False, dump_to="ResourceId"), + "RuleType": fields.Str(required=False, dump_to="RuleType"), + } + + +class DescribeExportLineRulesResponseSchema(schema.ResponseSchema): + """DescribeExportLineRules - 查询白名单""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + "WhiteListInfos": fields.List( + models.WhiteListInfoSchema(), + required=True, + load_from="WhiteListInfos", + ), + } + + +""" +API: UpdateExportLine + +修改加速线路 +""" + + +class UpdateExportLineRequestSchema(schema.RequestSchema): + """UpdateExportLine - 修改加速线路""" + + fields = { + "Bandwidth": fields.Str(required=True, dump_to="Bandwidth"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class UpdateExportLineResponseSchema(schema.ResponseSchema): + """UpdateExportLine - 修改加速线路""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: UpgradeExportLine + +升级加速线路 +""" + + +class UpgradeExportLineRequestSchema(schema.RequestSchema): + """UpgradeExportLine - 升级加速线路""" + + fields = { + "Bandwidth": fields.Int(required=False, dump_to="Bandwidth"), + "ChargeType": fields.Str(required=False, dump_to="ChargeType"), + "CouponId": fields.Int(required=False, dump_to="CouponId"), + "IpType": fields.Str(required=True, dump_to="IpType"), + "PkgType": fields.Str(required=True, dump_to="PkgType"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Quantity": fields.Int(required=False, dump_to="Quantity"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class UpgradeExportLineResponseSchema(schema.ResponseSchema): + """UpgradeExportLine - 升级加速线路""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } diff --git a/ucloud/services/uwsc/schemas/models.py b/ucloud/services/uwsc/schemas/models.py new file mode 100644 index 00000000..c88f2bd6 --- /dev/null +++ b/ucloud/services/uwsc/schemas/models.py @@ -0,0 +1,81 @@ +""" Code is generated by ucloud-model, DO NOT EDIT IT. """ + +from ucloud.core.typesystem import schema, fields + + +class CPEInfoSchema(schema.ResponseSchema): + """CPEInfo - CPE信息""" + + fields = { + "CPEId": fields.Str(required=False, load_from="CPEId"), + "CPEName": fields.Str(required=False, load_from="CPEName"), + "ConfUpdateTime": fields.Int( + required=False, load_from="ConfUpdateTime" + ), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "DeviceTypeName": fields.Str( + required=False, load_from="DeviceTypeName" + ), + "LineStatus": fields.Str(required=False, load_from="LineStatus"), + "LinkNum": fields.Int(required=False, load_from="LinkNum"), + "PopGwId": fields.List(fields.Str()), + "Ports": fields.List(fields.Str()), + "Remark": fields.Str(required=False, load_from="Remark"), + "ResourceIds": fields.List(fields.Str()), + "Sn": fields.Str(required=False, load_from="Sn"), + "Status": fields.Int(required=False, load_from="Status"), + "UseTime": fields.Int(required=False, load_from="UseTime"), + "Vendor": fields.Str(required=False, load_from="Vendor"), + } + + +class SocksInfoSchema(schema.ResponseSchema): + """SocksInfo -""" + + fields = { + "Account": fields.Str(required=False, load_from="Account"), + "Addr": fields.Str(required=False, load_from="Addr"), + "Port": fields.Int(required=False, load_from="Port"), + } + + +class LineInfoSchema(schema.ResponseSchema): + """LineInfo - CPE加速线路信息""" + + fields = { + "Bandwidth": fields.Int(required=False, load_from="Bandwidth"), + "CPEIds": fields.List(fields.Str()), + "ChargeType": fields.Str(required=False, load_from="ChargeType"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "ExpireTime": fields.Int(required=False, load_from="ExpireTime"), + "FromRegion": fields.Str(required=False, load_from="FromRegion"), + "FromRegionName": fields.Str( + required=False, load_from="FromRegionName" + ), + "IP": fields.List(fields.Str()), + "InstanceId": fields.Str(required=False, load_from="InstanceId"), + "InstanceStatus": fields.Str( + required=False, load_from="InstanceStatus" + ), + "IpType": fields.Str(required=False, load_from="IpType"), + "Name": fields.Str(required=False, load_from="Name"), + "PayMode": fields.Str(required=False, load_from="PayMode"), + "PkgType": fields.Str(required=False, load_from="PkgType"), + "Remark": fields.Str(required=False, load_from="Remark"), + "ResourceId": fields.Str(required=False, load_from="ResourceId"), + "Socks": SocksInfoSchema(), + "Source": fields.List(fields.Str()), + "Status": fields.Str(required=False, load_from="Status"), + "ToRegion": fields.Str(required=False, load_from="ToRegion"), + "ToRegionName": fields.Str(required=False, load_from="ToRegionName"), + } + + +class WhiteListInfoSchema(schema.ResponseSchema): + """WhiteListInfo -""" + + fields = { + "Name": fields.Str(required=False, load_from="Name"), + "Remark": fields.Str(required=False, load_from="Remark"), + "RuleType": fields.Str(required=False, load_from="RuleType"), + } diff --git a/ucloud/services/vpc/client.py b/ucloud/services/vpc/client.py index 009d72e1..78b24369 100644 --- a/ucloud/services/vpc/client.py +++ b/ucloud/services/vpc/client.py @@ -13,10 +13,42 @@ def __init__( ): super(VPCClient, self).__init__(config, transport, middleware, logger) + def add_snat_rule( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AddSnatRule - 对于绑定了多个EIP的NAT网关,您可以将一个子网下的某台云主机映射到某个特定的EIP上,规则生效后,则该云主机通过该特定的EIP访问互联网。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **NATGWId** (str) - (Required) NAT网关的ID + - **SnatIp** (str) - (Required) EIP的ip地址,例如106.75.xx.xx + - **SourceIp** (str) - (Required) 需要出外网的私网IP地址,例如10.9.7.xx + - **Name** (str) - snat规则名称,默认为“出口规则” + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.AddSnatRuleRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("AddSnatRule", d, **kwargs) + return apis.AddSnatRuleResponseSchema().loads(resp) + def add_vpc_network( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ AddVPCNetwork - 添加VPC网段 + """AddVPCNetwork - 添加VPC网段 **Request** @@ -30,7 +62,10 @@ def add_vpc_network( """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.AddVPCNetworkRequestSchema().dumps(d) @@ -40,365 +75,2069 @@ def add_vpc_network( resp = self.invoke("AddVPCNetwork", d, **kwargs) return apis.AddVPCNetworkResponseSchema().loads(resp) - def associate_route_table( + def add_white_list_resource( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ AssociateRouteTable - 绑定子网的路由表 + """AddWhiteListResource - 添加NAT网关白名单 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ProjectId** (str) - (Config) 项目Id。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **RouteTableId** (str) - (Required) 路由表ID,仅限自定义路由表 - - **SubnetId** (str) - (Required) 子网ID + - **NATGWId** (str) - (Required) NAT网关Id + - **ResourceIds** (list) - (Required) 可添加白名单的资源Id **Response** """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) - d = apis.AssociateRouteTableRequestSchema().dumps(d) + d = apis.AddWhiteListResourceRequestSchema().dumps(d) - resp = self.invoke("AssociateRouteTable", d, **kwargs) - return apis.AssociateRouteTableResponseSchema().loads(resp) + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent - def clone_route_table( + resp = self.invoke("AddWhiteListResource", d, **kwargs) + return apis.AddWhiteListResourceResponseSchema().loads(resp) + + def allocate_batch_secondary_ip( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CloneRouteTable - 根据一张现有路由表复制一张新的路由表 + """AllocateBatchSecondaryIp - 批量申请虚拟网卡辅助IP **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **RouteTableId** (str) - (Required) 被克隆的路由表ID + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Mac** (str) - (Required) 节点mac + - **ObjectId** (str) - (Required) 资源Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Count** (int) - 申请的内网IP数量 + - **Ip** (list) - 【arry】支持按如下方式申请:①按网段:如192.168.1.32/27,掩码数字最小为27   ②指定IP地址,如192.168.1.3 + - **SubnetId** (str) - 子网Id(若未指定,则根据zone获取默认子网进行创建) + - **VPCId** (str) - vpcId **Response** + - **IpsInfo** (list) - 见 **IpsInfo** 模型定义 + + **Response Model** + + **IpsInfo** + - **Gateway** (str) - 网关 + - **Ip** (str) - 内网IP地址 + - **Mac** (str) - MAC地址 + - **Mask** (str) - 掩码 + - **Status** (dict) - 见 **StatusInfo** 模型定义 + - **SubnetId** (str) - 子网资源ID + - **VPCId** (str) - VPC资源ID + + + **StatusInfo** + - **Message** (str) - IP分配失败原因 + - **StatusCode** (str) - 枚举值:Succeeded,Failed + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) - d = apis.CloneRouteTableRequestSchema().dumps(d) + d = apis.AllocateBatchSecondaryIpRequestSchema().dumps(d) # build options kwargs["max_retries"] = 0 # ignore retry when api is not idempotent - resp = self.invoke("CloneRouteTable", d, **kwargs) - return apis.CloneRouteTableResponseSchema().loads(resp) + resp = self.invoke("AllocateBatchSecondaryIp", d, **kwargs) + return apis.AllocateBatchSecondaryIpResponseSchema().loads(resp) - def create_route_table( + def allocate_secondary_ip( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateRouteTable - 创建路由表 + """AllocateSecondaryIp - 分配ip(用于uk8s使用) **Request** - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **VPCId** (str) - (Required) VPC ID - - **Name** (str) - 路由表名称 Default RouteTable - - **Remark** (str) - 备注 - - **Tag** (str) - 业务组 + - **Mac** (str) - (Required) 节点mac + - **ObjectId** (str) - (Required) 资源Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Ip** (str) - 指定Ip分配 + - **SubnetId** (str) - 子网Id(若未指定,则根据zone获取默认子网进行创建) + - **VPCId** (str) - vpcId **Response** - - **RouteTableId** (str) - 路由表ID + - **IpInfo** (dict) - 见 **IpInfo** 模型定义 + + **Response Model** + + **IpInfo** + - **Gateway** (str) - + - **Ip** (str) - + - **Mac** (str) - + - **Mask** (str) - + - **SubnetId** (str) - + - **VPCId** (str) - + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) - d = apis.CreateRouteTableRequestSchema().dumps(d) + d = apis.AllocateSecondaryIpRequestSchema().dumps(d) # build options kwargs["max_retries"] = 0 # ignore retry when api is not idempotent - resp = self.invoke("CreateRouteTable", d, **kwargs) - return apis.CreateRouteTableResponseSchema().loads(resp) + resp = self.invoke("AllocateSecondaryIp", d, **kwargs) + return apis.AllocateSecondaryIpResponseSchema().loads(resp) - def create_subnet( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ CreateSubnet - 创建子网 + def allocate_vip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """AllocateVIP - 根据提供信息,申请内网VIP(Virtual IP),多用于高可用程序作为漂移IP。 **Request** - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **Subnet** (str) - (Required) 子网网络地址,例如192.168.0.0 - - **VPCId** (str) - (Required) VPC资源ID - - **Netmask** (int) - 子网网络号位数,默认为24 + - **Region** (str) - (Config) 地域 + - **SubnetId** (str) - (Required) 子网id + - **VPCId** (str) - (Required) 指定vip所属的VPC + - **BusinessId** (str) - 业务组 + - **Count** (int) - 申请数量,默认: 1 + - **Ip** (str) - 指定ip + - **Name** (str) - vip名,默认:VIP - **Remark** (str) - 备注 - - **SubnetName** (str) - 子网名称,默认为Subnet - **Tag** (str) - 业务组名称,默认为Default + - **Zone** (str) - 可用区 **Response** - - **SubnetId** (str) - 子网ID + - **DataSet** (list) - 申请到的VIP地址 + - **VIPSet** (list) - 见 **VIPSet** 模型定义 + + **Response Model** + + **VIPSet** + - **VIP** (str) - 虚拟ip + - **VIPId** (str) - 虚拟ip id + - **VPCId** (str) - VPC id + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) - d = apis.CreateSubnetRequestSchema().dumps(d) + d = apis.AllocateVIPRequestSchema().dumps(d) # build options kwargs["max_retries"] = 0 # ignore retry when api is not idempotent - resp = self.invoke("CreateSubnet", d, **kwargs) - return apis.CreateSubnetResponseSchema().loads(resp) + resp = self.invoke("AllocateVIP", d, **kwargs) + return apis.AllocateVIPResponseSchema().loads(resp) - def create_vpc(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ CreateVPC - 创建VPC + def associate_route_table( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """AssociateRouteTable - 绑定子网的路由表 **Request** - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **Name** (str) - (Required) VPC名称 - - **Network** (list) - (Required) VPC网段 - - **Remark** (str) - 备注 - - **Tag** (str) - 业务组名称 - - **Type** (int) - VPC类型 + - **RouteTableId** (str) - (Required) 路由表资源ID + - **SubnetId** (str) - (Required) 子网ID **Response** - - **VPCId** (str) - VPC资源Id """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) - d = apis.CreateVPCRequestSchema().dumps(d) - - # build options - kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + d = apis.AssociateRouteTableRequestSchema().dumps(d) - resp = self.invoke("CreateVPC", d, **kwargs) - return apis.CreateVPCResponseSchema().loads(resp) + resp = self.invoke("AssociateRouteTable", d, **kwargs) + return apis.AssociateRouteTableResponseSchema().loads(resp) - def create_vpc_intercom( + def associate_sec_group( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ CreateVPCIntercom - 新建VPC互通关系 + """AssociateSecGroup - 绑定资源到安全组 **Request** - - **ProjectId** (str) - (Config) 源VPC所在项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 源VPC所在地域。 参见 `地域和可用区列表 `_ - - **DstVPCId** (str) - (Required) 目的VPC短ID - - **VPCId** (str) - (Required) 源VPC短ID - - **DstProjectId** (str) - 目的VPC项目ID。默认与源VPC同项目。 - - **DstRegion** (str) - 目的VPC所在地域,默认与源VPC同地域。 + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ResourceId** (list) - (Required) 资源短 ID,安全组参赛和该字段只支持一个批量。支持 string 数组。 + - **PrioritySecGroup** (list) - 见 **AssociateSecGroupParamPrioritySecGroup** 模型定义 **Response** + **Request Model** + + **AssociateSecGroupParamPrioritySecGroup** + - **Priority** (int) - 绑定优先级。该字段和资源 ID 只支持一个批量。支持 PrioritySecGroup 的 JSON 格式数组。 + - **SecGroupId** (str) - 安全组 ID。该字段和资源 ID 只支持一个批量。支持 PrioritySecGroup 的 JSON 格式数组。 + + """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) - d = apis.CreateVPCIntercomRequestSchema().dumps(d) - - # build options - kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + d = apis.AssociateSecGroupRequestSchema().dumps(d) - resp = self.invoke("CreateVPCIntercom", d, **kwargs) - return apis.CreateVPCIntercomResponseSchema().loads(resp) + resp = self.invoke("AssociateSecGroup", d, **kwargs) + return apis.AssociateSecGroupResponseSchema().loads(resp) - def delete_route_table( + def associate_sec_group_dynamic( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeleteRouteTable - 删除自定义路由表 + """AssociateSecGroupDynamic - 绑定安全组,动态调整绑定优先级 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **RouteTableId** (str) - (Required) 路由ID + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **ResourceId** (list) - (Required) 资源短 ID 数组。支持数组模式。Type 为 string 数组。 + - **SecGroupId** (str) - (Required) 安全组ID **Response** """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) - d = apis.DeleteRouteTableRequestSchema().dumps(d) + d = apis.AssociateSecGroupDynamicRequestSchema().dumps(d) - resp = self.invoke("DeleteRouteTable", d, **kwargs) - return apis.DeleteRouteTableResponseSchema().loads(resp) + resp = self.invoke("AssociateSecGroupDynamic", d, **kwargs) + return apis.AssociateSecGroupDynamicResponseSchema().loads(resp) - def delete_subnet( + def attach_network_interface( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DeleteSubnet - 删除子网 + """AttachNetworkInterface - 绑定网卡到云主机 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **SubnetId** (str) - (Required) 子网ID + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceId** (str) - (Required) 云主机ID(仅支持绑定开启网卡功能,且未开启网络增强的云主机) + - **InterfaceId** (str) - (Required) 虚拟网卡ID **Response** """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) - d = apis.DeleteSubnetRequestSchema().dumps(d) + d = apis.AttachNetworkInterfaceRequestSchema().dumps(d) - resp = self.invoke("DeleteSubnet", d, **kwargs) - return apis.DeleteSubnetResponseSchema().loads(resp) + resp = self.invoke("AttachNetworkInterface", d, **kwargs) + return apis.AttachNetworkInterfaceResponseSchema().loads(resp) - def delete_vpc(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ DeleteVPC - 删除VPC + def clone_route_table( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CloneRouteTable - 将现有的路由表复制为一张新的路由表 **Request** - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **VPCId** (str) - (Required) VPC资源Id + - **RouteTableId** (str) - (Required) 被克隆的路由表ID **Response** + - **RouteTableId** (str) - 复制后新的路由表资源ID """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) - d = apis.DeleteVPCRequestSchema().dumps(d) + d = apis.CloneRouteTableRequestSchema().dumps(d) - resp = self.invoke("DeleteVPC", d, **kwargs) - return apis.DeleteVPCResponseSchema().loads(resp) + resp = self.invoke("CloneRouteTable", d, **kwargs) + return apis.CloneRouteTableResponseSchema().loads(resp) - def delete_vpc_intercom( - self, req: typing.Optional[dict] = None, **kwargs - ) -> dict: - """ DeleteVPCIntercom - 删除VPC互通关系 + def create_natgw(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """CreateNATGW - 创建NAT网关 **Request** - - **ProjectId** (str) - (Config) 源VPC所在项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 源VPC所在地域。 参见 `地域和可用区列表 `_ - - **DstVPCId** (str) - (Required) 目的VPC短ID - - **VPCId** (str) - (Required) 源VPC短ID - - **DstProjectId** (str) - 目的VPC所在项目ID,默认为源VPC所在项目ID - - **DstRegion** (str) - 目的VPC所在地域,默认为源VPC所在地域 + - **ProjectId** (str) - (Config) 项目Id。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **EIPIds** (list) - (Required) NAT网关绑定的EIPId + - **FirewallId** (str) - (Required) NAT网关绑定的防火墙Id + - **NATGWName** (str) - (Required) NAT网关名称 + - **IfOpen** (int) - 白名单开关标记。0表示关闭,1表示开启。默认为0 + - **Remark** (str) - 备注。默认为空 + - **SubnetworkIds** (list) - NAT网关绑定的子网Id,默认为空。 + - **Tag** (str) - 业务组。默认为空 + - **VPCId** (str) - NAT网关所属的VPC Id。默认为Default VPC Id **Response** + - **NATGWId** (str) - 申请到的NATGateWay Id """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) - d = apis.DeleteVPCIntercomRequestSchema().dumps(d) + d = apis.CreateNATGWRequestSchema().dumps(d) - resp = self.invoke("DeleteVPCIntercom", d, **kwargs) - return apis.DeleteVPCIntercomResponseSchema().loads(resp) + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent - def describe_route_table( + resp = self.invoke("CreateNATGW", d, **kwargs) + return apis.CreateNATGWResponseSchema().loads(resp) + + def create_natgw_policy( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeRouteTable - 获取路由表详细信息(包括路由策略) + """CreateNATGWPolicy - 添加NAT网关端口转发规则 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ProjectId** (str) - (Config) 项目Id。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **BusinessId** (str) - 业务组ID - - **Limit** (int) - Limit - - **OffSet** (int) - OffSet - - **RouteTableId** (str) - 路由表ID - - **VPCId** (str) - VPC ID + - **DstIP** (str) - (Required) 目标IP。填写对应的目标IP地址 + - **DstPort** (str) - (Required) 目标端口。可填写固定端口,也可填写端口范围。支持的端口范围为1-65535 + - **NATGWId** (str) - (Required) NAT网关Id + - **Protocol** (str) - (Required) 协议类型。枚举值为:TCP、UDP + - **SrcEIPId** (str) - (Required) 源IP。填写对应的EIP Id + - **SrcPort** (str) - (Required) 源端口。可填写固定端口,也可填写端口范围。支持的端口范围为1-65535 + - **PolicyName** (str) - 转发策略名称。默认为空 **Response** - - **RouteTables** (list) - 见 **RouteTableInfo** 模型定义 - - **TotalCount** (int) - RouteTables字段的数量 - - **Response Model** - - **RouteRuleInfo** - - - **DstAddr** (str) - 目的地址,比如10.10.8/24 - - **NexthopId** (str) - 路由下一跳ID,比如uvnet-3eljvj - - **NexthopType** (str) - 下一跳类型,比如local、vnet - - **Remark** (str) - 路由规则备注 - - **RouteRuleId** (str) - 规则ID - - **RuleType** (int) - 路由规则类型(0表示系统路由,1表示自定义路由) - - **RouteTableInfo** - - - **CreateTime** (int) - 创建时间戳 - - **Remark** (str) - 路由表备注 - - **RouteRules** (list) - 见 **RouteRuleInfo** 模型定义 - - **RouteTableId** (str) - 路由表ID - - **RouteTableType** (int) - 路由表类型,1为默认,0为自定义 - - **SubnetCount** (str) - 绑定了该路由表的子网数量 - - **Tag** (str) - 业务组 - - **VPCId** (str) - 路由表所属vpc - - **VPCName** (str) - vpc名称 + - **PolicyId** (str) - 创建时分配的策略Id """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) - d = apis.DescribeRouteTableRequestSchema().dumps(d) + d = apis.CreateNATGWPolicyRequestSchema().dumps(d) - resp = self.invoke("DescribeRouteTable", d, **kwargs) - return apis.DescribeRouteTableResponseSchema().loads(resp) + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent - def describe_subnet( + resp = self.invoke("CreateNATGWPolicy", d, **kwargs) + return apis.CreateNATGWPolicyResponseSchema().loads(resp) + + def create_network_acl( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeSubnet - 获取子网信息 + """CreateNetworkAcl - 创建网络ACL **Request** - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **BusinessId** (str) - 业务组 - - **Limit** (int) - 列表长度,默认为20 - - **Offset** (int) - 偏移量,默认为0 - - **RouteTableId** (str) - 路由表Id - - **ShowAvailableIPs** (bool) - 是否返回子网的可用IP数,true为是,false为否,默认不返回 - - **SubnetId** (str) - 子网id,适用于一次查询一个子网信息 - - **SubnetIds** (list) - 子网id数组,适用于一次查询多个子网信息 - - **Tag** (str) - 业务组名称,默认为Default - - **VPCId** (str) - VPC资源id + - **AclName** (str) - (Required) ACL的名称 + - **VpcId** (str) - (Required) 将要创建的ACL所属VPC的ID + - **Description** (str) - ACL的描述 **Response** - - **DataSet** (list) - 见 **SubnetInfo** 模型定义 - - **TotalCount** (int) - 子网总数量 - - **Response Model** - - **SubnetInfo** - - - **AvailableIPs** (int) - 可用IP数量 - - **CreateTime** (int) - 创建时间 - - **Gateway** (str) - 子网网关 - - **HasNATGW** (bool) - 是否有natgw - - **IPv6Network** (str) - 子网关联的IPv6网段 - - **Netmask** (str) - 子网掩码 - - **Remark** (str) - 备注 - - **RouteTableId** (str) - 路由表Id - - **Subnet** (str) - 子网网段 - - **SubnetId** (str) - 子网Id - - **SubnetName** (str) - 子网名称 - - **SubnetType** (int) - 子网类型 - - **Tag** (str) - 业务组 - - **VPCId** (str) - VPCId - - **VPCName** (str) - VPC名称 - - **Zone** (str) - 可用区名称 + - **AclId** (str) - 创建的ACL的ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateNetworkAclRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateNetworkAcl", d, **kwargs) + return apis.CreateNetworkAclResponseSchema().loads(resp) + + def create_network_acl_association( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateNetworkAclAssociation - 创建ACL的绑定关系 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **AclId** (str) - (Required) ACL的ID + - **SubnetworkId** (str) - (Required) 需要绑定的子网ID + + **Response** + + - **AssociationId** (str) - 创建的绑定关系的ID + - **PrevAssociation** (dict) - 见 **AssociationInfo** 模型定义 + + **Response Model** + + **AssociationInfo** + - **AclId** (str) - ACL的ID + - **AssociationId** (str) - 绑定ID + - **CreateTime** (int) - 创建的Unix时间戳 + - **SubnetworkId** (str) - 绑定的子网ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateNetworkAclAssociationRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateNetworkAclAssociation", d, **kwargs) + return apis.CreateNetworkAclAssociationResponseSchema().loads(resp) + + def create_network_acl_entry( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateNetworkAclEntry - 创建ACL的规则 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **AclId** (str) - (Required) ACL的ID + - **CidrBlock** (str) - (Required) IPv4段的CIDR表示 + - **Direction** (str) - (Required) 出向或者入向(“Ingress”, "Egress") + - **EntryAction** (str) - (Required) 规则的行为("Accept", "Reject") + - **IpProtocol** (str) - (Required) 协议规则描述 + - **PortRange** (str) - (Required) 针对的端口范围 + - **Priority** (int) - (Required) Entry的优先级,对于同样的Direction来说,不能重复 + - **Description** (str) - 描述。长度限制为不超过32字节。 + - **TargetResourceIds** (list) - 应用目标资源列表。默认为全部资源生效。TargetType为0时不用填写该值。 + - **TargetType** (int) - 应用目标类型。0代表“子网内全部资源”,1代表“子网内指定资源”,默认为0 + + **Response** + + - **EntryId** (str) - 创建的Entry的ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateNetworkAclEntryRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateNetworkAclEntry", d, **kwargs) + return apis.CreateNetworkAclEntryResponseSchema().loads(resp) + + def create_network_interface( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateNetworkInterface - 创建虚拟网卡 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SubnetId** (str) - (Required) 所属子网ID + - **VPCId** (str) - (Required) 所属VPCID + - **EipDirectMode** (bool) - 是否开启EIP直通,默认false + - **Name** (str) - 虚拟网卡名称,默认为 NetworkInterface + - **PrioritySecGroup** (list) - 见 **CreateNetworkInterfaceParamPrioritySecGroup** 模型定义 + - **PrivateIp** (list) - 指定内网IP。当前一个网卡仅支持绑定一个内网IP + - **Remark** (str) - 备注 + - **SecurityGroupId** (str) - 防火墙GroupId,默认:Web推荐防火墙 可由DescribeSecurityGroupResponse中的GroupId取得 + - **SecurityMode** (int) - 指定使用 安全组还是防火墙。为 0 时绑定防火墙,为1时绑定安全组 + - **Tag** (str) - 业务组 + + **Response** + + - **NetworkInterface** (dict) - 见 **NetworkInterfaceInfo** 模型定义 + + **Request Model** + + **CreateNetworkInterfaceParamPrioritySecGroup** + - **Priority** (int) - 安全组优先级 + - **SecGroupId** (str) - 安全组 ID + + + **Response Model** + + **NetworkInterfaceInfo** + - **AttachInstanceId** (str) - 绑定实例资源ID + - **CreateTime** (int) - 创建时间 + - **Default** (bool) - 是否是绑定实例的默认网卡 false:不是 true:是 + - **Gateway** (str) - 默认网关 + - **InterfaceId** (str) - 虚拟网卡资源ID + - **MacAddress** (str) - 关联Mac + - **Name** (str) - 虚拟网卡名称 + - **Netmask** (str) - 内网IP掩码 + - **PrivateIpSet** (list) - 关联内网IP。当前一个网卡仅支持绑定一个内网IP + - **Remark** (str) - 备注 + - **Status** (int) - 绑定状态 + - **SubnetId** (str) - 所属子网 + - **Tag** (str) - 业务组 + - **VPCId** (str) - 所属VPC + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateNetworkInterfaceRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateNetworkInterface", d, **kwargs) + return apis.CreateNetworkInterfaceResponseSchema().loads(resp) + + def create_route_table( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateRouteTable - 创建路由表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **VPCId** (str) - (Required) 所属的VPC资源ID + - **Name** (str) - 路由表名称。默认为RouteTable + - **Remark** (str) - 备注 + - **Tag** (str) - 路由表所属业务组 + + **Response** + + - **RouteTableId** (str) - 路由表ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateRouteTableRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateRouteTable", d, **kwargs) + return apis.CreateRouteTableResponseSchema().loads(resp) + + def create_sec_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateSecGroup - 创建安全组 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Name** (str) - (Required) 安全组名称,最长64个字符。 + - **VPCID** (str) - (Required) 资源ID所属的VPC + + **Response** + + - **SecGroupId** (str) - 安全组ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateSecGroupRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateSecGroup", d, **kwargs) + return apis.CreateSecGroupResponseSchema().loads(resp) + + def create_sec_group_rule( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateSecGroupRule - + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SecGroupId** (str) - (Required) 需要添加规则的安全组资源ID。 + - **Rule** (list) - 见 **CreateSecGroupRuleParamRule** 模型定义 + + **Response** + + - **RuleId** (list) - 规则 ID + + **Request Model** + + **CreateSecGroupRuleParamRule** + - **Direction** (str) - "Ingress/Egress",入站规则/出站规则 + - **DstPort** (str) - 目的端口。逗号分隔,如 "80,443"、"443,2000-10000" + - **IPRange** (str) - IP 地址信息,逗号分隔。 + - **IPVersion** (str) - IP 版本,如 “IPv4”。支持 IPv6 后废弃 + - **Priority** (int) - 规则优先级。范围为 1~200 + - **ProtocolType** (str) - 协议类型。"TCP","UDP","ICMP","ICMPv6","ALL" + - **Remark** (str) - 规则备注 + - **RuleAction** (str) - 规则行为。"Accept" 或 "Drop" + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateSecGroupRuleRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateSecGroupRule", d, **kwargs) + return apis.CreateSecGroupRuleResponseSchema().loads(resp) + + def create_snat_dnat_rule( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateSnatDnatRule - 调用接口后会自动创建内外网IP之间的SNAT和DNAT规则,支持TCP、UDP协议全端口 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **EIP** (list) - (Required) EIP的IP地址。按入参顺序,PrivateIp与EIP一一对应建立映射关系。 + - **NATGWId** (str) - (Required) 映射所使用的NAT网关资源ID + - **PrivateIp** (list) - (Required) 内网P地址 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateSnatDnatRuleRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateSnatDnatRule", d, **kwargs) + return apis.CreateSnatDnatRuleResponseSchema().loads(resp) + + def create_subnet( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateSubnet - 创建子网 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Subnet** (str) - (Required) 子网网络地址,例如192.168.0.0 + - **VPCId** (str) - (Required) VPC资源ID + - **Netmask** (int) - 子网网络号位数,默认为24 + - **Remark** (str) - 备注 + - **SubnetName** (str) - 子网名称,默认为Subnet + - **Tag** (str) - 业务组名称,默认为Default + + **Response** + + - **SubnetId** (str) - 子网ID + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateSubnetRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateSubnet", d, **kwargs) + return apis.CreateSubnetResponseSchema().loads(resp) + + def create_vpc(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """CreateVPC - 创建VPC + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Name** (str) - (Required) VPC名称 + - **Network** (list) - (Required) VPC网段 + - **Remark** (str) - 备注 + - **Tag** (str) - 业务组名称 + + **Response** + + - **VPCId** (str) - VPC资源Id + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateVPCRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateVPC", d, **kwargs) + return apis.CreateVPCResponseSchema().loads(resp) + + def create_vpc_intercom( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """CreateVPCIntercom - 新建VPC互通关系 + + **Request** + + - **ProjectId** (str) - (Config) 源VPC所在项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 源VPC所在地域。 参见 `地域和可用区列表 `_ + - **DstVPCId** (str) - (Required) 目的VPC短ID + - **VPCId** (str) - (Required) 源VPC短ID + - **DstProjectId** (str) - 目的VPC项目ID。默认与源VPC同项目。 + - **DstRegion** (str) - 目的VPC所在地域,默认与源VPC同地域。 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.CreateVPCIntercomRequestSchema().dumps(d) + + # build options + kwargs["max_retries"] = 0 # ignore retry when api is not idempotent + + resp = self.invoke("CreateVPCIntercom", d, **kwargs) + return apis.CreateVPCIntercomResponseSchema().loads(resp) + + def delete_natgw(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """DeleteNATGW - 删除NAT网关 + + **Request** + + - **ProjectId** (str) - (Config) 项目Id。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **NATGWId** (str) - (Required) NAT网关Id + - **ReleaseEip** (bool) - 是否释放绑定的EIP。true:解绑并释放;false:只解绑不释放。默认为false + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteNATGWRequestSchema().dumps(d) + + resp = self.invoke("DeleteNATGW", d, **kwargs) + return apis.DeleteNATGWResponseSchema().loads(resp) + + def delete_natgw_policy( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteNATGWPolicy - 删除NAT网关端口转发规则 + + **Request** + + - **ProjectId** (str) - (Config) 项目Id。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **NATGWId** (str) - (Required) NAT网关Id + - **PolicyId** (str) - (Required) 端口转发规则Id + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteNATGWPolicyRequestSchema().dumps(d) + + resp = self.invoke("DeleteNATGWPolicy", d, **kwargs) + return apis.DeleteNATGWPolicyResponseSchema().loads(resp) + + def delete_network_acl( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteNetworkAcl - 删除网络ACL + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **AclId** (str) - (Required) 需要删除的AclId + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteNetworkAclRequestSchema().dumps(d) + + resp = self.invoke("DeleteNetworkAcl", d, **kwargs) + return apis.DeleteNetworkAclResponseSchema().loads(resp) + + def delete_network_acl_association( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteNetworkAclAssociation - 删除网络ACL绑定关系 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **AclId** (str) - (Required) 需要删除的AclId + - **SubnetworkId** (str) - (Required) 绑定的子网ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteNetworkAclAssociationRequestSchema().dumps(d) + + resp = self.invoke("DeleteNetworkAclAssociation", d, **kwargs) + return apis.DeleteNetworkAclAssociationResponseSchema().loads(resp) + + def delete_network_acl_entry( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteNetworkAclEntry - 删除ACL的规则 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **AclId** (str) - (Required) Acl的ID + - **EntryId** (str) - (Required) 需要删除的EntryId + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteNetworkAclEntryRequestSchema().dumps(d) + + resp = self.invoke("DeleteNetworkAclEntry", d, **kwargs) + return apis.DeleteNetworkAclEntryResponseSchema().loads(resp) + + def delete_network_interface( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteNetworkInterface - 删除网卡 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InterfaceId** (str) - (Required) 虚拟网卡ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteNetworkInterfaceRequestSchema().dumps(d) + + resp = self.invoke("DeleteNetworkInterface", d, **kwargs) + return apis.DeleteNetworkInterfaceResponseSchema().loads(resp) + + def delete_route_table( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteRouteTable - 删除自定义路由表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **RouteTableId** (str) - (Required) 路由表资源ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteRouteTableRequestSchema().dumps(d) + + resp = self.invoke("DeleteRouteTable", d, **kwargs) + return apis.DeleteRouteTableResponseSchema().loads(resp) + + def delete_sec_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteSecGroup - 删除安全组 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SecGroupId** (list) - (Required) 安全组资源 Id。支持 string 数组格式。 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteSecGroupRequestSchema().dumps(d) + + resp = self.invoke("DeleteSecGroup", d, **kwargs) + return apis.DeleteSecGroupResponseSchema().loads(resp) + + def delete_sec_group_rule( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteSecGroupRule - + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **RuleId** (list) - (Required) 安全组规则 ID。支持 string 数组格式。 + - **SecGroupId** (str) - (Required) 所属安全组 ID。 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteSecGroupRuleRequestSchema().dumps(d) + + resp = self.invoke("DeleteSecGroupRule", d, **kwargs) + return apis.DeleteSecGroupRuleResponseSchema().loads(resp) + + def delete_secondary_ip( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteSecondaryIp - 删除ip(用于uk8s使用) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Ip** (str) - (Required) ip + - **Mac** (str) - (Required) mac + - **SubnetId** (str) - (Required) 子网Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **ObjectId** (str) - 资源Id + - **VPCId** (str) - VPCId + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteSecondaryIpRequestSchema().dumps(d) + + resp = self.invoke("DeleteSecondaryIp", d, **kwargs) + return apis.DeleteSecondaryIpResponseSchema().loads(resp) + + def delete_snat_dnat_rule( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteSnatDnatRule - 删除NAT创建内外网IP映射规则 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **EIP** (list) - (Required) EIP的IP地址,PrivateIp与EIP需一一对应 + - **NATGWId** (str) - (Required) 映射所使用的NAT网关资源ID + - **PrivateIp** (list) - (Required) 内网P地址 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteSnatDnatRuleRequestSchema().dumps(d) + + resp = self.invoke("DeleteSnatDnatRule", d, **kwargs) + return apis.DeleteSnatDnatRuleResponseSchema().loads(resp) + + def delete_snat_rule( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteSnatRule - 删除指定的出口规则(SNAT规则) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **NATGWId** (str) - (Required) NAT网关的ID + - **SourceIp** (str) - (Required) 需要出外网的私网IP地址,例如10.9.7.xx + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteSnatRuleRequestSchema().dumps(d) + + resp = self.invoke("DeleteSnatRule", d, **kwargs) + return apis.DeleteSnatRuleResponseSchema().loads(resp) + + def delete_subnet( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteSubnet - 删除子网 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SubnetId** (str) - (Required) 子网ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteSubnetRequestSchema().dumps(d) + + resp = self.invoke("DeleteSubnet", d, **kwargs) + return apis.DeleteSubnetResponseSchema().loads(resp) + + def delete_vpc(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """DeleteVPC - 删除VPC + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **VPCId** (str) - (Required) VPC资源Id + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteVPCRequestSchema().dumps(d) + + resp = self.invoke("DeleteVPC", d, **kwargs) + return apis.DeleteVPCResponseSchema().loads(resp) + + def delete_vpc_intercom( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteVPCIntercom - 删除VPC互通关系 + + **Request** + + - **ProjectId** (str) - (Config) 源VPC所在项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 源VPC所在地域。 参见 `地域和可用区列表 `_ + - **DstVPCId** (str) - (Required) 目的VPC短ID + - **VPCId** (str) - (Required) 源VPC短ID + - **DstProjectId** (str) - 目的VPC所在项目ID,默认为源VPC所在项目ID + - **DstRegion** (str) - 目的VPC所在地域,默认为源VPC所在地域 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteVPCIntercomRequestSchema().dumps(d) + + resp = self.invoke("DeleteVPCIntercom", d, **kwargs) + return apis.DeleteVPCIntercomResponseSchema().loads(resp) + + def delete_white_list_resource( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DeleteWhiteListResource - 删除NAT网关白名单列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目Id。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **NATGWId** (str) - (Required) NAT网关Id + - **ResourceIds** (list) - (Required) 删除白名单的资源Id + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DeleteWhiteListResourceRequestSchema().dumps(d) + + resp = self.invoke("DeleteWhiteListResource", d, **kwargs) + return apis.DeleteWhiteListResourceResponseSchema().loads(resp) + + def describe_instance_network_interface( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeInstanceNetworkInterface - 展示云主机绑定的网卡信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceId** (str) - (Required) 云主机ID + - **Limit** (int) - 默认为20 + - **Offset** (int) - 默认为0 + + **Response** + + - **NetworkInterfaceSet** (list) - 见 **InstanceNetworkInterface** 模型定义 + + **Response Model** + + **InstanceNetworkInterface** + - **AttachInstanceId** (str) - 绑定实例资源ID + - **CreateTime** (int) - 创建时间 + - **Default** (bool) - 是否是绑定实例的默认网卡 false:不是 true:是 + - **EIPIdSet** (list) - 虚拟网卡绑定的EIP ID信息 + - **FirewallIdSet** (list) - 虚拟网卡绑定的防火墙ID信息 + - **Gateway** (str) - 默认网关 + - **InterfaceId** (str) - 虚拟网卡资源ID + - **MacAddress** (str) - 关联Mac + - **Name** (str) - 虚拟网卡名称 + - **Netmask** (str) - 内网IP掩码 + - **PrivateIpSet** (list) - 关联内网IP。当前一个网卡仅支持绑定一个内网IP + - **Remark** (str) - 备注 + - **Status** (int) - 绑定状态 + - **SubnetId** (str) - 所属子网 + - **Tag** (str) - 业务组 + - **VPCId** (str) - 所属VPC + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeInstanceNetworkInterfaceRequestSchema().dumps(d) + + resp = self.invoke("DescribeInstanceNetworkInterface", d, **kwargs) + return apis.DescribeInstanceNetworkInterfaceResponseSchema().loads(resp) + + def describe_natgw( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeNATGW - 获取NAT网关信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目Id。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - 数据分页值。默认为20 + - **NATGWIds** (list) - NAT网关Id。默认为该项目下所有NAT网关 + - **Offset** (int) - 数据偏移量。默认为0 + + **Response** + + - **DataSet** (list) - 见 **NatGatewayDataSet** 模型定义 + - **TotalCount** (int) - 满足条件的实例的总数 + + **Response Model** + + **NatGatewayDataSet** + - **CreateTime** (int) - natgw创建时间 + - **FirewallId** (str) - 绑定的防火墙Id + - **IPSet** (list) - 见 **NatGatewayIPSet** 模型定义 + - **IsSnatpoolEnabled** (str) - 枚举值,“enable”,默认出口规则使用了负载均衡;“disable”,默认出口规则未使用负载均衡。 + - **NATGWId** (str) - natgw id + - **NATGWName** (str) - natgw名称 + - **PolicyId** (list) - 转发策略Id + - **Remark** (str) - 备注 + - **SubnetSet** (list) - 见 **NatGatewaySubnetSet** 模型定义 + - **Tag** (str) - 业务组 + - **VPCId** (str) - 所属VPC Id + - **VPCName** (str) - VPC名称 + + + **NatGatewayIPSet** + - **Bandwidth** (int) - 带宽 + - **BandwidthType** (str) - EIP带宽类型 + - **EIPId** (str) - 外网IP的 EIPId + - **IPResInfo** (list) - 见 **NatGWIPResInfo** 模型定义 + - **Weight** (int) - 权重为100的为出口 + + + **NatGWIPResInfo** + - **EIP** (str) - 外网IP + - **OperatorName** (str) - IP的运营商信息 + + + **NatGatewaySubnetSet** + - **Subnet** (str) - 子网网段 + - **SubnetName** (str) - 子网名字 + - **SubnetworkId** (str) - 子网id + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeNATGWRequestSchema().dumps(d) + + resp = self.invoke("DescribeNATGW", d, **kwargs) + return apis.DescribeNATGWResponseSchema().loads(resp) + + def describe_natgw_policy( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeNATGWPolicy - 展示NAT网关端口转发规则 + + **Request** + + - **ProjectId** (str) - (Config) 项目Id。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **NATGWId** (str) - (Required) NAT网关Id + - **Limit** (int) - 返回数据长度,默认为10000 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + + **Response** + + - **DataSet** (list) - 见 **NATGWPolicyDataSet** 模型定义 + - **TotalCount** (int) - 满足条件的转发策略总数 + + **Response Model** + + **NATGWPolicyDataSet** + - **DstIP** (str) - 目的地址 + - **DstPort** (str) - 目的端口 + - **NATGWId** (str) - NAT网关Id + - **PolicyId** (str) - 转发策略Id + - **PolicyName** (str) - 转发策略名称 + - **Protocol** (str) - 协议类型 + - **SrcEIP** (str) - 端口转发前端EIP + - **SrcEIPId** (str) - 端口转发前端EIP Id + - **SrcPort** (str) - 源端口 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeNATGWPolicyRequestSchema().dumps(d) + + resp = self.invoke("DescribeNATGWPolicy", d, **kwargs) + return apis.DescribeNATGWPolicyResponseSchema().loads(resp) + + def describe_network_acl( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeNetworkAcl - 获取网络ACL + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (str) - 列表获取的个数限制 + - **Offset** (int) - 列表偏移量 + - **VpcId** (str) - 需要获取的ACL所属的VPC的ID + + **Response** + + - **AclList** (list) - 见 **AclInfo** 模型定义 + + **Response Model** + + **AclInfo** + - **AclId** (str) - ACL的ID + - **AclName** (str) - 名称 + - **Associations** (list) - 见 **AssociationInfo** 模型定义 + - **CreateTime** (int) - 创建的Unix时间戳 + - **Description** (str) - 描述 + - **Entries** (list) - 见 **AclEntryInfo** 模型定义 + - **UpdateTime** (int) - 更改的Unix时间戳 + - **VpcId** (str) - ACL所属的VPC ID + + + **AssociationInfo** + - **AclId** (str) - ACL的ID + - **AssociationId** (str) - 绑定ID + - **CreateTime** (int) - 创建的Unix时间戳 + - **SubnetworkId** (str) - 绑定的子网ID + + + **AclEntryInfo** + - **CidrBlock** (str) - IP段的CIDR信息 + - **CreateTime** (int) - 创建的Unix时间戳 + - **Direction** (str) - 出向或者入向 + - **EntryAction** (str) - 匹配规则的动作 + - **EntryId** (str) - Entry的ID + - **IpProtocol** (str) - 针对的IP协议 + - **PortRange** (str) - Port的段信息 + - **Priority** (str) - 优先级 + - **TargetResourceCount** (int) - 应用目标资源数量。TargetType为0时不返回该值。 + - **TargetResourceList** (list) - 见 **TargetResourceInfo** 模型定义 + - **TargetType** (int) - 应用目标类型。 0代表“子网内全部资源” ,1代表“子网内指定资源” 。 + - **UpdateTime** (int) - 更改的Unix时间戳 + + + **TargetResourceInfo** + - **PrivateIp** (str) - 资源内网IP + - **ResourceId** (str) - 资源ID + - **ResourceName** (str) - 资源名称 + - **ResourceType** (int) - 资源类型 + - **SubResourceId** (str) - 资源绑定的虚拟网卡的ID + - **SubResourceName** (str) - 资源绑定的虚拟网卡的名称 + - **SubResourceType** (int) - 资源绑定虚拟网卡的类型 + - **SubnetworkId** (str) - 子网ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeNetworkAclRequestSchema().dumps(d) + + resp = self.invoke("DescribeNetworkAcl", d, **kwargs) + return apis.DescribeNetworkAclResponseSchema().loads(resp) + + def describe_network_acl_association( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeNetworkAclAssociation - 获取网络ACL的绑定关系列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **AclId** (str) - (Required) Acl的ID + - **Limit** (str) - 列表获取的个数限制 + - **Offset** (int) - 列表偏移量 + + **Response** + + - **AssociationList** (list) - 见 **AssociationInfo** 模型定义 + + **Response Model** + + **AssociationInfo** + - **AclId** (str) - ACL的ID + - **AssociationId** (str) - 绑定ID + - **CreateTime** (int) - 创建的Unix时间戳 + - **SubnetworkId** (str) - 绑定的子网ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeNetworkAclAssociationRequestSchema().dumps(d) + + resp = self.invoke("DescribeNetworkAclAssociation", d, **kwargs) + return apis.DescribeNetworkAclAssociationResponseSchema().loads(resp) + + def describe_network_acl_association_by_subnet( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeNetworkAclAssociationBySubnet - 获取子网的ACL绑定信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SubnetworkId** (str) - (Required) 子网的ID + + **Response** + + - **Association** (dict) - 见 **AssociationInfo** 模型定义 + + **Response Model** + + **AssociationInfo** + - **AclId** (str) - ACL的ID + - **AssociationId** (str) - 绑定ID + - **CreateTime** (int) - 创建的Unix时间戳 + - **SubnetworkId** (str) - 绑定的子网ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeNetworkAclAssociationBySubnetRequestSchema().dumps(d) + + resp = self.invoke("DescribeNetworkAclAssociationBySubnet", d, **kwargs) + return apis.DescribeNetworkAclAssociationBySubnetResponseSchema().loads( + resp + ) + + def describe_network_acl_entry( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeNetworkAclEntry - 获取ACL的规则信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **AclId** (str) - (Required) ACL的ID + + **Response** + + - **EntryList** (list) - 见 **AclEntryInfo** 模型定义 + + **Response Model** + + **AclEntryInfo** + - **CidrBlock** (str) - IP段的CIDR信息 + - **CreateTime** (int) - 创建的Unix时间戳 + - **Direction** (str) - 出向或者入向 + - **EntryAction** (str) - 匹配规则的动作 + - **EntryId** (str) - Entry的ID + - **IpProtocol** (str) - 针对的IP协议 + - **PortRange** (str) - Port的段信息 + - **Priority** (str) - 优先级 + - **TargetResourceCount** (int) - 应用目标资源数量。TargetType为0时不返回该值。 + - **TargetResourceList** (list) - 见 **TargetResourceInfo** 模型定义 + - **TargetType** (int) - 应用目标类型。 0代表“子网内全部资源” ,1代表“子网内指定资源” 。 + - **UpdateTime** (int) - 更改的Unix时间戳 + + + **TargetResourceInfo** + - **PrivateIp** (str) - 资源内网IP + - **ResourceId** (str) - 资源ID + - **ResourceName** (str) - 资源名称 + - **ResourceType** (int) - 资源类型 + - **SubResourceId** (str) - 资源绑定的虚拟网卡的ID + - **SubResourceName** (str) - 资源绑定的虚拟网卡的名称 + - **SubResourceType** (int) - 资源绑定虚拟网卡的类型 + - **SubnetworkId** (str) - 子网ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeNetworkAclEntryRequestSchema().dumps(d) + + resp = self.invoke("DescribeNetworkAclEntry", d, **kwargs) + return apis.DescribeNetworkAclEntryResponseSchema().loads(resp) + + def describe_network_interface( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeNetworkInterface - 展示虚拟网卡信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InterfaceId** (list) - 虚拟网卡ID,可指定 0~n + - **Limit** (int) - 默认为20 + - **NoRecycled** (bool) - 若为true 过滤绑定在回收站主机中的网卡。默认为false。 + - **Offset** (int) - 默认为0 + - **OnlyDefault** (bool) - 若为true 只返回默认网卡默认为false + - **SubnetId** (str) - 所属子网 + - **Tag** (str) - 业务组 + - **VPCId** (str) - 所属VPC + + **Response** + + - **NetworkInterfaceSet** (list) - 见 **NetworkInterface** 模型定义 + - **TotalCount** (int) - 虚拟网卡总数 + + **Response Model** + + **NetworkInterface** + - **AttachInstanceId** (str) - 绑定实例资源ID + - **CreateTime** (int) - 创建时间 + - **Default** (bool) - 是否是绑定实例的默认网卡 false:不是 true:是 + - **EIPIdSet** (list) - 虚拟网卡绑定的EIP ID信息 + - **FirewallIdSet** (list) - 虚拟网卡绑定的防火墙ID信息 + - **Gateway** (str) - 默认网关 + - **InterfaceId** (str) - 虚拟网卡资源ID + - **MacAddress** (str) - 关联Mac + - **Name** (str) - 虚拟网卡名称 + - **Netmask** (str) - 内网IP掩码 + - **PrivateIp** (list) - 见 **UNIIpInfo** 模型定义 + - **PrivateIpLimit** (dict) - 见 **UNIQuotaInfo** 模型定义 + - **PrivateIpSet** (list) - 关联内网IP。当前一个网卡仅支持绑定一个内网IP + - **Remark** (str) - 备注 + - **Status** (int) - 绑定状态 + - **SubnetId** (str) - 所属子网 + - **Tag** (str) - 业务组 + - **VPCId** (str) - 所属VPC + + + **UNIIpInfo** + - **IpAddr** (list) - ip 地址 + - **IpType** (str) - ip类型 SecondaryIp/PrimaryIp + + + **UNIQuotaInfo** + - **PrivateIpCount** (int) - 网卡拥有的内网IP数量 + - **PrivateIpQuota** (int) - 网卡内网IP配额 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeNetworkInterfaceRequestSchema().dumps(d) + + resp = self.invoke("DescribeNetworkInterface", d, **kwargs) + return apis.DescribeNetworkInterfaceResponseSchema().loads(resp) + + def describe_resource_sec_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeResourceSecGroup - 查询资源绑定的安全组信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - 分页查询时的最大返回资源数量。 + - **Offset** (int) - 分页查询时的偏移量。传入了 ResourceId 则不分页。 + - **ResourceId** (list) - 资源 ID 数组,如果指定则不分页;否则分页获取该账号下的指定类型的资源。支持 string 数组格式。 + - **ResourceType** (str) - 资源类型,如 uhost, uni + - **VPCId** (str) - VPC ID。非必须,分页使用(分页时,也可不传);ResourceId 非空时,忽略 + + **Response** + + - **DataSet** (list) - 见 **ResourceSecgroupInfoEx** 模型定义 + - **TotalCount** (int) - 资源总数量。传入 ResourceId 时,为传入资源中的有效资源数量。 + + **Response Model** + + **ResourceSecgroupInfoEx** + - **Count** (int) - 该资源绑定的安全组数量 + - **ExInfo** (dict) - 见 **ResourceExInfo** 模型定义 + - **PermitAssociate** (bool) - 表示是否允许绑定安全组 + - **ResourceId** (str) - 资源 ID + - **ResourceName** (str) - 资源名称 + - **SecGroupInfo** (list) - 见 **BindingSecGroupInfo** 模型定义 + + + **ResourceExInfo** + - **EIP** (list) - 主机外网IP + - **IP** (list) - 主机内网IP + - **ResourceName** (str) - 资源名称 + - **SuperResourceId** (str) - 父级资源ID + - **SuperResourceName** (str) - 父级资源名称 + - **Uni** (list) - 见 **ResourceSecgroupInfo** 模型定义 + + + **ResourceSecgroupInfo** + - **Count** (int) - 资源绑定安全组数量 + - **ResourceId** (str) - 资源ID + - **SecGroupInfo** (list) - 见 **SecGroupSimpleInfo** 模型定义 + + + **SecGroupSimpleInfo** + - **Name** (str) - 安全组名称 + - **SecGroupId** (str) - 安全组资源ID + + + **BindingSecGroupInfo** + - **Name** (str) - 安全组名称 + - **Priority** (int) - 该资源与该安全组绑定的优先级 + - **SecGroupId** (str) - 安全组 ID + - **VPCId** (str) - 安全组所属 VPC + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeResourceSecGroupRequestSchema().dumps(d) + + resp = self.invoke("DescribeResourceSecGroup", d, **kwargs) + return apis.DescribeResourceSecGroupResponseSchema().loads(resp) + + def describe_route_table( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeRouteTable - 获取路由表详细信息(包括路由策略) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Brief** (bool) - 默认为 false, 返回详细路由规则信息 + - **BusinessId** (str) - 业务组ID + - **Limit** (int) - 数据分页值。默认为20 + - **LongId** (str) - 默认为 false, 表示路由表是短 ID + - **OffSet** (int) - 数据偏移量。默认为0 + - **RouteTableId** (str) - 路由表资源ID + - **VPCId** (str) - 所属VPC的资源ID + + **Response** + + - **RouteTables** (list) - 见 **RouteTableInfo** 模型定义 + - **TotalCount** (int) - RouteTables字段的数量 + + **Response Model** + + **RouteTableInfo** + - **CreateTime** (int) - 创建时间戳 + - **Remark** (str) - 路由表备注 + - **RouteRules** (list) - 见 **RouteRuleInfo** 模型定义 + - **RouteTableId** (str) - 路由表资源ID + - **RouteTableType** (int) - 路由表类型。1为默认路由表,0为自定义路由表 + - **SubnetCount** (int) - 绑定该路由表的子网数量 + - **SubnetIds** (list) - 绑定该路由表的子网 + - **Tag** (str) - 路由表所属业务组 + - **VPCId** (str) - 路由表所属的VPC资源ID + - **VPCName** (str) - 路由表所属的VPC资源名称 + + + **RouteRuleInfo** + - **AccountId** (int) - 项目ID信息 + - **DstAddr** (str) - 目的地址 + - **DstPort** (int) - 保留字段,暂未使用 + - **InstanceType** (str) - 实例类型,枚举值:UHOST,云主机;UNI,虚拟网卡;PHOST,物理云主机 + - **NexthopId** (str) - 路由下一跳资源ID + - **NexthopType** (str) - 路由表下一跳类型。LOCAL,本VPC内部通信路由;PUBLIC,公共服务路由;CNAT,外网路由;UDPN,跨域高速通道路由;HYBRIDGW,混合云路由;INSTANCE,实例路由;VNET,VPC联通路由;IPSEC VPN,指向VPN网关的路由。 + - **OriginAddr** (str) - 保留字段,暂未使用 + - **Priority** (int) - 保留字段,暂未使用 + - **Remark** (str) - 路由规则备注 + - **RouteRuleId** (str) - 规则ID + - **RouteTableId** (str) - 路由表资源ID + - **RuleType** (int) - 路由规则类型。0,系统路由规则;1,自定义路由规则 + - **SrcAddr** (str) - 保留字段,暂未使用 + - **SrcPort** (int) - 保留字段,暂未使用 + - **VNetId** (str) - 所属的VPC + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeRouteTableRequestSchema().dumps(d) + + resp = self.invoke("DescribeRouteTable", d, **kwargs) + return apis.DescribeRouteTableResponseSchema().loads(resp) + + def describe_sec_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeSecGroup - + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - 分页查询数据长度。默认为20 + - **Offset** (int) - 分页查询起始位置偏移量。默认为0 + - **SecGroupId** (list) - 安全组资源 ID 数组,传入则 Offset/Limit/BusinessId 失效。支持数组格式。Type 为 string 数组。 + - **VPCId** (str) - 资源ID所属的 VPC ID + + **Response** + + - **DataSet** (list) - 见 **SecGroupInfo** 模型定义 + + **Response Model** + + **SecGroupInfo** + - **Account** (int) - 用户 ID + - **CreateTime** (int) - 创建的时间,格式为Unix Timestamp,如 1747030299 + - **Name** (str) - 安全组名称 + - **Remark** (str) - 备注 + - **Rule** (list) - 见 **SecGroupRuleInfo** 模型定义 + - **SecGroupId** (str) - 安全组资源ID + - **Tag** (str) - 业务组 + - **Type** (str) - 安全组类型,枚举值为: "user defined", 自定义创建安全组; "recommend web", 使用Web模板创建的安全组; "recommend non web", 使用非Web模板创建的安全组 + - **VPCId** (str) - VPC资源ID + + + **SecGroupRuleInfo** + - **Direction** (str) - "Ingress/Egress",入站规则/出站规则 + - **DstPort** (str) - 目标端口 + - **IPRange** (str) - 地址 + - **IPVersion** (str) - IP 版本,如 "IPv4"。支持 IPv6 后废弃 + - **Priority** (int) - 优先级 + - **ProtocolType** (str) - 协议类型 + - **Remark** (str) - 安全组规则备注 + - **RuleAction** (str) - 匹配策略 + - **RuleId** (str) - 规则ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeSecGroupRequestSchema().dumps(d) + + resp = self.invoke("DescribeSecGroup", d, **kwargs) + return apis.DescribeSecGroupResponseSchema().loads(resp) + + def describe_sec_group_resource( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeSecGroupResource - 获取安全组绑资源信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - 分页查询长度。默认为20 + - **Offset** (int) - 分页查询起始位置偏移量。默认为0 + - **SecGroupId** (str) - 安全组资源ID。 + + **Response** + + - **DataSet** (list) - 见 **SecGroupResourceInfo** 模型定义 + - **TotalCount** (int) - 安全组绑定的资源总数 + + **Response Model** + + **SecGroupResourceInfo** + - **Name** (str) - 名称 + - **PrivateIp** (str) - 内网IP + - **ResourceId** (str) - 资源ID + - **ResourceType** (str) - 资源类型。"unatgw",NAT网关; "uhost",云主机; "upm",物理云主机; "hadoophost",hadoop节点; "fortresshost",堡垒机; "udhost",私有专区主机;"udockhost",容器;"dbaudit",数据库审计,“uni”,虚拟网卡。 + - **SubResourceId** (str) - 资源绑定的虚拟网卡的ID + - **SubResourceName** (str) - 绑定的虚拟网卡的名称 + - **SubResourceType** (str) - 绑定的虚拟网卡的类型,“uni”,虚拟网卡 + - **Tag** (str) - 业务组 + - **Zone** (int) - 可用区 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeSecGroupResourceRequestSchema().dumps(d) + + resp = self.invoke("DescribeSecGroupResource", d, **kwargs) + return apis.DescribeSecGroupResourceResponseSchema().loads(resp) + + def describe_secondary_ip( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeSecondaryIp - 查询SecondaryIp(uk8s使用) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SubnetId** (str) - (Required) 子网Id + - **VPCId** (str) - (Required) VPCId + - **Zone** (str) - (Required) + - **Ip** (str) - Ip + - **Mac** (str) - Mac + + **Response** + + - **DataSet** (list) - 见 **IpInfo** 模型定义 + + **Response Model** + + **IpInfo** + - **Gateway** (str) - + - **Ip** (str) - + - **Mac** (str) - + - **Mask** (str) - + - **SubnetId** (str) - + - **VPCId** (str) - + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeSecondaryIpRequestSchema().dumps(d) + + resp = self.invoke("DescribeSecondaryIp", d, **kwargs) + return apis.DescribeSecondaryIpResponseSchema().loads(resp) + + def describe_snat_dnat_rule( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeSnatDnatRule - 获取基于NAT创建的内外网IP映射规则信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **EIP** (list) - 获取EIP对应的SnatDnatRule信息 + - **NATGWId** (list) - 获取NAT上添加的所有SnatDnatRule信息 + + **Response** + + - **DataSet** (list) - 见 **SnatDnatRuleInfo** 模型定义 + + **Response Model** + + **SnatDnatRuleInfo** + - **EIP** (str) - EIP的IP地址 + - **NATGWId** (str) - 映射所使用的NAT网关资源ID + - **PrivateIp** (str) - 内网IP地址 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeSnatDnatRuleRequestSchema().dumps(d) + + resp = self.invoke("DescribeSnatDnatRule", d, **kwargs) + return apis.DescribeSnatDnatRuleResponseSchema().loads(resp) + + def describe_snat_rule( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeSnatRule - 获取Nat网关的出口规则(SNAT规则) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **NATGWId** (str) - (Required) NAT网关的ID + - **Limit** (str) - 分页,默认为20 + - **Offset** (str) - 偏移,默认为0 + - **SnatIp** (str) - EIP的ip地址,例如106.75.xx.xx + - **SourceIp** (str) - 需要出外网的私网IP地址,例如10.9.7.xx + + **Response** + + - **DataSet** (list) - 见 **NATGWSnatRule** 模型定义 + - **TotalCount** (int) - 规则数量 + + **Response Model** + + **NATGWSnatRule** + - **Name** (str) - snat规则名称 + - **SnatIp** (str) - EIP地址,如106.76.xx.xx + - **SourceIp** (str) - 资源的内网IP地址 + - **SubnetworkId** (str) - SourceIp所属的子网id + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeSnatRuleRequestSchema().dumps(d) + + resp = self.invoke("DescribeSnatRule", d, **kwargs) + return apis.DescribeSnatRuleResponseSchema().loads(resp) + + def describe_subnet( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeSubnet - 获取子网信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - 列表长度,默认为20 + - **Offset** (int) - 偏移量,默认为0 + - **RouteTableId** (str) - 路由表Id + - **ShowAvailableIPs** (bool) - 是否返回子网的可用IP数,true为是,false为否,默认不返回 + - **SubnetId** (str) - 子网id,适用于一次查询一个子网信息 + - **SubnetIds** (list) - 子网id数组,适用于一次查询多个子网信息 + - **Tag** (str) - 业务组名称,默认为Default + - **VPCId** (str) - VPC资源id + + **Response** + + - **DataSet** (list) - 见 **SubnetInfo** 模型定义 + - **TotalCount** (int) - 子网总数量 + + **Response Model** + + **SubnetInfo** + - **AvailableIPs** (int) - 可用IP数量 + - **CreateTime** (int) - 创建时间 + - **Gateway** (str) - 子网网关 + - **HasNATGW** (bool) - 是否有natgw + - **IPv6Network** (str) - 子网关联的IPv6网段 + - **Netmask** (str) - 子网掩码 + - **Remark** (str) - 备注 + - **RouteTableId** (str) - 路由表Id + - **Subnet** (str) - 子网网段 + - **SubnetId** (str) - 子网Id + - **SubnetName** (str) - 子网名称 + - **SubnetType** (int) - 子网类型 + - **Tag** (str) - 业务组 + - **VPCId** (str) - VPCId + - **VPCName** (str) - VPC名称 + - **Zone** (str) - 可用区名称 + """ # build request @@ -409,156 +2148,848 @@ def describe_subnet( req and d.update(req) d = apis.DescribeSubnetRequestSchema().dumps(d) - resp = self.invoke("DescribeSubnet", d, **kwargs) - return apis.DescribeSubnetResponseSchema().loads(resp) + resp = self.invoke("DescribeSubnet", d, **kwargs) + return apis.DescribeSubnetResponseSchema().loads(resp) + + def describe_subnet_resource( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeSubnetResource - 展示子网资源 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SubnetId** (str) - (Required) 子网id + - **Limit** (int) - 单页返回数据长度,默认为20 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + - **ResourceType** (str) - 资源类型,默认为全部资源类型。枚举值为:UHOST,云主机;PHOST,物理云主机;ULB,负载均衡;UHADOOP_HOST,hadoop节点;UFORTRESS_HOST,堡垒机;UNATGW,NAT网关;UKAFKA,Kafka消息队列;UMEM,内存存储;DOCKER,容器集群;UDB,数据库;UDW,数据仓库;VIP,内网VIP. + + **Response** + + - **DataSet** (list) - 见 **SubnetResource** 模型定义 + - **TotalCount** (int) - 总数 + + **Response Model** + + **SubnetResource** + - **IP** (str) - 资源ip + - **Name** (str) - 名称 + - **ResourceId** (str) - 资源Id + - **ResourceType** (str) - 资源类型。对应的资源类型:UHOST,云主机;PHOST,物理云主机;ULB,负载均衡;UHADOOP_HOST,hadoop节点;UFORTRESS_HOST,堡垒机;UNATGW,NAT网关;UKAFKA,分布式消息系统;UMEM,内存存储;DOCKER,容器集群;UDB,数据库;UDW,数据仓库;VIP,内网VIP. + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeSubnetResourceRequestSchema().dumps(d) + + resp = self.invoke("DescribeSubnetResource", d, **kwargs) + return apis.DescribeSubnetResourceResponseSchema().loads(resp) + + def describe_vip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """DescribeVIP - 获取内网VIP详细信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **BusinessId** (str) - 业务组 + - **SubnetId** (str) - 子网id,不指定则获取VPCId下的所有vip + - **Tag** (str) - 业务组名称, 默认为 Default + - **VIPId** (str) - VIP ID + - **VPCId** (str) - vpc的id,指定SubnetId时必填 + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **DataSet** (list) - 内网VIP地址列表 + - **TotalCount** (int) - vip数量 + - **VIPSet** (list) - 见 **VIPDetailSet** 模型定义 + + **Response Model** + + **VIPDetailSet** + - **CreateTime** (int) - 创建时间 + - **Name** (str) - VIP名称 + - **RealIp** (str) - 真实主机ip + - **Remark** (str) - VIP备注 + - **SubnetId** (str) - 子网id + - **Tag** (str) - VIP所属业务组 + - **VIP** (str) - 虚拟ip + - **VIPId** (str) - 虚拟ip id + - **VPCId** (str) - VPC id + - **Zone** (str) - 地域 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeVIPRequestSchema().dumps(d) + + resp = self.invoke("DescribeVIP", d, **kwargs) + return apis.DescribeVIPResponseSchema().loads(resp) + + def describe_vpc(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """DescribeVPC - 获取VPC信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Limit** (int) - 数据分页值 + - **Offset** (int) - 数据偏移量,默认为0 + - **Tag** (str) - 业务组名称 + - **VPCIds** (list) - VPCId + + **Response** + + - **DataSet** (list) - 见 **VPCInfo** 模型定义 + - **TotalCount** (int) - + + **Response Model** + + **VPCInfo** + - **CreateTime** (int) - 创建时间 + - **IPv6Network** (str) - VPC关联的IPv6网段 + - **Name** (str) - VPC名称 + - **Network** (list) - VPC网段 + - **NetworkInfo** (list) - 见 **VPCNetworkInfo** 模型定义 + - **OperatorName** (str) - VPC关联的IPv6网段所属运营商 + - **SubnetCount** (int) - 子网数 + - **Tag** (str) - 业务组 + - **UpdateTime** (int) - 更新时间 + - **VPCId** (str) - VPC资源ID + - **VPCType** (str) - DefaultVPC 默认VPC,DefinedVPC,自定义VPC + + + **VPCNetworkInfo** + - **Network** (str) - vpc地址空间 + - **SubnetCount** (int) - 地址空间中子网数量 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeVPCRequestSchema().dumps(d) + + resp = self.invoke("DescribeVPC", d, **kwargs) + return apis.DescribeVPCResponseSchema().loads(resp) + + def describe_vpc_intercom( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeVPCIntercom - 获取VPC互通信息 + + **Request** + + - **ProjectId** (str) - (Config) 源VPC所在项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 源VPC所在地域。 参见 `地域和可用区列表 `_ + - **VPCId** (str) - (Required) VPC短ID + - **DstProjectId** (str) - 目的项目ID,默认为全部项目 + - **DstRegion** (str) - 目的VPC所在地域,默认为全部地域 + + **Response** + + - **DataSet** (list) - 见 **VPCIntercomInfo** 模型定义 + + **Response Model** + + **VPCIntercomInfo** + - **AccountId** (int) - 项目Id(数字) + - **DstRegion** (str) - 所属地域 + - **Name** (str) - VPC名字 + - **Network** (list) - VPC的地址空间 + - **ProjectId** (str) - 项目Id + - **Tag** (str) - 业务组(未分组显示为 Default) + - **VPCId** (str) - VPCId + - **VPCType** (int) - vpc类型(1表示托管VPC,0表示公有云VPC) + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeVPCIntercomRequestSchema().dumps(d) + + resp = self.invoke("DescribeVPCIntercom", d, **kwargs) + return apis.DescribeVPCIntercomResponseSchema().loads(resp) + + def describe_white_list_resource( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DescribeWhiteListResource - 展示NAT网关白名单资源列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目id + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **NATGWIds** (list) - (Required) NAT网关的Id + - **Limit** (int) - 数据分页值, 默认为20 + - **Offset** (int) - 数据偏移量, 默认为0 + + **Response** + + - **DataSet** (list) - 见 **NatGWWhitelistDataSet** 模型定义 + - **TotalCount** (int) - 上述DataSet总数量 + + **Response Model** + + **NatGWWhitelistDataSet** + - **IfOpen** (int) - 白名单开关标记 + - **NATGWId** (str) - NATGateWay Id + - **ObjectIPInfo** (list) - 见 **DescribeWhiteListResourceObjectIPInfo** 模型定义 + + + **DescribeWhiteListResourceObjectIPInfo** + - **GwType** (str) - natgw字符串 + - **PrivateIP** (str) - 白名单资源的内网IP + - **ResourceId** (str) - 白名单资源Id信息 + - **ResourceName** (str) - 白名单资源名称 + - **ResourceType** (str) - 白名单资源类型 + - **SubResourceId** (str) - 资源绑定的虚拟网卡的实例ID + - **SubResourceName** (str) - 资源绑定的虚拟网卡的实例名称 + - **SubResourceType** (str) - 资源绑定的虚拟网卡的类型 + - **VPCId** (str) - 白名单资源所属VPCId + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DescribeWhiteListResourceRequestSchema().dumps(d) + + resp = self.invoke("DescribeWhiteListResource", d, **kwargs) + return apis.DescribeWhiteListResourceResponseSchema().loads(resp) + + def detach_network_interface( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DetachNetworkInterface - 解绑云主机关联网卡 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InstanceId** (str) - (Required) 云主机ID + - **InterfaceId** (str) - (Required) 虚拟网卡ID + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DetachNetworkInterfaceRequestSchema().dumps(d) + + resp = self.invoke("DetachNetworkInterface", d, **kwargs) + return apis.DetachNetworkInterfaceResponseSchema().loads(resp) + + def disable_uni_eip_direct_mode( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DisableUniEipDirectMode - 关闭虚拟网卡EIP直通功能 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InterfaceId** (str) - (Required) 虚拟网卡ID + - **VPCId** (str) - (Required) VPC ID + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 返回信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DisableUniEipDirectModeRequestSchema().dumps(d) + + resp = self.invoke("DisableUniEipDirectMode", d, **kwargs) + return apis.DisableUniEipDirectModeResponseSchema().loads(resp) + + def disassociate_sec_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """DisassociateSecGroup - 解绑安全组和资源绑定关系 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Force** (bool) - 是否强制解绑。默认为 false。为 true 表示强制解绑,用于删除资源前的解绑,因为开启安全组特性的资源至少绑定一个安全组,正常情况下是不允许解绑所有安全组。 + - **ResourceId** (list) - 资源ID,不传表示解绑资源上所有安全组,安全组ID和资源ID至少传一个,且只能有一个批量。支持 string 数组格式。 + - **SecGroupId** (list) - 安全组ID,不传表示解绑安全组绑定的所以资源,安全组ID和资源ID至少传一个,且只能有一个批量。支持 string 数组格式。 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.DisassociateSecGroupRequestSchema().dumps(d) + + resp = self.invoke("DisassociateSecGroup", d, **kwargs) + return apis.DisassociateSecGroupResponseSchema().loads(resp) + + def enable_uni_eip_direct_mode( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """EnableUniEipDirectMode - 开启虚拟网卡EIP直通功能 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InterfaceId** (str) - (Required) 虚拟网卡ID + - **VPCId** (str) - (Required) VPC ID + - **Zone** (str) - 可用区。参见 `可用区列表 `_ + + **Response** + + - **Message** (str) - 返回信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.EnableUniEipDirectModeRequestSchema().dumps(d) + + resp = self.invoke("EnableUniEipDirectMode", d, **kwargs) + return apis.EnableUniEipDirectModeResponseSchema().loads(resp) + + def enable_white_list( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """EnableWhiteList - 修改NAT网关白名单开关 + + **Request** + + - **ProjectId** (str) - (Config) 项目Id。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **IfOpen** (int) - (Required) 白名单开关标记。0:关闭;1:开启。默认为0 + - **NATGWId** (str) - (Required) NAT网关Id + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.EnableWhiteListRequestSchema().dumps(d) + + resp = self.invoke("EnableWhiteList", d, **kwargs) + return apis.EnableWhiteListResponseSchema().loads(resp) + + def get_available_resource_for_policy( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetAvailableResourceForPolicy - 获取NAT网关可配置端口转发规则的资源信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目Id。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **NATGWId** (str) - (Required) NAT网关Id + - **Limit** (int) - 返回数据长度,默认为20 + - **Offset** (int) - 列表起始位置偏移量,默认为0 + + **Response** + + - **DataSet** (list) - 见 **GetAvailableResourceForPolicyDataSet** 模型定义 + + **Response Model** + + **GetAvailableResourceForPolicyDataSet** + - **PrivateIP** (str) - 资源对应的内网Ip + - **ResourceId** (str) - 资源的Id + - **ResourceType** (str) - 资源类型。"uhost":云主机; "upm",物理云主机; "hadoophost":hadoop节点; "fortresshost":堡垒机: "udockhost",容器 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetAvailableResourceForPolicyRequestSchema().dumps(d) + + resp = self.invoke("GetAvailableResourceForPolicy", d, **kwargs) + return apis.GetAvailableResourceForPolicyResponseSchema().loads(resp) + + def get_available_resource_for_snat_rule( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetAvailableResourceForSnatRule - 获取可用于添加snat规则(出口规则)的资源列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **NATGWId** (str) - (Required) NAT网关Id + - **Limit** (int) - 数据分页值, 默认为20 + - **Offset** (int) - 数据偏移量, 默认为0 + + **Response** + + - **Action** (str) - 操作名称 + - **DataSet** (list) - 见 **GetAvailableResourceForSnatRuleDataSet** 模型定义 + - **RetCode** (str) - 返回值 + - **TotalCount** (int) - 总数 + + **Response Model** + + **GetAvailableResourceForSnatRuleDataSet** + - **PrivateIP** (str) - 资源内网IP + - **ResourceId** (str) - 资源ID + - **ResourceName** (str) - 资源名称 + - **ResourceType** (str) - 资源类型 + - **SubnetworkId** (str) - 资源所属VPC的ID + - **VPCId** (str) - 资源所属子网的ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetAvailableResourceForSnatRuleRequestSchema().dumps(d) + + resp = self.invoke("GetAvailableResourceForSnatRule", d, **kwargs) + return apis.GetAvailableResourceForSnatRuleResponseSchema().loads(resp) + + def get_available_resource_for_white_list( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetAvailableResourceForWhiteList - 获取NAT网关可添加白名单的资源 + + **Request** + + - **ProjectId** (str) - (Config) 项目Id。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **NATGWId** (str) - (Required) NAT网关Id + - **Limit** (int) - 数据分页值, 默认为20 + - **Offset** (int) - 数据偏移量, 默认为0 + + **Response** + + - **DataSet** (list) - 见 **GetAvailableResourceForWhiteListDataSet** 模型定义 + - **TotalCount** (int) - 白名单资源列表的总的个数 + + **Response Model** + + **GetAvailableResourceForWhiteListDataSet** + - **PrivateIP** (str) - 资源的内网Ip + - **ResourceId** (str) - 资源类型Id + - **ResourceName** (str) - 资源名称 + - **ResourceType** (str) - 资源类型。"uhost":云主机; "upm",物理云主机; "hadoophost":hadoop节点; "fortresshost":堡垒机: "udockhost",容器 + - **SubResourceId** (str) - 资源绑定的虚拟网卡的实例ID + - **SubResourceName** (str) - 资源绑定的虚拟网卡的实例名称 + - **SubResourceType** (str) - 资源绑定的虚拟网卡的实例类型 + - **SubnetworkId** (str) - 资源所属子网Id + - **VPCId** (str) - 资源所属VPCId + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetAvailableResourceForWhiteListRequestSchema().dumps(d) + + resp = self.invoke("GetAvailableResourceForWhiteList", d, **kwargs) + return apis.GetAvailableResourceForWhiteListResponseSchema().loads(resp) + + def get_network_acl_target_resource( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """GetNetworkAclTargetResource - 获取ACL规则应用目标列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SubnetworkId** (list) - (Required) 子网ID。 + + **Response** + + - **TargetResourceList** (list) - 见 **TargetResourceInfo** 模型定义 + - **TotalCount** (int) - ACL规则应用目标资源总数 + + **Response Model** + + **TargetResourceInfo** + - **PrivateIp** (str) - 资源内网IP + - **ResourceId** (str) - 资源ID + - **ResourceName** (str) - 资源名称 + - **ResourceType** (int) - 资源类型 + - **SubResourceId** (str) - 资源绑定的虚拟网卡的ID + - **SubResourceName** (str) - 资源绑定的虚拟网卡的名称 + - **SubResourceType** (int) - 资源绑定虚拟网卡的类型 + - **SubnetworkId** (str) - 子网ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.GetNetworkAclTargetResourceRequestSchema().dumps(d) + + resp = self.invoke("GetNetworkAclTargetResource", d, **kwargs) + return apis.GetNetworkAclTargetResourceResponseSchema().loads(resp) + + def list_subnet_for_natgw( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ListSubnetForNATGW - 展示NAT网关可绑定的子网列表 + + **Request** + + - **ProjectId** (str) - (Config) 项目Id。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **VPCId** (str) - NAT网关所属VPC Id。默认值为Default VPC Id + + **Response** + + - **DataSet** (list) - 见 **NatgwSubnetDataSet** 模型定义 + + **Response Model** + + **NatgwSubnetDataSet** + - **HasNATGW** (bool) - 是否绑定NATGW + - **Netmask** (str) - 掩码 + - **Subnet** (str) - 子网网段 + - **SubnetId** (str) - 子网id + - **SubnetName** (str) - 子网名字 + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ListSubnetForNATGWRequestSchema().dumps(d) + + resp = self.invoke("ListSubnetForNATGW", d, **kwargs) + return apis.ListSubnetForNATGWResponseSchema().loads(resp) + + def modify_route_rule( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """ModifyRouteRule - 路由策略增、删、改 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **RouteRule** (list) - (Required) 格式: RouteRuleId | 目的网段 | 下一跳类型(支持INSTANCE、VIP) | 下一跳 |优先级(保留字段,填写0即可)| 备注 | 增、删、改标志(add/delete/update) 。"添加"示例: test_id | 10.8.0.0/16 | instance | uhost-xd8ja | 0 | Default Route Rule| add (添加的RouteRuleId填任意非空字符串) 。"删除"示例: routerule-xk3jxa | 10.8.0.0/16 | instance | uhost-xd8ja | 0 | Default Route Rule| delete (RouteRuleId来自DescribeRouteTable中) 。“修改”示例: routerule-xk3jxa | 10.8.0.0/16 | instance | uhost-cjksa2 | 0 | Default Route Rule| update (RouteRuleId来自DescribeRouteTable中) + - **RouteTableId** (str) - (Required) 通过DescribeRouteTable拿到 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.ModifyRouteRuleRequestSchema().dumps(d) + + resp = self.invoke("ModifyRouteRule", d, **kwargs) + return apis.ModifyRouteRuleResponseSchema().loads(resp) - def describe_subnet_resource( + def move_secondary_ip_mac( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeSubnetResource - 展示子网资源 + """MoveSecondaryIPMac - 把 Secondary IP 从旧 MAC 迁移到新 MAC + **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **SubnetId** (str) - (Required) 子网id - - **Limit** (int) - 单页返回数据长度,默认为20 - - **Offset** (int) - 列表起始位置偏移量,默认为0 - - **ResourceType** (str) - 资源类型,默认为全部资源类型。枚举值为:UHOST,云主机;PHOST,物理云主机;ULB,负载均衡;UHADOOP_HOST,hadoop节点;UFORTRESS_HOST,堡垒机;UNATGW,NAT网关;UKAFKA,Kafka消息队列;UMEM,内存存储;DOCKER,容器集群;UDB,数据库;UDW,数据仓库;VIP,内网VIP. + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **Ip** (str) - (Required) Secondary IP + - **NewMac** (str) - (Required) 新 Mac。Secondary IP 迁移的目的 Mac + - **OldMac** (str) - (Required) 旧 Mac。Secondary IP 当前所绑定的 Mac + - **SubnetId** (str) - (Required) 子网 ID。IP/OldMac/NewMac 三者必须在同一子网 **Response** - - **DataSet** (list) - 见 **SubnetResource** 模型定义 - - **TotalCount** (int) - 总数 - **Response Model** - **SubnetResource** + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.MoveSecondaryIPMacRequestSchema().dumps(d) + + resp = self.invoke("MoveSecondaryIPMac", d, **kwargs) + return apis.MoveSecondaryIPMacResponseSchema().loads(resp) + + def release_vip(self, req: typing.Optional[dict] = None, **kwargs) -> dict: + """ReleaseVIP - 释放VIP资源 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写 + - **Region** (str) - (Config) 地域 + - **VIPId** (str) - (Required) 内网VIP的id + - **Zone** (str) - 可用区 + + **Response** + - - **IP** (str) - 资源ip - - **IPv6Address** (str) - 资源的IPv6地址 - - **Name** (str) - 资源名称 - - **ResourceId** (str) - 资源Id - - **ResourceType** (str) - 资源类型。对应的资源类型:UHOST,云主机;PHOST,物理云主机;ULB,负载均衡;UHADOOP_HOST,hadoop节点;UFORTRESS_HOST,堡垒机;UNATGW,NAT网关;UKAFKA,Kafka消息队列;UMEM,内存存储;DOCKER,容器集群;UDB,数据库;UDW,数据仓库;VIP,内网VIP. - - **SubResourceId** (str) - 资源绑定的虚拟网卡的实例ID - - **SubResourceName** (str) - 资源绑定的虚拟网卡的实例名称 - - **SubResourceType** (str) - 资源绑定的虚拟网卡的类型 """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) - d = apis.DescribeSubnetResourceRequestSchema().dumps(d) + d = apis.ReleaseVIPRequestSchema().dumps(d) - resp = self.invoke("DescribeSubnetResource", d, **kwargs) - return apis.DescribeSubnetResourceResponseSchema().loads(resp) + resp = self.invoke("ReleaseVIP", d, **kwargs) + return apis.ReleaseVIPResponseSchema().loads(resp) - def describe_vpc(self, req: typing.Optional[dict] = None, **kwargs) -> dict: - """ DescribeVPC - 获取VPC信息 + def set_gw_default_export( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """SetGwDefaultExport - 设置NAT网关的默认出口 **Request** - - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **ProjectId** (str) - (Config) 项目Id。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **Limit** (int) - - - **Offset** (int) - - - **Tag** (str) - 业务组名称 - - **VPCIds** (list) - VPCId + - **NATGWId** (str) - (Required) NAT网关Id + - **ExportEipId** (str) - NAT网关绑定的EIP Id。ExportIp和ExportEipId必填一个 + - **ExportIp** (str) - NAT网关绑定的EIP。ExportIp和ExportEipId必填一个 **Response** - - **DataSet** (list) - 见 **VPCInfo** 模型定义 - **Response Model** + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.SetGwDefaultExportRequestSchema().dumps(d) - **VPCNetworkInfo** + resp = self.invoke("SetGwDefaultExport", d, **kwargs) + return apis.SetGwDefaultExportResponseSchema().loads(resp) - - **Network** (str) - vpc地址空间 - - **SubnetCount** (int) - 地址空间中子网数量 + def update_natgw_policy( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateNATGWPolicy - 更新NAT网关端口转发规则 - **VPCInfo** + **Request** + + - **ProjectId** (str) - (Config) 项目Id。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **DstIP** (str) - (Required) 目标IP。填写对应的目标IP地址 + - **DstPort** (str) - (Required) 目标端口。可填写固定端口,也可填写端口范围。支持的端口范围为1-65535 + - **NATGWId** (str) - (Required) NAT网关Id + - **PolicyId** (str) - (Required) 转发策略Id + - **Protocol** (str) - (Required) 协议类型。枚举值为:TCP 、 UDP + - **SrcEIPId** (str) - (Required) 源IP。填写对应的EIP Id + - **SrcPort** (str) - (Required) 源端口。可填写固定端口,也可填写端口范围。支持的端口范围为1-6553 + - **PolicyName** (str) - 转发策略名称。默认为空 + + **Response** - - **CreateTime** (int) - - - **IPv6Network** (str) - VPC关联的IPv6网段 - - **Name** (str) - - - **Network** (list) - - - **NetworkInfo** (list) - 见 **VPCNetworkInfo** 模型定义 - - **OperatorName** (str) - VPC关联的IPv6网段所属运营商 - - **SubnetCount** (int) - - - **Tag** (str) - - - **UpdateTime** (int) - - - **VPCId** (str) - VPCId """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) - d = apis.DescribeVPCRequestSchema().dumps(d) + d = apis.UpdateNATGWPolicyRequestSchema().dumps(d) - resp = self.invoke("DescribeVPC", d, **kwargs) - return apis.DescribeVPCResponseSchema().loads(resp) + resp = self.invoke("UpdateNATGWPolicy", d, **kwargs) + return apis.UpdateNATGWPolicyResponseSchema().loads(resp) - def describe_vpc_intercom( + def update_natgw_subnet( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ DescribeVPCIntercom - 获取VPC互通信息 + """UpdateNATGWSubnet - 更新NAT网关绑定的子网 **Request** - - **ProjectId** (str) - (Config) 源VPC所在项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - - **Region** (str) - (Config) 源VPC所在地域。 参见 `地域和可用区列表 `_ - - **VPCId** (str) - (Required) VPC短ID - - **DstProjectId** (str) - 目的项目ID,默认为全部项目 - - **DstRegion** (str) - 目的VPC所在地域,默认为全部地域 + - **ProjectId** (str) - (Config) 项目Id。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **NATGWId** (str) - (Required) NAT网关Id + - **SubnetworkIds** (list) - NAT网关绑定的子网Id **Response** - - **DataSet** (list) - 见 **VPCIntercomInfo** 模型定义 - **Response Model** + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateNATGWSubnetRequestSchema().dumps(d) - **VPCIntercomInfo** + resp = self.invoke("UpdateNATGWSubnet", d, **kwargs) + return apis.UpdateNATGWSubnetResponseSchema().loads(resp) + + def update_network_acl( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateNetworkAcl - 更改ACL + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **AclId** (str) - (Required) 需要更改的ACL ID + - **AclName** (str) - (Required) Acl的名称 + - **Description** (str) - (Required) 描述 + + **Response** - - **DstRegion** (str) - 所属地域 - - **Name** (str) - VPC名字 - - **Network** (list) - VPC的地址空间 - - **ProjectId** (str) - 项目Id - - **Tag** (str) - 业务组(未分组显示为 Default) - - **VPCId** (str) - VPCId """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) - d = apis.DescribeVPCIntercomRequestSchema().dumps(d) + d = apis.UpdateNetworkAclRequestSchema().dumps(d) - resp = self.invoke("DescribeVPCIntercom", d, **kwargs) - return apis.DescribeVPCIntercomResponseSchema().loads(resp) + resp = self.invoke("UpdateNetworkAcl", d, **kwargs) + return apis.UpdateNetworkAclResponseSchema().loads(resp) - def modify_route_rule( + def update_network_acl_entry( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ ModifyRouteRule - 路由策略增、删、改 + """UpdateNetworkAclEntry - 更新ACL的规则 **Request** - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ - - **RouteRule** (list) - (Required) 格式: RouteRuleId | 目的网段 | 下一跳类型 | 下一跳 |优先级| 备注 | 增、删、改标志 (下一跳类型为instance或者vip,下一跳为云主机id或者vip的id,优先级使用0,动作标志为add/delete/update) 。"添加"示例: test_id | 10.8.0.0/16 | instance | uhost-xd8ja | 0 | Default Route Rule| add (添加的RouteRuleId填任意非空字符串) 。"删除"示例: routerule-xk3jxa | 10.8.0.0/16 | instance | uhost-xd8ja | 0 | Default Route Rule| delete (RouteRuleId来自DescribeRouteTable中) 。“修改”示例: routerule-xk3jxa | 10.8.0.0/16 | instance | uhost-cjksa2 | 0 | Default Route Rule| update (RouteRuleId来自DescribeRouteTable中) - - **RouteTableId** (str) - (Required) 通过DescribeRouteTable拿到 + - **AclId** (str) - (Required) ACL的ID + - **CidrBlock** (str) - (Required) IPv4段的CIDR表示 + - **Direction** (str) - (Required) 出向或者入向(“Ingress”, "Egress") + - **EntryAction** (str) - (Required) 规则的行为("Accept", "Reject") + - **EntryId** (str) - (Required) 需要更新的Entry Id + - **IpProtocol** (str) - (Required) 针对的协议规则 + - **PortRange** (str) - (Required) 针对的端口范围 + - **Priority** (int) - (Required) Entry的优先级,对于同样的Direction来说,不能重复 + - **Description** (str) - 描述 + - **TargetResourceIds** (list) - 应用目标资源列表。默认为全部资源生效。TargetType为0时不用填写该值 + - **TargetType** (int) - 应用目标类型。0代表“子网内全部资源”, 1代表“子网内指定资源”。默认为0 **Response** """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) - d = apis.ModifyRouteRuleRequestSchema().dumps(d) + d = apis.UpdateNetworkAclEntryRequestSchema().dumps(d) - resp = self.invoke("ModifyRouteRule", d, **kwargs) - return apis.ModifyRouteRuleResponseSchema().loads(resp) + resp = self.invoke("UpdateNetworkAclEntry", d, **kwargs) + return apis.UpdateNetworkAclEntryResponseSchema().loads(resp) + + def update_network_interface_default_output( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateNetworkInterfaceDefaultOutput - 更新虚拟网卡默认出口(仅用于开启EIP网卡可见模式的虚拟网卡) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **InterfaceId** (str) - (Required) 虚拟网卡Id + - **Zone** (str) - (Required) 可用区。参见 `可用区列表 `_ + - **Output** (str) - 出口IP + + **Response** + + - **Message** (str) - 返回信息 + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateNetworkInterfaceDefaultOutputRequestSchema().dumps(d) + + resp = self.invoke("UpdateNetworkInterfaceDefaultOutput", d, **kwargs) + return apis.UpdateNetworkInterfaceDefaultOutputResponseSchema().loads( + resp + ) def update_route_table_attribute( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ UpdateRouteTableAttribute - 更新路由表基本信息 + """UpdateRouteTableAttribute - 更新路由表基本信息 **Request** @@ -574,17 +3005,153 @@ def update_route_table_attribute( """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.UpdateRouteTableAttributeRequestSchema().dumps(d) resp = self.invoke("UpdateRouteTableAttribute", d, **kwargs) return apis.UpdateRouteTableAttributeResponseSchema().loads(resp) + def update_sec_group( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateSecGroup - 更新安全组基本信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SecGroupId** (str) - (Required) 安全组资源ID数组。不支持 .n 格式。Type 为 string 数组。 + - **Name** (str) - 安全组名称,默认为空,为空则不做修改。Name,Tag,Remark必须填写1个及以上 + - **Remark** (str) - 安全组备注,默认为空,为空则不做修改。Name,Tag,Remark必须填写1个及以上 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateSecGroupRequestSchema().dumps(d) + + resp = self.invoke("UpdateSecGroup", d, **kwargs) + return apis.UpdateSecGroupResponseSchema().loads(resp) + + def update_sec_group_association( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateSecGroupAssociation - 仅对操作的安全组ID生效,其他已有的绑定关系不受影响。 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **OldSecGroupId** (list) - (Required) 被替换的安全组ID。支持数组格式,即为 string 数组。 + - **ResourceId** (str) - (Required) 资源ID + - **NewPrioritySecGroup** (list) - 见 **UpdateSecGroupAssociationParamNewPrioritySecGroup** 模型定义 + + **Response** + + + **Request Model** + + **UpdateSecGroupAssociationParamNewPrioritySecGroup** + - **Priority** (int) - 新绑定安全组的绑定优先级。支持 NewPrioritySecGroup 为数组格式,即传对应数据的 JSON 格式数组。 + - **SecGroupId** (str) - 需新绑定的安全组ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateSecGroupAssociationRequestSchema().dumps(d) + + resp = self.invoke("UpdateSecGroupAssociation", d, **kwargs) + return apis.UpdateSecGroupAssociationResponseSchema().loads(resp) + + def update_sec_group_rule( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateSecGroupRule - + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **SecGroupId** (str) - (Required) 规则所属得安全组 ID。 + - **Rule** (list) - 见 **UpdateSecGroupRuleParamRule** 模型定义 + + **Response** + + + **Request Model** + + **UpdateSecGroupRuleParamRule** + - **Direction** (str) - "Ingress/Egress",入站规则/出站规则 + - **DstPort** (str) - 目的端口。逗号分隔,如 "80,443"、"443,2000-10000" + - **IPRange** (str) - IP 地址信息,逗号分隔。 + - **IPVersion** (str) - IP 版本,如 “IPv4”。支持 IPv6 后废弃 + - **Priority** (int) - 规则优先级。范围为 1~200 + - **ProtocolType** (str) - 协议类型。"TCP","UDP","ICMP","ICMPv6","ALL" + - **Remark** (str) - 规则备注 + - **RuleAction** (str) - 规则行为。"Accept" 或 "Drop" + - **RuleId** (str) - 规则 ID + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateSecGroupRuleRequestSchema().dumps(d) + + resp = self.invoke("UpdateSecGroupRule", d, **kwargs) + return apis.UpdateSecGroupRuleResponseSchema().loads(resp) + + def update_snat_rule( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateSnatRule - 更新指定的出口规则(SNAT规则) + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **NATGWId** (str) - (Required) NAT网关的ID, + - **SnatIp** (str) - (Required) EIP的ip地址,例如106.75.xx.xx + - **SourceIp** (str) - (Required) 需要出外网的私网IP地址,例如10.9.7.xx + - **Name** (str) - snat名称,即出口规则名称 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateSnatRuleRequestSchema().dumps(d) + + resp = self.invoke("UpdateSnatRule", d, **kwargs) + return apis.UpdateSnatRuleResponseSchema().loads(resp) + def update_subnet_attribute( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ UpdateSubnetAttribute - 更新子网信息 + """UpdateSubnetAttribute - 更新子网信息 **Request** @@ -599,17 +3166,49 @@ def update_subnet_attribute( """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.UpdateSubnetAttributeRequestSchema().dumps(d) resp = self.invoke("UpdateSubnetAttribute", d, **kwargs) return apis.UpdateSubnetAttributeResponseSchema().loads(resp) + def update_vip_attribute( + self, req: typing.Optional[dict] = None, **kwargs + ) -> dict: + """UpdateVIPAttribute - 更新VIP信息 + + **Request** + + - **ProjectId** (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 `GetProjectList接口 `_ + - **Region** (str) - (Config) 地域。 参见 `地域和可用区列表 `_ + - **VIPId** (str) - (Required) 内网VIP的资源Id + - **Name** (str) - 内网VIP的名称 + - **Remark** (str) - 内网VIP的备注 + - **Tag** (str) - 内网VIP所属的业务组 + + **Response** + + + """ + # build request + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } + req and d.update(req) + d = apis.UpdateVIPAttributeRequestSchema().dumps(d) + + resp = self.invoke("UpdateVIPAttribute", d, **kwargs) + return apis.UpdateVIPAttributeResponseSchema().loads(resp) + def update_vpc_network( self, req: typing.Optional[dict] = None, **kwargs ) -> dict: - """ UpdateVPCNetwork - 更新VPC网段 + """UpdateVPCNetwork - 更新VPC网段 **Request** @@ -620,11 +3219,13 @@ def update_vpc_network( **Response** - - **Message** (str) - 错误信息 """ # build request - d = {"ProjectId": self.config.project_id, "Region": self.config.region} + d = { + "ProjectId": self.config.project_id, + "Region": self.config.region, + } req and d.update(req) d = apis.UpdateVPCNetworkRequestSchema().dumps(d) diff --git a/ucloud/services/vpc/schemas/apis.py b/ucloud/services/vpc/schemas/apis.py index 1e904963..c0e44687 100644 --- a/ucloud/services/vpc/schemas/apis.py +++ b/ucloud/services/vpc/schemas/apis.py @@ -3,582 +3,2527 @@ from ucloud.core.typesystem import schema, fields from ucloud.services.vpc.schemas import models - """ VPC API Schema """ """ -API: AddVPCNetwork +API: AddSnatRule -添加VPC网段 +对于绑定了多个EIP的NAT网关,您可以将一个子网下的某台云主机映射到某个特定的EIP上,规则生效后,则该云主机通过该特定的EIP访问互联网。 """ -class AddVPCNetworkRequestSchema(schema.RequestSchema): - """ AddVPCNetwork - 添加VPC网段 - """ +class AddSnatRuleRequestSchema(schema.RequestSchema): + """AddSnatRule - 对于绑定了多个EIP的NAT网关,您可以将一个子网下的某台云主机映射到某个特定的EIP上,规则生效后,则该云主机通过该特定的EIP访问互联网。""" fields = { - "Network": fields.List(fields.Str()), + "NATGWId": fields.Str(required=True, dump_to="NATGWId"), + "Name": fields.Str(required=False, dump_to="Name"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "VPCId": fields.Str(required=True, dump_to="VPCId"), + "SnatIp": fields.Str(required=True, dump_to="SnatIp"), + "SourceIp": fields.Str(required=True, dump_to="SourceIp"), } -class AddVPCNetworkResponseSchema(schema.ResponseSchema): - """ AddVPCNetwork - 添加VPC网段 - """ +class AddSnatRuleResponseSchema(schema.ResponseSchema): + """AddSnatRule - 对于绑定了多个EIP的NAT网关,您可以将一个子网下的某台云主机映射到某个特定的EIP上,规则生效后,则该云主机通过该特定的EIP访问互联网。""" fields = {} """ -API: AssociateRouteTable +API: AddVPCNetwork -绑定子网的路由表 +添加VPC网段 """ -class AssociateRouteTableRequestSchema(schema.RequestSchema): - """ AssociateRouteTable - 绑定子网的路由表 - """ +class AddVPCNetworkRequestSchema(schema.RequestSchema): + """AddVPCNetwork - 添加VPC网段""" fields = { - "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Network": fields.List(fields.Str()), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "RouteTableId": fields.Str(required=True, dump_to="RouteTableId"), - "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), } -class AssociateRouteTableResponseSchema(schema.ResponseSchema): - """ AssociateRouteTable - 绑定子网的路由表 - """ +class AddVPCNetworkResponseSchema(schema.ResponseSchema): + """AddVPCNetwork - 添加VPC网段""" fields = {} """ -API: CloneRouteTable +API: AddWhiteListResource -根据一张现有路由表复制一张新的路由表 +添加NAT网关白名单 """ -class CloneRouteTableRequestSchema(schema.RequestSchema): - """ CloneRouteTable - 根据一张现有路由表复制一张新的路由表 - """ +class AddWhiteListResourceRequestSchema(schema.RequestSchema): + """AddWhiteListResource - 添加NAT网关白名单""" fields = { - "ProjectId": fields.Str(required=True, dump_to="ProjectId"), - "Region": fields.Str(required=False, dump_to="Region"), - "RouteTableId": fields.Str(required=True, dump_to="RouteTableId"), + "NATGWId": fields.Str(required=True, dump_to="NATGWId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ResourceIds": fields.List(fields.Str()), } -class CloneRouteTableResponseSchema(schema.ResponseSchema): - """ CloneRouteTable - 根据一张现有路由表复制一张新的路由表 - """ +class AddWhiteListResourceResponseSchema(schema.ResponseSchema): + """AddWhiteListResource - 添加NAT网关白名单""" fields = {} """ -API: CreateRouteTable +API: AllocateBatchSecondaryIp -创建路由表 +批量申请虚拟网卡辅助IP """ -class CreateRouteTableRequestSchema(schema.RequestSchema): - """ CreateRouteTable - 创建路由表 - """ +class AllocateBatchSecondaryIpRequestSchema(schema.RequestSchema): + """AllocateBatchSecondaryIp - 批量申请虚拟网卡辅助IP""" fields = { - "Name": fields.Str(required=False, dump_to="Name"), + "Count": fields.Int(required=False, dump_to="Count"), + "Ip": fields.List(fields.Str()), + "Mac": fields.Str(required=True, dump_to="Mac"), + "ObjectId": fields.Str(required=True, dump_to="ObjectId"), "ProjectId": fields.Str(required=True, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "Remark": fields.Str(required=False, dump_to="Remark"), - "Tag": fields.Str(required=False, dump_to="Tag"), - "VPCId": fields.Str(required=True, dump_to="VPCId"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + "Zone": fields.Str(required=True, dump_to="Zone"), } -class CreateRouteTableResponseSchema(schema.ResponseSchema): - """ CreateRouteTable - 创建路由表 - """ +class AllocateBatchSecondaryIpResponseSchema(schema.ResponseSchema): + """AllocateBatchSecondaryIp - 批量申请虚拟网卡辅助IP""" fields = { - "RouteTableId": fields.Str(required=False, load_from="RouteTableId") + "IpsInfo": fields.List( + models.IpsInfoSchema(), required=True, load_from="IpsInfo" + ), } """ -API: CreateSubnet +API: AllocateSecondaryIp -创建子网 +分配ip(用于uk8s使用) """ -class CreateSubnetRequestSchema(schema.RequestSchema): - """ CreateSubnet - 创建子网 - """ +class AllocateSecondaryIpRequestSchema(schema.RequestSchema): + """AllocateSecondaryIp - 分配ip(用于uk8s使用)""" fields = { - "Netmask": fields.Int(required=False, dump_to="Netmask"), - "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Ip": fields.Str(required=False, dump_to="Ip"), + "Mac": fields.Str(required=True, dump_to="Mac"), + "ObjectId": fields.Str(required=True, dump_to="ObjectId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "Remark": fields.Str(required=False, dump_to="Remark"), - "Subnet": fields.Str(required=True, dump_to="Subnet"), - "SubnetName": fields.Str(required=False, dump_to="SubnetName"), - "Tag": fields.Str(required=False, dump_to="Tag"), - "VPCId": fields.Str(required=True, dump_to="VPCId"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + "Zone": fields.Str(required=True, dump_to="Zone"), } -class CreateSubnetResponseSchema(schema.ResponseSchema): - """ CreateSubnet - 创建子网 - """ +class AllocateSecondaryIpResponseSchema(schema.ResponseSchema): + """AllocateSecondaryIp - 分配ip(用于uk8s使用)""" - fields = {"SubnetId": fields.Str(required=False, load_from="SubnetId")} + fields = { + "IpInfo": models.IpInfoSchema(), + } """ -API: CreateVPC +API: AllocateVIP -创建VPC +根据提供信息,申请内网VIP(Virtual IP),多用于高可用程序作为漂移IP。 """ -class CreateVPCRequestSchema(schema.RequestSchema): - """ CreateVPC - 创建VPC - """ +class AllocateVIPRequestSchema(schema.RequestSchema): + """AllocateVIP - 根据提供信息,申请内网VIP(Virtual IP),多用于高可用程序作为漂移IP。""" fields = { - "Name": fields.Str(required=True, dump_to="Name"), - "Network": fields.List(fields.Str()), - "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "BusinessId": fields.Str(required=False, dump_to="BusinessId"), + "Count": fields.Int(required=False, dump_to="Count"), + "Ip": fields.Str(required=False, dump_to="Ip"), + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "Remark": fields.Str(required=False, dump_to="Remark"), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), "Tag": fields.Str(required=False, dump_to="Tag"), - "Type": fields.Int(required=False, dump_to="Type"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + "Zone": fields.Str(required=False, dump_to="Zone"), } -class CreateVPCResponseSchema(schema.ResponseSchema): - """ CreateVPC - 创建VPC - """ +class AllocateVIPResponseSchema(schema.ResponseSchema): + """AllocateVIP - 根据提供信息,申请内网VIP(Virtual IP),多用于高可用程序作为漂移IP。""" - fields = {"VPCId": fields.Str(required=False, load_from="VPCId")} + fields = { + "DataSet": fields.List( + fields.Str(), required=False, load_from="DataSet" + ), + "VIPSet": fields.List( + models.VIPSetSchema(), required=False, load_from="VIPSet" + ), + } """ -API: CreateVPCIntercom +API: AssociateRouteTable -新建VPC互通关系 +绑定子网的路由表 """ -class CreateVPCIntercomRequestSchema(schema.RequestSchema): - """ CreateVPCIntercom - 新建VPC互通关系 - """ +class AssociateRouteTableRequestSchema(schema.RequestSchema): + """AssociateRouteTable - 绑定子网的路由表""" fields = { - "DstProjectId": fields.Str(required=False, dump_to="DstProjectId"), - "DstRegion": fields.Str(required=False, dump_to="DstRegion"), - "DstVPCId": fields.Str(required=True, dump_to="DstVPCId"), - "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "VPCId": fields.Str(required=True, dump_to="VPCId"), + "RouteTableId": fields.Str(required=True, dump_to="RouteTableId"), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), } -class CreateVPCIntercomResponseSchema(schema.ResponseSchema): - """ CreateVPCIntercom - 新建VPC互通关系 - """ +class AssociateRouteTableResponseSchema(schema.ResponseSchema): + """AssociateRouteTable - 绑定子网的路由表""" fields = {} """ -API: DeleteRouteTable +API: AssociateSecGroup -删除自定义路由表 +绑定资源到安全组 """ -class DeleteRouteTableRequestSchema(schema.RequestSchema): - """ DeleteRouteTable - 删除自定义路由表 - """ +class AssociateSecGroupParamPrioritySecGroupSchema(schema.RequestSchema): + """AssociateSecGroupParamPrioritySecGroup -""" fields = { - "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Priority": fields.Int(required=True, dump_to="Priority"), + "SecGroupId": fields.Str(required=True, dump_to="SecGroupId"), + } + + +class AssociateSecGroupRequestSchema(schema.RequestSchema): + """AssociateSecGroup - 绑定资源到安全组""" + + fields = { + "PrioritySecGroup": fields.List( + AssociateSecGroupParamPrioritySecGroupSchema() + ), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "RouteTableId": fields.Str(required=True, dump_to="RouteTableId"), + "ResourceId": fields.List(fields.Str()), } -class DeleteRouteTableResponseSchema(schema.ResponseSchema): - """ DeleteRouteTable - 删除自定义路由表 - """ +class AssociateSecGroupResponseSchema(schema.ResponseSchema): + """AssociateSecGroup - 绑定资源到安全组""" fields = {} """ -API: DeleteSubnet +API: AssociateSecGroupDynamic -删除子网 +绑定安全组,动态调整绑定优先级 """ -class DeleteSubnetRequestSchema(schema.RequestSchema): - """ DeleteSubnet - 删除子网 - """ +class AssociateSecGroupDynamicRequestSchema(schema.RequestSchema): + """AssociateSecGroupDynamic - 绑定安全组,动态调整绑定优先级""" fields = { "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + "ResourceId": fields.List(fields.Str()), + "SecGroupId": fields.Str(required=True, dump_to="SecGroupId"), } -class DeleteSubnetResponseSchema(schema.ResponseSchema): - """ DeleteSubnet - 删除子网 - """ +class AssociateSecGroupDynamicResponseSchema(schema.ResponseSchema): + """AssociateSecGroupDynamic - 绑定安全组,动态调整绑定优先级""" fields = {} """ -API: DeleteVPC +API: AttachNetworkInterface -删除VPC +绑定网卡到云主机 """ -class DeleteVPCRequestSchema(schema.RequestSchema): - """ DeleteVPC - 删除VPC - """ +class AttachNetworkInterfaceRequestSchema(schema.RequestSchema): + """AttachNetworkInterface - 绑定网卡到云主机""" fields = { - "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "InterfaceId": fields.Str(required=True, dump_to="InterfaceId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "VPCId": fields.Str(required=True, dump_to="VPCId"), } -class DeleteVPCResponseSchema(schema.ResponseSchema): - """ DeleteVPC - 删除VPC - """ +class AttachNetworkInterfaceResponseSchema(schema.ResponseSchema): + """AttachNetworkInterface - 绑定网卡到云主机""" fields = {} """ -API: DeleteVPCIntercom +API: CloneRouteTable -删除VPC互通关系 +将现有的路由表复制为一张新的路由表 """ -class DeleteVPCIntercomRequestSchema(schema.RequestSchema): - """ DeleteVPCIntercom - 删除VPC互通关系 - """ +class CloneRouteTableRequestSchema(schema.RequestSchema): + """CloneRouteTable - 将现有的路由表复制为一张新的路由表""" fields = { - "DstProjectId": fields.Str(required=False, dump_to="DstProjectId"), - "DstRegion": fields.Str(required=False, dump_to="DstRegion"), - "DstVPCId": fields.Str(required=True, dump_to="DstVPCId"), - "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "VPCId": fields.Str(required=True, dump_to="VPCId"), + "RouteTableId": fields.Str(required=True, dump_to="RouteTableId"), } -class DeleteVPCIntercomResponseSchema(schema.ResponseSchema): - """ DeleteVPCIntercom - 删除VPC互通关系 - """ +class CloneRouteTableResponseSchema(schema.ResponseSchema): + """CloneRouteTable - 将现有的路由表复制为一张新的路由表""" - fields = {} + fields = { + "RouteTableId": fields.Str(required=False, load_from="RouteTableId"), + } """ -API: DescribeRouteTable +API: CreateNATGW -获取路由表详细信息(包括路由策略) +创建NAT网关 """ -class DescribeRouteTableRequestSchema(schema.RequestSchema): - """ DescribeRouteTable - 获取路由表详细信息(包括路由策略) - """ +class CreateNATGWRequestSchema(schema.RequestSchema): + """CreateNATGW - 创建NAT网关""" fields = { - "BusinessId": fields.Str(required=False, dump_to="BusinessId"), - "Limit": fields.Int(required=False, dump_to="Limit"), - "OffSet": fields.Int(required=False, dump_to="OffSet"), + "EIPIds": fields.List(fields.Str()), + "FirewallId": fields.Str(required=True, dump_to="FirewallId"), + "IfOpen": fields.Int(required=False, dump_to="IfOpen"), + "NATGWName": fields.Str(required=True, dump_to="NATGWName"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "RouteTableId": fields.Str(required=False, dump_to="RouteTableId"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "SubnetworkIds": fields.List(fields.Str()), + "Tag": fields.Str(required=False, dump_to="Tag"), "VPCId": fields.Str(required=False, dump_to="VPCId"), } -class DescribeRouteTableResponseSchema(schema.ResponseSchema): - """ DescribeRouteTable - 获取路由表详细信息(包括路由策略) - """ +class CreateNATGWResponseSchema(schema.ResponseSchema): + """CreateNATGW - 创建NAT网关""" fields = { - "RouteTables": fields.List( - models.RouteTableInfoSchema(), - required=False, - load_from="RouteTables", - ), - "TotalCount": fields.Int(required=False, load_from="TotalCount"), + "NATGWId": fields.Str(required=False, load_from="NATGWId"), } """ -API: DescribeSubnet +API: CreateNATGWPolicy -获取子网信息 +添加NAT网关端口转发规则 """ -class DescribeSubnetRequestSchema(schema.RequestSchema): - """ DescribeSubnet - 获取子网信息 - """ +class CreateNATGWPolicyRequestSchema(schema.RequestSchema): + """CreateNATGWPolicy - 添加NAT网关端口转发规则""" fields = { - "BusinessId": fields.Str(required=False, dump_to="BusinessId"), - "Limit": fields.Int(required=False, dump_to="Limit"), - "Offset": fields.Int(required=False, dump_to="Offset"), + "DstIP": fields.Str(required=True, dump_to="DstIP"), + "DstPort": fields.Str(required=True, dump_to="DstPort"), + "NATGWId": fields.Str(required=True, dump_to="NATGWId"), + "PolicyName": fields.Str(required=False, dump_to="PolicyName"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Protocol": fields.Str(required=True, dump_to="Protocol"), "Region": fields.Str(required=True, dump_to="Region"), - "RouteTableId": fields.Str(required=False, dump_to="RouteTableId"), - "ShowAvailableIPs": fields.Bool( - required=False, dump_to="ShowAvailableIPs" - ), - "SubnetId": fields.Str(required=False, dump_to="SubnetId"), - "SubnetIds": fields.List(fields.Str()), - "Tag": fields.Str(required=False, dump_to="Tag"), - "VPCId": fields.Str(required=False, dump_to="VPCId"), + "SrcEIPId": fields.Str(required=True, dump_to="SrcEIPId"), + "SrcPort": fields.Str(required=True, dump_to="SrcPort"), } -class DescribeSubnetResponseSchema(schema.ResponseSchema): - """ DescribeSubnet - 获取子网信息 - """ +class CreateNATGWPolicyResponseSchema(schema.ResponseSchema): + """CreateNATGWPolicy - 添加NAT网关端口转发规则""" fields = { - "DataSet": fields.List( - models.SubnetInfoSchema(), required=True, load_from="DataSet" - ), - "TotalCount": fields.Int(required=True, load_from="TotalCount"), + "PolicyId": fields.Str(required=True, load_from="PolicyId"), } """ -API: DescribeSubnetResource +API: CreateNetworkAcl -展示子网资源 +创建网络ACL """ -class DescribeSubnetResourceRequestSchema(schema.RequestSchema): - """ DescribeSubnetResource - 展示子网资源 - """ +class CreateNetworkAclRequestSchema(schema.RequestSchema): + """CreateNetworkAcl - 创建网络ACL""" fields = { - "Limit": fields.Int(required=False, dump_to="Limit"), - "Offset": fields.Int(required=False, dump_to="Offset"), + "AclName": fields.Str(required=True, dump_to="AclName"), + "Description": fields.Str(required=False, dump_to="Description"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "ResourceType": fields.Str(required=False, dump_to="ResourceType"), - "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + "VpcId": fields.Str(required=True, dump_to="VpcId"), } -class DescribeSubnetResourceResponseSchema(schema.ResponseSchema): - """ DescribeSubnetResource - 展示子网资源 - """ +class CreateNetworkAclResponseSchema(schema.ResponseSchema): + """CreateNetworkAcl - 创建网络ACL""" fields = { - "DataSet": fields.List( - models.SubnetResourceSchema(), required=False, load_from="DataSet" - ), - "TotalCount": fields.Int(required=False, load_from="TotalCount"), + "AclId": fields.Str(required=True, load_from="AclId"), } """ -API: DescribeVPC +API: CreateNetworkAclAssociation -获取VPC信息 +创建ACL的绑定关系 """ -class DescribeVPCRequestSchema(schema.RequestSchema): - """ DescribeVPC - 获取VPC信息 - """ +class CreateNetworkAclAssociationRequestSchema(schema.RequestSchema): + """CreateNetworkAclAssociation - 创建ACL的绑定关系""" fields = { - "Limit": fields.Int(required=False, dump_to="Limit"), - "Offset": fields.Int(required=False, dump_to="Offset"), - "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "AclId": fields.Str(required=True, dump_to="AclId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "Tag": fields.Str(required=False, dump_to="Tag"), - "VPCIds": fields.List(fields.Str()), + "SubnetworkId": fields.Str(required=True, dump_to="SubnetworkId"), } -class DescribeVPCResponseSchema(schema.ResponseSchema): - """ DescribeVPC - 获取VPC信息 - """ +class CreateNetworkAclAssociationResponseSchema(schema.ResponseSchema): + """CreateNetworkAclAssociation - 创建ACL的绑定关系""" fields = { - "DataSet": fields.List( - models.VPCInfoSchema(), required=False, load_from="DataSet" - ) + "AssociationId": fields.Str(required=True, load_from="AssociationId"), + "PrevAssociation": models.AssociationInfoSchema(), } """ -API: DescribeVPCIntercom +API: CreateNetworkAclEntry -获取VPC互通信息 +创建ACL的规则 """ -class DescribeVPCIntercomRequestSchema(schema.RequestSchema): - """ DescribeVPCIntercom - 获取VPC互通信息 - """ +class CreateNetworkAclEntryRequestSchema(schema.RequestSchema): + """CreateNetworkAclEntry - 创建ACL的规则""" fields = { - "DstProjectId": fields.Str(required=False, dump_to="DstProjectId"), - "DstRegion": fields.Str(required=False, dump_to="DstRegion"), + "AclId": fields.Str(required=True, dump_to="AclId"), + "CidrBlock": fields.Str(required=True, dump_to="CidrBlock"), + "Description": fields.Str(required=False, dump_to="Description"), + "Direction": fields.Str(required=True, dump_to="Direction"), + "EntryAction": fields.Str(required=True, dump_to="EntryAction"), + "IpProtocol": fields.Str(required=True, dump_to="IpProtocol"), + "PortRange": fields.Str(required=True, dump_to="PortRange"), + "Priority": fields.Int(required=True, dump_to="Priority"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "VPCId": fields.Str(required=True, dump_to="VPCId"), + "TargetResourceIds": fields.List(fields.Str()), + "TargetType": fields.Int(required=False, dump_to="TargetType"), } -class DescribeVPCIntercomResponseSchema(schema.ResponseSchema): - """ DescribeVPCIntercom - 获取VPC互通信息 - """ +class CreateNetworkAclEntryResponseSchema(schema.ResponseSchema): + """CreateNetworkAclEntry - 创建ACL的规则""" fields = { - "DataSet": fields.List( - models.VPCIntercomInfoSchema(), required=False, load_from="DataSet" - ) + "EntryId": fields.Str(required=True, load_from="EntryId"), } """ -API: ModifyRouteRule +API: CreateNetworkInterface -路由策略增、删、改 +创建虚拟网卡 """ -class ModifyRouteRuleRequestSchema(schema.RequestSchema): - """ ModifyRouteRule - 路由策略增、删、改 - """ +class CreateNetworkInterfaceParamPrioritySecGroupSchema(schema.RequestSchema): + """CreateNetworkInterfaceParamPrioritySecGroup -""" + + fields = { + "Priority": fields.Int(required=False, dump_to="Priority"), + "SecGroupId": fields.Str(required=False, dump_to="SecGroupId"), + } + + +class CreateNetworkInterfaceRequestSchema(schema.RequestSchema): + """CreateNetworkInterface - 创建虚拟网卡""" fields = { + "EipDirectMode": fields.Bool(required=False, dump_to="EipDirectMode"), + "Name": fields.Str(required=False, dump_to="Name"), + "PrioritySecGroup": fields.List( + CreateNetworkInterfaceParamPrioritySecGroupSchema() + ), + "PrivateIp": fields.List(fields.Str()), "ProjectId": fields.Str(required=True, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "RouteRule": fields.List(fields.Str()), - "RouteTableId": fields.Str(required=True, dump_to="RouteTableId"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "SecurityGroupId": fields.Str( + required=False, dump_to="SecurityGroupId" + ), + "SecurityMode": fields.Int(required=False, dump_to="SecurityMode"), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), } -class ModifyRouteRuleResponseSchema(schema.ResponseSchema): - """ ModifyRouteRule - 路由策略增、删、改 - """ +class CreateNetworkInterfaceResponseSchema(schema.ResponseSchema): + """CreateNetworkInterface - 创建虚拟网卡""" - fields = {} + fields = { + "NetworkInterface": models.NetworkInterfaceInfoSchema(), + } """ -API: UpdateRouteTableAttribute +API: CreateRouteTable -更新路由表基本信息 +创建路由表 """ -class UpdateRouteTableAttributeRequestSchema(schema.RequestSchema): - """ UpdateRouteTableAttribute - 更新路由表基本信息 - """ +class CreateRouteTableRequestSchema(schema.RequestSchema): + """CreateRouteTable - 创建路由表""" fields = { "Name": fields.Str(required=False, dump_to="Name"), "ProjectId": fields.Str(required=True, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), "Remark": fields.Str(required=False, dump_to="Remark"), - "RouteTableId": fields.Str(required=True, dump_to="RouteTableId"), "Tag": fields.Str(required=False, dump_to="Tag"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), } -class UpdateRouteTableAttributeResponseSchema(schema.ResponseSchema): - """ UpdateRouteTableAttribute - 更新路由表基本信息 - """ +class CreateRouteTableResponseSchema(schema.ResponseSchema): + """CreateRouteTable - 创建路由表""" - fields = {} + fields = { + "RouteTableId": fields.Str(required=False, load_from="RouteTableId"), + } """ -API: UpdateSubnetAttribute +API: CreateSecGroup -更新子网信息 +创建安全组 """ -class UpdateSubnetAttributeRequestSchema(schema.RequestSchema): - """ UpdateSubnetAttribute - 更新子网信息 - """ +class CreateSecGroupRequestSchema(schema.RequestSchema): + """CreateSecGroup - 创建安全组""" fields = { - "Name": fields.Str(required=False, dump_to="Name"), + "Name": fields.Str(required=True, dump_to="Name"), "ProjectId": fields.Str(required=False, dump_to="ProjectId"), "Region": fields.Str(required=True, dump_to="Region"), - "SubnetId": fields.Str(required=True, dump_to="SubnetId"), - "Tag": fields.Str(required=False, dump_to="Tag"), + "VPCID": fields.Str(required=True, dump_to="VPCID"), } -class UpdateSubnetAttributeResponseSchema(schema.ResponseSchema): - """ UpdateSubnetAttribute - 更新子网信息 - """ +class CreateSecGroupResponseSchema(schema.ResponseSchema): + """CreateSecGroup - 创建安全组""" - fields = {} + fields = { + "SecGroupId": fields.Str(required=True, load_from="SecGroupId"), + } """ -API: UpdateVPCNetwork +API: CreateSecGroupRule + -更新VPC网段 """ -class UpdateVPCNetworkRequestSchema(schema.RequestSchema): - """ UpdateVPCNetwork - 更新VPC网段 - """ +class CreateSecGroupRuleParamRuleSchema(schema.RequestSchema): + """CreateSecGroupRuleParamRule -""" fields = { - "Network": fields.List(fields.Str()), - "ProjectId": fields.Str(required=True, dump_to="ProjectId"), - "Region": fields.Str(required=True, dump_to="Region"), - "VPCId": fields.Str(required=True, dump_to="VPCId"), + "Direction": fields.Str(required=True, dump_to="Direction"), + "DstPort": fields.Str(required=True, dump_to="DstPort"), + "IPRange": fields.Str(required=True, dump_to="IPRange"), + "IPVersion": fields.Str(required=False, dump_to="IPVersion"), + "Priority": fields.Int(required=True, dump_to="Priority"), + "ProtocolType": fields.Str(required=True, dump_to="ProtocolType"), + "Remark": fields.Str(required=True, dump_to="Remark"), + "RuleAction": fields.Str(required=True, dump_to="RuleAction"), } -class UpdateVPCNetworkResponseSchema(schema.ResponseSchema): - """ UpdateVPCNetwork - 更新VPC网段 - """ +class CreateSecGroupRuleRequestSchema(schema.RequestSchema): + """CreateSecGroupRule -""" - fields = {"Message": fields.Str(required=True, load_from="Message")} + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Rule": fields.List(CreateSecGroupRuleParamRuleSchema()), + "SecGroupId": fields.Str(required=True, dump_to="SecGroupId"), + } + + +class CreateSecGroupRuleResponseSchema(schema.ResponseSchema): + """CreateSecGroupRule -""" + + fields = { + "RuleId": fields.List(fields.Str(), required=True, load_from="RuleId"), + } + + +""" +API: CreateSnatDnatRule + +调用接口后会自动创建内外网IP之间的SNAT和DNAT规则,支持TCP、UDP协议全端口 +""" + + +class CreateSnatDnatRuleRequestSchema(schema.RequestSchema): + """CreateSnatDnatRule - 调用接口后会自动创建内外网IP之间的SNAT和DNAT规则,支持TCP、UDP协议全端口""" + + fields = { + "EIP": fields.List(fields.Str()), + "NATGWId": fields.Str(required=True, dump_to="NATGWId"), + "PrivateIp": fields.List(fields.Str()), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class CreateSnatDnatRuleResponseSchema(schema.ResponseSchema): + """CreateSnatDnatRule - 调用接口后会自动创建内外网IP之间的SNAT和DNAT规则,支持TCP、UDP协议全端口""" + + fields = {} + + +""" +API: CreateSubnet + +创建子网 +""" + + +class CreateSubnetRequestSchema(schema.RequestSchema): + """CreateSubnet - 创建子网""" + + fields = { + "Netmask": fields.Int(required=False, dump_to="Netmask"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "Subnet": fields.Str(required=True, dump_to="Subnet"), + "SubnetName": fields.Str(required=False, dump_to="SubnetName"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + } + + +class CreateSubnetResponseSchema(schema.ResponseSchema): + """CreateSubnet - 创建子网""" + + fields = { + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + } + + +""" +API: CreateVPC + +创建VPC +""" + + +class CreateVPCRequestSchema(schema.RequestSchema): + """CreateVPC - 创建VPC""" + + fields = { + "Name": fields.Str(required=True, dump_to="Name"), + "Network": fields.List(fields.Str()), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "Type": fields.Int( + required=False, dump_to="Type" + ), # Deprecated, will be removed at 1.0 + } + + +class CreateVPCResponseSchema(schema.ResponseSchema): + """CreateVPC - 创建VPC""" + + fields = { + "VPCId": fields.Str(required=False, load_from="VPCId"), + } + + +""" +API: CreateVPCIntercom + +新建VPC互通关系 +""" + + +class CreateVPCIntercomRequestSchema(schema.RequestSchema): + """CreateVPCIntercom - 新建VPC互通关系""" + + fields = { + "DstProjectId": fields.Str(required=False, dump_to="DstProjectId"), + "DstRegion": fields.Str(required=False, dump_to="DstRegion"), + "DstVPCId": fields.Str(required=True, dump_to="DstVPCId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + } + + +class CreateVPCIntercomResponseSchema(schema.ResponseSchema): + """CreateVPCIntercom - 新建VPC互通关系""" + + fields = {} + + +""" +API: DeleteNATGW + +删除NAT网关 +""" + + +class DeleteNATGWRequestSchema(schema.RequestSchema): + """DeleteNATGW - 删除NAT网关""" + + fields = { + "NATGWId": fields.Str(required=True, dump_to="NATGWId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ReleaseEip": fields.Bool(required=False, dump_to="ReleaseEip"), + } + + +class DeleteNATGWResponseSchema(schema.ResponseSchema): + """DeleteNATGW - 删除NAT网关""" + + fields = {} + + +""" +API: DeleteNATGWPolicy + +删除NAT网关端口转发规则 +""" + + +class DeleteNATGWPolicyRequestSchema(schema.RequestSchema): + """DeleteNATGWPolicy - 删除NAT网关端口转发规则""" + + fields = { + "NATGWId": fields.Str(required=True, dump_to="NATGWId"), + "PolicyId": fields.Str(required=True, dump_to="PolicyId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DeleteNATGWPolicyResponseSchema(schema.ResponseSchema): + """DeleteNATGWPolicy - 删除NAT网关端口转发规则""" + + fields = {} + + +""" +API: DeleteNetworkAcl + +删除网络ACL +""" + + +class DeleteNetworkAclRequestSchema(schema.RequestSchema): + """DeleteNetworkAcl - 删除网络ACL""" + + fields = { + "AclId": fields.Str(required=True, dump_to="AclId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DeleteNetworkAclResponseSchema(schema.ResponseSchema): + """DeleteNetworkAcl - 删除网络ACL""" + + fields = {} + + +""" +API: DeleteNetworkAclAssociation + +删除网络ACL绑定关系 +""" + + +class DeleteNetworkAclAssociationRequestSchema(schema.RequestSchema): + """DeleteNetworkAclAssociation - 删除网络ACL绑定关系""" + + fields = { + "AclId": fields.Str(required=True, dump_to="AclId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetworkId": fields.Str(required=True, dump_to="SubnetworkId"), + } + + +class DeleteNetworkAclAssociationResponseSchema(schema.ResponseSchema): + """DeleteNetworkAclAssociation - 删除网络ACL绑定关系""" + + fields = {} + + +""" +API: DeleteNetworkAclEntry + +删除ACL的规则 +""" + + +class DeleteNetworkAclEntryRequestSchema(schema.RequestSchema): + """DeleteNetworkAclEntry - 删除ACL的规则""" + + fields = { + "AclId": fields.Str(required=True, dump_to="AclId"), + "EntryId": fields.Str(required=True, dump_to="EntryId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DeleteNetworkAclEntryResponseSchema(schema.ResponseSchema): + """DeleteNetworkAclEntry - 删除ACL的规则""" + + fields = {} + + +""" +API: DeleteNetworkInterface + +删除网卡 +""" + + +class DeleteNetworkInterfaceRequestSchema(schema.RequestSchema): + """DeleteNetworkInterface - 删除网卡""" + + fields = { + "InterfaceId": fields.Str(required=True, dump_to="InterfaceId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DeleteNetworkInterfaceResponseSchema(schema.ResponseSchema): + """DeleteNetworkInterface - 删除网卡""" + + fields = {} + + +""" +API: DeleteRouteTable + +删除自定义路由表 +""" + + +class DeleteRouteTableRequestSchema(schema.RequestSchema): + """DeleteRouteTable - 删除自定义路由表""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "RouteTableId": fields.Str(required=True, dump_to="RouteTableId"), + } + + +class DeleteRouteTableResponseSchema(schema.ResponseSchema): + """DeleteRouteTable - 删除自定义路由表""" + + fields = {} + + +""" +API: DeleteSecGroup + +删除安全组 +""" + + +class DeleteSecGroupRequestSchema(schema.RequestSchema): + """DeleteSecGroup - 删除安全组""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SecGroupId": fields.List(fields.Str()), + } + + +class DeleteSecGroupResponseSchema(schema.ResponseSchema): + """DeleteSecGroup - 删除安全组""" + + fields = {} + + +""" +API: DeleteSecGroupRule + + +""" + + +class DeleteSecGroupRuleRequestSchema(schema.RequestSchema): + """DeleteSecGroupRule -""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "RuleId": fields.List(fields.Str()), + "SecGroupId": fields.Str(required=True, dump_to="SecGroupId"), + } + + +class DeleteSecGroupRuleResponseSchema(schema.ResponseSchema): + """DeleteSecGroupRule -""" + + fields = {} + + +""" +API: DeleteSecondaryIp + +删除ip(用于uk8s使用) +""" + + +class DeleteSecondaryIpRequestSchema(schema.RequestSchema): + """DeleteSecondaryIp - 删除ip(用于uk8s使用)""" + + fields = { + "Ip": fields.Str(required=True, dump_to="Ip"), + "Mac": fields.Str(required=True, dump_to="Mac"), + "ObjectId": fields.Str(required=False, dump_to="ObjectId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class DeleteSecondaryIpResponseSchema(schema.ResponseSchema): + """DeleteSecondaryIp - 删除ip(用于uk8s使用)""" + + fields = {} + + +""" +API: DeleteSnatDnatRule + +删除NAT创建内外网IP映射规则 +""" + + +class DeleteSnatDnatRuleRequestSchema(schema.RequestSchema): + """DeleteSnatDnatRule - 删除NAT创建内外网IP映射规则""" + + fields = { + "EIP": fields.List(fields.Str()), + "NATGWId": fields.Str(required=True, dump_to="NATGWId"), + "PrivateIp": fields.List(fields.Str()), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DeleteSnatDnatRuleResponseSchema(schema.ResponseSchema): + """DeleteSnatDnatRule - 删除NAT创建内外网IP映射规则""" + + fields = {} + + +""" +API: DeleteSnatRule + +删除指定的出口规则(SNAT规则) +""" + + +class DeleteSnatRuleRequestSchema(schema.RequestSchema): + """DeleteSnatRule - 删除指定的出口规则(SNAT规则)""" + + fields = { + "NATGWId": fields.Str(required=True, dump_to="NATGWId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SourceIp": fields.Str(required=True, dump_to="SourceIp"), + } + + +class DeleteSnatRuleResponseSchema(schema.ResponseSchema): + """DeleteSnatRule - 删除指定的出口规则(SNAT规则)""" + + fields = {} + + +""" +API: DeleteSubnet + +删除子网 +""" + + +class DeleteSubnetRequestSchema(schema.RequestSchema): + """DeleteSubnet - 删除子网""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + } + + +class DeleteSubnetResponseSchema(schema.ResponseSchema): + """DeleteSubnet - 删除子网""" + + fields = {} + + +""" +API: DeleteVPC + +删除VPC +""" + + +class DeleteVPCRequestSchema(schema.RequestSchema): + """DeleteVPC - 删除VPC""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + } + + +class DeleteVPCResponseSchema(schema.ResponseSchema): + """DeleteVPC - 删除VPC""" + + fields = {} + + +""" +API: DeleteVPCIntercom + +删除VPC互通关系 +""" + + +class DeleteVPCIntercomRequestSchema(schema.RequestSchema): + """DeleteVPCIntercom - 删除VPC互通关系""" + + fields = { + "DstProjectId": fields.Str(required=False, dump_to="DstProjectId"), + "DstRegion": fields.Str(required=False, dump_to="DstRegion"), + "DstVPCId": fields.Str(required=True, dump_to="DstVPCId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + } + + +class DeleteVPCIntercomResponseSchema(schema.ResponseSchema): + """DeleteVPCIntercom - 删除VPC互通关系""" + + fields = {} + + +""" +API: DeleteWhiteListResource + +删除NAT网关白名单列表 +""" + + +class DeleteWhiteListResourceRequestSchema(schema.RequestSchema): + """DeleteWhiteListResource - 删除NAT网关白名单列表""" + + fields = { + "NATGWId": fields.Str(required=True, dump_to="NATGWId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ResourceIds": fields.List(fields.Str()), + } + + +class DeleteWhiteListResourceResponseSchema(schema.ResponseSchema): + """DeleteWhiteListResource - 删除NAT网关白名单列表""" + + fields = {} + + +""" +API: DescribeInstanceNetworkInterface + +展示云主机绑定的网卡信息 +""" + + +class DescribeInstanceNetworkInterfaceRequestSchema(schema.RequestSchema): + """DescribeInstanceNetworkInterface - 展示云主机绑定的网卡信息""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DescribeInstanceNetworkInterfaceResponseSchema(schema.ResponseSchema): + """DescribeInstanceNetworkInterface - 展示云主机绑定的网卡信息""" + + fields = { + "NetworkInterfaceSet": fields.List( + models.InstanceNetworkInterfaceSchema(), + required=True, + load_from="NetworkInterfaceSet", + ), + } + + +""" +API: DescribeNATGW + +获取NAT网关信息 +""" + + +class DescribeNATGWRequestSchema(schema.RequestSchema): + """DescribeNATGW - 获取NAT网关信息""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "NATGWIds": fields.List(fields.Str()), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DescribeNATGWResponseSchema(schema.ResponseSchema): + """DescribeNATGW - 获取NAT网关信息""" + + fields = { + "DataSet": fields.List( + models.NatGatewayDataSetSchema(), + required=False, + load_from="DataSet", + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeNATGWPolicy + +展示NAT网关端口转发规则 +""" + + +class DescribeNATGWPolicyRequestSchema(schema.RequestSchema): + """DescribeNATGWPolicy - 展示NAT网关端口转发规则""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "NATGWId": fields.Str(required=True, dump_to="NATGWId"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DescribeNATGWPolicyResponseSchema(schema.ResponseSchema): + """DescribeNATGWPolicy - 展示NAT网关端口转发规则""" + + fields = { + "DataSet": fields.List( + models.NATGWPolicyDataSetSchema(), + required=False, + load_from="DataSet", + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeNetworkAcl + +获取网络ACL +""" + + +class DescribeNetworkAclRequestSchema(schema.RequestSchema): + """DescribeNetworkAcl - 获取网络ACL""" + + fields = { + "Limit": fields.Str(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "VpcId": fields.Str(required=False, dump_to="VpcId"), + } + + +class DescribeNetworkAclResponseSchema(schema.ResponseSchema): + """DescribeNetworkAcl - 获取网络ACL""" + + fields = { + "AclList": fields.List( + models.AclInfoSchema(), required=True, load_from="AclList" + ), + } + + +""" +API: DescribeNetworkAclAssociation + +获取网络ACL的绑定关系列表 +""" + + +class DescribeNetworkAclAssociationRequestSchema(schema.RequestSchema): + """DescribeNetworkAclAssociation - 获取网络ACL的绑定关系列表""" + + fields = { + "AclId": fields.Str(required=True, dump_to="AclId"), + "Limit": fields.Str(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DescribeNetworkAclAssociationResponseSchema(schema.ResponseSchema): + """DescribeNetworkAclAssociation - 获取网络ACL的绑定关系列表""" + + fields = { + "AssociationList": fields.List( + models.AssociationInfoSchema(), + required=True, + load_from="AssociationList", + ), + } + + +""" +API: DescribeNetworkAclAssociationBySubnet + +获取子网的ACL绑定信息 +""" + + +class DescribeNetworkAclAssociationBySubnetRequestSchema(schema.RequestSchema): + """DescribeNetworkAclAssociationBySubnet - 获取子网的ACL绑定信息""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetworkId": fields.Str(required=True, dump_to="SubnetworkId"), + } + + +class DescribeNetworkAclAssociationBySubnetResponseSchema( + schema.ResponseSchema +): + """DescribeNetworkAclAssociationBySubnet - 获取子网的ACL绑定信息""" + + fields = { + "Association": models.AssociationInfoSchema(), + } + + +""" +API: DescribeNetworkAclEntry + +获取ACL的规则信息 +""" + + +class DescribeNetworkAclEntryRequestSchema(schema.RequestSchema): + """DescribeNetworkAclEntry - 获取ACL的规则信息""" + + fields = { + "AclId": fields.Str(required=True, dump_to="AclId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DescribeNetworkAclEntryResponseSchema(schema.ResponseSchema): + """DescribeNetworkAclEntry - 获取ACL的规则信息""" + + fields = { + "EntryList": fields.List( + models.AclEntryInfoSchema(), required=True, load_from="EntryList" + ), + } + + +""" +API: DescribeNetworkInterface + +展示虚拟网卡信息 +""" + + +class DescribeNetworkInterfaceRequestSchema(schema.RequestSchema): + """DescribeNetworkInterface - 展示虚拟网卡信息""" + + fields = { + "InterfaceId": fields.List(fields.Str()), + "Limit": fields.Int(required=False, dump_to="Limit"), + "NoRecycled": fields.Bool(required=False, dump_to="NoRecycled"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "OnlyDefault": fields.Bool(required=False, dump_to="OnlyDefault"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + } + + +class DescribeNetworkInterfaceResponseSchema(schema.ResponseSchema): + """DescribeNetworkInterface - 展示虚拟网卡信息""" + + fields = { + "NetworkInterfaceSet": fields.List( + models.NetworkInterfaceSchema(), + required=True, + load_from="NetworkInterfaceSet", + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeResourceSecGroup + +查询资源绑定的安全组信息 +""" + + +class DescribeResourceSecGroupRequestSchema(schema.RequestSchema): + """DescribeResourceSecGroup - 查询资源绑定的安全组信息""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ResourceId": fields.List(fields.Str()), + "ResourceType": fields.Str(required=False, dump_to="ResourceType"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + } + + +class DescribeResourceSecGroupResponseSchema(schema.ResponseSchema): + """DescribeResourceSecGroup - 查询资源绑定的安全组信息""" + + fields = { + "DataSet": fields.List( + models.ResourceSecgroupInfoExSchema(), + required=True, + load_from="DataSet", + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeRouteTable + +获取路由表详细信息(包括路由策略) +""" + + +class DescribeRouteTableRequestSchema(schema.RequestSchema): + """DescribeRouteTable - 获取路由表详细信息(包括路由策略)""" + + fields = { + "Brief": fields.Bool(required=False, dump_to="Brief"), + "BusinessId": fields.Str(required=False, dump_to="BusinessId"), + "Limit": fields.Int(required=False, dump_to="Limit"), + "LongId": fields.Str(required=False, dump_to="LongId"), + "OffSet": fields.Int(required=False, dump_to="OffSet"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "RouteTableId": fields.Str(required=False, dump_to="RouteTableId"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + } + + +class DescribeRouteTableResponseSchema(schema.ResponseSchema): + """DescribeRouteTable - 获取路由表详细信息(包括路由策略)""" + + fields = { + "RouteTables": fields.List( + models.RouteTableInfoSchema(), + required=False, + load_from="RouteTables", + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeSecGroup + + +""" + + +class DescribeSecGroupRequestSchema(schema.RequestSchema): + """DescribeSecGroup -""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SecGroupId": fields.List(fields.Str()), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + } + + +class DescribeSecGroupResponseSchema(schema.ResponseSchema): + """DescribeSecGroup -""" + + fields = { + "DataSet": fields.List( + models.SecGroupInfoSchema(), required=True, load_from="DataSet" + ), + } + + +""" +API: DescribeSecGroupResource + +获取安全组绑资源信息 +""" + + +class DescribeSecGroupResourceRequestSchema(schema.RequestSchema): + """DescribeSecGroupResource - 获取安全组绑资源信息""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SecGroupId": fields.Str(required=False, dump_to="SecGroupId"), + } + + +class DescribeSecGroupResourceResponseSchema(schema.ResponseSchema): + """DescribeSecGroupResource - 获取安全组绑资源信息""" + + fields = { + "DataSet": fields.List( + models.SecGroupResourceInfoSchema(), + required=True, + load_from="DataSet", + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeSecondaryIp + +查询SecondaryIp(uk8s使用) +""" + + +class DescribeSecondaryIpRequestSchema(schema.RequestSchema): + """DescribeSecondaryIp - 查询SecondaryIp(uk8s使用)""" + + fields = { + "Ip": fields.Str(required=False, dump_to="Ip"), + "Mac": fields.Str(required=False, dump_to="Mac"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + "Zone": fields.Str( + required=True, dump_to="Zone" + ), # Deprecated, will be removed at 1.0 + } + + +class DescribeSecondaryIpResponseSchema(schema.ResponseSchema): + """DescribeSecondaryIp - 查询SecondaryIp(uk8s使用)""" + + fields = { + "DataSet": fields.List( + models.IpInfoSchema(), required=False, load_from="DataSet" + ), + } + + +""" +API: DescribeSnatDnatRule + +获取基于NAT创建的内外网IP映射规则信息 +""" + + +class DescribeSnatDnatRuleRequestSchema(schema.RequestSchema): + """DescribeSnatDnatRule - 获取基于NAT创建的内外网IP映射规则信息""" + + fields = { + "EIP": fields.List(fields.Str()), + "NATGWId": fields.List(fields.Str()), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DescribeSnatDnatRuleResponseSchema(schema.ResponseSchema): + """DescribeSnatDnatRule - 获取基于NAT创建的内外网IP映射规则信息""" + + fields = { + "DataSet": fields.List( + models.SnatDnatRuleInfoSchema(), required=False, load_from="DataSet" + ), + } + + +""" +API: DescribeSnatRule + +获取Nat网关的出口规则(SNAT规则) +""" + + +class DescribeSnatRuleRequestSchema(schema.RequestSchema): + """DescribeSnatRule - 获取Nat网关的出口规则(SNAT规则)""" + + fields = { + "Limit": fields.Str(required=False, dump_to="Limit"), + "NATGWId": fields.Str(required=True, dump_to="NATGWId"), + "Offset": fields.Str(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SnatIp": fields.Str(required=False, dump_to="SnatIp"), + "SourceIp": fields.Str(required=False, dump_to="SourceIp"), + } + + +class DescribeSnatRuleResponseSchema(schema.ResponseSchema): + """DescribeSnatRule - 获取Nat网关的出口规则(SNAT规则)""" + + fields = { + "DataSet": fields.List( + models.NATGWSnatRuleSchema(), required=True, load_from="DataSet" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeSubnet + +获取子网信息 +""" + + +class DescribeSubnetRequestSchema(schema.RequestSchema): + """DescribeSubnet - 获取子网信息""" + + fields = { + "BusinessId": fields.Str( + required=False, dump_to="BusinessId" + ), # Deprecated, will be removed at 1.0 + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "RouteTableId": fields.Str(required=False, dump_to="RouteTableId"), + "ShowAvailableIPs": fields.Bool( + required=False, dump_to="ShowAvailableIPs" + ), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "SubnetIds": fields.List(fields.Str()), + "Tag": fields.Str(required=False, dump_to="Tag"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + } + + +class DescribeSubnetResponseSchema(schema.ResponseSchema): + """DescribeSubnet - 获取子网信息""" + + fields = { + "DataSet": fields.List( + models.SubnetInfoSchema(), required=True, load_from="DataSet" + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DescribeSubnetResource + +展示子网资源 +""" + + +class DescribeSubnetResourceRequestSchema(schema.RequestSchema): + """DescribeSubnetResource - 展示子网资源""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ResourceType": fields.Str(required=False, dump_to="ResourceType"), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + } + + +class DescribeSubnetResourceResponseSchema(schema.ResponseSchema): + """DescribeSubnetResource - 展示子网资源""" + + fields = { + "DataSet": fields.List( + models.SubnetResourceSchema(), required=False, load_from="DataSet" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeVIP + +获取内网VIP详细信息 +""" + + +class DescribeVIPRequestSchema(schema.RequestSchema): + """DescribeVIP - 获取内网VIP详细信息""" + + fields = { + "BusinessId": fields.Str(required=False, dump_to="BusinessId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetId": fields.Str(required=False, dump_to="SubnetId"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "VIPId": fields.Str(required=False, dump_to="VIPId"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DescribeVIPResponseSchema(schema.ResponseSchema): + """DescribeVIP - 获取内网VIP详细信息""" + + fields = { + "DataSet": fields.List( + fields.Str(), required=False, load_from="DataSet" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + "VIPSet": fields.List( + models.VIPDetailSetSchema(), required=False, load_from="VIPSet" + ), + } + + +""" +API: DescribeVPC + +获取VPC信息 +""" + + +class DescribeVPCRequestSchema(schema.RequestSchema): + """DescribeVPC - 获取VPC信息""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "VPCIds": fields.List(fields.Str()), + } + + +class DescribeVPCResponseSchema(schema.ResponseSchema): + """DescribeVPC - 获取VPC信息""" + + fields = { + "DataSet": fields.List( + models.VPCInfoSchema(), required=False, load_from="DataSet" + ), + "TotalCount": fields.Int(required=False, load_from="TotalCount"), + } + + +""" +API: DescribeVPCIntercom + +获取VPC互通信息 +""" + + +class DescribeVPCIntercomRequestSchema(schema.RequestSchema): + """DescribeVPCIntercom - 获取VPC互通信息""" + + fields = { + "DstProjectId": fields.Str(required=False, dump_to="DstProjectId"), + "DstRegion": fields.Str(required=False, dump_to="DstRegion"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + } + + +class DescribeVPCIntercomResponseSchema(schema.ResponseSchema): + """DescribeVPCIntercom - 获取VPC互通信息""" + + fields = { + "DataSet": fields.List( + models.VPCIntercomInfoSchema(), required=False, load_from="DataSet" + ), + } + + +""" +API: DescribeWhiteListResource + +展示NAT网关白名单资源列表 +""" + + +class DescribeWhiteListResourceRequestSchema(schema.RequestSchema): + """DescribeWhiteListResource - 展示NAT网关白名单资源列表""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "NATGWIds": fields.List(fields.Str()), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DescribeWhiteListResourceResponseSchema(schema.ResponseSchema): + """DescribeWhiteListResource - 展示NAT网关白名单资源列表""" + + fields = { + "DataSet": fields.List( + models.NatGWWhitelistDataSetSchema(), + required=True, + load_from="DataSet", + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: DetachNetworkInterface + +解绑云主机关联网卡 +""" + + +class DetachNetworkInterfaceRequestSchema(schema.RequestSchema): + """DetachNetworkInterface - 解绑云主机关联网卡""" + + fields = { + "InstanceId": fields.Str(required=True, dump_to="InstanceId"), + "InterfaceId": fields.Str(required=True, dump_to="InterfaceId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class DetachNetworkInterfaceResponseSchema(schema.ResponseSchema): + """DetachNetworkInterface - 解绑云主机关联网卡""" + + fields = {} + + +""" +API: DisableUniEipDirectMode + +关闭虚拟网卡EIP直通功能 +""" + + +class DisableUniEipDirectModeRequestSchema(schema.RequestSchema): + """DisableUniEipDirectMode - 关闭虚拟网卡EIP直通功能""" + + fields = { + "InterfaceId": fields.Str(required=True, dump_to="InterfaceId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class DisableUniEipDirectModeResponseSchema(schema.ResponseSchema): + """DisableUniEipDirectMode - 关闭虚拟网卡EIP直通功能""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: DisassociateSecGroup + +解绑安全组和资源绑定关系 +""" + + +class DisassociateSecGroupRequestSchema(schema.RequestSchema): + """DisassociateSecGroup - 解绑安全组和资源绑定关系""" + + fields = { + "Force": fields.Bool(required=False, dump_to="Force"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ResourceId": fields.List(fields.Str()), + "SecGroupId": fields.List(fields.Str()), + } + + +class DisassociateSecGroupResponseSchema(schema.ResponseSchema): + """DisassociateSecGroup - 解绑安全组和资源绑定关系""" + + fields = {} + + +""" +API: EnableUniEipDirectMode + +开启虚拟网卡EIP直通功能 +""" + + +class EnableUniEipDirectModeRequestSchema(schema.RequestSchema): + """EnableUniEipDirectMode - 开启虚拟网卡EIP直通功能""" + + fields = { + "InterfaceId": fields.Str(required=True, dump_to="InterfaceId"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class EnableUniEipDirectModeResponseSchema(schema.ResponseSchema): + """EnableUniEipDirectMode - 开启虚拟网卡EIP直通功能""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: EnableWhiteList + +修改NAT网关白名单开关 +""" + + +class EnableWhiteListRequestSchema(schema.RequestSchema): + """EnableWhiteList - 修改NAT网关白名单开关""" + + fields = { + "IfOpen": fields.Int(required=True, dump_to="IfOpen"), + "NATGWId": fields.Str(required=True, dump_to="NATGWId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class EnableWhiteListResponseSchema(schema.ResponseSchema): + """EnableWhiteList - 修改NAT网关白名单开关""" + + fields = {} + + +""" +API: GetAvailableResourceForPolicy + +获取NAT网关可配置端口转发规则的资源信息 +""" + + +class GetAvailableResourceForPolicyRequestSchema(schema.RequestSchema): + """GetAvailableResourceForPolicy - 获取NAT网关可配置端口转发规则的资源信息""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "NATGWId": fields.Str(required=True, dump_to="NATGWId"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class GetAvailableResourceForPolicyResponseSchema(schema.ResponseSchema): + """GetAvailableResourceForPolicy - 获取NAT网关可配置端口转发规则的资源信息""" + + fields = { + "DataSet": fields.List( + models.GetAvailableResourceForPolicyDataSetSchema(), + required=True, + load_from="DataSet", + ), + } + + +""" +API: GetAvailableResourceForSnatRule + +获取可用于添加snat规则(出口规则)的资源列表 +""" + + +class GetAvailableResourceForSnatRuleRequestSchema(schema.RequestSchema): + """GetAvailableResourceForSnatRule - 获取可用于添加snat规则(出口规则)的资源列表""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "NATGWId": fields.Str(required=True, dump_to="NATGWId"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class GetAvailableResourceForSnatRuleResponseSchema(schema.ResponseSchema): + """GetAvailableResourceForSnatRule - 获取可用于添加snat规则(出口规则)的资源列表""" + + fields = { + "Action": fields.Str(required=True, load_from="Action"), + "DataSet": fields.List( + models.GetAvailableResourceForSnatRuleDataSetSchema(), + required=True, + load_from="DataSet", + ), + "RetCode": fields.Str(required=True, load_from="RetCode"), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: GetAvailableResourceForWhiteList + +获取NAT网关可添加白名单的资源 +""" + + +class GetAvailableResourceForWhiteListRequestSchema(schema.RequestSchema): + """GetAvailableResourceForWhiteList - 获取NAT网关可添加白名单的资源""" + + fields = { + "Limit": fields.Int(required=False, dump_to="Limit"), + "NATGWId": fields.Str(required=True, dump_to="NATGWId"), + "Offset": fields.Int(required=False, dump_to="Offset"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class GetAvailableResourceForWhiteListResponseSchema(schema.ResponseSchema): + """GetAvailableResourceForWhiteList - 获取NAT网关可添加白名单的资源""" + + fields = { + "DataSet": fields.List( + models.GetAvailableResourceForWhiteListDataSetSchema(), + required=True, + load_from="DataSet", + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: GetNetworkAclTargetResource + +获取ACL规则应用目标列表 +""" + + +class GetNetworkAclTargetResourceRequestSchema(schema.RequestSchema): + """GetNetworkAclTargetResource - 获取ACL规则应用目标列表""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetworkId": fields.List(fields.Str()), + } + + +class GetNetworkAclTargetResourceResponseSchema(schema.ResponseSchema): + """GetNetworkAclTargetResource - 获取ACL规则应用目标列表""" + + fields = { + "TargetResourceList": fields.List( + models.TargetResourceInfoSchema(), + required=True, + load_from="TargetResourceList", + ), + "TotalCount": fields.Int(required=True, load_from="TotalCount"), + } + + +""" +API: ListSubnetForNATGW + +展示NAT网关可绑定的子网列表 +""" + + +class ListSubnetForNATGWRequestSchema(schema.RequestSchema): + """ListSubnetForNATGW - 展示NAT网关可绑定的子网列表""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "VPCId": fields.Str(required=False, dump_to="VPCId"), + } + + +class ListSubnetForNATGWResponseSchema(schema.ResponseSchema): + """ListSubnetForNATGW - 展示NAT网关可绑定的子网列表""" + + fields = { + "DataSet": fields.List( + models.NatgwSubnetDataSetSchema(), + required=False, + load_from="DataSet", + ), + } + + +""" +API: ModifyRouteRule + +路由策略增、删、改 +""" + + +class ModifyRouteRuleRequestSchema(schema.RequestSchema): + """ModifyRouteRule - 路由策略增、删、改""" + + fields = { + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "RouteRule": fields.List(fields.Str()), + "RouteTableId": fields.Str(required=True, dump_to="RouteTableId"), + } + + +class ModifyRouteRuleResponseSchema(schema.ResponseSchema): + """ModifyRouteRule - 路由策略增、删、改""" + + fields = {} + + +""" +API: MoveSecondaryIPMac + +把 Secondary IP 从旧 MAC 迁移到新 MAC +""" + + +class MoveSecondaryIPMacRequestSchema(schema.RequestSchema): + """MoveSecondaryIPMac - 把 Secondary IP 从旧 MAC 迁移到新 MAC""" + + fields = { + "Ip": fields.Str(required=True, dump_to="Ip"), + "NewMac": fields.Str(required=True, dump_to="NewMac"), + "OldMac": fields.Str(required=True, dump_to="OldMac"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + } + + +class MoveSecondaryIPMacResponseSchema(schema.ResponseSchema): + """MoveSecondaryIPMac - 把 Secondary IP 从旧 MAC 迁移到新 MAC""" + + fields = {} + + +""" +API: ReleaseVIP + +释放VIP资源 +""" + + +class ReleaseVIPRequestSchema(schema.RequestSchema): + """ReleaseVIP - 释放VIP资源""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "VIPId": fields.Str(required=True, dump_to="VIPId"), + "Zone": fields.Str(required=False, dump_to="Zone"), + } + + +class ReleaseVIPResponseSchema(schema.ResponseSchema): + """ReleaseVIP - 释放VIP资源""" + + fields = {} + + +""" +API: SetGwDefaultExport + +设置NAT网关的默认出口 +""" + + +class SetGwDefaultExportRequestSchema(schema.RequestSchema): + """SetGwDefaultExport - 设置NAT网关的默认出口""" + + fields = { + "ExportEipId": fields.Str(required=False, dump_to="ExportEipId"), + "ExportIp": fields.Str(required=False, dump_to="ExportIp"), + "NATGWId": fields.Str(required=True, dump_to="NATGWId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class SetGwDefaultExportResponseSchema(schema.ResponseSchema): + """SetGwDefaultExport - 设置NAT网关的默认出口""" + + fields = {} + + +""" +API: UpdateNATGWPolicy + +更新NAT网关端口转发规则 +""" + + +class UpdateNATGWPolicyRequestSchema(schema.RequestSchema): + """UpdateNATGWPolicy - 更新NAT网关端口转发规则""" + + fields = { + "DstIP": fields.Str(required=True, dump_to="DstIP"), + "DstPort": fields.Str(required=True, dump_to="DstPort"), + "NATGWId": fields.Str(required=True, dump_to="NATGWId"), + "PolicyId": fields.Str(required=True, dump_to="PolicyId"), + "PolicyName": fields.Str(required=False, dump_to="PolicyName"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Protocol": fields.Str(required=True, dump_to="Protocol"), + "Region": fields.Str(required=True, dump_to="Region"), + "SrcEIPId": fields.Str(required=True, dump_to="SrcEIPId"), + "SrcPort": fields.Str(required=True, dump_to="SrcPort"), + } + + +class UpdateNATGWPolicyResponseSchema(schema.ResponseSchema): + """UpdateNATGWPolicy - 更新NAT网关端口转发规则""" + + fields = {} + + +""" +API: UpdateNATGWSubnet + +更新NAT网关绑定的子网 +""" + + +class UpdateNATGWSubnetRequestSchema(schema.RequestSchema): + """UpdateNATGWSubnet - 更新NAT网关绑定的子网""" + + fields = { + "NATGWId": fields.Str(required=True, dump_to="NATGWId"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetworkIds": fields.List(fields.Str()), + } + + +class UpdateNATGWSubnetResponseSchema(schema.ResponseSchema): + """UpdateNATGWSubnet - 更新NAT网关绑定的子网""" + + fields = {} + + +""" +API: UpdateNetworkAcl + +更改ACL +""" + + +class UpdateNetworkAclRequestSchema(schema.RequestSchema): + """UpdateNetworkAcl - 更改ACL""" + + fields = { + "AclId": fields.Str(required=True, dump_to="AclId"), + "AclName": fields.Str(required=True, dump_to="AclName"), + "Description": fields.Str(required=True, dump_to="Description"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + } + + +class UpdateNetworkAclResponseSchema(schema.ResponseSchema): + """UpdateNetworkAcl - 更改ACL""" + + fields = {} + + +""" +API: UpdateNetworkAclEntry + +更新ACL的规则 +""" + + +class UpdateNetworkAclEntryRequestSchema(schema.RequestSchema): + """UpdateNetworkAclEntry - 更新ACL的规则""" + + fields = { + "AclId": fields.Str(required=True, dump_to="AclId"), + "CidrBlock": fields.Str(required=True, dump_to="CidrBlock"), + "Description": fields.Str(required=False, dump_to="Description"), + "Direction": fields.Str(required=True, dump_to="Direction"), + "EntryAction": fields.Str(required=True, dump_to="EntryAction"), + "EntryId": fields.Str(required=True, dump_to="EntryId"), + "IpProtocol": fields.Str(required=True, dump_to="IpProtocol"), + "PortRange": fields.Str(required=True, dump_to="PortRange"), + "Priority": fields.Int(required=True, dump_to="Priority"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "TargetResourceIds": fields.List(fields.Str()), + "TargetType": fields.Int(required=False, dump_to="TargetType"), + } + + +class UpdateNetworkAclEntryResponseSchema(schema.ResponseSchema): + """UpdateNetworkAclEntry - 更新ACL的规则""" + + fields = {} + + +""" +API: UpdateNetworkInterfaceDefaultOutput + +更新虚拟网卡默认出口(仅用于开启EIP网卡可见模式的虚拟网卡) +""" + + +class UpdateNetworkInterfaceDefaultOutputRequestSchema(schema.RequestSchema): + """UpdateNetworkInterfaceDefaultOutput - 更新虚拟网卡默认出口(仅用于开启EIP网卡可见模式的虚拟网卡)""" + + fields = { + "InterfaceId": fields.Str(required=True, dump_to="InterfaceId"), + "Output": fields.Str(required=False, dump_to="Output"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Zone": fields.Str(required=True, dump_to="Zone"), + } + + +class UpdateNetworkInterfaceDefaultOutputResponseSchema(schema.ResponseSchema): + """UpdateNetworkInterfaceDefaultOutput - 更新虚拟网卡默认出口(仅用于开启EIP网卡可见模式的虚拟网卡)""" + + fields = { + "Message": fields.Str(required=True, load_from="Message"), + } + + +""" +API: UpdateRouteTableAttribute + +更新路由表基本信息 +""" + + +class UpdateRouteTableAttributeRequestSchema(schema.RequestSchema): + """UpdateRouteTableAttribute - 更新路由表基本信息""" + + fields = { + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "RouteTableId": fields.Str(required=True, dump_to="RouteTableId"), + "Tag": fields.Str(required=False, dump_to="Tag"), + } + + +class UpdateRouteTableAttributeResponseSchema(schema.ResponseSchema): + """UpdateRouteTableAttribute - 更新路由表基本信息""" + + fields = {} + + +""" +API: UpdateSecGroup + +更新安全组基本信息 +""" + + +class UpdateSecGroupRequestSchema(schema.RequestSchema): + """UpdateSecGroup - 更新安全组基本信息""" + + fields = { + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "SecGroupId": fields.Str(required=True, dump_to="SecGroupId"), + } + + +class UpdateSecGroupResponseSchema(schema.ResponseSchema): + """UpdateSecGroup - 更新安全组基本信息""" + + fields = {} + + +""" +API: UpdateSecGroupAssociation + +仅对操作的安全组ID生效,其他已有的绑定关系不受影响。 +""" + + +class UpdateSecGroupAssociationParamNewPrioritySecGroupSchema( + schema.RequestSchema +): + """UpdateSecGroupAssociationParamNewPrioritySecGroup -""" + + fields = { + "Priority": fields.Int(required=True, dump_to="Priority"), + "SecGroupId": fields.Str(required=True, dump_to="SecGroupId"), + } + + +class UpdateSecGroupAssociationRequestSchema(schema.RequestSchema): + """UpdateSecGroupAssociation - 仅对操作的安全组ID生效,其他已有的绑定关系不受影响。""" + + fields = { + "NewPrioritySecGroup": fields.List( + UpdateSecGroupAssociationParamNewPrioritySecGroupSchema() + ), + "OldSecGroupId": fields.List(fields.Str()), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "ResourceId": fields.Str(required=True, dump_to="ResourceId"), + } + + +class UpdateSecGroupAssociationResponseSchema(schema.ResponseSchema): + """UpdateSecGroupAssociation - 仅对操作的安全组ID生效,其他已有的绑定关系不受影响。""" + + fields = {} + + +""" +API: UpdateSecGroupRule + + +""" + + +class UpdateSecGroupRuleParamRuleSchema(schema.RequestSchema): + """UpdateSecGroupRuleParamRule -""" + + fields = { + "Direction": fields.Str(required=True, dump_to="Direction"), + "DstPort": fields.Str(required=True, dump_to="DstPort"), + "IPRange": fields.Str(required=True, dump_to="IPRange"), + "IPVersion": fields.Str(required=False, dump_to="IPVersion"), + "Priority": fields.Int(required=True, dump_to="Priority"), + "ProtocolType": fields.Str(required=True, dump_to="ProtocolType"), + "Remark": fields.Str(required=True, dump_to="Remark"), + "RuleAction": fields.Str(required=True, dump_to="RuleAction"), + "RuleId": fields.Str(required=True, dump_to="RuleId"), + } + + +class UpdateSecGroupRuleRequestSchema(schema.RequestSchema): + """UpdateSecGroupRule -""" + + fields = { + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Rule": fields.List(UpdateSecGroupRuleParamRuleSchema()), + "SecGroupId": fields.Str(required=True, dump_to="SecGroupId"), + } + + +class UpdateSecGroupRuleResponseSchema(schema.ResponseSchema): + """UpdateSecGroupRule -""" + + fields = {} + + +""" +API: UpdateSnatRule + +更新指定的出口规则(SNAT规则) +""" + + +class UpdateSnatRuleRequestSchema(schema.RequestSchema): + """UpdateSnatRule - 更新指定的出口规则(SNAT规则)""" + + fields = { + "NATGWId": fields.Str(required=True, dump_to="NATGWId"), + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SnatIp": fields.Str(required=True, dump_to="SnatIp"), + "SourceIp": fields.Str(required=True, dump_to="SourceIp"), + } + + +class UpdateSnatRuleResponseSchema(schema.ResponseSchema): + """UpdateSnatRule - 更新指定的出口规则(SNAT规则)""" + + fields = {} + + +""" +API: UpdateSubnetAttribute + +更新子网信息 +""" + + +class UpdateSubnetAttributeRequestSchema(schema.RequestSchema): + """UpdateSubnetAttribute - 更新子网信息""" + + fields = { + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=False, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "SubnetId": fields.Str(required=True, dump_to="SubnetId"), + "Tag": fields.Str(required=False, dump_to="Tag"), + } + + +class UpdateSubnetAttributeResponseSchema(schema.ResponseSchema): + """UpdateSubnetAttribute - 更新子网信息""" + + fields = {} + + +""" +API: UpdateVIPAttribute + +更新VIP信息 +""" + + +class UpdateVIPAttributeRequestSchema(schema.RequestSchema): + """UpdateVIPAttribute - 更新VIP信息""" + + fields = { + "Name": fields.Str(required=False, dump_to="Name"), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "Remark": fields.Str(required=False, dump_to="Remark"), + "Tag": fields.Str(required=False, dump_to="Tag"), + "VIPId": fields.Str(required=True, dump_to="VIPId"), + } + + +class UpdateVIPAttributeResponseSchema(schema.ResponseSchema): + """UpdateVIPAttribute - 更新VIP信息""" + + fields = {} + + +""" +API: UpdateVPCNetwork + +更新VPC网段 +""" + + +class UpdateVPCNetworkRequestSchema(schema.RequestSchema): + """UpdateVPCNetwork - 更新VPC网段""" + + fields = { + "Network": fields.List(fields.Str()), + "ProjectId": fields.Str(required=True, dump_to="ProjectId"), + "Region": fields.Str(required=True, dump_to="Region"), + "VPCId": fields.Str(required=True, dump_to="VPCId"), + } + + +class UpdateVPCNetworkResponseSchema(schema.ResponseSchema): + """UpdateVPCNetwork - 更新VPC网段""" + + fields = { + "Message": fields.Str( + required=True, load_from="Message" + ), # Deprecated, will be removed at 1.0 + } diff --git a/ucloud/services/vpc/schemas/models.py b/ucloud/services/vpc/schemas/models.py index a72435ab..c91bd0b4 100644 --- a/ucloud/services/vpc/schemas/models.py +++ b/ucloud/services/vpc/schemas/models.py @@ -3,23 +3,372 @@ from ucloud.core.typesystem import schema, fields -class RouteRuleInfoSchema(schema.ResponseSchema): - """ RouteRuleInfo - 路由规则信息 +class StatusInfoSchema(schema.ResponseSchema): + """StatusInfo -""" + + fields = { + "Message": fields.Str(required=False, load_from="Message"), + "StatusCode": fields.Str(required=False, load_from="StatusCode"), + } + + +class IpsInfoSchema(schema.ResponseSchema): + """IpsInfo -""" + + fields = { + "Gateway": fields.Str(required=False, load_from="Gateway"), + "Ip": fields.Str(required=False, load_from="Ip"), + "Mac": fields.Str(required=False, load_from="Mac"), + "Mask": fields.Str(required=False, load_from="Mask"), + "Status": StatusInfoSchema(), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + } + + +class IpInfoSchema(schema.ResponseSchema): + """IpInfo -""" + + fields = { + "Gateway": fields.Str(required=False, load_from="Gateway"), + "Ip": fields.Str(required=False, load_from="Ip"), + "Mac": fields.Str(required=False, load_from="Mac"), + "Mask": fields.Str(required=False, load_from="Mask"), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + } + + +class VIPSetSchema(schema.ResponseSchema): + """VIPSet - VIPSet""" + + fields = { + "VIP": fields.Str(required=False, load_from="VIP"), + "VIPId": fields.Str(required=False, load_from="VIPId"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + } + + +class AssociationInfoSchema(schema.ResponseSchema): + """AssociationInfo - 绑定信息""" + + fields = { + "AclId": fields.Str(required=True, load_from="AclId"), + "AssociationId": fields.Str(required=True, load_from="AssociationId"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "SubnetworkId": fields.Str(required=True, load_from="SubnetworkId"), + } + + +class NetworkInterfaceInfoSchema(schema.ResponseSchema): + """NetworkInterfaceInfo - 虚拟网卡信息""" + + fields = { + "AttachInstanceId": fields.Str( + required=False, load_from="AttachInstanceId" + ), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "Default": fields.Bool(required=False, load_from="Default"), + "Gateway": fields.Str(required=False, load_from="Gateway"), + "InterfaceId": fields.Str(required=True, load_from="InterfaceId"), + "MacAddress": fields.Str(required=True, load_from="MacAddress"), + "Name": fields.Str(required=False, load_from="Name"), + "Netmask": fields.Str(required=False, load_from="Netmask"), + "PrivateIpSet": fields.List(fields.Str()), + "Remark": fields.Str(required=False, load_from="Remark"), + "Status": fields.Int(required=True, load_from="Status"), + "SubnetId": fields.Str(required=True, load_from="SubnetId"), + "Tag": fields.Str(required=False, load_from="Tag"), + "VPCId": fields.Str(required=True, load_from="VPCId"), + } + + +class InstanceNetworkInterfaceSchema(schema.ResponseSchema): + """InstanceNetworkInterface - 实例绑定的虚拟网卡信息""" + + fields = { + "AttachInstanceId": fields.Str( + required=False, load_from="AttachInstanceId" + ), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "Default": fields.Bool(required=False, load_from="Default"), + "EIPIdSet": fields.List(fields.Str()), + "FirewallIdSet": fields.List(fields.Str()), + "Gateway": fields.Str(required=False, load_from="Gateway"), + "InterfaceId": fields.Str(required=True, load_from="InterfaceId"), + "MacAddress": fields.Str(required=True, load_from="MacAddress"), + "Name": fields.Str(required=False, load_from="Name"), + "Netmask": fields.Str(required=False, load_from="Netmask"), + "PrivateIpSet": fields.List(fields.Str()), + "Remark": fields.Str(required=False, load_from="Remark"), + "Status": fields.Int(required=True, load_from="Status"), + "SubnetId": fields.Str(required=True, load_from="SubnetId"), + "Tag": fields.Str(required=False, load_from="Tag"), + "VPCId": fields.Str(required=True, load_from="VPCId"), + } + + +class NatGWIPResInfoSchema(schema.ResponseSchema): + """NatGWIPResInfo - IP信息""" + + fields = { + "EIP": fields.Str(required=True, load_from="EIP"), + "OperatorName": fields.Str(required=True, load_from="OperatorName"), + } + + +class NatGatewaySubnetSetSchema(schema.ResponseSchema): + """NatGatewaySubnetSet - natgw里面的子网信息""" + + fields = { + "Subnet": fields.Str(required=True, load_from="Subnet"), + "SubnetName": fields.Str(required=True, load_from="SubnetName"), + "SubnetworkId": fields.Str(required=True, load_from="SubnetworkId"), + } + + +class NatGatewayIPSetSchema(schema.ResponseSchema): + """NatGatewayIPSet - IPSet信息""" + + fields = { + "Bandwidth": fields.Int(required=True, load_from="Bandwidth"), + "BandwidthType": fields.Str(required=True, load_from="BandwidthType"), + "EIPId": fields.Str(required=True, load_from="EIPId"), + "IPResInfo": fields.List(NatGWIPResInfoSchema()), + "Weight": fields.Int(required=True, load_from="Weight"), + } + + +class NatGatewayDataSetSchema(schema.ResponseSchema): + """NatGatewayDataSet - natgw的信息""" + + fields = { + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "FirewallId": fields.Str(required=True, load_from="FirewallId"), + "IPSet": fields.List(NatGatewayIPSetSchema()), + "IsSnatpoolEnabled": fields.Str( + required=True, load_from="IsSnatpoolEnabled" + ), + "NATGWId": fields.Str(required=True, load_from="NATGWId"), + "NATGWName": fields.Str(required=True, load_from="NATGWName"), + "PolicyId": fields.List(fields.Str()), + "Remark": fields.Str(required=True, load_from="Remark"), + "SubnetSet": fields.List(NatGatewaySubnetSetSchema()), + "Tag": fields.Str(required=True, load_from="Tag"), + "VPCId": fields.Str(required=True, load_from="VPCId"), + "VPCName": fields.Str(required=True, load_from="VPCName"), + } + + +class NATGWPolicyDataSetSchema(schema.ResponseSchema): + """NATGWPolicyDataSet - DescribeNATGWPolicy""" + + fields = { + "DstIP": fields.Str(required=True, load_from="DstIP"), + "DstPort": fields.Str(required=True, load_from="DstPort"), + "NATGWId": fields.Str(required=True, load_from="NATGWId"), + "PolicyId": fields.Str(required=True, load_from="PolicyId"), + "PolicyName": fields.Str(required=False, load_from="PolicyName"), + "Protocol": fields.Str(required=True, load_from="Protocol"), + "SrcEIP": fields.Str(required=True, load_from="SrcEIP"), + "SrcEIPId": fields.Str(required=True, load_from="SrcEIPId"), + "SrcPort": fields.Str(required=True, load_from="SrcPort"), + } + + +class TargetResourceInfoSchema(schema.ResponseSchema): + """TargetResourceInfo - ACL规则应用目标资源信息。""" + + fields = { + "PrivateIp": fields.Str(required=True, load_from="PrivateIp"), + "ResourceId": fields.Str(required=True, load_from="ResourceId"), + "ResourceName": fields.Str(required=True, load_from="ResourceName"), + "ResourceType": fields.Int(required=True, load_from="ResourceType"), + "SubResourceId": fields.Str(required=True, load_from="SubResourceId"), + "SubResourceName": fields.Str( + required=True, load_from="SubResourceName" + ), + "SubResourceType": fields.Int( + required=True, load_from="SubResourceType" + ), + "SubnetworkId": fields.Str(required=True, load_from="SubnetworkId"), + } + + +class AclEntryInfoSchema(schema.ResponseSchema): + """AclEntryInfo - Entry的详细信息""" + + fields = { + "CidrBlock": fields.Str(required=True, load_from="CidrBlock"), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "Direction": fields.Str(required=True, load_from="Direction"), + "EntryAction": fields.Str(required=True, load_from="EntryAction"), + "EntryId": fields.Str(required=True, load_from="EntryId"), + "IpProtocol": fields.Str(required=True, load_from="IpProtocol"), + "PortRange": fields.Str(required=True, load_from="PortRange"), + "Priority": fields.Str(required=True, load_from="Priority"), + "TargetResourceCount": fields.Int( + required=False, load_from="TargetResourceCount" + ), + "TargetResourceList": fields.List(TargetResourceInfoSchema()), + "TargetType": fields.Int(required=True, load_from="TargetType"), + "UpdateTime": fields.Int(required=True, load_from="UpdateTime"), + } + + +class AclInfoSchema(schema.ResponseSchema): + """AclInfo - Acl的基础信息""" + + fields = { + "AclId": fields.Str(required=True, load_from="AclId"), + "AclName": fields.Str(required=True, load_from="AclName"), + "Associations": fields.List(AssociationInfoSchema()), + "CreateTime": fields.Int(required=True, load_from="CreateTime"), + "Description": fields.Str(required=True, load_from="Description"), + "Entries": fields.List(AclEntryInfoSchema()), + "UpdateTime": fields.Int(required=True, load_from="UpdateTime"), + "VpcId": fields.Str(required=True, load_from="VpcId"), + } + + +class UNIIpInfoSchema(schema.ResponseSchema): + """UNIIpInfo - 虚拟网卡内网IP信息""" + + fields = { + "IpAddr": fields.List(fields.Str()), + "IpType": fields.Str(required=False, load_from="IpType"), + } + + +class UNIQuotaInfoSchema(schema.ResponseSchema): + """UNIQuotaInfo - 虚拟网卡内网IP配额使用情况""" + + fields = { + "PrivateIpCount": fields.Int( + required=False, load_from="PrivateIpCount" + ), + "PrivateIpQuota": fields.Int( + required=False, load_from="PrivateIpQuota" + ), + } + + +class NetworkInterfaceSchema(schema.ResponseSchema): + """NetworkInterface - 虚拟网卡信息""" + + fields = { + "AttachInstanceId": fields.Str( + required=False, load_from="AttachInstanceId" + ), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "Default": fields.Bool(required=False, load_from="Default"), + "EIPIdSet": fields.List(fields.Str()), + "FirewallIdSet": fields.List(fields.Str()), + "Gateway": fields.Str(required=False, load_from="Gateway"), + "InterfaceId": fields.Str(required=True, load_from="InterfaceId"), + "MacAddress": fields.Str(required=True, load_from="MacAddress"), + "Name": fields.Str(required=False, load_from="Name"), + "Netmask": fields.Str(required=False, load_from="Netmask"), + "PrivateIp": fields.List(UNIIpInfoSchema()), + "PrivateIpLimit": UNIQuotaInfoSchema(), + "PrivateIpSet": fields.List(fields.Str()), + "Remark": fields.Str(required=False, load_from="Remark"), + "Status": fields.Int(required=True, load_from="Status"), + "SubnetId": fields.Str(required=True, load_from="SubnetId"), + "Tag": fields.Str(required=False, load_from="Tag"), + "VPCId": fields.Str(required=True, load_from="VPCId"), + } + + +class SecGroupSimpleInfoSchema(schema.ResponseSchema): + """SecGroupSimpleInfo - 安全组简略信息""" + + fields = { + "Name": fields.Str(required=False, load_from="Name"), + "SecGroupId": fields.Str(required=False, load_from="SecGroupId"), + } + + +class ResourceSecgroupInfoSchema(schema.ResponseSchema): + """ResourceSecgroupInfo - 资源的安全组信息""" + + fields = { + "Count": fields.Int(required=True, load_from="Count"), + "ResourceId": fields.Str(required=True, load_from="ResourceId"), + "SecGroupInfo": fields.List(SecGroupSimpleInfoSchema()), + } + + +class BindingSecGroupInfoSchema(schema.ResponseSchema): + """BindingSecGroupInfo -""" + + fields = { + "Name": fields.Str(required=False, load_from="Name"), + "Priority": fields.Int(required=False, load_from="Priority"), + "SecGroupId": fields.Str(required=False, load_from="SecGroupId"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + } + + +class ResourceExInfoSchema(schema.ResponseSchema): + """ResourceExInfo - 资源额外信息(for 安全组)""" + + fields = { + "EIP": fields.List(fields.Str()), + "IP": fields.List(fields.Str()), + "ResourceName": fields.Str(required=False, load_from="ResourceName"), + "SuperResourceId": fields.Str( + required=True, load_from="SuperResourceId" + ), + "SuperResourceName": fields.Str( + required=False, load_from="SuperResourceName" + ), + "Uni": fields.List(ResourceSecgroupInfoSchema()), + } + + +class ResourceSecgroupInfoExSchema(schema.ResponseSchema): + """ResourceSecgroupInfoEx - 资源绑定的安全组信息。ResourceSecgroupInfoEx 中如果资源是非网卡资源(如云主机)且绑定虚拟网卡, + 则该资源不会绑定安全组,安全组只会绑定到虚拟网卡上;故 Count 为 0,Uni 非空, + Uni 为一个网卡数组,表示每个虚拟网卡绑定的安全组信息。 """ fields = { + "Count": fields.Int(required=True, load_from="Count"), + "ExInfo": ResourceExInfoSchema(), + "PermitAssociate": fields.Bool( + required=True, load_from="PermitAssociate" + ), + "ResourceId": fields.Str(required=True, load_from="ResourceId"), + "ResourceName": fields.Str(required=True, load_from="ResourceName"), + "SecGroupInfo": fields.List(BindingSecGroupInfoSchema()), + } + + +class RouteRuleInfoSchema(schema.ResponseSchema): + """RouteRuleInfo - 路由规则信息""" + + fields = { + "AccountId": fields.Int(required=False, load_from="AccountId"), "DstAddr": fields.Str(required=False, load_from="DstAddr"), + "DstPort": fields.Int(required=False, load_from="DstPort"), + "InstanceType": fields.Str(required=False, load_from="InstanceType"), "NexthopId": fields.Str(required=False, load_from="NexthopId"), "NexthopType": fields.Str(required=False, load_from="NexthopType"), + "OriginAddr": fields.Str(required=False, load_from="OriginAddr"), + "Priority": fields.Int(required=False, load_from="Priority"), "Remark": fields.Str(required=False, load_from="Remark"), "RouteRuleId": fields.Str(required=False, load_from="RouteRuleId"), + "RouteTableId": fields.Str(required=False, load_from="RouteTableId"), "RuleType": fields.Int(required=False, load_from="RuleType"), + "SrcAddr": fields.Str(required=False, load_from="SrcAddr"), + "SrcPort": fields.Int(required=False, load_from="SrcPort"), + "VNetId": fields.Str(required=False, load_from="VNetId"), } class RouteTableInfoSchema(schema.ResponseSchema): - """ RouteTableInfo - 路由表信息 - """ + """RouteTableInfo - 路由表信息""" fields = { "CreateTime": fields.Int(required=False, load_from="CreateTime"), @@ -29,16 +378,89 @@ class RouteTableInfoSchema(schema.ResponseSchema): "RouteTableType": fields.Int( required=False, load_from="RouteTableType" ), - "SubnetCount": fields.Str(required=False, load_from="SubnetCount"), + "SubnetCount": fields.Int(required=False, load_from="SubnetCount"), + "SubnetIds": fields.List(fields.Str()), "Tag": fields.Str(required=False, load_from="Tag"), "VPCId": fields.Str(required=False, load_from="VPCId"), "VPCName": fields.Str(required=False, load_from="VPCName"), } +class SecGroupRuleInfoSchema(schema.ResponseSchema): + """SecGroupRuleInfo - 安全组规则信息""" + + fields = { + "Direction": fields.Str(required=False, load_from="Direction"), + "DstPort": fields.Str(required=False, load_from="DstPort"), + "IPRange": fields.Str(required=False, load_from="IPRange"), + "IPVersion": fields.Str(required=False, load_from="IPVersion"), + "Priority": fields.Int(required=False, load_from="Priority"), + "ProtocolType": fields.Str(required=False, load_from="ProtocolType"), + "Remark": fields.Str(required=False, load_from="Remark"), + "RuleAction": fields.Str(required=False, load_from="RuleAction"), + "RuleId": fields.Str(required=False, load_from="RuleId"), + } + + +class SecGroupInfoSchema(schema.ResponseSchema): + """SecGroupInfo - 安全组信息""" + + fields = { + "Account": fields.Int(required=False, load_from="Account"), + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "Name": fields.Str(required=False, load_from="Name"), + "Remark": fields.Str(required=False, load_from="Remark"), + "Rule": fields.List(SecGroupRuleInfoSchema()), + "SecGroupId": fields.Str(required=False, load_from="SecGroupId"), + "Tag": fields.Str(required=False, load_from="Tag"), + "Type": fields.Str(required=False, load_from="Type"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + } + + +class SecGroupResourceInfoSchema(schema.ResponseSchema): + """SecGroupResourceInfo - 安全组绑定资源信息""" + + fields = { + "Name": fields.Str(required=False, load_from="Name"), + "PrivateIp": fields.Str(required=False, load_from="PrivateIp"), + "ResourceId": fields.Str(required=False, load_from="ResourceId"), + "ResourceType": fields.Str(required=False, load_from="ResourceType"), + "SubResourceId": fields.Str(required=False, load_from="SubResourceId"), + "SubResourceName": fields.Str( + required=False, load_from="SubResourceName" + ), + "SubResourceType": fields.Str( + required=False, load_from="SubResourceType" + ), + "Tag": fields.Str(required=False, load_from="Tag"), + "Zone": fields.Int(required=False, load_from="Zone"), + } + + +class SnatDnatRuleInfoSchema(schema.ResponseSchema): + """SnatDnatRuleInfo -""" + + fields = { + "EIP": fields.Str(required=False, load_from="EIP"), + "NATGWId": fields.Str(required=False, load_from="NATGWId"), + "PrivateIp": fields.Str(required=False, load_from="PrivateIp"), + } + + +class NATGWSnatRuleSchema(schema.ResponseSchema): + """NATGWSnatRule - Nat网关的Snat规则""" + + fields = { + "Name": fields.Str(required=True, load_from="Name"), + "SnatIp": fields.Str(required=True, load_from="SnatIp"), + "SourceIp": fields.Str(required=True, load_from="SourceIp"), + "SubnetworkId": fields.Str(required=True, load_from="SubnetworkId"), + } + + class SubnetInfoSchema(schema.ResponseSchema): - """ SubnetInfo - 子网信息 - """ + """SubnetInfo - 子网信息""" fields = { "AvailableIPs": fields.Int(required=False, load_from="AvailableIPs"), @@ -61,28 +483,47 @@ class SubnetInfoSchema(schema.ResponseSchema): class SubnetResourceSchema(schema.ResponseSchema): - """ SubnetResource - 子网下资源 - """ + """SubnetResource - 子网下资源""" fields = { "IP": fields.Str(required=False, load_from="IP"), - "IPv6Address": fields.Str(required=False, load_from="IPv6Address"), + "IPv6Address": fields.Str( + required=False, load_from="IPv6Address" + ), # Deprecated, will be removed at 1.0 "Name": fields.Str(required=False, load_from="Name"), "ResourceId": fields.Str(required=False, load_from="ResourceId"), "ResourceType": fields.Str(required=False, load_from="ResourceType"), - "SubResourceId": fields.Str(required=False, load_from="SubResourceId"), + "SubResourceId": fields.Str( + required=False, load_from="SubResourceId" + ), # Deprecated, will be removed at 1.0 "SubResourceName": fields.Str( required=False, load_from="SubResourceName" - ), + ), # Deprecated, will be removed at 1.0 "SubResourceType": fields.Str( required=False, load_from="SubResourceType" - ), + ), # Deprecated, will be removed at 1.0 + } + + +class VIPDetailSetSchema(schema.ResponseSchema): + """VIPDetailSet - VIPDetailSet""" + + fields = { + "CreateTime": fields.Int(required=False, load_from="CreateTime"), + "Name": fields.Str(required=False, load_from="Name"), + "RealIp": fields.Str(required=False, load_from="RealIp"), + "Remark": fields.Str(required=False, load_from="Remark"), + "SubnetId": fields.Str(required=False, load_from="SubnetId"), + "Tag": fields.Str(required=False, load_from="Tag"), + "VIP": fields.Str(required=False, load_from="VIP"), + "VIPId": fields.Str(required=False, load_from="VIPId"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + "Zone": fields.Str(required=False, load_from="Zone"), } class VPCNetworkInfoSchema(schema.ResponseSchema): - """ VPCNetworkInfo - vpc地址空间信息 - """ + """VPCNetworkInfo - vpc地址空间信息""" fields = { "Network": fields.Str(required=False, load_from="Network"), @@ -91,8 +532,7 @@ class VPCNetworkInfoSchema(schema.ResponseSchema): class VPCInfoSchema(schema.ResponseSchema): - """ VPCInfo - VPC信息 - """ + """VPCInfo - VPC信息""" fields = { "CreateTime": fields.Int(required=True, load_from="CreateTime"), @@ -105,18 +545,107 @@ class VPCInfoSchema(schema.ResponseSchema): "Tag": fields.Str(required=True, load_from="Tag"), "UpdateTime": fields.Int(required=True, load_from="UpdateTime"), "VPCId": fields.Str(required=False, load_from="VPCId"), + "VPCType": fields.Str(required=False, load_from="VPCType"), } class VPCIntercomInfoSchema(schema.ResponseSchema): - """ VPCIntercomInfo - - """ + """VPCIntercomInfo -""" fields = { + "AccountId": fields.Int(required=True, load_from="AccountId"), "DstRegion": fields.Str(required=False, load_from="DstRegion"), "Name": fields.Str(required=False, load_from="Name"), "Network": fields.List(fields.Str()), "ProjectId": fields.Str(required=False, load_from="ProjectId"), "Tag": fields.Str(required=False, load_from="Tag"), "VPCId": fields.Str(required=False, load_from="VPCId"), + "VPCType": fields.Int(required=True, load_from="VPCType"), + } + + +class DescribeWhiteListResourceObjectIPInfoSchema(schema.ResponseSchema): + """DescribeWhiteListResourceObjectIPInfo - DescribeWhiteListResource""" + + fields = { + "GwType": fields.Str(required=True, load_from="GwType"), + "PrivateIP": fields.Str(required=True, load_from="PrivateIP"), + "ResourceId": fields.Str(required=True, load_from="ResourceId"), + "ResourceName": fields.Str(required=True, load_from="ResourceName"), + "ResourceType": fields.Str(required=True, load_from="ResourceType"), + "SubResourceId": fields.Str(required=True, load_from="SubResourceId"), + "SubResourceName": fields.Str( + required=True, load_from="SubResourceName" + ), + "SubResourceType": fields.Str( + required=True, load_from="SubResourceType" + ), + "VPCId": fields.Str(required=False, load_from="VPCId"), + } + + +class NatGWWhitelistDataSetSchema(schema.ResponseSchema): + """NatGWWhitelistDataSet - nat网关白名单数据""" + + fields = { + "IfOpen": fields.Int(required=True, load_from="IfOpen"), + "NATGWId": fields.Str(required=True, load_from="NATGWId"), + "ObjectIPInfo": fields.List( + DescribeWhiteListResourceObjectIPInfoSchema() + ), + } + + +class GetAvailableResourceForPolicyDataSetSchema(schema.ResponseSchema): + """GetAvailableResourceForPolicyDataSet - GetAvailableResourceForPolicy""" + + fields = { + "PrivateIP": fields.Str(required=True, load_from="PrivateIP"), + "ResourceId": fields.Str(required=True, load_from="ResourceId"), + "ResourceType": fields.Str(required=True, load_from="ResourceType"), + } + + +class GetAvailableResourceForSnatRuleDataSetSchema(schema.ResponseSchema): + """GetAvailableResourceForSnatRuleDataSet -""" + + fields = { + "PrivateIP": fields.Str(required=False, load_from="PrivateIP"), + "ResourceId": fields.Str(required=False, load_from="ResourceId"), + "ResourceName": fields.Str(required=False, load_from="ResourceName"), + "ResourceType": fields.Str(required=False, load_from="ResourceType"), + "SubnetworkId": fields.Str(required=False, load_from="SubnetworkId"), + "VPCId": fields.Str(required=False, load_from="VPCId"), + } + + +class GetAvailableResourceForWhiteListDataSetSchema(schema.ResponseSchema): + """GetAvailableResourceForWhiteListDataSet - GetAvailableResourceForWhiteList""" + + fields = { + "PrivateIP": fields.Str(required=True, load_from="PrivateIP"), + "ResourceId": fields.Str(required=True, load_from="ResourceId"), + "ResourceName": fields.Str(required=True, load_from="ResourceName"), + "ResourceType": fields.Str(required=True, load_from="ResourceType"), + "SubResourceId": fields.Str(required=False, load_from="SubResourceId"), + "SubResourceName": fields.Str( + required=True, load_from="SubResourceName" + ), + "SubResourceType": fields.Str( + required=False, load_from="SubResourceType" + ), + "SubnetworkId": fields.Str(required=True, load_from="SubnetworkId"), + "VPCId": fields.Str(required=True, load_from="VPCId"), + } + + +class NatgwSubnetDataSetSchema(schema.ResponseSchema): + """NatgwSubnetDataSet - natgw可以绑定的子网""" + + fields = { + "HasNATGW": fields.Bool(required=True, load_from="HasNATGW"), + "Netmask": fields.Str(required=True, load_from="Netmask"), + "Subnet": fields.Str(required=True, load_from="Subnet"), + "SubnetId": fields.Str(required=True, load_from="SubnetId"), + "SubnetName": fields.Str(required=True, load_from="SubnetName"), } diff --git a/ucloud/testing/driver/_step.py b/ucloud/testing/driver/_step.py index 8afd423c..077f8391 100644 --- a/ucloud/testing/driver/_step.py +++ b/ucloud/testing/driver/_step.py @@ -23,7 +23,7 @@ def __init__( title: str = "", **kwargs ): - """ Step is the test step in a test scenario + """Step is the test step in a test scenario :param invoker: invoker is a callable function :param max_retries: the maximum retry number by the `retry_for` exception, it will resolve the flaky testing case diff --git a/ucloud/testing/env.py b/ucloud/testing/env.py index 96a886dd..f695590c 100644 --- a/ucloud/testing/env.py +++ b/ucloud/testing/env.py @@ -9,17 +9,17 @@ def get_skip_reason(): def is_acc() -> bool: - """ check test env is acceptance testing or not """ + """check test env is acceptance testing or not""" return os.getenv(ACC_ENV_KEY) def is_ut() -> bool: - """ check test env is unit testing or not """ + """check test env is unit testing or not""" return not is_acc() def pre_check_env(): - """ pre check environment for testing + """pre check environment for testing NOTE: system environment variables credential is required for test environment """ diff --git a/ucloud/testing/funcs.py b/ucloud/testing/funcs.py index 832fdf36..1f0af0a7 100644 --- a/ucloud/testing/funcs.py +++ b/ucloud/testing/funcs.py @@ -3,7 +3,7 @@ def concat(*args): - """ cancat strings + """cancat strings >>> concat(42, 'foo', 'bar') '42foobar' @@ -12,7 +12,7 @@ def concat(*args): def concat_without_dot(args): - """ replace blank + """replace blank >>> concat_without_dot('42foo bar') '42foobar' @@ -21,7 +21,7 @@ def concat_without_dot(args): def search_value(array, origin_key, origin_value, dest_key): - """ given origin key and value,search dest_value form array by dest_key + """given origin key and value,search dest_value form array by dest_key >>> d = [{"UHostId": "foo", "Name": "testing"}] >>> search_value(d, "Name", "testing", "UHostId") @@ -34,7 +34,7 @@ def search_value(array, origin_key, origin_value, dest_key): def timedelta(timestamp, value, typ="days"): - """ given timestamp(10bit) and calculate relative delta time + """given timestamp(10bit) and calculate relative delta time >>> timedelta(0, 1, "days") 86400.0 @@ -54,7 +54,7 @@ def timedelta(timestamp, value, typ="days"): def get_timestamp(length=13): - """ get current timestamp string + """get current timestamp string >>> len(str(int(get_timestamp(10)))) 10 diff --git a/ucloud/testing/op.py b/ucloud/testing/op.py index 3b4f0e49..77c8df52 100644 --- a/ucloud/testing/op.py +++ b/ucloud/testing/op.py @@ -4,103 +4,87 @@ def eq(value, expected): - """ value is equal to expected - """ + """value is equal to expected""" assert value == expected def ne(value, expected): - """ value is equal to expected - """ + """value is equal to expected""" assert value != expected def gt(value, expected): - """ value is greater than expected - """ + """value is greater than expected""" assert float(value) > float(expected) def ge(value, expected): - """ value is greater than or equal to expected - """ + """value is greater than or equal to expected""" assert float(value) >= float(expected) def abs_eq(value, expected): - """ value is approx equal to expected - """ + """value is approx equal to expected""" assert round(float(value), 2) == round(float(expected), 2) def lt(value, expected): - """ value is less than excepted - """ + """value is less than excepted""" assert float(value) < float(expected) def le(value, expected): - """ value is less than or equal to excepted - """ + """value is less than or equal to excepted""" assert float(value) <= float(expected) def str_eq(value, expected): - """ value is equal to excepted as string - """ + """value is equal to excepted as string""" assert str(value) == str(expected) def float_eq(value, expected): - """ value is equal to excepted as float - """ + """value is equal to excepted as float""" assert round(float(value), 2) == round(float(expected), 2) def len_eq(value, expected): - """ length of value is equal to excepted - """ + """length of value is equal to excepted""" assert isinstance(expected, int) assert len(value) == expected def len_gt(value, expected): - """ length of value is greater than excepted - """ + """length of value is greater than excepted""" assert isinstance(expected, int) assert len(value) > expected def len_ge(value, expected): - """ length of value is greater than or equal to excepted - """ + """length of value is greater than or equal to excepted""" assert isinstance(expected, int) assert len(value) >= expected def len_lt(value, expected): - """ length of value is less than excepted - """ + """length of value is less than excepted""" assert isinstance(expected, int) assert len(value) < expected def len_le(value, expected): - """ length of value is less than or equal to excepted - """ + """length of value is less than or equal to excepted""" assert isinstance(expected, int) assert len(value) <= expected def contains(value, expected): - """ value is contains expected - """ + """value is contains expected""" assert expected in value def contained_by(value, expected): - """ value is contained by expected - """ + """value is contained by expected""" assert value in expected diff --git a/ucloud/testing/utest.py b/ucloud/testing/utest.py index 14ed98ad..30feabb5 100644 --- a/ucloud/testing/utest.py +++ b/ucloud/testing/utest.py @@ -21,7 +21,7 @@ def __init__( validators: typing.Callable[[dict], typing.List[typing.Tuple]] = None, **kwargs ): - """ Step is the test step in a test scenario + """Step is the test step in a test scenario :param invoker: invoker is a callable function :param max_retries: the maximum retry number by the `retry_for` exception, it will resolve the flaky testing case @@ -161,7 +161,7 @@ def initial(self, variables: typing.Optional[dict] = None): def value_at_path(d: dict, path: str): - """ access value by object path + """access value by object path :param d: dict or list of dict :param path: object path like `Data.1.UHostId` diff --git a/ucloud/version.py b/ucloud/version.py index 197e2a28..c34a0d96 100644 --- a/ucloud/version.py +++ b/ucloud/version.py @@ -1 +1 @@ -version = "0.9.1" +version = "0.11.101"