Fix cli.base.execute with py34

In python3, the command must be a string not bytes.

Also all tempest_lib assert tools expected the result is a str.
But in python subprocess stdout/stderr returns bytes
To fix that we decode it with the fsencoding.

Change-Id: Id5b2e5d75f2c881cd2a3fff216126f6529dccef3
This commit is contained in:
Mehdi Abaakouk 2015-08-31 16:09:13 +02:00
parent 61b7ffcaf8
commit 26cfeef233
2 changed files with 39 additions and 2 deletions

View File

@ -16,6 +16,7 @@
import logging
import os
import shlex
import six
import subprocess
from tempest_lib import base
@ -50,7 +51,9 @@ def execute(cmd, action, flags='', params='', fail_ok=False,
cmd = ' '.join([os.path.join(cli_dir, cmd),
flags, action, params])
LOG.info("running: '%s'" % cmd)
cmd = shlex.split(cmd.encode('utf-8'))
if six.PY2:
cmd = cmd.encode('utf-8')
cmd = shlex.split(cmd)
result = ''
result_err = ''
stdout = subprocess.PIPE
@ -62,7 +65,10 @@ def execute(cmd, action, flags='', params='', fail_ok=False,
cmd,
result,
result_err)
return result
if six.PY2:
return result
else:
return os.fsdecode(result)
class CLIClient(object):

View File

@ -0,0 +1,31 @@
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from tempest_lib.cli import base as cli_base
from tempest_lib.tests import base
class TestExecute(base.TestCase):
def test_execute_success(self):
result = cli_base.execute("/bin/ls", action="tempest_lib",
flags="-l -a")
self.assertIsInstance(result, str)
self.assertIn("__init__.py", result)
def test_execute_failure(self):
result = cli_base.execute("/bin/ls", action="tempest_lib",
flags="--foobar", merge_stderr=True,
fail_ok=True)
self.assertIsInstance(result, str)
self.assertIn("--foobar", result)