__author__ = "Alfonso Tierno, Leonardo Mirabal"
__date__ = "$06-Feb-2017 12:07:15$"
+__version__ = "0.5.8-r524"
+version_date = "March 2017"
+database_version = "0.15" #expected database schema version
import threading
import vim_db
self.config['db_host']) )
return db
+ @staticmethod
+ def get_version():
+ return __version__
+
+ @staticmethod
+ def get_version_date():
+ return version_date
+
+ @staticmethod
+ def get_database_version():
+ return database_version
+
@staticmethod
def _check_dhcp_data_integrity(network):
"""
Start ovim services
:return:
"""
+ global database_version
# if self.running_info:
# return #TODO service can be checked and rebuild broken threads
r = self.db.get_db_version()
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(self.config["database_version"]) )
- elif r[1] != self.config["database_version"]:
+ "'./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], self.config["database_version"]) )
+ "'./database_utils/migrate_vim_db.sh'".format(r[1], database_version) )
# create database connection for openflow threads
self.db_of = self._create_database_connection()
def _load_of_module(self, db_config):
"""
import python module for each SDN controller supported
- :param default: SDN dn information
+ :param db_config: SDN dn information
:return: Module
"""
if not db_config:
try:
if self.of_test_mode:
- return oft.of_test_connector({"name": db_config['type'], "dpid": db_config['dpid'],
- "of_debug": self.config['log_level_of']})
+ return oft.of_test_connector({"name": db_config['type'], "dpid": db_config['dpid'],
+ "of_debug": self.config['log_level_of']})
temp_dict = {}
if db_config:
temp_dict['of_port'] = db_config['port']
temp_dict['of_dpid'] = db_config['dpid']
temp_dict['of_controller'] = db_config['type']
+ temp_dict['of_user'] = db_config['user']
+ temp_dict['of_password'] = db_config['password']
temp_dict['of_debug'] = self.config['log_level_of']
where_ = {}
else:
where_ = {"net_id": network_id}
-
result, content = self.db.get_table(
- SELECT=("name", "net_id", "priority", "vlan_id", "ingress_port", "src_mac", "dst_mac", "actions"),
+ SELECT=("name", "net_id", "ofc_id", "priority", "vlan_id", "ingress_port", "src_mac", "dst_mac", "actions"),
WHERE=where_, FROM='of_flows')
if result < 0:
return result
- def delete_openflow_rules(self):
+ def delete_openflow_rules(self, ofc_id=None):
"""
To make actions over the net. The action is to delete ALL openflow rules
:return: return operation result
"""
- # ignore input data
- r, c = self.config['of_thread'].insert_task("clear-all")
- if r < 0:
- raise ovimException(str(c), -r)
+
+ if not ofc_id:
+ if 'Default' in self.config['ofcs_thread']:
+ r, c = self.config['ofcs_thread']['Default'].insert_task("clear-all")
+ else:
+ raise ovimException("Default Openflow controller not not running", HTTP_Not_Found)
+
+ elif ofc_id in self.config['ofcs_thread']:
+ r, c = self.config['ofcs_thread'][ofc_id].insert_task("clear-all")
+
+ # ignore input data
+ if r < 0:
+ raise ovimException(str(c), -r)
+ else:
+ raise ovimException("Openflow controller not found with ofc_id={}".format(ofc_id), HTTP_Not_Found)
return r
- def get_openflow_ports(self):
+ def get_openflow_ports(self, ofc_id=None):
"""
Obtain switch ports names of openflow controller
:return: Return flow ports in DB
"""
- data = {'ports': self.config['of_thread'].OF_connector.pp2ofi}
- return data
+ if not ofc_id:
+ if 'Default' in self.config['ofcs_thread']:
+ conn = self.config['ofcs_thread']['Default'].OF_connector
+ else:
+ raise ovimException("Default Openflow controller not not running", HTTP_Not_Found)
+
+ if ofc_id in self.config['ofcs_thread']:
+ conn = self.config['ofcs_thread'][ofc_id].OF_connector
+ else:
+ raise ovimException("Openflow controller not found with ofc_id={}".format(ofc_id), HTTP_Not_Found)
+ return conn.pp2ofi
def get_ports(self, columns=None, filter={}, limit=None):
# result, content = my.db.get_ports(where_)
port_mapping_data = self.get_of_port_mappings(columns, db_filter)
if not len(port_mapping_data):
- raise ovimException("No port mapping founded for region='{}', compute id='{}' and pci='{}'".
- format(db_filter['region'], db_filter['compute_node'], db_filter['pci']),
+ raise ovimException("No port mapping founded for '{}'".format(str(db_filter)),
HTTP_Not_Found)
elif len(port_mapping_data) > 1:
raise ovimException("Wrong port data was given, please check pci, region & compute id data",
port_data['switch_mac'] = port_mapping_data[0]['switch_mac']
# remove from compute_node, region and pci of_port_data to adapt to 'ports' structure
- del port_data['compute_node']
- del port_data['region']
- del port_data['pci']
+ if 'region' in port_data:
+ del port_data['region']
+ if 'pci' in port_data:
+ del port_data['pci']
+ if 'compute_node' in port_data:
+ del port_data['compute_node']
result, uuid = self.db.new_row('ports', port_data, True, True)
if result > 0:
r, c = ofc_t[switch_dpid].insert_task("update-net", net_id)
if r < 0:
- message = "Cannot insert a task for updating network '$s', %s", net_id, c
+ message = "Cannot insert a task for updating network '{}', {}".format(net_id, c)
self.logger.error(message)
raise ovimException(message, HTTP_Internal_Server_Error)