X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_openvim%2Fhost_thread.py;h=ed6551fb1efc4a8f189ba149598148ed53af278b;hb=9cead2a0262deabadc900d580ef312fbc468efc0;hp=18a2eab5b7b743843f47c0910b7cb9a1f283dd63;hpb=0ec17ecbd0aa7c6ac8d8b07f9886e0eec1128f09;p=osm%2Fopenvim.git diff --git a/osm_openvim/host_thread.py b/osm_openvim/host_thread.py index 18a2eab..ed6551f 100644 --- a/osm_openvim/host_thread.py +++ b/osm_openvim/host_thread.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- ## -# Copyright 2015 Telefónica Investigación y Desarrollo, S.A.U. +# Copyright 2015 Telefonica Investigacion y Desarrollo, S.A.U. # This file is part of openvim # All Rights Reserved. # @@ -49,21 +49,20 @@ class RunCommandException(Exception): class host_thread(threading.Thread): lvirt_module = None - def __init__(self, name, host, user, db, db_lock, test, image_path, host_id, version, develop_mode, - develop_bridge_iface, password=None, keyfile = None, logger_name=None, debug=None): + def __init__(self, name, host, user, db, test, image_path, host_id, version, develop_mode, + develop_bridge_iface, password=None, keyfile = None, logger_name=None, debug=None, hypervisors=None): """Init a thread to communicate with compute node or ovs_controller. :param host_id: host identity :param name: name of the thread :param host: host ip or name to manage and user :param user, password, keyfile: user and credentials to connect to host - :param db, db_lock': database class and lock to use it in exclusion + :param db: database class, threading safe """ threading.Thread.__init__(self) self.name = name self.host = host self.user = user self.db = db - self.db_lock = db_lock self.test = test self.password = password self.keyfile = keyfile @@ -99,6 +98,14 @@ class host_thread(threading.Thread): self.pending_terminate_server =[] #list with pairs (time,server_uuid) time to send a terminate for a server being destroyed self.next_update_server_status = 0 #time when must be check servers status +####### self.hypervisor = "kvm" #hypervisor flag (default: kvm) + if hypervisors: + self.hypervisors = hypervisors + else: + self.hypervisors = "kvm" + + self.xen_hyp = True if "xen" in self.hypervisors else False + self.hostinfo = None self.queueLock = threading.Lock() @@ -107,10 +114,16 @@ class host_thread(threading.Thread): self.run_command_session = None self.error = None self.localhost = True if host == 'localhost' else False - self.lvirt_conn_uri = "qemu+ssh://{user}@{host}/system?no_tty=1&no_verify=1".format( - user=self.user, host=self.host) + + if self.xen_hyp: + self.lvirt_conn_uri = "xen+ssh://{user}@{host}/?no_tty=1&no_verify=1".format( + user=self.user, host=self.host) + else: + self.lvirt_conn_uri = "qemu+ssh://{user}@{host}/system?no_tty=1&no_verify=1".format( + user=self.user, host=self.host) if keyfile: self.lvirt_conn_uri += "&keyfile=" + keyfile + self.remote_ip = None self.local_ip = None @@ -308,9 +321,7 @@ class host_thread(threading.Thread): self.logger.error("save_localinfo Exception: " + text) def load_servers_from_db(self): - self.db_lock.acquire() r,c = self.db.get_table(SELECT=('uuid','status', 'image_id'), FROM='instances', WHERE={'host_id': self.host_id}) - self.db_lock.release() self.server_status = {} if r<0: @@ -488,8 +499,13 @@ class host_thread(threading.Thread): bus_ide = True if bus=='ide' else False self.xml_level = 0 + hypervisor = server.get('hypervisor', 'kvm') + os_type_img = server.get('os_image_type', 'other') - text = "" + if hypervisor[:3] == 'xen': + text = "" + else: + text = "" #get topology topo = server_metadata.get('topology', None) if topo == None and 'metadata' in dev_list[0]: @@ -563,12 +579,26 @@ class host_thread(threading.Thread): if dev['type']=='cdrom' : boot_cdrom = True break - text += self.tab()+ '' + \ - self.inc_tab() + "hvm" - if boot_cdrom: - text += self.tab() + "" - text += self.tab() + "" + \ - self.dec_tab()+'' + if hypervisor == 'xenhvm': + text += self.tab()+ '' + \ + self.inc_tab() + "hvm" + text += self.tab() + "/usr/lib/xen/boot/hvmloader" + if boot_cdrom: + text += self.tab() + "" + text += self.tab() + "" + \ + self.dec_tab()+'' + elif hypervisor == 'xen-unik': + text += self.tab()+ '' + \ + self.inc_tab() + "xen" + text += self.tab() + "" + str(dev_list[0]['source file']) + "" + \ + self.dec_tab()+'' + else: + text += self.tab()+ '' + \ + self.inc_tab() + "hvm" + if boot_cdrom: + text += self.tab() + "" + text += self.tab() + "" + \ + self.dec_tab()+'' #features text += self.tab()+''+\ self.inc_tab()+'' +\ @@ -587,14 +617,29 @@ class host_thread(threading.Thread): self.tab() + "preserve" + \ self.tab() + "restart" + \ self.tab() + "restart" - text += self.tab() + "" + \ - self.inc_tab() + "/usr/libexec/qemu-kvm" + \ - self.tab() + "" +\ - self.inc_tab() + "" + \ - self.dec_tab() + "" +\ - self.tab() + "" + \ - self.inc_tab()+ "" + \ - self.dec_tab()+'' + if hypervisor == 'xenhvm': + text += self.tab() + "" + \ + self.inc_tab() + "/usr/bin/qemu-system-i386" + \ + self.tab() + "" +\ + self.inc_tab() + "" + \ + self.dec_tab() + "" +\ + self.tab() + "" + \ + self.inc_tab()+ "" + \ + self.dec_tab()+'' #In some libvirt version may be: /usr/lib64/xen/bin/qemu-dm (depends on distro) + elif hypervisor == 'xen-unik': + text += self.tab() + "" + \ + self.tab() + "" + \ + self.inc_tab()+ "" + \ + self.dec_tab()+'' + else: + text += self.tab() + "" + \ + self.inc_tab() + "/usr/libexec/qemu-kvm" + \ + self.tab() + "" +\ + self.inc_tab() + "" + \ + self.dec_tab() + "" +\ + self.tab() + "" + \ + self.inc_tab()+ "" + \ + self.dec_tab()+'' if windows_os: text += self.tab() + "" + \ self.tab() + "" + \ @@ -605,6 +650,15 @@ class host_thread(threading.Thread): self.dec_tab() + "" + \ self.tab() + "" + \ self.tab() + "" #TODO revisar + elif hypervisor == 'xen-unik': + pass + else: + text += self.tab() + "" + \ + self.tab() + "" + \ + self.tab() + "" + \ + self.tab() + "" #> self.tab()+'\n' +\ #> self.dec_tab()+'\n' +\ @@ -621,7 +675,7 @@ class host_thread(threading.Thread): vd_index = 'a' for dev in dev_list: bus_ide_dev = bus_ide - if dev['type']=='cdrom' or dev['type']=='disk': + if (dev['type']=='cdrom' or dev['type']=='disk') and hypervisor != 'xen-unik': if dev['type']=='cdrom': bus_ide_dev = True text += self.tab() + "" @@ -656,6 +710,8 @@ class host_thread(threading.Thread): dev_text = dev_text.replace('__dev__', vd_index) vd_index = chr(ord(vd_index)+1) text += dev_text + elif hypervisor == 'xen-unik': + pass else: return -1, 'Unknown device type ' + dev['type'] @@ -663,9 +719,7 @@ class host_thread(threading.Thread): bridge_interfaces = server.get('networks', []) for v in bridge_interfaces: #Get the brifge name - self.db_lock.acquire() result, content = self.db.get_table(FROM='nets', SELECT=('provider',),WHERE={'uuid':v['net_id']} ) - self.db_lock.release() if result <= 0: self.logger.error("create_xml_server ERROR %d getting nets %s", result, content) return -1, content @@ -696,6 +750,8 @@ class host_thread(threading.Thread): vlan = content[0]['provider'].replace('OVS:', '') text += self.tab() + "" + \ self.inc_tab() + "" + if hypervisor == 'xenhvm' or hypervisor == 'xen-unik': + text += self.tab() + "