X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_openvim%2Fovim.py;h=6317421d9d865d3872c0ae91b02a53bb1b429224;hb=refs%2Fchanges%2F24%2F2024%2F8;hp=dd5b3156a3d84ab36842e104404762349e479b54;hpb=a69330400c877adb0e5af22e2bf113941f808668;p=osm%2Fopenvim.git diff --git a/osm_openvim/ovim.py b/osm_openvim/ovim.py index dd5b315..6317421 100755 --- a/osm_openvim/ovim.py +++ b/osm_openvim/ovim.py @@ -28,6 +28,7 @@ Two thread will be launched, with normal and administrative permissions. """ import threading +import yaml import vim_db import logging # import imp @@ -42,9 +43,9 @@ import openflow_conn __author__ = "Alfonso Tierno, Leonardo Mirabal" __date__ = "$06-Feb-2017 12:07:15$" -__version__ = "0.5.15-r531" -version_date = "May 2017" -database_version = 19 #needed database schema version +__version__ = "0.5.18-r534" +version_date = "Jun 2017" +database_version = 21 #needed database schema version HTTP_Bad_Request = 400 HTTP_Unauthorized = 401 @@ -146,7 +147,7 @@ class ovim(): if "dhcp_last_ip" not in network: network["dhcp_last_ip"] = str(ips[-2]) if "gateway_ip" not in network: - network["gateway_ip"] = str(ips[2]) + network["gateway_ip"] = str(ips[1]) return True else: @@ -191,6 +192,40 @@ class ovim(): self.config["db_lock"] = threading.Lock() self.of_test_mode = False if self.config['mode'] == 'normal' or self.config['mode'] == "OF only" else True + + # Create one thread for each host + host_test_mode = True if self.config['mode'] == 'test' or self.config['mode'] == "OF only" else False + host_develop_mode = True if self.config['mode'] == 'development' else False + host_develop_bridge_iface = self.config.get('development_bridge', None) + + # get host list from data base before starting threads + r, hosts = self.db.get_table(SELECT=('name', 'ip_name', 'user', 'uuid', 'password', 'keyfile'), + FROM='hosts', WHERE={'status': 'ok'}) + if r < 0: + raise ovimException("Cannot get hosts from database {}".format(hosts)) + + self.config['host_threads'] = {} + + for host in hosts: + thread = ht.host_thread(name=host['name'], user=host['user'], host=host['ip_name'], db=self.config["db"], + password=host['password'], + keyfile=host.get('keyfile', self.config["host_ssh_keyfile"]), + db_lock=self.config["db_lock"], test=host_test_mode, + image_path=self.config['host_image_path'], + version=self.config['version'], host_id=host['uuid'], + develop_mode=host_develop_mode, + develop_bridge_iface=host_develop_bridge_iface, + logger_name=self.logger_name + ".host." + host['name'], + debug=self.config.get('log_level_host')) + + try: + thread.check_connectivity() + except Exception as e: + self.logger.critical('Error detected for compute = {} with ip = {}' + .format(host['name'], host['ip_name'])) + thread.start() + self.config['host_threads'][host['uuid']] = thread + # precreate interfaces; [bridge:, VLAN used at Host, uuid of network camping in this bridge, # speed in Gbit/s @@ -238,31 +273,7 @@ class ovim(): thread.start() self.config['dhcp_thread'] = thread - # Create one thread for each host - host_test_mode = True if self.config['mode'] == 'test' or self.config['mode'] == "OF only" else False - host_develop_mode = True if self.config['mode'] == 'development' else False - host_develop_bridge_iface = self.config.get('development_bridge', None) - # get host list from data base before starting threads - r, hosts = self.db.get_table(SELECT=('name', 'ip_name', 'user', 'uuid', 'password', 'keyfile'), - FROM='hosts', WHERE={'status': 'ok'}) - if r < 0: - raise ovimException("Cannot get hosts from database {}".format(hosts)) - - self.config['host_threads'] = {} - for host in hosts: - thread = ht.host_thread(name=host['name'], user=host['user'], host=host['ip_name'], db=self.config["db"], - password=host['password'], - keyfile=host.get('keyfile', self.config["host_ssh_keyfile"]), - db_lock=self.config["db_lock"], test=host_test_mode, - image_path=self.config['host_image_path'], - version=self.config['version'], host_id=host['uuid'], - develop_mode=host_develop_mode, - develop_bridge_iface=host_develop_bridge_iface, - logger_name=self.logger_name + ".host." + host['name'], - debug=self.config.get('log_level_host')) - thread.start() - self.config['host_threads'][host['uuid']] = thread # create ovs dhcp thread result, content = self.db.get_table(FROM='nets') @@ -275,11 +286,29 @@ class ovim(): if (net_type == 'bridge_data' or net_type == 'bridge_man') and \ net["provider"][:4] == 'OVS:' and net["enable_dhcp"] == "true": try: - self.launch_dhcp_server(net['vlan'], - net['dhcp_first_ip'], - net['dhcp_last_ip'], - net['cidr'], - net['gateway_ip']) + config_routes = net.get('routes') + if config_routes: + routes = yaml.safe_load(config_routes) + else: + routes = None + + config_dns = net.get('dns') + if config_dns: + dns = yaml.safe_load(config_dns) + else: + dns = None + + links = net.get('links') + if links: + links = yaml.safe_load(net.get('links')) + self.launch_dhcp_server(net.get('vlan'), + net.get('dhcp_first_ip'), + net.get('dhcp_last_ip'), + net.get('cidr'), + net.get('gateway_ip'), + dns, + routes) + self.launch_link_bridge_to_ovs(net['vlan'], net.get('gateway_ip'), net.get('cidr'), links, routes) except Exception as e: self.logger.error("Fail at launching dhcp server for net_id='%s' net_name='%s': %s", net["uuid"], net["name"], str(e)) @@ -630,6 +659,13 @@ class ovim(): dhcp_integrity = True if 'enable_dhcp' in network and network['enable_dhcp']: dhcp_integrity = self._check_dhcp_data_integrity(network) + + if network.get('links'): + network['links'] = yaml.safe_dump(network['links'], default_flow_style=True, width=256) + if network.get('dns'): + network['dns'] = yaml.safe_dump(network['dns'], default_flow_style=True, width=256) + if network.get('routes'): + network['routes'] = yaml.safe_dump(network['routes'], default_flow_style=True, width=256) result, content = self.db.new_row('nets', network, True, True) @@ -1375,11 +1411,14 @@ class ovim(): debug=self.config.get('log_level_host')) # dhcp_host.start() self.config['host_threads']['openvim_controller'] = dhcp_host - if not host_test_mode: - dhcp_host.ssh_connect() + try: + dhcp_host.check_connectivity() + except Exception as e: + pass + return dhcp_host - def launch_dhcp_server(self, vlan, first_ip, last_ip, cidr, gateway): + def launch_dhcp_server(self, vlan, first_ip, last_ip, cidr, gateway, dns, routes): """ Launch a dhcpserver base on dnsmasq attached to the net base on vlan id across the the openvim computes :param vlan: vlan identifier @@ -1396,9 +1435,49 @@ class ovim(): dhcp_path = self.config['ovs_controller_file_path'] controller_host = self.get_dhcp_controller() - controller_host.create_linux_bridge(vlan) - controller_host.create_dhcp_interfaces(vlan, gateway, dhcp_netmask) - controller_host.launch_dhcp_server(vlan, ip_range, dhcp_netmask, dhcp_path, gateway) + + # controller_host.create_linux_bridge(vlan) + controller_host.create_dhcp_interfaces(vlan, first_ip, dhcp_netmask) + dhcp_path = self.config['ovs_controller_file_path'] + controller_host.launch_dhcp_server(vlan, ip_range, dhcp_netmask, dhcp_path, gateway, dns, routes) + + def launch_link_bridge_to_ovs(self, vlan, gateway, dhcp_cidr, links=None, routes=None): + """ + Launch creating of connections (veth) between user bridge (link) and OVS + :param vlan: + :param gateway: + :param links: + :return: + """ + + if links: + controller_host = self.get_dhcp_controller() + for link in links: + if 'iface' in link and 'nat' not in link: + controller_host.create_link_bridge_to_ovs(vlan, link['iface']) + elif 'nat' in link: + controller_host.create_qrouter_ovs_connection(vlan, gateway, dhcp_cidr) + controller_host.create_qrouter_br_connection(vlan, dhcp_cidr, link) + + if len(routes): + controller_host.add_ns_routes(vlan, routes) + + def delete_link_bridge_to_ovs(self, vlan, links=None): + """ + Delete connections (veth) between user bridge (link) and OVS + :param vlan: + :param links: + :return: + """ + if links: + controller_host = self.get_dhcp_controller() + + for link in links: + if 'iface' in link and 'nat' not in link: + controller_host.remove_link_bridge_to_ovs(vlan, link['iface']) + elif 'nat' in link: + controller_host.delete_qrouter_connection(vlan, link['iface']) + if __name__ == "__main__":