Skip to content

Commit 06e398e

Browse files
yufeimindslizhenfu100
authored andcommitted
Feature/typesystem enhancement (#4)
* migrate from python3 sdk * migrate from python3 sdk
1 parent 8264e52 commit 06e398e

File tree

52 files changed

+2540
-1893
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+2540
-1893
lines changed

docs/quick_start.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ You can then use your keys to create a new client of uhost service:
5353
'Type': 'CLOUD_SSD'
5454
}],
5555
})
56-
except exc.UCloudException as e
56+
except exc.UCloudException as e:
5757
print(e)
5858
else:
5959
print(resp)

examples/uhost/main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def main():
3636
'Memory': 1024,
3737
'Disks': [{
3838
'Size': image["ImageSize"],
39-
'Type': 'CLOUD_NORMAL',
39+
'Type': 'CLOUD_SSD',
4040
'IsBoot': 'True',
4141
}],
4242
})

tests/test_core/test_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import pytest
55
import logging
66
from ucloud.core.client import Client
7-
from ucloud.core.testing import env
7+
from ucloud.testing import env
88

99
logger = logging.getLogger(__name__)
1010

tests/test_core/test_schema.py

Lines changed: 114 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,131 @@
11
# -*- coding: utf-8 -*-
22

33
import logging
4+
import pytest
5+
from ucloud.core import exc
46
from ucloud.core.typesystem import fields, schema
57

68
logger = logging.getLogger(__name__)
79

810

9-
def test_array():
10-
class TestSchema(schema.RequestSchema):
11+
def test_request_array():
12+
class Schema(schema.RequestSchema):
1113
fields = {"IP": fields.List(fields.Str())}
1214

13-
ret = TestSchema().dumps({"IP": ["127.0.0.1"]})
14-
assert ret.get("IP.0") == "127.0.0.1"
15-
assert ret.get("IP") is None
16-
assert ret.get("IP.1") is None
15+
d = Schema().dumps({"IP": ["127.0.0.1"]})
16+
assert d == {"IP.0": "127.0.0.1"}
17+
d = Schema().dumps({})
18+
assert d == {}
1719

1820

19-
def test_array_model():
20-
class TestSchema(schema.RequestSchema):
21+
def test_request_array_with_default():
22+
class Schema(schema.RequestSchema):
2123
fields = {"IP": fields.List(fields.Str(), default=["127.0.0.1"])}
2224

23-
class TestArrayModel(schema.RequestSchema):
24-
fields = {"Interface": TestSchema()}
25+
d = Schema().dumps({"IP": ["192.168.0.1"]})
26+
assert d == {"IP.0": "192.168.0.1"}
27+
d = Schema().dumps({})
28+
assert d == {"IP.0": "127.0.0.1"}
2529

26-
class TestArrayModelArray(schema.RequestSchema):
27-
fields = {"Interface": fields.List(TestSchema(), default=list)}
2830

29-
d = {"Interface": {"IP": ["127.0.0.1", "192.168.0.1"]}}
30-
ret = TestArrayModel().dumps(d)
31-
assert ret.get("Interface.IP.0") == "127.0.0.1"
32-
assert ret.get("Interface.IP.1") == "192.168.0.1"
31+
def test_request_object_model():
32+
class Schema(schema.RequestSchema):
33+
fields = {"IP": fields.List(fields.Str())}
34+
35+
class NestedObjectSchema(schema.RequestSchema):
36+
fields = {"Interface": Schema()}
37+
38+
d = NestedObjectSchema().dumps({"Interface": {"IP": ["127.0.0.1"]}})
39+
assert d == {"Interface.IP.0": "127.0.0.1"}
40+
with pytest.raises(exc.ValidationException):
41+
NestedObjectSchema().dumps({"Interface": 1})
42+
43+
44+
def test_request_array_model_with_default():
45+
class Schema(schema.RequestSchema):
46+
fields = {"IP": fields.List(fields.Str())}
47+
48+
class NestedArraySchema(schema.RequestSchema):
49+
fields = {
50+
"Interface": fields.List(
51+
Schema(default=lambda: "127.0.0.1"),
52+
default=lambda: [{"IP": ["192.168.1.1"]}],
53+
)
54+
}
55+
56+
d = NestedArraySchema().dumps({})
57+
assert d == {"Interface.0.IP.0": "192.168.1.1"}
58+
d = {"Interface": [{"IP": ["127.0.0.1", "192.168.0.1"]}, {"IP": ["172.16.0.1"]}]}
59+
d = NestedArraySchema().dumps(d)
60+
assert d == {
61+
"Interface.0.IP.0": "127.0.0.1",
62+
"Interface.0.IP.1": "192.168.0.1",
63+
"Interface.1.IP.0": "172.16.0.1",
64+
}
65+
66+
67+
def test_response_array():
68+
class Schema(schema.ResponseSchema):
69+
fields = {"IP": fields.List(fields.Str())}
70+
71+
d = Schema().loads({})
72+
assert d == {"IP": []}
73+
d = Schema().loads({"IP": ["127.0.0.1"]})
74+
assert d == {"IP": ["127.0.0.1"]}
75+
with pytest.raises(exc.ValidationException):
76+
Schema().loads({"IP": 1})
77+
78+
79+
def test_response_array_with_default():
80+
class Schema(schema.ResponseSchema):
81+
fields = {"IP": fields.List(fields.Str(), default=["127.0.0.1"])}
82+
83+
d = Schema().dumps({"IP": ["192.168.0.1"]})
84+
assert d == {"IP": ["192.168.0.1"]}
85+
d = Schema().dumps({})
86+
assert d == {"IP": ["127.0.0.1"]}
87+
88+
89+
def test_response_object_model():
90+
class Schema(schema.ResponseSchema):
91+
fields = {"IP": fields.List(fields.Str())}
92+
93+
class NestedObjectSchema(schema.ResponseSchema):
94+
fields = {"EIP": Schema()}
95+
96+
d = NestedObjectSchema().loads({"EIP": {"IP": ["127.0.0.1"]}})
97+
assert d == {"EIP": {"IP": ["127.0.0.1"]}}
98+
d = NestedObjectSchema().loads({})
99+
assert d == {"EIP": {"IP": []}}
100+
101+
102+
def test_response_object_model_case_insensitive():
103+
class Schema(schema.ResponseSchema):
104+
fields = {"IP": fields.List(fields.Str())}
105+
106+
class NestedObjectSchema(schema.ResponseSchema):
107+
fields = {"EIP": Schema()}
108+
109+
d = NestedObjectSchema().loads({"eip": {"Ip": ["127.0.0.1"]}})
110+
assert d == {"EIP": {"IP": ["127.0.0.1"]}}
111+
112+
113+
def test_response_array_model_with_default():
114+
class Schema(schema.ResponseSchema):
115+
fields = {"IP": fields.List(fields.Str())}
116+
117+
class NestedArraySchema(schema.ResponseSchema):
118+
fields = {
119+
"Interface": fields.List(
120+
Schema(default=lambda: {"IP": ["127.0.0.1"]}),
121+
default=lambda: [{"IP": ["192.168.1.1"]}],
122+
)
123+
}
124+
125+
d = NestedArraySchema().dumps({})
126+
assert d == {"Interface": [{"IP": ["192.168.1.1"]}]}
33127
d = {"Interface": [{"IP": ["127.0.0.1", "192.168.0.1"]}, {"IP": ["172.16.0.1"]}]}
34-
ret = TestArrayModelArray().dumps(d)
35-
assert ret.get("Interface.0.IP.0") == "127.0.0.1"
36-
assert ret.get("Interface.0.IP.1") == "192.168.0.1"
37-
assert ret.get("Interface.1.IP.0") == "172.16.0.1"
38-
d = {}
39-
ret = TestArrayModelArray().dumps(d)
40-
assert ret.get("Interface") is None
41-
d = {"Interface": [{"IP": None}]}
42-
ret = TestArrayModelArray().dumps(d)
43-
assert ret.get("Interface.0.IP.0") == "127.0.0.1"
44-
d = {"Interface": [{}]}
45-
ret = TestArrayModelArray().dumps(d)
46-
assert ret.get("Interface.0.IP.0") == "127.0.0.1"
128+
d = NestedArraySchema().dumps(d)
129+
assert d == {
130+
"Interface": [{"IP": ["127.0.0.1", "192.168.0.1"]}, {"IP": ["172.16.0.1"]}]
131+
}

tests/test_services/conftest.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# -*- coding: utf-8 -*-
2+
3+
import os
4+
import pytest
5+
from ucloud.client import Client
6+
7+
8+
@pytest.fixture(scope="session", autouse=True)
9+
def client():
10+
return Client(
11+
{
12+
"region": os.getenv("UCLOUD_REGION"),
13+
"project_id": os.getenv("UCLOUD_PROJECT_ID"),
14+
"public_key": os.getenv("UCLOUD_PUBLIC_KEY"),
15+
"private_key": os.getenv("UCLOUD_PRIVATE_KEY"),
16+
"max_retries": 3,
17+
"timeout": 60,
18+
}
19+
)
20+
21+
22+
@pytest.fixture(scope="module", autouse=True)
23+
def variables():
24+
return {
25+
"Region": "cn-bj2",
26+
"Zone": "cn-bj2-05",
27+
"ProjectId": os.getenv("UCLOUD_PROJECT_ID"),
28+
}

tests/test_testing/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# -*- coding: utf-8 -*-

tests/test_testing/test_utest.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# -*- coding: utf-8 -*-
2+
3+
import pytest
4+
from ucloud.testing import utest
5+
6+
7+
def test_value_at_path():
8+
d = {
9+
"Action": "DescribeEIPResponse",
10+
"EIPSet": [
11+
{
12+
"Resource": {
13+
"ResourceID": "uhost-war3png3",
14+
"ResourceName": "eip-s1-bgp",
15+
"ResourceType": "uhost",
16+
"Zone": "cn-bj2-05",
17+
}
18+
}
19+
],
20+
"RetCode": 0,
21+
"TotalBandwidth": 6,
22+
"TotalCount": 3,
23+
}
24+
assert utest.value_at_path(d, "EIPSet.0.Resource.ResourceID") == "uhost-war3png3"

ucloud/client.py

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# -*- coding: utf-8 -*-
22

3+
""" Code is generated by ucloud-model, DO NOT EDIT IT. """
34
from ucloud.core import client
45

56

@@ -8,15 +9,10 @@ def __init__(self, config, transport=None, middleware=None):
89
self._config = config
910
super(Client, self).__init__(config, transport, middleware)
1011

11-
def umem(self):
12-
from ucloud.services.umem.client import UMemClient
13-
14-
return UMemClient(self._config, self.transport, self.middleware, self.logger)
15-
16-
def unet(self):
17-
from ucloud.services.unet.client import UNetClient
12+
def pathx(self):
13+
from ucloud.services.pathx.client import PathXClient
1814

19-
return UNetClient(self._config, self.transport, self.middleware, self.logger)
15+
return PathXClient(self._config, self.transport, self.middleware, self.logger)
2016

2117
def uaccount(self):
2218
from ucloud.services.uaccount.client import UAccountClient
@@ -25,25 +21,40 @@ def uaccount(self):
2521
self._config, self.transport, self.middleware, self.logger
2622
)
2723

28-
def udisk(self):
29-
from ucloud.services.udisk.client import UDiskClient
24+
def udb(self):
25+
from ucloud.services.udb.client import UDBClient
3026

31-
return UDiskClient(self._config, self.transport, self.middleware, self.logger)
27+
return UDBClient(self._config, self.transport, self.middleware, self.logger)
3228

3329
def udpn(self):
3430
from ucloud.services.udpn.client import UDPNClient
3531

3632
return UDPNClient(self._config, self.transport, self.middleware, self.logger)
3733

34+
def udisk(self):
35+
from ucloud.services.udisk.client import UDiskClient
36+
37+
return UDiskClient(self._config, self.transport, self.middleware, self.logger)
38+
3839
def uhost(self):
3940
from ucloud.services.uhost.client import UHostClient
4041

4142
return UHostClient(self._config, self.transport, self.middleware, self.logger)
4243

43-
def pathx(self):
44-
from ucloud.services.pathx.client import PathXClient
44+
def ulb(self):
45+
from ucloud.services.ulb.client import ULBClient
4546

46-
return PathXClient(self._config, self.transport, self.middleware, self.logger)
47+
return ULBClient(self._config, self.transport, self.middleware, self.logger)
48+
49+
def umem(self):
50+
from ucloud.services.umem.client import UMemClient
51+
52+
return UMemClient(self._config, self.transport, self.middleware, self.logger)
53+
54+
def unet(self):
55+
from ucloud.services.unet.client import UNetClient
56+
57+
return UNetClient(self._config, self.transport, self.middleware, self.logger)
4758

4859
def uphost(self):
4960
from ucloud.services.uphost.client import UPHostClient
@@ -54,13 +65,3 @@ def vpc(self):
5465
from ucloud.services.vpc.client import VPCClient
5566

5667
return VPCClient(self._config, self.transport, self.middleware, self.logger)
57-
58-
def udb(self):
59-
from ucloud.services.udb.client import UDBClient
60-
61-
return UDBClient(self._config, self.transport, self.middleware, self.logger)
62-
63-
def ulb(self):
64-
from ucloud.services.ulb.client import ULBClient
65-
66-
return ULBClient(self._config, self.transport, self.middleware, self.logger)

ucloud/core/client/_client.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,10 @@ def _build_http_request(self, args):
9393
return Request(
9494
url=self.config.base_url,
9595
method="post",
96-
json=payload,
96+
data=payload,
9797
headers={
9898
"User-Agent": self._build_user_agent(),
99-
"Content-Type": "application/json",
99+
"Content-Type": "application/x-www-form-urlencoded",
100100
},
101101
)
102102

@@ -106,3 +106,6 @@ def _build_user_agent(self):
106106
python_version=python_version, sdk_version=version.version
107107
) + (self.config.user_agent or "")
108108
return user_agent
109+
110+
def __repr__(self):
111+
return "<{}('{}')>".format(self.__class__.__name__, self.config.region)

ucloud/core/exc/_exc.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ def retryable(self):
2626
def __str__(self):
2727
return "{self.action} - {self.code}: {self.message}".format(self=self)
2828

29+
def json(self):
30+
return {"RetCode": self.code, "Message": self.message, "Action": self.action}
31+
2932

3033
class RetryTimeoutException(UCloudException):
3134
pass

0 commit comments

Comments
 (0)