Explorar o código

Add endpoint instance API

Alessandro Pilotti %!s(int64=8) %!d(string=hai) anos
pai
achega
7ab9cc323d

+ 10 - 0
coriolis/api/v1/endpoint_instances.py

@@ -7,6 +7,7 @@ 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
+from coriolis import utils
 
 LOG = logging.getLogger(__name__)
 
@@ -25,6 +26,15 @@ class EndpointInstanceController(api_wsgi.Controller):
                 req.environ['coriolis.context'], endpoint_id, marker, limit,
                 instance_name_pattern))
 
+    def show(self, req, endpoint_id, id):
+        # WSGI does not allow encoded / chars (%2F) in the url
+        # See e.g.: https://github.com/pallets/flask/issues/900
+        id = utils.decode_base64_param(id)
+
+        return endpoint_instance_view.single(
+            req, self._instance_api.get_endpoint_instance(
+                req.environ['coriolis.context'], endpoint_id, id))
+
 
 def create_resource():
     return api_wsgi.Resource(EndpointInstanceController())

+ 6 - 0
coriolis/conductor/rpc/client.py

@@ -46,6 +46,12 @@ class ConductorClient(object):
             limit=limit,
             instance_name_pattern=instance_name_pattern)
 
+    def get_endpoint_instance(self, ctxt, endpoint_id, instance_name):
+        return self._client.call(
+            ctxt, 'get_endpoint_instance',
+            endpoint_id=endpoint_id,
+            instance_name=instance_name)
+
     def get_endpoint_networks(self, ctxt, endpoint_id, env):
         return self._client.call(
             ctxt, 'get_endpoint_networks',

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

@@ -113,6 +113,12 @@ class ConductorServerEndpoint(object):
             ctxt, endpoint.type, endpoint.connection_info, marker, limit,
             instance_name_pattern)
 
+    def get_endpoint_instance(self, ctxt, endpoint_id, 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)
+
     def get_endpoint_networks(self, ctxt, endpoint_id, env):
         endpoint = self.get_endpoint(ctxt, endpoint_id)
 

+ 4 - 0
coriolis/endpoint_instances/api.py

@@ -12,3 +12,7 @@ class API(object):
                                limit=None, instance_name_pattern=None):
         return self._rpc_client.get_endpoint_instances(
             ctxt, endpoint_id, marker, limit, instance_name_pattern)
+
+    def get_endpoint_instance(self, ctxt, endpoint_id, instance_name):
+        return self._rpc_client.get_endpoint_instance(
+            ctxt, endpoint_id, instance_name)

+ 5 - 0
coriolis/providers/base.py

@@ -42,6 +42,11 @@ class BaseResourcesEndpointProvider(BaseEndpointProvider):
         raise NotImplementedError(
             "The provider does not define an instance list method.")
 
+    @abc.abstractmethod
+    def get_instance(self, ctxt, connection_info, instance_name):
+        """ Returns detailed info for a given instance """
+        raise NotImplementedError()
+
 
 class BaseEndpointNetworksProvider(object):
     """ Defines operations for endpoints networks """

+ 8 - 0
coriolis/worker/rpc/client.py

@@ -41,6 +41,14 @@ class WorkerClient(object):
             limit=limit,
             instance_name_pattern=instance_name_pattern)
 
+    def get_endpoint_instance(self, ctxt, platform_name, connection_info,
+                              instance_name):
+        return self._client.call(
+            ctxt, 'get_endpoint_instance',
+            platform_name=platform_name,
+            connection_info=connection_info,
+            instance_name=instance_name)
+
     def get_endpoint_networks(self, ctxt, platform_name, connection_info, env):
         return self._client.call(
             ctxt, 'get_endpoint_networks',

+ 16 - 0
coriolis/worker/rpc/server.py

@@ -184,6 +184,22 @@ class WorkerServerEndpoint(object):
 
         return instances_info
 
+    def get_endpoint_instance(self, ctxt, platform_name, connection_info,
+                              instance_name):
+        provider = providers_factory.get_provider(
+            platform_name, constants.PROVIDER_TYPE_RESOURCES_ENDPOINT, None)
+
+        secret_connection_info = utils.get_secret_connection_info(
+            ctxt, connection_info)
+
+        instance_info = provider.get_instance(
+            ctxt, secret_connection_info, instance_name)
+
+        schemas.validate_value(
+            instance_info, schemas.CORIOLIS_VM_INSTANCE_INFO_SCHEMA)
+
+        return instance_info
+
     def get_endpoint_networks(self, ctxt, platform_name, connection_info, env):
         provider = providers_factory.get_provider(
             platform_name, constants.PROVIDER_TYPE_ENDPOINT_NETWORKS, None)