Explorar el Código

Adds checks for valid volumes info

Alessandro Pilotti hace 9 años
padre
commit
d58ed7f95f
Se han modificado 2 ficheros con 24 adiciones y 7 borrados
  1. 8 0
      coriolis/conductor/rpc/server.py
  2. 16 7
      coriolis/tasks/replica_tasks.py

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

@@ -302,6 +302,14 @@ class ConductorServerEndpoint(object):
         self._check_replica_running_executions(ctxt, replica)
         self._check_valid_replica_tasks_execution(replica, forced)
 
+        for instance, info in replica.info.items():
+            if not info.get("volumes_info"):
+                raise exception.InvalidReplicaState(
+                    "The replica doesn't contain volumes information for "
+                    "instance: %s. If replicated disks are deleted, the "
+                    "replica needs to be executed anew before a migration can "
+                    "occur" % instance)
+
         instances = replica.instances
 
         migration = models.Migration()

+ 16 - 7
coriolis/tasks/replica_tasks.py

@@ -2,6 +2,7 @@
 # All Rights Reserved.
 
 from coriolis import constants
+from coriolis import exception
 from coriolis.providers import factory as providers_factory
 from coriolis import schemas
 from coriolis.tasks import base
@@ -40,6 +41,14 @@ def _unmarshal_migr_conn_info(migr_connection_info):
     return migr_connection_info
 
 
+def _get_volumes_info(task_info):
+    volumes_info = task_info.get("volumes_info")
+    if not volumes_info:
+        raise exception.InvalidActionTasksExecutionState(
+            "No volumes information present")
+    return volumes_info
+
+
 class GetInstanceInfoTask(base.TaskRunner):
     def run(self, ctxt, instance, origin, destination, task_info,
             event_handler):
@@ -77,7 +86,7 @@ class ReplicateDisksTask(base.TaskRunner):
             origin["type"], constants.PROVIDER_TYPE_EXPORT, event_handler)
         connection_info = base.get_connection_info(ctxt, origin)
 
-        volumes_info = task_info["volumes_info"]
+        volumes_info = _get_volumes_info(task_info)
 
         migr_source_conn_info = _unmarshal_migr_conn_info(
             task_info["migr_source_connection_info"])
@@ -124,7 +133,7 @@ class DeleteReplicaDisksTask(base.TaskRunner):
             destination["type"], constants.PROVIDER_TYPE_IMPORT, event_handler)
         connection_info = base.get_connection_info(ctxt, destination)
 
-        volumes_info = task_info["volumes_info"]
+        volumes_info = _get_volumes_info(task_info)
 
         provider.delete_replica_disks(
             ctxt, connection_info, volumes_info)
@@ -181,7 +190,7 @@ class DeployReplicaTargetResourcesTask(base.TaskRunner):
             destination["type"], constants.PROVIDER_TYPE_IMPORT, event_handler)
         connection_info = base.get_connection_info(ctxt, destination)
 
-        volumes_info = task_info["volumes_info"]
+        volumes_info = _get_volumes_info(task_info)
 
         replica_resources_info = provider.deploy_replica_target_resources(
             ctxt, connection_info, target_environment, volumes_info)
@@ -226,7 +235,7 @@ class DeployReplicaInstanceTask(base.TaskRunner):
             destination["type"], constants.PROVIDER_TYPE_IMPORT, event_handler)
         connection_info = base.get_connection_info(ctxt, destination)
 
-        volumes_info = task_info["volumes_info"]
+        volumes_info = _get_volumes_info(task_info)
 
         provider.deploy_replica_instance(
             ctxt, connection_info, target_environment, instance,
@@ -242,7 +251,7 @@ class CreateReplicaDiskSnapshotsTask(base.TaskRunner):
             destination["type"], constants.PROVIDER_TYPE_IMPORT, event_handler)
         connection_info = base.get_connection_info(ctxt, destination)
 
-        volumes_info = task_info["volumes_info"]
+        volumes_info = _get_volumes_info(task_info)
 
         volumes_info = provider.create_replica_disk_snapshots(
             ctxt, connection_info, volumes_info)
@@ -259,7 +268,7 @@ class DeleteReplicaDiskSnapshotsTask(base.TaskRunner):
             destination["type"], constants.PROVIDER_TYPE_IMPORT, event_handler)
         connection_info = base.get_connection_info(ctxt, destination)
 
-        volumes_info = task_info["volumes_info"]
+        volumes_info = _get_volumes_info(task_info)
 
         volumes_info = provider.delete_replica_disk_snapshots(
             ctxt, connection_info, volumes_info)
@@ -276,7 +285,7 @@ class RestoreReplicaDiskSnapshotsTask(base.TaskRunner):
             destination["type"], constants.PROVIDER_TYPE_IMPORT, event_handler)
         connection_info = base.get_connection_info(ctxt, destination)
 
-        volumes_info = task_info["volumes_info"]
+        volumes_info = _get_volumes_info(task_info)
 
         volumes_info = provider.restore_replica_disk_snapshots(
             ctxt, connection_info, volumes_info)