diff options
author | Scott Moser <smoser@ubuntu.com> | 2016-04-29 11:23:08 -0400 |
---|---|---|
committer | Scott Moser <smoser@ubuntu.com> | 2016-04-29 11:23:08 -0400 |
commit | 0780b3abfb14e8994f6097c5d1d22a92e91bc2f5 (patch) | |
tree | 08a534e49053403bc77351c5b2096f94e314e538 | |
parent | c92f02037afc6b0434c9498904f7d888e00cd55b (diff) | |
parent | 89fe4242aa3d825ee1b439cc8d184ddf06382086 (diff) | |
download | vyos-cloud-init-0780b3abfb14e8994f6097c5d1d22a92e91bc2f5.tar.gz vyos-cloud-init-0780b3abfb14e8994f6097c5d1d22a92e91bc2f5.zip |
Paths: fix instance path if datasource's id has a '/'.
If the datasource's instance id contained a '/' then the instance_id path
would not be as expected under /var/lib/cloud/instances/instance_id.
LP: #1575938
-rw-r--r-- | ChangeLog | 2 | ||||
-rw-r--r-- | cloudinit/helpers.py | 3 | ||||
-rw-r--r-- | tests/unittests/helpers.py | 9 | ||||
-rw-r--r-- | tests/unittests/test_helpers.py | 33 |
4 files changed, 41 insertions, 6 deletions
@@ -107,6 +107,8 @@ - phone_home: allow usage of fqdn (LP: #1566824) [Ollie Armstrong] - cloudstack: Only use DHCPv4 lease files as a datasource (LP: #1576273) [Wido den Hollander] + - Paths: fix instance path if datasource's id has a '/'. (LP: #1575938) + [Robert Jennings] 0.7.6: - open 0.7.6 diff --git a/cloudinit/helpers.py b/cloudinit/helpers.py index 0cf982f3..7f00bf1f 100644 --- a/cloudinit/helpers.py +++ b/cloudinit/helpers.py @@ -378,7 +378,8 @@ class Paths(object): iid = self.datasource.get_instance_id() if iid is None: return None - ipath = os.path.join(self.cloud_dir, 'instances', str(iid)) + path_safe_iid = str(iid).replace(os.sep, '_') + ipath = os.path.join(self.cloud_dir, 'instances', path_safe_iid) add_on = self.lookups.get(name) if add_on: ipath = os.path.join(ipath, add_on) diff --git a/tests/unittests/helpers.py b/tests/unittests/helpers.py index 7f4b8784..fb9c83a7 100644 --- a/tests/unittests/helpers.py +++ b/tests/unittests/helpers.py @@ -180,13 +180,12 @@ class ResourceUsingTestCase(TestCase): with open(where, 'r') as fh: return fh.read() - def getCloudPaths(self): + def getCloudPaths(self, ds=None): tmpdir = tempfile.mkdtemp() self.addCleanup(shutil.rmtree, tmpdir) - cp = ch.Paths({ - 'cloud_dir': tmpdir, - 'templates_dir': self.resourceLocation(), - }) + cp = ch.Paths({'cloud_dir': tmpdir, + 'templates_dir': self.resourceLocation()}, + ds=ds) return cp diff --git a/tests/unittests/test_helpers.py b/tests/unittests/test_helpers.py new file mode 100644 index 00000000..943a5723 --- /dev/null +++ b/tests/unittests/test_helpers.py @@ -0,0 +1,33 @@ +"""Tests of the built-in user data handlers.""" + +import os + +from . import helpers as test_helpers + +from cloudinit import sources + + +class MyDataSource(sources.DataSource): + _instance_id = None + + def get_instance_id(self): + return self._instance_id + + +class TestPaths(test_helpers.ResourceUsingTestCase): + def test_get_ipath_and_instance_id_with_slashes(self): + myds = MyDataSource(sys_cfg={}, distro=None, paths={}) + myds._instance_id = "/foo/bar" + safe_iid = "_foo_bar" + mypaths = self.getCloudPaths(myds) + + self.assertEqual( + os.path.join(mypaths.cloud_dir, 'instances', safe_iid), + mypaths.get_ipath()) + + def test_get_ipath_and_empty_instance_id_returns_none(self): + myds = MyDataSource(sys_cfg={}, distro=None, paths={}) + myds._instance_id = None + mypaths = self.getCloudPaths(myds) + + self.assertEqual(None, mypaths.get_ipath()) |