Skip to content

Commit 8deeb4c

Browse files
committed
Adds generic SoftLayer request object
This allows both transports to (mostly) use this one object to define the specifications of an API call.
1 parent fc98a22 commit 8deeb4c

11 files changed

Lines changed: 575 additions & 393 deletions

File tree

SoftLayer/API.py

Lines changed: 16 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -145,24 +145,6 @@ def call(self, service, method, *args, **kwargs):
145145
if not service.startswith(self._prefix):
146146
service = self._prefix + service
147147

148-
headers = kwargs.get('headers', {})
149-
150-
if kwargs.get('id') is not None:
151-
headers[service + 'InitParameters'] = {'id': kwargs.get('id')}
152-
153-
if kwargs.get('mask') is not None:
154-
headers.update(self.__format_object_mask(kwargs.get('mask'),
155-
service))
156-
157-
if kwargs.get('filter') is not None:
158-
headers['%sObjectFilter' % service] = kwargs.get('filter')
159-
160-
if kwargs.get('limit'):
161-
headers['resultLimit'] = {
162-
'limit': kwargs.get('limit'),
163-
'offset': kwargs.get('offset', 0),
164-
}
165-
166148
http_headers = {
167149
'User-Agent': self.user_agent or consts.USER_AGENT,
168150
'Content-Type': 'application/xml',
@@ -175,26 +157,31 @@ def call(self, service, method, *args, **kwargs):
175157
if kwargs.get('raw_headers'):
176158
http_headers.update(kwargs.get('raw_headers'))
177159

178-
uri = '/'.join([self.endpoint_url, service])
179-
options = {
180-
'headers': headers,
181-
'http_headers': http_headers,
182-
'timeout': self.timeout,
183-
'proxy': self.proxy,
184-
}
160+
request = transports.Request()
161+
request.endpoint = self.endpoint_url
162+
request.service = service
163+
request.method = method
164+
request.args = args
165+
request.transport_headers = http_headers
166+
request.timeout = self. timeout
167+
request.proxy = self.proxy
168+
request.identifier = kwargs.get('id')
169+
request.mask = kwargs.get('mask')
170+
request.filter = kwargs.get('filter')
171+
request.limit = kwargs.get('limit')
172+
request.offset = kwargs.get('offset')
185173

186174
if self.auth:
187175
extra_headers = self.auth.get_headers()
188176
if extra_headers:
189177
warnings.warn("auth.get_headers() is deprecated and will be "
190178
"removed in the next major version",
191179
DeprecationWarning)
192-
headers.update(extra_headers)
180+
request.headers.update(extra_headers)
193181

194-
options = self.auth.get_options(options)
182+
request = self.auth.get_request(request)
195183

196-
return transports.make_xml_rpc_api_call(uri, method, args,
197-
**options)
184+
return transports.make_xml_rpc_api_call(request)
198185

199186
__call__ = call
200187

@@ -249,25 +236,6 @@ def iter_call(self, service, method,
249236
if len(results) < chunk:
250237
break
251238

252-
def __format_object_mask(self, objectmask, service):
253-
"""Format new and old style object masks into proper headers.
254-
255-
:param objectmask: a string- or dict-based object mask
256-
:param service: a SoftLayer API service name
257-
258-
"""
259-
if isinstance(objectmask, dict):
260-
mheader = '%sObjectMask' % service
261-
else:
262-
mheader = self._prefix + 'ObjectMask'
263-
264-
objectmask = objectmask.strip()
265-
if (not objectmask.startswith('mask')
266-
and not objectmask.startswith('[')):
267-
objectmask = "mask[%s]" % objectmask
268-
269-
return {mheader: {'mask': objectmask}}
270-
271239
def __repr__(self):
272240
return "<Client: endpoint=%s, user=%r>" % (self.endpoint_url,
273241
self.auth)

SoftLayer/auth.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@
1111
class AuthenticationBase(object):
1212
"""A base authentication class intended to be overridden."""
1313

14-
def get_options(self, options):
14+
def get_request(self, request):
1515
"""Receives request options and returns request options.
1616
1717
:param options dict: dictionary of request options
1818
1919
"""
20-
return options
20+
return request
2121

2222
def get_headers(self):
2323
"""Return a dictionary of headers to be inserted for authentication.
@@ -39,14 +39,14 @@ def __init__(self, user_id, auth_token):
3939
self.user_id = user_id
4040
self.auth_token = auth_token
4141

42-
def get_options(self, options):
42+
def get_request(self, request):
4343
"""Sets token-based auth headers."""
44-
options['headers']['authenticate'] = {
44+
request.headers['authenticate'] = {
4545
'complexType': 'PortalLoginToken',
4646
'userId': self.user_id,
4747
'authToken': self.auth_token,
4848
}
49-
return options
49+
return request
5050

5151
def __repr__(self):
5252
return "<TokenAuthentication: %s %s>" % (self.user_id, self.auth_token)
@@ -62,13 +62,13 @@ def __init__(self, username, api_key):
6262
self.username = username
6363
self.api_key = api_key
6464

65-
def get_options(self, options):
65+
def get_request(self, request):
6666
"""Sets token-based auth headers."""
67-
options['headers']['authenticate'] = {
67+
request.headers['authenticate'] = {
6868
'username': self.username,
6969
'apiKey': self.api_key,
7070
}
71-
return options
71+
return request
7272

7373
def __repr__(self):
7474
return "<BasicAuthentication: %s>" % (self.username)

SoftLayer/managers/metadata.py

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -58,22 +58,6 @@ def __init__(self, client=None, timeout=5):
5858
self.timeout = timeout
5959
self.client = client
6060

61-
def make_request(self, path):
62-
""" Make a request against the metadata service
63-
64-
:param string path: path to the specific metadata resource
65-
"""
66-
url = '/'.join([self.url, 'SoftLayer_Resource_Metadata', path])
67-
try:
68-
return transports.make_rest_api_call(
69-
'GET', url,
70-
http_headers={'User-Agent': consts.USER_AGENT},
71-
timeout=self.timeout)
72-
except exceptions.SoftLayerAPIError as ex:
73-
if ex.faultCode == 404:
74-
return None
75-
raise ex
76-
7761
def get(self, name, param=None):
7862
""" Retreive a metadata attribute
7963
@@ -85,19 +69,30 @@ def get(self, name, param=None):
8569
raise exceptions.SoftLayerError('Unknown metadata attribute.')
8670

8771
call_details = self.attribs[name]
88-
extension = '.json'
72+
extension = 'json'
8973
if self.attribs[name]['call'] == 'UserMetadata':
90-
extension = '.txt'
74+
extension = 'txt'
9175

9276
if call_details.get('param_req'):
9377
if not param:
9478
raise exceptions.SoftLayerError(
9579
'Parameter required to get this attribute.')
96-
path = "%s/%s%s" % (self.attribs[name]['call'], param, extension)
97-
else:
98-
path = "%s%s" % (self.attribs[name]['call'], extension)
9980

100-
return self.make_request(path)
81+
request = transports.Request()
82+
request.endpoint = self.url
83+
request.service = 'SoftLayer_Resource_Metadata'
84+
request.method = self.attribs[name]['call']
85+
request.transport_headers = {'User-Agent': consts.USER_AGENT}
86+
request.timeout = self.timeout
87+
request.identifier = param
88+
89+
try:
90+
return transports.make_rest_api_call(request,
91+
extension=extension)
92+
except exceptions.SoftLayerAPIError as ex:
93+
if ex.faultCode == 404:
94+
return None
95+
raise ex
10196

10297
def _get_network(self, kind, router=True, vlans=True, vlan_ids=True):
10398
""" Wrapper for getting details about networks

0 commit comments

Comments
 (0)