1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab ft=cpp
8 #include <boost/algorithm/string.hpp>
10 #include "common/errno.h"
11 #include "common/Formatter.h"
12 #include "common/ceph_json.h"
15 #include "rgw_metadata.h"
17 #include "include/types.h"
19 #include "rgw_common.h"
20 #include "rgw_tools.h"
22 #include "services/svc_zone.h"
23 #include "services/svc_meta.h"
24 #include "services/svc_meta_be.h"
25 #include "services/svc_meta_be_otp.h"
26 #include "services/svc_otp.h"
28 #define dout_subsys ceph_subsys_rgw
33 class RGWOTPMetadataHandler
;
35 class RGWOTPMetadataObject
: public RGWMetadataObject
{
36 friend class RGWOTPMetadataHandler
;
38 otp_devices_list_t devices
;
40 RGWOTPMetadataObject() {}
41 RGWOTPMetadataObject(otp_devices_list_t
&& _devices
, const obj_version
& v
, const real_time m
) {
42 devices
= std::move(_devices
);
47 void dump(Formatter
*f
) const override
{
48 encode_json("devices", devices
, f
);
51 otp_devices_list_t
& get_devs() {
57 class RGWOTPMetadataHandler
: public RGWOTPMetadataHandlerBase
{
58 friend class RGWOTPCtl
;
62 RGWSI_MetaBackend
*meta_be
;
66 int init(RGWSI_Zone
*zone
,
67 RGWSI_MetaBackend
*_meta_be
,
69 base_init(zone
->ctx(), _otp
->get_be_handler().get());
71 svc
.meta_be
= _meta_be
;
76 int call(std::function
<int(RGWSI_OTP_BE_Ctx
& ctx
)> f
) {
77 return be_handler
->call([&](RGWSI_MetaBackend_Handler::Op
*op
) {
78 RGWSI_OTP_BE_Ctx
ctx(op
->ctx());
83 RGWMetadataObject
*get_meta_obj(JSONObj
*jo
, const obj_version
& objv
, const ceph::real_time
& mtime
) override
{
84 otp_devices_list_t devices
;
86 JSONDecoder::decode_json("devices", devices
, jo
);
87 } catch (JSONDecoder::err
& e
) {
91 return new RGWOTPMetadataObject(std::move(devices
), objv
, mtime
);
94 int do_get(RGWSI_MetaBackend_Handler::Op
*op
, string
& entry
, RGWMetadataObject
**obj
, optional_yield y
) override
{
95 RGWObjVersionTracker objv_tracker
;
97 std::unique_ptr
<RGWOTPMetadataObject
> mdo(new RGWOTPMetadataObject
);
100 RGWSI_OTP_BE_Ctx
be_ctx(op
->ctx());
102 int ret
= svc
.otp
->read_all(be_ctx
,
112 mdo
->objv
= objv_tracker
.read_version
;
114 *obj
= mdo
.release();
119 int do_put(RGWSI_MetaBackend_Handler::Op
*op
, string
& entry
,
120 RGWMetadataObject
*_obj
, RGWObjVersionTracker
& objv_tracker
,
122 RGWMDLogSyncType type
, bool from_remote_zone
) override
{
123 RGWOTPMetadataObject
*obj
= static_cast<RGWOTPMetadataObject
*>(_obj
);
125 RGWSI_OTP_BE_Ctx
be_ctx(op
->ctx());
127 int ret
= svc
.otp
->store_all(be_ctx
,
137 return STATUS_APPLIED
;
140 int do_remove(RGWSI_MetaBackend_Handler::Op
*op
, string
& entry
, RGWObjVersionTracker
& objv_tracker
,
141 optional_yield y
) override
{
142 RGWSI_MBOTP_RemoveParams params
;
144 RGWSI_OTP_BE_Ctx
be_ctx(op
->ctx());
146 return svc
.otp
->remove_all(be_ctx
,
153 RGWOTPMetadataHandler() {}
155 string
get_type() override
{ return "otp"; }
159 RGWOTPCtl::RGWOTPCtl(RGWSI_Zone
*zone_svc
,
167 void RGWOTPCtl::init(RGWOTPMetadataHandler
*_meta_handler
)
169 meta_handler
= _meta_handler
;
170 be_handler
= meta_handler
->get_be_handler();
173 int RGWOTPCtl::read_all(const rgw_user
& uid
,
176 const GetParams
& params
)
179 return meta_handler
->call([&](RGWSI_OTP_BE_Ctx
& ctx
) {
180 return svc
.otp
->read_all(ctx
, uid
, &info
->devices
, params
.mtime
, params
.objv_tracker
, y
);
184 int RGWOTPCtl::store_all(const RGWOTPInfo
& info
,
186 const PutParams
& params
)
188 return meta_handler
->call([&](RGWSI_OTP_BE_Ctx
& ctx
) {
189 return svc
.otp
->store_all(ctx
, info
.uid
, info
.devices
, params
.mtime
, params
.objv_tracker
, y
);
193 int RGWOTPCtl::remove_all(const rgw_user
& uid
,
195 const RemoveParams
& params
)
197 return meta_handler
->call([&](RGWSI_OTP_BE_Ctx
& ctx
) {
198 return svc
.otp
->remove_all(ctx
, uid
, params
.objv_tracker
, y
);
203 RGWMetadataHandler
*RGWOTPMetaHandlerAllocator::alloc()
205 return new RGWOTPMetadataHandler();