]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/python-common/ceph/deployment/inventory.py
import ceph quincy 17.2.1
[ceph.git] / ceph / src / python-common / ceph / deployment / inventory.py
index d0a885668c090c15d94ae7fe30d7d88e3984cbd2..570c1dbb3615e0cd41ac24e7a08ac12ee35bea1f 100644 (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]
@@ -34,10 +43,12 @@ class Devices(object):
 
 class Device(object):
     report_fields = [
+        'ceph_device',
         'rejected_reasons',
         'available',
         'path',
         'sys_api',
+        'created',
         'lvs',
         'human_readable_type',
         'device_id',
@@ -52,6 +63,8 @@ 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]
+                 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]
@@ -60,11 +73,24 @@ 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()
+        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
@@ -74,7 +100,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'
             }
@@ -95,6 +123,7 @@ class Device(object):
             '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