Skip to content

Commit e3b875f

Browse files
Qingtang-SDKJacksonTian
authored andcommitted
修正endpoint resolver相关测试;测试能够自动创建RAM相关环境 (aliyun#160)
* fix functional tests * fix a line too long * using unittest2 instead * make travis job concurrent * make test case available for other regions * make a long timeout * reduce ram access * use unittest2 in python2.6; make Codacy happy * use pytest instead of unittest to run functional test
1 parent 9586693 commit e3b875f

File tree

7 files changed

+220
-81
lines changed

7 files changed

+220
-81
lines changed

aliyun-python-sdk-core/aliyunsdkcore/auth/signers/ram_role_arn_signer.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
from aliyunsdkcore.auth.credentials import RamRoleArnCredential
3030
from aliyunsdkcore.auth.credentials import AccessKeyCredential
3131
from aliyunsdkcore.request import CommonRequest
32+
from aliyunsdkcore.compat import ensure_string
3233

3334

3435
class RamRoleArnSigner(Signer):
@@ -84,7 +85,7 @@ def _refresh_session_ak_and_sk(self):
8485
self._last_update_time = int(time.time())
8586
else:
8687
code = error_code.SDK_GET_SESSION_CREDENTIAL_FAILED
87-
message = "refresh session token failed, server return: " + body
88+
message = "refresh session token failed, server return: " + ensure_string(body)
8889
http_status = status
8990

9091
raise exceptions.ServerException(code, message, http_status)

python-sdk-functional-test/base.py

Lines changed: 154 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,17 @@
1919

2020
import sys
2121
from aliyunsdkcore.client import AcsClient
22+
from aliyunsdkcore.vendored.six import iteritems
23+
from aliyunsdkcore.acs_exception.exceptions import ServerException
24+
25+
from aliyunsdkram.request.v20150501.ListUsersRequest import ListUsersRequest
26+
from aliyunsdkram.request.v20150501.CreateUserRequest import CreateUserRequest
27+
from aliyunsdkram.request.v20150501.CreateAccessKeyRequest import CreateAccessKeyRequest
28+
from aliyunsdkram.request.v20150501.DeleteAccessKeyRequest import DeleteAccessKeyRequest
29+
from aliyunsdkram.request.v20150501.ListAccessKeysRequest import ListAccessKeysRequest
30+
from aliyunsdkram.request.v20150501.ListRolesRequest import ListRolesRequest
31+
from aliyunsdkram.request.v20150501.CreateRoleRequest import CreateRoleRequest
32+
from aliyunsdkram.request.v20150501.AttachPolicyToUserRequest import AttachPolicyToUserRequest
2233

2334

2435
# The unittest module got a significant overhaul
@@ -30,6 +41,36 @@
3041
from unittest import TestCase
3142

3243

44+
def request_helper(client, request, **params):
45+
for key, value in iteritems(params):
46+
set_name = 'set_' + key
47+
if hasattr(request, set_name):
48+
func = getattr(request, set_name)
49+
func(value)
50+
else:
51+
raise Exception(
52+
"{0} has no parameter named {1}.".format(request.__class__.__name__, key))
53+
response = client.do_action_with_exception(request)
54+
return json.loads(response.decode('utf-8'))
55+
56+
57+
def _check_server_response(obj, key):
58+
if key not in obj:
59+
raise Exception("No '{0}' in server response.".format(key))
60+
61+
62+
def find_in_response(response, key=None, keys=None):
63+
if key:
64+
_check_server_response(response, key)
65+
return response[key]
66+
if keys:
67+
obj = response
68+
for key in keys:
69+
_check_server_response(obj, key)
70+
obj = obj[key]
71+
return obj
72+
73+
3374
class SDKTestBase(TestCase):
3475

3576
def __init__(self, *args, **kwargs):
@@ -46,9 +87,20 @@ def _init_env(self):
4687
self._sdk_config = self._init_sdk_config()
4788
self.access_key_id = self._read_key_from_env_or_config("ACCESS_KEY_ID")
4889
self.access_key_secret = self._read_key_from_env_or_config("ACCESS_KEY_SECRET")
49-
self.sub_access_key_id = self._read_key_from_env_or_config("SUB_ACCESS_KEY_ID")
50-
self.sub_access_key_secret = self._read_key_from_env_or_config("SUB_ACCESS_KEY_SECRET")
5190
self.region_id = self._read_key_from_env_or_config("REGION_ID")
91+
self.user_id = self._read_key_from_env_or_config("USER_ID")
92+
if 'TRAVIS_JOB_NUMBER' in os.environ:
93+
self.travis_concurrent = os.environ.get('TRAVIS_JOB_NUMBER').split(".")[-1]
94+
else:
95+
self.travis_concurrent = "0"
96+
self.default_ram_user_name = "RamUserForSDKCredentialsTest" + self.travis_concurrent
97+
self.default_ram_role_name = "RamROleForSDKTest" + self.travis_concurrent
98+
self.default_role_session_name = "RoleSession" + self.travis_concurrent
99+
self.ram_user_id = None
100+
self.ram_policy_attched = False
101+
self.ram_user_access_key_id = None
102+
self.ram_user_access_key_secret = None
103+
self.ram_role_arn = None
52104

53105
def _init_sdk_config(self):
54106
sdk_config_path = os.path.join(os.path.expanduser("~"), "aliyun_sdk_config.json")
@@ -65,25 +117,119 @@ def _read_key_from_env_or_config(self, key_name):
65117
raise Exception("Failed to find sdk config: " + key_name)
66118

67119
def setUp(self):
120+
TestCase.setUp(self)
68121
self.client = self.init_client()
69122

123+
def tearDown(self):
124+
pass
125+
70126
def init_client(self, region_id=None):
71127
if not region_id:
72128
region_id = self.region_id
73-
return AcsClient(self.access_key_id, self.access_key_secret, region_id)
74-
75-
def init_sub_client(self):
76-
return AcsClient(self.sub_access_key_id, self.sub_access_key_secret, self.region_id)
129+
return AcsClient(self.access_key_id, self.access_key_secret, region_id, timeout=120)
77130

78131
@staticmethod
79132
def get_dict_response(string):
80133
return json.loads(string.decode('utf-8'), encoding="utf-8")
81134

135+
def _create_default_ram_user(self):
136+
if self.ram_user_id:
137+
return
138+
response = request_helper(self.client, ListUsersRequest())
139+
user_list = find_in_response(response, keys=['Users', 'User'])
140+
for user in user_list:
141+
if user['UserName'] == self.default_ram_user_name:
142+
self.ram_user_id = user["UserId"]
143+
return
144+
145+
response = request_helper(self.client, CreateUserRequest(),
146+
UserName=self.default_ram_user_name)
147+
self.ram_user_id = find_in_response(response, keys=['User', 'UserId'])
148+
149+
def _attach_default_policy(self):
150+
if self.ram_policy_attched:
151+
return
152+
153+
try:
154+
request_helper(self.client, AttachPolicyToUserRequest(),
155+
PolicyType='System', PolicyName='AliyunSTSAssumeRoleAccess',
156+
UserName=self.default_ram_user_name)
157+
except ServerException as e:
158+
if e.get_error_code() == 'EntityAlreadyExists.User.Policy':
159+
pass
160+
else:
161+
raise e
162+
163+
self.ram_policy_attched = True
164+
165+
def _create_access_key(self):
166+
if self.ram_user_access_key_id and self.ram_user_access_key_secret:
167+
return
168+
169+
response = request_helper(self.client, ListAccessKeysRequest(),
170+
UserName=self.default_ram_user_name)
171+
for access_key in find_in_response(response, keys=['AccessKeys', 'AccessKey']):
172+
access_key_id = access_key['AccessKeyId']
173+
request_helper(self.client, DeleteAccessKeyRequest(),
174+
UserAccessKeyId=access_key_id,
175+
UserName=self.default_ram_user_name)
176+
177+
response = request_helper(self.client, CreateAccessKeyRequest(),
178+
UserName=self.default_ram_user_name)
179+
self.ram_user_access_key_id = find_in_response(response, keys=['AccessKey', 'AccessKeyId'])
180+
self.ram_user_access_key_secret = find_in_response(
181+
response,
182+
keys=['AccessKey', 'AccessKeySecret'])
183+
184+
def _delete_access_key(self):
185+
request_helper(self.client, DeleteAccessKeyRequest(),
186+
UserName=self.default_ram_user_name,
187+
UserAccessKeyId=self.ram_user_access_key_id)
188+
189+
def init_sub_client(self):
190+
self._create_default_ram_user()
191+
self._attach_default_policy()
192+
self._create_access_key()
193+
return AcsClient(self.ram_user_access_key_id,
194+
self.ram_user_access_key_secret,
195+
self.region_id, timeout=120)
196+
197+
def _create_default_ram_role(self):
198+
if self.ram_role_arn:
199+
return
200+
response = request_helper(self.client, ListRolesRequest())
201+
for role in find_in_response(response, keys=['Roles', 'Role']):
202+
role_name = role['RoleName']
203+
role_arn = role['Arn']
204+
if role_name == self.default_ram_role_name:
205+
self.ram_role_arn = role_arn
206+
return
207+
208+
policy_doc = """
209+
{
210+
"Statement": [
211+
{
212+
"Action": "sts:AssumeRole",
213+
"Effect": "Allow",
214+
"Principal": {
215+
"RAM": [
216+
"acs:ram::%s:root"
217+
]
218+
}
219+
}
220+
],
221+
"Version": "1"
222+
}
223+
""" % self.user_id
224+
225+
response = request_helper(self.client, CreateRoleRequest(),
226+
RoleName=self.default_ram_role_name,
227+
AssumeRolePolicyDocument=policy_doc)
228+
self.ram_role_arn = find_in_response(response, keys=['Role', 'Arn'])
229+
82230

83231
def disabled(func):
84232
def _decorator(func):
85233
pass
86234
return _decorator
87235

88-
89-

python-sdk-functional-test/bugs_test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def test_bug_with_18034796(self):
2929
request.set_content(json.dumps({"tasks": [task1], "scenes": ["porn"]}))
3030
response = self.client.do_action_with_exception(request)
3131
response = self.get_dict_response(response)
32-
self.assertTrue(response.get("code") == 200)
32+
self.assertEqual(200, response.get("code"))
3333

3434
def test_bug_with_17661113(self):
3535
request = CommonRequest()

python-sdk-functional-test/core_test.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,13 @@ def test_roa_with_common_request(self):
3535
self.assertTrue(ret.get("ResourceTypes"))
3636

3737
def test_rpc_common_request_with_sts_token(self):
38-
# create AssumeRole request ,Acquire a temporary ak
39-
request = AssumeRoleRequest()
40-
# the role must exist
41-
# FIXME : the RoleArn must according to user's setting
42-
request.set_RoleArn("acs:ram::1988236124481530:role/testrole")
43-
request.set_RoleSessionName("alice_test")
4438
sub_client = self.init_sub_client()
39+
self._create_default_ram_role()
40+
self._attach_default_policy()
41+
42+
request = AssumeRoleRequest()
43+
request.set_RoleArn(self.ram_role_arn)
44+
request.set_RoleSessionName(self.default_role_session_name)
4545
response = sub_client.do_action_with_exception(request)
4646
response = self.get_dict_response(response)
4747
credentials = response.get("Credentials")

python-sdk-functional-test/credentials_test.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
from aliyunsdkecs.request.v20140526.DescribeRegionsRequest import DescribeRegionsRequest
1212
from aliyunsdksts.request.v20150401.AssumeRoleRequest import AssumeRoleRequest
1313

14-
1514
from base import SDKTestBase
1615
from base import disabled
1716

@@ -26,13 +25,12 @@ def get_http_request(self, client, request, specific_signer=None):
2625
return url
2726

2827
def test_call_rpc_request_with_sts_token(self):
29-
# create AssumeRole request ,Acquire a temporary ak
30-
request = AssumeRoleRequest()
31-
# the role must exist
32-
# FIXME : the RoleArn must according to user's setting
33-
request.set_RoleArn("acs:ram::1988236124481530:role/testrole")
34-
request.set_RoleSessionName("alice_test")
3528
client = self.init_sub_client()
29+
self._create_default_ram_role()
30+
31+
request = AssumeRoleRequest()
32+
request.set_RoleArn(self.ram_role_arn)
33+
request.set_RoleSessionName(self.default_role_session_name)
3634
response = client.do_action_with_exception(request)
3735
response = self.get_dict_response(response)
3836
credentials = response.get("Credentials")
@@ -56,11 +54,15 @@ def test_call_rpc_request_with_sts_token(self):
5654

5755
def test_call_roa_request_with_sts_token(self):
5856
from aliyunsdkcore.auth.credentials import RamRoleArnCredential
59-
# FIXME : the RoleArn must according to user's setting
57+
self._create_default_ram_user()
58+
self._attach_default_policy()
59+
self._create_access_key()
60+
self._create_default_ram_role()
61+
6062
ram_role_arn_credential = RamRoleArnCredential(
61-
self.sub_access_key_id,
62-
self.sub_access_key_secret,
63-
"acs:ram::1988236124481530:role/testrole",
63+
self.ram_user_access_key_id,
64+
self.ram_user_access_key_secret,
65+
self.ram_role_arn,
6466
"alice_test")
6567
acs_client = AcsClient(
6668
region_id="cn-hangzhou",

0 commit comments

Comments
 (0)