allow openvim in test mode to run without python-libvirt package installed 63/763/2
authortierno <alfonso.tiernosepulveda@telefonica.com>
Wed, 7 Dec 2016 15:22:53 +0000 (16:22 +0100)
committertierno <alfonso.tiernosepulveda@telefonica.com>
Mon, 12 Dec 2016 14:25:12 +0000 (15:25 +0100)
Signed-off-by: tierno <alfonso.tiernosepulveda@telefonica.com>
host_thread.py
httpserver.py

index e877505..173634b 100644 (file)
@@ -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] ="  <vlan>   <tag id='" + str(port['vlan']) + "'/>   </vlan>"
                     self.xml_level = 1
@@ -1356,9 +1367,9 @@ class host_thread(threading.Thread):
                     xml.append('</interface>')                
                     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 
                 
index 9f26737..ecf878c 100644 (file)
@@ -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