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]
class Device(object):
report_fields = [
+ 'ceph_device',
'rejected_reasons',
'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]
+ ceph_device=None # type: Optional[bool]
):
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()
+ self.ceph_device = ceph_device
+
+ 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'
}
'path': self.path if self.path is not None else 'unknown',
'lvs': self.lvs if self.lvs else 'None',
'available': str(self.available),
+ 'ceph_device': str(self.ceph_device)
}
if not self.available and self.rejected_reasons:
device_desc['rejection reasons'] = self.rejected_reasons