From: Chang Liu Date: Tue, 7 May 2019 07:52:17 +0000 (+0800) Subject: rgw: impl put_bucket_tags and delete_bucket_tags X-Git-Tag: v15.1.0~2575^2~7 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=6a93fe059213a26eb14efca5dba6dff2611cb806;p=ceph-ci.git rgw: impl put_bucket_tags and delete_bucket_tags Signed-off-by: Chang Liu --- diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index f188eb94a48..ef95af0540e 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -1167,6 +1167,36 @@ void RGWGetBucketTags::execute() send_response_data(tags_bl); } +int RGWPutBucketTags::verify_permission() { + // TODO(LC) + return 0; +} + +void RGWPutBucketTags::execute() { + + op_ret = get_params(); + if (op_ret < 0) + return; + + op_ret = store->set_bucket_tags(s->bucket, tags_bl); +} + +void RGWDeleteBucketTags::pre_exec() +{ + rgw_bucket_object_pre_exec(s); +} + +int RGWDeleteBucketTags::verify_permission() +{ + //TODO(LC) + return 0; +} + +void RGWDeleteBucketTags::execute() +{ + op_ret = store->delete_bucket_tags(s->bucket); +} + int RGWOp::do_aws4_auth_completion() { ldpp_dout(this, 5) << "NOTICE: call to do_aws4_auth_completion" << dendl; diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index e2aac3455fa..40a23cdc4ae 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -5144,6 +5144,28 @@ int RGWRados::set_bucket_tags(rgw_bucket& bucket, bufferlist tags_bl) return 0; } +int RGWRados::delete_bucket_tags(rgw_bucket& bucket) +{ + RGWBucketInfo info; + map attrs; + auto obj_ctx = svc.sysobj->init_obj_ctx(); + int r; + if (bucket.bucket_id.empty()) { + r = get_bucket_info(obj_ctx, bucket.tenant, bucket.name, info, NULL, &attrs); + } else { + r = get_bucket_instance_info(obj_ctx, bucket, info, nullptr, &attrs); + } + + attrs.erase(RGW_ATTR_TAGS); + + r = put_bucket_instance_info(info, false, real_time(), &attrs); + if (r < 0) { + ldout(cct, 0) << "NOTICE: delete_bucket_tags on bucket=" << bucket.name << " returned err=" << r << dendl; + return r; + } + return 0; +} + int RGWRados::Object::complete_atomic_modification() { if (!state->has_manifest || state->keep_tail) diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index aee8c3c8aba..d0fb69135dc 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -2004,6 +2004,7 @@ public: int bucket_suspended(rgw_bucket& bucket, bool *suspended); int set_bucket_tags(rgw_bucket& bucket, bufferlist tags_bl); + int delete_bucket_tags(rgw_bucket& bucket); /** Delete an object.*/ int delete_obj(RGWObjectCtx& obj_ctx, diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index 8d255690d02..5855ec26116 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -504,6 +504,64 @@ void RGWGetBucketTags_ObjStore_S3::send_response_data(bufferlist& bl) } } +int RGWPutBucketTags_ObjStore_S3::get_params() +{ + RGWXMLParser parser; + + if (!parser.init()){ + return -EINVAL; + } + + const auto max_size = s->cct->_conf->rgw_max_put_param_size; + int r = 0; + bufferlist data; + + std::tie(r, data) = rgw_rest_read_all_input(s, max_size, false); + + if (r < 0) + return r; + + if (!parser.parse(data.c_str(), data.length(), 1)) { + return -ERR_MALFORMED_XML; + } + + RGWObjTagging_S3 tagging; + try { + RGWXMLDecoder::decode_xml("Tagging", tagging, &parser); + } catch (RGWXMLDecoder::err& err) { + + ldout(s->cct, 5) << "Malformed tagging request: " << err << dendl; + return -ERR_MALFORMED_XML; + } + + RGWObjTags obj_tags; + r = tagging.rebuild(obj_tags); + if (r < 0) + return r; + + obj_tags.encode(tags_bl); + ldout(s->cct, 20) << "Read " << obj_tags.count() << "tags" << dendl; + + return 0; +} + +void RGWPutBucketTags_ObjStore_S3::send_response() +{ + if (op_ret) + set_req_state_err(s, op_ret); + dump_errno(s); + end_header(s, this, "application/xml"); + dump_start(s); +} + +void RGWDeleteBucketTags_ObjStore_S3::send_response() +{ + if (op_ret) + set_req_state_err(s, op_ret); + dump_errno(s); + end_header(s, this, "application/xml"); + dump_start(s); +} void RGWListBuckets_ObjStore_S3::send_response_begin(bool has_buckets) { @@ -3209,7 +3267,10 @@ RGWOp *RGWHandler_REST_Bucket_S3::op_put() } return new RGWSetBucketWebsite_ObjStore_S3; } - if (is_acl_op()) { + + if (is_tagging_op()) { + return new RGWPutBucketTags_ObjStore_S3; + } else if (is_acl_op()) { return new RGWPutACLs_ObjStore_S3; } else if (is_cors_op()) { return new RGWPutCORS_ObjStore_S3; @@ -3219,15 +3280,15 @@ RGWOp *RGWHandler_REST_Bucket_S3::op_put() return new RGWPutLC_ObjStore_S3; } else if(is_policy_op()) { return new RGWPutBucketPolicy; - } else if (is_tagging_op()) { - return nullptr; } return new RGWCreateBucket_ObjStore_S3; } RGWOp *RGWHandler_REST_Bucket_S3::op_delete() { - if (is_cors_op()) { + if (is_tagging_op()) { + return new RGWDeleteBucketTags_ObjStore_S3; + } else if (is_cors_op()) { return new RGWDeleteCORS_ObjStore_S3; } else if(is_lc_op()) { return new RGWDeleteLC_ObjStore_S3; @@ -4091,6 +4152,7 @@ AWSGeneralAbstractor::get_auth_data_v4(const req_state* const s, case RGW_OP_SET_BUCKET_WEBSITE: case RGW_OP_PUT_BUCKET_POLICY: case RGW_OP_PUT_OBJ_TAGGING: + case RGW_OP_PUT_BUCKET_TAGGING: case RGW_OP_PUT_LC: case RGW_OP_SET_REQUEST_PAYMENT: case RGW_OP_PUBSUB_NOTIF_CREATE: