bool VolumeWrap::handleMethod(qmf::AgentSession& session, qmf::AgentEvent& event) { int ret; if (*this != event.getDataAddr()) { return false; } const std::string& methodName(event.getMethodName()); qpid::types::Variant::Map args(event.getArguments()); if (methodName == "getXMLDesc") { const char *desc = virStorageVolGetXMLDesc(_volume_ptr, 0); if (!desc) { std::string err = FORMAT_ERR(_conn, "Error getting xml description for volume (virStorageVolGetXMLDesc).", &ret); raiseException(session, event, err, STATUS_USER + ret); } else { event.addReturnArgument("description", desc); session.methodSuccess(event); } return true; } if (methodName == "delete") { ret = virStorageVolDelete(_volume_ptr, 0); if (ret < 0) { std::string err = FORMAT_ERR(_conn, "Error deleting storage volume (virStorageVolDelete).", &ret); raiseException(session, event, err, STATUS_USER + ret); } else { update(); session.methodSuccess(event); } return true; } raiseException(session, event, ERROR_UNKNOWN_METHOD, STATUS_UNKNOWN_METHOD); return true; }
Manageable::status_t NodeWrap::ManagementMethod(uint32_t methodId, Args& args, std::string &errstr) { virDomainPtr domain_ptr; cout << "Method Received: " << methodId << endl; int ret; switch (methodId) { case _qmf::Node::METHOD_DOMAINDEFINEXML: { _qmf::ArgsNodeDomainDefineXML *io_args = (_qmf::ArgsNodeDomainDefineXML *) &args; domain_ptr = virDomainDefineXML(conn, io_args->i_xmlDesc.c_str()); if (!domain_ptr) { errstr = FORMAT_ERR(conn, "Error creating domain using xml description (virDomainDefineXML).", &ret); return STATUS_USER + ret; } else { // Now we have to check to see if this domain is actually new or not, because it's possible that // one already exists with this name/description and we just replaced it.. *ugh* for (std::vector<DomainWrap*>::iterator iter = domains.begin(); iter != domains.end();) { if (strcmp((*iter)->domain_name.c_str(), virDomainGetName(domain_ptr)) == 0) { // We're just replacing an existing domain, however I'm pretty sure the // old domain pointer becomes invalid at this point, so we should destroy // the old domain reference. The other option would be to replace it and // keep the object valid.. not sure which is better. printf("Old domain already exists, removing it in favor of new object."); delete(*iter); iter = domains.erase(iter); } else { iter++; } } DomainWrap *domain; try { domain = new DomainWrap(agent, this, domain_ptr, conn); domains.push_back(domain); io_args->o_domain = domain->GetManagementObject()->getObjectId(); } catch (int i) { delete domain; errstr = FORMAT_ERR(conn, "Error constructing domain object in virDomainDefineXML.", &ret); return STATUS_USER + i; } return STATUS_OK; } } case _qmf::Node::METHOD_STORAGEPOOLDEFINEXML: { _qmf::ArgsNodeStoragePoolDefineXML *io_args = (_qmf::ArgsNodeStoragePoolDefineXML *) &args; virStoragePoolPtr pool_ptr; pool_ptr = virStoragePoolDefineXML (conn, io_args->i_xmlDesc.c_str(), 0); if (pool_ptr == NULL) { errstr = FORMAT_ERR(conn, "Error defining storage pool using xml description (virStoragePoolDefineXML).", &ret); return STATUS_USER + ret; } PoolWrap *pool; try { pool = new PoolWrap(agent, this, pool_ptr, conn); pools.push_back(pool); io_args->o_pool = pool->GetManagementObject()->getObjectId(); } catch (int i) { delete pool; errstr = FORMAT_ERR(conn, "Error constructing pool object in virStoragePoolDefineXML.", &ret); return STATUS_USER + i; } return STATUS_OK; } case _qmf::Node::METHOD_STORAGEPOOLCREATEXML: { _qmf::ArgsNodeStoragePoolCreateXML *io_args = (_qmf::ArgsNodeStoragePoolCreateXML *) &args; virStoragePoolPtr pool_ptr; pool_ptr = virStoragePoolCreateXML (conn, io_args->i_xmlDesc.c_str(), 0); if (pool_ptr == NULL) { errstr = FORMAT_ERR(conn, "Error creating storage pool using xml description (virStoragePoolCreateXML).", &ret); return STATUS_USER + ret; } PoolWrap *pool; try { pool = new PoolWrap(agent, this, pool_ptr, conn); pools.push_back(pool); io_args->o_pool = pool->GetManagementObject()->getObjectId(); } catch (int i) { delete pool; errstr = FORMAT_ERR(conn, "Error constructing pool object in virStoragePoolCreateXML.", &ret); return STATUS_USER + i; } return STATUS_OK; } case _qmf::Node::METHOD_FINDSTORAGEPOOLSOURCES: { _qmf::ArgsNodeFindStoragePoolSources *io_args = (_qmf::ArgsNodeFindStoragePoolSources *) &args; char *xml_result; xml_result = virConnectFindStoragePoolSources(conn, io_args->i_type.c_str(), io_args->i_srcSpec.c_str(), 0); if (xml_result == NULL) { errstr = FORMAT_ERR(conn, "Error creating storage pool using xml description (virStoragePoolCreateXML).", &ret); return STATUS_USER + ret; } io_args->o_xmlDesc = xml_result; free(xml_result); return STATUS_OK; } } return STATUS_NOT_IMPLEMENTED; }