예제 #1
0
 def delete_l2_gateway_connection(self, context, gw_connection):
     """Delete a L2 gateway connection."""
     conn_mapping = nsx_db.get_l2gw_connection_mapping(
         session=context.session, connection_id=gw_connection)
     if not conn_mapping:
         LOG.error(
             "Unable to delete gateway connection %(id)s: mapping "
             "not found", {'id': gw_connection})
         # Do not block the deletion
         return
     bridge_endpoint_id = conn_mapping.get('bridge_endpoint_id')
     # Delete the logical port from the bridge endpoint.
     self._core_plugin.delete_port(context=context,
                                   port_id=conn_mapping.get('port_id'),
                                   l2gw_port_check=False)
     try:
         self._core_plugin.nsxlib.bridge_endpoint.delete(bridge_endpoint_id)
     except nsxlib_exc.ManagerError as e:
         LOG.exception(
             "Unable to delete bridge endpoint %(id)s on the "
             "backend due to exc: %(exc)s", {
                 'id': bridge_endpoint_id,
                 'exc': e
             })
         raise l2gw_exc.L2GatewayServiceDriverError(
             method='delete_l2_gateway_connection')
예제 #2
0
    def create_l2_gateway_connection_postcommit(self, context, gw_connection):
        network_id = gw_connection.get('network_id')
        virtual_wire = nsx_db.get_nsx_switch_ids(context.session, network_id)

        # In NSX-v, there will be only one device configured per L2 gateway.
        # The name of the device shall carry the backend DLR.
        l2gw_id = gw_connection.get(l2gw_const.L2GATEWAY_ID)
        device = self._get_device(context, l2gw_id)
        device_name = device.get('device_name')
        device_id = device.get('id')
        interface = self._get_l2_gw_interfaces(context, device_id)
        interface_name = interface[0].get("interface_name")
        bridge_name = "bridge-" + uuidutils.generate_uuid()
        bridge_dict = {
            "bridges": {
                "bridge": {
                    "name": bridge_name,
                    "virtualWire": virtual_wire[0],
                    "dvportGroup": interface_name
                }
            }
        }
        try:
            self._nsxv.create_bridge(device_name, bridge_dict)
        except exceptions.VcnsApiException:
            LOG.exception("Failed to update NSX, "
                          "rolling back changes on neutron.")
            raise l2gw_exc.L2GatewayServiceDriverError(
                method='create_l2_gateway_connection_postcommit')
        return
예제 #3
0
 def delete_l2_gateway_connection_postcommit(self, context, gw_connection):
     """Delete a L2 gateway connection."""
     conn_mapping = nsx_db.get_l2gw_connection_mapping(
         session=context.session, connection_id=gw_connection)
     bridge_endpoint_id = conn_mapping.get('bridge_endpoint_id')
     # Delete the logical port from the bridge endpoint.
     self._core_plugin.delete_port(context=context,
                                   port_id=conn_mapping.get('port_id'),
                                   l2gw_port_check=False)
     try:
         self._core_plugin.nsxlib.delete_bridge_endpoint(bridge_endpoint_id)
     except nsxlib_exc.ManagerError as e:
         LOG.exception(
             _LE("Unable to delete bridge endpoint %(id)s on the "
                 "backend due to exc: %(exc)s"), {
                     'id': bridge_endpoint_id,
                     'exc': e
                 })
         raise l2gw_exc.L2GatewayServiceDriverError(
             method='delete_l2_gateway_connection_postcommit')
예제 #4
0
 def create_l2_gateway_connection_postcommit(self, context, gw_connection):
     """Create a L2 gateway connection."""
     l2gw_id = gw_connection.get(l2gw_const.L2GATEWAY_ID)
     network_id = gw_connection.get(l2gw_const.NETWORK_ID)
     device_name = self._get_bridge_cluster(context, l2gw_id)
     seg_id = self._get_conn_seg_id(context, gw_connection)
     self._validate_segment_id(seg_id)
     tenant_id = gw_connection['tenant_id']
     if context.is_admin and not tenant_id:
         tenant_id = context.tenant_id
         gw_connection['tenant_id'] = tenant_id
     try:
         tags = self._core_plugin.nsxlib.build_v3_tags_payload(
             gw_connection,
             resource_type='os-neutron-l2gw-id',
             project_name=context.tenant_name)
         bridge_endpoint = self._core_plugin.nsxlib.bridge_endpoint.create(
             device_name=device_name, seg_id=seg_id, tags=tags)
     except nsxlib_exc.ManagerError as e:
         LOG.exception(
             "Unable to create bridge endpoint, rolling back "
             "changes on neutron. Exception is %s", e)
         raise l2gw_exc.L2GatewayServiceDriverError(
             method='create_l2_gateway_connection_postcommit')
     #TODO(abhiraut): Consider specifying the name of the port
     # Create a logical port and connect it to the bridge endpoint.
     port_dict = {
         'port': {
             'tenant_id': tenant_id,
             'network_id': network_id,
             'mac_address': constants.ATTR_NOT_SPECIFIED,
             'admin_state_up': True,
             'fixed_ips': [],
             'device_id': bridge_endpoint['id'],
             'device_owner': nsx_constants.BRIDGE_ENDPOINT,
             'name': '',
         }
     }
     try:
         #TODO(abhiraut): Consider adding UT for port check once UTs are
         #                refactored
         port = self._core_plugin.create_port(context,
                                              port_dict,
                                              l2gw_port_check=True)
         # Deallocate IP address from the port.
         for fixed_ip in port.get('fixed_ips', []):
             self._core_plugin._delete_ip_allocation(
                 context, network_id, fixed_ip['subnet_id'],
                 fixed_ip['ip_address'])
         LOG.debug("IP addresses deallocated on port %s", port['id'])
     except (nsxlib_exc.ManagerError, n_exc.NeutronException) as e:
         LOG.exception(
             "Unable to create L2 gateway port, "
             "rolling back changes on neutron: %s", e)
         self._core_plugin.nsxlib.bridge_endpoint.delete(
             bridge_endpoint['id'])
         raise l2gw_exc.L2GatewayServiceDriverError(
             method='create_l2_gateway_connection_postcommit')
     try:
         # Update neutron's database with the mappings.
         nsx_db.add_l2gw_connection_mapping(
             session=context.session,
             connection_id=gw_connection['id'],
             bridge_endpoint_id=bridge_endpoint['id'],
             port_id=port['id'])
     except db_exc.DBError:
         with excutils.save_and_reraise_exception():
             LOG.exception("Unable to add L2 gateway connection "
                           "mappings, rolling back changes on neutron")
             self._core_plugin.nsxlib.bridge_endpoint.delete(
                 bridge_endpoint['id'])
             super(NsxV3Driver, self).delete_l2_gateway_connection(
                 context, gw_connection['id'])
     return gw_connection
예제 #5
0
 def create_l2_gateway_connection_postcommit(self, context, gw_connection):
     """Create a L2 gateway connection."""
     l2gw_id = gw_connection.get(l2gw_const.L2GATEWAY_ID)
     network_id = gw_connection.get(l2gw_const.NETWORK_ID)
     devices = self._get_l2_gateway_devices(context, l2gw_id)
     # In NSXv3, there will be only one device configured per L2 gateway.
     # The name of the device shall carry the backend bridge cluster's UUID.
     device_name = devices[0].get('device_name')
     # The seg-id will be provided either during gateway create or gateway
     # connection create. l2gateway_db_mixin makes sure that it is
     # configured one way or the other.
     seg_id = gw_connection.get(l2gw_const.SEG_ID)
     if not seg_id:
         # Seg-id was not passed as part of connection-create. Retrieve
         # seg-id from L2 gateway's interface.
         interface = self._get_l2_gw_interfaces(context, devices[0]['id'])
         seg_id = interface[0].get(l2gw_const.SEG_ID)
     self._validate_segment_id(seg_id)
     tenant_id = gw_connection['tenant_id']
     if context.is_admin and not tenant_id:
         tenant_id = context.tenant_id
         gw_connection['tenant_id'] = tenant_id
     try:
         tags = self._core_plugin.nsxlib.build_v3_tags_payload(
             gw_connection,
             resource_type='os-neutron-l2gw-id',
             project_name=context.tenant_name)
         bridge_endpoint = self._core_plugin.nsxlib.bridge_endpoint.create(
             device_name=device_name, seg_id=seg_id, tags=tags)
     except nsxlib_exc.ManagerError as e:
         LOG.exception(
             _LE("Unable to create bridge endpoint, rolling back "
                 "changes on neutron. Exception is %s"), e)
         raise l2gw_exc.L2GatewayServiceDriverError(
             method='create_l2_gateway_connection_postcommit')
     #TODO(abhiraut): Consider specifying the name of the port
     # Create a logical port and connect it to the bridge endpoint.
     port_dict = {
         'port': {
             'tenant_id': tenant_id,
             'network_id': network_id,
             'mac_address': constants.ATTR_NOT_SPECIFIED,
             'admin_state_up': True,
             'fixed_ips': [],
             'device_id': bridge_endpoint['id'],
             'device_owner': nsx_constants.BRIDGE_ENDPOINT,
             'name': '',
         }
     }
     try:
         #TODO(abhiraut): Consider adding UT for port check once UTs are
         #                refactored
         port = self._core_plugin.create_port(context,
                                              port_dict,
                                              l2gw_port_check=True)
         # Deallocate IP address from the port.
         for fixed_ip in port.get('fixed_ips', []):
             self._core_plugin._delete_ip_allocation(
                 context, network_id, fixed_ip['subnet_id'],
                 fixed_ip['ip_address'])
         LOG.debug("IP addresses deallocated on port %s", port['id'])
     except (nsxlib_exc.ManagerError, n_exc.NeutronException):
         LOG.exception(
             _LE("Unable to create L2 gateway port, "
                 "rolling back changes on neutron"))
         self._core_plugin.nsxlib.bridge_endpoint.delete(
             bridge_endpoint['id'])
         raise l2gw_exc.L2GatewayServiceDriverError(
             method='create_l2_gateway_connection_postcommit')
     try:
         # Update neutron's database with the mappings.
         nsx_db.add_l2gw_connection_mapping(
             session=context.session,
             connection_id=gw_connection['id'],
             bridge_endpoint_id=bridge_endpoint['id'],
             port_id=port['id'])
     except db_exc.DBError:
         with excutils.save_and_reraise_exception():
             LOG.exception(
                 _LE("Unable to add L2 gateway connection "
                     "mappings, rolling back changes on neutron"))
             self._core_plugin.nsxlib.bridge_endpoint.delete(
                 bridge_endpoint['id'])
             super(NsxV3Driver, self).delete_l2_gateway_connection(
                 context, gw_connection['id'])
     return gw_connection