From a739390c68e0b8fe9f84ddb9116c27dd65e7a331 Mon Sep 17 00:00:00 2001 From: Dmitry Tantsur Date: Fri, 2 Aug 2019 14:48:40 +0200 Subject: [PATCH] baremetal.configdrive: tolerate user_data as a string In theory user data is binary. But in practice many formats are textual, so it makes sense to accept strings as well. Change-Id: I2b5e09339480df081796d3066cd6ede6b72b0e1e --- openstack/baremetal/configdrive.py | 6 +++++- openstack/tests/unit/baremetal/test_configdrive.py | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/openstack/baremetal/configdrive.py b/openstack/baremetal/configdrive.py index 13348fe42..74e95e451 100644 --- a/openstack/baremetal/configdrive.py +++ b/openstack/baremetal/configdrive.py @@ -52,7 +52,11 @@ def populate_directory(metadata, user_data=None, versions=None, json.dump(network_data, fp) if user_data: - with open(os.path.join(subdir, 'user_data'), 'wb') as fp: + # Strictly speaking, user data is binary, but in many cases + # it's actually a text (cloud-init, ignition, etc). + flag = 't' if isinstance(user_data, six.text_type) else 'b' + with open(os.path.join(subdir, 'user_data'), + 'w%s' % flag) as fp: fp.write(user_data) yield d diff --git a/openstack/tests/unit/baremetal/test_configdrive.py b/openstack/tests/unit/baremetal/test_configdrive.py index 72cade0d5..709f3b124 100644 --- a/openstack/tests/unit/baremetal/test_configdrive.py +++ b/openstack/tests/unit/baremetal/test_configdrive.py @@ -48,6 +48,8 @@ class TestPopulateDirectory(testtools.TestCase): if user_data is None: self.assertFalse(os.path.exists(user_data_file)) else: + if isinstance(user_data, six.text_type): + user_data = user_data.encode() with open(user_data_file, 'rb') as fp: self.assertEqual(user_data, fp.read()) @@ -60,6 +62,9 @@ class TestPopulateDirectory(testtools.TestCase): def test_with_user_data(self): self._check({'foo': 42}, b'I am user data') + def test_with_user_data_as_string(self): + self._check({'foo': 42}, u'I am user data') + def test_with_network_data(self): self._check({'foo': 42}, network_data={'networks': {}})