diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 1c7b61e39e5..918f4a9d56c 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -103,6 +103,7 @@ void _usage() cout << " zonegroup get show zone group info\n"; cout << " zonegroup modify modify an existing zonegroup\n"; cout << " zonegroup set set zone group info (requires infile)\n"; + cout << " zonegroup remove remove a zone from a zonegroup\n"; cout << " zonegroup rename rename a zone group\n"; cout << " zonegroup list list all zone groups set on this cluster\n"; cout << " zonegroup-map get show zonegroup-map\n"; @@ -313,7 +314,8 @@ enum { OPT_ZONEGROUP_MODIFY, OPT_ZONEGROUP_SET, OPT_ZONEGROUP_LIST, - OPT_ZONEGROUP_RENAME , + OPT_ZONEGROUP_REMOVE, + OPT_ZONEGROUP_RENAME, OPT_ZONEGROUPMAP_GET, OPT_ZONEGROUPMAP_SET, OPT_ZONEGROUPMAP_UPDATE, @@ -600,6 +602,8 @@ static int get_cmd(const char *cmd, const char *prev_cmd, const char *prev_prev_ return OPT_ZONEGROUP_LIST; if (strcmp(cmd, "set") == 0) return OPT_ZONEGROUP_SET; + if (strcmp(cmd, "remove") == 0) + return OPT_ZONEGROUP_REMOVE; if (strcmp(cmd, "rename") == 0) return OPT_ZONEGROUP_RENAME; } else if (strcmp(prev_cmd, "quota") == 0) { @@ -2401,6 +2405,7 @@ int main(int argc, char **argv) opt_cmd == OPT_ZONEGROUP_GET || opt_cmd == OPT_ZONEGROUP_LIST || opt_cmd == OPT_ZONEGROUP_SET || opt_cmd == OPT_ZONEGROUP_DEFAULT || opt_cmd == OPT_ZONEGROUP_RENAME || opt_cmd == OPT_ZONEGROUP_MODIFY || + opt_cmd == OPT_ZONEGROUP_REMOVE || opt_cmd == OPT_ZONEGROUPMAP_GET || opt_cmd == OPT_ZONEGROUPMAP_SET || opt_cmd == OPT_ZONEGROUPMAP_UPDATE || opt_cmd == OPT_ZONE_CREATE || opt_cmd == OPT_ZONE_DELETE || @@ -3087,6 +3092,44 @@ int main(int argc, char **argv) formatter->flush(cout); } break; + case OPT_ZONEGROUP_REMOVE: + { + RGWZoneGroup zonegroup(zonegroup_id, zonegroup_name); + int ret = zonegroup.init(g_ceph_context, store); + if (ret < 0) { + cerr << "failed to init zonegroup: " << cpp_strerror(-ret) << std::endl; + return -ret; + } + + if (zone_id.empty()) { + if (zone_name.empty()) { + cerr << "no --zone-id or --rgw-zone name provided" << std::endl; + return EINVAL; + } + // look up zone id by name + for (auto& z : zonegroup.zones) { + if (zone_name == z.second.name) { + zone_id = z.second.id; + break; + } + } + if (zone_id.empty()) { + cerr << "zone name " << zone_name << " not found in zonegroup " + << zonegroup.get_name() << std::endl; + return ENOENT; + } + } + + ret = zonegroup.remove_zone(zone_id); + if (ret < 0) { + cerr << "failed to remove zone: " << cpp_strerror(-ret) << std::endl; + return -ret; + } + + encode_json("zonegroup", zonegroup, formatter); + formatter->flush(cout); + } + break; case OPT_ZONEGROUP_RENAME: { if (zonegroup_new_name.empty()) { diff --git a/src/test/cli/radosgw-admin/help.t b/src/test/cli/radosgw-admin/help.t index 1fbaee2ec5f..aab33a49f41 100644 --- a/src/test/cli/radosgw-admin/help.t +++ b/src/test/cli/radosgw-admin/help.t @@ -55,6 +55,7 @@ zonegroup get show zone group info zonegroup modify modify an existing zonegroup zonegroup set set zone group info (requires infile) + zonegroup remove remove a zone from a zonegroup zonegroup rename rename a zone group zonegroup list list all zone groups set on this cluster zonegroup-map get show zonegroup-map