From e7bedebdf51c347e44e0b709e8d3086f491b7967 Mon Sep 17 00:00:00 2001 From: tierno Date: Wed, 7 Dec 2016 16:22:53 +0100 Subject: [PATCH] allow openvim in test mode to run without python-libvirt package installed Signed-off-by: tierno --- host_thread.py | 55 ++++++++++++++++++++++++++++++-------------------- httpserver.py | 12 +++++++++-- 2 files changed, 43 insertions(+), 24 deletions(-) diff --git a/host_thread.py b/host_thread.py index e877505..173634b 100644 --- a/host_thread.py +++ b/host_thread.py @@ -36,7 +36,8 @@ import time import Queue import paramiko from jsonschema import validate as js_v, exceptions as js_e -import libvirt +#import libvirt +import imp from vim_schema import localinfo_schema, hostinfo_schema import random #from logging import Logger @@ -44,6 +45,9 @@ import random #TODO: insert a logging system +global lvirt_module +lvirt_module=None #libvirt module is charged only if not in test mode + class host_thread(threading.Thread): def __init__(self, name, host, user, db, db_lock, test, image_path, host_id, version, develop_mode, develop_bridge_iface): '''Init a thread. @@ -60,6 +64,13 @@ class host_thread(threading.Thread): self.db = db self.db_lock = db_lock self.test = test + if not test: + try: + lvirt_module = imp.find_module("libvirt") + except (IOError, ImportError) as e: + raise ImportError("Cannot import python-libvirt. Openvim not properly installed" +str(e)) + + self.develop_mode = develop_mode self.develop_bridge_iface = develop_bridge_iface self.image_path = image_path @@ -120,7 +131,7 @@ class host_thread(threading.Thread): except paramiko.ssh_exception.SSHException as e: text = e.args[0] print self.name, ": load_localinfo ssh Exception:", text - except libvirt.libvirtError as e: + except lvirt_module.libvirtError as e: text = e.get_error_message() print self.name, ": load_localinfo libvirt Exception:", text except yaml.YAMLError as exc: @@ -165,7 +176,7 @@ class host_thread(threading.Thread): except paramiko.ssh_exception.SSHException as e: text = e.args[0] print self.name, ": load_hostinfo ssh Exception:", text - except libvirt.libvirtError as e: + except lvirt_module.libvirtError as e: text = e.get_error_message() print self.name, ": load_hostinfo libvirt Exception:", text except yaml.YAMLError as exc: @@ -206,7 +217,7 @@ class host_thread(threading.Thread): print self.name, ": save_localinfo ssh Exception:", text if "SSH session not active" in text: self.ssh_connect() - except libvirt.libvirtError as e: + except lvirt_module.libvirtError as e: text = e.get_error_message() print self.name, ": save_localinfo libvirt Exception:", text except yaml.YAMLError as exc: @@ -933,7 +944,7 @@ class host_thread(threading.Thread): print self.name, ": create xml server error:", xml return -2, xml print self.name, ": create xml:", xml - atribute = libvirt.VIR_DOMAIN_START_PAUSED if paused == "yes" else 0 + atribute = lvirt_module.VIR_DOMAIN_START_PAUSED if paused == "yes" else 0 #4 Start the domain if not rebuild: #ensures that any pending destroying server is done self.server_forceoff(True) @@ -948,7 +959,7 @@ class host_thread(threading.Thread): print self.name, ": launch_server(%s) ssh Exception: %s" %(server_id, text) if "SSH session not active" in text: self.ssh_connect() - except libvirt.libvirtError as e: + except lvirt_module.libvirtError as e: text = e.get_error_message() print self.name, ": launch_server(%s) libvirt Exception: %s" %(server_id, text) except Exception as e: @@ -971,26 +982,26 @@ class host_thread(threading.Thread): return try: - conn = libvirt.open("qemu+ssh://"+self.user+"@"+self.host+"/system") + conn = lvirt_module.open("qemu+ssh://"+self.user+"@"+self.host+"/system") domains= conn.listAllDomains() domain_dict={} for domain in domains: uuid = domain.UUIDString() ; libvirt_status = domain.state() #print libvirt_status - if libvirt_status[0] == libvirt.VIR_DOMAIN_RUNNING or libvirt_status[0] == libvirt.VIR_DOMAIN_SHUTDOWN: + if libvirt_status[0] == lvirt_module.VIR_DOMAIN_RUNNING or libvirt_status[0] == lvirt_module.VIR_DOMAIN_SHUTDOWN: new_status = "ACTIVE" - elif libvirt_status[0] == libvirt.VIR_DOMAIN_PAUSED: + elif libvirt_status[0] == lvirt_module.VIR_DOMAIN_PAUSED: new_status = "PAUSED" - elif libvirt_status[0] == libvirt.VIR_DOMAIN_SHUTOFF: + elif libvirt_status[0] == lvirt_module.VIR_DOMAIN_SHUTOFF: new_status = "INACTIVE" - elif libvirt_status[0] == libvirt.VIR_DOMAIN_CRASHED: + elif libvirt_status[0] == lvirt_module.VIR_DOMAIN_CRASHED: new_status = "ERROR" else: new_status = None domain_dict[uuid] = new_status conn.close - except libvirt.libvirtError as e: + except lvirt_module.libvirtError as e: print self.name, ": get_state() Exception '", e.get_error_message() return @@ -1056,15 +1067,15 @@ class host_thread(threading.Thread): self.create_image(None, req) else: try: - conn = libvirt.open("qemu+ssh://"+self.user+"@"+self.host+"/system") + conn = lvirt_module.open("qemu+ssh://"+self.user+"@"+self.host+"/system") try: dom = conn.lookupByUUIDString(server_id) - except libvirt.libvirtError as e: + except lvirt_module.libvirtError as e: text = e.get_error_message() if 'LookupByUUIDString' in text or 'Domain not found' in text or 'No existe un dominio coincidente' in text: dom = None else: - print self.name, ": action_on_server(",server_id,") libvirt exception:", text + print self.name, ": action_on_server(",server_id,") libvirt exception:", text raise e if 'forceOff' in req['action']: @@ -1185,7 +1196,7 @@ class host_thread(threading.Thread): conn.close() - except libvirt.libvirtError as e: + except lvirt_module.libvirtError as e: if conn is not None: conn.close text = e.get_error_message() new_status = "ERROR" @@ -1242,7 +1253,7 @@ class host_thread(threading.Thread): return 0, None try: if not lib_conn: - conn = libvirt.open("qemu+ssh://"+self.user+"@"+self.host+"/system") + conn = lvirt_module.open("qemu+ssh://"+self.user+"@"+self.host+"/system") else: conn = lib_conn @@ -1253,7 +1264,7 @@ class host_thread(threading.Thread): iface.destroy() iface.create() print self.name, ": restore_iface '%s' %s" % (name, mac) - except libvirt.libvirtError as e: + except lvirt_module.libvirtError as e: error_text = e.get_error_message() print self.name, ": restore_iface '%s' '%s' libvirt exception: %s" %(name, mac, error_text) ret=-1 @@ -1343,12 +1354,12 @@ class host_thread(threading.Thread): try: conn=None - conn = libvirt.open("qemu+ssh://"+self.user+"@"+self.host+"/system") + conn = lvirt_module.open("qemu+ssh://"+self.user+"@"+self.host+"/system") dom = conn.lookupByUUIDString(port["instance_id"]) if old_net: text="\n".join(xml) print self.name, ": edit_iface detaching SRIOV interface", text - dom.detachDeviceFlags(text, flags=libvirt.VIR_DOMAIN_AFFECT_LIVE) + dom.detachDeviceFlags(text, flags=lvirt_module.VIR_DOMAIN_AFFECT_LIVE) if new_net: xml[-1] =" " self.xml_level = 1 @@ -1356,9 +1367,9 @@ class host_thread(threading.Thread): xml.append('') text="\n".join(xml) print self.name, ": edit_iface attaching SRIOV interface", text - dom.attachDeviceFlags(text, flags=libvirt.VIR_DOMAIN_AFFECT_LIVE) + dom.attachDeviceFlags(text, flags=lvirt_module.VIR_DOMAIN_AFFECT_LIVE) - except libvirt.libvirtError as e: + except lvirt_module.libvirtError as e: text = e.get_error_message() print self.name, ": edit_iface(",port["instance_id"],") libvirt exception:", text diff --git a/httpserver.py b/httpserver.py index 9f26737..ecf878c 100644 --- a/httpserver.py +++ b/httpserver.py @@ -37,7 +37,8 @@ import threading import datetime import hashlib import os -import RADclass +import imp +#import only if needed because not needed in test mode. To allow an easier installation import RADclass from jsonschema import validate as js_v, exceptions as js_e import host_thread as ht from vim_schema import host_new_schema, host_edit_schema, tenant_new_schema, \ @@ -50,6 +51,8 @@ from vim_schema import host_new_schema, host_edit_schema, tenant_new_schema, \ global my global url_base global config_dic +global RADclass_module +RADclass=None #RADclass module is charged only if not in test mode url_base="/openvim" @@ -535,9 +538,14 @@ def http_post_hosts(): ip_name=host['ip_name'] user=host['user'] password=host.get('password', None) + if not RADclass_module: + try: + RADclass_module = imp.find_module("RADclass") + except (IOError, ImportError) as e: + raise ImportError("Cannot import RADclass.py Openvim not properly installed" +str(e)) #fill rad info - rad = RADclass.RADclass() + rad = RADclass_module.RADclass() (return_status, code) = rad.obtain_RAD(user, password, ip_name) #return -- 2.25.1