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

Merge pull request #150 from aznashwan/fix-osmorphing-minion-attach

Fix osmorphing minion selection and disk attachment.
Nashwan Azhari 5 лет назад
Родитель
Сommit
8b088ffeb6
2 измененных файлов с 78 добавлено и 7 удалено
  1. 6 2
      coriolis/conductor/rpc/server.py
  2. 72 5
      coriolis/tasks/minion_pool_tasks.py

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

@@ -1343,8 +1343,12 @@ class ConductorServerEndpoint(object):
                     action.origin_minion_pool_id, action.id))
                     action.origin_minion_pool_id, action.id))
 
 
         if action.instance_osmorphing_minion_pool_mappings:
         if action.instance_osmorphing_minion_pool_mappings:
-            for (instance, pool_id) in (
-                    action.instance_osmorphing_minion_pool_mappings.items()):
+            osmorphing_pool_mappings = {
+                instance_id: pool_id
+                for (instance_id, pool_id) in (
+                    action.instance_osmorphing_minion_pool_mappings.items())
+                if pool_id}
+            for (instance, pool_id) in osmorphing_pool_mappings:
                 osmorphing_pool = _get_pool(pool_id)
                 osmorphing_pool = _get_pool(pool_id)
                 if osmorphing_pool.origin_endpoint_id != (
                 if osmorphing_pool.origin_endpoint_id != (
                         action.destination_endpoint_id):
                         action.destination_endpoint_id):

+ 72 - 5
coriolis/tasks/minion_pool_tasks.py

@@ -359,14 +359,12 @@ class _BaseVolumesMinionMachineAttachmentTask(base.TaskRunner):
     @classmethod
     @classmethod
     def get_required_task_info_properties(cls):
     def get_required_task_info_properties(cls):
         fields = list(cls._get_minion_task_info_field_mappings().keys())
         fields = list(cls._get_minion_task_info_field_mappings().keys())
-        fields.append("volumes_info")
         return fields
         return fields
 
 
     @classmethod
     @classmethod
     def get_returned_task_info_properties(cls):
     def get_returned_task_info_properties(cls):
         fields = list(cls._get_minion_task_info_field_mappings().values())
         fields = list(cls._get_minion_task_info_field_mappings().values())
         fields.append(cls._get_minion_properties_task_info_field())
         fields.append(cls._get_minion_properties_task_info_field())
-        fields.append("volumes_info")
         return fields
         return fields
 
 
     @classmethod
     @classmethod
@@ -374,6 +372,11 @@ class _BaseVolumesMinionMachineAttachmentTask(base.TaskRunner):
         return _get_required_minion_pool_provider_types_for_platform(
         return _get_required_minion_pool_provider_types_for_platform(
             cls.get_required_platform())
             cls.get_required_platform())
 
 
+    @classmethod
+    def _get_volumes_info_from_task_info(cls, task_info):
+        raise NotImplementedError(
+            "No minion volumes info retrieval logic implemented.")
+
     @classmethod
     @classmethod
     def _get_minion_properties_task_info_field(cls):
     def _get_minion_properties_task_info_field(cls):
         raise NotImplementedError(
         raise NotImplementedError(
@@ -409,7 +412,7 @@ class _BaseVolumesMinionMachineAttachmentTask(base.TaskRunner):
         provider = providers_factory.get_provider(
         provider = providers_factory.get_provider(
             platform_to_target["type"], provider_type, event_handler)
             platform_to_target["type"], provider_type, event_handler)
 
 
-        volumes_info = task_info["volumes_info"]
+        volumes_info = self._get_volumes_info_from_task_info(task_info)
         minion_properties = task_info[
         minion_properties = task_info[
             self._get_minion_properties_task_info_field()]
             self._get_minion_properties_task_info_field()]
         res = self._get_provider_disk_operation(provider)(
         res = self._get_provider_disk_operation(provider)(
@@ -442,7 +445,31 @@ class _BaseVolumesMinionMachineAttachmentTask(base.TaskRunner):
         return result
         return result
 
 
 
 
-class AttachVolumesToSourceMinionTask(_BaseVolumesMinionMachineAttachmentTask):
+class _BaseAttachVolumesToTransferMinionTask(
+        _BaseVolumesMinionMachineAttachmentTask):
+
+    @classmethod
+    def _get_volumes_info_from_task_info(cls, task_info):
+        return task_info["volumes_info"]
+
+    @classmethod
+    def get_required_task_info_properties(cls):
+        fields = super(
+            _BaseAttachVolumesToTransferMinionTask,
+            cls).get_required_task_info_properties()
+        fields.append("volumes_info")
+        return fields
+
+    @classmethod
+    def get_returned_task_info_properties(cls):
+        fields = super(
+            _BaseAttachVolumesToTransferMinionTask,
+            cls).get_returned_task_info_properties()
+        fields.append("volumes_info")
+        return fields
+
+
+class AttachVolumesToSourceMinionTask(_BaseAttachVolumesToTransferMinionTask):
 
 
     @classmethod
     @classmethod
     def get_required_platform(cls):
     def get_required_platform(cls):
@@ -452,6 +479,10 @@ class AttachVolumesToSourceMinionTask(_BaseVolumesMinionMachineAttachmentTask):
     def _get_minion_properties_task_info_field(cls):
     def _get_minion_properties_task_info_field(cls):
         return "source_minion_provider_properties"
         return "source_minion_provider_properties"
 
 
+    @classmethod
+    def get_volumes_info_from_task_info(cls, task_info):
+        return task_info["volumes_info"]
+
     @classmethod
     @classmethod
     def _get_minion_task_info_field_mappings(cls):
     def _get_minion_task_info_field_mappings(cls):
         return SOURCE_MINION_TASK_INFO_FIELD_MAPPINGS
         return SOURCE_MINION_TASK_INFO_FIELD_MAPPINGS
@@ -468,7 +499,8 @@ class DetachVolumesFromSourceMinionTask(AttachVolumesToSourceMinionTask):
         return provider.detach_volumes_from_minion
         return provider.detach_volumes_from_minion
 
 
 
 
-class AttachVolumesToDestinationMinionTask(_BaseVolumesMinionMachineAttachmentTask):
+class AttachVolumesToDestinationMinionTask(
+        _BaseAttachVolumesToTransferMinionTask):
 
 
     @classmethod
     @classmethod
     def get_required_platform(cls):
     def get_required_platform(cls):
@@ -497,6 +529,27 @@ class DetachVolumesFromDestinationMinionTask(AttachVolumesToDestinationMinionTas
 class AttachVolumesToOSMorphingMinionTask(
 class AttachVolumesToOSMorphingMinionTask(
         _BaseVolumesMinionMachineAttachmentTask):
         _BaseVolumesMinionMachineAttachmentTask):
 
 
+    @classmethod
+    def _get_volumes_info_from_task_info(cls, task_info):
+        return task_info[
+            "instance_deployment_info"]["volumes_info"]
+
+    @classmethod
+    def get_required_task_info_properties(cls):
+        fields = super(
+            AttachVolumesToOSMorphingMinionTask,
+            cls).get_required_task_info_properties()
+        fields.append("instance_deployment_info")
+        return fields
+
+    @classmethod
+    def get_returned_task_info_properties(cls):
+        fields = super(
+            AttachVolumesToOSMorphingMinionTask,
+            cls).get_returned_task_info_properties()
+        fields.append("instance_deployment_info")
+        return fields
+
     @classmethod
     @classmethod
     def get_required_platform(cls):
     def get_required_platform(cls):
         return constants.TASK_PLATFORM_DESTINATION
         return constants.TASK_PLATFORM_DESTINATION
@@ -517,6 +570,20 @@ class AttachVolumesToOSMorphingMinionTask(
     def _clear_mapped_minion_task_info_field(cls):
     def _clear_mapped_minion_task_info_field(cls):
         return False
         return False
 
 
+    def _run(self, ctxt, instance, origin, destination,
+             task_info, event_handler):
+        res = super(
+            AttachVolumesToOSMorphingMinionTask, self)._run(
+                ctxt, instance, origin, destination, task_info, event_handler)
+
+        instance_deployment_info = task_info['instance_deployment_info']
+        if 'volumes_info' in res:
+            instance_deployment_info['volumes_info'] = res['volumes_info']
+            del res['volumes_info']
+            res['instance_deployment_info'] = instance_deployment_info
+
+        return res
+
 
 
 class DetachVolumesFromOSMorphingMinionTask(
 class DetachVolumesFromOSMorphingMinionTask(
         AttachVolumesToOSMorphingMinionTask):
         AttachVolumesToOSMorphingMinionTask):