int libvirt_domain_create(char * xml) { if (g_conn == NULL) return -1; virDomainPtr domain = virDomainCreateXML(g_conn, xml, 0); if (domain == NULL) { logerror(_("%s: creating domain error\n"), __func__); return -1; } virDomainFree(domain); return 0; }
int main(int argc, char *argv[]) { int start, stop; printf("Number for first machine to be created:"); scanf("%d", &start); printf("Number for last machine to be created:"); scanf("%d", &stop); virConnectPtr conn; conn = virConnectOpen("qemu:///system"); if (conn == NULL) { fprintf(stderr, "Failed to open connection to qemu:///system\n"); return 1; } int i; for (i=start;i<=stop;i++) { char xml[1024]; sprintf(xml, "<domain type='qemu'> \ <name>microMachine-%d</name> \ <memory>16384</memory> \ <vcpu>1</vcpu> \ <os> \ <type arch='i686' machine='pc-1.0'>hvm</type> \ <boot dev='hd'/> \ </os> \ <devices> \ <emulator>/usr/bin/kvm</emulator> \ <disk type='file' device='disk'> \ <driver name='qemu' type='raw'/> \ <source file='/home/jon/serial_print.hda'/> \ <target dev='hda' bus='ide'/> \ <address type='drive' controller='0' bus='0' unit='0'/> \ </disk> \ <serial type='file'> \ <source path='/home/jon/logs/output%d.log'/> \ <target port='1'/> \ </serial> \ </devices> \ </domain>", i, i); virDomainCreateXML(conn,xml,VIR_DOMAIN_NONE); } virConnectClose(conn); return 0; }
static int testDomainCreateXMLNew(const void *data) { const objecteventTest *test = data; lifecycleEventCounter counter; int eventId = VIR_DOMAIN_EVENT_ID_LIFECYCLE; virDomainPtr dom = NULL; int id; int ret = -1; lifecycleEventCounter_reset(&counter); id = virConnectDomainEventRegisterAny(test->conn, NULL, eventId, VIR_DOMAIN_EVENT_CALLBACK(&domainLifecycleCb), &counter, NULL); if (id < 0) goto cleanup; dom = virDomainCreateXML(test->conn, domainDef, 0); if (dom == NULL || virEventRunDefaultImpl() < 0) goto cleanup; if (counter.startEvents != 1 || counter.unexpectedEvents > 0) goto cleanup; if (virConnectDomainEventDeregisterAny(test->conn, id) != 0) goto cleanup; id = -1; ret = 0; cleanup: if (id >= 0) virConnectDomainEventDeregisterAny(test->conn, id); if (dom) { virDomainDestroy(dom); virDomainFree(dom); } return ret; }
static int testDomainCreateXMLOld(const void *data) { const objecteventTest *test = data; lifecycleEventCounter counter; virDomainPtr dom = NULL; int ret = -1; bool registered = false; lifecycleEventCounter_reset(&counter); if (virConnectDomainEventRegister(test->conn, domainLifecycleCb, &counter, NULL) != 0) goto cleanup; registered = true; dom = virDomainCreateXML(test->conn, domainDef, 0); if (dom == NULL || virEventRunDefaultImpl() < 0) goto cleanup; if (counter.startEvents != 1 || counter.unexpectedEvents > 0) goto cleanup; if (virConnectDomainEventDeregister(test->conn, domainLifecycleCb) != 0) goto cleanup; registered = false; ret = 0; cleanup: if (registered) virConnectDomainEventDeregister(test->conn, domainLifecycleCb); if (dom) { virDomainDestroy(dom); virDomainFree(dom); } return ret; }
static PromiseResult CreateVirtDom(EvalContext *ctx, virConnectPtr vc, Attributes a, const Promise *pp) { int alloc_file = false; char *xml_file; const char *name; char defaultxml[CF_MAXVARSIZE]; virDomainPtr dom; int i; snprintf(defaultxml, CF_MAXVARSIZE - 1, "<domain type='test'>" " <name>%s</name>" " <memory>8388608</memory>" " <currentMemory>2097152</currentMemory>" " <vcpu>2</vcpu>" " <os>" " <type>hvm</type>" " </os>" "</domain>", pp->promiser); for (i = 0; i < CF_MAX_CONCURRENT_ENVIRONMENTS; i++) { if (CF_RUNNING[i] > 0) { dom = virDomainLookupByID(vc, CF_RUNNING[i]); name = virDomainGetName(dom); if (name && strcmp(name, pp->promiser) == 0) { cfPS(ctx, LOG_LEVEL_VERBOSE, PROMISE_RESULT_NOOP, pp, a, "Found a running environment called '%s' - promise kept", name); return PROMISE_RESULT_NOOP; } virDomainFree(dom); } } for (i = 0; CF_SUSPENDED[i] != NULL; i++) { if (strcmp(CF_SUSPENDED[i], pp->promiser) == 0) { Log(LOG_LEVEL_INFO, "Found an existing, but suspended, environment id = %s, called '%s'", CF_SUSPENDED[i], CF_SUSPENDED[i]); } } if(a.env.spec) { xml_file = xstrdup(a.env.spec); alloc_file = true; } else { Log(LOG_LEVEL_VERBOSE, "No spec file is promised, so reverting to default settings"); xml_file = defaultxml; } PromiseResult result = PROMISE_RESULT_NOOP; if ((dom = virDomainCreateXML(vc, xml_file, 0))) { cfPS(ctx, LOG_LEVEL_VERBOSE, PROMISE_RESULT_CHANGE, pp, a, "Created a virtual domain '%s'", pp->promiser); result = PromiseResultUpdate(result, PROMISE_RESULT_CHANGE); if (a.env.cpus != CF_NOINT) { int maxcpus; if ((maxcpus = virConnectGetMaxVcpus(vc, virConnectGetType(vc))) == -1) { Log(LOG_LEVEL_VERBOSE, "Can't determine the available CPU resources"); } else { if (a.env.cpus > maxcpus) { Log(LOG_LEVEL_INFO, "The promise to allocate %d CPUs in domain '%s' cannot be kept - only %d exist on the host", a.env.cpus, pp->promiser, maxcpus); } else if (virDomainSetVcpus(dom, (unsigned int) a.env.cpus) == -1) { Log(LOG_LEVEL_INFO, "Unable to adjust CPU count to %d", a.env.cpus); } else { Log(LOG_LEVEL_INFO, "Verified that environment CPU count is now %d", a.env.cpus); } } } if (a.env.memory != CF_NOINT) { unsigned long maxmem; if ((maxmem = virDomainGetMaxMemory(dom)) == -1) { Log(LOG_LEVEL_VERBOSE, "Can't determine the available CPU resources"); } else { if (virDomainSetMaxMemory(dom, (unsigned long) a.env.memory) == -1) { Log(LOG_LEVEL_INFO, " Unable to set the memory limit to %d", a.env.memory); } else { Log(LOG_LEVEL_INFO, "Setting the memory limit to %d", a.env.memory); } if (virDomainSetMemory(dom, (unsigned long) a.env.memory) == -1) { Log(LOG_LEVEL_INFO, " Unable to set the current memory to %d", a.env.memory); } } } if (a.env.disk != CF_NOINT) { Log(LOG_LEVEL_VERBOSE, "Info: env_disk parameter is not currently supported on this platform"); } virDomainFree(dom); } else { virErrorPtr vp; vp = virGetLastError(); cfPS(ctx, LOG_LEVEL_ERR, PROMISE_RESULT_FAIL, pp, a, "Failed to create a virtual domain '%s' - check spec for errors: '%s'", pp->promiser, vp->message); result = PromiseResultUpdate(result, PROMISE_RESULT_FAIL); Log(LOG_LEVEL_VERBOSE, "Quoted spec file: %s", xml_file); } if (alloc_file) { free(xml_file); } return result; }
static int CreateVirtDom(virConnectPtr vc, char *uri, Attributes a, Promise *pp) { int alloc_file = false; char *xml_file; const char *name; char defaultxml[CF_MAXVARSIZE]; virDomainPtr dom; int i; snprintf(defaultxml, CF_MAXVARSIZE - 1, "<domain type='test'>" " <name>%s</name>" " <memory>8388608</memory>" " <currentMemory>2097152</currentMemory>" " <vcpu>2</vcpu>" " <os>" " <type>hvm</type>" " </os>" "</domain>", pp->promiser); for (i = 0; i < CF_MAX_CONCURRENT_ENVIRONMENTS; i++) { if (CF_RUNNING[i] > 0) { dom = virDomainLookupByID(vc, CF_RUNNING[i]); name = virDomainGetName(dom); if (name && strcmp(name, pp->promiser) == 0) { cfPS(cf_verbose, CF_NOP, "", pp, a, " -> Found a running environment called \"%s\" - promise kept\n", name); return true; } virDomainFree(dom); } } for (i = 0; CF_SUSPENDED[i] != NULL; i++) { if (strcmp(CF_SUSPENDED[i], pp->promiser) == 0) { CfOut(cf_inform, "", " -> Found an existing, but suspended, environment id = %s, called \"%s\"\n", CF_SUSPENDED[i], CF_SUSPENDED[i]); } } if(a.env.spec) { xml_file = xstrdup(a.env.spec); alloc_file = true; } else { CfOut(cf_verbose, "", "No spec file is promised, so reverting to default settings"); xml_file = defaultxml; } if ((dom = virDomainCreateXML(vc, xml_file, 0))) { cfPS(cf_verbose, CF_CHG, "", pp, a, " -> Created a virtual domain \"%s\"\n", pp->promiser); if (a.env.cpus != CF_NOINT) { int maxcpus; if ((maxcpus = virConnectGetMaxVcpus(vc, virConnectGetType(vc))) == -1) { CfOut(cf_verbose, "", " !! Can't determine the available CPU resources"); } else { if (a.env.cpus > maxcpus) { CfOut(cf_inform, "", " !! The promise to allocate %d CPUs in domain \"%s\" cannot be kept - only %d exist on the host", a.env.cpus, pp->promiser, maxcpus); } else if (virDomainSetVcpus(dom, (unsigned int) a.env.cpus) == -1) { CfOut(cf_inform, "", " -> Unable to adjust CPU count to %d", a.env.cpus); } else { CfOut(cf_inform, "", " -> Verified that environment CPU count is now %d", a.env.cpus); } } } if (a.env.memory != CF_NOINT) { unsigned long maxmem; if ((maxmem = virDomainGetMaxMemory(dom)) == -1) { CfOut(cf_verbose, "", " !! Can't determine the available CPU resources"); } else { if (virDomainSetMaxMemory(dom, (unsigned long) a.env.memory) == -1) { CfOut(cf_inform, "", " !!! Unable to set the memory limit to %d", a.env.memory); } else { CfOut(cf_inform, "", " -> Setting the memory limit to %d", a.env.memory); } if (virDomainSetMemory(dom, (unsigned long) a.env.memory) == -1) { CfOut(cf_inform, "", " !!! Unable to set the current memory to %d", a.env.memory); } } } if (a.env.disk != CF_NOINT) { CfOut(cf_verbose, "", " -> Info: env_disk parameter is not currently supported on this platform"); } virDomainFree(dom); } else { virErrorPtr vp; vp = virGetLastError(); cfPS(cf_verbose, CF_FAIL, "", pp, a, " !! Failed to create a virtual domain \"%s\" - check spec for errors: %s", pp->promiser, vp->message); CfOut(cf_verbose, "", "Quoted spec file: %s", xml_file); } if (alloc_file) { free(xml_file); } return true; }
static int testDomainCreateXMLMixed(const void *data) { const objecteventTest *test = data; lifecycleEventCounter counter; virDomainPtr dom; int ret = -1; int id1 = -1; int id2 = -1; bool registered = false; lifecycleEventCounter_reset(&counter); /* Fun with mixing old and new API, also with global and * per-domain. Handler should be fired three times, once for each * registration. */ dom = virDomainDefineXML(test->conn, domainDef); if (dom == NULL) goto cleanup; id1 = virConnectDomainEventRegisterAny(test->conn, dom, VIR_DOMAIN_EVENT_ID_LIFECYCLE, VIR_DOMAIN_EVENT_CALLBACK(&domainLifecycleCb), &counter, NULL); if (id1 < 0) goto cleanup; if (virConnectDomainEventRegister(test->conn, domainLifecycleCb, &counter, NULL) != 0) goto cleanup; registered = true; id2 = virConnectDomainEventRegisterAny(test->conn, NULL, VIR_DOMAIN_EVENT_ID_LIFECYCLE, VIR_DOMAIN_EVENT_CALLBACK(&domainLifecycleCb), &counter, NULL); if (id2 < 0) goto cleanup; dom = virDomainCreateXML(test->conn, domainDef, 0); if (dom == NULL || virEventRunDefaultImpl() < 0) goto cleanup; if (counter.startEvents != 3 || counter.unexpectedEvents > 0) goto cleanup; if (virConnectDomainEventDeregister(test->conn, domainLifecycleCb) != 0) goto cleanup; registered = false; if (virConnectDomainEventDeregisterAny(test->conn, id1) != 0) goto cleanup; id1 = -1; if (virConnectDomainEventDeregisterAny(test->conn, id2) != 0) goto cleanup; id2 = -1; ret = 0; cleanup: if (id1 >= 0) virConnectDomainEventDeregisterAny(test->conn, id1); if (id2 >= 0) virConnectDomainEventDeregisterAny(test->conn, id2); if (registered) virConnectDomainEventDeregister(test->conn, domainLifecycleCb); if (dom != NULL) { virDomainUndefine(dom); virDomainDestroy(dom); virDomainFree(dom); } return ret; }
int startDomain(char *xml, char *uri) { int id, tries, res = 0; char *port = NULL; char *xmldesc = NULL; virDomainPtr dp = NULL; if (cp == NULL) { cp = libvirtConnect(uri); if (cp == NULL) { DPRINTF("Connection to %s failed\n", uri); return -EIO; } } DPRINTF("Starting domain\n"); dp = virDomainCreateXML(cp, xml, 0); if (dp == NULL) { DPRINTF("virDomainCreateXML call failed\n"); DPRINTF("XML File data:\n%s\n", xml); return -EINVAL; } DPRINTF("Domain started\n"); tries = 0; xmldesc = virDomainGetXMLDesc(dp, 0); if (xmldesc == NULL) { if (tries > 5) { DPRINTF("Cannot get domain XML description\n"); virDomainFree(dp); return -EIO; } sleep(1); tries++; } port = xml_query(xmldesc, "//domain/devices/graphics/@port"); free(xmldesc); if (port == NULL) { DPRINTF("Port lookup failed, node not accessible\n"); virDomainFree(dp); return -ENOENT; } DPRINTF("Graphics port number: %s\n", port); id = virDomainGetID(dp); DPRINTF("Domain created with ID %d\n", id); #ifdef USE_HACK if (startVNCViewer(NULL, NULL, 1) != VNC_STATUS_UNSUPPORTED) { char path[1024] = { 0 }; char buf[2048] = { 0 }; char cmd[4096] = { 0 }; snprintf(path, sizeof(path), "/proc/%d/exe", getpid()); readlink(path, buf, sizeof(buf)); snprintf(cmd, sizeof(cmd), "%s -v localhost:%s -f -l console 2> /dev/null", buf, port); DPRINTF("About to run '%s'\n", cmd); res = WEXITSTATUS(system(cmd)); } else res = VNC_STATUS_NO_CONNECTION; #else res = startVNCViewer("localhost", port, 1); #endif if (((virDomainIsActive(dp)) && (!domainIsOff)) || (res != VNC_STATUS_SHUTDOWN)) { DPRINTF("Domain is active, destroying...\n"); virDomainDestroy(dp); } DPRINTF("Domain %d done.\n", id); virDomainFree(dp); DPRINTF("Returning with %d\n", lastErrorCode); return lastErrorCode; }
bool VirshType::Start() { vmprintf(D_FULLDEBUG, "Inside VirshType::Start\n"); if( (m_configfile.Length() == 0)) { m_result_msg = VMGAHP_ERR_INTERNAL; vmprintf(D_FULLDEBUG, "Config file was not set configfile: %s\n", m_configfile.Value()); return false; } if( getVMStatus() != VM_STOPPED ) { m_result_msg = VMGAHP_ERR_VM_INVALID_OPERATION; return false; } if( m_restart_with_ckpt ) { bool res = Resume(); if( res ) { // Success!! vmprintf(D_ALWAYS, "Succeeded to restart with checkpointed files\n"); // Here we manually update timestamp of all writable disk files m_start_time.getTime(); return true; }else { // Failed to restart with checkpointed files vmprintf(D_ALWAYS, "Failed to restart with checkpointed files\n"); vmprintf(D_ALWAYS, "So, we will try to create a new configuration file\n"); deleteNonTransferredFiles(); m_configfile = ""; m_suspendfile = ""; m_restart_with_ckpt = false; if( this->CreateConfigFile() == false ) { vmprintf(D_ALWAYS, "Failed to create a new configuration files\n"); return false; } // Succeeded to create a configuration file // Keep going.. } } vmprintf(D_FULLDEBUG, "Trying XML: %s\n", m_xml.Value()); priv_state priv = set_root_priv(); virDomainPtr vm = virDomainCreateXML(m_libvirt_connection, m_xml.Value(), 0); set_priv(priv); if(vm == NULL) { // Error in creating the vm; let's find out what the error // was virErrorPtr err = virConnGetLastError(m_libvirt_connection); vmprintf(D_ALWAYS, "Failed to create libvirt domain: %s\n", (err ? err->message : "No reason found")); //virFreeError(err); return false; } priv = set_root_priv(); virDomainFree(vm); set_priv(priv); setVMStatus(VM_RUNNING); m_start_time.getTime(); m_cpu_time = 0; // Here we manually update timestamp of all writable disk files return true; }