X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_openvim%2Fovim.py;h=fb345525f9d9861a4b651c12f30592ea0e4ce6c0;hb=7fa5a659f844ad98a1cd85f2467c31fac93d5509;hp=f2539120f870242c062c10eba1b0d9f1968d8db3;hpb=b0c600d21ad65893f5e7ab4522565e8f66e195e9;p=osm%2Fopenvim.git diff --git a/osm_openvim/ovim.py b/osm_openvim/ovim.py index f253912..fb34552 100755 --- a/osm_openvim/ovim.py +++ b/osm_openvim/ovim.py @@ -22,21 +22,16 @@ # contact with: nfvlabs@tid.es ## -''' +""" This is the thread for the http server North API. Two thread will be launched, with normal and administrative permissions. -''' - -__author__ = "Alfonso Tierno, Leonardo Mirabal" -__date__ = "$06-Feb-2017 12:07:15$" -__version__ = "0.5.10-r526" -version_date = "Apr 2017" -database_version = "0.17" #expected database schema version +""" import threading import vim_db import logging # import imp +import os.path import argparse from netaddr import IPNetwork from jsonschema import validate as js_v, exceptions as js_e @@ -45,6 +40,11 @@ import dhcp_thread as dt import openflow_thread as oft import openflow_conn +__author__ = "Alfonso Tierno, Leonardo Mirabal" +__date__ = "$06-Feb-2017 12:07:15$" +__version__ = "0.5.13-r529" +version_date = "May 2017" +database_version = 18 #needed database schema version HTTP_Bad_Request = 400 HTTP_Unauthorized = 401 @@ -100,8 +100,6 @@ class ovim(): self.logger = logging.getLogger(self.logger_name) self.db = None self.db = self._create_database_connection() - self.db_lock = None - self.db_of = None self.of_test_mode = False def _create_database_connection(self): @@ -172,19 +170,25 @@ class ovim(): # if self.running_info: # return #TODO service can be checked and rebuild broken threads r = self.db.get_db_version() + db_path = __file__ + db_path = db_path[:db_path.rfind("/")] + if os.path.exists(db_path + "/database_utils/migrate_vim_db.sh"): + db_path += "/database_utils" + else: + db_path += "/../database_utils" + if r[0] < 0: - raise ovimException("DATABASE is not a VIM one or it is a '0.0' version. Try to upgrade to version '{}' with "\ - "'./database_utils/migrate_vim_db.sh'".format(database_version) ) - elif r[1] != database_version: - raise ovimException("DATABASE wrong version '{}'. Try to upgrade/downgrade to version '{}' with "\ - "'./database_utils/migrate_vim_db.sh'".format(r[1], database_version) ) + raise ovimException("DATABASE is not valid. If you think it is corrupted, you can init it with" + " '{db_path}/init_vim_db.sh' script".format(db_path=db_path)) + elif r[0] != database_version: + raise ovimException("DATABASE wrong version '{current}'. Try to upgrade/downgrade to version '{target}'" + " with '{db_path}/migrate_vim_db.sh {target}'".format( + current=r[0], target=database_version, db_path=db_path)) self.logger.critical("Starting ovim server version: '{} {}' database version '{}'".format( self.get_version(), self.get_version_date(), self.get_database_version())) # create database connection for openflow threads - self.db_of = self._create_database_connection() - self.config["db"] = self.db_of - self.db_lock = threading.Lock() - self.config["db_lock"] = self.db_lock + self.config["db"] = self._create_database_connection() + self.config["db_lock"] = threading.Lock() self.of_test_mode = False if self.config['mode'] == 'normal' or self.config['mode'] == "OF only" else True # precreate interfaces; [bridge:, VLAN used at Host, uuid of network camping in this bridge, @@ -228,7 +232,8 @@ class ovim(): dhcp_params = self.config.get("dhcp_server") if dhcp_params: thread = dt.dhcp_thread(dhcp_params=dhcp_params, test=host_test_mode, dhcp_nets=self.config["dhcp_nets"], - db=self.db_of, db_lock=self.db_lock, logger_name=self.logger_name + ".dhcp", + db=self.config["db"], db_lock=self.config["db_lock"], + logger_name=self.logger_name + ".dhcp", debug=self.config.get('log_level_of')) thread.start() self.config['dhcp_thread'] = thread @@ -246,9 +251,11 @@ class ovim(): self.config['host_threads'] = {} for host in hosts: host['image_path'] = '/opt/VNF/images/openvim' - thread = ht.host_thread(name=host['name'], user=host['user'], host=host['ip_name'], db=self.db_of, - db_lock=self.db_lock, test=host_test_mode, image_path=self.config['image_path'], - version=self.config['version'], host_id=host['uuid'], develop_mode=host_develop_mode, + thread = ht.host_thread(name=host['name'], user=host['user'], host=host['ip_name'], db=self.config["db"], + db_lock=self.config["db_lock"], test=host_test_mode, + image_path=self.config['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')) @@ -371,19 +378,12 @@ class ovim(): module = temp_dict['of_controller'] if module not in ovim.of_module: - for base in ("", "osm_openvim.", "lib_osm_openvim."): - try: - pkg = __import__(base + module) - if base: - of_conn_module = getattr(pkg, module) - else: - of_conn_module = pkg - ovim.of_module[module] = of_conn_module - self.logger.debug("Module load from {}".format(base + module)) - break - except Exception as e: - self.logger.warning("Module {} not found {}".format(base + module, e)) - else: + try: + pkg = __import__("osm_openvim." + module) + of_conn_module = getattr(pkg, module) + ovim.of_module[module] = of_conn_module + self.logger.debug("Module load from {}".format("osm_openvim." + module)) + except Exception as e: self.logger.error("Cannot open openflow controller module of type '%s'", module) raise ovimException("Cannot open openflow controller of type module '{}'" "Revise it is installed".format(module), @@ -409,8 +409,11 @@ class ovim(): # ofc_net_same_vlan = False ofc_net_same_vlan = False - thread = oft.openflow_thread(ofc_uuid, of_conn, of_test=self.of_test_mode, db=self.db_of, db_lock=self.db_lock, - pmp_with_same_vlan=ofc_net_same_vlan, debug=self.config['log_level_of']) + thread = oft.openflow_thread(ofc_uuid, of_conn, of_test=self.of_test_mode, db=self.config["db"], + db_lock=self.config["db_lock"], + pmp_with_same_vlan=ofc_net_same_vlan, + logger_name=self.logger_name + ".ofc." + ofc_uuid, + debug=self.config.get('log_level_of')) #r, c = thread.OF_connector.obtain_port_correspondence() #if r < 0: # raise ovimException("Cannot get openflow information %s", c) @@ -499,6 +502,7 @@ class ovim(): net_vlan = network.get("vlan") net_bind_net = network.get("bind_net") net_bind_type = network.get("bind_type") + net_region = network.get("region") name = network["name"] # check if network name ends with : and network exist in order to make and automated bindning @@ -594,8 +598,13 @@ class ovim(): net_vlan = bridge_net[1] elif net_type == 'bridge_data' or net_type == 'bridge_man' and self.config['network_type'] == 'ovs': net_provider = 'OVS' + if not net_region: + if net_type == "data" or net_type == "ptp": + net_region = "__DATA__" + elif net_provider == "OVS": + net_region = "__OVS__" if not net_vlan and (net_type == "data" or net_type == "ptp" or net_provider == "OVS"): - net_vlan = self.db.get_free_net_vlan() + net_vlan = self.db.get_free_net_vlan(net_region) if net_vlan < 0: raise ovimException("Error getting an available vlan", HTTP_Internal_Server_Error) if net_provider == 'OVS': @@ -604,6 +613,7 @@ class ovim(): network['provider'] = net_provider network['type'] = net_type network['vlan'] = net_vlan + network['region'] = net_region dhcp_integrity = True if 'enable_dhcp' in network and network['enable_dhcp']: dhcp_integrity = self._check_dhcp_data_integrity(network) @@ -1342,13 +1352,13 @@ class ovim(): host_develop_mode = True if self.config['mode'] == 'development' else False dhcp_host = ht.host_thread(name='openvim_controller', user=ovs_controller_user, host=controller_ip, - db=self.db_of, - db_lock=self.db_lock, test=host_test_mode, + db=self.config["db"], db_lock=self.config["db_lock"], test=host_test_mode, image_path=self.config['image_path'], version=self.config['version'], host_id='openvim_controller', develop_mode=host_develop_mode, - develop_bridge_iface=bridge_ifaces, logger_name=self.logger_name + ".host.controller", + develop_bridge_iface=bridge_ifaces, + logger_name=self.logger_name + ".host.controller", 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()