Build configdrives on ironic side

Change-Id: Ia058a410d1b1277497fbb645fc102c8b0a7aba4f
This commit is contained in:
Dmitry Tantsur 2019-05-16 11:29:57 +02:00
parent 1afa4ac4ed
commit 0161effc3a
7 changed files with 48 additions and 14 deletions

View File

@ -5,7 +5,7 @@ fixtures==3.0.0
flake8-import-order==0.13
hacking==1.0.0
mock==2.0
openstacksdk==0.25.0
openstacksdk==0.28.0
pbr==2.0.0
Pygments==2.2.0
requests==2.18.4

View File

@ -15,6 +15,7 @@
import json
import logging
import warnings
from openstack.baremetal import configdrive
@ -60,11 +61,16 @@ class InstanceConfig(object):
kwargs.setdefault('ssh_authorized_keys', self.ssh_keys)
self.users.append(kwargs)
def build_configdrive(self, node):
"""Make the config drive.
def generate(self, node):
"""Generate the config drive information.
:param node: `Node` object.
:return: configdrive contents as a base64-encoded string.
:return: configdrive contents as a dictionary with keys:
``meta_data``
meta data dictionary
``user_data``
user data as a string
"""
hostname = node.instance_info.get(_utils.HOSTNAME_FIELD)
@ -83,16 +89,36 @@ class InstanceConfig(object):
'files': [],
'meta': {}}
user_data = {}
user_data_bin = None
user_data_str = None
if self.users:
user_data['users'] = self.users
if user_data:
user_data_bin = ("#cloud-config\n" + json.dumps(user_data)).encode(
'utf-8')
user_data_str = "#cloud-config\n" + json.dumps(user_data)
return {'meta_data': metadata,
'user_data': user_data_str}
def build_configdrive(self, node):
"""Make the config drive ISO.
Deprecated, use :py:meth:`generate` with openstacksdk's
``openstack.baremetal.configdrive.build`` instead.
:param node: `Node` object.
:return: configdrive contents as a base64-encoded string.
"""
warnings.warn("build_configdrive is deprecated, use generate with "
"openstacksdk's openstack.baremetal.configdrive.build "
"instead", DeprecationWarning)
cd = self.generate(node)
metadata = cd.pop('meta_data')
user_data = cd.pop('user_data')
if user_data:
user_data = user_data.encode('utf-8')
LOG.debug('Generating configdrive tree for node %(node)s with '
'metadata %(meta)s', {'node': _utils.log_res(node),
'meta': metadata})
return configdrive.build(metadata, user_data_bin)
return configdrive.build(metadata, user_data=user_data, **cd)

View File

@ -305,10 +305,9 @@ class Provisioner(_utils.GetNodeMixin):
LOG.debug('Generating a configdrive for node %s',
_utils.log_res(node))
cd = config.build_configdrive(node)
LOG.debug('Starting provisioning of node %s', _utils.log_res(node))
self.connection.baremetal.set_node_provision_state(
node, 'active', config_drive=cd)
node, 'active', config_drive=config.generate(node))
except Exception:
exc_info = sys.exc_info()

View File

@ -46,7 +46,7 @@ class TestInstanceConfig(testtools.TestCase):
result = config.build_configdrive(self.node)
mb.assert_called_once_with(expected_m, mock.ANY)
self.assertIs(result, mb.return_value)
user_data = mb.call_args[0][1]
user_data = mb.call_args[1].get('user_data')
if expected_userdata:
self.assertIsNotNone(user_data)

View File

@ -308,7 +308,7 @@ class TestProvisionNode(Base):
}
self.configdrive_mock = self.useFixture(
fixtures.MockPatchObject(_config.InstanceConfig,
'build_configdrive', autospec=True)
'generate', autospec=True)
).mock
def test_ok(self):
@ -379,7 +379,7 @@ class TestProvisionNode(Base):
self.assertEqual(inst.uuid, self.node.id)
self.assertEqual(inst.node, self.node)
config.build_configdrive.assert_called_once_with(self.node)
config.generate.assert_called_once_with(self.node)
self.api.network.create_port.assert_called_once_with(
network_id=self.api.network.find_network.return_value.id)
self.api.baremetal.attach_vif_to_node.assert_called_once_with(

View File

@ -0,0 +1,9 @@
---
upgrade:
- |
Bare Metal API version 1.56 (Stein) or newer is now required. Use the 0.11
release series for older versions.
deprecations:
- |
``InstanceConfig.build_configdrive`` is deprecated, use ``generate`` with
openstacksdk's ``openstack.baremetal.configdrive.build`` instead.

View File

@ -2,7 +2,7 @@
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
pbr!=2.1.0,>=2.0.0 # Apache-2.0
openstacksdk>=0.25.0 # Apache-2.0
openstacksdk>=0.28.0 # Apache-2.0
requests>=2.18.4 # Apache-2.0
six>=1.10.0 # MIT
enum34>=1.0.4;python_version=='2.7' or python_version=='2.6' or python_version=='3.3' # BSD