]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
common: *config diff get* option added
authoroliveiradan <doliveirabrz@gmail.com>
Fri, 19 Aug 2016 03:51:09 +0000 (21:51 -0600)
committeroliveiradan <doliveirabrz@gmail.com>
Thu, 4 May 2017 05:56:54 +0000 (23:56 -0600)
Signed-off-by: Daniel Oliveira <doliveira@suse.com>
src/common/ceph_context.cc
src/common/config.cc
src/common/config.h
src/test/common/test_context.cc

index 29aaa86bd115fc81dee720a2cd73817b47be588a..43b88d8f1b85a83172bf85bf01a75ad7a72e5652 100644 (file)
@@ -417,7 +417,7 @@ void CephContext::do_command(std::string command, cmdmap_t& cmdmap,
       f->dump_string("error", "syntax error: 'perf reset <var>'");
     } else {
      if(!_perf_counters_collection->reset(var))
-        f->dump_stream("error") << "Not find: " << var;
+       f->dump_stream("error") << "Not find: " << var;
      else
        f->dump_string("success", command + ' ' + var);
     }
@@ -438,8 +438,8 @@ void CephContext::do_command(std::string command, cmdmap_t& cmdmap,
           !(cmd_getval(this, cmdmap, "val", val))) {
         f->dump_string("error", "syntax error: 'config set <var> <value>'");
       } else {
-       // val may be multiple words
-       string valstr = str_join(val, " ");
+       // val may be multiple words
+       string valstr = str_join(val, " ");
         int r = _conf->set_val(var.c_str(), valstr.c_str());
         if (r < 0) {
           f->dump_stream("error") << "error setting '" << var << "' to '" << valstr << "': " << cpp_strerror(r);
@@ -452,17 +452,17 @@ void CephContext::do_command(std::string command, cmdmap_t& cmdmap,
     } else if (command == "config get") {
       std::string var;
       if (!cmd_getval(this, cmdmap, "var", var)) {
-       f->dump_string("error", "syntax error: 'config get <var>'");
+       f->dump_string("error", "syntax error: 'config get <var>'");
       } else {
-       char buf[4096];
-       memset(buf, 0, sizeof(buf));
-       char *tmp = buf;
-       int r = _conf->get_val(var.c_str(), &tmp, sizeof(buf));
-       if (r < 0) {
-           f->dump_stream("error") << "error getting '" << var << "': " << cpp_strerror(r);
-       } else {
-           f->dump_string(var.c_str(), buf);
-       }
+       char buf[4096];
+       memset(buf, 0, sizeof(buf));
+       char *tmp = buf;
+       int r = _conf->get_val(var.c_str(), &tmp, sizeof(buf));
+       if (r < 0) {
+         f->dump_stream("error") << "error getting '" << var << "': " << cpp_strerror(r);
+       } else {
+         f->dump_string(var.c_str(), buf);
+       }
       }
     } else if (command == "config diff") {
       md_config_t def_conf;
@@ -496,7 +496,38 @@ void CephContext::do_command(std::string command, cmdmap_t& cmdmap,
         f->dump_string("option", *p);
       }
       f->close_section(); // unknown
-    } else if (command == "log flush") {
+    }
+    else if (command == "config diff get") {
+      std::string ceph_setting;
+      if (!cmd_getval(this, cmdmap, "var", ceph_setting)) {
+        f->dump_string("error", "syntax error: 'config diff get <var>'");
+      } 
+      else {
+        md_config_t def_conf;
+        def_conf.set_val("cluster", _conf->cluster);
+        def_conf.name = _conf->name;
+        def_conf.set_val("host", _conf->host);
+        def_conf.apply_changes(NULL);
+
+        map<string, pair<string, string>> diff;
+        def_conf.diff_setting(_conf, &diff, ceph_setting, true);
+        f->open_object_section("diff");
+        f->open_object_section("current");
+
+        for (const auto& p : diff) {
+          f->dump_string(p.first.c_str(), p.second.second);
+        } 
+        f->close_section();   //-- current
+
+        f->open_object_section("defaults");
+        for (const auto& p : diff) {
+          f->dump_string(p.first.c_str(), p.second.first);
+        } 
+        f->close_section();   //-- defaults
+        f->close_section();   //-- diff
+      } //-- else if (!cmd_getval(this, cmdmap, "var", ceph_setting))
+    } //-- else if (command == "config diff get")
+    else if (command == "log flush") {
       _log->flush();
     }
     else if (command == "log dump") {
@@ -516,7 +547,6 @@ void CephContext::do_command(std::string command, cmdmap_t& cmdmap,
                         << "result is " << out->length() << " bytes" << dendl;
 }
 
-
 CephContext::CephContext(uint32_t module_type_, int init_flags_)
   : nref(1),
     _conf(new md_config_t()),
@@ -582,6 +612,9 @@ CephContext::CephContext(uint32_t module_type_, int init_flags_)
   _admin_socket->register_command("config diff",
       "config diff", _admin_hook,
       "dump diff of current config and default config");
+  _admin_socket->register_command("config diff get",
+      "config diff get name=var,type=CephString", _admin_hook,
+      "dump diff get <field>: dump diff of current and default config setting <field>");
   _admin_socket->register_command("log flush", "log flush", _admin_hook, "flush log entries to log file");
   _admin_socket->register_command("log dump", "log dump", _admin_hook, "dump recent log entries to log file");
   _admin_socket->register_command("log reopen", "log reopen", _admin_hook, "reopen log file");
@@ -620,6 +653,7 @@ CephContext::~CephContext()
   _admin_socket->unregister_command("config set");
   _admin_socket->unregister_command("config get");
   _admin_socket->unregister_command("config diff");
+  _admin_socket->unregister_command("config diff get");
   _admin_socket->unregister_command("log flush");
   _admin_socket->unregister_command("log dump");
   _admin_socket->unregister_command("log reopen");
index 768a552cc705127ae0892a3c95c7efcee3194d5d..1f3c8630c76bc69f9813aab74c54f67f3ca275c7 100644 (file)
@@ -1373,6 +1373,46 @@ void md_config_t::diff(
   }
 }
 
+void md_config_t::diff_setting(const md_config_t *other, 
+            map<string, pair<string, string>> *diff, 
+            const string& ceph_setting, bool show_unchanged)
+{
+  Mutex::Locker l(lock);
+
+  char local_buf[4096];
+  char other_buf[4096];
+  for (int i = 0; i < NUM_CONFIG_OPTIONS; i++) {
+    config_option *opt = &config_optionsp[i];
+    std::string ceph_setting_name(opt->name);
+    if (ceph_setting != opt->name) {
+      continue;
+    }
+    memset(local_buf, 0, sizeof(local_buf));
+    memset(other_buf, 0, sizeof(other_buf));
+
+    char *other_val = other_buf;
+    int err = other->get_val(opt->name, &other_val, sizeof(other_buf));
+    if (err < 0) {
+      continue;
+    } 
+
+    char *local_val = local_buf;
+    err = _get_val(opt->name, &local_val, sizeof(local_buf));
+    if (err != 0) {
+      continue;
+    } 
+    if (strcmp(local_val, other_val)) {
+      diff->insert(make_pair(ceph_setting, make_pair(local_val, other_val)));
+    }   
+    else {
+      if (show_unchanged) {
+        diff->insert(make_pair(ceph_setting, make_pair(local_val, other_val)));
+      }
+    } 
+    break;  
+  } 
+} 
+
 void md_config_t::complain_about_parse_errors(CephContext *cct)
 {
   ::complain_about_parse_errors(cct, &parse_errors);
index bbabc14a887082bf2910e3125494e0e4e5a31f16..ea4ce47b305295093160122fe920fca7a04be12d 100644 (file)
@@ -239,6 +239,12 @@ public:
   void diff(const md_config_t *other,
             map<string,pair<string,string> > *diff, set<string> *unknown);
 
+  /// obtain a diff between config values and another md_config_t
+  /// values for a specific setting. 
+  void diff_setting(const md_config_t*, 
+                std::map<std::string, std::pair<std::string, std::string>>*, 
+                const std::string&, bool show_unchanged = false);
+
   /// print/log warnings/errors from parsing the config
   void complain_about_parse_errors(CephContext *cct);
 
index d976758c6b7c35edaf1a7d4c3783d9e1103be6e4..ee0f646066625906e20ff0fd3fe9752da7649913 100644 (file)
@@ -52,6 +52,13 @@ TEST(CephContext, do_command)
     EXPECT_EQ("{\n    \"key\": \"value\"\n}\n", s);
   }
 
+  {
+    bufferlist out;
+    cct->do_command("config diff get", cmdmap, "xml", &out);
+    string s(out.c_str(), out.length());
+    EXPECT_EQ("<config_diff_get><diff><current><key>" + value + 
+      "</key></current><defaults><key></key></defaults></diff></config_diff_get>", s);
+  }
   cct->put();
 }