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 88f532c
Showing 1 changed file with 29 additions and 17 deletions.
46 changes: 29 additions & 17 deletions src/mgr/MgrPyModule.cc
Expand Up @@ -172,31 +172,43 @@ 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 tempClass = PyObject_GetAttrString(pModule, (const char*)"MgrModule");
Py_DECREF(pModule);
if (pClass == nullptr) {

auto pClassList = tempClass->tp_subclasses;

if (pClassList == 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;
int n = PyList_GET_SIZE(pClassList);

for (i = 0; i < n; i++){
PyTypeObject *pClass;
pClass = (PyTypeObject *)PyList_GET_ITEM(pClassList, i);

// 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;
}

}

Py_DECREF(pClassList);

return load_commands();
}

Expand Down

0 comments on commit 88f532c

Please sign in to comment.