Skip to content

Commit 74b1ca7

Browse files
author
wallisyan
authored
Merge pull request #242 from aliyun/refactor4.test
Refactor4.test
2 parents 96c0720 + 2d77c20 commit 74b1ca7

File tree

58 files changed

+2022
-766
lines changed

Some content is hidden

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

58 files changed

+2022
-766
lines changed

aliyun-python-sdk-core/alibabacloud/client.py

Lines changed: 35 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,20 @@
2424
from alibabacloud.handlers.retry_handler import RetryHandler
2525
from alibabacloud.handlers.server_error_handler import ServerErrorHandler
2626
from alibabacloud.handlers.http_handler import HttpHandler
27-
27+
from alibabacloud.request import HTTPRequest
28+
import alibabacloud.retry.retry_policy as retry_policy
2829

2930

3031
DEFAULT_HANDLERS = [
31-
PrepareHandler,
32-
CredentialsHandler,
33-
SignerHandler, # 获取Signature,header,params
34-
# HttpHeaderHandler, # 获取签名的header
35-
TimeoutConfigReader, # 获取timeout
36-
EndpointHandler, # 获取endpoint
37-
LogHandler,
38-
RetryHandler,
39-
HttpHandler,
40-
ServerErrorHandler
32+
PrepareHandler(),
33+
CredentialsHandler(),
34+
SignerHandler(),
35+
TimeoutConfigReader(),
36+
LogHandler(),
37+
EndpointHandler(),
38+
RetryHandler(),
39+
ServerErrorHandler(),
40+
HttpHandler(),
4141
]
4242

4343
DEFAULT_FORMAT = 'JSON'
@@ -47,6 +47,8 @@
4747
DEFAULT_READ_TIMEOUT = 10
4848
DEFAULT_ENABLE_HTTP_DEBUG = False
4949
DEFAULT_ENABLE_HTTPS = False
50+
HTTP_PORT = 80
51+
HTTPS_PORT = 443
5052

5153

5254
class ClientConfig:
@@ -58,13 +60,13 @@ class ClientConfig:
5860
DEFAULT_NAME_FOR_CONFIG_FILE = '~/.alibabacloud/config'
5961

6062
def __init__(self, access_key_id=None, access_key_secret=None, region_id=None,
61-
max_retry_times=None, user_agent=None,
62-
extra_user_agent=None, enable_https=None, http_port=None, https_port=None,
63+
max_retry_times=None, user_agent=None, extra_user_agent=None,
64+
enable_https=None, http_port=HTTP_PORT, https_port=HTTPS_PORT,
6365
connection_timeout=None, read_timeout=None, enable_http_debug=None,
6466
http_proxy=None, https_proxy=None, enable_stream_logger=None,
6567
profile_name=None, config_file=None, enable_retry=True, endpoint=None):
6668

67-
# credentials部分会用到
69+
# credentials
6870
self.access_key_id = access_key_id
6971
self.access_key_secret = access_key_secret
7072
self.region_id = region_id
@@ -86,7 +88,7 @@ def __init__(self, access_key_id=None, access_key_secret=None, region_id=None,
8688
self.enable_stream_logger = enable_stream_logger
8789
# credentials 的profile
8890
self.profile_name = profile_name
89-
# 读取配置文件
91+
# config file
9092
self.config_file = config_file
9193
self.enable_http_debug = enable_http_debug # http-debug 只从环境变量获取,不设置开关
9294
# proxy provider两个: client env
@@ -97,6 +99,10 @@ def __init__(self, access_key_id=None, access_key_secret=None, region_id=None,
9799
'https': self.https_proxy,
98100
}
99101

102+
@property
103+
def proxy(self):
104+
return self._proxy
105+
100106
def read_from_env(self):
101107
# 从环境变量读取一定量的数据
102108
env_vars = ['HTTPS_PROXY', 'HTTP_PROXY']
@@ -157,6 +163,10 @@ def get_merged_client_config(config):
157163
class AlibabaCloudClient:
158164

159165
def __init__(self, client_config, credentials_provider):
166+
self.product_code = None
167+
self.location_service_code = None
168+
self.product_version = None
169+
self.location_endpoint_type = None
160170
# client_config:传入的ClientConfig
161171

162172
self.config = get_merged_client_config(client_config)
@@ -172,12 +182,6 @@ def __init__(self, client_config, credentials_provider):
172182
from alibabacloud.endpoint.default_endpoint_resolver import DefaultEndpointResolver
173183

174184
self.endpoint_resolver = DefaultEndpointResolver(self.config) # TODO initialize
175-
self.product_code = None
176-
self.location_service_code = None
177-
self.product_version = None
178-
self.location_endpoint_type = None
179-
180-
import alibabacloud.retry.retry_policy as retry_policy
181185
# retry
182186
if self.config.enable_retry:
183187
self.retry_policy = retry_policy.get_default_retry_policy(
@@ -187,67 +191,22 @@ def __init__(self, client_config, credentials_provider):
187191

188192
def _handle_request(self, api_request, _raise_exception=True):
189193
# handle context
190-
context = RequestContext()
191-
context.api_request = api_request
192-
from .request import HTTPRequest
193-
context.http_request = HTTPRequest()
194-
context.config = self.config
195-
196-
context.client = self
197-
194+
context = RequestContext(api_request=api_request, http_request=HTTPRequest(),
195+
config=self.config, client=self)
198196
handler_index = 0
199-
200197
while True:
198+
for handler in self.handlers[handler_index:]:
199+
handler.handle_request(context)
201200

202-
for i in range(len(self.handlers[handler_index:])):
203-
self.handlers[i]().handle_request(context)
204-
205-
for i in reversed(range(len(self.handlers[handler_index:]))):
206-
self.handlers[i]().handle_response(context)
201+
for handler in reversed(self.handlers[handler_index:]):
202+
handler.handle_response(context)
207203
if context.retry_flag:
208204
time.sleep(context.retry_backoff / 1000)
209-
handler_index = i
210-
context.retry_flag = False
211-
continue
212-
213-
break
214-
205+
handler_index = self.handlers.index(handler)
206+
break
207+
if not context.retry_flag:
208+
break
215209
if context.exception and _raise_exception:
216210
raise context.exception
217211

218212
return context
219-
220-
221-
class ECSClient(AlibabaCloudClient):
222-
223-
def __init__(self):
224-
self.product = 'Ecs'
225-
self.location_service_code = 'ecs'
226-
self.location_endpoint_type = 'OpenAPI'
227-
228-
def create_instance(self, instance_name=None, instance_id=None):
229-
api_request = APIRequest(action_name, method, protocol, style)
230-
api_request._params['InstanceName'] = instance_name
231-
return self._handle_request(api_request).result
232-
233-
def delete_instance(self, **params):
234-
api_request = APIRequest(**params)
235-
return self._handle_request(api_request).result
236-
237-
238-
class OTSClient(AlibabaCloudClient):
239-
240-
def create_table(self, **params):
241-
api_request = APIRequest(**params)
242-
return self._handle_request(api_request).result
243-
244-
245-
class STSClient(AlibabaCloudClient):
246-
def __init__(self):
247-
self.product = 'Sts'
248-
self.location_service_code = 'sts'
249-
self.location_endpoint_type = 'OpenAPI'
250-
# AlibabaCloudClient.__init__(self)
251-
252-
def handle_request(self, request, config):
253-
self._handle_request(request, _config=config, _raise_exception=True)

aliyun-python-sdk-core/alibabacloud/credentials/provider.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,8 @@ def __init__(self, client_config, credentials_config_file_name, profile_name):
9797
self.client_config = client_config
9898
self._inner_provider = self._get_provider_by_profile(profile)
9999

100-
def _load_profile(self, config_file_name, profile_name):
100+
@staticmethod
101+
def _load_profile(config_file_name, profile_name):
101102
full_path = os.path.expanduser(config_file_name)
102103
if not os.path.isfile(full_path):
103104
raise ClientException("Failed to find config file for SDK: " + full_path)
@@ -263,7 +264,8 @@ def _get_config_file_name(self):
263264
else:
264265
return self.DEFAULT_NAME_FOR_CREDENTIALS_FILE
265266

266-
def _get_config(self, config_name):
267+
@staticmethod
268+
def _get_config(config_name):
267269
env_name = 'ALIBABA_CLOUD_' + config_name.upper()
268270
if env_name in os.environ:
269271
return os.environ.get(env_name)

aliyun-python-sdk-core/alibabacloud/endpoint/local_config_regional_endpoint_resolver.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,5 +104,6 @@ def is_product_code_valid(self, request):
104104
self._get_normalized_product_code(request.product_code),
105105
request.location_service_code,
106106
request.endpoint_type,
107+
request.credentials_provider
107108
)
108109
return EndpointResolverBase.is_product_code_valid(self, tmp_request)

aliyun-python-sdk-core/alibabacloud/endpoint/location_service_endpoint_resolver.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,10 @@ def _get_endpoint_from_location_service(self, key, request):
6969
return self.endpoints_data.get(key)
7070

7171
def _call_location_service(self, key, raw_request):
72-
client_caller = DescribeEndpointCaller(self.config, None)
72+
client_caller = DescribeEndpointCaller(self.config, raw_request.credentials_provider)
7373

7474
try:
75-
context = client_caller.fetch(region_id=self.config.region_id,
75+
context = client_caller.fetch(region_id=raw_request.region_id,
7676
endpoint_type=raw_request.endpoint_type,
7777
location_service_code=raw_request.location_service_code,
7878
location_endpoint=self._location_service_endpoint)

aliyun-python-sdk-core/alibabacloud/endpoint/resolver_endpoint_request.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
class ResolveEndpointRequest(object):
2525

26-
def __init__(self, region_id, product_code, location_service_code, endpoint_type):
26+
def __init__(self, region_id, product_code, location_service_code, endpoint_type, credentials_provider):
2727

2828
self.region_id = region_id
2929
self.product_code = product_code
@@ -35,6 +35,7 @@ def __init__(self, region_id, product_code, location_service_code, endpoint_type
3535
self.endpoint_type = endpoint_type
3636

3737
self.location_service_code = location_service_code
38+
self.credentials_provider = credentials_provider
3839

3940
def is_open_api_endpoint(self):
4041
return ENDPOINT_TYPE_OPEN == self.endpoint_type

aliyun-python-sdk-core/alibabacloud/handlers/__init__.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,17 @@
1515

1616
class RequestContext:
1717

18-
def __init__(self):
19-
self.api_request = None
20-
self.http_request = None
21-
self.api_response = None
22-
self.http_response = None
23-
self.exception = None
24-
self.retry_flag = False
25-
self.retry_backoff = 0
18+
def __init__(self, api_request=None, http_request=None, api_response=None, http_response=None,
19+
exception=None, retry_flag=True, retry_backoff=0, config=None, client=None):
20+
self.api_request = api_request
21+
self.http_request = http_request
22+
self.api_response = api_response
23+
self.http_response = http_response
24+
self.exception = exception
25+
self.config = config
26+
self.client = client
27+
self.retry_flag = retry_flag
28+
self.retry_backoff = retry_backoff
2629

2730

2831
class RequestHandler:

aliyun-python-sdk-core/alibabacloud/handlers/credentials_handler.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@
1919
class CredentialsHandler(RequestHandler):
2020

2121
def handle_request(self, context):
22-
23-
credentials = context.client.credentials_provider.provide()
24-
context.http_request.credentials = credentials
22+
if context.http_request.credentials is None:
23+
credentials = context.client.credentials_provider.provide()
24+
context.http_request.credentials = credentials
2525

2626
def handle_response(self, response):
2727
pass

aliyun-python-sdk-core/alibabacloud/handlers/endpoint_handler.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@
1919
class EndpointHandler(RequestHandler):
2020

2121
def handle_request(self, context):
22-
# FIXME
2322
if context.api_request.endpoint is not None:
2423
context.endpoint = context.api_request.endpoint
2524
else:
2625
resolve_request = ResolveEndpointRequest(
2726
context.config.region_id,
2827
context.client.product_code,
2928
context.client.location_service_code,
30-
context.client.location_endpoint_type
29+
context.client.location_endpoint_type,
30+
context.client.credentials_provider,
3131
)
3232
context.endpoint = context.client.endpoint_resolver.resolve(resolve_request)
3333

aliyun-python-sdk-core/alibabacloud/handlers/http_handler.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@
1919

2020

2121
class HttpHandler(RequestHandler):
22-
"""
23-
获取参数,组装成request
24-
"""
2522
def handle_request(self, context):
2623
self._do_request(context)
2724

@@ -30,6 +27,9 @@ def handle_response(self, context):
3027

3128
def _do_request(self, context):
3229
http_request = context.http_request
30+
# modify retry flag
31+
context.retry_flag = False
32+
3333
with Session() as s:
3434
current_protocol = 'http://' if http_request.protocol.lower() == 'http' else 'https://'
3535
url = current_protocol + context.endpoint + http_request.params
@@ -51,6 +51,9 @@ def _do_request(self, context):
5151
response = s.send(prepped, proxies=http_request.proxy,
5252
timeout=http_request.timeout,
5353
allow_redirects=False, verify=None, cert=None)
54+
55+
from aliyunsdkcore.vendored import requests
56+
# requests.adapters.DEFAULT_RETRIES = 0
5457
except IOError as e:
5558
from aliyunsdkcore.acs_exception.exceptions import ClientException
5659
from aliyunsdkcore.acs_exception import error_code

0 commit comments

Comments
 (0)