1919
2020import sys
2121from 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
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+
3374class 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
83231def disabled (func ):
84232 def _decorator (func ):
85233 pass
86234 return _decorator
87235
88-
89-
0 commit comments