From: Zack Cerza Date: Wed, 22 Mar 2017 16:33:33 +0000 (-0600) Subject: cloud.openstack: Destroy multiple nodes X-Git-Tag: 1.1.0~440^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0c70c16e70843fbbb12bfbda16a875b5a449a8c5;p=teuthology.git cloud.openstack: Destroy multiple nodes 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 --- diff --git a/teuthology/provision/cloud/openstack.py b/teuthology/provision/cloud/openstack.py index 616a77759..7653c72b7 100644 --- a/teuthology/provision/cloud/openstack.py +++ b/teuthology/provision/cloud/openstack.py @@ -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]) diff --git a/teuthology/provision/cloud/test/test_openstack.py b/teuthology/provision/cloud/test/test_openstack.py index e2a211bbd..7eead8adb 100644 --- a/teuthology/provision/cloud/test/test_openstack.py +++ b/teuthology/provision/cloud/test/test_openstack.py @@ -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',