Hi all,<br><br>Here are listed the ONE driver's source code:<br>(I also attached the files to this email)<br><br>* one_conf.h<br>* one_conf.c<br>* one_driver.h<br>* one_driver.c<br><br>-----<br><br>Thanks, <br><br>Abel Míguez<br><br><br><br><br>source: one_conf.h<br><br>/*----------------------------------------------------------------------------------*/<br>/* Copyright 2002-2009, Distributed Systems Architecture Group, Universidad   <br> * Complutense de Madrid (dsa-research.org)                                   <br> *                                                                            <br> * This library is free software; you can redistribute it and/or<br> * modify it under the terms of the GNU Lesser General Public<br> * License as published by the Free Software Foundation; either<br> * version 2.1 of the License, or (at your option) any later version.<br> *<br> * This library is distributed in the hope that it will be useful,<br> * but WITHOUT ANY WARRANTY; without even the implied warranty of<br> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU<br> * Lesser General Public License for more details.<br> *<br> * You should have received a copy of the GNU Lesser General Public<br> * License along with this library; if not, write to the Free Software<br> * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA<br> */ <br>/*-----------------------------------------------------------------------------------*/<br><br>#ifndef ONE_CONF_H<br>#define ONE_CONF_H<br><br>#include <config.h><br><br>#include "internal.h"<br>#include "domain_conf.h"<br>#include "capabilities.h"<br>#include "threads.h"<br><br><br>struct one_driver{<br>    virMutex lock;<br><br>    virCapsPtr caps;<br>    virDomainObjList domains;<br>    int nextid;<br>}; <br><br>typedef struct one_driver one_driver_t;<br><br>virCapsPtr oneCapsInit(void);<br><br>int oneSubmitVM(virConnectPtr conn ,one_driver_t* driver, virDomainObjPtr  vm);<br><br>int xmlOneTemplate(virDomainDefPtr def, FILE* fd);<br><br>#define oneError(conn, dom, code, fmt...)                                    \<br>        virReportErrorHelper(conn, VIR_FROM_ONE, code, __FILE__,           \<br>                               __FUNCTION__, __LINE__, fmt)<br><br>#endif /* ONE_CONF_H */<br><br>+++++++++++++++++++++++++++++<br><br><br><br><br><br><br><br><br><br><br>source: one_conf.c<br><br>/*----------------------------------------------------------------------------------*/<br>/* Copyright 2002-2009, Distributed Systems Architecture Group, Universidad   <br> * Complutense de Madrid (dsa-research.org)                                   <br> *                                                                            <br> * This library is free software; you can redistribute it and/or<br> * modify it under the terms of the GNU Lesser General Public<br> * License as published by the Free Software Foundation; either<br> * version 2.1 of the License, or (at your option) any later version.<br> *<br> * This library is distributed in the hope that it will be useful,<br> * but WITHOUT ANY WARRANTY; without even the implied warranty of<br> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU<br> * Lesser General Public License for more details.<br> *<br> * You should have received a copy of the GNU Lesser General Public<br> * License along with this library; if not, write to the Free Software<br> * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA<br> */ <br>/*-----------------------------------------------------------------------------------*/<br><br>#include <config.h><br>#include <sys/utsname.h><br><br>#include "virterror_internal.h"<br>#include "one_conf.h"<br><br>/* --------------------------------------------------------------------------------- */<br>/* --------------------------------------------------------------------------------- */<br>/* --------------------------------------------------------------------------------- */<br><br>/**<br> * oneCapsInit initialize the driver capabilities<br> * @return a pointer to the driver capabilities NULL in case of error<br> */<br><br>virCapsPtr oneCapsInit(void)<br>{<br>    struct utsname  utsname;<br>    virCapsPtr      caps;<br>    virCapsGuestPtr guest;<br><br>    uname(&utsname);<br><br>    if ((caps = virCapabilitiesNew(utsname.machine,0,0)) == NULL)<br>    {<br>        goto no_memory;<br>    }<br><br>    virCapabilitiesSetMacPrefix(caps,(unsigned char[]){ 0x52, 0x54, 0x00 });<br><br>    if ((guest = virCapabilitiesAddGuest(caps,<br>                                         "hvm",<br>                                         utsname.machine,<br>                                         sizeof(int) == 4 ? 32 : 64,<br>                                         NULL,<br>                                         NULL,<br>                                         0,<br>                                         NULL)) == NULL)<br>    {<br>        goto no_memory;<br>    }<br><br>    if (virCapabilitiesAddGuestDomain(guest,<br>                                      "hvm",<br>                                      NULL,<br>                                      NULL,<br>                                      0,<br>                                      NULL) == NULL)<br>    {<br>        goto no_memory;<br>    }<br><br>    return caps;<br><br>no_memory:<br><br>    virCapabilitiesFree(caps);<br>    return NULL;<br>}<br><br>/* --------------------------------------------------------------------------------- */<br>/* --------------------------------------------------------------------------------- */<br>/* --------------------------------------------------------------------------------- */<br><br>/**<br> * oneSubmitVM generates an OpenNebula description file and submits the new VM<br> * @param driver the OpenNebula driver<br> * @param vm the virtual machine pointer<br> * @return the OpenNebula ID for the new VM or -1 in case of error<br> */<br><br>int oneSubmitVM(virConnectPtr    conn ATTRIBUTE_UNUSED,<br>                one_driver_t*    driver,<br>                virDomainObjPtr  vm)<br>{    <br>    FILE* fd=NULL;<br>    char  path[256];<br>    int   oneid;<br><br>    snprintf(path,256,"/tmp/one-%d",driver->nextid);<br><br>    fd=fopen(path,"w");<br><br>    if(fd==NULL)<br>    {<br>        perror("Creating a temporal description file:");<br>    return -1;<br>    }<br><br>    if(xmlOneTemplate(vm->def,fd))<br>    {<br>        unlink(path);<br>        fclose(fd);<br>        return -1;<br>    }<br><br>    fclose(fd);<br><br>    if( (oneid=c_oneAllocate(path))<0 )<br>    {<br>        oneError(conn, NULL, VIR_ERR_OPERATION_FAILED,<br>                     "Error submitting virtual machine to OpenNebula");<br>        unlink(path);             <br>           return -1;<br>    };<br><br>    unlink(path);<br><br>    return oneid;<br>};<br><br>/* --------------------------------------------------------------------------------- */<br>/* --------------------------------------------------------------------------------- */<br>/* --------------------------------------------------------------------------------- */<br><br>/**<br> * xmlOneTemplate Generate an OpenNebula template to deploy a VM from libvirt<br> * internal Domain definition.<br> * @param def  Internal libvirt Domain definition<br> * @param fd   ONE template file to create <br> * @return 0 if success<br> */<br><br>int xmlOneTemplate(virDomainDefPtr def, FILE* fd)<br>{<br>    char* buf;<br>    int   i;<br><br>    fprintf(fd,"#OpenNebula Template automatically generated by libvirt\n");<br>    <br>    fprintf(fd,"NAME = %s\n",def->name);<br>    fprintf(fd,"CPU = %ld\n",(def->vcpus));<br>    fprintf(fd,"MEMORY = %ld\n",(def->maxmem)/1024);<br>    <br>    /*Optional Booting OpenNebula Information:*/<br><br>    if( def->os.kernel )<br>    {<br>        fprintf(fd,"OS=[ kernel = \"%s\"",def->os.kernel);<br><br>        if(def->os.initrd)<br>            fprintf(fd,",\n    initrd = \"%s\"",def->os.initrd);<br>        if(def->os.cmdline)<br>            fprintf(fd,",\n    kernel_cmd = \"%s\"",def->os.cmdline);<br>        if(def->os.root)<br>            fprintf(fd,",\n    root  = \"%s\"",def->os.root);<br>        <br>    fprintf(fd," ]\n");<br>    }<br><br>    /* set Disks & NICS */<br><br>    for(i=0 ; i<def->ndisks ; i++)<br>    {<br>        if ( !def->disks[i] || !def->disks[i]->src || !def->disks[i]->src )<br>        {<br>            continue;<br>        }<br>    <br>        fprintf(fd, "DISK=[ source = \"%s\",\n"<br>                    "       target = \"%s\",\n"<br>                    "       readonly =",<br>                    def->disks[i]->src, <br>                    def->disks[i]->dst);<br><br>        if(def->disks[i]->readonly) <br>            fprintf(fd,"\"yes\"]\n");<br>        else <br>            fprintf(fd,"\"no\"]\n");<br>    }<br>    <br>    for(i=0 ; i< def->nnets ; i++)<br>    {<br>        if ( !def->nets[i] )<br>        {<br>            continue;<br>        }<br><br>        switch(def->nets[i]->type)<br>        {<br>            case VIR_DOMAIN_NET_TYPE_BRIDGE:<br>                fprintf(fd,"NIC=[ bridge =\"%s\",\n",def->nets[i]->data.bridge.brname);<br>                if(def->nets[i]->ifname)<br>                {<br>                    fprintf(fd,"      target =\"%s\",\n",def->nets[i]->ifname);<br>                }<br><br>            fprintf(fd,"      mac =\"%02x:%02x:%02x:%02x:%02x:%02x\" ]\n",<br>                        def->nets[i]->mac[0],def->nets[i]->mac[1],<br>                        def->nets[i]->mac[2],def->nets[i]->mac[3],<br>                        def->nets[i]->mac[4],def->nets[i]->mac[5]);  <br>                break;<br><br>            case VIR_DOMAIN_NET_TYPE_NETWORK:<br>                fprintf(fd,"NIC=[ network=\"%s\" ]\n",def->nets[i]->data.network.name);<br>                break;<br>        }<br>    }<br><br>    return 0;<br>};<br><br>+++++++++++++++++++++++++++++<br><br><br><br><br><br><br><br>source: one_driver.h<br><br>/*---------------------------------------------------------------------------*/<br>/* Copyright 2002-2009, Distributed Systems Architecture Group, Universidad   <br> * Complutense de Madrid (dsa-research.org)                                   <br> *                                                                            <br> * This library is free software; you can redistribute it and/or<br> * modify it under the terms of the GNU Lesser General Public<br> * License as published by the Free Software Foundation; either<br> * version 2.1 of the License, or (at your option) any later version.<br> *<br> * This library is distributed in the hope that it will be useful,<br> * but WITHOUT ANY WARRANTY; without even the implied warranty of<br> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU<br> * Lesser General Public License for more details.<br> *<br> * You should have received a copy of the GNU Lesser General Public<br> * License along with this library; if not, write to the Free Software<br> * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA<br> */ <br>/*---------------------------------------------------------------------------*/<br><br><br>#ifndef ONE_DRIVER_H<br>#define ONE_DRIVER_H<br><br>#include <config.h><br><br>int oneRegister(void);<br><br>#endif /* ONE_DRIVER_H */<br><br>+++++++++++++++++++++++++++++<br><br><br><br><br><br><br>source: one_driver.c<br><br>/*---------------------------------------------------------------------------*/<br>/* Copyright 2002-2009, Distributed Systems Architecture Group, Universidad   <br> * Complutense de Madrid (dsa-research.org)                                   <br> *                                                                            <br> * This library is free software; you can redistribute it and/or<br> * modify it under the terms of the GNU Lesser General Public<br> * License as published by the Free Software Foundation; either<br> * version 2.1 of the License, or (at your option) any later version.<br> *<br> * This library is distributed in the hope that it will be useful,<br> * but WITHOUT ANY WARRANTY; without even the implied warranty of<br> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU<br> * Lesser General Public License for more details.<br> *<br> * You should have received a copy of the GNU Lesser General Public<br> * License along with this library; if not, write to the Free Software<br> * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA<br> */ <br>/*---------------------------------------------------------------------------*/<br><br>#include <config.h><br><br>#include <fcntl.h><br>#include <sched.h><br>#include <sys/utsname.h><br>#include <stdbool.h><br>#include <string.h><br>#include <sys/types.h><br>#include <sys/socket.h><br>#include <sys/un.h><br>#include <sys/poll.h><br>#include <unistd.h><br>#include <wait.h><br>#include <sys/time.h><br><br>#include "virterror_internal.h"<br>#include "logging.h"<br>#include "datatypes.h"<br>#include "one_conf.h"<br>#include "one_driver.h"<br>#include "memory.h"<br>#include "util.h"<br>#include "bridge.h"<br>#include "veth.h"<br>#include "event.h"<br>#include "cgroup.h"<br><br>static int oneStart(void);<br>static int oneShutdown(void);<br>static int oneActive(void);<br><br>static void oneDriverLock(one_driver_t* driver)<br>{<br>    virMutexLock(&driver->lock);<br>}<br><br>static void oneDriverUnlock(one_driver_t* driver)<br>{<br>    virMutexUnlock(&driver->lock);<br>}<br><br>static one_driver_t *one_driver =NULL;<br><br><br>static virDrvOpenStatus oneOpen(virConnectPtr conn,<br>                                virConnectAuthPtr auth ATTRIBUTE_UNUSED,<br>                                int flags ATTRIBUTE_UNUSED)<br>{<br>     /* Verify uri was specified */<br>    if (conn->uri == NULL) {<br>        conn->uri = xmlParseURI("one:///");<br>        if (!conn->uri) {<br>            oneError(conn, NULL, VIR_ERR_NO_MEMORY, NULL);<br>            return VIR_DRV_OPEN_ERROR;<br>        }<br>    } else if (conn->uri->scheme == NULL ||<br>               STRNEQ(conn->uri->scheme, "one")) {<br>        goto declineConnection;<br>    }<br>    conn->privateData = one_driver;<br>    <br>    return VIR_DRV_OPEN_SUCCESS;<br><br>declineConnection:<br>    return VIR_DRV_OPEN_DECLINED;<br>}<br><br>static int oneClose(virConnectPtr conn)<br>{    <br>    conn->privateData = NULL;<br>    return 0;<br>}<br><br>static virDomainPtr oneDomainLookupByID(virConnectPtr conn,<br>                                        int id)<br>{<br>    one_driver_t *driver = (one_driver_t *)conn->privateData;<br>    virDomainPtr dom = NULL;<br>    virDomainObjPtr vm = NULL;<br><br>    oneDriverLock(driver);<br>    vm = virDomainFindByID(&driver->domains, id);<br>    oneDriverUnlock(driver);<br><br>    if (!vm) {<br>        oneError(conn, NULL, VIR_ERR_NO_DOMAIN, NULL);<br>        goto return_point;<br>    }<br><br>    dom = virGetDomain(conn, vm->def->name, vm->def->uuid);<br>    if (dom) {<br>        dom->id = vm->def->id;<br>    }<br><br>return_point:<br>    if(vm) {<br>        virDomainObjUnlock(vm);<br>    }<br>    <br>    return dom;<br>}<br><br>static virDomainPtr oneDomainLookupByUUID(virConnectPtr conn,<br>                                          const unsigned char *uuid)<br>{<br>    one_driver_t *driver = (one_driver_t *)conn->privateData;<br>    virDomainPtr dom = NULL;<br>    virDomainObjPtr vm = NULL;<br><br>    oneDriverLock(driver);<br>    vm = virDomainFindByUUID(&driver->domains, uuid);<br>    oneDriverUnlock(driver);<br>    if (!vm) {<br>        oneError(conn, NULL, VIR_ERR_NO_DOMAIN, NULL);<br>        goto return_point;<br>    }<br><br>    dom = virGetDomain(conn, vm->def->name, vm->def->uuid);<br>    if (dom) {<br>        dom->id = vm->def->id;<br>    }<br><br>return_point:<br>    if(vm) {<br>        virDomainObjUnlock(vm);<br>    }<br>    <br>    return dom;<br>}<br><br>static virDomainPtr oneDomainLookupByName(virConnectPtr conn,<br>                                          const char *name)<br>{<br>    one_driver_t *driver = (one_driver_t *)conn->privateData;<br>    virDomainObjPtr vm = NULL;<br>    virDomainPtr dom=NULL;<br><br>    oneDriverLock(driver);<br>    vm = virDomainFindByName(&driver->domains, name);<br>    oneDriverUnlock(driver);<br><br>    if (!vm) {<br>        oneError(conn, NULL, VIR_ERR_NO_DOMAIN, NULL);<br>        goto return_point;<br>    }<br><br>    dom = virGetDomain(conn, vm->def->name, vm->def->uuid);<br>    if (dom) {<br>        dom->id = vm->def->id;<br>    }<br>return_point:<br>    if(vm) {<br>        virDomainObjUnlock(vm);<br>    }<br>    <br>    return dom;<br>}<br><br>static int oneListDomains(virConnectPtr conn, int *ids, int nids)<br>{<br>    one_driver_t *driver = (one_driver_t *)conn->privateData;<br>    int got = 0, i;<br><br>    oneDriverLock(driver);<br>    for (i = 0 ; i < driver->domains.count && got < nids ; i++){<br>        if (virDomainIsActive(driver->domains.objs[i]))<br>            ids[got++] = driver->domains.objs[i]->def->id;<br>    }<br>    oneDriverUnlock(driver);<br><br>    return got;<br>}<br><br>static int oneNumDomains(virConnectPtr conn)<br>{<br>    one_driver_t *driver = (one_driver_t *)conn->privateData;<br>    int n = 0, i;<br><br>    oneDriverLock(driver);<br>    for (i = 0 ; i < driver->domains.count ; i++)<br>        if (virDomainIsActive(driver->domains.objs[i]))<br>            n++;<br>    oneDriverUnlock(driver);<br><br>    return n;<br>}<br><br>static int oneListDefinedDomains(virConnectPtr conn,<br>                                 char **const names, int nnames) {<br>    one_driver_t *driver = (one_driver_t *)conn->privateData;<br>    int got = 0, i;<br><br>    oneDriverLock(driver);<br>    for (i = 0 ; i < driver->domains.count && got < nnames ; i++) {<br>        if (!virDomainIsActive(driver->domains.objs[i])) {<br>            if (!(names[got++] = strdup(driver->domains.objs[i]->def->name))) {<br>                oneError(conn, NULL, VIR_ERR_NO_MEMORY,<br>                     "%s", _("failed to allocate space for VM name string"));<br>                goto cleanup;<br>            }<br>        }<br>    }<br>    oneDriverUnlock(driver);<br>    <br>    return got;<br><br> cleanup:<br>    for (i = 0 ; i < got ; i++)<br>        VIR_FREE(names[i]);<br>    oneDriverUnlock(driver);<br>    <br>    return -1;<br>}<br><br>static int oneNumDefinedDomains(virConnectPtr conn)<br>{<br>    one_driver_t *driver = (one_driver_t *)conn->privateData;<br>    int n = 0, i;<br><br>    oneDriverLock(driver);<br>    for (i = 0 ; i < driver->domains.count ; i++)<br>        if (!virDomainIsActive(driver->domains.objs[i]))<br>            n++;<br>    oneDriverUnlock(driver);<br><br>    return n;<br>}<br><br>static virDomainPtr oneDomainDefine(virConnectPtr conn, const char *xml)<br>{<br>    one_driver_t *driver = (one_driver_t *)conn->privateData;<br>    virDomainDefPtr def;<br>    virDomainObjPtr vm;<br>    virDomainPtr dom=NULL;<br><br>    oneDriverLock(driver);<br>    if (!(def = virDomainDefParseString(conn, driver->caps, xml, <br>                                        VIR_DOMAIN_XML_INACTIVE)))<br>        goto return_point;<br><br>    if (!(vm = virDomainAssignDef(conn, &driver->domains, def))) {<br>        virDomainDefFree(def);<br>        goto return_point;<br>    }<br><br>    vm->def->id = -1;<br>    vm->persistent = 1;<br>    dom = virGetDomain(conn, vm->def->name, vm->def->uuid);<br>    if (dom) {<br>        dom->id = vm->def->id;<br>    }<br>    virDomainObjUnlock(vm);<br><br>return_point:<br>    oneDriverUnlock(driver);<br>    return dom;<br>}<br><br><br>static int oneDomainUndefine(virDomainPtr dom)<br>{<br>    one_driver_t *driver = (one_driver_t *)dom->conn->privateData;<br>    virDomainObjPtr vm = NULL;<br>    int ret=-1;<br>    <br>    oneDriverLock(driver);<br>    vm =virDomainFindByUUID(&driver->domains, dom->uuid);<br>    if (!vm) {<br>        oneError(dom->conn, NULL, VIR_ERR_INVALID_DOMAIN,<br>                 "%s", _("no domain with matching uuid"));<br>        goto return_point;<br>    }<br><br>    if (!vm->persistent) {<br>        oneError(dom->conn, dom, VIR_ERR_INTERNAL_ERROR,<br>                 "%s", _("cannot undefine transient domain"));<br>        goto return_point;<br>    }<br>    virDomainRemoveInactive(&driver->domains, vm);<br>    ret=0;<br><br>return_point:<br>    oneDriverUnlock(driver);<br>    return ret;<br>}<br><br>static int oneDomainGetInfo(virDomainPtr dom,<br>                            virDomainInfoPtr info)<br>{<br>    one_driver_t *driver = (one_driver_t *)dom->conn->privateData;<br>    struct timeval tv;<br>    virDomainObjPtr vm;<br>    oneDriverLock(driver);<br>    vm= virDomainFindByUUID(&driver->domains, dom->uuid);<br>    oneDriverUnlock(driver);<br><br>    if (!vm) {<br>        oneError(dom->conn,NULL, VIR_ERR_INVALID_DOMAIN,<br>                 "%s", _("no domain with matching uuid"));<br>        return -1;<br>    }<br><br>    if(gettimeofday(&tv,NULL)<0) {<br>        oneError(dom->conn,NULL, VIR_ERR_INTERNAL_ERROR,<br>                    "%s",_("getting time of day"));<br>        virDomainObjUnlock(vm);<br>        return -1;<br>    }<br><br>    if (!virDomainIsActive(vm)) {<br>        info->cpuTime = 0;<br>    } else {<br>        char vm_info[257];<br>        c_oneVmInfo(vm->pid,vm_info,256);<br>        //State:<br>        char* cptr = strstr(vm_info,"STATE");<br>        cptr = index(cptr, ':');<br>        cptr++;<br>        int one_state=atoi(cptr);<br>        <br>        switch(one_state) {<br>            case 3:                                     /** running */<br>                if (vm->state!=VIR_DOMAIN_SHUTDOWN)<br>                    vm->state=VIR_DOMAIN_RUNNING;<br>                break;<br>            case 5:                                     /** pause */<br>                vm->state=VIR_DOMAIN_PAUSED;<br>                break;<br>            case 6:                                     /** done */<br>                vm->state=VIR_DOMAIN_SHUTOFF;<br>                vm->def->id=-1;<br>                break;<br>            case 7:                                     /** error */<br>                vm->state=VIR_DOMAIN_CRASHED;<br>                break;<br>            default: <br>                break;<br>        };<br>        //Memory:<br>        cptr=strstr(vm_info,"MEMORY");<br>        cptr=index(cptr,':');<br>        cptr++;<br>        vm->def->memory = atoi(cptr);<br><br>        //run time:<br>        cptr=strstr(vm_info,"START TIME");<br>        cptr=index(cptr,':');<br>        cptr++;<br>        long starttime = atol(cptr);<br>        info->cpuTime = (tv.tv_sec - starttime) *1000ll *1000ll *1000ll;<br><br>    }<br>    <br>    info->state = vm->state;<br>    info->maxMem = vm->def->maxmem;<br>    info->memory = vm->def->memory;<br>    info->nrVirtCpu = vm->def->vcpus;<br><br>    virDomainObjUnlock(vm);<br>    return 0;<br>}<br><br>static char *oneGetOSType(virDomainPtr dom)<br>{<br><br>    one_driver_t *driver = (one_driver_t *)dom->conn->privateData;<br>    virDomainObjPtr vm = NULL;<br><br>    oneDriverLock(driver);<br>    vm =virDomainFindByUUID(&driver->domains, dom->uuid);<br>    oneDriverUnlock(driver);<br>    if (!vm) {<br>        oneError(dom->conn, NULL, VIR_ERR_INVALID_DOMAIN,<br>                 "%s", _("no domain with matching uuid"));<br>        return NULL;<br>    }<br><br>    virDomainObjUnlock(vm);<br>    return strdup(vm->def->os.type);<br>}<br><br>static int oneDomainStart(virDomainPtr dom)<br>{<br>    virConnectPtr conn = dom->conn;<br>    one_driver_t *driver = (one_driver_t *)(conn->privateData);<br>    virDomainObjPtr vm;<br>    int ret = -1;<br>    int oneid;<br>    int rc;<br>    char* logfile=NULL;<br>   <br>    oneDriverLock(driver);<br>    vm = virDomainFindByName(&driver->domains, dom->name);<br><br>    if (!vm) {<br>        oneError(conn, NULL, VIR_ERR_INVALID_DOMAIN,<br>                 _("no domain named %s"), dom->name);<br>        goto return_point;<br>    }<br>    if((oneid = oneSubmitVM(dom->conn,driver,vm)) < 0) {<br>        goto return_point;<br>    }<br>    vm->pid=oneid;<br>    vm->def->id=driver->nextid++;<br>    vm->state=VIR_DOMAIN_BLOCKED;<br>    ret=0;<br><br>return_point:<br>    if(vm)<br>        virDomainObjUnlock(vm);<br>    oneDriverUnlock(driver);<br>    <br>    return ret;<br>}<br><br>static virDomainPtr<br>oneDomainCreateAndStart(virConnectPtr conn,<br>                        const char *xml,<br>                        unsigned int flags ATTRIBUTE_UNUSED) {<br>    one_driver_t *driver = (one_driver_t *)conn->privateData;<br>    virDomainObjPtr vm;<br>    virDomainDefPtr def;<br>    virDomainPtr dom = NULL;<br>    int oneid;<br><br>    oneDriverLock(driver);<br>    if (!(def = virDomainDefParseString(conn, driver->caps, xml,<br>                                         VIR_DOMAIN_XML_INACTIVE)))<br>        goto return_point;<br><br>    vm = virDomainFindByName(&driver->domains, def->name);<br>    <br>    if (vm) {<br>        oneError(conn,NULL, VIR_ERR_OPERATION_FAILED,<br>            _("Already an OpenNebula VM active with the name: \"%s\" id: %d "),<br>            def->name,def->id);<br>        goto return_point;<br>    }<br>    <br>    if (!(vm = virDomainAssignDef(conn, &driver->domains, def))) {<br>        virDomainDefFree(def);<br>        goto return_point;<br>    }<br>    if ((oneid = oneSubmitVM(conn, driver, vm)) < 0) {<br>        virDomainRemoveInactive(&driver->domains, vm);<br>        vm=NULL;<br>        goto return_point;<br>    }<br>    <br>    vm->def->id=driver->nextid++;<br>    vm->persistent=0;<br>    vm->pid=oneid;<br>    vm->state=VIR_DOMAIN_BLOCKED;<br><br>    dom = virGetDomain(conn, vm->def->name, vm->def->uuid);<br>    if (dom) {<br>        dom->id = vm->def->id;<br>    }<br>    <br>return_point:<br>    if(vm)<br>        virDomainObjUnlock(vm);<br>    oneDriverUnlock(driver);<br>    <br>    return dom;<br>}<br><br>static int oneDomainShutdown(virDomainPtr dom)<br>{<br>    one_driver_t *driver = (one_driver_t*)dom->conn->privateData;<br>    virDomainObjPtr vm;<br>    int ret=-1;<br><br>    oneDriverLock(driver);<br>    if((vm=virDomainFindByID(&driver->domains, dom->id))) {<br>        if(!(c_oneShutdown(vm->pid) ) ) {<br>            vm->state=VIR_DOMAIN_SHUTDOWN;<br>            ret= 0;<br>            if (!vm->persistent) {<br>                virDomainRemoveInactive(&driver->domains, vm); <br>                vm = NULL;<br>            }<br>            goto return_point;<br>        }<br>        oneError(dom->conn, NULL, VIR_ERR_OPERATION_FAILED,<br>                "Domain Shutdown",NULL);<br>        goto return_point;<br>    }<br>    oneError(dom->conn,NULL, VIR_ERR_INVALID_DOMAIN,<br>                 _("no domain with id %d"), dom->id);<br>        goto return_point;<br><br>return_point:<br><br>    if(vm)<br>        virDomainObjUnlock(vm);<br>    oneDriverUnlock(driver);<br>    <br>    return ret;<br>}<br><br>static int oneDomainDestroy(virDomainPtr dom)<br>{<br>    one_driver_t *driver = (one_driver_t*)dom->conn->privateData;<br>    virDomainObjPtr vm;<br>    int ret=-1;<br><br>    oneDriverLock(driver);<br>    vm= virDomainFindByID(&driver->domains, dom->id);<br>    if (!vm) {<br>        oneError(dom->conn, NULL, VIR_ERR_INVALID_DOMAIN,<br>                _("no domain with id %d"), dom->id);<br>        goto return_point;<br>    }<br>    if(c_oneShutdown(vm->pid)) {<br>        oneError(dom->conn, NULL, VIR_ERR_OPERATION_FAILED,<br>                "Domain Shutdown",NULL);<br>        goto return_point;<br>    }<br>    if(!vm->persistent) {<br>        virDomainRemoveInactive(&driver->domains,vm);<br>        vm=NULL;<br>    }<br>    ret=0;<br><br>return_point:<br>    if(vm)<br>        virDomainObjUnlock(vm);<br><br>    oneDriverUnlock(driver);<br>    <br>    return ret;<br>}<br><br>static int oneDomainSuspend(virDomainPtr dom)<br>{<br>    one_driver_t* driver=dom->conn->privateData;<br>    virDomainObjPtr vm;<br>    int ret=-1;<br>    <br>    oneDriverLock(driver);<br>    if ((vm=virDomainFindByID(&driver->domains,dom->id))){<br><br>    if (vm->state == VIR_DOMAIN_RUNNING) {<br>        if( !(c_oneSuspend(vm->pid)) ) {<br>            vm->state=VIR_DOMAIN_PAUSED;<br>            ret=0;<br>            goto return_point;<br>        }<br>        oneError(dom->conn, NULL, VIR_ERR_OPERATION_FAILED,<br>                "%s", "failed to pause domain");<br>        goto return_point;<br>    }<br>    oneError(dom->conn,NULL,VIR_ERR_OPERATION_FAILED,<br>              "%s", "domain is not running");<br>    } else {<br>        oneError(dom->conn, NULL, VIR_ERR_INVALID_DOMAIN,<br>                "no domain with matching id %d", dom->id);<br>    }<br><br>return_point:<br>    if(vm)<br>        virDomainObjUnlock(vm);<br>    oneDriverUnlock(driver);<br>    <br>    return ret;<br>};<br><br>static int oneDomainResume(virDomainPtr dom)<br>{<br>    one_driver_t* driver=dom->conn->privateData;<br>    virDomainObjPtr vm;<br>    int ret=-1;<br><br>    oneDriverLock(driver);<br>    if ((vm=virDomainFindByID(&driver->domains,dom->id))) {<br>        if (vm->state == VIR_DOMAIN_PAUSED) {<br>            if( !(c_oneResume(vm->pid)) ) {<br>                vm->state=VIR_DOMAIN_RUNNING;<br>                ret=0;<br>                goto return_point;<br>            }                                                                               <br>            oneError(dom->conn, NULL, VIR_ERR_OPERATION_FAILED,<br>                                       "%s", "failed to resume ");<br>            goto return_point;<br>        } <br>        oneError(dom->conn,NULL,VIR_ERR_OPERATION_FAILED,<br>                                 "%s", " domain is not paused ");<br>    } else {<br>        oneError(dom->conn, NULL, VIR_ERR_INVALID_DOMAIN,<br>                          "no domain with matching id %d", dom->id);<br>}<br><br>return_point:<br>    if(vm)<br>        virDomainObjUnlock(vm);<br>    oneDriverUnlock(driver);<br>    <br>    return ret;<br>};<br><br>static int oneStartup(void){<br>    int i;<br><br>    if (VIR_ALLOC(one_driver) < 0) {<br>        return -1;<br>    }<br><br>    if(virMutexInit(&one_driver->lock)<0){<br>        VIR_FREE(one_driver);<br>        return -1;<br>    }<br>    <br>    c_oneStart();<br>    oneDriverLock(one_driver);<br>    one_driver->nextid=1;<br>    if ((one_driver->caps = oneCapsInit()) == NULL) {<br>        oneDriverUnlock(one_driver);<br>        VIR_FREE(one_driver);<br>        return -1;<br>    }<br>   oneDriverUnlock(one_driver);<br>    <br>    return 0;<br>}<br><br>static int oneShutdown(void){<br>    if (one_driver == NULL)<br>        return(-1);<br><br>    oneDriverLock(one_driver);<br>    virDomainObjListFree(&one_driver->domains);<br><br>    virCapabilitiesFree(one_driver->caps);<br>    oneDriverUnlock(one_driver);<br>    virMutexDestroy(&one_driver->lock);<br>    VIR_FREE(one_driver);<br>    one_driver = NULL;<br>    c_oneFree();<br>    return 0;<br>}<br><br>static int oneActive(void){<br>    unsigned int i;<br>    int active = 0; <br><br>    if (one_driver == NULL)<br>        return(0);<br><br>    oneDriverLock(one_driver);<br>    for (i = 0 ; i < one_driver->domains.count ; i++) {<br>        virDomainObjLock(one_driver->domains.objs[i]);<br>        if (virDomainIsActive(one_driver->domains.objs[i]))<br>            active = 1; <br>        virDomainObjUnlock(one_driver->domains.objs[i]);<br>    }    <br>    oneDriverUnlock(one_driver);<br><br>    return active;<br><br>}<br><br>static int oneVersion(virConnectPtr conn ATTRIBUTE_UNUSED, unsigned long *hvVer)<br>{<br>    *hvVer = 1;<br>    return 0;<br>}<br><br><br>static int oneGetAutostart(virConnectPtr conn ATTRIBUTE_UNUSED)<br>{<br>    return 0;<br>}<br><br>/* Function Tables */<br>static virDriver oneDriver = {<br>    VIR_DRV_ONE, /* the number virDrvNo */<br>    "ONE", /* the name of the driver */<br>    oneOpen, /* open */<br>    oneClose, /* close */<br>    NULL, /* supports_feature */<br>    NULL, /* type */<br>    oneVersion, /* version */<br>    NULL, /* getHostname */<br>    NULL, /* getURI */<br>    NULL, /* getMaxVcpus */<br>    NULL, /* nodeGetInfo */<br>    NULL, /* getCapabilities */<br>    oneListDomains, /* listDomains */<br>    oneNumDomains, /* numOfDomains */<br>    oneDomainCreateAndStart, /* domainCreateXML */<br>    oneDomainLookupByID, /* domainLookupByID */<br>    oneDomainLookupByUUID, /* domainLookupByUUID */<br>    oneDomainLookupByName, /* domainLookupByName */<br>    oneDomainSuspend, /* domainSuspend */<br>    oneDomainResume, /* domainResume */<br>    oneDomainShutdown, /* domainShutdown */<br>    NULL, /* domainReboot */<br>    oneDomainDestroy, /* domainDestroy */<br>    oneGetOSType, /* domainGetOSType */<br>    NULL, /* domainGetMaxMemory */<br>    NULL, /* domainSetMaxMemory */<br>    NULL, /* domainSetMemory */<br>    oneDomainGetInfo, /* domainGetInfo */<br>    NULL, /* domainSave */<br>    NULL, /* domainRestore */<br>    NULL, /* domainCoreDump */<br>    NULL, /* domainSetVcpus */<br>    NULL, /* domainPinVcpu */<br>    NULL, /* domainGetVcpus */<br>    NULL, /* domainGetMaxVcpus */<br>    NULL, /* domainGetSecurityLabel */<br>    NULL, /* nodeGetSecurityModel */<br>    NULL, /* domainDumpXML */<br>    oneListDefinedDomains, /* listDefinedDomains */<br>    oneNumDefinedDomains, /* numOfDefinedDomains */<br>    oneDomainStart, /* domainCreate */<br>    oneDomainDefine, /* domainDefineXML */<br>    oneDomainUndefine, /* domainUndefine */<br>    NULL, /* domainAttachDevice */<br>    NULL, /* domainDetachDevice */<br>    oneGetAutostart, /* domainGetAutostart */<br>    NULL, /* domainSetAutostart */<br>    NULL, /* domainGetSchedulerType */<br>    NULL, /* domainGetSchedulerParameters */<br>    NULL, /* domainSetSchedulerParameters */<br>    NULL, /* domainMigratePrepare */<br>    NULL, /* domainMigratePerform */<br>    NULL, /* domainMigrateFinish */<br>    NULL, /* domainBlockStats */<br>    NULL, /* domainInterfaceStats */<br>    NULL, /* domainBlockPeek */<br>    NULL, /* domainMemoryPeek */<br>    NULL, /* nodeGetCellsFreeMemory */<br>    NULL, /* getFreeMemory */<br>    NULL, /* domainEventRegister */<br>    NULL, /* domainEventDeregister */<br>    NULL, /* domainMigratePrepare2 */<br>    NULL, /* domainMigrateFinish2 */<br>};<br>    <br>static virStateDriver oneStateDriver = {<br>    .initialize = oneStartup,<br>    .cleanup    = oneShutdown,<br>    .active     = oneActive,<br>};<br><br><br>int oneRegister(void)<br>{<br>    virRegisterDriver(&oneDriver);<br>    virRegisterStateDriver(&oneStateDriver);<br>    return 0;<br>}<br><br><br>----<br> Distributed System Architecture Group  <br> (http://dsa-research.org)<br><br> GridWay, http://www.gridway.org<br> OpenNEbula, http://www.opennebula.org<br><br><br><br>