Merge "baremetal: support network_data when building configdrive"

This commit is contained in:
Zuul 2019-02-28 14:54:15 +00:00 committed by Gerrit Code Review
commit 9445b9f5dd
3 changed files with 32 additions and 4 deletions

View File

@ -25,12 +25,14 @@ import six
@contextlib.contextmanager
def populate_directory(metadata, user_data, versions=None):
def populate_directory(metadata, user_data=None, versions=None,
network_data=None):
"""Populate a directory with configdrive files.
:param dict metadata: Metadata.
:param bytes user_data: Vendor-specific user data.
:param versions: List of metadata versions to support.
:param dict network_data: Networking configuration.
:return: a context manager yielding a directory with files
"""
d = tempfile.mkdtemp()
@ -44,6 +46,11 @@ def populate_directory(metadata, user_data, versions=None):
with open(os.path.join(subdir, 'meta_data.json'), 'w') as fp:
json.dump(metadata, fp)
if network_data:
with open(os.path.join(subdir, 'network_data.json'),
'w') as fp:
json.dump(network_data, fp)
if user_data:
with open(os.path.join(subdir, 'user_data'), 'wb') as fp:
fp.write(user_data)
@ -53,7 +60,7 @@ def populate_directory(metadata, user_data, versions=None):
shutil.rmtree(d)
def build(metadata, user_data, versions=None):
def build(metadata, user_data=None, versions=None, network_data=None):
"""Make a configdrive compatible with the Bare Metal service.
Requires the genisoimage utility to be available.
@ -61,6 +68,7 @@ def build(metadata, user_data, versions=None):
:param dict metadata: Metadata.
:param user_data: Vendor-specific user data.
:param versions: List of metadata versions to support.
:param dict network_data: Networking configuration.
:return: configdrive contents as a base64-encoded string.
"""
with populate_directory(metadata, user_data, versions) as path:

View File

@ -24,16 +24,27 @@ from openstack.baremetal import configdrive
class TestPopulateDirectory(testtools.TestCase):
def _check(self, metadata, user_data=None):
with configdrive.populate_directory(metadata, user_data) as d:
def _check(self, metadata, user_data=None, network_data=None):
with configdrive.populate_directory(metadata,
user_data=user_data,
network_data=network_data) as d:
for version in ('2012-08-10', 'latest'):
with open(os.path.join(d, 'openstack', version,
'meta_data.json')) as fp:
actual_metadata = json.load(fp)
self.assertEqual(metadata, actual_metadata)
network_data_file = os.path.join(d, 'openstack', version,
'network_data.json')
user_data_file = os.path.join(d, 'openstack', version,
'user_data')
if network_data is None:
self.assertFalse(os.path.exists(network_data_file))
else:
with open(network_data_file) as fp:
self.assertEqual(network_data, json.load(fp))
if user_data is None:
self.assertFalse(os.path.exists(user_data_file))
else:
@ -49,6 +60,9 @@ class TestPopulateDirectory(testtools.TestCase):
def test_with_user_data(self):
self._check({'foo': 42}, b'I am user data')
def test_with_network_data(self):
self._check({'foo': 42}, network_data={'networks': {}})
@mock.patch('subprocess.Popen', autospec=True)
class TestPack(testtools.TestCase):

View File

@ -0,0 +1,6 @@
---
features:
- |
Adds support for `network_data
<https://specs.openstack.org/openstack/nova-specs/specs/liberty/implemented/metadata-service-network-info.html>`_
when building baremetal configdrives.