]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgw: implement s3 delete bucket replication api
authorYehuda Sadeh <yehuda@redhat.com>
Thu, 28 Nov 2019 02:11:47 +0000 (18:11 -0800)
committerYehuda Sadeh <yehuda@redhat.com>
Tue, 28 Jan 2020 18:20:39 +0000 (10:20 -0800)
Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
src/rgw/rgw_op.cc
src/rgw/rgw_op.h
src/rgw/rgw_rest.h
src/rgw/rgw_rest_s3.cc
src/rgw/rgw_rest_s3.h

index cbaf67d60adc053dd141a80d9e9cc464533b63ec..207cc3e4b529828b06e56fc347dc8539731c8f26 100644 (file)
@@ -1263,8 +1263,6 @@ void RGWPutBucketReplication::execute() {
     op_ret = forward_request_to_master(s, nullptr, store, in_data, nullptr);
     if (op_ret < 0) {
       ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
-    }
-    if (op_ret < 0) {
       return;
     }
   }
@@ -1278,8 +1276,57 @@ void RGWPutBucketReplication::execute() {
 
     s->bucket_info.set_sync_policy(std::move(sync_policy));
 
-    return store->getRados()->put_bucket_instance_info(s->bucket_info, false, real_time(),
-                                                       &s->bucket_attrs);
+    int ret = store->getRados()->put_bucket_instance_info(s->bucket_info, false, real_time(),
+                                                          &s->bucket_attrs);
+    if (ret < 0) {
+      ldpp_dout(this, 0) << "ERROR: put_bucket_instance_info (bucket=" << s->bucket_info.bucket.get_key() << ") returned ret=" << ret << dendl;
+      return ret;
+    }
+
+    return 0;
+  });
+}
+
+void RGWDeleteBucketReplication::pre_exec()
+{
+  rgw_bucket_object_pre_exec(s);
+}
+
+int RGWDeleteBucketReplication::verify_permission()
+{
+  return verify_bucket_owner_or_policy(s, rgw::IAM::s3PutBucketTagging);
+}
+
+void RGWDeleteBucketReplication::execute()
+{
+  if (!store->svc()->zone->is_meta_master()) {
+    bufferlist in_data;
+    op_ret = forward_request_to_master(s, nullptr, store, in_data, nullptr);
+    if (op_ret < 0) {
+      ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
+      return;
+    }
+  }
+
+  op_ret = retry_raced_bucket_write(store->getRados(), s, [this] {
+    if (!s->bucket_info.sync_policy) {
+      return 0;
+    }
+
+    rgw_sync_policy_info sync_policy = *s->bucket_info.sync_policy;
+
+    update_sync_policy(&sync_policy);
+
+    s->bucket_info.set_sync_policy(std::move(sync_policy));
+
+    int ret = store->getRados()->put_bucket_instance_info(s->bucket_info, false, real_time(),
+                                                          &s->bucket_attrs);
+    if (ret < 0) {
+      ldpp_dout(this, 0) << "ERROR: put_bucket_instance_info (bucket=" << s->bucket_info.bucket.get_key() << ") returned ret=" << ret << dendl;
+      return ret;
+    }
+
+    return 0;
   });
 }
 
index e5ed28ea0ab2e3e5163ad604fcc00a8583ab2eac..50c9b772b24ddb7e77bfb9ee0426fbca9573a67d 100644 (file)
@@ -483,6 +483,19 @@ public:
   RGWOpType get_type() override { return RGW_OP_PUT_BUCKET_REPLICATION; }
 };
 
+class RGWDeleteBucketReplication : public RGWOp {
+protected:
+  virtual void update_sync_policy(rgw_sync_policy_info *policy) = 0;
+public:
+  void pre_exec() override;
+  int verify_permission() override;
+  void execute() override;
+
+  const char* name() const override { return "delete_bucket_replication"; }
+  virtual uint32_t op_mask() override { return RGW_OP_TYPE_DELETE; }
+  RGWOpType get_type() override { return RGW_OP_DELETE_BUCKET_REPLICATION;}
+};
+
 class RGWBulkDelete : public RGWOp {
 public:
   struct acct_path_t {
index c0aa96a86b86c2ef5e0f93305dae5973bd3bafe1..1b315c7c76c4b6e9b0803c2b7180291c061b8021 100644 (file)
@@ -200,6 +200,12 @@ public:
   virtual ~RGWPutBucketReplication_ObjStore() = default; 
 };
 
+class RGWDeleteBucketReplication_ObjStore: public RGWDeleteBucketReplication {
+public:
+  RGWDeleteBucketReplication_ObjStore() = default;
+  virtual ~RGWDeleteBucketReplication_ObjStore() = default; 
+};
+
 class RGWListBuckets_ObjStore : public RGWListBuckets {
 public:
   RGWListBuckets_ObjStore() {}
index 952409dc09c00bd81abc06b17fe451b7eaf340e1..40f2aff2b54ef75d4b11a1bd112694de5eb4f45c 100644 (file)
@@ -593,6 +593,15 @@ void RGWPutBucketTags_ObjStore_S3::send_response()
   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);
+}
+
 namespace {
 
 bool is_valid_status(const string& s) {
@@ -960,7 +969,13 @@ void RGWPutBucketReplication_ObjStore_S3::send_response()
   dump_start(s);
 }
 
-void RGWDeleteBucketTags_ObjStore_S3::send_response() 
+void RGWDeleteBucketReplication_ObjStore_S3::update_sync_policy(rgw_sync_policy_info *policy)
+{
+  policy->groups.erase(enabled_group_id);
+  policy->groups.erase(disabled_group_id);
+}
+
+void RGWDeleteBucketReplication_ObjStore_S3::send_response() 
 {
   if (op_ret)
     set_req_state_err(s, op_ret);
@@ -4135,7 +4150,7 @@ RGWOp *RGWHandler_REST_Bucket_S3::op_delete()
   } else if (is_notification_op()) {
     return RGWHandler_REST_PSNotifs_S3::create_delete_op();
   } else if (is_replication_op()) {
-    return nullptr; // new RGWDeleteBucketReplication_ObjStore_S3;
+    return new RGWDeleteBucketReplication_ObjStore_S3;
   }
 
   if (s->info.args.sub_resource_exists("website")) {
index 104f08faafa792845312ab0ed6bec1804ce3f883..a301f24e1fd6e3204d013803ff9e6aa5b23927d1 100644 (file)
@@ -108,6 +108,14 @@ public:
   void send_response() override;
 };
 
+class RGWDeleteBucketReplication_ObjStore_S3 : public RGWDeleteBucketReplication_ObjStore
+{
+protected:
+  void update_sync_policy(rgw_sync_policy_info *policy) override;
+public:
+  void send_response() override;
+};
+
 class RGWListBuckets_ObjStore_S3 : public RGWListBuckets_ObjStore {
 public:
   RGWListBuckets_ObjStore_S3() {}