1
0
mirror of https://github.com/ceph/ceph synced 2025-03-30 23:40:09 +00:00

Merge pull request from rkachach/fix_issue_53540

mgr/cephadm: Adding AGE field to device ls cmd

Reviewed-by: Adam King <adking@redhat.com>
This commit is contained in:
Adam King 2022-02-23 08:58:58 -05:00 committed by GitHub
commit 9b6fe23f69
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 40 additions and 6 deletions
src
pybind/mgr
orchestrator
test_orchestrator
python-common/ceph

View File

@ -492,17 +492,18 @@ class OrchestratorCli(OrchestratorClientMixin, MgrModule,
table = PrettyTable(
['HOST', 'PATH', 'TYPE', 'TRANSPORT', 'RPM', 'DEVICE ID', 'SIZE',
'HEALTH', 'IDENT', 'FAULT',
'AVAILABLE', 'REJECT REASONS'],
'AVAILABLE', 'REFRESHED', 'REJECT REASONS'],
border=False)
else:
table = PrettyTable(
['HOST', 'PATH', 'TYPE', 'DEVICE ID', 'SIZE',
'AVAILABLE', 'REJECT REASONS'],
'AVAILABLE', 'REFRESHED', 'REJECT REASONS'],
border=False)
table.align = 'l'
table._align['SIZE'] = 'r'
table.left_padding_width = 0
table.right_padding_width = 2
now = datetime_now()
for host_ in sorted(inv_hosts, key=lambda h: h.name): # type: InventoryHost
for d in sorted(host_.devices.devices, key=lambda d: d.path): # type: Device
@ -526,6 +527,7 @@ class OrchestratorCli(OrchestratorClientMixin, MgrModule,
display_map[led_ident],
display_map[led_fail],
display_map[d.available],
nice_delta(now, d.created, ' ago'),
', '.join(d.rejected_reasons)
)
)
@ -538,6 +540,7 @@ class OrchestratorCli(OrchestratorClientMixin, MgrModule,
d.device_id,
format_dimless(d.sys_api.get('size', 0), 5),
display_map[d.available],
nice_delta(now, d.created, ' ago'),
', '.join(d.rejected_reasons)
)
)

View File

@ -6,6 +6,7 @@
{
"available": true,
"device_id": "",
"created": "2022-02-11T10:58:23.177450Z",
"human_readable_type": "ssd",
"lvs": [],
"path": "/dev/vdb",
@ -62,6 +63,7 @@
{
"available": true,
"device_id": "",
"created": "2022-02-11T10:58:23.177450Z",
"human_readable_type": "hdd",
"lvs": [],
"path": "/dev/vdd",
@ -134,6 +136,7 @@
{
"available": true,
"device_id": "",
"created": "2022-02-11T10:58:23.177450Z",
"human_readable_type": "ssd",
"lvs": [],
"path": "/dev/vdb",
@ -190,6 +193,7 @@
{
"available": true,
"device_id": "",
"created": "2022-02-11T10:58:23.177450Z",
"human_readable_type": "hdd",
"lvs": [],
"path": "/dev/vdd",

View File

@ -3,6 +3,8 @@ try:
except ImportError:
pass # for type checking
from ceph.utils import datetime_now, datetime_to_str, str_to_datetime
import datetime
import json
@ -16,7 +18,14 @@ class Devices(object):
self.devices = devices # type: List[Device]
def __eq__(self, other: Any) -> bool:
return self.to_json() == other.to_json()
if not isinstance(other, Devices):
return NotImplemented
if len(self.devices) != len(other.devices):
return False
for d1, d2 in zip(other.devices, self.devices):
if d1 != d2:
return False
return True
def to_json(self):
# type: () -> List[dict]
@ -38,6 +47,7 @@ class Device(object):
'available',
'path',
'sys_api',
'created',
'lvs',
'human_readable_type',
'device_id',
@ -52,6 +62,7 @@ class Device(object):
lvs=None, # type: Optional[List[str]]
device_id=None, # type: Optional[str]
lsm_data=None, # type: Optional[Dict[str, Dict[str, str]]]
created=None # type: Optional[datetime.datetime]
):
self.path = path
self.sys_api = sys_api if sys_api is not None else {} # type: Dict[str, Any]
@ -60,11 +71,23 @@ class Device(object):
self.lvs = lvs
self.device_id = device_id
self.lsm_data = lsm_data if lsm_data is not None else {} # type: Dict[str, Dict[str, str]]
self.created = created if created is not None else datetime_now()
def __eq__(self, other):
# type: (Any) -> bool
if not isinstance(other, Device):
return NotImplemented
diff = [k for k in self.report_fields if k != 'created' and (getattr(self, k)
!= getattr(other, k))]
return not diff
def to_json(self):
# type: () -> dict
return {
k: getattr(self, k) for k in self.report_fields
k: (getattr(self, k) if k != 'created'
or not isinstance(getattr(self, k), datetime.datetime)
else datetime_to_str(getattr(self, k)))
for k in self.report_fields
}
@classmethod
@ -74,7 +97,9 @@ class Device(object):
raise ValueError('Device: Expected dict. Got `{}...`'.format(json.dumps(input)[:10]))
ret = cls(
**{
key: input.get(key, None)
key: (input.get(key, None) if key != 'created'
or not input.get(key, None)
else str_to_datetime(input.get(key, None)))
for key in Device.report_fields
if key != 'human_readable_type'
}

View File

@ -1,6 +1,7 @@
[
{
"available": false,
"created": "2022-02-11T10:58:23.177450Z",
"rejected_reasons": [
"locked"
],
@ -57,6 +58,7 @@
},
{
"available": false,
"created": "2022-02-11T10:58:23.177450Z",
"rejected_reasons": [
"locked"
],
@ -150,4 +152,4 @@
],
"path": "/dev/sda"
}
]
]