]> git.proxmox.com Git - ceph.git/blame - ceph/src/rgw/rgw_otp.cc
import ceph quincy 17.2.6
[ceph.git] / ceph / src / rgw / rgw_otp.cc
CommitLineData
11fdf7f2 1// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
9f95a23c 2// vim: ts=8 sw=2 smarttab ft=cpp
11fdf7f2
TL
3
4#include <errno.h>
5
6#include <string>
7#include <map>
8#include <boost/algorithm/string.hpp>
9
10#include "common/errno.h"
11#include "common/Formatter.h"
12#include "common/ceph_json.h"
9f95a23c 13#include "rgw_otp.h"
11fdf7f2 14#include "rgw_zone.h"
9f95a23c 15#include "rgw_metadata.h"
11fdf7f2
TL
16
17#include "include/types.h"
18
19#include "rgw_common.h"
20#include "rgw_tools.h"
21
22#include "services/svc_zone.h"
9f95a23c
TL
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"
11fdf7f2
TL
27
28#define dout_subsys ceph_subsys_rgw
29
30using namespace std;
31
32
9f95a23c 33class RGWOTPMetadataHandler;
11fdf7f2
TL
34
35class RGWOTPMetadataObject : public RGWMetadataObject {
9f95a23c
TL
36 friend class RGWOTPMetadataHandler;
37
38 otp_devices_list_t devices;
11fdf7f2 39public:
9f95a23c
TL
40 RGWOTPMetadataObject() {}
41 RGWOTPMetadataObject(otp_devices_list_t&& _devices, const obj_version& v, const real_time m) {
42 devices = std::move(_devices);
11fdf7f2
TL
43 objv = v;
44 mtime = m;
45 }
46
47 void dump(Formatter *f) const override {
9f95a23c
TL
48 encode_json("devices", devices, f);
49 }
50
51 otp_devices_list_t& get_devs() {
52 return devices;
11fdf7f2
TL
53 }
54};
55
11fdf7f2 56
9f95a23c
TL
57class RGWOTPMetadataHandler : public RGWOTPMetadataHandlerBase {
58 friend class RGWOTPCtl;
11fdf7f2 59
9f95a23c
TL
60 struct Svc {
61 RGWSI_Zone *zone;
62 RGWSI_MetaBackend *meta_be;
63 RGWSI_OTP *otp;
64 } svc;
65
66 int init(RGWSI_Zone *zone,
67 RGWSI_MetaBackend *_meta_be,
68 RGWSI_OTP *_otp) {
69 base_init(zone->ctx(), _otp->get_be_handler().get());
70 svc.zone = zone;
71 svc.meta_be = _meta_be;
72 svc.otp = _otp;
11fdf7f2
TL
73 return 0;
74 }
75
9f95a23c
TL
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());
79 return f(ctx);
80 });
81 }
11fdf7f2 82
9f95a23c
TL
83 RGWMetadataObject *get_meta_obj(JSONObj *jo, const obj_version& objv, const ceph::real_time& mtime) override {
84 otp_devices_list_t devices;
11fdf7f2 85 try {
9f95a23c 86 JSONDecoder::decode_json("devices", devices, jo);
11fdf7f2 87 } catch (JSONDecoder::err& e) {
9f95a23c 88 return nullptr;
11fdf7f2
TL
89 }
90
9f95a23c
TL
91 return new RGWOTPMetadataObject(std::move(devices), objv, mtime);
92 }
93
b3b6e05e 94 int do_get(RGWSI_MetaBackend_Handler::Op *op, string& entry, RGWMetadataObject **obj, optional_yield y, const DoutPrefixProvider *dpp) override {
9f95a23c
TL
95 RGWObjVersionTracker objv_tracker;
96
97 std::unique_ptr<RGWOTPMetadataObject> mdo(new RGWOTPMetadataObject);
98
99
100 RGWSI_OTP_BE_Ctx be_ctx(op->ctx());
101
102 int ret = svc.otp->read_all(be_ctx,
103 entry,
104 &mdo->get_devs(),
105 &mdo->get_mtime(),
106 &objv_tracker,
b3b6e05e
TL
107 y,
108 dpp);
11fdf7f2
TL
109 if (ret < 0) {
110 return ret;
111 }
112
9f95a23c 113 mdo->objv = objv_tracker.read_version;
11fdf7f2 114
9f95a23c 115 *obj = mdo.release();
11fdf7f2 116
9f95a23c 117 return 0;
11fdf7f2
TL
118 }
119
9f95a23c
TL
120 int do_put(RGWSI_MetaBackend_Handler::Op *op, string& entry,
121 RGWMetadataObject *_obj, RGWObjVersionTracker& objv_tracker,
122 optional_yield y,
b3b6e05e 123 const DoutPrefixProvider *dpp,
f67539c2 124 RGWMDLogSyncType type, bool from_remote_zone) override {
9f95a23c 125 RGWOTPMetadataObject *obj = static_cast<RGWOTPMetadataObject *>(_obj);
11fdf7f2 126
9f95a23c 127 RGWSI_OTP_BE_Ctx be_ctx(op->ctx());
11fdf7f2 128
b3b6e05e 129 int ret = svc.otp->store_all(dpp, be_ctx,
9f95a23c
TL
130 entry,
131 obj->devices,
132 obj->mtime,
133 &objv_tracker,
134 y);
11fdf7f2
TL
135 if (ret < 0) {
136 return ret;
137 }
138
9f95a23c
TL
139 return STATUS_APPLIED;
140 }
11fdf7f2 141
9f95a23c 142 int do_remove(RGWSI_MetaBackend_Handler::Op *op, string& entry, RGWObjVersionTracker& objv_tracker,
b3b6e05e 143 optional_yield y, const DoutPrefixProvider *dpp) override {
9f95a23c
TL
144 RGWSI_MBOTP_RemoveParams params;
145
146 RGWSI_OTP_BE_Ctx be_ctx(op->ctx());
147
b3b6e05e 148 return svc.otp->remove_all(dpp, be_ctx,
9f95a23c
TL
149 entry,
150 &objv_tracker,
151 y);
11fdf7f2
TL
152 }
153
9f95a23c
TL
154public:
155 RGWOTPMetadataHandler() {}
11fdf7f2 156
9f95a23c
TL
157 string get_type() override { return "otp"; }
158};
11fdf7f2 159
11fdf7f2 160
9f95a23c
TL
161RGWOTPCtl::RGWOTPCtl(RGWSI_Zone *zone_svc,
162 RGWSI_OTP *otp_svc)
163{
164 svc.zone = zone_svc;
165 svc.otp = otp_svc;
166}
11fdf7f2 167
11fdf7f2 168
9f95a23c
TL
169void RGWOTPCtl::init(RGWOTPMetadataHandler *_meta_handler)
170{
171 meta_handler = _meta_handler;
172 be_handler = meta_handler->get_be_handler();
173}
11fdf7f2 174
9f95a23c
TL
175int RGWOTPCtl::read_all(const rgw_user& uid,
176 RGWOTPInfo *info,
177 optional_yield y,
b3b6e05e 178 const DoutPrefixProvider *dpp,
9f95a23c
TL
179 const GetParams& params)
180{
181 info->uid = uid;
182 return meta_handler->call([&](RGWSI_OTP_BE_Ctx& ctx) {
b3b6e05e 183 return svc.otp->read_all(ctx, uid, &info->devices, params.mtime, params.objv_tracker, y, dpp);
9f95a23c
TL
184 });
185}
11fdf7f2 186
b3b6e05e
TL
187int RGWOTPCtl::store_all(const DoutPrefixProvider *dpp,
188 const RGWOTPInfo& info,
9f95a23c
TL
189 optional_yield y,
190 const PutParams& params)
191{
192 return meta_handler->call([&](RGWSI_OTP_BE_Ctx& ctx) {
b3b6e05e 193 return svc.otp->store_all(dpp, ctx, info.uid, info.devices, params.mtime, params.objv_tracker, y);
9f95a23c
TL
194 });
195}
11fdf7f2 196
b3b6e05e
TL
197int RGWOTPCtl::remove_all(const DoutPrefixProvider *dpp,
198 const rgw_user& uid,
9f95a23c
TL
199 optional_yield y,
200 const RemoveParams& params)
11fdf7f2 201{
9f95a23c 202 return meta_handler->call([&](RGWSI_OTP_BE_Ctx& ctx) {
b3b6e05e 203 return svc.otp->remove_all(dpp, ctx, uid, params.objv_tracker, y);
9f95a23c 204 });
11fdf7f2
TL
205}
206
9f95a23c
TL
207
208RGWMetadataHandler *RGWOTPMetaHandlerAllocator::alloc()
11fdf7f2 209{
9f95a23c 210 return new RGWOTPMetadataHandler();
11fdf7f2 211}