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;
return 0;
}
+int RGWRados::delete_bucket_tags(rgw_bucket& bucket)
+{
+ RGWBucketInfo info;
+ map<string, bufferlist> 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)
}
}
+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)
{
}
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;
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;
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: