]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
obysnc: rgw target: validate all users
authorColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Thu, 26 May 2011 20:28:39 +0000 (13:28 -0700)
committerColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Thu, 26 May 2011 21:11:04 +0000 (14:11 -0700)
Signed-off-by: Colin McCabe <colin.mccabe@dreamhost.com>
src/obsync/obsync
src/obsync/test-obsync.py

index 0d58719ae0b2e2f7ecc8536c61a5a63d1ea9236e..eb3255fc7d79717363c85d87b420ef32b50760d5 100755 (executable)
@@ -352,6 +352,13 @@ class AclPolicy(object):
             self.owner_display_name = ""
         for k,g in self.grants.items():
             g.translate_users(xusers)
+    def get_all_users(self):
+        """ Get a list of all user ids referenced in this ACL """
+        users = {}
+        users[ACL_TYPE_CANON_USER + self.owner_id] = 1
+        for k,g in self.grants.items():
+            users[k] = 1
+        return users.keys()
     def set_owner(self, owner_id):
         self.owner_id = owner_id
         self.owner_display_name = ""
@@ -828,7 +835,7 @@ rgw:/path/to/ceph/conf:pool:key_prefix. Failed to find the bucket.")
         self.rados = rados.Rados()
         self.rados.conf_read_file(self.conf_file_path)
         self.rados.connect()
-        if self.owner != None and not self.user_exists(self.owner):
+        if self.owner != None and not self.user_exists(ACL_TYPE_CANON_USER + self.owner):
             raise Exception("Unknown owner! DST_OWNER=%s" % self.owner)
         if (not self.rados.pool_exists(self.rgw_bucket_name)):
             if (create):
@@ -939,18 +946,25 @@ xsi:type=\"CanonicalUser\"><ID>%s</ID> \
         return RgwStoreIterator(it, self)
     def locate_object(self, obj):
         return self.obsync_obj_from_rgw(obj.name)
-    def user_exists(self, user_id):
-        if (self.user_exists_cache.has_key(user_id)):
-            return self.user_exists_cache[user_id]
-        if (self.users_uid_ioctx == None):
-            # will be closed in __del__
-            self.users_uid_ioctx = self.rados.open_ioctx(RGW_USERS_UID_BUCKET_NAME)
-        try:
-            self.users_uid_ioctx.stat(user_id)
-        except rados.ObjectNotFound:
-            return False
-        self.user_exists_cache[user_id] = True
-        return True
+    def user_exists(self, user):
+        if (self.user_exists_cache.has_key(user)):
+            return self.user_exists_cache[user]
+        if user[:len(ACL_TYPE_CANON_USER)] == ACL_TYPE_CANON_USER:
+            if (self.users_uid_ioctx == None):
+                # will be closed in __del__
+                self.users_uid_ioctx = self.rados.open_ioctx(RGW_USERS_UID_BUCKET_NAME)
+            try:
+                self.users_uid_ioctx.stat(user[len(ACL_TYPE_CANON_USER):])
+            except rados.ObjectNotFound:
+                return False
+            self.user_exists_cache[user] = True
+            return True
+        elif user[:len(ACL_TYPE_EMAIL_USER)] == ACL_TYPE_EMAIL_USER:
+            raise Exception("rgw target can't handle email users yet.")
+        elif user[:len(ACL_TYPE_GROUP)] == ACL_TYPE_GROUP:
+            raise Exception("rgw target can't handle groups yet.")
+        else:
+            raise Exception("can't understand user name %s" % user)
     def upload(self, local_copy, src_acl, obj):
         global lrgw
         if (opts.more_verbose):
@@ -973,6 +987,10 @@ xsi:type=\"CanonicalUser\"><ID>%s</ID> \
             ap = AclPolicy.create_default(self.owner)
         else:
             ap = src_acl.acl_policy
+        for user in ap.get_all_users():
+            if not self.user_exists(user):
+                raise Exception("You must provide an --xuser entry to translate \
+user %s into something valid for the rgw destination.")
         xml = ap.to_xml()
         bin_ = lrgw.acl_xml2bin(xml)
         self.ioctx.set_xattr(obj.name, "user.rgw.acl", bin_)
index 719d961f90d081607b8e684c2ead32d30813ba3a..bca8e6ccbb9cb38b2ea153c3fbcb9ceb0bedb9e6 100755 (executable)
@@ -682,10 +682,12 @@ assert_xattr("%s/user_defined_md2/spork" % tdir,
 # more rgw target tests
 if len(opts.pools) > 0:
     # synchronize from an s3 bucket to an bucket directly
-    obsync_check(opts.buckets[1], opts.pools[0], ["--delete-after"] + \
-            xuser(sconfig, "main", "alt"))
+    obsync_check(opts.buckets[1], opts.pools[0], ["--delete-after"])
     obsync_check(opts.pools[0], "%s/rgw4" % tdir, ["--delete-after", "-c"])
     obsync_check(opts.buckets[1], "%s/rgw5" % tdir, ["--delete-after", "-c"])
     compare_directories("%s/rgw4" % tdir, "%s/rgw5" % tdir, compare_xattr = True)
+    # restore proper ownership to the bucket
+    obsync_check(opts.buckets[1], opts.pools[0], ["--delete-after"] + \
+            xuser(sconfig, "alt", "main"))
 
 sys.exit(0)