From e82f925eb333f22cfaa95a84136f0452a19821ca Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 4 Dec 2017 16:50:18 -0600 Subject: [PATCH] mon/ConfigKeyService: add 'prefix' arg to 'config-key dump ...' Signed-off-by: Sage Weil --- src/mon/ConfigKeyService.cc | 15 +++++++++++++-- src/mon/ConfigKeyService.h | 2 +- src/mon/MonCommands.h | 3 ++- src/test/pybind/test_ceph_argparse.py | 8 +++++++- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/mon/ConfigKeyService.cc b/src/mon/ConfigKeyService.cc index 8ec09a1f001..f00dbfb5c15 100644 --- a/src/mon/ConfigKeyService.cc +++ b/src/mon/ConfigKeyService.cc @@ -108,15 +108,24 @@ bool ConfigKeyService::store_has_prefix(const string &prefix) return false; } -void ConfigKeyService::store_dump(stringstream &ss) +void ConfigKeyService::store_dump(stringstream &ss, const string& prefix) { KeyValueDB::Iterator iter = mon->store->get_iterator(CONFIG_PREFIX); + dout(10) << __func__ << " prefix '" << prefix << "'" << dendl; + if (prefix.size()) { + iter->lower_bound(prefix); + } + JSONFormatter f(true); f.open_object_section("config-key store"); while (iter->valid()) { + if (prefix.size() && + iter->key().find(prefix) != 0) { + break; + } f.dump_string(iter->key().c_str(), iter->value().to_str()); iter->next(); } @@ -250,8 +259,10 @@ bool ConfigKeyService::service_dispatch(MonOpRequestRef op) ret = 0; } else if (prefix == "config-key dump") { + string prefix; + cmd_getval(g_ceph_context, cmdmap, "key", prefix); stringstream tmp_ss; - store_dump(tmp_ss); + store_dump(tmp_ss, prefix); rdata.append(tmp_ss); ret = 0; diff --git a/src/mon/ConfigKeyService.h b/src/mon/ConfigKeyService.h index 690e512500d..23826397ebc 100644 --- a/src/mon/ConfigKeyService.h +++ b/src/mon/ConfigKeyService.h @@ -35,7 +35,7 @@ class ConfigKeyService : public QuorumService MonitorDBStore::TransactionRef t, const string &prefix); void store_list(stringstream &ss); - void store_dump(stringstream &ss); + void store_dump(stringstream &ss, const string& prefix); bool store_exists(const string &key); bool store_has_prefix(const string &prefix); diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index 0f3002fab87..908b5c28bdc 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -1058,7 +1058,8 @@ COMMAND("config-key exists " \ COMMAND_WITH_FLAG("config-key list ", "list keys", "config-key", "r", "cli,rest", FLAG(DEPRECATED)) COMMAND("config-key ls ", "list keys", "config-key", "r", "cli,rest") -COMMAND("config-key dump", "dump keys and values", "config-key", "r", "cli,rest") +COMMAND("config-key dump " \ + "name=key,type=CephString,req=false", "dump keys and values (with optional prefix)", "config-key", "r", "cli,rest") /* diff --git a/src/test/pybind/test_ceph_argparse.py b/src/test/pybind/test_ceph_argparse.py index 065f7f6dccf..b636cb52115 100755 --- a/src/test/pybind/test_ceph_argparse.py +++ b/src/test/pybind/test_ceph_argparse.py @@ -71,6 +71,12 @@ class TestArgparse: 'string', 'toomany'])) + def check_0_or_1_string_arg(self, prefix, command): + self.assert_valid_command([prefix, command, 'string']) + self.assert_valid_command([prefix, command]) + assert_equal({}, validate_command(sigdict, [prefix, command, 'string', + 'toomany'])) + def check_1_or_more_string_args(self, prefix, command): assert_equal({}, validate_command(sigdict, [prefix, command])) @@ -1154,7 +1160,7 @@ class TestConfigKey(TestArgparse): self.check_1_string_arg('config-key', 'exists') def test_dump(self): - self.check_no_arg('config-key', 'dump') + self.check_0_or_1_string_arg('config-key', 'dump') def test_list(self): self.check_no_arg('config-key', 'list') -- 2.39.5