/* we have zone now */
- ret = replace_region_with_zonegroup(dpp, y);
- if (ret < 0) {
- ldpp_dout(dpp, -1) << "failed converting region to zonegroup : ret "<< ret << " " << cpp_strerror(-ret) << dendl;
- return ret;
- }
-
auto zone_iter = zonegroup->zones.find(zone_params->get_id());
if (zone_iter == zonegroup->zones.end()) {
/* shouldn't happen if relying on period config */
return ret;
}
-/**
- * Replace all region configuration with zonegroup for
- * backward compatability
- * Returns 0 on success, -ERR# on failure.
- */
-int RGWSI_Zone::replace_region_with_zonegroup(const DoutPrefixProvider *dpp, optional_yield y)
-{
- /* copy default region */
- /* convert default region to default zonegroup */
- string default_oid = cct->_conf->rgw_default_region_info_oid;
- if (default_oid.empty()) {
- default_oid = default_region_info_oid;
- }
-
- RGWZoneGroup default_zonegroup;
- rgw_pool pool{default_zonegroup.get_pool(cct)};
- string oid = "converted";
- bufferlist bl;
-
- RGWSysObj sysobj = sysobj_svc->get_obj(rgw_raw_obj(pool, oid));
-
- int ret = sysobj.rop().read(dpp, &bl, y);
- if (ret < 0 && ret != -ENOENT) {
- ldpp_dout(dpp, 0) << __func__ << " failed to read converted: ret "<< ret << " " << cpp_strerror(-ret)
- << dendl;
- return ret;
- } else if (ret != -ENOENT) {
- ldpp_dout(dpp, 20) << "System already converted " << dendl;
- return 0;
- }
-
- string default_region;
- ret = default_zonegroup.init(dpp, cct, sysobj_svc, y, false, true);
- if (ret < 0) {
- ldpp_dout(dpp, 0) << __func__ << " failed init default region: ret "<< ret << " " << cpp_strerror(-ret) << dendl;
- return ret;
- }
- ret = default_zonegroup.read_default_id(dpp, default_region, y, true);
- if (ret < 0 && ret != -ENOENT) {
- ldpp_dout(dpp, 0) << __func__ << " failed reading old default region: ret "<< ret << " " << cpp_strerror(-ret) << dendl;
- return ret;
- }
-
- /* convert regions to zonegroups */
- list<string> regions;
- ret = list_regions(dpp, regions);
- if (ret < 0 && ret != -ENOENT) {
- ldpp_dout(dpp, 0) << __func__ << " failed to list regions: ret "<< ret << " " << cpp_strerror(-ret) << dendl;
- return ret;
- } else if (ret == -ENOENT || regions.empty()) {
- RGWZoneParams zoneparams(default_zone_name);
- int ret = zoneparams.init(dpp, cct, sysobj_svc, y);
- if (ret < 0 && ret != -ENOENT) {
- ldpp_dout(dpp, 0) << __func__ << ": error initializing default zone params: " << cpp_strerror(-ret) << dendl;
- return ret;
- }
- /* update master zone */
- RGWZoneGroup default_zg(default_zonegroup_name);
- ret = default_zg.init(dpp, cct, sysobj_svc, y);
- if (ret < 0 && ret != -ENOENT) {
- ldpp_dout(dpp, 0) << __func__ << ": error in initializing default zonegroup: " << cpp_strerror(-ret) << dendl;
- return ret;
- }
- if (ret != -ENOENT && default_zg.master_zone.empty()) {
- default_zg.master_zone = zoneparams.get_id();
- return default_zg.update(dpp, y);
- }
- return 0;
- }
-
- string master_region;
- rgw_zone_id master_zone;
- for (list<string>::iterator iter = regions.begin(); iter != regions.end(); ++iter) {
- if (*iter != default_zonegroup_name){
- RGWZoneGroup region(*iter);
- int ret = region.init(dpp, cct, sysobj_svc, y, true, true);
- if (ret < 0) {
- ldpp_dout(dpp, 0) << __func__ << " failed init region "<< *iter << ": " << cpp_strerror(-ret) << dendl;
- return ret;
- }
- if (region.is_master_zonegroup()) {
- master_region = region.get_id();
- master_zone = region.master_zone;
- }
- }
- }
-
- /* create realm if there is none.
- The realm name will be the region and zone concatenated
- realm id will be mds of its name */
- if (realm->get_id().empty() && !master_region.empty() && !master_zone.empty()) {
- string new_realm_name = master_region + "." + master_zone.id;
- unsigned char md5[CEPH_CRYPTO_MD5_DIGESTSIZE];
- char md5_str[CEPH_CRYPTO_MD5_DIGESTSIZE * 2 + 1];
- MD5 hash;
- // Allow use of MD5 digest in FIPS mode for non-cryptographic purposes
- hash.SetFlags(EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
- hash.Update((const unsigned char *)new_realm_name.c_str(), new_realm_name.length());
- hash.Final(md5);
- buf_to_hex(md5, CEPH_CRYPTO_MD5_DIGESTSIZE, md5_str);
- string new_realm_id(md5_str);
- RGWRealm new_realm(new_realm_id,new_realm_name);
- ret = new_realm.init(dpp, cct, sysobj_svc, y, false);
- if (ret < 0) {
- ldpp_dout(dpp, 0) << __func__ << " Error initing new realm: " << cpp_strerror(-ret) << dendl;
- return ret;
- }
- ret = new_realm.create(dpp, y);
- if (ret < 0 && ret != -EEXIST) {
- ldpp_dout(dpp, 0) << __func__ << " Error creating new realm: " << cpp_strerror(-ret) << dendl;
- return ret;
- }
- ret = new_realm.set_as_default(dpp, y);
- if (ret < 0) {
- ldpp_dout(dpp, 0) << __func__ << " Error setting realm as default: " << cpp_strerror(-ret) << dendl;
- return ret;
- }
- ret = realm->init(dpp, cct, sysobj_svc, y);
- if (ret < 0) {
- ldpp_dout(dpp, 0) << __func__ << " Error initing realm: " << cpp_strerror(-ret) << dendl;
- return ret;
- }
- ret = current_period->init(dpp, cct, sysobj_svc, realm->get_id(), y,
- realm->get_name());
- if (ret < 0) {
- ldpp_dout(dpp, 0) << __func__ << " Error initing current period: " << cpp_strerror(-ret) << dendl;
- return ret;
- }
- }
-
- list<string>::iterator iter;
- /* create zonegroups */
- for (iter = regions.begin(); iter != regions.end(); ++iter)
- {
- ldpp_dout(dpp, 0) << __func__ << " Converting " << *iter << dendl;
- /* check to see if we don't have already a zonegroup with this name */
- RGWZoneGroup new_zonegroup(*iter);
- ret = new_zonegroup.init(dpp, cct , sysobj_svc, y);
- if (ret == 0 && new_zonegroup.get_id() != *iter) {
- ldpp_dout(dpp, 0) << __func__ << " zonegroup "<< *iter << " already exists id " << new_zonegroup.get_id () <<
- " skipping conversion " << dendl;
- continue;
- }
- RGWZoneGroup zonegroup(*iter);
- zonegroup.set_id(*iter);
- int ret = zonegroup.init(dpp, cct, sysobj_svc, y, true, true);
- if (ret < 0) {
- ldpp_dout(dpp, 0) << __func__ << " failed init zonegroup: ret "<< ret << " " << cpp_strerror(-ret) << dendl;
- return ret;
- }
- zonegroup.realm_id = realm->get_id();
- /* fix default region master zone */
- if (*iter == default_zonegroup_name && zonegroup.master_zone.empty()) {
- ldpp_dout(dpp, 0) << __func__ << " Setting default zone as master for default region" << dendl;
- zonegroup.master_zone = default_zone_name;
- }
- ret = zonegroup.update(dpp, y);
- if (ret < 0 && ret != -EEXIST) {
- ldpp_dout(dpp, 0) << __func__ << " failed to update zonegroup " << *iter << ": ret "<< ret << " " << cpp_strerror(-ret)
- << dendl;
- return ret;
- }
- ret = zonegroup.update_name(dpp, y);
- if (ret < 0 && ret != -EEXIST) {
- ldpp_dout(dpp, 0) << __func__ << " failed to update_name for zonegroup " << *iter << ": ret "<< ret << " " << cpp_strerror(-ret)
- << dendl;
- return ret;
- }
- if (zonegroup.get_name() == default_region) {
- ret = zonegroup.set_as_default(dpp, y);
- if (ret < 0) {
- ldpp_dout(dpp, 0) << __func__ << " failed to set_as_default " << *iter << ": ret "<< ret << " " << cpp_strerror(-ret)
- << dendl;
- return ret;
- }
- }
- for (auto iter = zonegroup.zones.begin(); iter != zonegroup.zones.end();
- ++iter) {
- ldpp_dout(dpp, 0) << __func__ << " Converting zone" << iter->first << dendl;
- RGWZoneParams zoneparams(iter->first, iter->second.name);
- zoneparams.set_id(iter->first.id);
- zoneparams.realm_id = realm->get_id();
- ret = zoneparams.init(dpp, cct, sysobj_svc, y);
- if (ret < 0 && ret != -ENOENT) {
- ldpp_dout(dpp, 0) << __func__ << " failed to init zoneparams " << iter->first << ": " << cpp_strerror(-ret) << dendl;
- return ret;
- } else if (ret == -ENOENT) {
- ldpp_dout(dpp, 0) << __func__ << " zone is part of another cluster " << iter->first << " skipping " << dendl;
- continue;
- }
- zonegroup.realm_id = realm->get_id();
- ret = zoneparams.update(dpp, y);
- if (ret < 0 && ret != -EEXIST) {
- ldpp_dout(dpp, 0) << __func__ << " failed to update zoneparams " << iter->first << ": " << cpp_strerror(-ret) << dendl;
- return ret;
- }
- ret = zoneparams.update_name(dpp, y);
- if (ret < 0 && ret != -EEXIST) {
- ldpp_dout(dpp, 0) << __func__ << " failed to init zoneparams " << iter->first << ": " << cpp_strerror(-ret) << dendl;
- return ret;
- }
- }
-
- if (!current_period->get_id().empty()) {
- ret = current_period->add_zonegroup(dpp, zonegroup, y);
- if (ret < 0) {
- ldpp_dout(dpp, 0) << __func__ << " failed to add zonegroup to current_period: " << cpp_strerror(-ret) << dendl;
- return ret;
- }
- }
- }
-
- if (!current_period->get_id().empty()) {
- ret = current_period->update(dpp, y);
- if (ret < 0) {
- ldpp_dout(dpp, 0) << __func__ << " failed to update new period: " << cpp_strerror(-ret) << dendl;
- return ret;
- }
- ret = current_period->store_info(dpp, false, y);
- if (ret < 0) {
- ldpp_dout(dpp, 0) << __func__ << " failed to store new period: " << cpp_strerror(-ret) << dendl;
- return ret;
- }
- ret = current_period->reflect(dpp, y);
- if (ret < 0) {
- ldpp_dout(dpp, 0) << __func__ << " failed to update local objects: " << cpp_strerror(-ret) << dendl;
- return ret;
- }
- }
-
- for (auto const& iter : regions) {
- RGWZoneGroup zonegroup(iter);
- int ret = zonegroup.init(dpp, cct, sysobj_svc, y, true, true);
- if (ret < 0) {
- ldpp_dout(dpp, 0) << __func__ << " failed init zonegroup" << iter << ": ret "<< ret << " " << cpp_strerror(-ret) << dendl;
- return ret;
- }
- ret = zonegroup.delete_obj(dpp, y, true);
- if (ret < 0 && ret != -ENOENT) {
- ldpp_dout(dpp, 0) << __func__ << " failed to delete region " << iter << ": ret "<< ret << " " << cpp_strerror(-ret)
- << dendl;
- return ret;
- }
- }
-
- /* mark as converted */
- ret = sysobj.wop()
- .set_exclusive(true)
- .write(dpp, bl, y);
- if (ret < 0 ) {
- ldpp_dout(dpp, 0) << __func__ << " failed to mark cluster as converted: ret "<< ret << " " << cpp_strerror(-ret)
- << dendl;
- return ret;
- }
-
- return 0;
-}
-
/**
* Add new connection to connections map
* @param zonegroup_conn_map map which new connection will be added to