From 7cd5e9d9436ff570293675c4f4eb3541e7f905ad Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Mon, 28 Jul 2014 15:32:23 -0700 Subject: [PATCH] rgw: restful op to set bucket versioning Signed-off-by: Yehuda Sadeh --- src/rgw/rgw_op.cc | 32 ++++++++++++++++++ src/rgw/rgw_op.h | 18 ++++++++++ src/rgw/rgw_rest_s3.cc | 75 ++++++++++++++++++++++++++++++++++++++++++ src/rgw/rgw_rest_s3.h | 9 +++++ 4 files changed, 134 insertions(+) diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index cfb23bfba0875..5dd6632a021f4 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -1055,6 +1055,38 @@ void RGWGetBucketVersioning::execute() send_response(); } +int RGWSetBucketVersioning::verify_permission() +{ + if (s->user.user_id.compare(s->bucket_owner.get_id()) != 0) + return -EACCES; + + return 0; +} + +void RGWSetBucketVersioning::pre_exec() +{ + rgw_bucket_object_pre_exec(s); +} + +void RGWSetBucketVersioning::execute() +{ + ret = get_params(); + + if (ret < 0) + goto done; + + s->bucket_info.versioning_enabled = true; + + ret = store->put_bucket_instance_info(s->bucket_info, false, 0, &s->bucket_attrs); + if (ret < 0) { + ldout(s->cct, 0) << "NOTICE: put_bucket_info on bucket=" << s->bucket.name << " returned err=" << ret << dendl; + goto done; + } + +done: + send_response(); +} + int RGWStatBucket::verify_permission() { if (!verify_bucket_permission(s, RGW_PERM_READ)) diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index e8b1edb699fd4..36cf15843412d 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -270,6 +270,24 @@ public: virtual uint32_t op_mask() { return RGW_OP_TYPE_READ; } }; +class RGWSetBucketVersioning : public RGWOp { +protected: + bool enable_versioning; + int ret; +public: + RGWSetBucketVersioning() : enable_versioning(false), ret(0) {} + + int verify_permission(); + void pre_exec(); + void execute(); + + virtual int get_params() { return 0; } + + virtual void send_response() = 0; + virtual const string name() { return "set_bucket_versioning"; } + virtual uint32_t op_mask() { return RGW_OP_TYPE_WRITE; } +}; + class RGWStatBucket : public RGWOp { protected: int ret; diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index 492d360111bd8..1dee45ad63ba8 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -332,6 +332,81 @@ void RGWGetBucketVersioning_ObjStore_S3::send_response() rgw_flush_formatter_and_reset(s, s->formatter); } +class RGWSetBucketVersioningParser : public RGWXMLParser +{ + XMLObj *alloc_obj(const char *el) { + return new XMLObj; + } + +public: + RGWSetBucketVersioningParser() {} + ~RGWSetBucketVersioningParser() {} + + int get_versioning_status(bool *status) { + XMLObj *config = find_first("VersioningConfiguration"); + if (!config) + return -EINVAL; + + *status = false; + + XMLObj *field = config->find_first("Status"); + if (!field) + return 0; + + string& s = field->get_data(); + + if (stringcasecmp(s, "Enabled") == 0) { + *status = true; + } else if (stringcasecmp(s, "Suspended") != 0) { + return -EINVAL; + } + + return 0; + } +}; + +int RGWSetBucketVersioning_ObjStore_S3::get_params() +{ +#define GET_BUCKET_VERSIONING_BUF_MAX (128 * 1024) + + char *data; + int len = 0; + int r = rgw_rest_read_all_input(s, &data, &len, GET_BUCKET_VERSIONING_BUF_MAX); + if (r < 0) { + return r; + } + + RGWSetBucketVersioningParser parser; + + if (!parser.init()) { + ldout(s->cct, 0) << "ERROR: failed to initialize parser" << dendl; + r = -EIO; + goto done; + } + + if (!parser.parse(data, len, 1)) { + ldout(s->cct, 10) << "failed to parse data: " << data << dendl; + r = -EINVAL; + goto done; + } + + r = parser.get_versioning_status(&enable_versioning); + +done: + free(data); + + return r; +} + +void RGWSetBucketVersioning_ObjStore_S3::send_response() +{ + if (ret) + set_req_state_err(s, ret); + dump_errno(s); + end_header(s); +} + + static void dump_bucket_metadata(struct req_state *s, RGWBucketEnt& bucket) { char buf[32]; diff --git a/src/rgw/rgw_rest_s3.h b/src/rgw/rgw_rest_s3.h index f3168c40c2fbc..79915528a9e95 100644 --- a/src/rgw/rgw_rest_s3.h +++ b/src/rgw/rgw_rest_s3.h @@ -73,6 +73,15 @@ public: void send_response(); }; +class RGWSetBucketVersioning_ObjStore_S3 : public RGWSetBucketVersioning { +public: + RGWSetBucketVersioning_ObjStore_S3() {} + ~RGWSetBucketVersioning_ObjStore_S3() {} + + int get_params(); + void send_response(); +}; + class RGWStatBucket_ObjStore_S3 : public RGWStatBucket_ObjStore { public: RGWStatBucket_ObjStore_S3() {} -- 2.39.5