From 56ee87545df1970a6d2620c2f52f12979cb801ba Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Thu, 7 Feb 2019 12:53:56 -0800 Subject: [PATCH] rgw: svc_cls: replace svc_mfa with a more generic svc_cls Consolidate objclass util services. Signed-off-by: Yehuda Sadeh --- src/rgw/CMakeLists.txt | 2 +- src/rgw/rgw_admin.cc | 24 +++--- src/rgw/rgw_otp.cc | 6 +- src/rgw/rgw_rest_s3.cc | 4 +- src/rgw/rgw_service.cc | 11 +-- src/rgw/rgw_service.h | 6 +- src/rgw/services/{svc_mfa.cc => svc_cls.cc} | 53 +++++++----- src/rgw/services/svc_cls.h | 92 +++++++++++++++++++++ src/rgw/services/svc_mfa.h | 68 --------------- 9 files changed, 152 insertions(+), 114 deletions(-) rename src/rgw/services/{svc_mfa.cc => svc_cls.cc} (75%) create mode 100644 src/rgw/services/svc_cls.h delete mode 100644 src/rgw/services/svc_mfa.h diff --git a/src/rgw/CMakeLists.txt b/src/rgw/CMakeLists.txt index 683f5e74aa9..856e3af376c 100644 --- a/src/rgw/CMakeLists.txt +++ b/src/rgw/CMakeLists.txt @@ -21,7 +21,7 @@ endfunction() set(librgw_common_srcs services/svc_finisher.cc - services/svc_mfa.cc + services/svc_cls.cc services/svc_notify.cc services/svc_quota.cc services/svc_sync_modules.cc diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index b4606352643..11d6c26cc61 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -58,7 +58,7 @@ extern "C" { #include "rgw_sync_module_pubsub.h" #include "services/svc_sync_modules.h" -#include "services/svc_mfa.h" +#include "services/svc_cls.h" #define dout_context g_ceph_context #define dout_subsys ceph_subsys_rgw @@ -7723,12 +7723,12 @@ next: } real_time mtime = real_clock::now(); - string oid = store->svc.mfa->get_mfa_oid(user_id); + string oid = store->svc.cls->mfa.get_mfa_oid(user_id); int ret = store->meta_mgr->mutate(rgw_otp_get_handler(), oid, mtime, &objv_tracker, MDLOG_STATUS_WRITE, RGWMetadataHandler::APPLY_ALWAYS, [&] { - return store->svc.mfa->create_mfa(user_id, config, &objv_tracker, mtime, null_yield); + return store->svc.cls->mfa.create_mfa(user_id, config, &objv_tracker, mtime, null_yield); }); if (ret < 0) { cerr << "MFA creation failed, error: " << cpp_strerror(-ret) << std::endl; @@ -7758,12 +7758,12 @@ next: } real_time mtime = real_clock::now(); - string oid = store->svc.mfa->get_mfa_oid(user_id); + string oid = store->svc.cls->mfa.get_mfa_oid(user_id); int ret = store->meta_mgr->mutate(rgw_otp_get_handler(), oid, mtime, &objv_tracker, MDLOG_STATUS_WRITE, RGWMetadataHandler::APPLY_ALWAYS, [&] { - return store->svc.mfa->remove_mfa(user_id, totp_serial, &objv_tracker, mtime, null_yield); + return store->svc.cls->mfa.remove_mfa(user_id, totp_serial, &objv_tracker, mtime, null_yield); }); if (ret < 0) { cerr << "MFA removal failed, error: " << cpp_strerror(-ret) << std::endl; @@ -7793,7 +7793,7 @@ next: } rados::cls::otp::otp_info_t result; - int ret = store->svc.mfa->get_mfa(user_id, totp_serial, &result, null_yield); + int ret = store->svc.cls->mfa.get_mfa(user_id, totp_serial, &result, null_yield); if (ret < 0) { if (ret == -ENOENT || ret == -ENODATA) { cerr << "MFA serial id not found" << std::endl; @@ -7815,7 +7815,7 @@ next: } list result; - int ret = store->svc.mfa->list_mfa(user_id, &result, null_yield); + int ret = store->svc.cls->mfa.list_mfa(user_id, &result, null_yield); if (ret < 0) { cerr << "MFA listing failed, error: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -7843,7 +7843,7 @@ next: } list result; - int ret = store->svc.mfa->check_mfa(user_id, totp_serial, totp_pin.front(), null_yield); + int ret = store->svc.cls->mfa.check_mfa(user_id, totp_serial, totp_pin.front(), null_yield); if (ret < 0) { cerr << "MFA check failed, error: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -7868,7 +7868,7 @@ next: } rados::cls::otp::otp_info_t config; - int ret = store->svc.mfa->get_mfa(user_id, totp_serial, &config, null_yield); + int ret = store->svc.cls->mfa.get_mfa(user_id, totp_serial, &config, null_yield); if (ret < 0) { if (ret == -ENOENT || ret == -ENODATA) { cerr << "MFA serial id not found" << std::endl; @@ -7880,7 +7880,7 @@ next: ceph::real_time now; - ret = store->svc.mfa->otp_get_current_time(user_id, &now, null_yield); + ret = store->svc.cls->mfa.otp_get_current_time(user_id, &now, null_yield); if (ret < 0) { cerr << "ERROR: failed to fetch current time from osd: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -7901,12 +7901,12 @@ next: /* now update the backend */ real_time mtime = real_clock::now(); - string oid = store->svc.mfa->get_mfa_oid(user_id); + string oid = store->svc.cls->mfa.get_mfa_oid(user_id); ret = store->meta_mgr->mutate(rgw_otp_get_handler(), oid, mtime, &objv_tracker, MDLOG_STATUS_WRITE, RGWMetadataHandler::APPLY_ALWAYS, [&] { - return store->svc.mfa->create_mfa(user_id, config, &objv_tracker, mtime, null_yield); + return store->svc.cls->mfa.create_mfa(user_id, config, &objv_tracker, mtime, null_yield); }); if (ret < 0) { cerr << "MFA update failed, error: " << cpp_strerror(-ret) << std::endl; diff --git a/src/rgw/rgw_otp.cc b/src/rgw/rgw_otp.cc index 224f77c6893..6d2d6112d26 100644 --- a/src/rgw/rgw_otp.cc +++ b/src/rgw/rgw_otp.cc @@ -19,7 +19,7 @@ #include "rgw_tools.h" #include "services/svc_zone.h" -#include "services/svc_mfa.h" +#include "services/svc_cls.h" #define dout_subsys ceph_subsys_rgw @@ -52,7 +52,7 @@ public: real_time mtime; list result; - int r = store->svc.mfa->list_mfa(entry, &result, &objv_tracker, &mtime, null_yield); + int r = store->svc.cls->mfa.list_mfa(entry, &result, &objv_tracker, &mtime, null_yield); if (r < 0) { return r; } @@ -74,7 +74,7 @@ public: int ret = store->meta_mgr->mutate(this, entry, mtime, &objv_tracker, MDLOG_STATUS_WRITE, sync_mode, [&] { - return store->svc.mfa->set_mfa(entry, devices, true, &objv_tracker, mtime, null_yield); + return store->svc.cls->mfa.set_mfa(entry, devices, true, &objv_tracker, mtime, null_yield); }); if (ret < 0) { return ret; diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index 1efb4bdabfd..1b0c2ddf283 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -48,7 +48,7 @@ #include "rgw_zone.h" #include "services/svc_zone.h" -#include "services/svc_mfa.h" +#include "services/svc_cls.h" #include "include/ceph_assert.h" #include "rgw_role.h" @@ -3894,7 +3894,7 @@ static int verify_mfa(RGWRados *store, RGWUserInfo *user, const string& mfa_str, return -EACCES; } - int ret = store->svc.mfa->check_mfa(user->user_id, serial, pin, null_yield); + int ret = store->svc.cls->mfa.check_mfa(user->user_id, serial, pin, null_yield); if (ret < 0) { ldpp_dout(dpp, 20) << "NOTICE: failed to check MFA, serial=" << serial << dendl; return -EACCES; diff --git a/src/rgw/rgw_service.cc b/src/rgw/rgw_service.cc index 83c22de4f9c..4ba0c5fd751 100644 --- a/src/rgw/rgw_service.cc +++ b/src/rgw/rgw_service.cc @@ -4,7 +4,7 @@ #include "rgw_service.h" #include "services/svc_finisher.h" -#include "services/svc_mfa.h" +#include "services/svc_cls.h" #include "services/svc_notify.h" #include "services/svc_rados.h" #include "services/svc_zone.h" @@ -31,7 +31,7 @@ int RGWServices_Def::init(CephContext *cct, bool raw) { finisher = std::make_unique(cct); - mfa = std::make_unique(cct); + cls = std::make_unique(cct); notify = std::make_unique(cct); rados = std::make_unique(cct); zone = std::make_unique(cct); @@ -45,7 +45,7 @@ int RGWServices_Def::init(CephContext *cct, sysobj_cache = std::make_unique(cct); } finisher->init(); - mfa->init(zone.get(), rados.get()); + cls->init(zone.get(), rados.get()); notify->init(zone.get(), rados.get(), finisher.get()); rados->init(); zone->init(sysobj.get(), rados.get(), sync_modules.get()); @@ -90,9 +90,9 @@ int RGWServices_Def::init(CephContext *cct, } } - r = mfa->start(); + r = cls->start(); if (r < 0) { - ldout(cct, 0) << "ERROR: failed to start mfa service (" << cpp_strerror(-r) << dendl; + ldout(cct, 0) << "ERROR: failed to start cls service (" << cpp_strerror(-r) << dendl; return r; } @@ -167,6 +167,7 @@ int RGWServices::do_init(CephContext *cct, bool have_cache, bool raw) } finisher = _svc.finisher.get(); + cls = _svc.cls.get(); notify = _svc.notify.get(); rados = _svc.rados.get(); zone = _svc.zone.get(); diff --git a/src/rgw/rgw_service.h b/src/rgw/rgw_service.h index 282be223f8d..4ee436fcf35 100644 --- a/src/rgw/rgw_service.h +++ b/src/rgw/rgw_service.h @@ -45,7 +45,7 @@ public: }; class RGWSI_Finisher; -class RGWSI_MFA; +class RGWSI_Cls; class RGWSI_Notify; class RGWSI_RADOS; class RGWSI_Zone; @@ -62,7 +62,7 @@ struct RGWServices_Def bool has_shutdown{false}; std::unique_ptr finisher; - std::unique_ptr mfa; + std::unique_ptr cls; std::unique_ptr notify; std::unique_ptr rados; std::unique_ptr zone; @@ -86,7 +86,7 @@ struct RGWServices RGWServices_Def _svc; RGWSI_Finisher *finisher{nullptr}; - RGWSI_MFA *mfa{nullptr}; + RGWSI_Cls *cls{nullptr}; RGWSI_Notify *notify{nullptr}; RGWSI_RADOS *rados{nullptr}; RGWSI_Zone *zone{nullptr}; diff --git a/src/rgw/services/svc_mfa.cc b/src/rgw/services/svc_cls.cc similarity index 75% rename from src/rgw/services/svc_mfa.cc rename to src/rgw/services/svc_cls.cc index 438eb816559..7cef35c1912 100644 --- a/src/rgw/services/svc_mfa.cc +++ b/src/rgw/services/svc_cls.cc @@ -1,6 +1,6 @@ -#include "svc_mfa.h" +#include "svc_cls.h" #include "svc_rados.h" #include "svc_zone.h" @@ -12,7 +12,19 @@ #define dout_subsys ceph_subsys_rgw -int RGWSI_MFA::get_mfa_obj(const rgw_user& user, std::optional *obj) { +int RGWSI_Cls::do_start() +{ + int r = mfa.do_start(); + if (r < 0) { + ldout(cct, 0) << "ERROR: failed to start mfa service" << dendl; + return r; + } + + return 0; +} + +int RGWSI_Cls::MFA::get_mfa_obj(const rgw_user& user, std::optional *obj) +{ string oid = get_mfa_oid(user); rgw_raw_obj o(zone_svc->get_zone_params().otp_pool, oid); @@ -26,7 +38,8 @@ int RGWSI_MFA::get_mfa_obj(const rgw_user& user, std::optional return 0; } -int RGWSI_MFA::get_mfa_ref(const rgw_user& user, rgw_rados_ref *ref) { +int RGWSI_Cls::MFA::get_mfa_ref(const rgw_user& user, rgw_rados_ref *ref) +{ std::optional obj; int r = get_mfa_obj(user, &obj); if (r < 0) { @@ -36,7 +49,7 @@ int RGWSI_MFA::get_mfa_ref(const rgw_user& user, rgw_rados_ref *ref) { return 0; } -int RGWSI_MFA::check_mfa(const rgw_user& user, const string& otp_id, const string& pin, optional_yield y) +int RGWSI_Cls::MFA::check_mfa(const rgw_user& user, const string& otp_id, const string& pin, optional_yield y) { rgw_rados_ref ref; int r = get_mfa_ref(user, &ref); @@ -55,7 +68,7 @@ int RGWSI_MFA::check_mfa(const rgw_user& user, const string& otp_id, const strin return (result.result == rados::cls::otp::OTP_CHECK_SUCCESS ? 0 : -EACCES); } -void RGWSI_MFA::prepare_mfa_write(librados::ObjectWriteOperation *op, +void RGWSI_Cls::MFA::prepare_mfa_write(librados::ObjectWriteOperation *op, RGWObjVersionTracker *objv_tracker, const ceph::real_time& mtime) { @@ -79,7 +92,7 @@ void RGWSI_MFA::prepare_mfa_write(librados::ObjectWriteOperation *op, op->mtime2(&mtime_ts); } -int RGWSI_MFA::create_mfa(const rgw_user& user, const rados::cls::otp::otp_info_t& config, +int RGWSI_Cls::MFA::create_mfa(const rgw_user& user, const rados::cls::otp::otp_info_t& config, RGWObjVersionTracker *objv_tracker, const ceph::real_time& mtime, optional_yield y) { std::optional obj; @@ -100,7 +113,7 @@ int RGWSI_MFA::create_mfa(const rgw_user& user, const rados::cls::otp::otp_info_ return 0; } -int RGWSI_MFA::remove_mfa(const rgw_user& user, const string& id, +int RGWSI_Cls::MFA::remove_mfa(const rgw_user& user, const string& id, RGWObjVersionTracker *objv_tracker, const ceph::real_time& mtime, optional_yield y) @@ -123,8 +136,8 @@ int RGWSI_MFA::remove_mfa(const rgw_user& user, const string& id, return 0; } -int RGWSI_MFA::get_mfa(const rgw_user& user, const string& id, rados::cls::otp::otp_info_t *result, - optional_yield y) +int RGWSI_Cls::MFA::get_mfa(const rgw_user& user, const string& id, rados::cls::otp::otp_info_t *result, + optional_yield y) { rgw_rados_ref ref; @@ -141,8 +154,8 @@ int RGWSI_MFA::get_mfa(const rgw_user& user, const string& id, rados::cls::otp:: return 0; } -int RGWSI_MFA::list_mfa(const rgw_user& user, list *result, - optional_yield y) +int RGWSI_Cls::MFA::list_mfa(const rgw_user& user, list *result, + optional_yield y) { rgw_rados_ref ref; @@ -159,8 +172,8 @@ int RGWSI_MFA::list_mfa(const rgw_user& user, list return 0; } -int RGWSI_MFA::otp_get_current_time(const rgw_user& user, ceph::real_time *result, - optional_yield y) +int RGWSI_Cls::MFA::otp_get_current_time(const rgw_user& user, ceph::real_time *result, + optional_yield y) { rgw_rados_ref ref; @@ -177,10 +190,10 @@ int RGWSI_MFA::otp_get_current_time(const rgw_user& user, ceph::real_time *resul return 0; } -int RGWSI_MFA::set_mfa(const string& oid, const list& entries, - bool reset_obj, RGWObjVersionTracker *objv_tracker, - const real_time& mtime, - optional_yield y) +int RGWSI_Cls::MFA::set_mfa(const string& oid, const list& entries, + bool reset_obj, RGWObjVersionTracker *objv_tracker, + const real_time& mtime, + optional_yield y) { rgw_raw_obj o(zone_svc->get_zone_params().otp_pool, oid); auto obj = rados_svc->obj(o); @@ -206,9 +219,9 @@ int RGWSI_MFA::set_mfa(const string& oid, const list *result, - RGWObjVersionTracker *objv_tracker, ceph::real_time *pmtime, - optional_yield y) +int RGWSI_Cls::MFA::list_mfa(const string& oid, list *result, + RGWObjVersionTracker *objv_tracker, ceph::real_time *pmtime, + optional_yield y) { rgw_raw_obj o(zone_svc->get_zone_params().otp_pool, oid); auto obj = rados_svc->obj(o); diff --git a/src/rgw/services/svc_cls.h b/src/rgw/services/svc_cls.h new file mode 100644 index 00000000000..da5c34dc93d --- /dev/null +++ b/src/rgw/services/svc_cls.h @@ -0,0 +1,92 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2019 Red Hat, Inc. + * + * This is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software + * Foundation. See file COPYING. + * + */ + + +#pragma once + +#include "cls/otp/cls_otp_types.h" + +#include "rgw/rgw_service.h" + +#include "svc_rados.h" + + +class RGWSI_Cls : public RGWServiceInstance +{ + RGWSI_Zone *zone_svc{nullptr}; + RGWSI_RADOS *rados_svc{nullptr}; + + class ClsSubService : public RGWServiceInstance { + friend class RGWSI_Cls; + + RGWSI_Cls *cls_svc{nullptr}; + RGWSI_Zone *zone_svc{nullptr}; + RGWSI_RADOS *rados_svc{nullptr}; + + void init(RGWSI_Cls *_cls_svc, RGWSI_Zone *_zone_svc, RGWSI_RADOS *_rados_svc) { + cls_svc = _cls_svc; + zone_svc = _cls_svc->zone_svc; + rados_svc = _cls_svc->rados_svc; + } + + public: + ClsSubService(CephContext *cct) : RGWServiceInstance(cct) {} + }; + +public: + class MFA : public ClsSubService { + int get_mfa_obj(const rgw_user& user, std::optional *obj); + int get_mfa_ref(const rgw_user& user, rgw_rados_ref *ref); + + void prepare_mfa_write(librados::ObjectWriteOperation *op, + RGWObjVersionTracker *objv_tracker, + const ceph::real_time& mtime); + + public: + MFA(CephContext *cct): ClsSubService(cct) {} + + string get_mfa_oid(const rgw_user& user) { + return string("user:") + user.to_str(); + } + + int check_mfa(const rgw_user& user, const string& otp_id, const string& pin, optional_yield y); + int create_mfa(const rgw_user& user, const rados::cls::otp::otp_info_t& config, + RGWObjVersionTracker *objv_tracker, const ceph::real_time& mtime, optional_yield y); + int remove_mfa(const rgw_user& user, const string& id, + RGWObjVersionTracker *objv_tracker, + const ceph::real_time& mtime, + optional_yield y); + int get_mfa(const rgw_user& user, const string& id, rados::cls::otp::otp_info_t *result, optional_yield y); + int list_mfa(const rgw_user& user, list *result, optional_yield y); + int otp_get_current_time(const rgw_user& user, ceph::real_time *result, optional_yield y); + int set_mfa(const string& oid, const list& entries, + bool reset_obj, RGWObjVersionTracker *objv_tracker, + const real_time& mtime, optional_yield y); + int list_mfa(const string& oid, list *result, + RGWObjVersionTracker *objv_tracker, ceph::real_time *pmtime, optional_yield y); + } mfa; + + RGWSI_Cls(CephContext *cct): RGWServiceInstance(cct), mfa(cct) {} + + void init(RGWSI_Zone *_zone_svc, RGWSI_RADOS *_rados_svc) { + rados_svc = _rados_svc; + zone_svc = _zone_svc; + + mfa.init(this, zone_svc, rados_svc); + } + + int do_start() override; +}; + diff --git a/src/rgw/services/svc_mfa.h b/src/rgw/services/svc_mfa.h deleted file mode 100644 index ccc97fdcb55..00000000000 --- a/src/rgw/services/svc_mfa.h +++ /dev/null @@ -1,68 +0,0 @@ -// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- -// vim: ts=8 sw=2 smarttab - -/* - * Ceph - scalable distributed file system - * - * Copyright (C) 2019 Red Hat, Inc. - * - * This is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License version 2.1, as published by the Free Software - * Foundation. See file COPYING. - * - */ - - -#pragma once - -#include "cls/otp/cls_otp_types.h" - -#include "rgw/rgw_service.h" - -#include "svc_rados.h" - - -class RGWSI_MFA : public RGWServiceInstance -{ - RGWSI_Zone *zone_svc{nullptr}; - RGWSI_RADOS *rados_svc{nullptr}; - - int get_mfa_obj(const rgw_user& user, std::optional *obj); - int get_mfa_ref(const rgw_user& user, rgw_rados_ref *ref); - - void prepare_mfa_write(librados::ObjectWriteOperation *op, - RGWObjVersionTracker *objv_tracker, - const ceph::real_time& mtime); - -public: - RGWSI_MFA(CephContext *cct): RGWServiceInstance(cct) {} - - void init(RGWSI_Zone *_zone_svc, RGWSI_RADOS *_rados_svc) { - rados_svc = _rados_svc; - zone_svc = _zone_svc; - } - - string get_mfa_oid(const rgw_user& user) { - return string("user:") + user.to_str(); - } - - int check_mfa(const rgw_user& user, const string& otp_id, const string& pin, optional_yield y); - int create_mfa(const rgw_user& user, const rados::cls::otp::otp_info_t& config, - RGWObjVersionTracker *objv_tracker, const ceph::real_time& mtime, optional_yield y); - int remove_mfa(const rgw_user& user, const string& id, - RGWObjVersionTracker *objv_tracker, - const ceph::real_time& mtime, - optional_yield y); - int get_mfa(const rgw_user& user, const string& id, rados::cls::otp::otp_info_t *result, optional_yield y); - int list_mfa(const rgw_user& user, list *result, optional_yield y); - int otp_get_current_time(const rgw_user& user, ceph::real_time *result, optional_yield y); - int set_mfa(const string& oid, const list& entries, - bool reset_obj, RGWObjVersionTracker *objv_tracker, - const real_time& mtime, optional_yield y); - int list_mfa(const string& oid, list *result, - RGWObjVersionTracker *objv_tracker, ceph::real_time *pmtime, optional_yield y); -}; - - - -- 2.39.5