Browse Source

Add 'env' option during get_instance(s) API calls

Nashwan Azhari 6 years ago
parent
commit
32213759bc

+ 15 - 3
coriolis/api/v1/endpoint_instances.py

@@ -2,7 +2,6 @@
 # All Rights Reserved.
 
 from oslo_log import log as logging
-from webob import exc
 
 from coriolis import utils
 from coriolis.api import common
@@ -26,9 +25,16 @@ class EndpointInstanceController(api_wsgi.Controller):
         marker, limit = common.get_paging_params(req)
         instance_name_pattern = req.GET.get("name")
 
+        env = req.GET.get("env")
+        if env is not None:
+            env = utils.decode_base64_param(env, is_json=True)
+        else:
+            env = {}
+
         return endpoint_instance_view.collection(
             req, self._instance_api.get_endpoint_instances(
-                context, endpoint_id, marker, limit, instance_name_pattern))
+                context, endpoint_id, env, marker, limit,
+                instance_name_pattern))
 
     def show(self, req, endpoint_id, id):
         context = req.environ['coriolis.context']
@@ -39,9 +45,15 @@ class EndpointInstanceController(api_wsgi.Controller):
         # See e.g.: https://github.com/pallets/flask/issues/900
         id = utils.decode_base64_param(id)
 
+        env = req.GET.get("env")
+        if env is not None:
+            env = utils.decode_base64_param(env, is_json=True)
+        else:
+            env = {}
+
         return endpoint_instance_view.single(
             req, self._instance_api.get_endpoint_instance(
-                req.environ['coriolis.context'], endpoint_id, id))
+                req.environ['coriolis.context'], endpoint_id, env, id))
 
 
 def create_resource():

+ 7 - 3
coriolis/conductor/rpc/client.py

@@ -49,19 +49,23 @@ class ConductorClient(object):
         return self._client.call(
             ctxt, 'delete_endpoint', endpoint_id=endpoint_id)
 
-    def get_endpoint_instances(self, ctxt, endpoint_id, marker=None,
-                               limit=None, instance_name_pattern=None):
+    def get_endpoint_instances(self, ctxt, endpoint_id, source_environment,
+                               marker=None, limit=None,
+                               instance_name_pattern=None):
         return self._client.call(
             ctxt, 'get_endpoint_instances',
             endpoint_id=endpoint_id,
+            source_environment=source_environment,
             marker=marker,
             limit=limit,
             instance_name_pattern=instance_name_pattern)
 
-    def get_endpoint_instance(self, ctxt, endpoint_id, instance_name):
+    def get_endpoint_instance(
+            self, ctxt, endpoint_id, source_environment, instance_name):
         return self._client.call(
             ctxt, 'get_endpoint_instance',
             endpoint_id=endpoint_id,
+            source_environment=source_environment,
             instance_name=instance_name)
 
     def get_endpoint_source_options(

+ 8 - 6
coriolis/conductor/rpc/server.py

@@ -182,19 +182,21 @@ class ConductorServerEndpoint(object):
                                           q_replicas_count)
         db_api.delete_endpoint(ctxt, endpoint_id)
 
-    def get_endpoint_instances(self, ctxt, endpoint_id, marker, limit,
-                               instance_name_pattern):
+    def get_endpoint_instances(self, ctxt, endpoint_id, source_environment,
+                               marker, limit, instance_name_pattern):
         endpoint = self.get_endpoint(ctxt, endpoint_id)
 
         return self._rpc_worker_client.get_endpoint_instances(
-            ctxt, endpoint.type, endpoint.connection_info, marker, limit,
-            instance_name_pattern)
+            ctxt, endpoint.type, endpoint.connection_info,
+            source_environment, marker, limit, instance_name_pattern)
 
-    def get_endpoint_instance(self, ctxt, endpoint_id, instance_name):
+    def get_endpoint_instance(
+            self, ctxt, endpoint_id, source_environment, instance_name):
         endpoint = self.get_endpoint(ctxt, endpoint_id)
 
         return self._rpc_worker_client.get_endpoint_instance(
-            ctxt, endpoint.type, endpoint.connection_info, instance_name)
+            ctxt, endpoint.type, endpoint.connection_info,
+            source_environment, instance_name)
 
     def get_endpoint_source_options(
             self, ctxt, endpoint_id, env, option_names):

+ 8 - 5
coriolis/endpoint_instances/api.py

@@ -8,11 +8,14 @@ class API(object):
     def __init__(self):
         self._rpc_client = rpc_client.ConductorClient()
 
-    def get_endpoint_instances(self, ctxt, endpoint_id, marker=None,
-                               limit=None, instance_name_pattern=None):
+    def get_endpoint_instances(self, ctxt, endpoint_id, source_environment,
+                               marker=None, limit=None,
+                               instance_name_pattern=None):
         return self._rpc_client.get_endpoint_instances(
-            ctxt, endpoint_id, marker, limit, instance_name_pattern)
+            ctxt, endpoint_id, source_environment, marker,
+            limit, instance_name_pattern)
 
-    def get_endpoint_instance(self, ctxt, endpoint_id, instance_name):
+    def get_endpoint_instance(
+            self, ctxt, endpoint_id, source_environment, instance_name):
         return self._rpc_client.get_endpoint_instance(
-            ctxt, endpoint_id, instance_name)
+            ctxt, endpoint_id, source_environment, instance_name)

+ 7 - 4
coriolis/providers/base.py

@@ -34,13 +34,15 @@ class BaseEndpointInstancesProvider(BaseEndpointProvider):
     """Defines operations for listing instances off of Endpoints."""
 
     @abc.abstractmethod
-    def get_instances(self, ctxt, connection_info, limit=None,
-                      last_seen_id=None, instance_name_pattern=None):
+    def get_instances(self, ctxt, connection_info, source_environment,
+                      limit=None, last_seen_id=None,
+                      instance_name_pattern=None):
         """Returns a list of instances."""
         raise NotImplementedError()
 
     @abc.abstractmethod
-    def get_instance(self, ctxt, connection_info, instance_name):
+    def get_instance(
+            self, ctxt, connection_info, source_environment, instance_name):
         """Returns detailed info for a given instance."""
         raise NotImplementedError()
 
@@ -477,7 +479,8 @@ class BaseUpdateSourceReplicaProvider(object, with_metaclass(abc.ABCMeta)):
         """
 
 
-class BaseUpdateDestinationReplicaProvider(object, with_metaclass(abc.ABCMeta)):
+class BaseUpdateDestinationReplicaProvider(
+        object, with_metaclass(abc.ABCMeta)):
     """ Class for replica import providers which offer the functionality
     of updating the parameters for a replica.
     """

+ 4 - 2
coriolis/worker/rpc/client.py

@@ -43,22 +43,24 @@ class WorkerClient(object):
         self._client.call(ctxt, "update_migration_status", status=status)
 
     def get_endpoint_instances(self, ctxt, platform_name, connection_info,
-                               marker=None, limit=None,
+                               source_environment, marker=None, limit=None,
                                instance_name_pattern=None):
         return self._client.call(
             ctxt, 'get_endpoint_instances',
             platform_name=platform_name,
             connection_info=connection_info,
+            source_environment=source_environment,
             marker=marker,
             limit=limit,
             instance_name_pattern=instance_name_pattern)
 
     def get_endpoint_instance(self, ctxt, platform_name, connection_info,
-                              instance_name):
+                              source_environment, instance_name):
         return self._client.call(
             ctxt, 'get_endpoint_instance',
             platform_name=platform_name,
             connection_info=connection_info,
+            source_environment=source_environment,
             instance_name=instance_name)
 
     def get_endpoint_destination_options(

+ 8 - 5
coriolis/worker/rpc/server.py

@@ -164,7 +164,7 @@ class WorkerServerEndpoint(object):
                 if not result:
                     try:
                         result = mp_q.get(False)
-                    except:
+                    except BaseException:
                         pass
                 break
         return result
@@ -237,7 +237,8 @@ class WorkerServerEndpoint(object):
                 self._check_remove_dir(export_path)
 
     def get_endpoint_instances(self, ctxt, platform_name, connection_info,
-                               marker, limit, instance_name_pattern):
+                               source_environment, marker, limit,
+                               instance_name_pattern):
         export_provider = providers_factory.get_provider(
             platform_name, constants.PROVIDER_TYPE_ENDPOINT_INSTANCES, None)
 
@@ -245,7 +246,8 @@ class WorkerServerEndpoint(object):
             ctxt, connection_info)
 
         instances_info = export_provider.get_instances(
-            ctxt, secret_connection_info, last_seen_id=marker, limit=limit,
+            ctxt, secret_connection_info, source_environment,
+            last_seen_id=marker, limit=limit,
             instance_name_pattern=instance_name_pattern)
         for instance_info in instances_info:
             schemas.validate_value(
@@ -254,7 +256,7 @@ class WorkerServerEndpoint(object):
         return instances_info
 
     def get_endpoint_instance(self, ctxt, platform_name, connection_info,
-                              instance_name):
+                              source_environment, instance_name):
         provider = providers_factory.get_provider(
             platform_name, constants.PROVIDER_TYPE_ENDPOINT_INSTANCES, None)
 
@@ -262,7 +264,8 @@ class WorkerServerEndpoint(object):
             ctxt, connection_info)
 
         instance_info = provider.get_instance(
-            ctxt, secret_connection_info, instance_name)
+            ctxt, secret_connection_info, source_environment,
+            instance_name)
 
         schemas.validate_value(
             instance_info, schemas.CORIOLIS_VM_EXPORT_INFO_SCHEMA)