mirror of
https://github.com/ceph/ceph
synced 2025-03-06 08:20:12 +00:00
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:
commit
3ca1fa3643
@ -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>
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user