From: Matt Benjamin Date: Wed, 7 Oct 2015 21:19:29 +0000 (-0400) Subject: librgw: block in create bucket, rgw_mkdir X-Git-Tag: v10.1.0~382^2~207 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=460794ef1ac0b4cfd38df05e4305049a3588f07e;p=ceph.git librgw: block in create bucket, rgw_mkdir Unit test runs, doesn't...seem to create a bucket. Signed-off-by: Matt Benjamin --- diff --git a/src/rgw/rgw_file.cc b/src/rgw/rgw_file.cc index 41878125d91c..e1502baccc0b 100644 --- a/src/rgw/rgw_file.cc +++ b/src/rgw/rgw_file.cc @@ -152,12 +152,18 @@ int rgw_mkdir(struct rgw_fs *rgw_fs, return rc; } + RGWLibFS *fs = static_cast(rgw_fs->fs_private); + CephContext* cct = static_cast(rgw_fs->rgw); + /* cannot create a bucket in a bucket */ if (! is_root(uri)) { return EINVAL; } - /* TODO: implement */ + RGWCreateBucketRequest req(cct, fs->get_user(), uri); + (void) librgw.get_fe()->execute_req(&req); + + /* TODO: result */ return 0; } @@ -304,6 +310,8 @@ int rgw_readdir(struct rgw_fs *rgw_fs, } + /* TODO: result */ + *eof = true; // XXX move into RGGWListBucket(s)Request return 0; diff --git a/src/rgw/rgw_file.h b/src/rgw/rgw_file.h index 150536b79608..a699a714f462 100644 --- a/src/rgw/rgw_file.h +++ b/src/rgw/rgw_file.h @@ -172,4 +172,104 @@ public: }; /* RGWListBucketRequest */ +/* + create bucket +*/ + +class RGWCreateBucketRequest : public RGWLibRequest, + public RGWCreateBucket_OS_Lib /* RGWOp */ +{ +public: + std::string& uri; + + RGWCreateBucketRequest(CephContext* _cct, RGWUserInfo *_user, + std::string& _uri) + : RGWLibRequest(_cct, _user), uri(_uri) { + magic = 73; + op = this; + } + + virtual bool only_bucket() { return false; } + + virtual int op_init() { + // assign store, s, and dialect_handler + RGWObjectCtx* rados_ctx + = static_cast(get_state()->obj_ctx); + // framework promises to call op_init after parent init + assert(rados_ctx); + RGWOp::init(rados_ctx->store, get_state(), this); + op = this; // assign self as op: REQUIRED + return 0; + } + + virtual int header_init() { + + struct req_state* s = get_state(); + s->info.method = "PUT"; + s->op = OP_PUT; + + /* XXX derp derp derp */ + s->relative_uri = uri; + s->info.request_uri = uri; // XXX + s->info.effective_uri = uri; + s->info.request_params = ""; + s->info.domain = ""; /* XXX ? */ + + // woo + s->user = user; + + return 0; + } +}; /* RGWCreateBucketRequest */ + +/* + delete bucket +*/ + +class RGWDeleteBucketRequest : public RGWLibRequest, + public RGWDeleteBucket_OS_Lib /* RGWOp */ +{ +public: + std::string& uri; + + RGWDeleteBucketRequest(CephContext* _cct, RGWUserInfo *_user, + std::string& _uri) + : RGWLibRequest(_cct, _user), uri(_uri) { + magic = 74; + op = this; + } + + virtual bool only_bucket() { return true; } + + virtual int op_init() { + // assign store, s, and dialect_handler + RGWObjectCtx* rados_ctx + = static_cast(get_state()->obj_ctx); + // framework promises to call op_init after parent init + assert(rados_ctx); + RGWOp::init(rados_ctx->store, get_state(), this); + op = this; // assign self as op: REQUIRED + return 0; + } + + virtual int header_init() { + + struct req_state* s = get_state(); + s->info.method = "DELETE"; + s->op = OP_DELETE; + + /* XXX derp derp derp */ + s->relative_uri = uri; + s->info.request_uri = uri; // XXX + s->info.effective_uri = uri; + s->info.request_params = ""; + s->info.domain = ""; /* XXX ? */ + + // woo + s->user = user; + + return 0; + } +}; /* RGWDeleteBucketRequest */ + #endif /* RGW_FILE_H */ diff --git a/src/rgw/rgw_os_lib.cc b/src/rgw/rgw_os_lib.cc index 963243386a37..8ae261272418 100644 --- a/src/rgw/rgw_os_lib.cc +++ b/src/rgw/rgw_os_lib.cc @@ -121,3 +121,17 @@ void RGWListBucket_OS_Lib::send_response() req->operator()(iter.key.name, iter.key.name); // XXX attributes } } + +int RGWCreateBucket_OS_Lib::get_params() +{ + RGWAccessControlPolicy_S3 s3policy(s->cct); + policy = s3policy; + + /* we don't have (any) headers, so just create canned ACLs */ + return s3policy.create_canned(s->owner, s->bucket_owner, s->canned_acl); +} + +void RGWCreateBucket_OS_Lib::send_response() +{ + /* TODO: something (maybe) */ +} diff --git a/src/rgw/rgw_os_lib.h b/src/rgw/rgw_os_lib.h index 959aef058d60..d56c97aa7ed8 100644 --- a/src/rgw/rgw_os_lib.h +++ b/src/rgw/rgw_os_lib.h @@ -49,6 +49,20 @@ public: virtual void send_response(); -}; /* RGWListBucket_OS_Lib */ +}; /* RGWStatBucket_OS_Lib */ + +class RGWCreateBucket_OS_Lib : public RGWCreateBucket { +public: + RGWCreateBucket_OS_Lib() {} + ~RGWCreateBucket_OS_Lib() {} + virtual int get_params(); + virtual void send_response(); +}; /* RGWCreateBucket_OS_Lib */ + +class RGWDeleteBucket_OS_Lib : public RGWDeleteBucket { +public: + RGWDeleteBucket_OS_Lib() {} + ~RGWDeleteBucket_OS_Lib() {} +}; /* RGWCreateBucket_OS_Lib */ #endif /* RGW_OS_LIB_H */ diff --git a/src/test/librgw_file.cc b/src/test/librgw_file.cc index 9d3d2aed1345..fe09d0b58ff1 100644 --- a/src/test/librgw_file.cc +++ b/src/test/librgw_file.cc @@ -55,6 +55,12 @@ TEST(LibRGW, MOUNT) { ASSERT_NE(fs, nullptr); } +TEST(LibRGW, CREATE_BUCKET) { + struct stat st; + struct rgw_file_handle fh; + int ret = rgw_mkdir(fs, &fs->root_fh, "sorry_dave", 755, &st, &fh); +} + extern "C" { static bool r1_cb(const char* name, void *arg, uint64_t offset) { // don't need arg--it would point to fids1