]> git.apps.os.sepia.ceph.com Git - teuthology.git/commitdiff
cloud.openstack: Destroy multiple nodes 1053/head
authorZack Cerza <zack@redhat.com>
Wed, 22 Mar 2017 16:33:33 +0000 (10:33 -0600)
committerZack Cerza <zack@redhat.com>
Wed, 22 Mar 2017 20:46:19 +0000 (14:46 -0600)
In the very rare case where more than one node exists with the same name
(this can happen in case of an outage), destroy all nodes that match
instead of failing altogether.

Signed-off-by: Zack Cerza <zack@redhat.com>
teuthology/provision/cloud/openstack.py
teuthology/provision/cloud/test/test_openstack.py

index 616a77759a879841f6320441b359b3759d9a5e88..7653c72b7d568c51f0fc56c8ab5e3f205cfc367c 100644 (file)
@@ -391,8 +391,12 @@ class OpenStackProvisioner(base.Provisioner):
         return matches
 
     def _destroy(self):
-        if not self.node:
-            return True
-        log.info("Destroying node: %s", self.node)
         self._destroy_volumes()
-        return self.node.destroy()
+        nodes = self._find_nodes()
+        if not nodes:
+            log.warn("Didn't find any nodes named '%s' to destroy!", self.name)
+            return True
+        if len(nodes) > 1:
+            log.warn("Found multiple nodes named '%s' to destroy!", self.name)
+        log.info("Destroying nodes: %s", nodes)
+        return all([node.destroy() for node in nodes])
index e2a211bbdeeae5205f5679f3fb38d179712d1c11..7eead8adbca6018b7d0b7e449413b5b744fc0a84 100644 (file)
@@ -539,17 +539,22 @@ class TestOpenStackProvisioner(TestOpenStackBase):
         assert parsed_query == dict(name=['x'], ip=['y'])
 
     @mark.parametrize(
-        'node',
-        [None, Mock()]
+        'nodes',
+        [[], [Mock()], [Mock(), Mock()]]
     )
-    def test_destroy(self, node):
-        obj = self.get_obj()
-        obj._node = node
-        result = obj.destroy()
-        if not node:
-            assert result is True
-        else:
-            assert node.destroy.called_once_with()
+    def test_destroy(self, nodes):
+        with patch(
+            'teuthology.provision.cloud.openstack.'
+            'OpenStackProvisioner._find_nodes'
+        ) as m_find_nodes:
+            m_find_nodes.return_value = nodes
+            obj = self.get_obj()
+            result = obj.destroy()
+            if not all(nodes):
+                assert result is True
+            else:
+                for node in nodes:
+                    assert node.destroy.called_once_with()
 
     _volume_matrix = (
         'count, size, should_succeed',