summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Moser <smoser@brickies.net>2016-09-23 16:51:03 -0400
committerScott Moser <smoser@brickies.net>2016-09-23 16:51:03 -0400
commitf13a89a1592d0445d93ea42809eba2363454488b (patch)
treea254dd95a9f45ab55af92402e8c7789e28e2ae80
parent0e4eaef9640b6aaf09063124959717e05ed52b06 (diff)
parent0439d8a17d181a2546f2f7cb2d71a04bbb13b186 (diff)
downloadvyos-cloud-init-f13a89a1592d0445d93ea42809eba2363454488b.tar.gz
vyos-cloud-init-f13a89a1592d0445d93ea42809eba2363454488b.zip
merge from master at 0.7.8-8-g0439d8a
-rw-r--r--cloudinit/config/cc_disk_setup.py11
-rw-r--r--cloudinit/util.py11
-rw-r--r--systemd/cloud-init-local.service1
-rw-r--r--tests/unittests/test_handler/test_handler_growpart.py4
-rw-r--r--tests/unittests/test_util.py38
5 files changed, 57 insertions, 8 deletions
diff --git a/cloudinit/config/cc_disk_setup.py b/cloudinit/config/cc_disk_setup.py
index b642f1f8..39a23688 100644
--- a/cloudinit/config/cc_disk_setup.py
+++ b/cloudinit/config/cc_disk_setup.py
@@ -33,6 +33,8 @@ BLKID_CMD = util.which("blkid")
BLKDEV_CMD = util.which("blockdev")
WIPEFS_CMD = util.which("wipefs")
+LANG_C_ENV = {'LANG': 'C'}
+
LOG = logging.getLogger(__name__)
@@ -355,8 +357,11 @@ def get_mbr_hdd_size(device):
def get_gpt_hdd_size(device):
- out, _ = util.subp([SGDISK_CMD, '-p', device])
- return out.splitlines()[0].split()[2]
+ out, _ = util.subp([SGDISK_CMD, '-p', device], update_env=LANG_C_ENV)
+ for line in out.splitlines():
+ if line.startswith("Disk"):
+ return line.split()[2]
+ raise Exception("Failed to get %s size from sgdisk" % (device))
def get_hdd_size(table_type, device):
@@ -408,7 +413,7 @@ def check_partition_mbr_layout(device, layout):
def check_partition_gpt_layout(device, layout):
prt_cmd = [SGDISK_CMD, '-p', device]
try:
- out, _err = util.subp(prt_cmd)
+ out, _err = util.subp(prt_cmd, update_env=LANG_C_ENV)
except Exception as e:
raise Exception("Error running partition command on %s\n%s" % (
device, e))
diff --git a/cloudinit/util.py b/cloudinit/util.py
index 6c5cf741..eb3e5899 100644
--- a/cloudinit/util.py
+++ b/cloudinit/util.py
@@ -154,7 +154,7 @@ def target_path(target, path=None):
def decode_binary(blob, encoding='utf-8'):
# Converts a binary type into a text type using given encoding.
- if isinstance(blob, six.text_type):
+ if isinstance(blob, six.string_types):
return blob
return blob.decode(encoding)
@@ -1762,7 +1762,7 @@ def delete_dir_contents(dirname):
def subp(args, data=None, rcs=None, env=None, capture=True, shell=False,
- logstring=False, decode="replace", target=None):
+ logstring=False, decode="replace", target=None, update_env=None):
# not supported in cloud-init (yet), for now kept in the call signature
# to ease maintaining code shared between cloud-init and curtin
@@ -1773,6 +1773,13 @@ def subp(args, data=None, rcs=None, env=None, capture=True, shell=False,
rcs = [0]
devnull_fp = None
+
+ if update_env:
+ if env is None:
+ env = os.environ
+ env = env.copy()
+ env.update(update_env)
+
try:
if target_path(target) != "/":
args = ['chroot', target] + list(args)
diff --git a/systemd/cloud-init-local.service b/systemd/cloud-init-local.service
index bc2db60e..55834ba4 100644
--- a/systemd/cloud-init-local.service
+++ b/systemd/cloud-init-local.service
@@ -5,6 +5,7 @@ Wants=local-fs.target
Wants=network-pre.target
After=local-fs.target
Before=basic.target
+Before=NetworkManager.service
Before=network-pre.target
Before=shutdown.target
Conflicts=shutdown.target
diff --git a/tests/unittests/test_handler/test_handler_growpart.py b/tests/unittests/test_handler/test_handler_growpart.py
index e653488a..e28067de 100644
--- a/tests/unittests/test_handler/test_handler_growpart.py
+++ b/tests/unittests/test_handler/test_handler_growpart.py
@@ -81,11 +81,11 @@ class TestConfig(TestCase):
self.cloud = cloud.Cloud(None, self.paths, None, None, None)
self.log = logging.getLogger("TestConfig")
self.args = []
- os.environ = {}
self.cloud_init = None
self.handle = cc_growpart.handle
+ @mock.patch.dict("os.environ", clear=True)
def test_no_resizers_auto_is_fine(self):
with mock.patch.object(
util, 'subp',
@@ -98,6 +98,7 @@ class TestConfig(TestCase):
mockobj.assert_called_once_with(
['growpart', '--help'], env={'LANG': 'C'})
+ @mock.patch.dict("os.environ", clear=True)
def test_no_resizers_mode_growpart_is_exception(self):
with mock.patch.object(
util, 'subp',
@@ -110,6 +111,7 @@ class TestConfig(TestCase):
mockobj.assert_called_once_with(
['growpart', '--help'], env={'LANG': 'C'})
+ @mock.patch.dict("os.environ", clear=True)
def test_mode_auto_prefers_growpart(self):
with mock.patch.object(
util, 'subp',
diff --git a/tests/unittests/test_util.py b/tests/unittests/test_util.py
index d2031f59..fc6b9d40 100644
--- a/tests/unittests/test_util.py
+++ b/tests/unittests/test_util.py
@@ -223,8 +223,10 @@ class TestKeyValStrings(helpers.TestCase):
class TestGetCmdline(helpers.TestCase):
def test_cmdline_reads_debug_env(self):
- os.environ['DEBUG_PROC_CMDLINE'] = 'abcd 123'
- self.assertEqual(os.environ['DEBUG_PROC_CMDLINE'], util.get_cmdline())
+ with mock.patch.dict("os.environ",
+ values={'DEBUG_PROC_CMDLINE': 'abcd 123'}):
+ ret = util.get_cmdline()
+ self.assertEqual("abcd 123", ret)
class TestLoadYaml(helpers.TestCase):
@@ -516,6 +518,7 @@ class TestSubp(helpers.TestCase):
utf8_invalid = b'ab\xaadef'
utf8_valid = b'start \xc3\xa9 end'
utf8_valid_2 = b'd\xc3\xa9j\xc8\xa7'
+ printenv = ['bash', '-c', 'for n in "$@"; do echo "$n=${!n}"; done', '--']
def printf_cmd(self, *args):
# bash's printf supports \xaa. So does /usr/bin/printf
@@ -566,6 +569,29 @@ class TestSubp(helpers.TestCase):
self.assertEqual(err, data)
self.assertEqual(out, b'')
+ def test_subp_reads_env(self):
+ with mock.patch.dict("os.environ", values={'FOO': 'BAR'}):
+ out, err = util.subp(self.printenv + ['FOO'], capture=True)
+ self.assertEqual('FOO=BAR', out.splitlines()[0])
+
+ def test_subp_env_and_update_env(self):
+ out, err = util.subp(
+ self.printenv + ['FOO', 'HOME', 'K1', 'K2'], capture=True,
+ env={'FOO': 'BAR'},
+ update_env={'HOME': '/myhome', 'K2': 'V2'})
+ self.assertEqual(
+ ['FOO=BAR', 'HOME=/myhome', 'K1=', 'K2=V2'], out.splitlines())
+
+ def test_subp_update_env(self):
+ extra = {'FOO': 'BAR', 'HOME': '/root', 'K1': 'V1'}
+ with mock.patch.dict("os.environ", values=extra):
+ out, err = util.subp(
+ self.printenv + ['FOO', 'HOME', 'K1', 'K2'], capture=True,
+ update_env={'HOME': '/myhome', 'K2': 'V2'})
+
+ self.assertEqual(
+ ['FOO=BAR', 'HOME=/myhome', 'K1=V1', 'K2=V2'], out.splitlines())
+
def test_returns_none_if_no_capture(self):
(out, err) = util.subp(self.stdin2out, data=b'', capture=False)
self.assertEqual(err, None)
@@ -577,4 +603,12 @@ class TestSubp(helpers.TestCase):
self.assertEqual("/target/my/path/",
util.target_path("/target/", "///my/path/"))
+
+class TestEncode(helpers.TestCase):
+ """Test the encoding functions"""
+ def test_decode_binary_plain_text_with_hex(self):
+ blob = 'BOOTABLE_FLAG=\x80init=/bin/systemd'
+ text = util.decode_binary(blob)
+ self.assertEqual(text, blob)
+
# vi: ts=4 expandtab