}
};
-static int search_entities_by_zone(rgw::sal::ConfigStore* cfgstore,
- rgw_zone_id zone_id,
- RGWRealm *prealm,
- RGWZoneGroup *pzonegroup)
-{
- std::array<std::string, 128> realm_names;
- rgw::sal::ListResult<std::string> listing;
-
- do {
- int r = cfgstore->list_realm_names(dpp(), null_yield, listing.next,
- realm_names, listing);
- if (r < 0) {
- cerr << "failed to list realms: " << cpp_strerror(-r) << std::endl;
- return r;
- }
-
- for (const auto& realm_name : listing.entries) {
- RGWRealm realm;
- r = cfgstore->read_realm_by_name(dpp(), null_yield, realm_name,
- realm, nullptr);
- if (r < 0) {
- cerr << "WARNING: failed to load realm " << realm_name
- << ": " << cpp_strerror(r) << " ... skipping" << std::endl;
- continue;
- }
-
- RGWPeriod period;
- r = cfgstore->read_period(dpp(), null_yield, realm.current_period,
- std::nullopt, period);
- if (r < 0) {
- cerr << "WARNING: failed to load current period for realm "
- << realm_name << ": " << cpp_strerror(r) << " ... skipping" << std::endl;
- continue;
- }
-
- for (auto& [zid, zonegroup] : period.period_map.zonegroups) {
- if (zonegroup.zones.count(zone_id)) {
- *prealm = std::move(realm);
- *pzonegroup = std::move(zonegroup);
- return 0;
- }
- } // foreach zonegroup in period
- } // foreach realm_name in listing.entries
- } while (!listing.next.empty());
-
- return -ENOENT;
-}
-
-static int try_to_resolve_local_zone(rgw::sal::ConfigStore* cfgstore,
- string& zone_id, string& zone_name)
-{
- /* try to read zone info */
- RGWZoneParams zone;
- int r = rgw::read_zone(dpp(), null_yield, cfgstore,
- zone_id, zone_name, zone);
- if (r == -ENOENT) {
- ldpp_dout(dpp(), 20) << __func__ << "(): local zone not found (id=" << zone_id << ", name= " << zone_name << ")" << dendl;
- return r;
- }
-
- if (r < 0) {
- ldpp_dout(dpp(), 0) << __func__ << "(): unable to read zone (id=" << zone_id << ", name= " << zone_name << "): " << cpp_strerror(-r) << dendl;
-
- return r;
- }
-
- zone_id = zone.get_id();
- zone_name = zone.get_name();
-
- return 0;
-}
-
-static void check_set_consistent(const string& resolved_param,
- string& param,
- const string& param_name)
-{
- if (!param.empty() && param != resolved_param) {
- ldpp_dout(dpp(), 5) << "WARNING: " << param_name << " resolve mismatch. (param=" << param << ", resolved=" << resolved_param << ")" << dendl;
- return;
- }
-
- param = resolved_param;
- ldpp_dout(dpp(), 20) << __func__ << "(): resolved param: " << param_name << ": " << param << dendl;
-}
-
-
-static int try_to_resolve_local_entities(rgw::sal::ConfigStore* cfgstore,
- string& realm_id, string& realm_name,
- string& zonegroup_id, string& zonegroup_name,
- string& zone_id, string& zone_name)
-{
- /*
- * Try to figure out realm, zonegroup, and zone entities, based on provided params and local zone.
- *
- * First read the local zone info (for zone id/name). Then search existing realm and period
- * configuration and if found, update (but don't override) passed params.
- *
- */
-
- ldpp_dout(dpp(), 20) << __func__ << "(): before: realm_id=" << realm_id << " realm_name=" << realm_name << " zonegroup_id=" << zonegroup_id << " zonegroup_name=" << zonegroup_name << " zone_id=" << zone_id << " zone_name=" << zone_name << dendl;
- int r = try_to_resolve_local_zone(cfgstore, zone_id, zone_name);
- if (r == -ENOENT) {
- /* this local zone doesn't exist, abort */
- return 0;
- }
- if (r < 0) {
- return r;
- }
-
- if (zone_id.empty()) {
- /* not sure it's possible, but let's abort */
- return 0;
- }
-
- RGWRealm realm;
- RGWZoneGroup zonegroup;
- r = search_entities_by_zone(cfgstore, zone_id, &realm, &zonegroup);
- if (r == -ENOENT) {
- return 0; // not found
- }
- if (r < 0) {
- ldpp_dout(dpp(), 0) << "ERROR: error when searching for realm id (r=" << r << "), ignoring" << dendl;
- return r;
- }
-
- check_set_consistent(realm.get_id(), realm_id, "realm id (--realm-id)");
- check_set_consistent(realm.get_name(), realm_name, "realm name (--rgw-realm)");
- check_set_consistent(zonegroup.get_id(), zonegroup_id, "zonegroup id (--zonegroup-id)");
- check_set_consistent(zonegroup.get_name(), zonegroup_name, "zonegroup name (--rgw-zonegroup)");
-
- ldpp_dout(dpp(), 20) << __func__ << "(): after: realm_id=" << realm_id << " realm_name=" << realm_name << " zonegroup_id=" << zonegroup_id << " zonegroup_name=" << zonegroup_name << " zone_id=" << zone_id << " zone_name=" << zone_name << dendl;
-
- return 0;
-}
-
void init_realm_param(CephContext *cct, string& var, std::optional<string>& opt_var, const string& conf_name)
{
var = cct->_conf.get_val<string>(conf_name);
StoreDestructor store_destructor(driver);
if (raw_storage_op) {
- try_to_resolve_local_entities(cfgstore.get(), realm_id, realm_name,
- zonegroup_id, zonegroup_name,
- zone_id, zone_name);
-
-
switch (opt_cmd) {
case OPT::PERIOD_DELETE:
{