diff --git a/openstack/baremetal/v1/node.py b/openstack/baremetal/v1/node.py index 6bb099c3a..868d6ad3f 100644 --- a/openstack/baremetal/v1/node.py +++ b/openstack/baremetal/v1/node.py @@ -53,8 +53,8 @@ class Node(_common.ListMixin, resource.Resource): is_maintenance='maintenance', ) - # The allocation_uuid field introduced in 1.52 (Stein). - _max_microversion = '1.52' + # The retired and retired_reason fields introduced in 1.61 (Ussuri). + _max_microversion = '1.61' # Properties #: The UUID of the allocation associated with this node. Added in API @@ -107,6 +107,9 @@ class Node(_common.ListMixin, resource.Resource): # Whether the node is protected from undeploying. Added in API microversion # 1.48. is_protected = resource.Body("protected", type=bool) + #: Whether the node is marked for retirement. Added in API microversion + #: 1.61. + is_retired = resource.Body("retired", type=bool) #: Any error from the most recent transaction that started but failed to #: finish. last_error = resource.Body("last_error") @@ -133,6 +136,9 @@ class Node(_common.ListMixin, resource.Resource): protected_reason = resource.Body("protected_reason") #: The current provisioning state of the node. provision_state = resource.Body("provision_state") + #: The reason why the node is marked for retirement. Added in API + #: microversion 1.61. + retired_reason = resource.Body("retired_reason") #: The current RAID configuration of the node. raid_config = resource.Body("raid_config") #: The name of an service conductor host which is holding a lock on this diff --git a/openstack/tests/functional/baremetal/test_baremetal_node.py b/openstack/tests/functional/baremetal/test_baremetal_node.py index a08f8e1f3..5a8552de4 100644 --- a/openstack/tests/functional/baremetal/test_baremetal_node.py +++ b/openstack/tests/functional/baremetal/test_baremetal_node.py @@ -269,6 +269,62 @@ class TestBareMetalNode(base.BaseBaremetalTest): self.assertTrue(node.is_maintenance) self.assertEqual(reason, node.maintenance_reason) + def test_retired(self): + reason = "I'm too old for this s...tuff!" + + node = self.create_node() + + # Set retired when node state available should fail! + self.assertRaises( + exceptions.ConflictException, + self.conn.baremetal.update_node, node, is_retired=True) + + # Set node state to manageable + self.conn.baremetal.set_node_provision_state(node, 'manage', + wait=True) + self.assertEqual(node.provision_state, 'manageable') + + # Set retired without reason + node = self.conn.baremetal.update_node(node, is_retired=True) + self.assertTrue(node.is_retired) + self.assertIsNone(node.retired_reason) + + # Verify set retired on server side + node = self.conn.baremetal.get_node(node.id) + self.assertTrue(node.is_retired) + self.assertIsNone(node.retired_reason) + + # Add the reason + node = self.conn.baremetal.update_node(node, retired_reason=reason) + self.assertTrue(node.is_retired) + self.assertEqual(reason, node.retired_reason) + + # Verify the reason on server side + node = self.conn.baremetal.get_node(node.id) + self.assertTrue(node.is_retired) + self.assertEqual(reason, node.retired_reason) + + # Unset retired + node = self.conn.baremetal.update_node(node, is_retired=False) + self.assertFalse(node.is_retired) + self.assertIsNone(node.retired_reason) + + # Verify on server side + node = self.conn.baremetal.get_node(node.id) + self.assertFalse(node.is_retired) + self.assertIsNone(node.retired_reason) + + # Set retired with reason + node = self.conn.baremetal.update_node(node, is_retired=True, + retired_reason=reason) + self.assertTrue(node.is_retired) + self.assertEqual(reason, node.retired_reason) + + # Verify on server side + node = self.conn.baremetal.get_node(node.id) + self.assertTrue(node.is_retired) + self.assertEqual(reason, node.retired_reason) + class TestBareMetalNodeFields(base.BaseBaremetalTest): diff --git a/releasenotes/notes/baremetal-retired-fields-f56a4632ad4797d7.yaml b/releasenotes/notes/baremetal-retired-fields-f56a4632ad4797d7.yaml new file mode 100644 index 000000000..115febd22 --- /dev/null +++ b/releasenotes/notes/baremetal-retired-fields-f56a4632ad4797d7.yaml @@ -0,0 +1,4 @@ +--- +features: + - | + Adds ``is_retired`` and ``retired_reason`` to the baremetal Node schema. \ No newline at end of file