From 6548a961b9a4a5e621eb238226d47b6632ca9188 Mon Sep 17 00:00:00 2001 From: Riccardo Pittau Date: Tue, 23 Jul 2019 02:01:52 +0200 Subject: [PATCH] Add set-boot-device to baremetal This patch adds the set-boot-device function to the baremetal module. Change-Id: Ia936cd41b87dd9422b00e96ee541f2c3842dc636 --- openstack/baremetal/v1/_proxy.py | 13 ++++++++++ openstack/baremetal/v1/node.py | 25 +++++++++++++++++++ .../tests/unit/baremetal/v1/test_node.py | 19 ++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/openstack/baremetal/v1/_proxy.py b/openstack/baremetal/v1/_proxy.py index 01754b3d7..8055cbddb 100644 --- a/openstack/baremetal/v1/_proxy.py +++ b/openstack/baremetal/v1/_proxy.py @@ -326,6 +326,19 @@ class Proxy(proxy.Proxy): rescue_password=rescue_password, wait=wait, timeout=timeout) + def set_node_boot_device(self, node, boot_device, persistent=False): + """Set node boot device + + :param node: The value can be the name or ID of a node or a + :class:`~openstack.baremetal.v1.node.Node` instance. + :param boot_device: Boot device to assign to the node. + :param persistent: If the boot device change is maintained after node + reboot + :return: The updated :class:`~openstack.baremetal.v1.node.Node` + """ + res = self._get_resource(_node.Node, node) + return res.set_boot_device(self, boot_device, persistent=persistent) + def wait_for_nodes_provision_state(self, nodes, expected_state, timeout=None, abort_on_failed_state=True): diff --git a/openstack/baremetal/v1/node.py b/openstack/baremetal/v1/node.py index a02a00797..236103c7a 100644 --- a/openstack/baremetal/v1/node.py +++ b/openstack/baremetal/v1/node.py @@ -720,5 +720,30 @@ class Node(_common.ListMixin, resource.Resource): .format(node=self.id)) exceptions.raise_from_response(response, error_message=msg) + def set_boot_device(self, session, boot_device, persistent=False): + """Set node boot device + + :param session: The session to use for making this request. + :param boot_device: Boot device to assign to the node. + :param persistent: If the boot device change is maintained after node + reboot + :return: The updated :class:`~openstack.baremetal.v1.node.Node` + """ + session = self._get_session(session) + version = self._get_microversion_for(session, 'commit') + request = self._prepare_request(requires_id=True) + request.url = utils.urljoin(request.url, 'management', 'boot_device') + + body = {'boot_device': boot_device, 'persistent': persistent} + + response = session.put( + request.url, json=body, + headers=request.headers, microversion=version, + retriable_status_codes=_common.RETRIABLE_STATUS_CODES) + + msg = ("Failed to set boot device for node {node}" + .format(node=self.id)) + exceptions.raise_from_response(response, error_message=msg) + NodeDetail = Node diff --git a/openstack/tests/unit/baremetal/v1/test_node.py b/openstack/tests/unit/baremetal/v1/test_node.py index 3a8732fcd..1d6a2426f 100644 --- a/openstack/tests/unit/baremetal/v1/test_node.py +++ b/openstack/tests/unit/baremetal/v1/test_node.py @@ -683,3 +683,22 @@ class TestNodeMaintenance(base.TestCase): json=None, headers=mock.ANY, microversion=mock.ANY) + + +@mock.patch.object(node.Node, 'fetch', lambda self, session: self) +@mock.patch.object(exceptions, 'raise_from_response', mock.Mock()) +class TestNodeSetBootDevice(base.TestCase): + + def setUp(self): + super(TestNodeSetBootDevice, self).setUp() + self.node = node.Node(**FAKE) + self.session = mock.Mock(spec=adapter.Adapter, + default_microversion='1.1') + + def test_node_set_boot_device(self): + self.node.set_boot_device(self.session, 'pxe', persistent=False) + self.session.put.assert_called_once_with( + 'nodes/%s/management/boot_device' % self.node.id, + json={'boot_device': 'pxe', 'persistent': False}, + headers=mock.ANY, microversion=mock.ANY, + retriable_status_codes=_common.RETRIABLE_STATUS_CODES)