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>