Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 16 additions & 48 deletions SoftLayer/API.py
Original file line number Diff line number Diff line change
Expand Up @@ -145,24 +145,6 @@ def call(self, service, method, *args, **kwargs):
if not service.startswith(self._prefix):
service = self._prefix + service

headers = kwargs.get('headers', {})

if kwargs.get('id') is not None:
headers[service + 'InitParameters'] = {'id': kwargs.get('id')}

if kwargs.get('mask') is not None:
headers.update(self.__format_object_mask(kwargs.get('mask'),
service))

if kwargs.get('filter') is not None:
headers['%sObjectFilter' % service] = kwargs.get('filter')

if kwargs.get('limit'):
headers['resultLimit'] = {
'limit': kwargs.get('limit'),
'offset': kwargs.get('offset', 0),
}

http_headers = {
'User-Agent': self.user_agent or consts.USER_AGENT,
'Content-Type': 'application/xml',
Expand All @@ -175,26 +157,31 @@ def call(self, service, method, *args, **kwargs):
if kwargs.get('raw_headers'):
http_headers.update(kwargs.get('raw_headers'))

uri = '/'.join([self.endpoint_url, service])
options = {
'headers': headers,
'http_headers': http_headers,
'timeout': self.timeout,
'proxy': self.proxy,
}
request = transports.Request()
request.endpoint = self.endpoint_url
request.service = service
request.method = method
request.args = args
request.transport_headers = http_headers
request.timeout = self.timeout
request.proxy = self.proxy
request.identifier = kwargs.get('id')
request.mask = kwargs.get('mask')
request.filter = kwargs.get('filter')
request.limit = kwargs.get('limit')
request.offset = kwargs.get('offset')

if self.auth:
extra_headers = self.auth.get_headers()
if extra_headers:
warnings.warn("auth.get_headers() is deprecated and will be "
"removed in the next major version",
DeprecationWarning)
headers.update(extra_headers)
request.headers.update(extra_headers)

options = self.auth.get_options(options)
request = self.auth.get_request(request)

return transports.make_xml_rpc_api_call(uri, method, args,
**options)
return transports.make_xml_rpc_api_call(request)

__call__ = call

Expand Down Expand Up @@ -249,25 +236,6 @@ def iter_call(self, service, method,
if len(results) < chunk:
break

def __format_object_mask(self, objectmask, service):
"""Format new and old style object masks into proper headers.

:param objectmask: a string- or dict-based object mask
:param service: a SoftLayer API service name

"""
if isinstance(objectmask, dict):
mheader = '%sObjectMask' % service
else:
mheader = self._prefix + 'ObjectMask'

objectmask = objectmask.strip()
if (not objectmask.startswith('mask')
and not objectmask.startswith('[')):
objectmask = "mask[%s]" % objectmask

return {mheader: {'mask': objectmask}}

def __repr__(self):
return "<Client: endpoint=%s, user=%r>" % (self.endpoint_url,
self.auth)
Expand Down
2 changes: 1 addition & 1 deletion SoftLayer/CLI/modules/metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ def _execute(self, _):
separator=',')


class UserMetadata(environment.CLIRunnable):
class UserMetadata(MetaRunnable):
"""
usage: sl metadata user_data [options]

Expand Down
16 changes: 8 additions & 8 deletions SoftLayer/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@
class AuthenticationBase(object):
"""A base authentication class intended to be overridden."""

def get_options(self, options):
def get_request(self, request):
"""Receives request options and returns request options.

:param options dict: dictionary of request options

"""
return options
return request

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

def get_options(self, options):
def get_request(self, request):
"""Sets token-based auth headers."""
options['headers']['authenticate'] = {
request.headers['authenticate'] = {
'complexType': 'PortalLoginToken',
'userId': self.user_id,
'authToken': self.auth_token,
}
return options
return request

def __repr__(self):
return "<TokenAuthentication: %s %s>" % (self.user_id, self.auth_token)
Expand All @@ -62,13 +62,13 @@ def __init__(self, username, api_key):
self.username = username
self.api_key = api_key

def get_options(self, options):
def get_request(self, request):
"""Sets token-based auth headers."""
options['headers']['authenticate'] = {
request.headers['authenticate'] = {
'username': self.username,
'apiKey': self.api_key,
}
return options
return request

def __repr__(self):
return "<BasicAuthentication: %s>" % (self.username)
37 changes: 14 additions & 23 deletions SoftLayer/managers/metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,22 +58,6 @@ def __init__(self, client=None, timeout=5):
self.timeout = timeout
self.client = client

def make_request(self, path):
""" Make a request against the metadata service

:param string path: path to the specific metadata resource
"""
url = '/'.join([self.url, 'SoftLayer_Resource_Metadata', path])
try:
return transports.make_rest_api_call(
'GET', url,
http_headers={'User-Agent': consts.USER_AGENT},
timeout=self.timeout)
except exceptions.SoftLayerAPIError as ex:
if ex.faultCode == 404:
return None
raise ex

def get(self, name, param=None):
""" Retreive a metadata attribute

Expand All @@ -85,19 +69,26 @@ def get(self, name, param=None):
raise exceptions.SoftLayerError('Unknown metadata attribute.')

call_details = self.attribs[name]
extension = '.json'
if self.attribs[name]['call'] == 'UserMetadata':
extension = '.txt'

if call_details.get('param_req'):
if not param:
raise exceptions.SoftLayerError(
'Parameter required to get this attribute.')
path = "%s/%s%s" % (self.attribs[name]['call'], param, extension)
else:
path = "%s%s" % (self.attribs[name]['call'], extension)

return self.make_request(path)
request = transports.Request()
request.endpoint = self.url
request.service = 'SoftLayer_Resource_Metadata'
request.method = self.attribs[name]['call']
request.transport_headers = {'User-Agent': consts.USER_AGENT}
request.timeout = self.timeout
request.identifier = param

try:
return transports.make_rest_api_call(request)
except exceptions.SoftLayerAPIError as ex:
if ex.faultCode == 404:
return None
raise ex

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