]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: parse location constraint on bucket creation
authorYehuda Sadeh <yehuda@inktank.com>
Wed, 15 May 2013 05:05:31 +0000 (22:05 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Wed, 15 May 2013 05:05:31 +0000 (22:05 -0700)
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/rgw/rgw_op.h
src/rgw/rgw_rest_s3.cc

index 658a611915cb4cc9b10899a27c4fd00be9b11ef8..d791d4d1754112b42d4f2551bf8e1ea49dff2ba3 100644 (file)
@@ -235,6 +235,7 @@ class RGWCreateBucket : public RGWOp {
 protected:
   int ret;
   RGWAccessControlPolicy policy;
+  string location_constraint;
 
 public:
   RGWCreateBucket() : ret(0) {}
index 30f350bd9b8d5cb6f61cb54b290f49c5b6991fbc..6af11b036c27a66b57a20ded31ba64b42e1225cd 100644 (file)
@@ -304,6 +304,55 @@ static int create_s3_policy(struct req_state *s, RGWRados *store, RGWAccessContr
   return s3policy.create_canned(s->owner, s->bucket_owner, s->canned_acl);
 }
 
+class RGWLocationConstraint : public XMLObj
+{
+public:
+  RGWLocationConstraint() {}
+  ~RGWLocationConstraint() {}
+  bool xml_end(const char *el) {
+    if (!el)
+      return false;
+
+    location_constraint = get_data();
+
+    return true;
+  }
+
+  string location_constraint;
+};
+
+class RGWCreateBucketConfig : public XMLObj
+{
+public:
+  RGWCreateBucketConfig() {}
+  ~RGWCreateBucketConfig() {}
+};
+
+class RGWCreateBucketParser : public RGWXMLParser
+{
+  XMLObj *alloc_obj(const char *el) {
+    return new XMLObj;
+  }
+
+public:
+  RGWCreateBucketParser() {}
+  ~RGWCreateBucketParser() {}
+
+  bool get_location_constraint(string& region) {
+    XMLObj *config = find_first("CreateBucketConfiguration");
+    if (!config)
+      return false;
+
+    XMLObj *constraint = config->find_first("LocationConstraint");
+    if (!constraint)
+      return false;
+
+    region = constraint->get_data();
+
+    return true;
+  }
+};
+
 int RGWCreateBucket_ObjStore_S3::get_params()
 {
   RGWAccessControlPolicy_S3 s3policy(s->cct);
@@ -314,6 +363,38 @@ int RGWCreateBucket_ObjStore_S3::get_params()
 
   policy = s3policy;
 
+  int len;
+  char *data;
+#define CREATE_BUCKET_MAX_REQ_LEN (512 * 1024) /* this is way more than enough */
+  ret = rgw_rest_read_all_input(s, &data, &len, CREATE_BUCKET_MAX_REQ_LEN);
+  if (ret < 0)
+    return ret;
+
+  if (len) {
+    RGWCreateBucketParser parser;
+
+    if (!parser.init()) {
+      ldout(s->cct, 0) << "ERROR: failed to initialize parser" << dendl;
+      return -EIO;
+    }
+
+    bool success = parser.parse(data, len, 1);
+    ldout(s->cct, 20) << "create bucket input data=" << data << dendl;
+    free(data);
+
+    if (!success) {
+      ldout(s->cct, 0) << "failed to parse input: " << data << dendl;
+      return -EINVAL;
+    }
+
+    if (!parser.get_location_constraint(location_constraint)) {
+      ldout(s->cct, 0) << "provided input did not specify location constraint correctly" << dendl;
+      return -EINVAL;
+    }
+
+    ldout(s->cct, 10) << "create bucket location constraint: " << location_constraint << dendl;
+  }
+
   return 0;
 }