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.