
On Fri, 20 Apr 2007 14:31:02 +0100 "Daniel P. Berrange" wrote:
If we ignore case B, I think we still have lots of interesting combos to think about:
1. Static - change persistent config 2. Dynamic - change live VM config 3. Static and Dynamic - change persistent config, and live VM 4. Static or Dynamic - if domain is inactive, change persistent config, if it is active, change live VM
This is already possible today actually. In Xen 3.0.4 or later there is the lifecycle management APIs, so there is an API which lets you define a config for a guest. So in this case we just convert from XML -> SEXPR, in the same way that we do to boot a guest. For older Xen, we simply write files straight into /etc/xen. The QEMUD daemon stores the XML files for QEMU/KVM in the native libvirt format, so that's easy.
So it will be possible following way using new API right ? new API: virDomainSetMemoryScope(virDomainPtr dom, int mem, int scope);
virsh setmem foo 500 -> VIR_DOMAIN_SCOPE_CURRENT(4) virsh --static setmem foo 500 -> VIR_DOMAIN_SCOPE_STATIC(1) virsh --dynamic setmem foo 500 -> VIR_DOMAIN_SCOPE_DYNAMIC(2) virsh --static --dynamic setmem foo 500 -> VIR_DOMAIN_SCOPE_BOTH(3)
When scope is VIR_DOMAIN_SCOPE_CURRENT, execute current handling. When scope is other, execute as follows: 1. get the config using domainDumpXML 2. change the value of memory -> When scope is VIR_DOMAIN_SCOPE_STATIC or VIR_DOMAIN_SCOPE_BOTH: - change the value of currentMemory on the config -> When scope is VIR_DOMAIN_SCOPE_DYNAMIC or VIR_DOMAIN_SCOPE_BOTH: - change the actual memory allocation using domainSetMemory 3. define the config using domainDefineXML Here is example. (NOTE: not compiled or tested. need error handling) Index: virsh.c =================================================================== RCS file: /data/cvs/libvirt/src/virsh.c,v retrieving revision 1.73 diff -u -p -r1.73 virsh.c --- virsh.c 13 Apr 2007 08:04:08 -0000 1.73 +++ virsh.c 23 Apr 2007 08:55:55 -0000 @@ -1461,6 +1461,9 @@ cmdSetmem(vshControl * ctl, vshCmd * cmd virDomainPtr dom; int kilobytes; int ret = TRUE; + int op_static = vshCommandOptBool(cmd, "static"); + int op_dynamic = vshCommandOptBool(cmd, "dynamic"); + int flag = VIR_DOMAIN_SCOPE_CURRENT; if (!vshConnectionUsability(ctl, ctl->conn, TRUE)) return FALSE; @@ -1475,7 +1478,14 @@ cmdSetmem(vshControl * ctl, vshCmd * cmd return FALSE; } - if (virDomainSetMemory(dom, kilobytes) != 0) { + if (op_static && op_dynamic) { + flag = VIR_DOMAIN_SCOPE_BOTH; + } else if (op_static) { + flag = VIR_DOMAIN_SCOPE_STATIC; + } else if (op_static) { + flag = VIR_DOMAIN_SCOPE_DYNAMIC; + } + if (virDomainSetMemoryScope(dom, kilobytes, flag) !=0) { ret = FALSE; } Index: libvirt.c =================================================================== RCS file: /data/cvs/libvirt/src/libvirt.c,v retrieving revision 1.68 diff -u -p -r1.68 libvirt.c --- libvirt.c 18 Apr 2007 10:14:07 -0000 1.68 +++ libvirt.c 23 Apr 2007 08:56:14 -0000 @@ -1304,6 +1304,55 @@ virDomainSetMemory(virDomainPtr domain, return -1; } +int +virDomainSetMemoryScope(virDomainPtr domain, unsigned long memory, int scope) +{ + virConnectPtr conn; + char *dump; + virDomainPtr dom; + + if (domain == NULL) { + TODO + return (-1); + } + if (!VIR_IS_CONNECTED_DOMAIN(domain)) { + virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__); + return (-1); + } + if (domain->conn->flags & VIR_CONNECT_RO) { + virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__); + return (-1); + } + if (memory < 4096) { + virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__); + return (-1); + } + + conn = domain->conn; + + if (scope == VIR_DOMAIN_SCOPE_CURRENT){ + if (conn->driver->domainSetMemory) + return conn->driver->domainSetMemory (domain, memory); + } else { + if (conn->driver->domainDumpXML) + dump = conn->driver->domainDumpXML (domain, 0); + switch (scope) { + case VIR_DOMAIN_SCOPE_STATIC: + /* change the value of currentMemory */ + case VIR_DOMAIN_SCOPE_DYNAMIC: + /* change the actual memory allocation using domainSetMemory */ + case VIR_DOMAIN_SCOPE_BOTH: + /* change the value of currentMemory */ + } + if (conn->driver->domainDefineXML) + dom = conn->driver->domainDefineXML (conn, dump); + } + + virLibConnError (conn, VIR_ERR_CALL_FAILED, __FUNCTION__); + return -1; +} Thanks, Saori Fukuta.