" show nvmeof gateways within (pool, group)",
"mon", "r")
+COMMAND("nvme-gw listeners"
+ " name=pool,type=CephString"
+ " name=group,type=CephString",
+ " show all nvmeof gateways listeners within (pool, group)",
+ "mon", "r")
+
// these are tell commands that were implemented as CLI commands in
// the broken pre-octopus way that we want to allow to work when a
// monitor has upgraded to octopus+ but the monmap min_mon_release is
getline(sstrm, rs);
mon.reply_command(op, err, rs, rdata, get_last_committed());
return true;
+ } else if (prefix == "nvme-gw listeners") {
+ std::string pool, group;
+ if (!f) {
+ f.reset(Formatter::create(format, "json-pretty", "json-pretty"));
+ }
+ cmd_getval(cmdmap, "pool", pool);
+ cmd_getval(cmdmap, "group", group);
+ auto group_key = std::make_pair(pool, group);
+ dout(10) << "nvme-gw listeners pool " << pool << " group " << group << dendl;
+
+ f->open_object_section("common");
+ f->dump_unsigned("epoch", map.epoch);
+ f->dump_string("pool", pool);
+ f->dump_string("group", group);
+
+ f->dump_unsigned("num gws", map.created_gws[group_key].size());
+ if (map.gw_epoch.find(group_key) != map.gw_epoch.end())
+ f->dump_unsigned("GW-epoch", map.gw_epoch[group_key]);
+ if (map.created_gws[group_key].size() == 0) {
+ f->close_section();
+ f->flush(rdata);
+ sstrm.str("");
+ } else {
+ get_gw_listeners(f.get(), group_key);
+ f->close_section();
+ f->flush(rdata);
+ sstrm.str("");
+ }
+ getline(sstrm, rs);
+ mon.reply_command(op, err, rs, rdata, get_last_committed());
+ return true;
}
return false;
}
+void NVMeofGwMon::get_gw_listeners(Formatter *f, std::pair<std::string, std::string>& group_key){
+ std::map<std::string, std::list<std::pair<BeaconListener, std::string>>> subsystem_listeners;
+ for (auto& gw_created_pair: map.created_gws[group_key]) {
+ auto& gw_id = gw_created_pair.first;
+ auto& state = gw_created_pair.second;
+ if (state.availability == gw_availability_t::GW_AVAILABLE) {
+ for (auto &subs: state.subsystems) {
+ auto& lst = subsystem_listeners[subs.nqn];
+ for (auto& listener : subs.listeners) {
+ lst.push_back({listener, gw_id});
+ }
+ }
+ }
+ }
+ f->open_object_section("Created listeners");
+ for (auto& listener_pair: subsystem_listeners) {
+ auto& subsystem_nqn = listener_pair.first;
+ auto& listeners = listener_pair.second;
+ f->open_array_section(subsystem_nqn);
+ for (auto& [listener, gw_id] : listeners) {
+ f->open_object_section("stat");
+ f->dump_string("address_family", listener.address_family);
+ f->dump_string("address", listener.address);
+ f->dump_string("svcid", listener.svcid);
+ f->dump_string("gw_id", gw_id);
+ f->close_section();
+ }
+ f->close_section();
+ }
+ f->close_section();
+}
+
bool NVMeofGwMon::prepare_command(MonOpRequestRef op)
{
dout(10) << dendl;