[Kimchi-devel] [PATCH V3 2/3] VM Edit CPU/Memory: (Backend) Changes VM control and model
Paulo Ricardo Paz Vital
pvital at linux.vnet.ibm.com
Sun Apr 13 11:44:13 UTC 2014
--
Reviewed-by: Paulo Vital <pvital at linux.vnet.ibm.com>
On Fri, 2014-04-11 at 15:38 -0300, Rodrigo Trujillo wrote:
> This patch changes vm control file in order to allow user to change cpus
> and memory. It also changes vms model in order to change xml properly
> and test if vm is running.
>
> Signed-off-by: Rodrigo Trujillo <rodrigo.trujillo at linux.vnet.ibm.com>
> ---
> src/kimchi/control/vms.py | 4 ++--
> src/kimchi/model/vms.py | 43 +++++++++++++++++++++++++++----------------
> 2 files changed, 29 insertions(+), 18 deletions(-)
>
> diff --git a/src/kimchi/control/vms.py b/src/kimchi/control/vms.py
> index e75b27f..0964fb7 100644
> --- a/src/kimchi/control/vms.py
> +++ b/src/kimchi/control/vms.py
> @@ -32,7 +32,7 @@ class VMs(Collection):
> class VM(Resource):
> def __init__(self, model, ident):
> super(VM, self).__init__(model, ident)
> - self.update_params = ["name"]
> + self.update_params = ["name", "cpus", "memory"]
> self.screenshot = VMScreenShot(model, ident)
> self.uri_fmt = '/vms/%s'
> for ident, node in sub_nodes.items():
> @@ -43,7 +43,7 @@ class VM(Resource):
>
> @property
> def data(self):
> - return {'name': self.ident,
> + return {'name': self.info['name'],
> 'uuid': self.info['uuid'],
> 'stats': self.info['stats'],
> 'memory': self.info['memory'],
> diff --git a/src/kimchi/model/vms.py b/src/kimchi/model/vms.py
> index 2425a43..35fbf3e 100644
> --- a/src/kimchi/model/vms.py
> +++ b/src/kimchi/model/vms.py
> @@ -47,7 +47,9 @@ DOM_STATE_MAP = {0: 'nostate',
> 6: 'crashed'}
>
> GUESTS_STATS_INTERVAL = 5
> -VM_STATIC_UPDATE_PARAMS = {'name': './name'}
> +VM_STATIC_UPDATE_PARAMS = {'name': './name',
> + 'cpus': './vcpu',
> + 'memory': './memory'}
> VM_LIVE_UPDATE_PARAMS = {}
>
> stats = {}
> @@ -235,33 +237,41 @@ class VMModel(object):
>
> def update(self, name, params):
> dom = self.get_vm(name, self.conn)
> + # Change memory unit from MB to KB
> dom = self._static_vm_update(dom, params)
> self._live_vm_update(dom, params)
> return dom.name().decode('utf-8')
>
> def _static_vm_update(self, dom, params):
> state = DOM_STATE_MAP[dom.info()[0]]
> -
> old_xml = new_xml = dom.XMLDesc(0)
>
> for key, val in params.items():
> if key in VM_STATIC_UPDATE_PARAMS:
> + # Machine must be powered off
> + if state == 'running':
> + raise InvalidOperation("KCHVM0022E")
> xpath = VM_STATIC_UPDATE_PARAMS[key]
> + if key == 'memory':
> + val = val * 1024
> + if type(val) == int:
> + val = str(val)
> new_xml = xmlutils.xml_item_update(new_xml, xpath, val)
>
> - try:
> - if 'name' in params:
> - if state == 'running':
> - msg_args = {'name': dom.name(), 'new_name': params['name']}
> - raise InvalidParameter("KCHVM0003E", msg_args)
> - else:
> - dom.undefine()
> - conn = self.conn.get()
> - dom = conn.defineXML(new_xml)
> - except libvirt.libvirtError as e:
> - dom = conn.defineXML(old_xml)
> - raise OperationFailed("KCHVM0008E", {'name': dom.name(),
> - 'err': e.get_error_message()})
> + if not new_xml == old_xml:
> + # Remove currentMemory element
> + root = ElementTree.fromstring(new_xml)
> + root.remove(root.find('.currentMemory'))
> + new_xml = ElementTree.tostring(root, encoding="utf-8")
> + try:
> + conn = self.conn.get()
> + dom.undefine()
> + dom = conn.defineXML(new_xml)
> + except libvirt.libvirtError as e:
> + dom = conn.defineXML(old_xml)
> + raise OperationFailed("KCHVM0008E",
> + {'name': dom.name(),
> + 'err': e.get_error_message()})
> return dom
>
> def _live_vm_update(self, dom, params):
> @@ -304,7 +314,8 @@ class VMModel(object):
> res['io_throughput'] = vm_stats.get('disk_io', 0)
> res['io_throughput_peak'] = vm_stats.get('max_disk_io', 100)
>
> - return {'state': state,
> + return {'name': name,
> + 'state': state,
> 'stats': res,
> 'uuid': dom.UUIDString(),
> 'memory': info[2] >> 10,
More information about the Kimchi-devel
mailing list