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

bianca at linux.vnet.ibm.com bianca at linux.vnet.ibm.com
Mon Sep 5 20:17:08 UTC 2016


From: Bianca Carvalho <bianca at 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 at 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




More information about the Kimchi-devel mailing list