Просмотр исходного кода

Merged in ArinToaca/coriolis-core/network-map-change (pull request #134)

Define dedicated 'network_map' field in body of transfer actions.

Approved-by: Nashwan Azhari <nazhari@cloudbasesolutions.com>
Arin Toaca 7 лет назад
Родитель
Сommit
3ca2bc35c8

+ 18 - 3
coriolis/api/v1/migrations.py

@@ -5,6 +5,7 @@ from oslo_log import log as logging
 from webob import exc
 
 from coriolis import exception
+from coriolis import schemas
 from coriolis.api.v1.views import migration_view
 from coriolis.api import wsgi as api_wsgi
 from coriolis.endpoints import api as endpoints_api
@@ -52,10 +53,23 @@ class MigrationController(api_wsgi.Controller):
             instances = migration["instances"]
             notes = migration.get("notes")
             skip_os_morphing = migration.get("skip_os_morphing", False)
+            network_map = migration.get("network_map", {})
+            try:
+                schemas.validate_value(
+                    network_map, schemas.CORIOLIS_NETWORK_MAP_SCHEMA)
+            except exception.SchemaValidationException:
+                raise exc.HTTPBadRequest(
+                    explanation="Invalid network_map "
+                                "%s" % network_map)
+
+            # NOTE: until the provider plugin interface is updated to have a
+            # separate 'network_map' field, we add it into the destination
+            # environment.
+            destination_environment['network_map'] = network_map
 
             return (origin_endpoint_id, destination_endpoint_id,
                     destination_environment, instances, notes,
-                    skip_os_morphing)
+                    skip_os_morphing, network_map)
         except Exception as ex:
             LOG.exception(ex)
             if hasattr(ex, "message"):
@@ -86,7 +100,7 @@ class MigrationController(api_wsgi.Controller):
              destination_environment,
              instances,
              notes,
-             skip_os_morphing) = self._validate_migration_input(
+             skip_os_morphing, network_map) = self._validate_migration_input(
                 migration_body)
             is_valid, message = (
                 self._endpoints_api.validate_target_environment(
@@ -98,7 +112,8 @@ class MigrationController(api_wsgi.Controller):
 
             migration = self._migration_api.migrate_instances(
                 context, origin_endpoint_id, destination_endpoint_id,
-                destination_environment, instances, notes, skip_os_morphing)
+                destination_environment, instances, network_map, notes,
+                skip_os_morphing)
 
         return migration_view.single(req, migration)
 

+ 17 - 3
coriolis/api/v1/replicas.py

@@ -5,6 +5,7 @@ from oslo_log import log as logging
 from webob import exc
 
 from coriolis import exception
+from coriolis import schemas
 from coriolis.api.v1.views import replica_view
 from coriolis.api import wsgi as api_wsgi
 from coriolis.endpoints import api as endpoints_api
@@ -53,9 +54,22 @@ class ReplicaController(api_wsgi.Controller):
             destination_environment = replica.get("destination_environment")
             instances = replica["instances"]
             notes = replica.get("notes")
+            network_map = replica.get("network_map")
+            try:
+                schemas.validate_value(
+                    network_map, schemas.CORIOLIS_NETWORK_MAP_SCHEMA)
+            except exception.SchemaValidationException:
+                raise exc.HTTPBadRequest(
+                    explanation="Invalid network_map "
+                                "%s" % network_map)
+
+            # NOTE: until the provider plugin interface is updated to have a
+            # separate 'network_map' field, we add it into the destination
+            # environment.
+            destination_environment["network_map"] = network_map
 
             return (origin_endpoint_id, destination_endpoint_id,
-                    destination_environment, instances, notes)
+                    destination_environment, instances, network_map, notes)
         except Exception as ex:
             LOG.exception(ex)
             if hasattr(ex, "message"):
@@ -69,7 +83,7 @@ class ReplicaController(api_wsgi.Controller):
         context.can(replica_policies.get_replicas_policy_label("create"))
 
         (origin_endpoint_id, destination_endpoint_id,
-         destination_environment, instances,
+         destination_environment, instances, network_map,
          notes) = self._validate_create_body(body)
 
         is_valid, message = (
@@ -83,7 +97,7 @@ class ReplicaController(api_wsgi.Controller):
 
         return replica_view.single(req, self._replica_api.create(
             context, origin_endpoint_id, destination_endpoint_id,
-            destination_environment, instances, notes))
+            destination_environment, instances, network_map, notes))
 
     def delete(self, req, id):
         context = req.environ["coriolis.context"]

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

@@ -130,14 +130,15 @@ class ConductorClient(object):
     def create_instances_replica(self, ctxt, origin_endpoint_id,
                                  destination_endpoint_id,
                                  destination_environment,
-                                 instances, notes=None):
+                                 instances, network_map, notes=None):
         return self._client.call(
             ctxt, 'create_instances_replica',
             origin_endpoint_id=origin_endpoint_id,
             destination_endpoint_id=destination_endpoint_id,
             destination_environment=destination_environment,
             instances=instances,
-            notes=notes)
+            notes=notes,
+            network_map=network_map)
 
     def get_replicas(self, ctxt, include_tasks_executions=False):
         return self._client.call(
@@ -166,7 +167,8 @@ class ConductorClient(object):
 
     def migrate_instances(self, ctxt, origin_endpoint_id,
                           destination_endpoint_id, destination_environment,
-                          instances, notes=None, skip_os_morphing=False):
+                          instances, network_map, notes=None,
+                          skip_os_morphing=False):
         return self._client.call(
             ctxt, 'migrate_instances',
             origin_endpoint_id=origin_endpoint_id,
@@ -174,7 +176,8 @@ class ConductorClient(object):
             destination_environment=destination_environment,
             instances=instances,
             notes=notes,
-            skip_os_morphing=skip_os_morphing)
+            skip_os_morphing=skip_os_morphing,
+            network_map=network_map)
 
     def deploy_replica_instances(self, ctxt, replica_id, clone_disks=False,
                                  force=False, skip_os_morphing=False):

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

@@ -381,7 +381,7 @@ class ConductorServerEndpoint(object):
     def create_instances_replica(self, ctxt, origin_endpoint_id,
                                  destination_endpoint_id,
                                  destination_environment, instances,
-                                 notes=None):
+                                 network_map, notes=None):
         origin_endpoint = self.get_endpoint(ctxt, origin_endpoint_id)
         destination_endpoint = self.get_endpoint(ctxt, destination_endpoint_id)
         self._check_endpoints(ctxt, origin_endpoint, destination_endpoint)
@@ -395,6 +395,7 @@ class ConductorServerEndpoint(object):
         replica.executions = []
         replica.info = {}
         replica.notes = notes
+        replica.network_map = network_map
 
         db_api.add_replica(ctxt, replica)
         LOG.info("Replica created: %s", replica.id)
@@ -487,6 +488,7 @@ class ConductorServerEndpoint(object):
         migration.origin_endpoint_id = replica.origin_endpoint_id
         migration.destination_endpoint_id = replica.destination_endpoint_id
         migration.destination_environment = replica.destination_environment
+        migration.network_map = replica.network_map
         migration.instances = instances
         migration.replica = replica
         migration.info = replica.info
@@ -575,7 +577,8 @@ class ConductorServerEndpoint(object):
 
     def migrate_instances(self, ctxt, origin_endpoint_id,
                           destination_endpoint_id, destination_environment,
-                          instances, skip_os_morphing=False, notes=None):
+                          instances, network_map, skip_os_morphing=False,
+                          notes=None):
         origin_endpoint = self.get_endpoint(ctxt, origin_endpoint_id)
         destination_endpoint = self.get_endpoint(ctxt, destination_endpoint_id)
         self._check_endpoints(ctxt, origin_endpoint, destination_endpoint)
@@ -588,6 +591,7 @@ class ConductorServerEndpoint(object):
         migration.origin_endpoint = origin_endpoint
         migration.destination_endpoint = destination_endpoint
         migration.destination_environment = destination_environment
+        migration.network_map = network_map
         execution = models.TasksExecution()
         execution.status = constants.EXECUTION_STATUS_RUNNING
         execution.number = 1

+ 17 - 0
coriolis/db/sqlalchemy/migrate_repo/versions/006_adds_network_map.py

@@ -0,0 +1,17 @@
+# Copyright 2018 Cloudbase Solutions Srl
+# All Rights Reserved.
+
+import sqlalchemy
+
+
+def upgrade(migrate_engine):
+    meta = sqlalchemy.MetaData()
+    meta.bind = migrate_engine
+
+    # add 'network_map' column to 'base_transfer_action':
+    base_transfer_action = sqlalchemy.Table(
+        'base_transfer_action', meta, autoload=True)
+
+    network_map = sqlalchemy.Column(
+        "network_map", sqlalchemy.Text, nullable=True)
+    base_transfer_action.create_column(network_map)

+ 1 - 0
coriolis/db/sqlalchemy/models.py

@@ -112,6 +112,7 @@ class BaseTransferAction(BASE, models.TimestampMixin, models.ModelBase,
         sqlalchemy.String(36),
         sqlalchemy.ForeignKey('endpoint.id'), nullable=False)
     transfer_result = sqlalchemy.Column(types.Json, nullable=True)
+    network_map = sqlalchemy.Column(types.Json, nullable=True)
 
     __mapper_args__ = {
         'polymorphic_identity': 'base_transfer_action',

+ 4 - 2
coriolis/migrations/api.py

@@ -10,10 +10,12 @@ class API(object):
 
     def migrate_instances(self, ctxt, origin_endpoint_id,
                           destination_endpoint_id, destination_environment,
-                          instances, notes=None, skip_os_morphing=False):
+                          instances, network_map, notes=None,
+                          skip_os_morphing=False):
         return self._rpc_client.migrate_instances(
             ctxt, origin_endpoint_id, destination_endpoint_id,
-            destination_environment, instances, notes, skip_os_morphing)
+            destination_environment, instances, network_map, notes,
+            skip_os_morphing)
 
     def deploy_replica_instances(self, ctxt, replica_id, clone_disks=False,
                                  force=False, skip_os_morphing=False):

+ 2 - 2
coriolis/replicas/api.py

@@ -9,10 +9,10 @@ class API(object):
         self._rpc_client = rpc_client.ConductorClient()
 
     def create(self, ctxt, origin_endpoint_id, destination_endpoint_id,
-               destination_environment, instances, notes=None):
+               destination_environment, instances, network_map, notes=None):
         return self._rpc_client.create_instances_replica(
             ctxt, origin_endpoint_id, destination_endpoint_id,
-            destination_environment, instances, notes)
+            destination_environment, instances, network_map, notes)
 
     def delete(self, ctxt, replica_id):
         self._rpc_client.delete_replica(ctxt, replica_id)

+ 4 - 0
coriolis/schemas.py

@@ -26,6 +26,7 @@ _CORIOLIS_OS_MORPHING_RES_SCHEMA_NAME = "os_morphing_resources_schema.json"
 _CORIOLIS_VM_NETWORK_SCHEMA_NAME = "vm_network_schema.json"
 _SCHEDULE_API_BODY_SCHEMA_NAME = "replica_schedule_schema.json"
 _CORIOLIS_DESTINATION_OPTIONS_SCHEMA_NAME = "destination_options_schema.json"
+_CORIOLIS_NETWORK_MAP_SCHEMA_NAME = "network_map_schema.json"
 
 
 def get_schema(package_name, schema_name,
@@ -85,3 +86,6 @@ SCHEDULE_API_BODY_SCHEMA = get_schema(
 
 CORIOLIS_DESTINATION_ENVIRONMENT = get_schema(
     __name__, _CORIOLIS_DESTINATION_OPTIONS_SCHEMA_NAME)
+
+CORIOLIS_NETWORK_MAP_SCHEMA = get_schema(
+    __name__, _CORIOLIS_NETWORK_MAP_SCHEMA_NAME)

+ 4 - 0
coriolis/schemas/network_map_schema.json

@@ -0,0 +1,4 @@
+{
+  "$schema": "http://cloudbase.it/coriolis/schemas/network_map_schema#",
+  "type": "object"
+}