示例#1
0
    def _validate_same_netpartition(self, context, trunk_port, trunk_subports):

        parent_netpart = db.get_subnet_l2dom_by_port_id(
            context.session, trunk_port['id']).get('net_partition_id')
        bad_subport = next(
            (port for port in trunk_subports
             if db.get_subnet_l2dom_by_port_id(context.session, port.id).get(
                 'net_partition_id') != parent_netpart), None)
        if bad_subport:
            raise nuage_exc.SubPortNetpartitionConflict(subport=bad_subport.id)
 def post_port_create(self, resource, event, plugin, **kwargs):
     port = kwargs.get('port')
     request_port = kwargs.get('request_port')
     vport = kwargs.get('vport')
     context = kwargs.get('context')
     try:
         nuagedb.get_subnet_l2dom_by_port_id(context.session, port['id'])
         self.create_allowed_address_pairs(context, port, request_port,
                                           vport)
     except SubnetMappingNotFound:
         pass
示例#3
0
 def post_port_create(self, resource, event, plugin, **kwargs):
     port = kwargs.get('port')
     request_port = kwargs.get('request_port')
     vport = kwargs.get('vport')
     context = kwargs.get('context')
     try:
         nuagedb.get_subnet_l2dom_by_port_id(context.session, port['id'])
         self.create_allowed_address_pairs(context, port, request_port,
                                           vport)
     except SubnetMappingNotFound:
         pass
示例#4
0
 def get_port_available_nuage_policy_groups(self, context, filters=None):
     port_id = filters.pop('for_port')[0]
     vsd_mapping = nuagedb.get_subnet_l2dom_by_port_id(
         context.session, port_id)
     vsd_filters = self.osfilters_to_vsdfilters(filters)
     return self._get_available_nuage_policy_groups(vsd_mapping,
                                                    vsd_filters)
示例#5
0
 def _unset_sub_ports(self, trunk_id, subports):
     _vsdclient = self.plugin_driver.vsdclient
     ctx = n_ctx.get_admin_context()
     updated_ports = []
     for port in subports:
         LOG.debug('unset port id : %(id)s', {'id': port.port_id})
         try:
             updated_port = self.core_plugin.update_port(
                 ctx, port.port_id, {
                     'port': {
                         portbindings.HOST_ID: None,
                         portbindings.PROFILE: None,
                         'device_owner': '',
                         'device_id': ''
                     }
                 })
             vif_type = updated_port.get(portbindings.VIF_TYPE)
             if vif_type != portbindings.VIF_TYPE_UNBOUND:
                 raise t_exc.SubPortBindingError(port_id=port.port_id,
                                                 trunk_id=trunk_id)
             updated_ports.append(updated_port)
             subnet_mapping = db.get_subnet_l2dom_by_port_id(
                 ctx.session, port.port_id)
             _vsdclient.remove_subport(updated_port, subnet_mapping)
         except t_exc.SubPortBindingError as e:
             LOG.error("Failed to clear binding for subport: %s", e)
             self.set_trunk_status(ctx, trunk_id, t_consts.DEGRADED_STATUS)
         except Exception as e:
             LOG.error("Failed to clear binding for subport: %s", e)
     if len(subports) != len(updated_ports):
         self.set_trunk_status(ctx, trunk_id, t_consts.DEGRADED_STATUS)
    def post_port_create_addresspair(self, resource, event, plugin, **kwargs):
        port = kwargs.get('port')
        vport = kwargs.get('vport')
        context = kwargs.get('context')
        configure_vips = (port.get(constants.VIPS_FOR_PORT_IPS)
                          or port.get("allowed_address_pairs"))
        if not self.is_port_supported(port) or not configure_vips:
            # If there are no allowed_address_pair in the request
            # port_security_enabled False and allowed address pairs are
            # mutually exclusive in Neutron
            return

        try:
            nuagedb.get_subnet_l2dom_by_port_id(context.session, port['id'])
            self.create_allowed_address_pairs(context, port, vport)
        except SubnetMappingNotFound:
            pass
 def _get_port_nuage_policy_groups(self, context, port_id, vsd_filters):
     vsd_mapping = nuagedb.get_subnet_l2dom_by_port_id(context.session, port_id)
     vport = self.nuageclient.get_nuage_vport_by_neutron_id(
         {
             "neutron_port_id": port_id,
             "l2dom_id": vsd_mapping["nuage_subnet_id"],
             "l3dom_id": vsd_mapping["nuage_subnet_id"],
         }
     )
     return self.nuageclient.get_nuage_vport_policy_groups(vport["ID"], externalID=None, **vsd_filters)
示例#8
0
 def _get_port_nuage_policy_groups(self, context, port_id,
                                   vsd_filters):
     vsd_mapping = nuagedb.get_subnet_l2dom_by_port_id(context.session,
                                                       port_id)
     vport = self.nuageclient.get_nuage_vport_by_id(
         {'neutron_port_id': port_id,
          'l2dom_id': vsd_mapping['nuage_subnet_id'],
          'l3dom_id': vsd_mapping['nuage_subnet_id']})
     return self.nuageclient.get_nuage_vport_policy_groups(
         vport['nuage_vport_id'], externalID=None, **vsd_filters)
    def _set_sub_ports(self, trunk_id, subports):
        _vsdclient = self.plugin_driver.vsdclient
        ctx = n_ctx.get_admin_context()
        for port in subports:
            LOG.debug('setting port id %(id)s  vlan %(vlan)s',
                      {'id': port.port_id, 'vlan': port.segmentation_id})
            os_port = self.core_plugin.get_port(ctx, port.port_id)
            subnet_mapping = db.get_subnet_l2dom_by_port_id(ctx.session,
                                                            port.port_id)
            fixed_ips = os_port['fixed_ips']
            subnets = {4: {}, 6: {}}
            ips = {4: None, 6: None}
            for fixed_ip in fixed_ips:
                subnet = self.core_plugin.get_subnet(ctx,
                                                     fixed_ip['subnet_id'])
                subnets[subnet['ip_version']] = subnet
                ips[subnet['ip_version']] = fixed_ip['ip_address']

            network_details = self.core_plugin.get_network(
                ctx,
                os_port['network_id'])
            if network_details['shared']:
                _vsdclient.create_usergroup(
                    os_port['tenant_id'],
                    subnet_mapping['net_partition_id'])

            np_name = db.get_net_partition_by_id(
                ctx.session,
                subnet_mapping['net_partition_id'])['name']

            data = {
                'id': os_port['id'],
                'mac': os_port['mac_address'],
                'ipv4': ips[4],
                'ipv6': ips[6],
                'net_partition_id': subnet_mapping['net_partition_id'],
                'net_partition_name': np_name,
                'nuage_subnet_id': subnet_mapping.get('nuage_subnet_id')
            }
            try:
                _vsdclient.add_subport(trunk_id, port, data)
            except Exception as ex:
                LOG.error("Failed to create subport: %s", ex)
                self.set_trunk_status(ctx, trunk_id,
                                      t_consts.TRUNK_DEGRADED_STATUS)
        updated_ports = self._update_subport_bindings(ctx,
                                                      trunk_id,
                                                      subports)
        if len(subports) != len(updated_ports[trunk_id]):
            LOG.error("Updated: %(up)s, subports: %(sub)s",
                      {'up': len(updated_ports[trunk_id]),
                       'sub': len(subports)})
            self.set_trunk_status(ctx, trunk_id,
                                  t_consts.TRUNK_DEGRADED_STATUS)
示例#10
0
 def _create_port_dhcp_opts(self, resource, event, trigger, **kwargs):
     request_port = kwargs.get('request_port')
     port = kwargs.get('port')
     vport = kwargs.get('vport')
     context = kwargs.get('context')
     if not request_port or \
             not lib_validators.is_attr_set(
                 request_port.get('extra_dhcp_opts')):
         return
     try:
         nuagedb.get_subnet_l2dom_by_port_id(context.session, port['id'])
     except SubnetMappingNotFound:
         msg = ("Cannot create a port with DHCP options on a subnet that "
                "does not have mapping to a L2Domain (OR) "
                "a L3 Subnet on Nuage.")
         raise nuage_exc.NuageBadRequest(msg=msg)
     dhcp_options = copy.deepcopy(request_port['extra_dhcp_opts'])
     for dhcp_opt in dhcp_options:
         self._translate_dhcp_option(dhcp_opt)
     self._create_update_extra_dhcp_options(dhcp_options, vport, port['id'])
示例#11
0
 def _unset_trunk(self, trunk):
     _vsdclient = self.plugin_driver.vsdclient
     ctx = n_ctx.get_admin_context()
     try:
         subnet_mapping = db.get_subnet_l2dom_by_port_id(
             ctx.session, trunk.port_id)
         _vsdclient.delete_trunk(trunk, subnet_mapping)
     except Exception as ex:
         LOG.error("Failed to delete trunk: %s", ex)
         trunk.update(status=t_consts.TRUNK_ERROR_STATUS)
         raise t_exc.TrunkInErrorState(trunk_id=trunk.id)
 def _create_port_dhcp_opts(self, resource, event, trigger, **kwargs):
     request_port = kwargs.get('request_port')
     port = kwargs.get('port')
     vport = kwargs.get('vport')
     context = kwargs.get('context')
     if not request_port or \
             not is_attr_set(request_port.get('extra_dhcp_opts')):
         return
     try:
         nuagedb.get_subnet_l2dom_by_port_id(context.session,
                                             port['id'])
     except SubnetMappingNotFound:
         msg = ("Cannot create a port with DHCP options on a subnet that "
                "does not have mapping to a L2Domain (OR) "
                "a L3 Subnet on Nuage.")
         raise nuage_exc.NuageBadRequest(msg=msg)
     dhcp_options = copy.deepcopy(request_port['extra_dhcp_opts'])
     for dhcp_opt in dhcp_options:
         self._translate_dhcp_option(dhcp_opt)
     self._create_update_extra_dhcp_options(
         dhcp_options, vport, port['id'])
示例#13
0
 def get_nuage_redirect_targets_by_port(self, port_id, context):
     port_params = {'neutron_port_id': port_id}
     vsd_mapping = nuagedb.get_subnet_l2dom_by_port_id(
         context.session, port_id)
     if vsd_mapping['nuage_l2dom_tmplt_id']:
         port_params['l2dom_id'] = vsd_mapping['nuage_subnet_id']
     else:
         port_params['l3dom_id'] = vsd_mapping['nuage_subnet_id']
     vport = self.vsdclient.get_nuage_vport_by_neutron_id(port_params,
                                                          required=True)
     return self.vsdclient.get_nuage_vport_redirect_targets(
         vport_id=vport['ID'], required=False) or []
示例#14
0
    def get_nuage_floatingip_assigned_to_port(self, context, filters=None):
        port_id = filters['ports'][0]
        vsd_mapping = nuagedb.get_subnet_l2dom_by_port_id(
            context.session, port_id)
        if vsd_mapping['nuage_l2dom_tmplt_id']:
            return []
        vports = self.vsdclient.get_vports(
            constants.L3SUBNET,
            vsd_mapping['nuage_subnet_id'],
            externalID=get_vsd_external_id(port_id))
        fip_id = vports[0]['associatedFloatingIPID'] if vports else None

        return (self.vsdclient.get_nuage_floatingips(required=True, ID=fip_id)
                if fip_id else [])
示例#15
0
    def _get_port_nuage_policy_groups(self, context, port_id, vsd_filters):
        port_params = {'neutron_port_id': port_id}

        vsd_mapping = nuagedb.get_subnet_l2dom_by_port_id(
            context.session, port_id)
        if vsd_mapping['nuage_l2dom_tmplt_id']:
            port_params['l2dom_id'] = vsd_mapping['nuage_subnet_id']
        else:
            port_params['l3dom_id'] = vsd_mapping['nuage_subnet_id']

        vport = self.vsdclient.get_nuage_vport_by_neutron_id(port_params)
        return self.vsdclient.get_nuage_vport_policy_groups(vport['ID'],
                                                            externalID=None,
                                                            **vsd_filters)
    def _get_port_nuage_policy_groups(self,
                                      port_id,
                                      vport=None,
                                      context=None,
                                      vsd_filters=None):
        if not vport:
            port_params = {'neutron_port_id': port_id}

            vsd_mapping = nuagedb.get_subnet_l2dom_by_port_id(
                context.session, port_id)
            if vsd_mapping['nuage_l2dom_tmplt_id']:
                port_params['l2dom_id'] = vsd_mapping['nuage_subnet_id']
            else:
                port_params['l3dom_id'] = vsd_mapping['nuage_subnet_id']

            vport = self.vsdclient.get_nuage_vport_by_neutron_id(port_params)
        vsd_filters = vsd_filters or {}
        return self.vsdclient.get_policygroups(parent_type=constants.VPORT,
                                               parent_id=vport['ID'],
                                               externalID=None,
                                               **vsd_filters)
 def get_port_available_nuage_floatingips(self, context, filters=None):
     port_id = filters.pop('for_port')[0]
     vsd_mapping = nuagedb.get_subnet_l2dom_by_port_id(context.session,
                                                       port_id)
     return self._get_available_nuage_floatingips(vsd_mapping, filters)
示例#18
0
    def _set_sub_ports(self, trunk_id, subports):
        _vsdclient = self.plugin_driver.vsdclient
        ctx = n_ctx.get_admin_context()
        for port in subports:
            LOG.debug('setting port id %(id)s  vlan %(vlan)s', {
                'id': port.port_id,
                'vlan': port.segmentation_id
            })
            os_port = self.core_plugin.get_port(ctx, port.port_id)
            subnet_mapping = db.get_subnet_l2dom_by_port_id(
                ctx.session, port.port_id)
            fixed_ips = os_port['fixed_ips']
            subnets = {4: {}, 6: {}}
            ips = {4: None, 6: None}
            for fixed_ip in fixed_ips:
                subnet = self.core_plugin.get_subnet(ctx,
                                                     fixed_ip['subnet_id'])
                subnets[subnet['ip_version']] = subnet
                ips[subnet['ip_version']] = fixed_ip['ip_address']

            network_details = self.core_plugin.get_network(
                ctx, os_port['network_id'])
            if network_details['shared']:
                _vsdclient.create_usergroup(os_port['tenant_id'],
                                            subnet_mapping['net_partition_id'])

            np_name = _vsdclient.get_net_partition_name_by_id(
                subnet_mapping['net_partition_id'])

            data = {
                'id': os_port['id'],
                'mac': os_port['mac_address'],
                'ipv4': ips[4],
                'ipv6': ips[6],
                'net_partition_id': subnet_mapping['net_partition_id'],
                'net_partition_name': np_name,
                'nuage_subnet_id': subnet_mapping.get('nuage_subnet_id')
            }
            nuage_subnet, _ = self.plugin_driver._get_nuage_subnet(
                subnet_mapping, subnet_mapping['nuage_subnet_id'])
            # TODO(gridinv): should we handle shared network resources
            if nuage_subnet['type'] == p_consts.L2DOMAIN:
                shared_resource_id = nuage_subnet.get(
                    'associatedSharedNetworkResourceID')
                if not subnets[4].get('enable_dhcp'):
                    data['ipv4'] = None
                    data['ipv6'] = None
                elif ((not nuage_subnet['DHCPManaged'])
                      and (not shared_resource_id)):
                    data['ipv4'] = None
                    data['ipv6'] = None
            try:
                _vsdclient.add_subport(trunk_id, port, data)
            except Exception as ex:
                LOG.error("Failed to create subport: %s", ex)
                self.set_trunk_status(ctx, trunk_id, t_consts.DEGRADED_STATUS)
        updated_ports = self._update_subport_bindings(ctx, trunk_id, subports)
        if len(subports) != len(updated_ports[trunk_id]):
            LOG.error("Updated: %(up)s, subports: %(sub)s", {
                'up': len(updated_ports[trunk_id]),
                'sub': len(subports)
            })
            self.set_trunk_status(ctx, trunk_id, t_consts.DEGRADED_STATUS)
示例#19
0
 def get_port_available_nuage_floatingips(self, context, filters=None):
     port_id = filters.pop('for_port')[0]
     vsd_mapping = nuagedb.get_subnet_l2dom_by_port_id(
         context.session, port_id)
     return self._get_available_nuage_floatingips(vsd_mapping, filters)
 def get_port_available_nuage_policy_groups(self, context, filters=None):
     port_id = filters.pop("for_port")[0]
     vsd_mapping = nuagedb.get_subnet_l2dom_by_port_id(context.session, port_id)
     vsd_filters = self.osfilters_to_vsdfilters(filters)
     return self._get_available_nuage_policy_groups(vsd_mapping, vsd_filters)