Merge PR #32616 into master

* refs/pull/32616/head:
	cephadm: annotate call()
	cephadm: podman inspect: image field was called `ImageID`:

Reviewed-by: Patrick Seidensal <pseidensal@suse.com>
Reviewed-by: Sage Weil <sage@redhat.com>
This commit is contained in:
Sage Weil 2020-01-23 16:40:58 -06:00
commit 3ca1fa3643
3 changed files with 58 additions and 13 deletions

View File

@ -112,3 +112,4 @@ jschmid1 Joshua Schmid <jschmid@suse.de>
bk201 Kiefer Chang <kiefer.chang@suse.com>
alimaredia Ali Maredia <amaredia@redhat.com>
ideepika Deepika Upadhyay <dupadhya@redhat.com>
p-se Patrick Seidensal <pseidensal@suse.com>

View File

@ -50,7 +50,7 @@ import tempfile
import time
import errno
try:
from typing import Dict, List, Tuple, Optional, Union
from typing import Dict, List, Tuple, Optional, Union, Any
except ImportError:
pass
import uuid
@ -70,7 +70,7 @@ if sys.version_info >= (3, 2):
else:
from ConfigParser import SafeConfigParser
container_path = None
container_path = ''
class Error(Exception):
pass
@ -373,11 +373,11 @@ class FileLock(object):
##################################
# Popen wrappers, lifted from ceph-volume
def call(command,
desc=None,
verbose=False,
verbose_on_failure=True,
timeout=DEFAULT_TIMEOUT,
def call(command, # type: List[str]
desc=None, # type: Optional[str]
verbose=False, # type: bool
verbose_on_failure=True, # type: bool
timeout=DEFAULT_TIMEOUT, # type: Optional[int]
**kwargs):
"""
Wrap subprocess.Popen to
@ -436,9 +436,11 @@ def call(command,
)
for fd in reads:
try:
message = os.read(fd, 1024)
if not isinstance(message, str):
message = message.decode('utf-8')
message_b = os.read(fd, 1024)
if isinstance(message_b, bytes):
message = message_b.decode('utf-8')
if isinstance(message_b, str):
message = message_b
if fd == process.stdout.fileno():
out += message
message = out_buffer + message
@ -489,6 +491,7 @@ def call(command,
def call_throws(command, **kwargs):
# type: (List[str], Any) -> Tuple[str, str, int]
out, err, ret = call(command, **kwargs)
if ret:
raise RuntimeError('Failed command: %s' % ' '.join(command))
@ -590,6 +593,29 @@ def pathify(p):
return os.path.join(os.getcwd(), p)
return p
def get_podman_version():
# type: () -> Tuple[int, ...]
if 'podman' not in container_path:
raise ValueError('not using podman')
out, _, _ = call_throws([container_path, '--version'])
return _parse_podman_version(out)
def _parse_podman_version(out):
# type: (str) -> Tuple[int, ...]
_, _, version_str = out.strip().split()
def to_int(val, org_e=None):
if not val and org_e:
raise org_e
try:
return int(val)
except ValueError as e:
return to_int(val[0:-1], org_e or e)
return tuple(map(to_int, version_str.split('.')))
def get_hostname():
# type: () -> str
return socket.gethostname()
@ -2196,10 +2222,16 @@ def list_daemons(detail=True, legacy_dir=None):
image_name = None
image_id = None
version = None
if 'podman' in container_path and get_podman_version() < (1, 6, 2):
image_field = '.ImageID'
else:
image_field = '.Image'
out, err, code = call(
[
container_path, 'inspect',
'--format', '{{.Id}},{{.Config.Image}},{{.Image}}',
'--format', '{{.Id}},{{.Config.Image}},{{%s}}' % image_field,
'ceph-%s-%s' % (fsid, j)
],
verbose_on_failure=False)

View File

@ -13,9 +13,9 @@ else:
import imp
cd = imp.load_source('cephadm', 'cephadm')
class TestCephAdm(unittest.TestCase):
class TestCephAdm(object):
def test_is_fsid(self):
self.assertFalse(cd.is_fsid('no-uuid'))
assert not cd.is_fsid('no-uuid')
def test__get_parser_image(self):
p = cd._get_parser()
@ -34,3 +34,15 @@ class TestCephAdm(unittest.TestCase):
with pytest.raises(SystemExit):
p.parse_args(['deploy', '--name', 'wrong', '--fsid', 'fsid'])
@pytest.mark.parametrize("test_input, expected", [
("podman version 1.6.2", (1,6,2)),
("podman version 1.6.2-stable2", (1,6,2)),
])
def test_parse_podman_version(self, test_input, expected):
assert cd._parse_podman_version(test_input) == expected
def test_parse_podman_version_invalid(self):
with pytest.raises(ValueError) as res:
cd._parse_podman_version('podman version inval.id')
assert 'inval' in str(res.value)