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(a)linux.vnet.ibm.com>
---
src/kimchi/control/vms.py | 17 ++---------------
src/kimchi/model/vms.py | 24 +++++++++++++++---------
2 files changed, 17 insertions(+), 24 deletions(-)
diff --git a/src/kimchi/control/vms.py b/src/kimchi/control/vms.py
index ea810e4..77e6d8b 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", "users", "groups"]
+ self.update_params = ["name", "users", "groups",
"cpus", "memory"]
self.screenshot = VMScreenShot(model, ident)
self.uri_fmt = '/vms/%s'
for ident, node in sub_nodes.items():
@@ -44,20 +44,7 @@ class VM(Resource):
@property
def data(self):
- return {'name': self.ident,
- 'uuid': self.info['uuid'],
- 'stats': self.info['stats'],
- 'memory': self.info['memory'],
- 'cpus': self.info['cpus'],
- 'state': self.info['state'],
- 'screenshot': self.info['screenshot'],
- 'icon': self.info['icon'],
- 'graphics': {'type':
self.info['graphics']['type'],
- 'listen':
self.info['graphics']['listen'],
- 'port':
self.info['graphics']['port']},
- 'users': self.info['users'],
- 'groups': self.info['groups']
- }
+ return self.info
class VMScreenShot(Resource):
diff --git a/src/kimchi/model/vms.py b/src/kimchi/model/vms.py
index 90e9537..a694517 100644
--- a/src/kimchi/model/vms.py
+++ b/src/kimchi/model/vms.py
@@ -51,7 +51,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 = {}
@@ -255,7 +257,6 @@ class VMModel(object):
def _static_vm_update(self, dom, params):
state = DOM_STATE_MAP[dom.info()[0]]
-
old_xml = new_xml = dom.XMLDesc(0)
metadata_xpath = "/domain/metadata/kimchi/access/%s"
@@ -275,6 +276,12 @@ class VMModel(object):
groups = val
else:
if key in VM_STATIC_UPDATE_PARAMS:
+ if key == 'memory':
+ # Libvirt saves memory in KiB. Retrieved xml has memory
+ # in KiB too, so new valeu must be in KiB here
+ val = val * 1024
+ if type(val) == int:
+ val = str(val)
xpath = VM_STATIC_UPDATE_PARAMS[key]
new_xml = xmlutils.xml_item_update(new_xml, xpath, val)
@@ -285,21 +292,19 @@ class VMModel(object):
msg_args = {'name': dom.name(), 'new_name':
params['name']}
raise InvalidParameter("KCHVM0003E", msg_args)
- # Undefine old vm and create a new one with updated values
+ # Undefine old vm, only if name is going to change
dom.undefine()
- conn = self.conn.get()
- dom = conn.defineXML(new_xml)
- # Update metadata element
root = ET.fromstring(new_xml)
+ root.remove(root.find('.currentMemory'))
+ # Update metadata element
current_metadata = root.find('metadata')
new_metadata = self._get_metadata_node(users, groups)
if current_metadata is not None:
root.replace(current_metadata, new_metadata)
else:
root.append(new_metadata)
- dom = conn.defineXML(ET.tostring(root))
-
+ dom = conn.defineXML(ET.tostring(root, encoding="utf-8"))
except libvirt.libvirtError as e:
dom = conn.defineXML(old_xml)
raise OperationFailed("KCHVM0008E", {'name': dom.name(),
@@ -350,7 +355,8 @@ class VMModel(object):
users = xpath_get_text(xml, "/domain/metadata/kimchi/access/user")
groups = xpath_get_text(xml, "/domain/metadata/kimchi/access/group")
- return {'state': state,
+ return {'name': name,
+ 'state': state,
'stats': res,
'uuid': dom.UUIDString(),
'memory': info[2] >> 10,
--
1.9.0