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
display_map[led_ident],
display_map[led_fail],
display_map[d.available],
+ nice_delta(now, d.created, ' ago'),
', '.join(d.rejected_reasons)
)
)
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)
)
)
{
"available": true,
"device_id": "",
+ "created": "2022-02-11T10:58:23.177450Z",
"human_readable_type": "ssd",
"lvs": [],
"path": "/dev/vdb",
{
"available": true,
"device_id": "",
+ "created": "2022-02-11T10:58:23.177450Z",
"human_readable_type": "hdd",
"lvs": [],
"path": "/dev/vdd",
{
"available": true,
"device_id": "",
+ "created": "2022-02-11T10:58:23.177450Z",
"human_readable_type": "ssd",
"lvs": [],
"path": "/dev/vdb",
{
"available": true,
"device_id": "",
+ "created": "2022-02-11T10:58:23.177450Z",
"human_readable_type": "hdd",
"lvs": [],
"path": "/dev/vdd",
except ImportError:
pass # for type checking
+from ceph.utils import datetime_now, datetime_to_str, str_to_datetime
+import datetime
import json
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]
'available',
'path',
'sys_api',
+ 'created',
'lvs',
'human_readable_type',
'device_id',
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]
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
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'
}
[
{
"available": false,
+ "created": "2022-02-11T10:58:23.177450Z",
"rejected_reasons": [
"locked"
],
},
{
"available": false,
+ "created": "2022-02-11T10:58:23.177450Z",
"rejected_reasons": [
"locked"
],
],
"path": "/dev/sda"
}
-]
\ No newline at end of file
+]