[Kimchi-devel] [PATCH V4 2/5] Update mockmodel for spice support

apporc appleorchard2000 at gmail.com
Wed Dec 25 14:51:59 UTC 2013


There is one patch in the mailling list from Markwu, which have
code about vnc in mockmodel.py removed. But at the time i rebased
this patch, that patch is not accepted yet, so i have to keep it here,
so that the test can pass.

See: [project-kimchi] [PATCH 4/4] Remove vnc related code in mockmodel

Signed-off-by: apporc <appleorchard2000 at gmail.com>
---
 src/kimchi/mockmodel.py | 49 ++++++++++++++++++++++++++++++++++---------------
 1 file changed, 34 insertions(+), 15 deletions(-)

diff --git a/src/kimchi/mockmodel.py b/src/kimchi/mockmodel.py
index 348127a..66abec8 100644
--- a/src/kimchi/mockmodel.py
+++ b/src/kimchi/mockmodel.py
@@ -51,7 +51,6 @@ from kimchi.exception import InvalidOperation, InvalidParameter
 from kimchi.exception import MissingParameter, NotFoundError, OperationFailed
 from kimchi.objectstore import ObjectStore
 from kimchi.screenshot import VMScreenshot
-from kimchi.utils import is_digit
 from kimchi.vmtemplate import VMTemplate
 
 
@@ -59,19 +58,21 @@ class MockModel(object):
     def __init__(self, objstore_loc=None):
         self.reset()
         self.objstore = ObjectStore(objstore_loc)
-        self.vnc_port = 5999
         self.distros = self._get_distros()
 
         # open vnc port
         # make it here to make sure it will be available on server startup
-        cmd = config.find_qemu_binary()
-        args = [cmd, "-vnc", ":99"]
-
-        cmd  = "ps aux | grep '%s' | grep -v grep" % " ".join(args)
-        proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
+        qemu = config.find_qemu_binary()
+        self.vnc_port = 5999
+        self.spice_port = 5998
+        vnc_args = [qemu, "-vnc", ":99"]
+        spice_args = [qemu, "-spice", "port=5998"]
 
+        cmd = 'netstat -tulnp|egrep "{0}.*qemu|{0}.*kvm"'
+        for item in [(vnc_args, self.vnc_port), (spice_args, self.spice_port)]:
+            proc = subprocess.Popen(cmd.format(item[1]), shell=True, stdout=subprocess.PIPE)
         if len(proc.stdout.readlines()) == 0:
-            p = subprocess.Popen(args, close_fds=True)
+            subprocess.Popen(item[0], close_fds=True)
 
     def get_capabilities(self):
         return {'libvirt_stream_protocols': ['http', 'https', 'ftp', 'ftps', 'tftp'],
@@ -121,7 +122,14 @@ class MockModel(object):
             vm.info['screenshot'] = self.vmscreenshot_lookup(name)
         else:
             vm.info['screenshot'] = None
-        vm.info['graphics']['port'] = self._mock_graphics_ports.get(name, None)
+        vm.info['graphics']['port'] = self._mock_graphics_ports.get(name)
+        if vm.info['graphics']['type'] == 'vnc':
+            vm.info['graphics']['real_port'] = self.vnc_port
+        elif vm.info['graphics']['type'] == 'spice':
+            vm.info['graphics']['real_port'] = self.spice_port
+        else:
+            vm.info['graphics']['real_port'] = None
+
         return vm.info
 
     def vm_delete(self, name):
@@ -140,8 +148,12 @@ class MockModel(object):
         self._get_vm(name).info['state'] = 'shutoff'
 
     def vm_connect(self, name):
-        vnc_port = kimchi.vnc.new_ws_proxy(self.vnc_port)
-        self._mock_graphics_ports[name] = vnc_port
+        vm_info = self.vm_lookup(name)
+        if vm_info['grahpics']['type'] == 'vnc':
+            port = kimchi.vnc.new_ws_proxy(self.vnc_port)
+        else:
+            port = kimchi.vnc.new_ws_proxy(self.spice_port)
+        self._mock_graphics_ports[name] = port
 
     def vms_create(self, params):
         t_name = kimchi.model.template_name_from_uri(params['template'])
@@ -159,8 +171,13 @@ class MockModel(object):
         t = self._get_template(t_name, vm_overrides)
         t.validate()
 
-        vm = MockVM(vm_uuid, name, t.info)
-        icon = t.info.get('icon')
+        t_info = copy.deepcopy(t.info)
+        graphics = params.get('graphics')
+        if graphics:
+            t_info.update({'graphics': graphics})
+
+        vm = MockVM(vm_uuid, name, t_info)
+        icon = t_info.get('icon')
         if icon:
             vm.info['icon'] = icon
 
@@ -210,7 +227,6 @@ class MockModel(object):
 
         new_t.update(params)
         ident = name
-
         new_storagepool = new_t.get(u'storagepool', '')
         try:
             self._get_storagepool(kimchi.model.pool_name_from_uri(new_storagepool))
@@ -628,7 +644,10 @@ class MockVM(object):
                      'memory': template_info['memory'],
                      'cpus': template_info['cpus'],
                      'icon': None,
-                     'graphics': {'type': 'vnc', 'port': None}}
+                     'graphics': {'type': 'vnc', 'listen': '0.0.0.0', 'port': None,
+                                  'real_port': None}
+                     }
+        self.info['graphics'].update(template_info['graphics'])
 
 
 class MockStoragePool(object):
-- 
1.8.1.2




More information about the Kimchi-devel mailing list