示例#1
0
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;
}
示例#2
0
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;
}