Tested-by: Paulo Vital <pvital(a)linux.vnet.ibm.com>
Reviewed-by: Paulo Vital <pvital(a)linux.vnet.ibm.com>
On 12/01/2015 01:37 PM, Ramon Medeiros wrote:
The file was wrongly removed on last commit. Restore it to the
correct
location.
Signed-off-by: Ramon Medeiros <ramonn(a)linux.vnet.ibm.com>
---
model/config.py | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 155 insertions(+)
create mode 100644 model/config.py
diff --git a/model/config.py b/model/config.py
new file mode 100644
index 0000000..e552edb
--- /dev/null
+++ b/model/config.py
@@ -0,0 +1,155 @@
+#
+# Project Kimchi
+#
+# Copyright IBM, Corp. 2014-2015
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+import cherrypy
+from multiprocessing.pool import ThreadPool
+
+from wok.basemodel import Singleton
+from wok.config import config as kconfig
+from wok.config import get_version
+from wok.exception import NotFoundError
+from wok.utils import run_command, wok_log
+
+from wok.plugins.kimchi.config import find_qemu_binary
+from wok.plugins.kimchi.distroloader import DistroLoader
+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
+
+
+class ConfigModel(object):
+ def __init__(self, **kargs):
+ pass
+
+ def lookup(self, name):
+ proxy_port = kconfig.get('display', 'display_proxy_port')
+ return {'display_proxy_port': proxy_port,
+ 'version': get_version()}
+
+
+class CapabilitiesModel(object):
+ __metaclass__ = Singleton
+
+ def __init__(self, **kargs):
+ self.conn = kargs['conn']
+ self.qemu_stream = False
+ self.libvirt_stream_protocols = []
+ self.fc_host_support = False
+ self.kernel_vfio = False
+ self.mem_hotplug_support = False
+
+ # Subscribe function to set host capabilities to be run when cherrypy
+ # server is up
+ # It is needed because some features tests depends on the server
+ cherrypy.engine.subscribe('start', self._set_capabilities)
+
+ # Subscribe function to clean any Kimchi leftovers
+ cherrypy.engine.subscribe('stop', self._clean_leftovers)
+
+ def _clean_leftovers(self):
+ conn = self.conn.get()
+ FeatureTests.disable_libvirt_error_logging()
+ try:
+ dom = conn.lookupByName(FEATURETEST_VM_NAME)
+ dom.undefine()
+ except Exception:
+ # Any exception can be ignored here
+ pass
+
+ try:
+ pool = conn.storagePoolLookupByName(FEATURETEST_POOL_NAME)
+ pool.undefine()
+ except Exception:
+ # Any exception can be ignored here
+ pass
+
+ FeatureTests.enable_libvirt_error_logging()
+
+ def _set_capabilities(self):
+ wok_log.info("*** Running feature tests ***")
+ conn = self.conn.get()
+ self.qemu_stream = FeatureTests.qemu_supports_iso_stream()
+ self.nfs_target_probe = FeatureTests.libvirt_support_nfs_probe(conn)
+ self.fc_host_support = FeatureTests.libvirt_support_fc_host(conn)
+ self.kernel_vfio = FeatureTests.kernel_support_vfio()
+ self.mem_hotplug_support = FeatureTests.has_mem_hotplug_support(conn)
+
+ self.libvirt_stream_protocols = []
+ for p in ['http', 'https', 'ftp', 'ftps',
'tftp']:
+ if FeatureTests.libvirt_supports_iso_stream(conn, p):
+ self.libvirt_stream_protocols.append(p)
+
+ wok_log.info("*** Feature tests completed ***")
+ _set_capabilities.priority = 90
+
+ def _qemu_support_spice(self):
+ qemu_path = find_qemu_binary(find_emulator=True)
+ out, err, rc = run_command(['ldd', qemu_path])
+ if rc != 0:
+ wok_log.error('Failed to find qemu binary dependencies: %s',
+ err)
+ return False
+ for line in out.split('\n'):
+ if line.lstrip().startswith('libspice-server.so'):
+ return True
+ 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(),
+ 'federation': kconfig.get("server",
"federation"),
+ 'auth': kconfig.get("authentication",
"method"),
+ 'kernel_vfio': self.kernel_vfio,
+ 'nm_running': FeatureTests.is_nm_running(),
+ 'mem_hotplug_support': self.mem_hotplug_support
+ }
+
+
+class DistrosModel(object):
+ def __init__(self, **kargs):
+ distroloader = DistroLoader()
+ self.distros = distroloader.get()
+
+ def get_list(self):
+ def validate_distro(distro):
+ if check_url_path(distro['path']):
+ return distro['name']
+
+ n_processes = len(self.distros.keys())
+ pool = ThreadPool(processes=n_processes)
+ map_res = pool.map_async(validate_distro, self.distros.values())
+ pool.close()
+ pool.join()
+ res = list(set(map_res.get()) - set([None]))
+ return sorted(res)
+
+
+class DistroModel(object):
+ def __init__(self, **kargs):
+ self._distros = DistrosModel()
+
+ def lookup(self, name):
+ try:
+ return self._distros.distros[name]
+ except KeyError:
+ raise NotFoundError("KCHDISTRO0001E", {'name': name})
--
---
Paulo Ricardo Paz Vital
IBM Linux Technology Center