+ try:
+ self.net_update_ofc_thread(port_data['net_id'])
+ except ovimException as e:
+ raise ovimException("Cannot insert a task for updating network '{}' {}"
+ .format(port_data['net_id'], str(e)), HTTP_Internal_Server_Error)
+ except Exception as e:
+ raise ovimException("Cannot insert a task for updating network '{}' {}"
+ .format(port_data['net_id'], str(e)), HTTP_Internal_Server_Error)
+
+ return uuid
+ else:
+ raise ovimException(str(uuid), -result)
+
+ def new_external_port(self, port_data):
+ """
+ Create new external port and check port mapping correspondence
+ :param port_data: port_data = {
+ 'region': 'datacenter region',
+ 'compute_node': 'compute node id',
+ 'pci': 'pci port address',
+ 'vlan': 'net vlan',
+ 'net_id': 'net id',
+ 'tenant_id': 'tenant id',
+ 'mac': 'switch mac',
+ 'name': 'port name'
+ 'ip_address': 'ip address - optional'}
+ :return:
+ """
+
+ port_data['type'] = 'external'
+
+ if port_data.get('net_id'):
+ # check that new net has the correct type
+ result, new_net = self.db.check_target_net(port_data['net_id'], None, 'external')
+ if result < 0:
+ raise ovimException(str(new_net), -result)
+ # insert in data base
+ db_filter = {}
+
+ if port_data.get('region'):
+ db_filter['region'] = port_data['region']
+ if port_data.get('pci'):
+ db_filter['pci'] = port_data['pci']
+ if port_data.get('compute_node'):
+ db_filter['compute_node'] = port_data['compute_node']
+
+ columns = ['ofc_id', 'switch_dpid', 'switch_port', 'switch_mac', 'pci']
+ 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)),
+ HTTP_Not_Found)
+ elif len(port_mapping_data) > 1:
+ raise ovimException("Wrong port data was given, please check pci, region & compute id data",
+ HTTP_Conflict)
+
+ port_data['ofc_id'] = port_mapping_data[0]['ofc_id']
+ port_data['switch_dpid'] = port_mapping_data[0]['switch_dpid']
+ port_data['switch_port'] = port_mapping_data[0]['switch_port']
+ 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
+ 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:
+ try:
+ self.net_update_ofc_thread(port_data['net_id'], port_data['ofc_id'])
+ except ovimException as e:
+ raise ovimException("Cannot insert a task for updating network '{}' {}".
+ format(port_data['net_id'], str(e)), HTTP_Internal_Server_Error)
+ except Exception as e:
+ raise ovimException("Cannot insert a task for updating network '{}' {}"
+ .format(port_data['net_id'], e), HTTP_Internal_Server_Error)