#include "rgw_op.h"
#include "rgw_user.h"
#include "rgw_rest_user.h"
+#include "rgw_sal_rados.h"
#include "include/str_list.h"
#include "include/ceph_assert.h"
return caps.check_cap("users", RGW_CAP_READ);
}
- void execute() override;
+ void execute(optional_yield y) override;
const char* name() const override { return "list_user"; }
};
-void RGWOp_User_List::execute()
+void RGWOp_User_List::execute(optional_yield y)
{
RGWUserAdminOpState op_state;
op_state.max_entries = max_entries;
op_state.marker = marker;
- http_ret = RGWUserAdminOp_User::list(store, op_state, flusher);
+ op_ret = RGWUserAdminOp_User::list(store, op_state, flusher);
}
class RGWOp_User_Info : public RGWRESTOp {
return caps.check_cap("users", RGW_CAP_READ);
}
- void execute() override;
+ void execute(optional_yield y) override;
const char* name() const override { return "get_user_info"; }
};
-void RGWOp_User_Info::execute()
+void RGWOp_User_Info::execute(optional_yield y)
{
RGWUserAdminOpState op_state;
// end up initializing anonymous user, for which keys.init will eventually
// return -EACESS
if (uid_str.empty() && access_key_str.empty()){
- http_ret=-EINVAL;
+ op_ret=-EINVAL;
return;
}
op_state.set_fetch_stats(fetch_stats);
op_state.set_sync_stats(sync_stats);
- http_ret = RGWUserAdminOp_User::info(store, op_state, flusher);
+ op_ret = RGWUserAdminOp_User::info(store, op_state, flusher, y);
}
class RGWOp_User_Create : public RGWRESTOp {
return caps.check_cap("users", RGW_CAP_WRITE);
}
- void execute() override;
+ void execute(optional_yield y) override;
const char* name() const override { return "create_user"; }
};
-void RGWOp_User_Create::execute()
+void RGWOp_User_Create::execute(optional_yield y)
{
std::string uid_str;
std::string display_name;
if (!s->user->get_info().system && system) {
ldout(s->cct, 0) << "cannot set system flag by non-system user" << dendl;
- http_ret = -EINVAL;
+ op_ret = -EINVAL;
return;
}
int ret = rgw_parse_op_type_list(op_mask_str, &op_mask);
if (ret < 0) {
ldout(s->cct, 0) << "failed to parse op_mask: " << ret << dendl;
- http_ret = -EINVAL;
+ op_ret = -EINVAL;
return;
}
op_state.set_op_mask(op_mask);
target_rule.from_str(default_placement_str);
if (!store->svc()->zone->get_zone_params().valid_placement(target_rule)) {
ldout(s->cct, 0) << "NOTICE: invalid dest placement: " << target_rule.to_str() << dendl;
- http_ret = -EINVAL;
+ op_ret = -EINVAL;
return;
}
op_state.set_default_placement(target_rule);
op_state.set_placement_tags(placement_tags_list);
}
- if (!store->svc()->zone->is_meta_master()) {
- bufferlist data;
- op_ret = forward_request_to_master(s, nullptr, store, data, nullptr);
- if (op_ret < 0) {
- ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
- return;
- }
+ bufferlist data;
+ op_ret = store->forward_request_to_master(s->user.get(), nullptr, data, nullptr, s->info, y);
+ if (op_ret < 0) {
+ ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
+ return;
}
- http_ret = RGWUserAdminOp_User::create(store, op_state, flusher);
+ op_ret = RGWUserAdminOp_User::create(store, op_state, flusher, y);
}
class RGWOp_User_Modify : public RGWRESTOp {
return caps.check_cap("users", RGW_CAP_WRITE);
}
- void execute() override;
+ void execute(optional_yield y) override;
const char* name() const override { return "modify_user"; }
};
-void RGWOp_User_Modify::execute()
+void RGWOp_User_Modify::execute(optional_yield y)
{
std::string uid_str;
std::string display_name;
if (!s->user->get_info().system && system) {
ldout(s->cct, 0) << "cannot set system flag by non-system user" << dendl;
- http_ret = -EINVAL;
+ op_ret = -EINVAL;
return;
}
uint32_t op_mask;
if (rgw_parse_op_type_list(op_mask_str, &op_mask) < 0) {
ldout(s->cct, 0) << "failed to parse op_mask" << dendl;
- http_ret = -EINVAL;
+ op_ret = -EINVAL;
return;
}
op_state.set_op_mask(op_mask);
int ret = rgw_parse_op_type_list(op_mask_str, &op_mask);
if (ret < 0) {
ldout(s->cct, 0) << "failed to parse op_mask: " << ret << dendl;
- http_ret = -EINVAL;
+ op_ret = -EINVAL;
return;
}
op_state.set_op_mask(op_mask);
target_rule.from_str(default_placement_str);
if (!store->svc()->zone->get_zone_params().valid_placement(target_rule)) {
ldout(s->cct, 0) << "NOTICE: invalid dest placement: " << target_rule.to_str() << dendl;
- http_ret = -EINVAL;
+ op_ret = -EINVAL;
return;
}
op_state.set_default_placement(target_rule);
op_state.set_placement_tags(placement_tags_list);
}
- if (!store->svc()->zone->is_meta_master()) {
- bufferlist data;
- op_ret = forward_request_to_master(s, nullptr, store, data, nullptr);
- if (op_ret < 0) {
- ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
- return;
- }
+ bufferlist data;
+ op_ret = store->forward_request_to_master(s->user.get(), nullptr, data, nullptr, s->info, y);
+ if (op_ret < 0) {
+ ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
+ return;
}
- http_ret = RGWUserAdminOp_User::modify(store, op_state, flusher);
+ op_ret = RGWUserAdminOp_User::modify(store, op_state, flusher, y);
}
class RGWOp_User_Remove : public RGWRESTOp {
return caps.check_cap("users", RGW_CAP_WRITE);
}
- void execute() override;
+ void execute(optional_yield y) override;
const char* name() const override { return "remove_user"; }
};
-void RGWOp_User_Remove::execute()
+void RGWOp_User_Remove::execute(optional_yield y)
{
std::string uid_str;
bool purge_data;
op_state.set_purge_data(purge_data);
- if (!store->svc()->zone->is_meta_master()) {
- bufferlist data;
- op_ret = forward_request_to_master(s, nullptr, store, data, nullptr);
- if (op_ret < 0) {
- ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
- return;
- }
+ bufferlist data;
+ op_ret = store->forward_request_to_master(s->user.get(), nullptr, data, nullptr, s->info, y);
+ if (op_ret < 0) {
+ ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
+ return;
}
- http_ret = RGWUserAdminOp_User::remove(store, op_state, flusher, s->yield);
+ op_ret = RGWUserAdminOp_User::remove(store, op_state, flusher, s->yield);
}
class RGWOp_Subuser_Create : public RGWRESTOp {
return caps.check_cap("users", RGW_CAP_WRITE);
}
- void execute() override;
+ void execute(optional_yield y) override;
const char* name() const override { return "create_subuser"; }
};
-void RGWOp_Subuser_Create::execute()
+void RGWOp_Subuser_Create::execute(optional_yield y)
{
std::string uid_str;
std::string subuser;
}
op_state.set_key_type(key_type);
- if (!store->svc()->zone->is_meta_master()) {
- bufferlist data;
- op_ret = forward_request_to_master(s, nullptr, store, data, nullptr);
- if (op_ret < 0) {
- ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
- return;
- }
+ bufferlist data;
+ op_ret = store->forward_request_to_master(s->user.get(), nullptr, data, nullptr, s->info, y);
+ if (op_ret < 0) {
+ ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
+ return;
}
- http_ret = RGWUserAdminOp_Subuser::create(store, op_state, flusher);
+ op_ret = RGWUserAdminOp_Subuser::create(store, op_state, flusher, y);
}
class RGWOp_Subuser_Modify : public RGWRESTOp {
return caps.check_cap("users", RGW_CAP_WRITE);
}
- void execute() override;
+ void execute(optional_yield y) override;
const char* name() const override { return "modify_subuser"; }
};
-void RGWOp_Subuser_Modify::execute()
+void RGWOp_Subuser_Modify::execute(optional_yield y)
{
std::string uid_str;
std::string subuser;
}
op_state.set_key_type(key_type);
- if (!store->svc()->zone->is_meta_master()) {
- bufferlist data;
- op_ret = forward_request_to_master(s, nullptr, store, data, nullptr);
- if (op_ret < 0) {
- ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
- return;
- }
+ bufferlist data;
+ op_ret = store->forward_request_to_master(s->user.get(), nullptr, data, nullptr, s->info, y);
+ if (op_ret < 0) {
+ ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
+ return;
}
- http_ret = RGWUserAdminOp_Subuser::modify(store, op_state, flusher);
+ op_ret = RGWUserAdminOp_Subuser::modify(store, op_state, flusher, y);
}
class RGWOp_Subuser_Remove : public RGWRESTOp {
return caps.check_cap("users", RGW_CAP_WRITE);
}
- void execute() override;
+ void execute(optional_yield y) override;
const char* name() const override { return "remove_subuser"; }
};
-void RGWOp_Subuser_Remove::execute()
+void RGWOp_Subuser_Remove::execute(optional_yield y)
{
std::string uid_str;
std::string subuser;
if (purge_keys)
op_state.set_purge_keys();
- if (!store->svc()->zone->is_meta_master()) {
- bufferlist data;
- op_ret = forward_request_to_master(s, nullptr, store, data, nullptr);
- if (op_ret < 0) {
- ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
- return;
- }
+ bufferlist data;
+ op_ret = store->forward_request_to_master(s->user.get(), nullptr, data, nullptr, s->info, y);
+ if (op_ret < 0) {
+ ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
+ return;
}
- http_ret = RGWUserAdminOp_Subuser::remove(store, op_state, flusher);
+ op_ret = RGWUserAdminOp_Subuser::remove(store, op_state, flusher, y);
}
class RGWOp_Key_Create : public RGWRESTOp {
return caps.check_cap("users", RGW_CAP_WRITE);
}
- void execute() override;
+ void execute(optional_yield y) override;
const char* name() const override { return "create_access_key"; }
};
-void RGWOp_Key_Create::execute()
+void RGWOp_Key_Create::execute(optional_yield y)
{
std::string uid_str;
std::string subuser;
op_state.set_key_type(key_type);
}
- http_ret = RGWUserAdminOp_Key::create(store, op_state, flusher);
+ op_ret = RGWUserAdminOp_Key::create(store, op_state, flusher, y);
}
class RGWOp_Key_Remove : public RGWRESTOp {
return caps.check_cap("users", RGW_CAP_WRITE);
}
- void execute() override;
+ void execute(optional_yield y) override;
const char* name() const override { return "remove_access_key"; }
};
-void RGWOp_Key_Remove::execute()
+void RGWOp_Key_Remove::execute(optional_yield y)
{
std::string uid_str;
std::string subuser;
op_state.set_key_type(key_type);
}
- http_ret = RGWUserAdminOp_Key::remove(store, op_state, flusher);
+ op_ret = RGWUserAdminOp_Key::remove(store, op_state, flusher, y);
}
class RGWOp_Caps_Add : public RGWRESTOp {
return caps.check_cap("users", RGW_CAP_WRITE);
}
- void execute() override;
+ void execute(optional_yield y) override;
const char* name() const override { return "add_user_caps"; }
};
-void RGWOp_Caps_Add::execute()
+void RGWOp_Caps_Add::execute(optional_yield y)
{
std::string uid_str;
std::string caps;
op_state.set_user_id(uid);
op_state.set_caps(caps);
- if (!store->svc()->zone->is_meta_master()) {
- bufferlist data;
- op_ret = forward_request_to_master(s, nullptr, store, data, nullptr);
- if (op_ret < 0) {
- ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
- return;
- }
+ bufferlist data;
+ op_ret = store->forward_request_to_master(s->user.get(), nullptr, data, nullptr, s->info, y);
+ if (op_ret < 0) {
+ ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
+ return;
}
- http_ret = RGWUserAdminOp_Caps::add(store, op_state, flusher);
+ op_ret = RGWUserAdminOp_Caps::add(store, op_state, flusher, y);
}
class RGWOp_Caps_Remove : public RGWRESTOp {
return caps.check_cap("users", RGW_CAP_WRITE);
}
- void execute() override;
+ void execute(optional_yield y) override;
const char* name() const override { return "remove_user_caps"; }
};
-void RGWOp_Caps_Remove::execute()
+void RGWOp_Caps_Remove::execute(optional_yield y)
{
std::string uid_str;
std::string caps;
op_state.set_user_id(uid);
op_state.set_caps(caps);
- if (!store->svc()->zone->is_meta_master()) {
- bufferlist data;
- op_ret = forward_request_to_master(s, nullptr, store, data, nullptr);
- if (op_ret < 0) {
- ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
- return;
- }
+ bufferlist data;
+ op_ret = store->forward_request_to_master(s->user.get(), nullptr, data, nullptr, s->info, y);
+ if (op_ret < 0) {
+ ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
+ return;
}
- http_ret = RGWUserAdminOp_Caps::remove(store, op_state, flusher);
+ op_ret = RGWUserAdminOp_Caps::remove(store, op_state, flusher, y);
}
struct UserQuotas {
UserQuotas() {}
- explicit UserQuotas(RGWUserInfo& info) : bucket_quota(info.bucket_quota),
+ explicit UserQuotas(RGWUserInfo& info) : bucket_quota(info.bucket_quota),
user_quota(info.user_quota) {}
void dump(Formatter *f) const {
return caps.check_cap("users", RGW_CAP_READ);
}
- void execute() override;
+ void execute(optional_yield y) override;
const char* name() const override { return "get_quota_info"; }
};
-void RGWOp_Quota_Info::execute()
+void RGWOp_Quota_Info::execute(optional_yield y)
{
RGWUserAdminOpState op_state;
RESTArgs::get_string(s, "quota-type", quota_type, "a_type);
if (uid_str.empty()) {
- http_ret = -EINVAL;
+ op_ret = -EINVAL;
return;
}
bool show_user = show_all || (quota_type == "user");
if (!(show_all || show_bucket || show_user)) {
- http_ret = -EINVAL;
+ op_ret = -EINVAL;
return;
}
op_state.set_user_id(uid);
RGWUser user;
- http_ret = user.init(store, op_state);
- if (http_ret < 0)
+ op_ret = user.init(store, op_state, y);
+ if (op_ret < 0)
return;
if (!op_state.has_existing_user()) {
- http_ret = -ERR_NO_SUCH_USER;
+ op_ret = -ERR_NO_SUCH_USER;
return;
}
RGWUserInfo info;
string err_msg;
- http_ret = user.info(info, &err_msg);
- if (http_ret < 0)
+ op_ret = user.info(info, &err_msg);
+ if (op_ret < 0)
return;
flusher.start(0);
return caps.check_cap("users", RGW_CAP_WRITE);
}
- void execute() override;
+ void execute(optional_yield y) override;
const char* name() const override { return "set_quota_info"; }
};
*
*/
-void RGWOp_Quota_Set::execute()
+void RGWOp_Quota_Set::execute(optional_yield y)
{
RGWUserAdminOpState op_state;
RESTArgs::get_string(s, "quota-type", quota_type, "a_type);
if (uid_str.empty()) {
- http_ret = -EINVAL;
+ op_ret = -EINVAL;
return;
}
if (!(set_all || set_bucket || set_user)) {
ldout(store->ctx(), 20) << "invalid quota type" << dendl;
- http_ret = -EINVAL;
+ op_ret = -EINVAL;
return;
}
if (use_http_params && set_all) {
ldout(store->ctx(), 20) << "quota type was not specified, can't set all quotas via http headers" << dendl;
- http_ret = -EINVAL;
+ op_ret = -EINVAL;
return;
}
op_state.set_user_id(uid);
RGWUser user;
- http_ret = user.init(store, op_state);
- if (http_ret < 0) {
- ldout(store->ctx(), 20) << "failed initializing user info: " << http_ret << dendl;
+ op_ret = user.init(store, op_state, y);
+ if (op_ret < 0) {
+ ldout(store->ctx(), 20) << "failed initializing user info: " << op_ret << dendl;
return;
}
if (!op_state.has_existing_user()) {
- http_ret = -ERR_NO_SUCH_USER;
+ op_ret = -ERR_NO_SUCH_USER;
return;
}
if (set_all) {
UserQuotas quotas;
- if ((http_ret = rgw_rest_get_json_input(store->ctx(), s, quotas, QUOTA_INPUT_MAX_LEN, NULL)) < 0) {
+ if ((op_ret = rgw_rest_get_json_input(store->ctx(), s, quotas, QUOTA_INPUT_MAX_LEN, NULL)) < 0) {
ldout(store->ctx(), 20) << "failed to retrieve input" << dendl;
return;
}
if (!use_http_params) {
bool empty;
- http_ret = rgw_rest_get_json_input(store->ctx(), s, quota, QUOTA_INPUT_MAX_LEN, &empty);
- if (http_ret < 0) {
+ op_ret = rgw_rest_get_json_input(store->ctx(), s, quota, QUOTA_INPUT_MAX_LEN, &empty);
+ if (op_ret < 0) {
ldout(store->ctx(), 20) << "failed to retrieve input" << dendl;
if (!empty)
return;
if (use_http_params) {
RGWUserInfo info;
string err_msg;
- http_ret = user.info(info, &err_msg);
- if (http_ret < 0) {
- ldout(store->ctx(), 20) << "failed to get user info: " << http_ret << dendl;
+ op_ret = user.info(info, &err_msg);
+ if (op_ret < 0) {
+ ldout(store->ctx(), 20) << "failed to get user info: " << op_ret << dendl;
return;
}
RGWQuotaInfo *old_quota;
}
string err;
- http_ret = user.modify(op_state, &err);
- if (http_ret < 0) {
- ldout(store->ctx(), 20) << "failed updating user info: " << http_ret << ": " << err << dendl;
+ op_ret = user.modify(op_state, y, &err);
+ if (op_ret < 0) {
+ ldout(store->ctx(), 20) << "failed updating user info: " << op_ret << ": " << err << dendl;
return;
}
}