Quellcode durchsuchen

Adds pagination to get_endpoint_instances

Alessandro Pilotti vor 9 Jahren
Ursprung
Commit
cdc95e624a

+ 12 - 0
coriolis/api/common.py

@@ -0,0 +1,12 @@
+# Copyright 2016 Cloudbase Solutions Srl
+# All Rights Reserved.
+
+from coriolis import utils
+
+
+def get_paging_params(req):
+    marker = req.GET.get("marker")
+    limit = req.GET.get("limit")
+    if limit is not None:
+        limit = utils.parse_int_value(limit)
+    return marker, limit

+ 4 - 1
coriolis/api/v1/endpoint_instances.py

@@ -3,6 +3,7 @@
 
 from oslo_log import log as logging
 
+from coriolis.api import common
 from coriolis.api import wsgi as api_wsgi
 from coriolis.api.v1.views import endpoint_instance_view
 from coriolis.endpoint_instances import api
@@ -16,9 +17,11 @@ class EndpointInstanceController(api_wsgi.Controller):
         super(EndpointInstanceController, self).__init__()
 
     def index(self, req, endpoint_id):
+        marker, limit = common.get_paging_params(req)
+
         return endpoint_instance_view.collection(
             req, self._instance_api.get_endpoint_instances(
-                req.environ['coriolis.context'], endpoint_id))
+                req.environ['coriolis.context'], endpoint_id, marker, limit))
 
 
 def create_resource():

+ 5 - 2
coriolis/conductor/rpc/client.py

@@ -31,10 +31,13 @@ class ConductorClient(object):
         return self._client.call(
             ctxt, 'delete_endpoint', endpoint_id=endpoint_id)
 
-    def get_endpoint_instances(self, ctxt, endpoint_id):
+    def get_endpoint_instances(self, ctxt, endpoint_id, marker=None,
+                               limit=None):
         return self._client.call(
             ctxt, 'get_endpoint_instances',
-            endpoint_id=endpoint_id)
+            endpoint_id=endpoint_id,
+            marker=marker,
+            limit=limit)
 
     def execute_replica_tasks(self, ctxt, replica_id,
                               shutdown_instances=False):

+ 3 - 2
coriolis/conductor/rpc/server.py

@@ -102,7 +102,7 @@ class ConductorServerEndpoint(object):
     def delete_endpoint(self, ctxt, endpoint_id):
         db_api.delete_endpoint(ctxt, endpoint_id)
 
-    def get_endpoint_instances(self, ctxt, endpoint_id):
+    def get_endpoint_instances(self, ctxt, endpoint_id, marker, limit):
         endpoint = self.get_endpoint(ctxt, endpoint_id)
 
         export_provider = providers_factory.get_provider(
@@ -111,7 +111,8 @@ class ConductorServerEndpoint(object):
         connection_info = utils.get_secret_connection_info(
             ctxt, endpoint.connection_info)
 
-        instances_info = export_provider.get_instances(ctxt, connection_info)
+        instances_info = export_provider.get_instances(
+            ctxt, connection_info, last_seen_id=marker, limit=limit)
         for instance_info in instances_info:
             schemas.validate_value(
                 instance_info, schemas.CORIOLIS_VM_INSTANCE_INFO_SCHEMA)

+ 4 - 2
coriolis/endpoint_instances/api.py

@@ -8,5 +8,7 @@ class API(object):
     def __init__(self):
         self._rpc_client = rpc_client.ConductorClient()
 
-    def get_endpoint_instances(self, ctxt, endpoint_id):
-        return self._rpc_client.get_endpoint_instances(ctxt, endpoint_id)
+    def get_endpoint_instances(self, ctxt, endpoint_id, marker=None,
+                               limit=None):
+        return self._rpc_client.get_endpoint_instances(
+            ctxt, endpoint_id, marker, limit)

+ 7 - 0
coriolis/utils.py

@@ -351,3 +351,10 @@ def get_secret_connection_info(ctxt, connection_info):
         LOG.info("Retrieving connection info from secret: %s", secret_ref)
         connection_info = secrets.get_secret(ctxt, secret_ref)
     return connection_info
+
+
+def parse_int_value(value):
+    try:
+        return int(str(value))
+    except ValueError:
+        raise exception.InvalidInput("Invalid integer: %s" % value)