X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_openvim%2Fhost_thread.py;h=1a03c7f1c509671bb29496d83e11cbe79b4e3274;hb=refs%2Fchanges%2F66%2F1866%2F5;hp=897d70e69388f95ec321c743dd5096d18ae1add3;hpb=f135eff232fe844439c3f097734693ab4320460e;p=osm%2Fopenvim.git diff --git a/osm_openvim/host_thread.py b/osm_openvim/host_thread.py index 897d70e..1a03c7f 100644 --- a/osm_openvim/host_thread.py +++ b/osm_openvim/host_thread.py @@ -34,20 +34,21 @@ import threading import time import Queue import paramiko -from jsonschema import validate as js_v, exceptions as js_e -#import libvirt +# import subprocess +# import libvirt import imp -from vim_schema import localinfo_schema, hostinfo_schema import random import os import logging +from jsonschema import validate as js_v, exceptions as js_e +from vim_schema import localinfo_schema, hostinfo_schema 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, logger_name=None, debug=None): + develop_bridge_iface, password=None, keyfile = None, logger_name=None, debug=None): '''Init a thread. Arguments: 'id' number of thead @@ -62,6 +63,8 @@ class host_thread(threading.Thread): self.db = db self.db_lock = db_lock self.test = test + self.password = password + self.keyfile = keyfile self.localinfo_dirty = False if not test and not host_thread.lvirt_module: @@ -97,33 +100,38 @@ class host_thread(threading.Thread): self.queueLock = threading.Lock() self.taskQueue = Queue.Queue(2000) self.ssh_conn = None + 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 def ssh_connect(self): try: - #Connect SSH + # Connect SSH self.ssh_conn = paramiko.SSHClient() self.ssh_conn.set_missing_host_key_policy(paramiko.AutoAddPolicy()) self.ssh_conn.load_system_host_keys() - self.ssh_conn.connect(self.host, username=self.user, timeout=10) #, None) + self.ssh_conn.connect(self.host, username=self.user, password=self.password, key_filename=self.keyfile, + timeout=10) #, None) except paramiko.ssh_exception.SSHException as e: text = e.args[0] self.logger.error("ssh_connect ssh Exception: " + text) - + def load_localinfo(self): if not self.test: try: - #Connect SSH + # Connect SSH self.ssh_connect() - + command = 'mkdir -p ' + self.image_path - #print self.name, ': command:', command + # print self.name, ': command:', command (_, stdout, stderr) = self.ssh_conn.exec_command(command) content = stderr.read() if len(content) > 0: self.logger.error("command: '%s' stderr: '%s'", command, content) command = 'cat ' + self.image_path + '/.openvim.yaml' - #print self.name, ': command:', command + # print self.name, ': command:', command (_, stdout, stderr) = self.ssh_conn.exec_command(command) content = stdout.read() if len(content) == 0: @@ -136,7 +144,7 @@ class host_thread(threading.Thread): self.localinfo['server_files'] = {} self.logger.debug("localinfo load from host") return - + except paramiko.ssh_exception.SSHException as e: text = e.args[0] self.logger.error("load_localinfo ssh Exception: " + text) @@ -318,12 +326,12 @@ class host_thread(threading.Thread): continue if task[0] == 'instance': - self.logger.debug("processing task instance " + task[1]['action']) - retry=0 - while retry <2: + self.logger.debug("processing task instance " + str(task[1]['action'])) + retry = 0 + while retry < 2: retry += 1 - r=self.action_on_server(task[1], retry==2) - if r>=0: + r = self.action_on_server(task[1], retry==2) + if r >= 0: break elif task[0] == 'image': pass @@ -355,7 +363,7 @@ class host_thread(threading.Thread): self.logger.debug("Deleting vxlan {} tunnel".format(task[1])) self.delete_ovs_vxlan_tunnel(task[1]) elif task[0] == 'create-ovs-bridge-port': - self.logger.debug("Adding port ovim-{} to OVS bridge".fromat(task[1])) + self.logger.debug("Adding port ovim-{} to OVS bridge".format(task[1])) self.create_ovs_bridge_port(task[1]) elif task[0] == 'del-ovs-port': self.logger.debug("Delete bridge attached to ovs port vlan {} net {}".format(task[1], task[2])) @@ -628,7 +636,7 @@ class host_thread(threading.Thread): elif content[0]['provider'][0:3] == "OVS": vlan = content[0]['provider'].replace('OVS:', '') text += self.tab() + "" + \ - self.inc_tab() + "" + self.inc_tab() + "" else: return -1, 'Unknown Bridge net provider ' + content[0]['provider'] if model!=None: @@ -751,7 +759,7 @@ class host_thread(threading.Thread): if self.test: return True try: - port_name = 'ovim-' + vlan + port_name = 'ovim-' + str(vlan) command = 'sudo ovs-vsctl del-port br-int ' + port_name self.logger.debug("command: " + command) (_, stdout, _) = self.ssh_conn.exec_command(command) @@ -779,7 +787,7 @@ class host_thread(threading.Thread): if not self.is_dhcp_port_free(vlan, net_uuid): return True try: - net_namespace = 'ovim-' + vlan + net_namespace = 'ovim-' + str(vlan) dhcp_path = os.path.join(dhcp_path, net_namespace) pid_file = os.path.join(dhcp_path, 'dnsmasq.pid') @@ -813,7 +821,7 @@ class host_thread(threading.Thread): self.db_lock.acquire() result, content = self.db.get_table( FROM='ports', - WHERE={'p.type': 'instance:ovs', 'p.net_id': net_uuid} + WHERE={'type': 'instance:ovs', 'net_id': net_uuid} ) self.db_lock.release() @@ -852,8 +860,8 @@ class host_thread(threading.Thread): if self.test: return True try: - port_name = 'ovim-' + vlan - command = 'sudo ovs-vsctl add-port br-int ' + port_name + ' tag=' + vlan + port_name = 'ovim-' + str(vlan) + command = 'sudo ovs-vsctl add-port br-int ' + port_name + ' tag=' + str(vlan) self.logger.debug("command: " + command) (_, stdout, _) = self.ssh_conn.exec_command(command) content = stdout.read() @@ -909,8 +917,8 @@ class host_thread(threading.Thread): if self.test: return True try: - port_name = 'ovim-' + vlan - command = 'sudo ip link set dev veth0-' + vlan + ' down' + port_name = 'ovim-' + str(vlan) + command = 'sudo ip link set dev veth0-' + str(vlan) + ' down' self.logger.debug("command: " + command) (_, stdout, _) = self.ssh_conn.exec_command(command) # content = stdout.read() @@ -952,7 +960,7 @@ class host_thread(threading.Thread): if self.test: return True try: - port_name = 'ovim-' + vlan + port_name = 'ovim-' + str(vlan) command = 'sudo brctl show | grep ' + port_name self.logger.debug("command: " + command) (_, stdout, _) = self.ssh_conn.exec_command(command) @@ -1010,7 +1018,7 @@ class host_thread(threading.Thread): if self.test: return True - net_namespace = 'ovim-' + vlan + net_namespace = 'ovim-' + str(vlan) dhcp_path = os.path.join(dhcp_path, net_namespace) dhcp_hostsdir = os.path.join(dhcp_path, net_namespace) @@ -1054,7 +1062,7 @@ class host_thread(threading.Thread): if self.test: return False try: - net_namespace = 'ovim-' + vlan + net_namespace = 'ovim-' + str(vlan) dhcp_path = os.path.join(dhcp_path, net_namespace) dhcp_hostsdir = os.path.join(dhcp_path, net_namespace) @@ -1094,8 +1102,8 @@ class host_thread(threading.Thread): if self.test: return True try: - interface = 'tap-' + vlan - net_namespace = 'ovim-' + vlan + interface = 'tap-' + str(vlan) + net_namespace = 'ovim-' + str(vlan) dhcp_path = os.path.join(dhcp_path, net_namespace) leases_path = os.path.join(dhcp_path, "dnsmasq.leases") pid_file = os.path.join(dhcp_path, 'dnsmasq.pid') @@ -1149,18 +1157,18 @@ class host_thread(threading.Thread): if self.test: return True try: - net_namespace = 'ovim-' + vlan - command = 'sudo ovs-vsctl del-port br-int ovs-tap-' + vlan + net_namespace = 'ovim-' + str(vlan) + command = 'sudo ovs-vsctl del-port br-int ovs-tap-' + str(vlan) self.logger.debug("command: " + command) (_, stdout, _) = self.ssh_conn.exec_command(command) content = stdout.read() - command = 'sudo ip netns exec ' + net_namespace + ' ip link set dev tap-' + vlan + ' down' + command = 'sudo ip netns exec ' + net_namespace + ' ip link set dev tap-' + str(vlan) + ' down' self.logger.debug("command: " + command) (_, stdout, _) = self.ssh_conn.exec_command(command) content = stdout.read() - command = 'sudo ip link set dev ovs-tap-' + vlan + ' down' + command = 'sudo ip link set dev ovs-tap-' + str(vlan) + ' down' self.logger.debug("command: " + command) (_, stdout, _) = self.ssh_conn.exec_command(command) content = stdout.read() @@ -1170,11 +1178,11 @@ class host_thread(threading.Thread): self.ssh_connect() return False - def create_dhcp_interfaces(self, vlan, ip, netmask): + def create_dhcp_interfaces(self, vlan, ip_listen_address, netmask): """ Create a linux bridge with STP active :param vlan: segmentation id - :param ip: Ip included in the dhcp range for the tap interface living in namesapce side + :param ip_listen_address: Listen Ip address for the dhcp service, the tap interface living in namesapce side :param netmask: dhcp net CIDR :return: True if success """ @@ -1182,41 +1190,46 @@ class host_thread(threading.Thread): if self.test: return True try: - net_namespace = 'ovim-' + vlan - namespace_interface = 'tap-' + vlan + net_namespace = 'ovim-' + str(vlan) + namespace_interface = 'tap-' + str(vlan) command = 'sudo ip netns add ' + net_namespace self.logger.debug("command: " + command) (_, stdout, _) = self.ssh_conn.exec_command(command) content = stdout.read() - command = 'sudo ip link add tap-' + vlan + ' type veth peer name ovs-tap-' + vlan + command = 'sudo ip link add tap-' + str(vlan) + ' type veth peer name ovs-tap-' + str(vlan) + self.logger.debug("command: " + command) + (_, stdout, _) = self.ssh_conn.exec_command(command) + content = stdout.read() + + command = 'sudo ovs-vsctl add-port br-int ovs-tap-' + str(vlan) + ' tag=' + str(vlan) self.logger.debug("command: " + command) (_, stdout, _) = self.ssh_conn.exec_command(command) content = stdout.read() - command = 'sudo ovs-vsctl add-port br-int ovs-tap-' + vlan + ' tag=' + vlan + command = 'sudo ip link set tap-' + str(vlan) + ' netns ' + net_namespace self.logger.debug("command: " + command) (_, stdout, _) = self.ssh_conn.exec_command(command) content = stdout.read() - command = 'sudo ip link set tap-' + vlan + ' netns ' + net_namespace + command = 'sudo ip netns exec ' + net_namespace + ' ip link set dev tap-' + str(vlan) + ' up' self.logger.debug("command: " + command) (_, stdout, _) = self.ssh_conn.exec_command(command) content = stdout.read() - command = 'sudo ip netns exec ' + net_namespace + ' ip link set dev tap-' + vlan + ' up' + command = 'sudo ip link set dev ovs-tap-' + str(vlan) + ' up' self.logger.debug("command: " + command) (_, stdout, _) = self.ssh_conn.exec_command(command) content = stdout.read() - command = 'sudo ip link set dev ovs-tap-' + vlan + ' up' + command = 'sudo ip netns exec ' + net_namespace + ' ip link set dev lo up' self.logger.debug("command: " + command) (_, stdout, _) = self.ssh_conn.exec_command(command) content = stdout.read() command = 'sudo ip netns exec ' + net_namespace + ' ' + ' ifconfig ' + namespace_interface \ - + ' ' + ip + ' netmask ' + netmask + + ' ' + ip_listen_address + ' netmask ' + netmask self.logger.debug("command: " + command) (_, stdout, _) = self.ssh_conn.exec_command(command) content = stdout.read() @@ -1605,12 +1618,12 @@ class host_thread(threading.Thread): # VIR_DOMAIN_SHUTOFF = 5 # VIR_DOMAIN_CRASHED = 6 # VIR_DOMAIN_PMSUSPENDED = 7 #TODO suspended - + if self.test or len(self.server_status)==0: - return - + return + try: - conn = host_thread.lvirt_module.open("qemu+ssh://"+self.user+"@"+self.host+"/system") + conn = host_thread.lvirt_module.open(self.lvirt_conn_uri) domains= conn.listAllDomains() domain_dict={} for domain in domains: @@ -1699,7 +1712,7 @@ class host_thread(threading.Thread): self.create_image(None, req) else: try: - conn = host_thread.lvirt_module.open("qemu+ssh://"+self.user+"@"+self.host+"/system") + conn = host_thread.lvirt_module.open(self.lvirt_conn_uri) try: dom = conn.lookupByUUIDString(server_id) except host_thread.lvirt_module.libvirtError as e: @@ -1893,7 +1906,7 @@ class host_thread(threading.Thread): return 0, None try: if not lib_conn: - conn = host_thread.lvirt_module.open("qemu+ssh://"+self.user+"@"+self.host+"/system") + conn = host_thread.lvirt_module.open(self.lvirt_conn_uri) else: conn = lib_conn @@ -1901,7 +1914,8 @@ class host_thread(threading.Thread): #TODO.Revise self.server_forceoff(True) iface = conn.interfaceLookupByMACString(mac) - iface.destroy() + if iface.isActive(): + iface.destroy() iface.create() self.logger.debug("restore_iface '%s' %s", name, mac) except host_thread.lvirt_module.libvirtError as e: @@ -1989,12 +2003,12 @@ class host_thread(threading.Thread): xml.append("") xml.append(" ") xml.append(" "+ self.pci2xml(port['pci'])+"\n ") - xml.append('') + xml.append('') try: conn=None - conn = host_thread.lvirt_module.open("qemu+ssh://"+self.user+"@"+self.host+"/system") + conn = host_thread.lvirt_module.open(self.lvirt_conn_uri) dom = conn.lookupByUUIDString(port["instance_id"]) if old_net: text="\n".join(xml)