]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr: handle "module.set_config(.., None)" correctly
authorKefu Chai <kchai@redhat.com>
Wed, 2 Aug 2017 10:18:02 +0000 (18:18 +0800)
committerKefu Chai <kchai@redhat.com>
Wed, 2 Aug 2017 10:18:08 +0000 (18:18 +0800)
otherwise "ceph restful delete-key foo" would fail:

TypeError: ceph_config_set() argument 3 must be string, not None

Signed-off-by: Kefu Chai <kchai@redhat.com>
src/mgr/PyModules.cc
src/mgr/PyModules.h
src/mgr/PyState.cc

index 2961394bcb66158a2a89a747a54117c69b34e17c..d8b7b01cc6278dbdcea73f760931d157bf12a6d2 100644 (file)
@@ -577,7 +577,7 @@ PyObject *PyModules::get_config_prefix(const std::string &handle,
 }
 
 void PyModules::set_config(const std::string &handle,
-    const std::string &key, const std::string &val)
+    const std::string &key, const boost::optional<std::string>& val)
 {
   const std::string global_key = config_prefix + handle + "/" + key;
 
@@ -586,18 +586,25 @@ void PyModules::set_config(const std::string &handle,
     PyThreadState *tstate = PyEval_SaveThread();
     Mutex::Locker l(lock);
     PyEval_RestoreThread(tstate);
-    config_cache[global_key] = val;
+    if (val) {
+      config_cache[global_key] = *val;
+    } else {
+      config_cache.erase(global_key);
+    }
 
     std::ostringstream cmd_json;
-
     JSONFormatter jf;
     jf.open_object_section("cmd");
-    jf.dump_string("prefix", "config-key set");
-    jf.dump_string("key", global_key);
-    jf.dump_string("val", val);
+    if (val) {
+      jf.dump_string("prefix", "config-key set");
+      jf.dump_string("key", global_key);
+      jf.dump_string("val", *val);
+    } else {
+      jf.dump_string("prefix", "config-key del");
+      jf.dump_string("key", global_key);
+    }
     jf.close_section();
     jf.flush(cmd_json);
-
     set_cmd.run(&monc, cmd_json.str());
   }
   set_cmd.wait();
index 431abec76f0e3cf4b814ed51239dc5d7feb99a46..c7aad4e5df8859587ac1f7a353e3a930d6d44e16 100644 (file)
@@ -114,7 +114,7 @@ public:
   PyObject *get_config_prefix(const std::string &handle,
                              const std::string &prefix) const;
   void set_config(const std::string &handle,
-      const std::string &key, const std::string &val);
+      const std::string &key, const boost::optional<std::string> &val);
 
   void set_health_checks(const std::string& handle,
                         health_check_map_t&& checks);
index c8d3c73ff803fbe2d52fb3c0546cb237c19ec5b0..f03929102e4753ccad1c864bbe7c5375748763f0 100644 (file)
@@ -359,11 +359,14 @@ ceph_config_set(PyObject *self, PyObject *args)
   char *handle = nullptr;
   char *key = nullptr;
   char *value = nullptr;
-  if (!PyArg_ParseTuple(args, "sss:ceph_config_set", &handle, &key, &value)) {
+  if (!PyArg_ParseTuple(args, "ssz:ceph_config_set", &handle, &key, &value)) {
     return nullptr;
   }
-
-  global_handle->set_config(handle, key, value);
+  boost::optional<string> val;
+  if (value) {
+    val = value;
+  }
+  global_handle->set_config(handle, key, val);
 
   Py_RETURN_NONE;
 }