]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/pybind/mgr/dashboard/services/cluster.py
update ceph source to reef 18.2.1
[ceph.git] / ceph / src / pybind / mgr / dashboard / services / cluster.py
index fbb00bc7370703c5a3095aa0b470e98fc79fd0e9..9caaf1963366b978b5ed7e3236500c8363e559d9 100644 (file)
@@ -9,6 +9,9 @@ class ClusterCapacity(NamedTuple):
     total_avail_bytes: int
     total_bytes: int
     total_used_raw_bytes: int
+    total_objects: int
+    total_pool_bytes_used: int
+    average_object_size: int
 
 
 class ClusterModel:
@@ -44,6 +47,41 @@ class ClusterModel:
     @classmethod
     def get_capacity(cls) -> ClusterCapacity:
         df = mgr.get('df')
-        return ClusterCapacity(total_avail_bytes=df['stats']['total_avail_bytes'],
-                               total_bytes=df['stats']['total_bytes'],
-                               total_used_raw_bytes=df['stats']['total_used_raw_bytes'])._asdict()
+        total_pool_bytes_used = 0
+        average_object_size = 0
+        total_data_pool_objects = 0
+        total_data_pool_bytes_used = 0
+        rgw_pools_data = cls.get_rgw_pools()
+
+        for pool in df['pools']:
+            pool_name = str(pool['name'])
+            if pool_name in rgw_pools_data:
+                if pool_name.endswith('.data'):
+                    objects = pool['stats']['objects']
+                    pool_bytes_used = pool['stats']['bytes_used']
+                    total_pool_bytes_used += pool_bytes_used
+                    total_data_pool_objects += objects
+                    replica = rgw_pools_data[pool_name]
+                    total_data_pool_bytes_used += pool_bytes_used / replica
+
+        average_object_size = total_data_pool_bytes_used / total_data_pool_objects if total_data_pool_objects != 0 else 0  # noqa E501  #pylint: disable=line-too-long
+
+        return ClusterCapacity(
+            total_avail_bytes=df['stats']['total_avail_bytes'],
+            total_bytes=df['stats']['total_bytes'],
+            total_used_raw_bytes=df['stats']['total_used_raw_bytes'],
+            total_objects=total_data_pool_objects,
+            total_pool_bytes_used=total_pool_bytes_used,
+            average_object_size=average_object_size
+        )._asdict()
+
+    @classmethod
+    def get_rgw_pools(cls):
+        rgw_pool_size = {}
+
+        osd_map = mgr.get('osd_map')
+        for pool in osd_map['pools']:
+            if 'rgw' in pool.get('application_metadata', {}):
+                name = pool['pool_name']
+                rgw_pool_size[name] = pool['size']
+        return rgw_pool_size