Skip to content

Commit 89441b3

Browse files
committed
add retry conf to json
1 parent f30af28 commit 89441b3

File tree

4 files changed

+126
-61
lines changed

4 files changed

+126
-61
lines changed

osc_sdk_python/call.py

Lines changed: 59 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,54 +7,80 @@
77
import json
88
import os
99

10+
1011
class Call(object):
1112
def __init__(self, logger=None, **kwargs):
12-
self.version = kwargs.pop('version', 'latest')
13-
self.host = kwargs.pop('host', None)
14-
self.ssl = kwargs.pop('_ssl', True)
15-
self.user_agent = kwargs.pop('user_agent', DEFAULT_USER_AGENT)
16-
self.max_retries = kwargs.pop('max_retries', 0)
13+
self.version = kwargs.pop("version", "latest")
14+
self.host = kwargs.pop("host", None)
15+
self.ssl = kwargs.pop("_ssl", True)
16+
self.user_agent = kwargs.pop("user_agent", DEFAULT_USER_AGENT)
1717
self.logger = logger
18-
self.update_credentials(access_key=kwargs.pop('access_key', None),
19-
secret_key=kwargs.pop('secret_key', None),
20-
region=kwargs.pop('region', None),
21-
profile=kwargs.pop('profile', None),
22-
email=kwargs.pop('email', None),
23-
password=kwargs.pop('password', None),
24-
proxy=kwargs.pop('proxy', None),
25-
x509_client_cert=kwargs.pop('x509_client_cert', None))
18+
self.max_retries = kwargs.pop("max_retries", None)
19+
self.retry_backoff_factor = kwargs.pop("retry_backoff_factor", None)
20+
self.retry_backoff_jitter = kwargs.pop("retry_backoff_jitter", None)
21+
self.update_credentials(
22+
access_key=kwargs.pop("access_key", None),
23+
secret_key=kwargs.pop("secret_key", None),
24+
region=kwargs.pop("region", None),
25+
profile=kwargs.pop("profile", None),
26+
email=kwargs.pop("email", None),
27+
password=kwargs.pop("password", None),
28+
proxy=kwargs.pop("proxy", None),
29+
x509_client_cert=kwargs.pop("x509_client_cert", None),
30+
)
2631

27-
def update_credentials(self, region=None, profile=None, access_key=None,
28-
secret_key=None, email=None, password=None, proxy=None,
29-
x509_client_cert=None):
32+
def update_credentials(
33+
self,
34+
region=None,
35+
profile=None,
36+
access_key=None,
37+
secret_key=None,
38+
email=None,
39+
password=None,
40+
proxy=None,
41+
x509_client_cert=None,
42+
):
3043
self.credentials = {
31-
'access_key': access_key,
32-
'secret_key': secret_key,
33-
'region': region,
34-
'profile': profile,
35-
'email': email,
36-
'password': password,
37-
'x509_client_cert': x509_client_cert,
38-
'proxy': proxy
44+
"access_key": access_key,
45+
"secret_key": secret_key,
46+
"region": region,
47+
"profile": profile,
48+
"email": email,
49+
"password": password,
50+
"x509_client_cert": x509_client_cert,
51+
"proxy": proxy,
3952
}
4053

4154
def api(self, action, **data):
4255
try:
4356
credentials = Credentials(**self.credentials)
44-
host = (self.host if self.host
45-
else 'api.{}.outscale.{}'.format(credentials.region, credentials.get_url_extension()))
46-
uri = '/api/{}/{}'.format(self.version, action)
47-
protocol = 'https' if self.ssl else 'http'
57+
host = (
58+
self.host
59+
if self.host
60+
else "api.{}.outscale.{}".format(
61+
credentials.region, credentials.get_url_extension()
62+
)
63+
)
64+
uri = "/api/{}/{}".format(self.version, action)
65+
protocol = "https" if self.ssl else "http"
4866

49-
endpoint = os.environ.get('OSC_ENDPOINT_API')
67+
endpoint = os.environ.get("OSC_ENDPOINT_API")
5068
if endpoint is None:
51-
endpoint = '{}://{}{}'.format(protocol, host, uri)
69+
endpoint = "{}://{}{}".format(protocol, host, uri)
5270
else:
53-
endpoint = '{}{}'.format(endpoint, uri)
71+
endpoint = "{}{}".format(endpoint, uri)
5472

55-
requester = Requester(Authentication(credentials, host, user_agent=self.user_agent), endpoint, self.max_retries)
73+
requester = Requester(
74+
Authentication(credentials, host, user_agent=self.user_agent),
75+
endpoint,
76+
credentials.max_retries,
77+
credentials.retry_backoff_factor,
78+
credentials.retry_backoff_jitter,
79+
)
5680
if self.logger != None:
57-
self.logger.do_log("uri: " + uri + "\npayload:\n" + json.dumps(data, indent=2))
81+
self.logger.do_log(
82+
"uri: " + uri + "\npayload:\n" + json.dumps(data, indent=2)
83+
)
5884
return requester.send(uri, json.dumps(data))
5985
except Exception as err:
6086
raise err

osc_sdk_python/credentials.py

Lines changed: 61 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,51 @@
11
import json
22
import os
33

4-
ORIGINAL_PATH = os.path.join(os.path.expanduser('~'),'.oapi_credentials')
5-
STD_PATH = os.path.join(os.path.expanduser('~'),'.osc/config.json')
6-
DEFAULT_REGION="eu-west-2"
7-
DEFAULT_PROFILE="default"
4+
ORIGINAL_PATH = os.path.join(os.path.expanduser("~"), ".oapi_credentials")
5+
STD_PATH = os.path.join(os.path.expanduser("~"), ".osc/config.json")
6+
DEFAULT_REGION = "eu-west-2"
7+
DEFAULT_PROFILE = "default"
8+
MAX_RETRIES = 5
9+
RETRY_BACKOFF_FACTOR = 1
10+
RETRY_BACKOFF_JITTER = 3
11+
812

913
class Credentials:
10-
def __init__(self, region, profile, access_key, secret_key, email, password,
11-
x509_client_cert=None, proxy=None):
14+
def __init__(
15+
self,
16+
region,
17+
profile,
18+
access_key,
19+
secret_key,
20+
email,
21+
password,
22+
x509_client_cert=None,
23+
proxy=None,
24+
max_retries=None,
25+
retry_backoff_factor=None,
26+
retry_backoff_jitter=None,
27+
):
1228
self.region = None
1329
self.access_key = access_key
1430
self.secret_key = secret_key
1531
self.email = email
1632
self.password = password
17-
self.x509_client_cert=x509_client_cert
18-
self.proxy=proxy
33+
self.x509_client_cert = x509_client_cert
34+
self.proxy = proxy
35+
self.max_retries = max_retries
36+
self.retry_backoff_factor = retry_backoff_factor
37+
self.retry_backoff_jitter = retry_backoff_jitter
1938

2039
if profile is None:
21-
profile = os.environ.get('OSC_PROFILE')
40+
profile = os.environ.get("OSC_PROFILE")
2241
else:
23-
# Overide with environmental configuration if available
42+
# Override with environmental configuration if available
2443
self.load_credentials_from_env()
25-
# Overide with old configuration if available
44+
# Override with old configuration if available
2645
self.load_credentials_from_file(profile, ORIGINAL_PATH)
27-
# Overide with standard configuration if available
46+
# Override with standard configuration if available
2847
self.load_credentials_from_file(profile, STD_PATH)
29-
# Overide with environmental configuration if available
48+
# Override with environmental configuration if available
3049
if profile is None:
3150
profile = DEFAULT_PROFILE
3251
self.load_credentials_from_env()
@@ -39,41 +58,65 @@ def __init__(self, region, profile, access_key, secret_key, email, password,
3958
self.region = DEFAULT_REGION
4059

4160
self.profile = profile
42-
# Overide with app parameters if provided
61+
# Override with app parameters if provided
4362
if access_key is not None:
4463
self.access_key = access_key
4564
if secret_key is not None:
4665
self.secret_key = secret_key
4766

67+
if self.max_retries is None:
68+
self.max_retries = MAX_RETRIES
69+
if self.retry_backoff_factor is None:
70+
self.retry_backoff_factor = RETRY_BACKOFF_FACTOR
71+
if self.retry_backoff_jitter is None:
72+
self.retry_backoff_jitter = RETRY_BACKOFF_JITTER
73+
4874
self.check_options()
4975

5076
def load_credentials_from_file(self, profile, file_path):
5177
try:
5278
with open(file_path) as f:
5379
config = json.load(f)
5480
profile = config.get(profile)
81+
5582
if profile is None:
5683
return
84+
5785
ak = profile.get("access_key")
5886
if ak is not None:
5987
self.access_key = ak
88+
6089
sk = profile.get("secret_key")
6190
if sk is not None:
6291
self.secret_key = sk
92+
6393
region = profile.get("region")
6494
if region is not None:
6595
self.region = region
96+
97+
max_retries = profile.get("max_retries")
98+
if max_retries is not None:
99+
self.max_retries = max_retries
100+
101+
retry_backoff_factor = profile.get("retry_backoff_factor")
102+
if retry_backoff_factor is not None:
103+
self.retry_backoff_factor = retry_backoff_factor
104+
105+
retry_backoff_jitter = profile.get("retry_backoff_jitter")
106+
if retry_backoff_jitter is not None:
107+
self.retry_backoff_jitter = retry_backoff_jitter
108+
66109
except IOError:
67110
pass
68111

69112
def load_credentials_from_env(self):
70-
ak = os.environ.get('OSC_ACCESS_KEY')
113+
ak = os.environ.get("OSC_ACCESS_KEY")
71114
if ak is not None:
72115
self.access_key = ak
73-
sk = os.environ.get('OSC_SECRET_KEY')
116+
sk = os.environ.get("OSC_SECRET_KEY")
74117
if sk is not None:
75118
self.secret_key = sk
76-
region = os.environ.get('OSC_REGION')
119+
region = os.environ.get("OSC_REGION")
77120
if region is not None:
78121
self.region = region
79122

@@ -92,4 +135,4 @@ def check_options(self):
92135
raise Exception("Invalid Outscale region")
93136

94137
def get_url_extension(self):
95-
return 'hk' if 'cn' in self.region else 'com'
138+
return "hk" if "cn" in self.region else "com"

osc_sdk_python/outscale_gateway.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,10 @@ def do_log(self, s):
6464

6565
class OutscaleGateway:
6666

67-
def __init__(self, retry=True, **kwargs):
67+
def __init__(self, **kwargs):
6868
self._load_gateway_structure()
6969
self._load_errors()
7070
self.log = Logger()
71-
if retry:
72-
kwargs['max_retries'] = 5
7371
self.call = Call(logger=self.log, **kwargs)
7472

7573
def update_credentials(self, region=None, profile=None, access_key=None,

osc_sdk_python/requester.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,22 @@ def __init__(
1414
auth,
1515
endpoint,
1616
max_retries=0,
17-
backoff_factor=1,
18-
backoff_jitter=3,
17+
backoff_factor=0,
18+
backoff_jitter=0,
1919
status_forcelist=HTTP_CODE_RETRY,
2020
allowed_methods=METHODS_RETRY,
2121
):
2222
self.auth = auth
2323
self.endpoint = endpoint
24-
if max_retries > 0:
25-
retry = Retry(
24+
self.adapter = HTTPAdapter(
25+
max_retries=Retry(
2626
total=max_retries,
2727
backoff_factor=backoff_factor,
2828
backoff_jitter=backoff_jitter,
2929
status_forcelist=status_forcelist,
3030
allowed_methods=allowed_methods,
3131
)
32-
self.adapter = HTTPAdapter(max_retries=retry)
33-
else:
34-
self.adapter = HTTPAdapter()
32+
)
3533

3634
def send(self, uri, payload):
3735
headers = None

0 commit comments

Comments
 (0)