]> git-server-git.apps.pok.os.sepia.ceph.com Git - ragweed.git/commitdiff
ragweed: support for storage classes in zone config
authorYehuda Sadeh <yehuda@redhat.com>
Mon, 7 Jan 2019 18:27:45 +0000 (10:27 -0800)
committerYehuda Sadeh <yehuda@redhat.com>
Wed, 9 Jan 2019 18:54:42 +0000 (10:54 -0800)
Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
ragweed/framework.py

index 761c162339315a00da369d9d7bbd7a9612f38059..995605722b0be69d3f6234d7f6cd96f4fef83046 100644 (file)
@@ -134,6 +134,17 @@ def rtest_decode_json(d):
         return pickle.loads(str(d['__pickle']))
     return d
 
+class RPlacementRule:
+    def __init__(self, rule):
+        r = rule.split('/', 1)
+
+        self.placement_id = r[0]
+
+        if (len(r) == 2):
+            self.storage_class=r[1]
+        else:
+            self.storage_class = 'STANDARD'
+
 
 class RBucket:
     def __init__(self, zone, bucket, bucket_info):
@@ -142,6 +153,12 @@ class RBucket:
         self.name = bucket.name
         self.bucket_info = bucket_info
 
+        try:
+            self.placement_rule = RPlacementRule(self.bucket_info.placement_rule)
+            self.placement_target = self.zone.get_placement_target(self.bucket_info.placement_rule)
+        except:
+            pass
+
     def get_data_pool(self):
         try:
             # old style explicit pool
@@ -151,7 +168,9 @@ class RBucket:
             explicit_pool = self.bucket_info.bucket.explicit_placement.data_pool
         if explicit_pool is not None and explicit_pool != '':
             return explicit_pool
-        return self.zone.get_placement_target(self.bucket_info.placement_rule).data_pool
+
+        return self.placement_target.get_data_pool(self.placement_rule)
+
 
     def get_tail_pool(self, obj_layout):
         try:
@@ -171,7 +190,44 @@ class RBucket:
                 except:
                     pass
 
-        return self.zone.get_placement_target(placement_rule).data_pool
+        pr = RPlacementRule(placement_rule)
+
+        return self.placement_target.get_data_pool(pr)
+
+class RStorageClasses:
+    def __init__(self, config):
+        if hasattr(config, 'storage_classes'):
+            self.storage_classes = config.storage_classes
+        else:
+            try:
+                self.storage_classes = bunch.bunchify({ 'STANDARD': { 'data_pool': config.data_pool }})
+            except:
+                self.storage_classes = None
+                pass
+
+    def get(self, storage_class):
+        assert(self.storage_classes != None)
+        try:
+            if not storage_class:
+                storage_class = 'STANDARD'
+            sc = self.storage_classes[storage_class]
+        except:
+            eq('could not find storage class ' + storage_class, 0)
+
+        return sc
+
+class RPlacementTarget:
+    def __init__(self, name, config):
+        self.name = name
+        self.index_pool = config.index_pool
+        self.data_extra_pool = config.data_extra_pool
+        self.storage_classes = RStorageClasses(config)
+
+        if not self.data_extra_pool:
+            self.data_extra_pool = self.storage_classes.get_data_pool('STANDARD')
+
+    def get_data_pool(self, placement_rule):
+        return self.storage_classes.get(placement_rule.storage_class).data_pool
 
 class RZone:
     def __init__(self, conn):
@@ -194,7 +250,7 @@ class RZone:
             plid = self.zone_params.default_placement
 
         try:
-            return self.placement_targets[plid]
+            return RPlacementTarget(plid, self.placement_targets[plid])
         except:
             pass