]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgw: impl put_bucket_tags and delete_bucket_tags
authorChang Liu <liuchang0812@gmail.com>
Tue, 7 May 2019 07:52:17 +0000 (15:52 +0800)
committerChang Liu <liuchang0812@gmail.com>
Tue, 4 Jun 2019 02:36:31 +0000 (10:36 +0800)
Signed-off-by: Chang Liu <liuchang0812@gmail.com>
src/rgw/rgw_op.cc
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h
src/rgw/rgw_rest_s3.cc

index f188eb94a481712dd817c5ac54f42dd6b4ac1da8..ef95af0540e67c35d7ad5b1e859d728d4224ddc7 100644 (file)
@@ -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;
index e2aac3455fa0aa46649040e562e3dc190504cdac..40a23cdc4ae761626464cb6b19af533c6e70ee8f 100644 (file)
@@ -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<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)
index aee8c3c8aba411200b04978a1c31f60a9f84e592..d0fb69135dc944a18f1cb59c2bcd873ee5aa51cf 100644 (file)
@@ -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,
index 8d255690d021c10671aa64fc6e3535ad8ab99abb..5855ec26116205a00361628881c468bd232b6083 100644 (file)
@@ -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: