]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mon/ConfigKeyService: add 'prefix' arg to 'config-key dump ...'
authorSage Weil <sage@redhat.com>
Mon, 4 Dec 2017 22:50:18 +0000 (16:50 -0600)
committerSage Weil <sage@redhat.com>
Tue, 6 Mar 2018 20:44:48 +0000 (14:44 -0600)
Signed-off-by: Sage Weil <sage@redhat.com>
src/mon/ConfigKeyService.cc
src/mon/ConfigKeyService.h
src/mon/MonCommands.h
src/test/pybind/test_ceph_argparse.py

index 8ec09a1f0011178e280e94a03a67b0576111781f..f00dbfb5c15af893c3b24c9494099ae370cbe4b2 100644 (file)
@@ -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;
 
index 690e512500d66bac42eac1f42b197739479698af..23826397ebce26b9665e817f3fbeaca76fbfb642 100644 (file)
@@ -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);
 
index 0f3002fab87292f3f774e74962f2245ad47ce7bc..908b5c28bdc4e322e5dc13f4237de6332be0d813 100644 (file)
@@ -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")
 
 
 /*
index 065f7f6dccfce90dfc07a9ca1ad4d469d8f27285..b636cb5211566783c80e7449d42498fd75d2b0a4 100755 (executable)
@@ -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')