From 371db82c6eafbd4b951b01530183836e2a17f7ed Mon Sep 17 00:00:00 2001 From: Dmitry Tantsur Date: Thu, 7 Mar 2019 10:52:44 +0100 Subject: [PATCH] baremetal: support server-side configdrive building (API 1.56) Bare Metal API 1.56 allows passing a dictionary for configdrive. Change-Id: Ib245801ae326754a9ba319d29b0507cd759fdb4c Story: #2005083 Task: #29875 --- openstack/baremetal/v1/node.py | 12 +++-- .../tests/unit/baremetal/v1/test_node.py | 49 ++++++++++++++++++- .../notes/configdrive-f8ca9f94b2981db7.yaml | 5 ++ 3 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 releasenotes/notes/configdrive-f8ca9f94b2981db7.yaml diff --git a/openstack/baremetal/v1/node.py b/openstack/baremetal/v1/node.py index 59d3b8785..4a2471401 100644 --- a/openstack/baremetal/v1/node.py +++ b/openstack/baremetal/v1/node.py @@ -296,13 +296,17 @@ class Node(_common.ListMixin, resource.Resource): """ session = self._get_session(session) + version = None if target in _common.PROVISIONING_VERSIONS: version = '1.%d' % _common.PROVISIONING_VERSIONS[target] - else: - if config_drive and target == 'rebuild': + + if config_drive: + # Some config drive actions require a higher version. + if isinstance(config_drive, dict): + version = '1.56' + elif target == 'rebuild': version = '1.35' - else: - version = None + version = utils.pick_microversion(session, version) body = {'target': target} diff --git a/openstack/tests/unit/baremetal/v1/test_node.py b/openstack/tests/unit/baremetal/v1/test_node.py index e8a7a2f8b..5db11397e 100644 --- a/openstack/tests/unit/baremetal/v1/test_node.py +++ b/openstack/tests/unit/baremetal/v1/test_node.py @@ -225,7 +225,54 @@ class TestNodeSetProvisionState(base.TestCase): default_microversion=None) def test_no_arguments(self): - self.node.set_provision_state(self.session, 'manage') + result = self.node.set_provision_state(self.session, 'active') + self.assertIs(result, self.node) + self.session.put.assert_called_once_with( + 'nodes/%s/states/provision' % self.node.id, + json={'target': 'active'}, + headers=mock.ANY, microversion=None, + retriable_status_codes=_common.RETRIABLE_STATUS_CODES) + + def test_manage(self): + result = self.node.set_provision_state(self.session, 'manage') + self.assertIs(result, self.node) + self.session.put.assert_called_once_with( + 'nodes/%s/states/provision' % self.node.id, + json={'target': 'manage'}, + headers=mock.ANY, microversion='1.4', + retriable_status_codes=_common.RETRIABLE_STATUS_CODES) + + def test_deploy_with_configdrive(self): + result = self.node.set_provision_state(self.session, 'active', + config_drive='abcd') + self.assertIs(result, self.node) + self.session.put.assert_called_once_with( + 'nodes/%s/states/provision' % self.node.id, + json={'target': 'active', 'configdrive': 'abcd'}, + headers=mock.ANY, microversion=None, + retriable_status_codes=_common.RETRIABLE_STATUS_CODES) + + def test_rebuild_with_configdrive(self): + result = self.node.set_provision_state(self.session, 'rebuild', + config_drive='abcd') + self.assertIs(result, self.node) + self.session.put.assert_called_once_with( + 'nodes/%s/states/provision' % self.node.id, + json={'target': 'rebuild', 'configdrive': 'abcd'}, + headers=mock.ANY, microversion='1.35', + retriable_status_codes=_common.RETRIABLE_STATUS_CODES) + + def test_configdrive_as_dict(self): + for target in ('rebuild', 'active'): + self.session.put.reset_mock() + result = self.node.set_provision_state( + self.session, target, config_drive={'user_data': 'abcd'}) + self.assertIs(result, self.node) + self.session.put.assert_called_once_with( + 'nodes/%s/states/provision' % self.node.id, + json={'target': target, 'configdrive': {'user_data': 'abcd'}}, + headers=mock.ANY, microversion='1.56', + retriable_status_codes=_common.RETRIABLE_STATUS_CODES) @mock.patch.object(node.Node, '_translate_response', mock.Mock()) diff --git a/releasenotes/notes/configdrive-f8ca9f94b2981db7.yaml b/releasenotes/notes/configdrive-f8ca9f94b2981db7.yaml new file mode 100644 index 000000000..4337a5424 --- /dev/null +++ b/releasenotes/notes/configdrive-f8ca9f94b2981db7.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + Supports Bare Metal API version 1.56, which allows building a config drive + on the server side from a provided dictionary.