瀏覽代碼

Add deployment options to transfers body

Adds default deployment options to transfers, which will be used for
auto-deployments.
Daniel Vincze 1 年之前
父節點
當前提交
508b3fd87f

+ 16 - 3
coriolis/api/v1/transfers.py

@@ -136,11 +136,15 @@ class TransferController(api_wsgi.Controller):
 
         destination_environment['storage_mappings'] = storage_mappings
 
+        clone_disks = transfer.get('clone_disks', True)
+        skip_os_morphing = transfer.get('skip_os_morphing', False)
+
         return (scenario, origin_endpoint_id, destination_endpoint_id,
                 source_environment, destination_environment, instances,
                 network_map, storage_mappings, notes,
                 origin_minion_pool_id, destination_minion_pool_id,
-                instance_osmorphing_minion_pool_mappings, user_scripts)
+                instance_osmorphing_minion_pool_mappings, user_scripts,
+                clone_disks, skip_os_morphing)
 
     def create(self, req, body):
         context = req.environ["coriolis.context"]
@@ -150,7 +154,8 @@ class TransferController(api_wsgi.Controller):
          source_environment, destination_environment, instances, network_map,
          storage_mappings, notes, origin_minion_pool_id,
          destination_minion_pool_id,
-         instance_osmorphing_minion_pool_mappings, user_scripts) = (
+         instance_osmorphing_minion_pool_mappings, user_scripts, clone_disks,
+         skip_os_morphing) = (
             self._validate_create_body(context, body))
 
         return transfer_view.single(self._transfer_api.create(
@@ -158,7 +163,8 @@ class TransferController(api_wsgi.Controller):
             origin_minion_pool_id, destination_minion_pool_id,
             instance_osmorphing_minion_pool_mappings, source_environment,
             destination_environment, instances, network_map,
-            storage_mappings, notes, user_scripts))
+            storage_mappings, notes, user_scripts, clone_disks,
+            skip_os_morphing))
 
     def delete(self, req, id):
         context = req.environ["coriolis.context"]
@@ -282,6 +288,13 @@ class TransferController(api_wsgi.Controller):
         else:
             final_values['notes'] = transfer.get('notes', '')
 
+        bool_opts = ['clone_disks', 'skip_os_morphing']
+        for opt in bool_opts:
+            if opt in updated_values:
+                final_values[opt] = updated_values.get(opt)
+            else:
+                final_values[opt] = transfer.get(opt, False)
+
         # NOTE: until the provider plugin interface is updated
         # to have separate 'network_map' and 'storage_mappings' fields,
         # we add them as part of the destination environment:

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

@@ -167,7 +167,8 @@ class ConductorClient(rpc.BaseRPCClient):
                                   instance_osmorphing_minion_pool_mappings,
                                   source_environment, destination_environment,
                                   instances, network_map, storage_mappings,
-                                  notes=None, user_scripts=None):
+                                  notes=None, user_scripts=None,
+                                  clone_disks=True, skip_os_morphing=False):
         return self._call(
             ctxt, 'create_instances_transfer',
             transfer_scenario=transfer_scenario,
@@ -183,7 +184,9 @@ class ConductorClient(rpc.BaseRPCClient):
             network_map=network_map,
             storage_mappings=storage_mappings,
             source_environment=source_environment,
-            user_scripts=user_scripts)
+            user_scripts=user_scripts,
+            clone_disks=clone_disks,
+            skip_os_morphing=skip_os_morphing)
 
     def get_transfers(self, ctxt, include_tasks_executions=False,
                       include_task_info=False):

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

@@ -1109,8 +1109,16 @@ class ConductorServerEndpoint(object):
             self._begin_tasks(ctxt, transfer, execution)
 
         if auto_deploy:
+            deployment_options = {
+                "clone_disks": transfer.clone_disks,
+                "instance_osmorphing_minion_pool_mappings": (
+                    transfer.instance_osmorphing_minion_pool_mappings),
+                "skip_os_morphing": transfer.skip_os_morphing,
+                "user_scripts": transfer.user_scripts,
+                "force": False,
+            }
             self._worker_client.execute_auto_deployment(
-                ctxt, transfer.id, execution.id)
+                ctxt, transfer.id, execution.id, **deployment_options)
 
         return self.get_transfer_tasks_execution(
             ctxt, transfer_id, execution.id)
@@ -1265,7 +1273,8 @@ class ConductorServerEndpoint(object):
                                   source_environment,
                                   destination_environment, instances,
                                   network_map, storage_mappings, notes=None,
-                                  user_scripts=None):
+                                  user_scripts=None, clone_disks=True,
+                                  skip_os_morphing=False):
         supported_scenarios = [
             constants.TRANSFER_SCENARIO_REPLICA,
             constants.TRANSFER_SCENARIO_LIVE_MIGRATION]
@@ -1300,6 +1309,8 @@ class ConductorServerEndpoint(object):
         transfer.instance_osmorphing_minion_pool_mappings = (
             instance_osmorphing_minion_pool_mappings)
         transfer.user_scripts = user_scripts or {}
+        transfer.clone_disks = clone_disks
+        transfer.skip_os_morphing = skip_os_morphing
 
         self._check_minion_pools_for_action(ctxt, transfer)
 

+ 2 - 1
coriolis/db/api.py

@@ -949,7 +949,8 @@ def update_transfer(context, transfer_id, updated_values):
         "source_environment", "destination_environment", "notes",
         "network_map", "storage_mappings",
         "origin_minion_pool_id", "destination_minion_pool_id",
-        "instance_osmorphing_minion_pool_mappings"]
+        "instance_osmorphing_minion_pool_mappings", "clone_disks",
+        "skip_os_morphing"]
     for field in updateable_fields:
         if mapped_info_fields.get(field, field) in updated_values:
             LOG.debug(

+ 15 - 0
coriolis/db/sqlalchemy/migrate_repo/versions/021_add_deployment_defaults.py

@@ -0,0 +1,15 @@
+import sqlalchemy
+
+
+def upgrade(migrate_engine):
+    meta = sqlalchemy.MetaData()
+    meta.bind = migrate_engine
+
+    base_transfer = sqlalchemy.Table(
+        'base_transfer_action', meta, autoload=True)
+    clone_disks = sqlalchemy.Column(
+        "clone_disks", sqlalchemy.Boolean, nullable=False, default=True)
+    base_transfer.create_column(clone_disks)
+    skip_os_morphing = sqlalchemy.Column(
+        "skip_os_morphing", sqlalchemy.Boolean, nullable=False, default=False)
+    base_transfer.create_column(skip_os_morphing)

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

@@ -281,6 +281,10 @@ class BaseTransferAction(BASE, models.TimestampMixin, models.ModelBase,
     instance_osmorphing_minion_pool_mappings = sqlalchemy.Column(
         types.Json, nullable=False, default=lambda: {})
     user_scripts = sqlalchemy.Column(types.Json, nullable=True)
+    clone_disks = sqlalchemy.Column(
+        sqlalchemy.Boolean, nullable=False, default=True)
+    skip_os_morphing = sqlalchemy.Column(
+        sqlalchemy.Boolean, nullable=False, default=False)
 
     __mapper_args__ = {
         'polymorphic_identity': 'base_transfer_action',
@@ -314,6 +318,8 @@ class BaseTransferAction(BASE, models.TimestampMixin, models.ModelBase,
             "instance_osmorphing_minion_pool_mappings":
                 self.instance_osmorphing_minion_pool_mappings,
             "user_scripts": self.user_scripts,
+            "clone_disks": self.clone_disks,
+            "skip_os_morphing": self.skip_os_morphing,
         }
         if include_executions:
             for ex in self.executions:

+ 4 - 2
coriolis/transfers/api.py

@@ -13,14 +13,16 @@ class API(object):
                origin_minion_pool_id, destination_minion_pool_id,
                instance_osmorphing_minion_pool_mappings,
                source_environment, destination_environment, instances,
-               network_map, storage_mappings, notes=None, user_scripts=None):
+               network_map, storage_mappings, notes=None, user_scripts=None,
+               clone_disks=True, skip_os_morphing=False):
         return self._rpc_client.create_instances_transfer(
             ctxt, transfer_scenario,
             origin_endpoint_id, destination_endpoint_id,
             origin_minion_pool_id, destination_minion_pool_id,
             instance_osmorphing_minion_pool_mappings,
             source_environment, destination_environment, instances,
-            network_map, storage_mappings, notes, user_scripts)
+            network_map, storage_mappings, notes, user_scripts, clone_disks,
+            skip_os_morphing)
 
     def update(self, ctxt, transfer_id, updated_properties):
         return self._rpc_client.update_transfer(