[PATCH v5] [Kimchi] Feature request (#860): Support Guest Autostart

From: Bianca Carvalho <bianca@linux.vnet.ibm.com> Include 'autostart' option in API.json and vms.py (lookup and update) using libvirt dom.setAutostart to set as true or false. Also edit test_model.py to include those changes and updated API.md file. Also included API tests to test_rest.py in test_edit_vm function. Signed-off-by: Bianca Carvalho <bianca@linux.vnet.ibm.com> --- API.json | 4 ++++ docs/API.md | 3 +++ model/vms.py | 11 ++++++++--- tests/test_mockmodel.py | 2 +- tests/test_model.py | 8 +++++++- tests/test_rest.py | 18 ++++++++++++++++++ 6 files changed, 41 insertions(+), 5 deletions(-) diff --git a/API.json b/API.json index adaa2f7..e72c68d 100644 --- a/API.json +++ b/API.json @@ -369,6 +369,10 @@ "error": "KCHVM0053E", "type": "boolean" }, + "autostart": { + "description": "Enable/Disable guest autostart", + "type": "boolean" + }, "users": { "description": "Array of users who have permission to the VM", "type": "array", diff --git a/docs/API.md b/docs/API.md index 15f0007..43bb04b 100644 --- a/docs/API.md +++ b/docs/API.md @@ -151,6 +151,8 @@ server. * bootorder: list of devices in boot order * description: VM description * title: VM title + * autostart: show if autostart is enabled. + * **DELETE**: Remove the Virtual Machine * **PUT**: update the parameters of existing VM * name: New name for this VM (only applied for shutoff VM) @@ -183,6 +185,7 @@ server. * bootmenu: prompts guest bootmenu. Bool type. * description: VM description * title: VM title + * autostart: enable/disable guest autostart (true or false params). * **POST**: *See Virtual Machine Actions* diff --git a/model/vms.py b/model/vms.py index f13e605..a8e1c14 100644 --- a/model/vms.py +++ b/model/vms.py @@ -80,12 +80,13 @@ DOM_STATE_MAP = {0: 'nostate', 7: 'pmsuspended'} # update parameters which are updatable when the VM is online -VM_ONLINE_UPDATE_PARAMS = ['graphics', 'groups', 'memory', 'users'] +VM_ONLINE_UPDATE_PARAMS = ['graphics', 'groups', 'memory', 'users', + 'autostart'] # update parameters which are updatable when the VM is offline VM_OFFLINE_UPDATE_PARAMS = ['cpu_info', 'graphics', 'groups', 'memory', 'name', 'users', 'bootorder', 'bootmenu', - 'description', 'title'] + 'description', 'title', 'autostart'] XPATH_DOMAIN_DISK = "/domain/devices/disk[@device='disk']/source/@file" XPATH_DOMAIN_DISK_BY_FILE = "./devices/disk[@device='disk']/source[@file='%s']" @@ -270,6 +271,9 @@ class VMModel(object): with lock: dom = self.get_vm(name, self.conn) + if "autostart" in params: + dom.setAutostart(1 if params['autostart'] == True else 0) + # You can only change <maxMemory> offline, updating guest XML if ("memory" in params) and ('maxmemory' in params['memory']) and\ (DOM_STATE_MAP[dom.info()[0]] != 'shutoff'): @@ -1314,7 +1318,8 @@ class VMModel(object): 'access': 'full', 'persistent': True if dom.isPersistent() else False, 'bootorder': boot, - 'bootmenu': bootmenu + 'bootmenu': bootmenu, + 'autostart': dom.autostart() } def _vm_get_disk_paths(self, dom): diff --git a/tests/test_mockmodel.py b/tests/test_mockmodel.py index 147942c..ffd383c 100644 --- a/tests/test_mockmodel.py +++ b/tests/test_mockmodel.py @@ -164,7 +164,7 @@ class MockModelTests(unittest.TestCase): keys = set(('name', 'state', 'stats', 'uuid', 'memory', 'cpu_info', 'screenshot', 'icon', 'graphics', 'users', 'groups', 'access', 'persistent', 'bootorder', 'bootmenu', 'title', - 'description')) + 'description', 'autostart')) stats_keys = set(('cpu_utilization', 'mem_utilization', 'net_throughput', 'net_throughput_peak', diff --git a/tests/test_model.py b/tests/test_model.py index d9ffd5e..2ed5e65 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -129,7 +129,7 @@ class ModelTests(unittest.TestCase): keys = set(('name', 'state', 'stats', 'uuid', 'memory', 'cpu_info', 'screenshot', 'icon', 'graphics', 'users', 'groups', 'access', 'persistent', 'bootorder', 'bootmenu', 'title', - 'description')) + 'description', 'autostart')) stats_keys = set(('cpu_utilization', 'mem_utilization', 'net_throughput', 'net_throughput_peak', @@ -1362,6 +1362,12 @@ class ModelTests(unittest.TestCase): inst.vm_update(u'пeω-∨м', {"bootmenu": False}) self.assertEquals("no", inst.vm_lookup(u'пeω-∨м')['bootmenu']) + # enable/disable autostart + inst.vm_update(u'пeω-∨м', {"autostart": True}) + self.assertEquals(1, inst.vm_lookup(u'пeω-∨м')['autostart']) + inst.vm_update(u'пeω-∨м', {"autostart": False}) + self.assertEquals(0, inst.vm_lookup(u'пeω-∨м')['autostart']) + def test_get_interfaces(self): inst = model.Model('test:///default', objstore_loc=self.tmp_store) diff --git a/tests/test_rest.py b/tests/test_rest.py index b1b9f12..4c1ed14 100644 --- a/tests/test_rest.py +++ b/tests/test_rest.py @@ -301,6 +301,24 @@ class RestTests(unittest.TestCase): resp = self.request('/plugins/kimchi/vms/∨м-црdαtеd', req, 'PUT') self.assertEquals(400, resp.status) + # set vm autostart tests (powered off) + resp = self.request('/plugins/kimchi/vms/vm-1/start', '{}', 'POST') + self.assertEquals(200, resp.status) + req = json.dumps({"autostart": True}) + resp = self.request('/plugins/kimchi/vms/vm-1', req, 'PUT') + self.assertEquals(200, resp.status) + resp = self.request('/plugins/kimchi/vms/vm-1', '{}', 'GET').read() + self.assertEquals(resp["autostart"], True) + + # set vm autostart tests (running) + resp = self.request('/plugins/kimchi/vms/vm-1/poweroff', '{}', 'POST') + self.assertEquals(200, resp.status) + req = json.dumps({"autostart": False}) + resp = self.request('/plugins/kimchi/vms/vm-1', req, 'PUT') + self.assertEquals(200, resp.status) + resp = self.request('/plugins/kimchi/vms/vm-1', '{}', 'GET').read() + self.assertEquals(resp["autostart"], True) + def test_vm_lifecycle(self): # Create a Template req = json.dumps({'name': 'test', -- 2.7.4

Reviewed-By: Ramon Medeiros <ramonn@br.ibm.com> On 09/05/2016 05:17 PM, bianca@linux.vnet.ibm.com wrote:
From: Bianca Carvalho <bianca@linux.vnet.ibm.com>
Include 'autostart' option in API.json and vms.py (lookup and update) using libvirt dom.setAutostart to set as true or false. Also edit test_model.py to include those changes and updated API.md file. Also included API tests to test_rest.py in test_edit_vm function.
Signed-off-by: Bianca Carvalho <bianca@linux.vnet.ibm.com> --- API.json | 4 ++++ docs/API.md | 3 +++ model/vms.py | 11 ++++++++--- tests/test_mockmodel.py | 2 +- tests/test_model.py | 8 +++++++- tests/test_rest.py | 18 ++++++++++++++++++ 6 files changed, 41 insertions(+), 5 deletions(-)
diff --git a/API.json b/API.json index adaa2f7..e72c68d 100644 --- a/API.json +++ b/API.json @@ -369,6 +369,10 @@ "error": "KCHVM0053E", "type": "boolean" }, + "autostart": { + "description": "Enable/Disable guest autostart", + "type": "boolean" + }, "users": { "description": "Array of users who have permission to the VM", "type": "array", diff --git a/docs/API.md b/docs/API.md index 15f0007..43bb04b 100644 --- a/docs/API.md +++ b/docs/API.md @@ -151,6 +151,8 @@ server. * bootorder: list of devices in boot order * description: VM description * title: VM title + * autostart: show if autostart is enabled. + * **DELETE**: Remove the Virtual Machine * **PUT**: update the parameters of existing VM * name: New name for this VM (only applied for shutoff VM) @@ -183,6 +185,7 @@ server. * bootmenu: prompts guest bootmenu. Bool type. * description: VM description * title: VM title + * autostart: enable/disable guest autostart (true or false params).
* **POST**: *See Virtual Machine Actions*
diff --git a/model/vms.py b/model/vms.py index f13e605..a8e1c14 100644 --- a/model/vms.py +++ b/model/vms.py @@ -80,12 +80,13 @@ DOM_STATE_MAP = {0: 'nostate', 7: 'pmsuspended'}
# update parameters which are updatable when the VM is online -VM_ONLINE_UPDATE_PARAMS = ['graphics', 'groups', 'memory', 'users'] +VM_ONLINE_UPDATE_PARAMS = ['graphics', 'groups', 'memory', 'users', + 'autostart']
# update parameters which are updatable when the VM is offline VM_OFFLINE_UPDATE_PARAMS = ['cpu_info', 'graphics', 'groups', 'memory', 'name', 'users', 'bootorder', 'bootmenu', - 'description', 'title'] + 'description', 'title', 'autostart']
XPATH_DOMAIN_DISK = "/domain/devices/disk[@device='disk']/source/@file" XPATH_DOMAIN_DISK_BY_FILE = "./devices/disk[@device='disk']/source[@file='%s']" @@ -270,6 +271,9 @@ class VMModel(object):
with lock: dom = self.get_vm(name, self.conn) + if "autostart" in params: + dom.setAutostart(1 if params['autostart'] == True else 0) + # You can only change <maxMemory> offline, updating guest XML if ("memory" in params) and ('maxmemory' in params['memory']) and\ (DOM_STATE_MAP[dom.info()[0]] != 'shutoff'): @@ -1314,7 +1318,8 @@ class VMModel(object): 'access': 'full', 'persistent': True if dom.isPersistent() else False, 'bootorder': boot, - 'bootmenu': bootmenu + 'bootmenu': bootmenu, + 'autostart': dom.autostart() }
def _vm_get_disk_paths(self, dom): diff --git a/tests/test_mockmodel.py b/tests/test_mockmodel.py index 147942c..ffd383c 100644 --- a/tests/test_mockmodel.py +++ b/tests/test_mockmodel.py @@ -164,7 +164,7 @@ class MockModelTests(unittest.TestCase): keys = set(('name', 'state', 'stats', 'uuid', 'memory', 'cpu_info', 'screenshot', 'icon', 'graphics', 'users', 'groups', 'access', 'persistent', 'bootorder', 'bootmenu', 'title', - 'description')) + 'description', 'autostart'))
stats_keys = set(('cpu_utilization', 'mem_utilization', 'net_throughput', 'net_throughput_peak', diff --git a/tests/test_model.py b/tests/test_model.py index d9ffd5e..2ed5e65 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -129,7 +129,7 @@ class ModelTests(unittest.TestCase): keys = set(('name', 'state', 'stats', 'uuid', 'memory', 'cpu_info', 'screenshot', 'icon', 'graphics', 'users', 'groups', 'access', 'persistent', 'bootorder', 'bootmenu', 'title', - 'description')) + 'description', 'autostart'))
stats_keys = set(('cpu_utilization', 'mem_utilization', 'net_throughput', 'net_throughput_peak', @@ -1362,6 +1362,12 @@ class ModelTests(unittest.TestCase): inst.vm_update(u'пeω-∨м', {"bootmenu": False}) self.assertEquals("no", inst.vm_lookup(u'пeω-∨м')['bootmenu'])
+ # enable/disable autostart + inst.vm_update(u'пeω-∨м', {"autostart": True}) + self.assertEquals(1, inst.vm_lookup(u'пeω-∨м')['autostart']) + inst.vm_update(u'пeω-∨м', {"autostart": False}) + self.assertEquals(0, inst.vm_lookup(u'пeω-∨м')['autostart']) + def test_get_interfaces(self): inst = model.Model('test:///default', objstore_loc=self.tmp_store) diff --git a/tests/test_rest.py b/tests/test_rest.py index b1b9f12..4c1ed14 100644 --- a/tests/test_rest.py +++ b/tests/test_rest.py @@ -301,6 +301,24 @@ class RestTests(unittest.TestCase): resp = self.request('/plugins/kimchi/vms/∨м-црdαtеd', req, 'PUT') self.assertEquals(400, resp.status)
+ # set vm autostart tests (powered off) + resp = self.request('/plugins/kimchi/vms/vm-1/start', '{}', 'POST') + self.assertEquals(200, resp.status) + req = json.dumps({"autostart": True}) + resp = self.request('/plugins/kimchi/vms/vm-1', req, 'PUT') + self.assertEquals(200, resp.status) + resp = self.request('/plugins/kimchi/vms/vm-1', '{}', 'GET').read() + self.assertEquals(resp["autostart"], True) + + # set vm autostart tests (running) + resp = self.request('/plugins/kimchi/vms/vm-1/poweroff', '{}', 'POST') + self.assertEquals(200, resp.status) + req = json.dumps({"autostart": False}) + resp = self.request('/plugins/kimchi/vms/vm-1', req, 'PUT') + self.assertEquals(200, resp.status) + resp = self.request('/plugins/kimchi/vms/vm-1', '{}', 'GET').read() + self.assertEquals(resp["autostart"], True) + def test_vm_lifecycle(self): # Create a Template req = json.dumps({'name': 'test',
-- Ramon Nunes Medeiros Kimchi Developer Linux Technology Center Brazil IBM Systems & Technology Group Phone : +55 19 2132 7878 ramonn@br.ibm.com

Hi Bianca, Some tests are still failing. ***** Running unit test: test_rest... FAILED ====================================================================== FAIL: test_edit_vm (test_rest.HttpsRestTests) ---------------------------------------------------------------------- Traceback (most recent call last): File "test_rest.py", line 316, in test_edit_vm self.assertEquals(200, resp.status) AssertionError: 200 != 404 ====================================================================== FAIL: test_edit_vm (test_rest.RestTests) ---------------------------------------------------------------------- Traceback (most recent call last): File "test_rest.py", line 316, in test_edit_vm self.assertEquals(200, resp.status) AssertionError: 200 != 404 ====================================================================== FAIL: test_unnamed_vms (test_rest.RestTests) ---------------------------------------------------------------------- Traceback (most recent call last): File "test_rest.py", line 1153, in test_unnamed_vms self.assertEquals(resp.status, 200) AssertionError: 404 != 200 ---------------------------------------------------------------------- Ran 42 tests in 231.810s FAILED (failures=3) On 09/05/2016 05:17 PM, bianca@linux.vnet.ibm.com wrote:
From: Bianca Carvalho <bianca@linux.vnet.ibm.com>
Include 'autostart' option in API.json and vms.py (lookup and update) using libvirt dom.setAutostart to set as true or false. Also edit test_model.py to include those changes and updated API.md file. Also included API tests to test_rest.py in test_edit_vm function.
Signed-off-by: Bianca Carvalho <bianca@linux.vnet.ibm.com> --- API.json | 4 ++++ docs/API.md | 3 +++ model/vms.py | 11 ++++++++--- tests/test_mockmodel.py | 2 +- tests/test_model.py | 8 +++++++- tests/test_rest.py | 18 ++++++++++++++++++ 6 files changed, 41 insertions(+), 5 deletions(-)
diff --git a/API.json b/API.json index adaa2f7..e72c68d 100644 --- a/API.json +++ b/API.json @@ -369,6 +369,10 @@ "error": "KCHVM0053E", "type": "boolean" }, + "autostart": { + "description": "Enable/Disable guest autostart", + "type": "boolean" + }, "users": { "description": "Array of users who have permission to the VM", "type": "array", diff --git a/docs/API.md b/docs/API.md index 15f0007..43bb04b 100644 --- a/docs/API.md +++ b/docs/API.md @@ -151,6 +151,8 @@ server. * bootorder: list of devices in boot order * description: VM description * title: VM title + * autostart: show if autostart is enabled. + * **DELETE**: Remove the Virtual Machine * **PUT**: update the parameters of existing VM * name: New name for this VM (only applied for shutoff VM) @@ -183,6 +185,7 @@ server. * bootmenu: prompts guest bootmenu. Bool type. * description: VM description * title: VM title + * autostart: enable/disable guest autostart (true or false params).
* **POST**: *See Virtual Machine Actions*
diff --git a/model/vms.py b/model/vms.py index f13e605..a8e1c14 100644 --- a/model/vms.py +++ b/model/vms.py @@ -80,12 +80,13 @@ DOM_STATE_MAP = {0: 'nostate', 7: 'pmsuspended'}
# update parameters which are updatable when the VM is online -VM_ONLINE_UPDATE_PARAMS = ['graphics', 'groups', 'memory', 'users'] +VM_ONLINE_UPDATE_PARAMS = ['graphics', 'groups', 'memory', 'users', + 'autostart']
# update parameters which are updatable when the VM is offline VM_OFFLINE_UPDATE_PARAMS = ['cpu_info', 'graphics', 'groups', 'memory', 'name', 'users', 'bootorder', 'bootmenu', - 'description', 'title'] + 'description', 'title', 'autostart']
XPATH_DOMAIN_DISK = "/domain/devices/disk[@device='disk']/source/@file" XPATH_DOMAIN_DISK_BY_FILE = "./devices/disk[@device='disk']/source[@file='%s']" @@ -270,6 +271,9 @@ class VMModel(object):
with lock: dom = self.get_vm(name, self.conn) + if "autostart" in params: + dom.setAutostart(1 if params['autostart'] == True else 0) + # You can only change <maxMemory> offline, updating guest XML if ("memory" in params) and ('maxmemory' in params['memory']) and\ (DOM_STATE_MAP[dom.info()[0]] != 'shutoff'): @@ -1314,7 +1318,8 @@ class VMModel(object): 'access': 'full', 'persistent': True if dom.isPersistent() else False, 'bootorder': boot, - 'bootmenu': bootmenu + 'bootmenu': bootmenu, + 'autostart': dom.autostart() }
def _vm_get_disk_paths(self, dom): diff --git a/tests/test_mockmodel.py b/tests/test_mockmodel.py index 147942c..ffd383c 100644 --- a/tests/test_mockmodel.py +++ b/tests/test_mockmodel.py @@ -164,7 +164,7 @@ class MockModelTests(unittest.TestCase): keys = set(('name', 'state', 'stats', 'uuid', 'memory', 'cpu_info', 'screenshot', 'icon', 'graphics', 'users', 'groups', 'access', 'persistent', 'bootorder', 'bootmenu', 'title', - 'description')) + 'description', 'autostart'))
stats_keys = set(('cpu_utilization', 'mem_utilization', 'net_throughput', 'net_throughput_peak', diff --git a/tests/test_model.py b/tests/test_model.py index d9ffd5e..2ed5e65 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -129,7 +129,7 @@ class ModelTests(unittest.TestCase): keys = set(('name', 'state', 'stats', 'uuid', 'memory', 'cpu_info', 'screenshot', 'icon', 'graphics', 'users', 'groups', 'access', 'persistent', 'bootorder', 'bootmenu', 'title', - 'description')) + 'description', 'autostart'))
stats_keys = set(('cpu_utilization', 'mem_utilization', 'net_throughput', 'net_throughput_peak', @@ -1362,6 +1362,12 @@ class ModelTests(unittest.TestCase): inst.vm_update(u'пeω-∨м', {"bootmenu": False}) self.assertEquals("no", inst.vm_lookup(u'пeω-∨м')['bootmenu'])
+ # enable/disable autostart + inst.vm_update(u'пeω-∨м', {"autostart": True}) + self.assertEquals(1, inst.vm_lookup(u'пeω-∨м')['autostart']) + inst.vm_update(u'пeω-∨м', {"autostart": False}) + self.assertEquals(0, inst.vm_lookup(u'пeω-∨м')['autostart']) + def test_get_interfaces(self): inst = model.Model('test:///default', objstore_loc=self.tmp_store) diff --git a/tests/test_rest.py b/tests/test_rest.py index b1b9f12..4c1ed14 100644 --- a/tests/test_rest.py +++ b/tests/test_rest.py @@ -301,6 +301,24 @@ class RestTests(unittest.TestCase): resp = self.request('/plugins/kimchi/vms/∨м-црdαtеd', req, 'PUT') self.assertEquals(400, resp.status)
+ # set vm autostart tests (powered off) + resp = self.request('/plugins/kimchi/vms/vm-1/start', '{}', 'POST') + self.assertEquals(200, resp.status) + req = json.dumps({"autostart": True}) + resp = self.request('/plugins/kimchi/vms/vm-1', req, 'PUT') + self.assertEquals(200, resp.status) + resp = self.request('/plugins/kimchi/vms/vm-1', '{}', 'GET').read() + self.assertEquals(resp["autostart"], True) + + # set vm autostart tests (running) + resp = self.request('/plugins/kimchi/vms/vm-1/poweroff', '{}', 'POST') + self.assertEquals(200, resp.status) + req = json.dumps({"autostart": False}) + resp = self.request('/plugins/kimchi/vms/vm-1', req, 'PUT') + self.assertEquals(200, resp.status) + resp = self.request('/plugins/kimchi/vms/vm-1', '{}', 'GET').read() + self.assertEquals(resp["autostart"], True) + def test_vm_lifecycle(self): # Create a Template req = json.dumps({'name': 'test',

'make check-local' is also failing: ./model/vms.py:275:59: E712 comparison to True should be 'if cond is True:' or 'if cond:' Makefile:1062: recipe for target 'check-local' failed On 09/05/2016 07:07 PM, Aline Manera wrote:
Hi Bianca,
Some tests are still failing.
***** Running unit test: test_rest... FAILED ====================================================================== FAIL: test_edit_vm (test_rest.HttpsRestTests) ---------------------------------------------------------------------- Traceback (most recent call last): File "test_rest.py", line 316, in test_edit_vm self.assertEquals(200, resp.status) AssertionError: 200 != 404
====================================================================== FAIL: test_edit_vm (test_rest.RestTests) ---------------------------------------------------------------------- Traceback (most recent call last): File "test_rest.py", line 316, in test_edit_vm self.assertEquals(200, resp.status) AssertionError: 200 != 404
====================================================================== FAIL: test_unnamed_vms (test_rest.RestTests) ---------------------------------------------------------------------- Traceback (most recent call last): File "test_rest.py", line 1153, in test_unnamed_vms self.assertEquals(resp.status, 200) AssertionError: 404 != 200
---------------------------------------------------------------------- Ran 42 tests in 231.810s
FAILED (failures=3)
On 09/05/2016 05:17 PM, bianca@linux.vnet.ibm.com wrote:
From: Bianca Carvalho <bianca@linux.vnet.ibm.com>
Include 'autostart' option in API.json and vms.py (lookup and update) using libvirt dom.setAutostart to set as true or false. Also edit test_model.py to include those changes and updated API.md file. Also included API tests to test_rest.py in test_edit_vm function.
Signed-off-by: Bianca Carvalho <bianca@linux.vnet.ibm.com> --- API.json | 4 ++++ docs/API.md | 3 +++ model/vms.py | 11 ++++++++--- tests/test_mockmodel.py | 2 +- tests/test_model.py | 8 +++++++- tests/test_rest.py | 18 ++++++++++++++++++ 6 files changed, 41 insertions(+), 5 deletions(-)
diff --git a/API.json b/API.json index adaa2f7..e72c68d 100644 --- a/API.json +++ b/API.json @@ -369,6 +369,10 @@ "error": "KCHVM0053E", "type": "boolean" }, + "autostart": { + "description": "Enable/Disable guest autostart", + "type": "boolean" + }, "users": { "description": "Array of users who have permission to the VM", "type": "array", diff --git a/docs/API.md b/docs/API.md index 15f0007..43bb04b 100644 --- a/docs/API.md +++ b/docs/API.md @@ -151,6 +151,8 @@ server. * bootorder: list of devices in boot order * description: VM description * title: VM title + * autostart: show if autostart is enabled. + * **DELETE**: Remove the Virtual Machine * **PUT**: update the parameters of existing VM * name: New name for this VM (only applied for shutoff VM) @@ -183,6 +185,7 @@ server. * bootmenu: prompts guest bootmenu. Bool type. * description: VM description * title: VM title + * autostart: enable/disable guest autostart (true or false params).
* **POST**: *See Virtual Machine Actions*
diff --git a/model/vms.py b/model/vms.py index f13e605..a8e1c14 100644 --- a/model/vms.py +++ b/model/vms.py @@ -80,12 +80,13 @@ DOM_STATE_MAP = {0: 'nostate', 7: 'pmsuspended'}
# update parameters which are updatable when the VM is online -VM_ONLINE_UPDATE_PARAMS = ['graphics', 'groups', 'memory', 'users'] +VM_ONLINE_UPDATE_PARAMS = ['graphics', 'groups', 'memory', 'users', + 'autostart']
# update parameters which are updatable when the VM is offline VM_OFFLINE_UPDATE_PARAMS = ['cpu_info', 'graphics', 'groups', 'memory', 'name', 'users', 'bootorder', 'bootmenu', - 'description', 'title'] + 'description', 'title', 'autostart']
XPATH_DOMAIN_DISK = "/domain/devices/disk[@device='disk']/source/@file" XPATH_DOMAIN_DISK_BY_FILE = "./devices/disk[@device='disk']/source[@file='%s']" @@ -270,6 +271,9 @@ class VMModel(object):
with lock: dom = self.get_vm(name, self.conn) + if "autostart" in params: + dom.setAutostart(1 if params['autostart'] == True else 0) + # You can only change <maxMemory> offline, updating guest XML if ("memory" in params) and ('maxmemory' in params['memory']) and\ (DOM_STATE_MAP[dom.info()[0]] != 'shutoff'): @@ -1314,7 +1318,8 @@ class VMModel(object): 'access': 'full', 'persistent': True if dom.isPersistent() else False, 'bootorder': boot, - 'bootmenu': bootmenu + 'bootmenu': bootmenu, + 'autostart': dom.autostart() }
def _vm_get_disk_paths(self, dom): diff --git a/tests/test_mockmodel.py b/tests/test_mockmodel.py index 147942c..ffd383c 100644 --- a/tests/test_mockmodel.py +++ b/tests/test_mockmodel.py @@ -164,7 +164,7 @@ class MockModelTests(unittest.TestCase): keys = set(('name', 'state', 'stats', 'uuid', 'memory', 'cpu_info', 'screenshot', 'icon', 'graphics', 'users', 'groups', 'access', 'persistent', 'bootorder', 'bootmenu', 'title', - 'description')) + 'description', 'autostart'))
stats_keys = set(('cpu_utilization', 'mem_utilization', 'net_throughput', 'net_throughput_peak', diff --git a/tests/test_model.py b/tests/test_model.py index d9ffd5e..2ed5e65 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -129,7 +129,7 @@ class ModelTests(unittest.TestCase): keys = set(('name', 'state', 'stats', 'uuid', 'memory', 'cpu_info', 'screenshot', 'icon', 'graphics', 'users', 'groups', 'access', 'persistent', 'bootorder', 'bootmenu', 'title', - 'description')) + 'description', 'autostart'))
stats_keys = set(('cpu_utilization', 'mem_utilization', 'net_throughput', 'net_throughput_peak', @@ -1362,6 +1362,12 @@ class ModelTests(unittest.TestCase): inst.vm_update(u'пeω-∨м', {"bootmenu": False}) self.assertEquals("no", inst.vm_lookup(u'пeω-∨м')['bootmenu'])
+ # enable/disable autostart + inst.vm_update(u'пeω-∨м', {"autostart": True}) + self.assertEquals(1, inst.vm_lookup(u'пeω-∨м')['autostart']) + inst.vm_update(u'пeω-∨м', {"autostart": False}) + self.assertEquals(0, inst.vm_lookup(u'пeω-∨м')['autostart']) + def test_get_interfaces(self): inst = model.Model('test:///default', objstore_loc=self.tmp_store) diff --git a/tests/test_rest.py b/tests/test_rest.py index b1b9f12..4c1ed14 100644 --- a/tests/test_rest.py +++ b/tests/test_rest.py @@ -301,6 +301,24 @@ class RestTests(unittest.TestCase): resp = self.request('/plugins/kimchi/vms/∨м-црdαtеd', req, 'PUT') self.assertEquals(400, resp.status)
+ # set vm autostart tests (powered off) + resp = self.request('/plugins/kimchi/vms/vm-1/start', '{}', 'POST') + self.assertEquals(200, resp.status) + req = json.dumps({"autostart": True}) + resp = self.request('/plugins/kimchi/vms/vm-1', req, 'PUT') + self.assertEquals(200, resp.status) + resp = self.request('/plugins/kimchi/vms/vm-1', '{}', 'GET').read() + self.assertEquals(resp["autostart"], True) + + # set vm autostart tests (running) + resp = self.request('/plugins/kimchi/vms/vm-1/poweroff', '{}', 'POST') + self.assertEquals(200, resp.status) + req = json.dumps({"autostart": False}) + resp = self.request('/plugins/kimchi/vms/vm-1', req, 'PUT') + self.assertEquals(200, resp.status) + resp = self.request('/plugins/kimchi/vms/vm-1', '{}', 'GET').read() + self.assertEquals(resp["autostart"], True) + def test_vm_lifecycle(self): # Create a Template req = json.dumps({'name': 'test',
_______________________________________________ Kimchi-devel mailing list Kimchi-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/kimchi-devel

I think my environment is messed up, I can't see those errors :/ let's talk about it tomorrow. Thanks! Em 9/5/16 7:07 PM, Aline Manera escreveu:
Hi Bianca,
Some tests are still failing.
***** Running unit test: test_rest... FAILED ====================================================================== FAIL: test_edit_vm (test_rest.HttpsRestTests) ---------------------------------------------------------------------- Traceback (most recent call last): File "test_rest.py", line 316, in test_edit_vm self.assertEquals(200, resp.status) AssertionError: 200 != 404
====================================================================== FAIL: test_edit_vm (test_rest.RestTests) ---------------------------------------------------------------------- Traceback (most recent call last): File "test_rest.py", line 316, in test_edit_vm self.assertEquals(200, resp.status) AssertionError: 200 != 404
====================================================================== FAIL: test_unnamed_vms (test_rest.RestTests) ---------------------------------------------------------------------- Traceback (most recent call last): File "test_rest.py", line 1153, in test_unnamed_vms self.assertEquals(resp.status, 200) AssertionError: 404 != 200
---------------------------------------------------------------------- Ran 42 tests in 231.810s
FAILED (failures=3)
On 09/05/2016 05:17 PM, bianca@linux.vnet.ibm.com wrote:
From: Bianca Carvalho <bianca@linux.vnet.ibm.com>
Include 'autostart' option in API.json and vms.py (lookup and update) using libvirt dom.setAutostart to set as true or false. Also edit test_model.py to include those changes and updated API.md file. Also included API tests to test_rest.py in test_edit_vm function.
Signed-off-by: Bianca Carvalho <bianca@linux.vnet.ibm.com> --- API.json | 4 ++++ docs/API.md | 3 +++ model/vms.py | 11 ++++++++--- tests/test_mockmodel.py | 2 +- tests/test_model.py | 8 +++++++- tests/test_rest.py | 18 ++++++++++++++++++ 6 files changed, 41 insertions(+), 5 deletions(-)
diff --git a/API.json b/API.json index adaa2f7..e72c68d 100644 --- a/API.json +++ b/API.json @@ -369,6 +369,10 @@ "error": "KCHVM0053E", "type": "boolean" }, + "autostart": { + "description": "Enable/Disable guest autostart", + "type": "boolean" + }, "users": { "description": "Array of users who have permission to the VM", "type": "array", diff --git a/docs/API.md b/docs/API.md index 15f0007..43bb04b 100644 --- a/docs/API.md +++ b/docs/API.md @@ -151,6 +151,8 @@ server. * bootorder: list of devices in boot order * description: VM description * title: VM title + * autostart: show if autostart is enabled. + * **DELETE**: Remove the Virtual Machine * **PUT**: update the parameters of existing VM * name: New name for this VM (only applied for shutoff VM) @@ -183,6 +185,7 @@ server. * bootmenu: prompts guest bootmenu. Bool type. * description: VM description * title: VM title + * autostart: enable/disable guest autostart (true or false params).
* **POST**: *See Virtual Machine Actions*
diff --git a/model/vms.py b/model/vms.py index f13e605..a8e1c14 100644 --- a/model/vms.py +++ b/model/vms.py @@ -80,12 +80,13 @@ DOM_STATE_MAP = {0: 'nostate', 7: 'pmsuspended'}
# update parameters which are updatable when the VM is online -VM_ONLINE_UPDATE_PARAMS = ['graphics', 'groups', 'memory', 'users'] +VM_ONLINE_UPDATE_PARAMS = ['graphics', 'groups', 'memory', 'users', + 'autostart']
# update parameters which are updatable when the VM is offline VM_OFFLINE_UPDATE_PARAMS = ['cpu_info', 'graphics', 'groups', 'memory', 'name', 'users', 'bootorder', 'bootmenu', - 'description', 'title'] + 'description', 'title', 'autostart']
XPATH_DOMAIN_DISK = "/domain/devices/disk[@device='disk']/source/@file" XPATH_DOMAIN_DISK_BY_FILE = "./devices/disk[@device='disk']/source[@file='%s']" @@ -270,6 +271,9 @@ class VMModel(object):
with lock: dom = self.get_vm(name, self.conn) + if "autostart" in params: + dom.setAutostart(1 if params['autostart'] == True else 0) + # You can only change <maxMemory> offline, updating guest XML if ("memory" in params) and ('maxmemory' in params['memory']) and\ (DOM_STATE_MAP[dom.info()[0]] != 'shutoff'): @@ -1314,7 +1318,8 @@ class VMModel(object): 'access': 'full', 'persistent': True if dom.isPersistent() else False, 'bootorder': boot, - 'bootmenu': bootmenu + 'bootmenu': bootmenu, + 'autostart': dom.autostart() }
def _vm_get_disk_paths(self, dom): diff --git a/tests/test_mockmodel.py b/tests/test_mockmodel.py index 147942c..ffd383c 100644 --- a/tests/test_mockmodel.py +++ b/tests/test_mockmodel.py @@ -164,7 +164,7 @@ class MockModelTests(unittest.TestCase): keys = set(('name', 'state', 'stats', 'uuid', 'memory', 'cpu_info', 'screenshot', 'icon', 'graphics', 'users', 'groups', 'access', 'persistent', 'bootorder', 'bootmenu', 'title', - 'description')) + 'description', 'autostart'))
stats_keys = set(('cpu_utilization', 'mem_utilization', 'net_throughput', 'net_throughput_peak', diff --git a/tests/test_model.py b/tests/test_model.py index d9ffd5e..2ed5e65 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -129,7 +129,7 @@ class ModelTests(unittest.TestCase): keys = set(('name', 'state', 'stats', 'uuid', 'memory', 'cpu_info', 'screenshot', 'icon', 'graphics', 'users', 'groups', 'access', 'persistent', 'bootorder', 'bootmenu', 'title', - 'description')) + 'description', 'autostart'))
stats_keys = set(('cpu_utilization', 'mem_utilization', 'net_throughput', 'net_throughput_peak', @@ -1362,6 +1362,12 @@ class ModelTests(unittest.TestCase): inst.vm_update(u'пeω-∨м', {"bootmenu": False}) self.assertEquals("no", inst.vm_lookup(u'пeω-∨м')['bootmenu'])
+ # enable/disable autostart + inst.vm_update(u'пeω-∨м', {"autostart": True}) + self.assertEquals(1, inst.vm_lookup(u'пeω-∨м')['autostart']) + inst.vm_update(u'пeω-∨м', {"autostart": False}) + self.assertEquals(0, inst.vm_lookup(u'пeω-∨м')['autostart']) + def test_get_interfaces(self): inst = model.Model('test:///default', objstore_loc=self.tmp_store) diff --git a/tests/test_rest.py b/tests/test_rest.py index b1b9f12..4c1ed14 100644 --- a/tests/test_rest.py +++ b/tests/test_rest.py @@ -301,6 +301,24 @@ class RestTests(unittest.TestCase): resp = self.request('/plugins/kimchi/vms/∨м-црdαtеd', req, 'PUT') self.assertEquals(400, resp.status)
+ # set vm autostart tests (powered off) + resp = self.request('/plugins/kimchi/vms/vm-1/start', '{}', 'POST') + self.assertEquals(200, resp.status) + req = json.dumps({"autostart": True}) + resp = self.request('/plugins/kimchi/vms/vm-1', req, 'PUT') + self.assertEquals(200, resp.status) + resp = self.request('/plugins/kimchi/vms/vm-1', '{}', 'GET').read() + self.assertEquals(resp["autostart"], True) + + # set vm autostart tests (running) + resp = self.request('/plugins/kimchi/vms/vm-1/poweroff', '{}', 'POST') + self.assertEquals(200, resp.status) + req = json.dumps({"autostart": False}) + resp = self.request('/plugins/kimchi/vms/vm-1', req, 'PUT') + self.assertEquals(200, resp.status) + resp = self.request('/plugins/kimchi/vms/vm-1', '{}', 'GET').read() + self.assertEquals(resp["autostart"], True) + def test_vm_lifecycle(self): # Create a Template req = json.dumps({'name': 'test',

Like Bianca, I don't see any error when using 'make check-local' on my Fedora 24 box. The pep8 installed is: /usr/bin/pep8 --version 1.6.2 We should close a base distro version ASAP, since we're in code feeze now, and base the check-local and execution of test cases on these version. On Sep 05 10:59PM, Bianca Carvalho wrote:
I think my environment is messed up, I can't see those errors :/ let's talk about it tomorrow.
Thanks!
Em 9/5/16 7:07 PM, Aline Manera escreveu:
Hi Bianca,
Some tests are still failing.
***** Running unit test: test_rest... FAILED ====================================================================== FAIL: test_edit_vm (test_rest.HttpsRestTests) ---------------------------------------------------------------------- Traceback (most recent call last): File "test_rest.py", line 316, in test_edit_vm self.assertEquals(200, resp.status) AssertionError: 200 != 404
====================================================================== FAIL: test_edit_vm (test_rest.RestTests) ---------------------------------------------------------------------- Traceback (most recent call last): File "test_rest.py", line 316, in test_edit_vm self.assertEquals(200, resp.status) AssertionError: 200 != 404
====================================================================== FAIL: test_unnamed_vms (test_rest.RestTests) ---------------------------------------------------------------------- Traceback (most recent call last): File "test_rest.py", line 1153, in test_unnamed_vms self.assertEquals(resp.status, 200) AssertionError: 404 != 200
---------------------------------------------------------------------- Ran 42 tests in 231.810s
FAILED (failures=3)
On 09/05/2016 05:17 PM, bianca@linux.vnet.ibm.com wrote:
From: Bianca Carvalho <bianca@linux.vnet.ibm.com>
Include 'autostart' option in API.json and vms.py (lookup and update) using libvirt dom.setAutostart to set as true or false. Also edit test_model.py to include those changes and updated API.md file. Also included API tests to test_rest.py in test_edit_vm function.
Signed-off-by: Bianca Carvalho <bianca@linux.vnet.ibm.com> --- API.json | 4 ++++ docs/API.md | 3 +++ model/vms.py | 11 ++++++++--- tests/test_mockmodel.py | 2 +- tests/test_model.py | 8 +++++++- tests/test_rest.py | 18 ++++++++++++++++++ 6 files changed, 41 insertions(+), 5 deletions(-)
diff --git a/API.json b/API.json index adaa2f7..e72c68d 100644 --- a/API.json +++ b/API.json @@ -369,6 +369,10 @@ "error": "KCHVM0053E", "type": "boolean" }, + "autostart": { + "description": "Enable/Disable guest autostart", + "type": "boolean" + }, "users": { "description": "Array of users who have permission to the VM", "type": "array", diff --git a/docs/API.md b/docs/API.md index 15f0007..43bb04b 100644 --- a/docs/API.md +++ b/docs/API.md @@ -151,6 +151,8 @@ server. * bootorder: list of devices in boot order * description: VM description * title: VM title + * autostart: show if autostart is enabled. + * **DELETE**: Remove the Virtual Machine * **PUT**: update the parameters of existing VM * name: New name for this VM (only applied for shutoff VM) @@ -183,6 +185,7 @@ server. * bootmenu: prompts guest bootmenu. Bool type. * description: VM description * title: VM title + * autostart: enable/disable guest autostart (true or false params).
* **POST**: *See Virtual Machine Actions*
diff --git a/model/vms.py b/model/vms.py index f13e605..a8e1c14 100644 --- a/model/vms.py +++ b/model/vms.py @@ -80,12 +80,13 @@ DOM_STATE_MAP = {0: 'nostate', 7: 'pmsuspended'}
# update parameters which are updatable when the VM is online -VM_ONLINE_UPDATE_PARAMS = ['graphics', 'groups', 'memory', 'users'] +VM_ONLINE_UPDATE_PARAMS = ['graphics', 'groups', 'memory', 'users', + 'autostart']
# update parameters which are updatable when the VM is offline VM_OFFLINE_UPDATE_PARAMS = ['cpu_info', 'graphics', 'groups', 'memory', 'name', 'users', 'bootorder', 'bootmenu', - 'description', 'title'] + 'description', 'title', 'autostart']
XPATH_DOMAIN_DISK = "/domain/devices/disk[@device='disk']/source/@file" XPATH_DOMAIN_DISK_BY_FILE = "./devices/disk[@device='disk']/source[@file='%s']" @@ -270,6 +271,9 @@ class VMModel(object):
with lock: dom = self.get_vm(name, self.conn) + if "autostart" in params: + dom.setAutostart(1 if params['autostart'] == True else 0) + # You can only change <maxMemory> offline, updating guest XML if ("memory" in params) and ('maxmemory' in params['memory']) and\ (DOM_STATE_MAP[dom.info()[0]] != 'shutoff'): @@ -1314,7 +1318,8 @@ class VMModel(object): 'access': 'full', 'persistent': True if dom.isPersistent() else False, 'bootorder': boot, - 'bootmenu': bootmenu + 'bootmenu': bootmenu, + 'autostart': dom.autostart() }
def _vm_get_disk_paths(self, dom): diff --git a/tests/test_mockmodel.py b/tests/test_mockmodel.py index 147942c..ffd383c 100644 --- a/tests/test_mockmodel.py +++ b/tests/test_mockmodel.py @@ -164,7 +164,7 @@ class MockModelTests(unittest.TestCase): keys = set(('name', 'state', 'stats', 'uuid', 'memory', 'cpu_info', 'screenshot', 'icon', 'graphics', 'users', 'groups', 'access', 'persistent', 'bootorder', 'bootmenu', 'title', - 'description')) + 'description', 'autostart'))
stats_keys = set(('cpu_utilization', 'mem_utilization', 'net_throughput', 'net_throughput_peak', diff --git a/tests/test_model.py b/tests/test_model.py index d9ffd5e..2ed5e65 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -129,7 +129,7 @@ class ModelTests(unittest.TestCase): keys = set(('name', 'state', 'stats', 'uuid', 'memory', 'cpu_info', 'screenshot', 'icon', 'graphics', 'users', 'groups', 'access', 'persistent', 'bootorder', 'bootmenu', 'title', - 'description')) + 'description', 'autostart'))
stats_keys = set(('cpu_utilization', 'mem_utilization', 'net_throughput', 'net_throughput_peak', @@ -1362,6 +1362,12 @@ class ModelTests(unittest.TestCase): inst.vm_update(u'пeω-∨м', {"bootmenu": False}) self.assertEquals("no", inst.vm_lookup(u'пeω-∨м')['bootmenu'])
+ # enable/disable autostart + inst.vm_update(u'пeω-∨м', {"autostart": True}) + self.assertEquals(1, inst.vm_lookup(u'пeω-∨м')['autostart']) + inst.vm_update(u'пeω-∨м', {"autostart": False}) + self.assertEquals(0, inst.vm_lookup(u'пeω-∨м')['autostart']) + def test_get_interfaces(self): inst = model.Model('test:///default', objstore_loc=self.tmp_store) diff --git a/tests/test_rest.py b/tests/test_rest.py index b1b9f12..4c1ed14 100644 --- a/tests/test_rest.py +++ b/tests/test_rest.py @@ -301,6 +301,24 @@ class RestTests(unittest.TestCase): resp = self.request('/plugins/kimchi/vms/∨м-црdαtеd', req, 'PUT') self.assertEquals(400, resp.status)
+ # set vm autostart tests (powered off) + resp = self.request('/plugins/kimchi/vms/vm-1/start', '{}', 'POST') + self.assertEquals(200, resp.status) + req = json.dumps({"autostart": True}) + resp = self.request('/plugins/kimchi/vms/vm-1', req, 'PUT') + self.assertEquals(200, resp.status) + resp = self.request('/plugins/kimchi/vms/vm-1', '{}', 'GET').read() + self.assertEquals(resp["autostart"], True) + + # set vm autostart tests (running) + resp = self.request('/plugins/kimchi/vms/vm-1/poweroff', '{}', 'POST') + self.assertEquals(200, resp.status) + req = json.dumps({"autostart": False}) + resp = self.request('/plugins/kimchi/vms/vm-1', req, 'PUT') + self.assertEquals(200, resp.status) + resp = self.request('/plugins/kimchi/vms/vm-1', '{}', 'GET').read() + self.assertEquals(resp["autostart"], True) + def test_vm_lifecycle(self): # Create a Template req = json.dumps({'name': 'test',
_______________________________________________ Kimchi-devel mailing list Kimchi-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/kimchi-devel
-- Paulo Ricardo Paz Vital Linux Technology Center, IBM Systems http://www.ibm.com/linux/ltc/
participants (5)
-
Aline Manera
-
Bianca Carvalho
-
bianca@linux.vnet.ibm.com
-
Paulo Ricardo Paz Vital
-
Ramon Medeiros