diff options
author | Chad Smith <chad.smith@canonical.com> | 2018-03-15 11:40:13 -0600 |
---|---|---|
committer | Chad Smith <chad.smith@canonical.com> | 2018-03-15 11:40:13 -0600 |
commit | 97012fbb5207ddf1d2dcbb1c5eae710c47ab8ec0 (patch) | |
tree | cbd8b3377e12763bf0c43657a7d3021fdda9fa89 | |
parent | 837021fd3ded8262ff7131efe6cfd4c7ce489e2b (diff) | |
download | vyos-cloud-init-97012fbb5207ddf1d2dcbb1c5eae710c47ab8ec0.tar.gz vyos-cloud-init-97012fbb5207ddf1d2dcbb1c5eae710c47ab8ec0.zip |
util: Fix subp regression. Allow specifying subp command as a string.
The command provided to subp can either be a string or a list. This patch
fixes a regression which raised CalledProcessError whenever providing a
string to subp.
LP: #1755965
-rw-r--r-- | cloudinit/util.py | 10 | ||||
-rw-r--r-- | tests/unittests/test_util.py | 18 |
2 files changed, 26 insertions, 2 deletions
diff --git a/cloudinit/util.py b/cloudinit/util.py index 4504f053..823d80bf 100644 --- a/cloudinit/util.py +++ b/cloudinit/util.py @@ -1874,8 +1874,14 @@ def subp(args, data=None, rcs=None, env=None, capture=True, shell=False, # Popen converts entries in the arguments array from non-bytes to bytes. # When locale is unset it may use ascii for that encoding which can # cause UnicodeDecodeErrors. (LP: #1751051) - bytes_args = [x if isinstance(x, six.binary_type) else x.encode("utf-8") - for x in args] + if isinstance(args, six.binary_type): + bytes_args = args + elif isinstance(args, six.string_types): + bytes_args = args.encode("utf-8") + else: + bytes_args = [ + x if isinstance(x, six.binary_type) else x.encode("utf-8") + for x in args] try: sp = subprocess.Popen(bytes_args, stdout=stdout, stderr=stderr, stdin=stdin, diff --git a/tests/unittests/test_util.py b/tests/unittests/test_util.py index 89ae40f5..499e7c9f 100644 --- a/tests/unittests/test_util.py +++ b/tests/unittests/test_util.py @@ -632,6 +632,24 @@ class TestSubp(helpers.CiTestCase): # but by using bash, we remove dependency on another program. return([BASH, '-c', 'printf "$@"', 'printf'] + list(args)) + def test_subp_handles_bytestrings(self): + """subp can run a bytestring command if shell is True.""" + tmp_file = self.tmp_path('test.out') + cmd = 'echo HI MOM >> {tmp_file}'.format(tmp_file=tmp_file) + (out, _err) = util.subp(cmd.encode('utf-8'), shell=True) + self.assertEqual(u'', out) + self.assertEqual(u'', _err) + self.assertEqual('HI MOM\n', util.load_file(tmp_file)) + + def test_subp_handles_strings(self): + """subp can run a string command if shell is True.""" + tmp_file = self.tmp_path('test.out') + cmd = 'echo HI MOM >> {tmp_file}'.format(tmp_file=tmp_file) + (out, _err) = util.subp(cmd, shell=True) + self.assertEqual(u'', out) + self.assertEqual(u'', _err) + self.assertEqual('HI MOM\n', util.load_file(tmp_file)) + def test_subp_handles_utf8(self): # The given bytes contain utf-8 accented characters as seen in e.g. # the "deja dup" package in Ubuntu. |