def _delete_port_on_switch(self, context):
     port = context.current
     db_context = context._plugin_context
     if self.is_network_device_port(port):
         return
     port_bindings = context.nuage_bindings
     if not port_bindings:
         return
     with db_context.session.begin(subtransactions=True):
         for binding in port_bindings:
             bindings = ext_db.get_switchport_bindings_by_switchport_vlan(
                 db_context, binding['switchport_uuid'],
                 binding['segmentation_id'])
             if not bindings:
                 vport = self.vsdclient.get_nuage_vport_by_id(
                     binding['nuage_vport_id'], required=False)
                 if vport:
                     LOG.debug("Deleting vport %(vport)s", {'vport': vport})
                     self.vsdclient.delete_nuage_gateway_vport_no_usergroup(
                         port['tenant_id'], vport)
                     if vport.get('VLANID'):
                         LOG.debug("Deleting vlan %(vlan)s",
                                   {'vlan': vport['VLANID']})
                         self.vsdclient.delete_gateway_port_vlan(
                             vport['VLANID'])
    def _delete_port(self, context):
        """delete_port. This call makes the REST request to VSD

        for un provision VLAN/VPort for the gateway port where
        sriov instance is connected.
        """
        port = context.current
        db_context = context._plugin_context
        LOG.debug("delete_port with port_id %(port_id)s",
                  {'port_id': port['id']})
        port_bindings = ext_db.get_switchport_binding_by_neutron_port(
            db_context, port['id'])
        if not port_bindings:
            return
        for binding in port_bindings:
            bindings = ext_db.get_switchport_bindings_by_switchport_vlan(
                db_context, binding['switchport_uuid'],
                binding['segmentation_id'])
            if len(bindings) == 1:
                vport = self.vsdclient.get_nuage_vport_by_id(
                    binding['nuage_vport_id'], required=False)
                if not vport:
                    LOG.debug("couldn't find a vport")
                else:
                    LOG.debug("Deleting vport %(vport)s", {'vport': vport})
                    self.vsdclient.delete_nuage_gateway_vport_no_usergroup(
                        port['tenant_id'], vport)
                    if vport.get('VLANID'):
                        LOG.debug("Deleting vlan %(vlan)s",
                                  {'vlan': vport['VLANID']})
                        self.vsdclient.delete_gateway_port_vlan(
                            vport['VLANID'])
            ext_db.delete_switchport_binding(db_context, port['id'],
                                             binding['segmentation_id'])
    def _create_bridgeport(self, context, bridge, segmentation_id):
        port = context.current
        ctx = context._plugin_context
        host = port[portbindings.HOST_ID]
        switch_mappings = ext_db.get_switchports_by_host_bridge(
            ctx, host, bridge)
        if not switch_mappings:
            msg = (_(
                "Failed to retrieve switchport mapping "
                "for host: %(host)s bridge: %(bridge)s", {
                    'host': host,
                    'bridge': bridge
                }))
            raise exceptions.NuageBadRequest(msg=msg)
        port_bindings = ext_db.get_switchport_binding_by_neutron_port(
            ctx, port['id'], segmentation_id)
        if port_bindings:
            LOG.info(
                "bridge port(s) %(pb)s for port %(port_id)s "
                "already exist", {
                    'pb': port_bindings,
                    'port_id': port['id']
                })
            return
        mappings, rg = self._get_redundancy(bridge, switch_mappings,
                                            ctx.tenant_id)
        for switchport in mappings:
            vports = ext_db.get_switchport_bindings_by_switchport_vlan(
                ctx, switchport['port_uuid'], segmentation_id)

            if len(vports) == 0:
                if rg:
                    gw = self.vsdclient.get_gateway(ctx.tenant_id, rg)
                else:
                    filters = {'system_id': [switchport['switch_id']]}
                    gws = self.vsdclient.get_gateways(ctx.tenant_id, filters)
                    if len(gws) == 0:
                        msg = (_("No gateway found %s") %
                               filters['system_id'][0])
                        raise exceptions.NuageBadRequest(msg=msg)
                    gw = gws[0]

                params = {
                    'gatewayport':
                    switchport.get('redundant_port_uuid')
                    or switchport['port_uuid'],
                    'value':
                    segmentation_id,
                    'redundant':
                    rg is not None,
                    'personality':
                    gw['gw_type']
                }
                vlan = self.vsdclient.create_gateway_vlan(params)
                LOG.debug("created vlan: %(vlan_dict)s", {'vlan_dict': vlan})
                subnet_mapping = self._get_subnet_mapping(
                    context._plugin_context, port)
                subnet = context._plugin.get_subnet(
                    context._plugin_context, subnet_mapping['subnet_id'])
                params = {
                    'gatewayinterface': vlan['ID'],
                    'np_id': subnet_mapping['net_partition_id'],
                    'tenant': port['tenant_id'],
                    'subnet': subnet,
                    'enable_dhcp': subnet['enable_dhcp'],
                    'nuage_managed_subnet':
                    subnet_mapping['nuage_managed_subnet'],
                    'port_security_enabled': False,
                    'personality': gw['gw_type'],
                    'type': p_const.BRIDGE_VPORT_TYPE
                }
                vsd_subnet = self.vsdclient.get_nuage_subnet_by_id(
                    subnet_mapping['nuage_subnet_id'])
                params['vsd_subnet'] = vsd_subnet

                # policy groups are not supported on netconf
                # managed gateways
                create_policy = 'NETCONF' not in gw['gw_type']

                vport = self.vsdclient.create_gateway_vport_no_usergroup(
                    ctx.tenant_id, params, create_policy_group=create_policy)
                LOG.debug("created vport: %(vport_dict)s",
                          {'vport_dict': vport})
                bridge_port_id = vport.get('vport').get('ID')
            else:
                bridge_port_id = vports[0]['nuage_vport_id']
            binding = {
                'neutron_port_id': port.get('id'),
                'nuage_vport_id': bridge_port_id,
                'switchport_uuid': switchport['port_uuid'],
                'segmentation_id': segmentation_id,
                'switchport_mapping_id': switchport['id']
            }
            ext_db.add_switchport_binding(ctx, binding)
    def _create_nuage_bridge_vport(self, port_dict):
        """Create a BRIDGE VPort on VSD"""
        port = port_dict['port']
        gw_ports = port.get('link_info')
        if not gw_ports:
            raise exceptions.DirectPortSwithportMappingNotFound(
                port=port['id'])
        segmentation_id = port_dict['segmentation_id']
        ctx = neutron_context.get_admin_context()
        bridgeports = ext_db.get_switchport_binding_by_neutron_port(
            ctx, port['id'], segmentation_id)
        if bridgeports:
            LOG.info("bridge port(s) %(bp)s for port %(port)s already exist", {
                'bp': bridgeports,
                'port': port['id']
            })
            return
        for gwport in gw_ports:
            vports = ext_db.get_switchport_bindings_by_switchport_vlan(
                ctx, gwport['port_id'], segmentation_id)
            if len(vports) == 0:
                filters = {'system_id': [gwport['switch_id']]}
                gws = self.vsdclient.get_gateways(ctx.tenant_id, filters)
                if len(gws) == 0:
                    msg = (_("No gateway found %s") % filters['system_id'][0])
                    raise exceptions.NuageBadRequest(msg=msg)
                gw = gws[0]

                # gridinv: following code should be removed when
                # we have proper support of native vlan on cisco/netconf
                if ('NETCONF_THIRDPARTY' in gw['gw_type']
                        and segmentation_id == 0):
                    return

                port_id = gwport['port_id']
                params = {
                    'gatewayport': port_id,
                    'value': segmentation_id,
                    'redundant': gwport['redundant'],
                    'personality': gw['gw_type']
                }
                try:
                    vlan = self.vsdclient.create_gateway_vlan(params)
                    LOG.debug("created vlan: %(vlan_dict)s",
                              {'vlan_dict': vlan})
                except ResourceExistsException:
                    allow_flat = self.conf.nuage_sriov.allow_existing_flat_vlan
                    if segmentation_id == 0 and allow_flat:
                        LOG.info(
                            'Reusing existing vlan due to '
                            'allow_existing_flat_vlan=%s', allow_flat)
                        return
                    else:
                        raise
                # create dummy subnet - we need only id
                params = {
                    'gatewayinterface':
                    vlan['ID'],
                    'np_id':
                    port_dict['subnet_mapping']['net_partition_id'],
                    'tenant':
                    port['tenant_id'],
                    'subnet':
                    port_dict['subnet'],
                    'enable_dhcp':
                    port_dict['enable_dhcp'],
                    'nuage_managed_subnet':
                    port_dict['subnet_mapping']['nuage_managed_subnet'],
                    'port_security_enabled':
                    False,
                    'personality':
                    gw['gw_type'],
                    'type':
                    nuage_const.BRIDGE_VPORT_TYPE
                }
                vsd_subnet = self.vsdclient \
                    .get_nuage_subnet_by_id(
                        port_dict['subnet_mapping']['nuage_subnet_id'])
                params['vsd_subnet'] = vsd_subnet

                vport = self.vsdclient.create_gateway_vport_no_usergroup(
                    ctx.tenant_id, params)
                # policy groups are not supported on netconf
                # managed gateways and unmanaged gateways
                create_policy = (gw['gw_type'] not in [
                    'NETCONF_THIRDPARTY_HW_VTEP', 'UNMANAGED_GATEWAY'
                ])
                if create_policy:
                    (domain_type,
                     domain_id) = self._get_domain_type_id_from_vsd_subnet(
                         self.vsdclient, vsd_subnet)
                    self.psec_handler.process_pg_allow_all(
                        ctx, nuage_const.HARDWARE, port_dict['subnet_mapping'],
                        vport['vport'], domain_type, domain_id)
                LOG.debug("created vport: %(vport_dict)s",
                          {'vport_dict': vport})
                bridge_port_id = vport.get('vport').get('ID')
            else:
                LOG.debug("bridge port %(bp)s for vlan %(vlan)s already exist",
                          {
                              'bp': vports[0]['nuage_vport_id'],
                              'vlan': segmentation_id
                          })
                bridge_port_id = vports[0]['nuage_vport_id']
            binding = {
                'neutron_port_id': port.get('id'),
                'nuage_vport_id': bridge_port_id,
                'switchport_uuid': gwport['port_id'],
                'segmentation_id': segmentation_id,
                'switchport_mapping_id': gwport['id']
            }
            ext_db.add_switchport_binding(ctx, binding)
Exemple #5
0
    def _create_nuage_bridge_vport(self, port_dict):
        """Create a BRIDGE VPort on VSD"""
        port = port_dict['port']
        gw_ports = port.get('link_info')
        if not gw_ports:
            raise exceptions.DirectPortSwithportMappingNotFound(
                port=port['id'])
        segmentation_id = port_dict['segmentation_id']
        ctx = neutron_context.get_admin_context()
        vport_exist = ext_db.get_switchport_binding_by_neutron_port(
            ctx, port['id'], segmentation_id)
        if vport_exist:
            LOG.info(
                "bridge port %(bp)s for port %(port_id)s already exist", {
                    'bp': vport_exist['nuage_vport_id'],
                    'port_id': vport_exist['neutron_port_id']
                })
            return
        for gwport in gw_ports:
            vports = ext_db.get_switchport_bindings_by_switchport_vlan(
                ctx, gwport['port_id'], segmentation_id)
            if len(vports) == 0:
                filters = {'system_id': [gwport['switch_id']]}
                gws = self.vsdclient.get_gateways(ctx.tenant_id, filters)
                if len(gws) == 0:
                    msg = (_("No gateway found %s") % filters['system_id'][0])
                    raise exceptions.NuageBadRequest(msg=msg)
                gw = gws[0]

                port_id = gwport['port_id']
                params = {
                    'gatewayport': port_id,
                    'value': segmentation_id,
                    'redundant': gwport['redundant'],
                    'personality': gw['gw_type']
                }
                try:
                    vlan = self.vsdclient.create_gateway_vlan(params)
                    LOG.debug("created vlan: %(vlan_dict)s",
                              {'vlan_dict': vlan})
                except ResourceExistsException:
                    allow_flat = self.conf.nuage_sriov.allow_existing_flat_vlan
                    if segmentation_id == 0 and allow_flat:
                        LOG.info(
                            'Reusing existing vlan due to '
                            'allow_existing_flat_vlan=%s', allow_flat)
                        return
                    else:
                        raise
                # create dummy subnet - we need only id
                params = {
                    'gatewayinterface':
                    vlan['ID'],
                    'np_id':
                    port_dict['subnet_mapping']['net_partition_id'],
                    'tenant':
                    port['tenant_id'],
                    'subnet':
                    port_dict['subnet'],
                    'enable_dhcp':
                    port_dict['enable_dhcp'],
                    'nuage_managed_subnet':
                    port_dict['subnet_mapping']['nuage_managed_subnet'],
                    'port_security_enabled':
                    False,
                    'personality':
                    gw['gw_type'],
                    'type':
                    nuage_const.BRIDGE_VPORT_TYPE
                }
                vsd_subnet = self.vsdclient \
                    .get_nuage_subnet_by_id(
                        port_dict['subnet_mapping']['nuage_subnet_id'])
                params['vsd_subnet'] = vsd_subnet

                # policy groups are not supported on netconf
                # managed gateways
                create_policy = 'NETCONF' not in gw['gw_type']

                vport = self.vsdclient.create_gateway_vport_no_usergroup(
                    ctx.tenant_id, params, create_policy_group=create_policy)
                LOG.debug("created vport: %(vport_dict)s",
                          {'vport_dict': vport})
                bridge_port_id = vport.get('vport').get('ID')
            else:
                LOG.debug("bridge port %(bp)s for vlan %(vlan)s already exist",
                          {
                              'bp': vports[0]['nuage_vport_id'],
                              'vlan': segmentation_id
                          })
                bridge_port_id = vports[0]['nuage_vport_id']
            binding = {
                'neutron_port_id': port.get('id'),
                'nuage_vport_id': bridge_port_id,
                'switchport_uuid': gwport['port_id'],
                'segmentation_id': segmentation_id,
                'switchport_mapping_id': gwport['id']
            }
            ext_db.add_switchport_binding(ctx, binding)