- #Connect to database
- db_http = create_database_connection(config_dic)
- r = db_http.get_db_version()
- if r[0]<0:
- logger.error("DATABASE is not a VIM one or it is a '0.0' version. Try to upgrade to version '%s' with './database_utils/migrate_vim_db.sh'", database_version)
- exit(-1)
- elif r[1]!=database_version:
- logger.error("DATABASE wrong version '%s'. Try to upgrade/downgrade to version '%s' with './database_utils/migrate_vim_db.sh'", r[1], database_version)
- exit(-1)
- db_of = create_database_connection(config_dic)
- db_lock= threading.Lock()
- config_dic['db'] = db_of
- config_dic['db_lock'] = db_lock
-
- #precreate interfaces; [bridge:<host_bridge_name>, VLAN used at Host, uuid of network camping in this bridge, speed in Gbit/s
- config_dic['dhcp_nets']=[]
- config_dic['bridge_nets']=[]
- for bridge,vlan_speed in config_dic["bridge_ifaces"].items():
- #skip 'development_bridge'
- if config_dic['mode'] == 'development' and config_dic['development_bridge'] == bridge:
- continue
- config_dic['bridge_nets'].append( [bridge, vlan_speed[0], vlan_speed[1], None] )
- del config_dic["bridge_ifaces"]
-
- #check if this bridge is already used (present at database) for a network)
- used_bridge_nets=[]
- for brnet in config_dic['bridge_nets']:
- r,nets = db_of.get_table(SELECT=('uuid',), FROM='nets',WHERE={'provider': "bridge:"+brnet[0]})
- if r>0:
- brnet[3] = nets[0]['uuid']
- used_bridge_nets.append(brnet[0])
- if config_dic.get("dhcp_server"):
- if brnet[0] in config_dic["dhcp_server"]["bridge_ifaces"]:
- config_dic['dhcp_nets'].append(nets[0]['uuid'])
- if len(used_bridge_nets) > 0 :
- logger.info("found used bridge nets: " + ",".join(used_bridge_nets))
- #get nets used by dhcp
- if config_dic.get("dhcp_server"):
- for net in config_dic["dhcp_server"].get("nets", () ):
- r,nets = db_of.get_table(SELECT=('uuid',), FROM='nets',WHERE={'name': net})
- if r>0:
- config_dic['dhcp_nets'].append(nets[0]['uuid'])
-
- # get host list from data base before starting threads
- r,hosts = db_of.get_table(SELECT=('name','ip_name','user','uuid'), FROM='hosts', WHERE={'status':'ok'})
- if r<0:
- logger.error("Cannot get hosts from database %s", hosts)
- exit(-1)
- # create connector to the openflow controller
- of_test_mode = False if config_dic['mode']=='normal' or config_dic['mode']=="OF only" else True
-
- if of_test_mode:
- OF_conn = oft.of_test_connector({"of_debug": config_dic['log_level_of']} )
- else:
- #load other parameters starting by of_ from config dict in a temporal dict
- temp_dict={ "of_ip": config_dic['of_controller_ip'],
- "of_port": config_dic['of_controller_port'],
- "of_dpid": config_dic['of_controller_dpid'],
- "of_debug": config_dic['log_level_of']
- }
- for k,v in config_dic.iteritems():
- if type(k) is str and k[0:3]=="of_" and k[0:13] != "of_controller":
- temp_dict[k]=v
- if config_dic['of_controller']=='opendaylight':
- module = "ODL"
- elif "of_controller_module" in config_dic:
- module = config_dic["of_controller_module"]
- else:
- module = config_dic['of_controller']
- module_info=None
- try:
- module_info = imp.find_module(module)
-
- OF_conn = imp.load_module("OF_conn", *module_info)
- try:
- OF_conn = OF_conn.OF_conn(temp_dict)
- except Exception as e:
- logger.error("Cannot open the Openflow controller '%s': %s", type(e).__name__, str(e))
- if module_info and module_info[0]:
- file.close(module_info[0])
- exit(-1)
- except (IOError, ImportError) as e:
- if module_info and module_info[0]:
- file.close(module_info[0])
- logger.error("Cannot open openflow controller module '%s'; %s: %s; revise 'of_controller' field of configuration file.", module, type(e).__name__, str(e))
- exit(-1)
-
-
- #create openflow thread
- thread = oft.openflow_thread(OF_conn, of_test=of_test_mode, db=db_of, db_lock=db_lock,
- pmp_with_same_vlan=config_dic['of_controller_nets_with_same_vlan'],
- debug=config_dic['log_level_of'])
- r,c = thread.OF_connector.obtain_port_correspondence()
- if r<0:
- logger.error("Cannot get openflow information %s", c)
- exit()
- thread.start()
- config_dic['of_thread'] = thread
-
- #create dhcp_server thread
- host_test_mode = True if config_dic['mode']=='test' or config_dic['mode']=="OF only" else False
- dhcp_params = config_dic.get("dhcp_server")
- if dhcp_params:
- thread = dt.dhcp_thread(dhcp_params=dhcp_params, test=host_test_mode, dhcp_nets=config_dic["dhcp_nets"], db=db_of, db_lock=db_lock, debug=config_dic['log_level_of'])
- thread.start()
- config_dic['dhcp_thread'] = thread