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
, const DoutPrefixProvider
*dpp
) 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
,
113 mdo
->objv
= objv_tracker
.read_version
;
115 *obj
= mdo
.release();
120 int do_put(RGWSI_MetaBackend_Handler::Op
*op
, string
& entry
,
121 RGWMetadataObject
*_obj
, RGWObjVersionTracker
& objv_tracker
,
123 const DoutPrefixProvider
*dpp
,
124 RGWMDLogSyncType type
, bool from_remote_zone
) override
{
125 RGWOTPMetadataObject
*obj
= static_cast<RGWOTPMetadataObject
*>(_obj
);
127 RGWSI_OTP_BE_Ctx
be_ctx(op
->ctx());
129 int ret
= svc
.otp
->store_all(dpp
, be_ctx
,
139 return STATUS_APPLIED
;
142 int do_remove(RGWSI_MetaBackend_Handler::Op
*op
, string
& entry
, RGWObjVersionTracker
& objv_tracker
,
143 optional_yield y
, const DoutPrefixProvider
*dpp
) override
{
144 RGWSI_MBOTP_RemoveParams params
;
146 RGWSI_OTP_BE_Ctx
be_ctx(op
->ctx());
148 return svc
.otp
->remove_all(dpp
, be_ctx
,
155 RGWOTPMetadataHandler() {}
157 string
get_type() override
{ return "otp"; }
161 RGWOTPCtl::RGWOTPCtl(RGWSI_Zone
*zone_svc
,
169 void RGWOTPCtl::init(RGWOTPMetadataHandler
*_meta_handler
)
171 meta_handler
= _meta_handler
;
172 be_handler
= meta_handler
->get_be_handler();
175 int RGWOTPCtl::read_all(const rgw_user
& uid
,
178 const DoutPrefixProvider
*dpp
,
179 const GetParams
& params
)
182 return meta_handler
->call([&](RGWSI_OTP_BE_Ctx
& ctx
) {
183 return svc
.otp
->read_all(ctx
, uid
, &info
->devices
, params
.mtime
, params
.objv_tracker
, y
, dpp
);
187 int RGWOTPCtl::store_all(const DoutPrefixProvider
*dpp
,
188 const RGWOTPInfo
& info
,
190 const PutParams
& params
)
192 return meta_handler
->call([&](RGWSI_OTP_BE_Ctx
& ctx
) {
193 return svc
.otp
->store_all(dpp
, ctx
, info
.uid
, info
.devices
, params
.mtime
, params
.objv_tracker
, y
);
197 int RGWOTPCtl::remove_all(const DoutPrefixProvider
*dpp
,
200 const RemoveParams
& params
)
202 return meta_handler
->call([&](RGWSI_OTP_BE_Ctx
& ctx
) {
203 return svc
.otp
->remove_all(dpp
, ctx
, uid
, params
.objv_tracker
, y
);
208 RGWMetadataHandler
*RGWOTPMetaHandlerAllocator::alloc()
210 return new RGWOTPMetadataHandler();