]> git-server-git.apps.pok.os.sepia.ceph.com Git - ragweed.git/commitdiff
ragweed: test object create with storage_class
authorYehuda Sadeh <yehuda@redhat.com>
Tue, 8 Jan 2019 00:31:48 +0000 (16:31 -0800)
committerYehuda Sadeh <yehuda@redhat.com>
Wed, 9 Jan 2019 18:56:14 +0000 (10:56 -0800)
Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
ragweed/framework.py
ragweed/tests/tests.py

index 995605722b0be69d3f6234d7f6cd96f4fef83046..3eaa674f5cc61ff2866411c3d21c3cf45af84a19 100644 (file)
@@ -216,6 +216,10 @@ class RStorageClasses:
 
         return sc
 
+    def get_all(self):
+        for (name, _) in self.storage_classes.iteritems():
+            yield name
+
 class RPlacementTarget:
     def __init__(self, name, config):
         self.name = name
@@ -256,6 +260,9 @@ class RZone:
 
         return None
 
+    def get_default_placement(self):
+        return get_placement_target(self.zone_params.default_placement)
+
     def create_bucket(self, name):
         bucket = self.create_raw_bucket(name)
         bucket_info = self.rgw_rest_admin.get_bucket_instance_info(bucket.name)
index 0825ded43a922c13f91c6d3fd41cc3619492900a..e590c6359ada0ab96edbe763e08e4a5b2179295f 100644 (file)
@@ -13,8 +13,11 @@ class obj_placement:
         self.oid = oid
         self.loc = loc
 
+def get_zone():
+    return ragweed.framework.ragweed_env.zone
+
 def rgwa():
-    return ragweed.framework.ragweed_env.zone.rgw_rest_admin
+    return get_zone().rgw_rest_admin
 
 def get_pool_ioctx(pool_name):
     return ragweed.framework.ragweed_env.rados.open_ioctx(pool_name)
@@ -39,6 +42,9 @@ def validate_obj_location(rbucket, obj):
 
     print 'layout', obj_layout
 
+    obj_size = obj_layout.manifest.obj_size
+    print 'obj_size', obj_size
+
     print 'head', obj_layout.head
     expected_tail_pool = rbucket.get_tail_pool(obj_layout)
     tail_pool_ioctx = get_pool_ioctx(expected_tail_pool)
@@ -58,14 +64,30 @@ def validate_obj_location(rbucket, obj):
         print 'o=', o
         print 'ofs=', o.ofs, 'loc', o.loc
         placement = get_placement(o.loc)
-        if o.ofs > 0 or placement.oid != head_placement.oid:
+        if o.ofs < obj_layout.manifest.head_size:
+            eq(placement.pool, expected_head_pool)
+            pool_ioctx = head_pool_ioctx
+        else:
             eq(placement.pool, expected_tail_pool)
+            pool_ioctx = tail_pool_ioctx
 
         # validate rados object exists
-        tail_pool_ioctx.set_locator_key(placement.loc)
-        (size, mtime) = tail_pool_ioctx.stat(placement.oid)
+        pool_ioctx.set_locator_key(placement.loc)
+        (size, mtime) = pool_ioctx.stat(placement.oid)
+
+        if o.ofs + o.loc_size > obj_size:
+            # radosgw get_obj_layout() request on previous versions could return bigger o.loc_size
+            # than actual at the end of the object. Fixed in later versions but need to adjust here
+            # for when running on older versions.
+            o.loc_size = obj_size - o.ofs
+
+        check_size = o.loc_ofs + o.loc_size
 
-        eq(size, o.loc_ofs + o.loc_size)
+        eq(size, check_size)
+
+def calc_crc(data):
+    crc = binascii.crc32(data)
+    return '{:#010x}'.format(crc)
 
 
 def validate_obj(rbucket, obj_name, expected_crc):
@@ -74,15 +96,35 @@ def validate_obj(rbucket, obj_name, expected_crc):
     obj = b.get_key(obj_name)
 
     validate_obj_location(rbucket, obj)
-    crc = binascii.crc32(obj.get_contents_as_string())
-    obj_crc = '{:#010x}'.format(crc)
-    print 'read crc: ' + obj_crc
+    obj_crc = calc_crc(obj.get_contents_as_string())
     eq(obj_crc, expected_crc)
 
 
+def generate_random(size):
+    """
+    Generate random data
+    (actually each MB is a repetition of the first KB)
+    """
+    chunk = 1024
+    allowed = string.ascii_letters
+    s = ''
+    strpart = ''.join([allowed[random.randint(0, len(allowed) - 1)] for _ in xrange(chunk)])
+
+    for y in range((size + chunk - 1) / chunk):
+        this_chunk_len = chunk
+
+        if len(s) + this_chunk_len > size:
+            this_chunk_len = size - len(s)
+            strpart = strpart[0:this_chunk_len]
+
+        s += strpart
+
+    return s
+
 def gen_rand_string(size, chars=string.ascii_uppercase + string.digits):
     return ''.join(random.choice(chars) for _ in range(size))
 
+
 # prepare:
 # create objects in multiple sizes, with various names
 # check:
@@ -331,3 +373,46 @@ class r_test_multipart_defer_update_complete(RTest):
 
         validate_obj(rb, self.r_obj, crc)
 
+# prepare:
+# init, create obj in different storage classes
+# check:
+# verify rados objects in expected location
+class r_test_obj_storage_class(RTest):
+    def init(self):
+        self.obj_size = 10 * 1024 * 1024
+        self.obj_prefix = 'foo-'
+
+    def prepare(self):
+        rb = self.create_bucket()
+        zone = get_zone()
+
+        placement_target = zone.get_placement_target(rb.placement_rule.placement_id)
+
+        self.r_data = generate_random(self.obj_size)
+        self.r_crc = calc_crc(self.r_data)
+
+        self.r_storage_classes = []
+
+        for sc in placement_target.storage_classes.get_all():
+            self.r_storage_classes.append(sc)
+
+            obj = Key(rb.bucket)
+            obj.key = self.obj_prefix + sc
+            obj.storage_class = sc
+            obj.set_contents_from_string(self.r_data)
+
+
+    def check(self):
+        for rb in self.get_buckets():
+            break
+
+        for sc in self.r_storage_classes:
+            obj_name = self.obj_prefix + sc
+
+            k = rb.bucket.get_key(obj_name)
+            eq(k.size, self.obj_size)
+            eq(k.storage_class, sc)
+
+
+            validate_obj(rb, obj_name, self.r_crc)
+