From 3c6dae3a657f556adc7e34a22831261e66b1da39 Mon Sep 17 00:00:00 2001 From: Ruby Loo Date: Fri, 15 Nov 2019 22:00:26 +0000 Subject: [PATCH] baremetal node: 'error' is a failed state For baremetal.wait_for_provision_state(), if abort_on_failed_state is True, we need to abort if the node goes into the 'error' provision state (which happens if a failure occurs while trying to delete the BM node). Change-Id: I6f628787dcf458ff9149dbb3502e7beeded70d9e Story: #2006860 --- openstack/baremetal/v1/node.py | 3 ++- openstack/tests/unit/baremetal/v1/test_node.py | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/openstack/baremetal/v1/node.py b/openstack/baremetal/v1/node.py index 9b81937b6..df94a122e 100644 --- a/openstack/baremetal/v1/node.py +++ b/openstack/baremetal/v1/node.py @@ -487,7 +487,8 @@ class Node(_common.ListMixin, resource.Resource): elif not abort_on_failed_state: return False - if self.provision_state.endswith(' failed'): + if (self.provision_state.endswith(' failed') or + self.provision_state == 'error'): raise exceptions.ResourceFailure( "Node %(node)s reached failure state \"%(state)s\"; " "the last error is %(error)s" % diff --git a/openstack/tests/unit/baremetal/v1/test_node.py b/openstack/tests/unit/baremetal/v1/test_node.py index 72335d670..54b857d10 100644 --- a/openstack/tests/unit/baremetal/v1/test_node.py +++ b/openstack/tests/unit/baremetal/v1/test_node.py @@ -183,6 +183,18 @@ class TestNodeWaitForProvisionState(base.TestCase): self.node.wait_for_provision_state, self.session, 'manageable') + def test_failure_error(self, mock_fetch): + def _get_side_effect(_self, session): + self.node.provision_state = 'error' + self.assertIs(session, self.session) + + mock_fetch.side_effect = _get_side_effect + + self.assertRaisesRegex(exceptions.ResourceFailure, + 'failure state "error"', + self.node.wait_for_provision_state, + self.session, 'manageable') + def test_enroll_as_failure(self, mock_fetch): def _get_side_effect(_self, session): self.node.provision_state = 'enroll'