From 56189e2754df496f4ac2a6e1ae61745fc2ec7604 Mon Sep 17 00:00:00 2001 From: Chang Liu Date: Mon, 6 May 2019 14:27:16 +0800 Subject: [PATCH] rgw: get bucket tagging Signed-off-by: Chang Liu --- src/rgw/rgw_op.cc | 24 ++++++++++++++++++++++++ src/rgw/rgw_rest_s3.cc | 34 +++++++++++++++++++++++++++++++++- src/rgw/rgw_rest_s3.h | 5 +++++ 3 files changed, 62 insertions(+), 1 deletion(-) diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 806895cb48b..f188eb94a48 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -1143,6 +1143,30 @@ void RGWDeleteObjTags::execute() op_ret = store->set_attrs(s->obj_ctx, s->bucket_info, obj, attrs, &rmattr); } +int RGWGetBucketTags::verify_permission() +{ + + //TODO(LC) + return 0; +} + +void RGWGetBucketTags::pre_exec() +{ + rgw_bucket_object_pre_exec(s); +} + +void RGWGetBucketTags::execute() +{ + auto iter = s->bucket_attrs.find(RGW_ATTR_TAGS); + if (iter != s->bucket_attrs.end()) { + has_tags = true; + tags_bl.append(iter->second); + } else { + op_ret = -ERR_NO_SUCH_TAG_SET; + } + send_response_data(tags_bl); +} + int RGWOp::do_aws4_auth_completion() { ldpp_dout(this, 5) << "NOTICE: call to do_aws4_auth_completion" << dendl; diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index 413e234e76a..8d255690d02 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -475,6 +475,36 @@ void RGWDeleteObjTags_ObjStore_S3::send_response() end_header(s, this); } +void RGWGetBucketTags_ObjStore_S3::send_response_data(bufferlist& bl) +{ + if (op_ret) + set_req_state_err(s, op_ret); + dump_errno(s); + end_header(s, this, "application/xml"); + dump_start(s); + + if (!op_ret) { + s->formatter->open_object_section_in_ns("Tagging", XMLNS_AWS_S3); + s->formatter->open_object_section("TagSet"); + if (has_tags){ + RGWObjTagSet_S3 tagset; + auto iter = bl.cbegin(); + try { + tagset.decode(iter); + } catch (buffer::error& err) { + ldout(s->cct,0) << "ERROR: caught buffer::error, couldn't decode TagSet" << dendl; + op_ret= -EIO; + return; + } + tagset.dump_xml(s->formatter); + } + s->formatter->close_section(); + s->formatter->close_section(); + rgw_flush_formatter_and_reset(s, s->formatter); + } +} + + void RGWListBuckets_ObjStore_S3::send_response_begin(bool has_buckets) { if (op_ret) @@ -3151,7 +3181,9 @@ RGWOp *RGWHandler_REST_Bucket_S3::op_get() return new RGWGetLC_ObjStore_S3; } else if(is_policy_op()) { return new RGWGetBucketPolicy; - } + } else if (is_tagging_op()) { + return new RGWGetBucketTags_ObjStore_S3; + } return get_obj_op(true); } diff --git a/src/rgw/rgw_rest_s3.h b/src/rgw/rgw_rest_s3.h index 3fd69598e46..c5ad8921721 100644 --- a/src/rgw/rgw_rest_s3.h +++ b/src/rgw/rgw_rest_s3.h @@ -576,6 +576,11 @@ protected: bool is_obj_update_op() override { return is_acl_op() || is_cors_op(); } + + bool is_tagging_op() { + return s->info.args.exists("tagging"); + } + bool is_request_payment_op() { return s->info.args.exists("requestPayment"); } -- 2.39.5