[Kimchi-devel] [PATCH] [Kimchi 3/3] Add support to check if libvirtd is running.

pvital at linux.vnet.ibm.com pvital at linux.vnet.ibm.com
Mon May 9 12:56:02 UTC 2016


From: Paulo Vital <pvital at linux.vnet.ibm.com>

Created method check if libvirtd is running to notify user in UI about the not
availability of the server and update CapabilitiesModel to provide the same
information to UI/user.

This patch is part of the solution for Issue #201

Signed-off-by: Paulo Vital <pvital at linux.vnet.ibm.com>
---
 i18n.py                    |  1 +
 model/config.py            | 29 +++++++++++++++++++++--------
 model/libvirtconnection.py |  7 +++++++
 model/templates.py         |  5 ++++-
 utils.py                   | 16 +++++++++++++++-
 5 files changed, 48 insertions(+), 10 deletions(-)

diff --git a/i18n.py b/i18n.py
index 157f820..2301e60 100644
--- a/i18n.py
+++ b/i18n.py
@@ -332,5 +332,6 @@ messages = {
     "KCHLVMS0001E": _("Invalid volume group name parameter: %(name)s."),
 
     "KCHCONN0001E": _("Unable to establish connection with libvirt. Please check your libvirt URI which is often defined in /etc/libvirt/libvirt.conf"),
+    "KCHCONN0002E": _("Libvirt service is not active. Please start the libvirt service in your host system."),
 
 }
diff --git a/model/config.py b/model/config.py
index 39e4efa..58a82df 100644
--- a/model/config.py
+++ b/model/config.py
@@ -31,7 +31,7 @@ from wok.plugins.kimchi.model.featuretests import FeatureTests
 from wok.plugins.kimchi.model.featuretests import FEATURETEST_POOL_NAME
 from wok.plugins.kimchi.model.featuretests import FEATURETEST_VM_NAME
 from wok.plugins.kimchi.screenshot import VMScreenshot
-from wok.plugins.kimchi.utils import check_url_path
+from wok.plugins.kimchi.utils import check_url_path, is_libvirtd_up
 
 
 class ConfigModel(object):
@@ -55,6 +55,7 @@ class CapabilitiesModel(object):
         self.kernel_vfio = False
         self.nm_running = False
         self.mem_hotplug_support = False
+        self.libvirtd_running = False
 
         # run feature tests
         self._set_capabilities()
@@ -106,6 +107,7 @@ class CapabilitiesModel(object):
         self.kernel_vfio = FeatureTests.kernel_support_vfio()
         self.nm_running = FeatureTests.is_nm_running()
         self.mem_hotplug_support = FeatureTests.has_mem_hotplug_support(conn)
+        self.libvirtd_running = is_libvirtd_up()
         wok_log.info("*** Feature tests completed ***")
     _set_capabilities.priority = 90
 
@@ -122,13 +124,24 @@ class CapabilitiesModel(object):
         return False
 
     def lookup(self, *ident):
-        return {'libvirt_stream_protocols': self.libvirt_stream_protocols,
-                'qemu_spice': self._qemu_support_spice(),
-                'qemu_stream': self.qemu_stream,
-                'screenshot': VMScreenshot.get_stream_test_result(),
-                'kernel_vfio': self.kernel_vfio,
-                'nm_running': FeatureTests.is_nm_running(),
-                'mem_hotplug_support': self.mem_hotplug_support}
+        if not is_libvirtd_up():
+            return {'libvirt_stream_protocols': [],
+                    'qemu_spice': False,
+                    'qemu_stream': False,
+                    'screenshot': None,
+                    'kernel_vfio': self.kernel_vfio,
+                    'nm_running': FeatureTests.is_nm_running(),
+                    'mem_hotplug_support': False,
+                    'libvirtd_running': False}
+        else:
+            return {'libvirt_stream_protocols': self.libvirt_stream_protocols,
+                    'qemu_spice': self._qemu_support_spice(),
+                    'qemu_stream': self.qemu_stream,
+                    'screenshot': VMScreenshot.get_stream_test_result(),
+                    'kernel_vfio': self.kernel_vfio,
+                    'nm_running': FeatureTests.is_nm_running(),
+                    'mem_hotplug_support': self.mem_hotplug_support,
+                    'libvirtd_running': True}
 
 
 class DistrosModel(object):
diff --git a/model/libvirtconnection.py b/model/libvirtconnection.py
index 113378e..89d5475 100644
--- a/model/libvirtconnection.py
+++ b/model/libvirtconnection.py
@@ -25,6 +25,8 @@ import time
 from wok.objectstore import add_notification
 from wok.utils import wok_log
 
+from wok.plugins.kimchi.utils import is_libvirtd_up
+
 
 class LibvirtConnection(object):
     _connections = {}
@@ -85,6 +87,11 @@ class LibvirtConnection(object):
             wrapper.__doc__ = f.__doc__
             return wrapper
 
+        if not is_libvirtd_up():
+            wok_log.error('Libvirt service is not active.')
+            add_notification('KCHCONN0002E', plugin_name='/plugins/kimchi')
+            return None
+
         with LibvirtConnection._connectionLock:
             conn = self._connections.get(conn_id)
             if not conn:
diff --git a/model/templates.py b/model/templates.py
index 5cdac00..25bc017 100644
--- a/model/templates.py
+++ b/model/templates.py
@@ -34,7 +34,7 @@ from wok.xmlutils.utils import xpath_get_text
 from wok.plugins.kimchi.config import get_kimchi_version
 from wok.plugins.kimchi.kvmusertests import UserTests
 from wok.plugins.kimchi.model.cpuinfo import CPUInfoModel
-from wok.plugins.kimchi.utils import pool_name_from_uri
+from wok.plugins.kimchi.utils import is_libvirtd_up, pool_name_from_uri
 from wok.plugins.kimchi.vmtemplate import VMTemplate
 
 ISO_TYPE = "ISO 9660 CD-ROM"
@@ -148,6 +148,9 @@ class TemplatesModel(object):
         return name
 
     def get_list(self):
+        if not is_libvirtd_up():
+            return []
+
         with self.objstore as session:
             return session.get_list('template')
 
diff --git a/utils.py b/utils.py
index c4cd07d..1f2a575 100644
--- a/utils.py
+++ b/utils.py
@@ -20,6 +20,7 @@
 
 import contextlib
 import json
+import platform
 import re
 import sqlite3
 import time
@@ -30,7 +31,7 @@ from urlparse import urlparse
 from wok.exception import InvalidParameter, OperationFailed
 from wok.plugins.kimchi import config
 from wok.plugins.kimchi.osinfo import get_template_default
-from wok.utils import wok_log
+from wok.utils import run_command, wok_log
 from wok.xmlutils.utils import xpath_get_text
 
 MAX_REDIRECTION_ALLOWED = 5
@@ -257,3 +258,16 @@ def get_next_clone_name(all_names, basename, name_suffix='', ts=False):
         new_name = new_name + name_suffix
 
     return new_name
+
+def is_libvirtd_up():
+    """
+    Checks if libvirtd.service is up.
+    """
+    distro, _, _ = platform.linux_distribution()
+    if distro == 'Ubuntu':
+        cmd = ['systemctl', 'is-active', 'libvirt-bin.service']
+    else:
+        cmd = ['systemctl', 'is-active', 'libvirtd.service']
+
+    output, error, rc = run_command(cmd, silent=True)
+    return True if output == 'active\n' else False
-- 
2.5.5




More information about the Kimchi-devel mailing list