1- # -*- coding: utf-8 -*-
21from .authentication import Authentication
32from .authentication import DEFAULT_USER_AGENT
4- from .credentials import Credentials
3+ from .credentials import Profile
54from .requester import Requester
5+ from requests import Session
6+ from requests .adapters import HTTPAdapter
7+ from urllib3 .util .retry import Retry
8+ from urllib3 .util import parse_url
69
710import json
8- import os
9-
11+ import warnings
1012
1113class Call (object ):
1214 def __init__ (self , logger = None , limiter = None , ** kwargs ):
@@ -16,53 +18,39 @@ def __init__(self, logger=None, limiter=None, **kwargs):
1618 self .user_agent = kwargs .pop ("user_agent" , DEFAULT_USER_AGENT )
1719 self .logger = logger
1820 self .limiter = limiter
19- self .update_credentials (
20- access_key = kwargs .pop ("access_key" , None ),
21- secret_key = kwargs .pop ("secret_key" , None ),
22- region = kwargs .pop ("region" , None ),
23- profile = kwargs .pop ("profile" , None ),
24- email = kwargs .pop ("email" , None ),
25- password = kwargs .pop ("password" , None ),
26- proxy = kwargs .pop ("proxy" , None ),
27- x509_client_cert = kwargs .pop ("x509_client_cert" , None ),
28- max_retries = kwargs .pop ("max_retries" , None ),
29- retry_backoff_factor = kwargs .pop ("retry_backoff_factor" , None ),
30- retry_backoff_jitter = kwargs .pop ("retry_backoff_jitter" , None ),
31- retry_backoff_max = kwargs .pop ("retry_backoff_max" , None )
32- )
3321 self .update_limiter (
3422 limiter_max_requests = kwargs .pop ("limiter_max_requests" , None ),
35- limiter_window = kwargs .pop ("limiter_window" , None )
23+ limiter_window = kwargs .pop ("limiter_window" , None ),
3624 )
25+ self .update_profile (** kwargs )
26+ self .session = Session ()
27+ self .session .mount ("https://" , self .adapter )
28+ self .session .mount ("http://" , self .adapter )
3729
38- def update_credentials (
39- self ,
40- region = None ,
41- profile = None ,
42- access_key = None ,
43- secret_key = None ,
44- email = None ,
45- password = None ,
46- proxy = None ,
47- x509_client_cert = None ,
48- max_retries = None ,
49- retry_backoff_factor = None ,
50- retry_backoff_jitter = None ,
51- retry_backoff_max = None ,
52- ):
53- self .credentials = {
54- "access_key" : access_key ,
55- "secret_key" : secret_key ,
56- "region" : region ,
57- "profile" : profile ,
58- "email" : email ,
59- "password" : password ,
60- "x509_client_cert" : x509_client_cert ,
61- "max_retries" : max_retries ,
62- "retry_backoff_factor" : retry_backoff_factor ,
63- "retry_backoff_jitter" : retry_backoff_jitter ,
64- "retry_backoff_max" : retry_backoff_max ,
65- }
30+ def update_credentials (self , ** kwargs ):
31+ warnings .warn (
32+ "update_credentials is deprecated, use update_profile instead" ,
33+ DeprecationWarning ,
34+ stacklevel = 2 ,
35+ )
36+ self .update_profile (** kwargs )
37+
38+ def update_profile (self , ** kwargs ):
39+ self .profile = Profile .from_standard_configuration (
40+ kwargs .pop ("path" , None ), kwargs .pop ("profile" , None )
41+ )
42+ self .profile .merge (Profile (** kwargs ))
43+
44+ self .adapter = HTTPAdapter (
45+ max_retries = Retry (
46+ total = 3 ,
47+ backoff_factor = 1 ,
48+ backoff_jitter = 3 ,
49+ backoff_max = 30 ,
50+ status_forcelist = (400 , 429 , 500 , 503 ),
51+ allowed_methods = ("POST" , "GET" ),
52+ )
53+ )
6654
6755 def update_limiter (
6856 self ,
@@ -75,36 +63,24 @@ def update_limiter(
7563 if limiter_max_requests is not None :
7664 self .limiter .max_requests = limiter_max_requests
7765
78-
79- def api (self , action , ** data ):
66+ def api (self , action , service = "api" , ** data ):
8067 try :
81- credentials = Credentials (** self .credentials )
82- host = (
83- self .host
84- if self .host
85- else "api.{}.outscale.{}" .format (
86- credentials .region , credentials .get_url_extension ()
87- )
88- )
89- uri = "/api/{}/{}" .format (self .version , action )
90- protocol = "https" if self .ssl else "http"
91-
92- endpoint = os .environ .get ("OSC_ENDPOINT_API" )
93- if endpoint is None :
94- endpoint = "{}://{}{}" .format (protocol , host , uri )
95- else :
96- endpoint = "{}{}" .format (endpoint , uri )
68+ endpoint = self .profile .get_endpoint (service ) + "/" + action
69+ parsed_url = parse_url (endpoint )
70+ uri = parsed_url .path
71+ host = parsed_url .host
9772
9873 if self .limiter is not None :
9974 self .limiter .acquire ()
10075
10176 requester = Requester (
102- Authentication (credentials , host , user_agent = self .user_agent ),
77+ self .session ,
78+ Authentication (
79+ self .profile ,
80+ host ,
81+ user_agent = self .user_agent ,
82+ ),
10383 endpoint ,
104- credentials .max_retries ,
105- credentials .retry_backoff_factor ,
106- credentials .retry_backoff_jitter ,
107- credentials .retry_backoff_max ,
10884 )
10985 if self .logger is not None :
11086 self .logger .do_log (
@@ -113,3 +89,7 @@ def api(self, action, **data):
11389 return requester .send (uri , json .dumps (data ))
11490 except Exception as err :
11591 raise err
92+
93+ def close (self ):
94+ if self .session :
95+ self .session .close ()
0 commit comments