]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: add support for putting metadata into Swift account.
authorRadoslaw Zarzynski <rzarzynski@mirantis.com>
Wed, 4 Mar 2015 14:14:59 +0000 (15:14 +0100)
committerRadoslaw Zarzynski <rzarzynski@mirantis.com>
Fri, 3 Apr 2015 15:40:21 +0000 (17:40 +0200)
Signed-off-by: Radoslaw Zarzynski <rzarzynski@mirantis.com>
src/rgw/rgw_common.cc
src/rgw/rgw_op.cc
src/rgw/rgw_rest_swift.cc

index f3988cffd34868212586575bca55ed4dd95da984..83fe4e4d40f919ed63b984986178241d4f744f85 100644 (file)
@@ -182,6 +182,7 @@ struct str_len meta_prefixes[] = { STR_LEN_ENTRY("HTTP_X_AMZ"),
                                    STR_LEN_ENTRY("HTTP_X_RGW"),
                                    STR_LEN_ENTRY("HTTP_X_OBJECT"),
                                    STR_LEN_ENTRY("HTTP_X_CONTAINER"),
+                                   STR_LEN_ENTRY("HTTP_X_ACCOUNT"),
                                    {NULL, 0} };
 
 
index 24f85ac4da5f0f1a0f0f4f6178bb561b01f245b0..fa8f219904f3c5d39fbf14fe2c30098fe9cb0012 100644 (file)
@@ -2028,10 +2028,13 @@ done:
 
 int RGWPutMetadata::verify_permission()
 {
-  if (!s->object.empty()) {
+  const bool is_object_op = (!s->object.empty());
+  const bool is_bucket_op = (!s->bucket_name_str.empty() && !is_object_op);
+
+  if (is_object_op) {
     if (!verify_object_permission(s, RGW_PERM_WRITE))
       return -EACCES;
-  } else {
+  } else if (is_bucket_op) {
     if (!verify_bucket_permission(s, RGW_PERM_WRITE))
       return -EACCES;
   }
@@ -2041,7 +2044,11 @@ int RGWPutMetadata::verify_permission()
 
 void RGWPutMetadata::pre_exec()
 {
-  rgw_bucket_object_pre_exec(s);
+  const bool is_account_op = s->bucket_name_str.empty();
+
+  if (!is_account_op) {
+    rgw_bucket_object_pre_exec(s);
+  }
 }
 
 void RGWPutMetadata::execute()
@@ -2051,17 +2058,29 @@ void RGWPutMetadata::execute()
   map<string, bufferlist> attrs, orig_attrs, rmattrs;
   map<string, bufferlist>::iterator iter;
   bufferlist bl, cors_bl;
+  rgw_obj obj;
+  RGWObjVersionTracker acct_ot;
 
-  rgw_obj obj(s->bucket, s->object);
+  const bool is_object_op = (!s->object.empty());
+  const bool is_bucket_op = (!s->bucket_name_str.empty() && !is_object_op);
+
+  if (is_object_op || is_bucket_op) {
+    obj = rgw_obj(s->bucket, s->object);
+  } else {
+    string buckets_obj_id;
+    rgw_get_buckets_obj(s->user.user_id, buckets_obj_id);
+
+    obj = rgw_obj(store->zone.user_uid_pool, buckets_obj_id);
+  }
 
   store->set_atomic(s->obj_ctx, obj);
 
   ret = get_params();
-  if (ret < 0)
+  if (ret < 0) {
     return;
+  }
 
   RGWObjVersionTracker *ptracker = NULL;
-  bool is_object_op = (!s->object.empty());
 
   rgw_get_request_metadata(s->cct, s->info, attrs, is_object_op);
 
@@ -2070,7 +2089,7 @@ void RGWPutMetadata::execute()
     ret = get_obj_attrs(store, s, obj, orig_attrs);
     if (ret < 0)
       return;
-  } else {
+  } else if (is_bucket_op) {
     ptracker = &s->bucket_info.objv_tracker;
     orig_attrs = s->bucket_attrs;
 
@@ -2079,6 +2098,9 @@ void RGWPutMetadata::execute()
       ret = -EEXIST;
       return;
     }
+  } else {
+    ptracker = &acct_ot;
+    rgw_get_user_attrs_by_uid(store, s->user.user_id, orig_attrs, ptracker);
   }
 
   for (iter = orig_attrs.begin(); iter != orig_attrs.end(); ++iter) {
@@ -2122,8 +2144,10 @@ void RGWPutMetadata::execute()
   }
   if (is_object_op) {
     ret = store->set_attrs(s->obj_ctx, obj, attrs, &rmattrs, ptracker);
-  } else {
+  } else if (is_bucket_op) {
     ret = rgw_bucket_set_attrs(store, s->bucket_info, attrs, &rmattrs, ptracker);
+  } else {
+    ret = rgw_store_user_attrs(store, s->user.user_id, attrs, &rmattrs, ptracker);
   }
 }
 
index fb59e4f854d8c02523302084d0c14531a9276397..b48fcb74fe4cbb390ca5fb652882af649c09a72d 100644 (file)
@@ -465,11 +465,17 @@ int RGWPutMetadata_ObjStore_SWIFT::get_params()
   if (s->has_bad_meta)
     return -EINVAL;
 
-  if (s->object.empty()) {
+  const bool is_bucket_op  = (!s->bucket_name_str.empty() && s->object.empty());
+  const bool is_account_op = (s->bucket_name_str.empty());
+
+  if (is_bucket_op) {
     int r = get_swift_container_settings(s, store, &policy, &has_policy, &cors_config, &has_cors);
     if (r < 0) {
       return r;
     }
+  }
+
+  if (is_bucket_op || is_account_op) {
     map<string, string, ltstr_nocase>& m = s->info.env->get_map();
     map<string, string, ltstr_nocase>::iterator iter;
     for (iter = m.begin(); iter != m.end(); ++iter) {
@@ -489,7 +495,10 @@ int RGWPutMetadata_ObjStore_SWIFT::get_params()
       }
     }
   }
-  placement_rule = s->info.env->get("HTTP_X_STORAGE_POLICY", "");
+
+  if (!is_account_op) {
+    placement_rule = s->info.env->get("HTTP_X_STORAGE_POLICY", "");
+  }
 
   return 0;
 }
@@ -724,7 +733,7 @@ RGWOp *RGWHandler_ObjStore_Service_SWIFT::op_post()
   if (temp_url) {
     return new RGWSetTempUrl_ObjStore_SWIFT;
   }
-  return NULL;
+  return new RGWPutMetadata_ObjStore_SWIFT;
 }
 
 RGWOp *RGWHandler_ObjStore_Bucket_SWIFT::get_obj_op(bool get_data)