Forráskód Böngészése

conductor: Fixes replica delete disks if no prior execution

If replica delete disks is called on a replica that was not
executed before, a KeyError is being raised in the conductor,
as the replica.info is an empty dictionary at that point.

This patch solves the issue.
Claudiu Belu 8 éve
szülő
commit
164c2ba97c

+ 1 - 1
coriolis/conductor/rpc/server.py

@@ -314,7 +314,7 @@ class ConductorServerEndpoint(object):
 
         has_tasks = False
         for instance in replica.instances:
-            if (instance in replica.instances and
+            if (instance in replica.info and
                     "volumes_info" in replica.info[instance]):
                 self._create_task(
                     instance, constants.TASK_TYPE_DELETE_REPLICA_DISKS,

+ 40 - 0
coriolis/tests/conductor/rpc/test_server.py

@@ -0,0 +1,40 @@
+# Copyright 2017 Cloudbase Solutions Srl
+# All Rights Reserved.
+
+import ddt
+import mock
+
+from coriolis.conductor.rpc import server
+from coriolis import exception
+from coriolis.tests import test_base
+
+
+@ddt.ddt
+class ConductorServerEndpointTestCase(test_base.CoriolisBaseTestCase):
+    """Test suite for the Coriolis Conductor RPC server."""
+
+    def setUp(self):
+        super(ConductorServerEndpointTestCase, self).setUp()
+        self.server = server.ConductorServerEndpoint()
+
+    @ddt.data({}, {mock.sentinel.instance: {}})
+    @mock.patch.object(server.ConductorServerEndpoint, '_create_task')
+    @mock.patch.object(server.ConductorServerEndpoint,
+                       '_check_replica_running_executions')
+    @mock.patch.object(server.ConductorServerEndpoint, '_get_replica')
+    def test_update_endpoint_not_found(self, replica_info, mock_get_replica,
+                                       mock_check_replica_running,
+                                       mock_create_task):
+        mock_replica = mock_get_replica.return_value
+        mock_replica.instances = [mock.sentinel.instance]
+        mock_replica.info = {}
+
+        self.assertRaises(exception.InvalidReplicaState,
+                          self.server.delete_replica_disks,
+                          mock.sentinel.context, mock.sentinel.replica_id)
+
+        mock_get_replica.assert_called_once_with(mock.sentinel.context,
+                                                 mock.sentinel.replica_id)
+        mock_check_replica_running.assert_called_once_with(
+            mock.sentinel.context, mock_replica)
+        mock_create_task.assert_not_called()

+ 1 - 0
test-requirements.txt

@@ -1,3 +1,4 @@
 coverage
+ddt
 discover
 oslotest