# -*- coding: utf-8 -*-
##
-# Copyright 2015 Telefónica Investigación y Desarrollo, S.A.U.
+# Copyright 2015 Telefonica Investigacion y Desarrollo, S.A.U.
# This file is part of openvim
# All Rights Reserved.
#
__author__ = "Alfonso Tierno, Leonardo Mirabal"
__date__ = "$06-Feb-2017 12:07:15$"
-__version__ = "0.5.20-r536"
-version_date = "Sep 2017"
-database_version = 21 #needed database schema version
+__version__ = "0.5.29-r549"
+version_date = "Sep 2018"
+database_version = 23 #needed database schema version
HTTP_Bad_Request = 400
HTTP_Unauthorized = 401
self.get_version(), self.get_version_date(), self.get_database_version()))
# create database connection for openflow threads
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
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'})
+ r, hosts = self.db.get_table(SELECT=('name', 'ip_name', 'user', 'uuid', 'hypervisors', 'password', 'keyfile'),
+ FROM='hosts', WHERE={'status': 'ok'}) #Unikernels extension
if r < 0:
raise ovimException("Cannot get hosts from database {}".format(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,
+ 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,
+ hypervisors=host['hypervisors'], #Unikernels extension
logger_name=self.logger_name + ".host." + host['name'],
debug=self.config.get('log_level_host'))
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.config["db"], db_lock=self.config["db_lock"],
+ db=self.config["db"],
logger_name=self.logger_name + ".dhcp",
debug=self.config.get('log_level_of'))
thread.start()
"""
Start ofc task for existing ofcs in database
:param db_of:
- :param db_lock:
:return:
"""
ofcs = self.get_of_controllers()
ofc_net_same_vlan = False
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'))
return content
- def show_network(self, network_id, db_filter={}):
+ def show_network(self, network_id, db_filter={}, skip_on_not_found=False):
"""
Get network from DB by id
:param network_id: net Id
if result < 0:
raise ovimException(str(content), -result)
elif result == 0:
- raise ovimException("show_network network '%s' not found" % network_id, -result)
+ if skip_on_not_found:
+ return
+ raise ovimException("show_network network '%s' not found" % network_id, HTTP_Not_Found)
else:
convert_boolean(content, ('shared', 'admin_state_up', 'enable_dhcp'))
# get ports from DB
WHERE={'net_id': network_id}, LIMIT=100)
if len(ports) > 0:
content[0]['ports'] = ports
-
convert_boolean(content, ('shared', 'admin_state_up', 'enable_dhcp'))
+
+ result, flows = self.db.get_table(FROM='of_flows', SELECT=('priority', 'vlan_id', 'ingress_port', 'src_mac', 'dst_mac', 'actions'),
+ WHERE={'net_id': network_id}, LIMIT=100)
+ if len(flows) > 0:
+ content[0]['flows'] = flows
return content[0]
def new_network(self, network):
if tenant_id:
result, _ = self.db.get_table(FROM='tenants', SELECT=('uuid',), WHERE={'uuid': tenant_id, "enabled": True})
if result <= 0:
- raise ovimException("set_network error, no tenant founded", -result)
+ raise ovimException("set_network error, no tenant found", -result)
bridge_net = None
# check valid params
network['vlan'] = net_vlan
network['region'] = net_region
dhcp_integrity = True
- if 'enable_dhcp' in network and network['enable_dhcp']:
+ if network.get('enable_dhcp'):
dhcp_integrity = self._check_dhcp_data_integrity(network)
if network.get('links'):
network['routes'] = yaml.safe_dump(network['routes'], default_flow_style=True, width=256)
result, content = self.db.new_row('nets', network, True, True)
- if result >= 0 and dhcp_integrity:
+ if result >= 0: # and dhcp_integrity:
if bridge_net:
bridge_net[3] = content
- if self.config.get("dhcp_server") and self.config['network_type'] == 'bridge': # \
+ if self.config.get("dhcp_server") and self.config['network_type'] == 'bridge':
if network["name"] in self.config["dhcp_server"].get("nets", ()):
self.config["dhcp_nets"].append(content)
self.logger.debug("dhcp_server: add new net", content)
self.logger.debug("dhcp_server: add new net", content, content)
return content
else:
- raise ovimException("Error posting network", HTTP_Internal_Server_Error)
+ raise ovimException("Error creating network: {}".format(content), -result)
+
# TODO kei change update->edit
def edit_network(self, network_id, network):
else:
raise ovimException(content, -result)
- def delete_network(self, network_id):
+ def delete_network(self, network_id, idempotent=True):
"""
Delete network by network id
:param network_id: network id
:return:
"""
- net_data = self.show_network(network_id)
+ net_data = self.show_network(network_id, skip_on_not_found=idempotent)
+ if not net_data: # network does not exist
+ return
# delete from the data base
result, content = self.db.delete_row('nets', network_id)
port_mapping_data = self.get_of_port_mappings(columns, db_filter)
if not len(port_mapping_data):
- raise ovimException("No port mapping founded for '{}'".format(str(db_filter)),
+ raise ovimException("No port mapping found 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",
del port_data['compute_node']
result, uuid = self.db.new_row('ports', port_data, True, True)
+ # set net status to BUILD
+ self.db.update_rows('nets', {"status": "BUILD"}, WHERE={'uuid': port_data['net_id']})
if result > 0:
try:
self.net_update_ofc_thread(port_data['net_id'], port_data['ofc_id'])
self.logger.error(message)
raise ovimException(message, HTTP_Internal_Server_Error)
- def delete_port(self, port_id):
+ def delete_port(self, port_id, idempotent=False):
# Look for the previous port data
result, ports = self.db.get_table(WHERE={'uuid': port_id, "type": "external"}, FROM='ports')
if result < 0:
# delete from the data base
result, content = self.db.delete_row('ports', port_id)
if result == 0:
+ if idempotent:
+ return
raise ovimException("External port '{}' not found".format(port_id), http_code=HTTP_Not_Found)
elif result < 0:
raise ovimException("Cannot delete port from database: {}".format(content), http_code=-result)
# update network
- network = ports[0].get('net_id', None)
- if network:
+ net_id = ports[0].get('net_id', None)
+ if net_id:
# change of net.
+ # set net status to BUILD
+ self.db.update_rows('nets', {"status": "BUILD"}, WHERE={'uuid': net_id})
try:
- self.net_update_ofc_thread(network, ofc_id=ports[0]["ofc_id"], switch_dpid=ports[0]["switch_dpid"])
+ self.net_update_ofc_thread(net_id, ofc_id=ports[0]["ofc_id"], switch_dpid=ports[0]["switch_dpid"])
except ovimException as e:
- raise ovimException("Cannot insert a task for delete network '{}' {}".format(network, str(e)),
+ raise ovimException("Cannot insert a task for delete network '{}' {}".format(net_id, str(e)),
HTTP_Internal_Server_Error)
except Exception as e:
- raise ovimException("Cannot insert a task for delete network '{}' {}".format(network, str(e)),
+ raise ovimException("Cannot insert a task for delete network '{}' {}".format(net_id, str(e)),
HTTP_Internal_Server_Error)
return content
dhcp_host = ht.host_thread(name='openvim_controller', user=ovs_controller_user, host=controller_ip,
password=self.config.get('ovs_controller_password'),
keyfile=self.config.get('ovs_controller_keyfile'),
- db=self.config["db"], db_lock=self.config["db_lock"], test=host_test_mode,
+ db=self.config["db"], test=host_test_mode,
image_path=self.config['host_image_path'], version=self.config['version'],
host_id='openvim_controller', develop_mode=host_develop_mode,
develop_bridge_iface=bridge_ifaces,