Skip to content

Commit

Permalink
Module classes are not forced to be called "Module"
Browse files Browse the repository at this point in the history
Signed-off-by: bhavishyagopesh <bhavishyagopesh@gmail.com>
  • Loading branch information
idealrealism committed Oct 9, 2017
1 parent b4e4ad3 commit d9a6378
Showing 1 changed file with 33 additions and 18 deletions.
51 changes: 33 additions & 18 deletions src/mgr/MgrPyModule.cc
Expand Up @@ -171,30 +171,45 @@ int MgrPyModule::load()
}

// Find the class
// TODO: let them call it what they want instead of just 'Module'
auto pClass = PyObject_GetAttrString(pModule, (const char*)"Module");
auto mgr_module_type = PyObject_GetAttrString(pModule, (const char*)"MgrModule");
Py_DECREF(pModule);
if (pClass == nullptr) {

auto locals = PyModule_GetDict(pModule);
PyObject *key, *value;
Py_ssize_t pos = 0;

if (mgr_module_type == nullptr) {
derr << "Class not found in module '" << module_name << "'" << dendl;
derr << handle_pyerror() << dendl;
return -EINVAL;
}


// Just using the module name as the handle, replace with a
// uuidish thing if needed
auto pyHandle = PyString_FromString(module_name.c_str());
auto pArgs = PyTuple_Pack(1, pyHandle);
pClassInstance = PyObject_CallObject(pClass, pArgs);
Py_DECREF(pClass);
Py_DECREF(pyHandle);
Py_DECREF(pArgs);
if (pClassInstance == nullptr) {
derr << "Failed to construct class in '" << module_name << "'" << dendl;
derr << handle_pyerror() << dendl;
return -EINVAL;
} else {
dout(1) << "Constructed class from module: " << module_name << dendl;
while (PyDict_Next(locals, &pos, &key, &value)) {

if (!PyType_Check(value)) {
continue;
}

if (PyObject_IsSubclass(value, mgr_module_type)) {

// Just using the module name as the handle, replace with a
// uuidish thing if needed
auto pClass = value;
auto pyHandle = PyString_FromString(module_name.c_str());
auto pArgs = PyTuple_Pack(1, pyHandle);
pClassInstance = PyObject_CallObject(pClass, pArgs);
Py_DECREF(pClass);
Py_DECREF(pyHandle);
Py_DECREF(pArgs);
if (pClassInstance == nullptr) {
derr << "Failed to construct class in '" << module_name << "'" << dendl;
derr << handle_pyerror() << dendl;
return -EINVAL;
} else {
dout(1) << "Constructed class from module: " << module_name << dendl;
}
}

}

return load_commands();
Expand Down

0 comments on commit d9a6378

Please sign in to comment.