You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by qu...@apache.org on 2018/06/11 19:03:20 UTC
[3/4] libcloud git commit: [scaleway] Give paginated requests their
own request method
[scaleway] Give paginated requests their own request method
This allows pagination to be less surprising when it happens, and simplifies the response parsing.
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/b9c3eac8
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/b9c3eac8
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/b9c3eac8
Branch: refs/heads/trunk
Commit: b9c3eac8145274adb22194f9d8b1f66c6ad08575
Parents: 6a3e50a
Author: Daniel Hunsaker <da...@nanobox.io>
Authored: Tue Jun 5 10:10:31 2018 -0600
Committer: Daniel Hunsaker <da...@nanobox.io>
Committed: Tue Jun 5 10:10:31 2018 -0600
----------------------------------------------------------------------
libcloud/compute/drivers/scaleway.py | 83 +++++++++++++++----------------
1 file changed, 39 insertions(+), 44 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/libcloud/blob/b9c3eac8/libcloud/compute/drivers/scaleway.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/scaleway.py b/libcloud/compute/drivers/scaleway.py
index f33a186..2c313bf 100644
--- a/libcloud/compute/drivers/scaleway.py
+++ b/libcloud/compute/drivers/scaleway.py
@@ -56,21 +56,6 @@ class ScalewayResponse(JsonResponse):
valid_response_codes = [httplib.OK, httplib.ACCEPTED,
httplib.CREATED, httplib.NO_CONTENT]
- def parse_body(self):
- body = super(ScalewayResponse, self).parse_body()
-
- links = self.connection.connection.getresponse().links
- if links and 'next' in links:
- response = self.connection.request(links['next']['url'],
- data=self.connection.data,
- method=self.connection.method)
- next = response.object
- merged = {root: child + next[root]
- for root, child in list(body.items())}
- body = merged
-
- return body
-
def parse_error(self):
return super(ScalewayResponse, self).parse_error()['message']
@@ -88,8 +73,7 @@ class ScalewayConnection(ConnectionUserAndKey):
responseCls = ScalewayResponse
def request(self, action, params=None, data=None, headers=None,
- method='GET', raw=False, stream=False, region=None,
- paged=False):
+ method='GET', raw=False, stream=False, region=None):
if region:
old_host = self.host
self.host = SCALEWAY_API_HOSTS[region.id
@@ -98,19 +82,34 @@ class ScalewayConnection(ConnectionUserAndKey):
if not self.host == old_host:
self.connect()
- if paged:
- if params is None:
- params = {}
-
- if isinstance(params, dict):
- params['per_page'] = 100
- else:
- params.append(('per_page', 100))
-
return super(ScalewayConnection, self).request(action, params, data,
headers, method, raw,
stream)
+ def _request_paged(self, action, params=None, data=None, headers=None,
+ method='GET', raw=False, stream=False, region=None):
+ if params is None:
+ params = {}
+
+ if isinstance(params, dict):
+ params['per_page'] = 100
+ else:
+ params.append(('per_page', 100))
+
+ results = self.request(action, params, data, headers,
+ method, raw, stream, region).object
+
+ links = self.connection.getresponse().links
+ while links and 'next' in links:
+ next = self.request(links['next']['url'], data=data,
+ headers=headers, method=method,
+ raw=raw, stream=stream).object
+ merged = {root: child + next[root]
+ for root, child in list(results.items())}
+ results = merged
+
+ return results
+
def add_default_headers(self, headers):
"""
Add headers that are necessary for every request
@@ -168,13 +167,13 @@ class ScalewayNodeDriver(NodeDriver):
:return: list of node size objects
:rtype: ``list`` of :class:`.NodeSize`
"""
- response = self.connection.request('/products/servers', region=region,
- paged=True)
- sizes = response.object['servers']
+ response = self.connection._request_paged('/products/servers',
+ region=region)
+ sizes = response['servers']
- response = self.connection.request('/products/servers/availability',
- region=region, paged=True)
- availability = response.object['servers']
+ response = self.connection._request_paged(
+ '/products/servers/availability', region=region)
+ availability = response['servers']
return sorted([self._to_size(name, sizes[name], availability[name])
for name in sizes], key=lambda x: x.name)
@@ -221,9 +220,8 @@ class ScalewayNodeDriver(NodeDriver):
:return: list of image objects
:rtype: ``list`` of :class:`.NodeImage`
"""
- response = self.connection.request('/images', region=region,
- paged=True)
- images = response.object['images']
+ response = self.connection._request_paged('/images', region=region)
+ images = response['images']
return [self._to_image(image) for image in images]
def create_image(self, node, name, region=None):
@@ -317,9 +315,8 @@ class ScalewayNodeDriver(NodeDriver):
:return: list of node objects
:rtype: ``list`` of :class:`.Node`
"""
- response = self.connection.request('/servers', region=region,
- paged=True)
- servers = response.object['servers']
+ response = self.connection._request_paged('/servers', region=region)
+ servers = response['servers']
return [self._to_node(server) for server in servers]
def _to_node(self, server):
@@ -457,9 +454,8 @@ class ScalewayNodeDriver(NodeDriver):
:return: A list of volume objects.
:rtype: ``list`` of :class:`StorageVolume`
"""
- response = self.connection.request('/volumes', region=region,
- paged=True)
- volumes = response.object['volumes']
+ response = self.connection._request_paged('/volumes', region=region)
+ volumes = response['volumes']
return [self._to_volume(volume) for volume in volumes]
def _to_volume(self, volume):
@@ -485,10 +481,9 @@ class ScalewayNodeDriver(NodeDriver):
(if None, use default region specified in __init__)
:type region: :class:`.NodeLocation`
"""
- response = self.connection.request('/snapshots', region=region,
- paged=True)
+ response = self.connection._request_paged('/snapshots', region=region)
snapshots = filter(lambda s: s['base_volume']['id'] == volume.id,
- response.object['snapshots'])
+ response['snapshots'])
return [self._to_snapshot(snapshot) for snapshot in snapshots]
def _to_snapshot(self, snapshot):