From: Radoslaw Zarzynski Date: Wed, 4 Mar 2015 14:14:59 +0000 (+0100) Subject: rgw: add support for putting metadata into Swift account. X-Git-Tag: v9.0.3~179^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=17536e69cd9b3755d0cc4ac0f963977639a08c2b;p=ceph.git rgw: add support for putting metadata into Swift account. Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/rgw/rgw_common.cc b/src/rgw/rgw_common.cc index f3988cffd34..83fe4e4d40f 100644 --- a/src/rgw/rgw_common.cc +++ b/src/rgw/rgw_common.cc @@ -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} }; diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 24f85ac4da5..fa8f219904f 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -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 attrs, orig_attrs, rmattrs; map::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); } } diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index fb59e4f854d..b48fcb74fe4 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -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& m = s->info.env->get_map(); map::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)