Exemplo n.º 1
0
    def create_nuage_redirect_target(self, context, nuage_redirect_target):
        redirect_target = nuage_redirect_target['nuage_redirect_target']
        has_subnet_id = is_attr_set(redirect_target.get('subnet_id'))
        has_router_id = is_attr_set(redirect_target.get('router_id'))

        if not has_subnet_id and not has_router_id:
            msg = _('subnet_id or router_id should be specified')
            raise n_exc.BadRequest(resource='subnets', msg=msg)

        subnet_mapping = nuagedb.get_subnet_l2dom_by_id(
            context.session, redirect_target.get('subnet_id')) or {}
        router_mapping = nuagedb.get_ent_rtr_mapping_by_rtrid(
            context.session, redirect_target.get('router_id')) or {}
        if not subnet_mapping and not router_mapping:
            raise ext_rtarget.RedirectTargetNoDomainOrL2Domain()
        if has_subnet_id:
            subnet = self.core_plugin.get_subnet(context,
                                                 redirect_target['subnet_id'])
            if subnet:
                redirect_target['external_id'] = \
                    cms_id_helper.get_vsd_external_id(subnet['network_id'])
        try:
            nuage_redirect_target = self.vsdclient\
                .create_nuage_redirect_target(
                    redirect_target,
                    l2dom_id=subnet_mapping.get('nuage_subnet_id'),
                    domain_id=router_mapping.get('nuage_router_id'))
        except Exception as e:
            if getattr(e, "vsd_code", None) == '7016':
                msg = _("A Nuage redirect target with name '%s' already "
                        "exists") % redirect_target['name']
                raise nuage_exc.NuageBadRequest(msg=msg)
            raise
        return self._make_redirect_target_dict(nuage_redirect_target,
                                               context=context)
    def create_nuage_redirect_target(self, context, nuage_redirect_target):
        redirect_target = nuage_redirect_target['nuage_redirect_target']
        has_subnet_id = is_attr_set(redirect_target.get('subnet_id'))
        has_router_id = is_attr_set(redirect_target.get('router_id'))

        if not has_subnet_id and not has_router_id:
            msg = _('subnet_id or router_id should be specified')
            raise n_exc.BadRequest(resource='subnets', msg=msg)

        subnet_mapping = nuagedb.get_subnet_l2dom_by_id(
            context.session, redirect_target.get('subnet_id')) or {}
        router_mapping = nuagedb.get_ent_rtr_mapping_by_rtrid(
            context.session, redirect_target.get('router_id')) or {}
        if not subnet_mapping and not router_mapping:
            raise ext_rtarget.RedirectTargetNoDomainOrL2Domain()

        try:
            nuage_redirect_target = self.nuageclient\
                .create_nuage_redirect_target(
                    redirect_target,
                    subnet_id=subnet_mapping.get('nuage_subnet_id'),
                    domain_id=router_mapping.get('nuage_router_id'))
        except Exception as e:
            if getattr(e, "vsd_code", None) == '7016':
                msg = _("A Nuage redirect target with name '%s' already "
                        "exists") % redirect_target['name']
                raise nuage_exc.NuageBadRequest(msg=msg)
            raise e
        return self._make_redirect_target_dict(nuage_redirect_target,
                                               context=context)
Exemplo n.º 3
0
    def _create_vips(self, context, subnet_mapping, port, nuage_vport):
        nuage_vip_dict = dict()
        enable_spoofing = False
        vsd_subnet = self.vsdclient.get_nuage_subnet_by_id(subnet_mapping,
                                                           required=True)
        fips_per_vip = nuagedb.get_floatingip_per_vip_in_network(
            context.session, port['network_id'])
        fips_per_vip = {
            vip: self._make_fip_dict_with_subnet_id(fip)
            for vip, fip in six.iteritems(fips_per_vip)
        }

        for allowed_addr_pair in port[addr_pair.ADDRESS_PAIRS]:
            vip = allowed_addr_pair['ip_address']
            mac = allowed_addr_pair['mac_address']

            os_fip = fips_per_vip.get(vip)
            if os_fip:
                vsd_l3domain_id = nuagedb.get_ent_rtr_mapping_by_rtrid(
                    context.session, os_fip['router_id'])['nuage_router_id']
            else:
                vsd_l3domain_id = None

            params = {
                'vip': vip,
                'mac': mac,
                'subnet_id': subnet_mapping['nuage_subnet_id'],
                'vsd_subnet': vsd_subnet,
                'vport_id': nuage_vport['ID'],
                'port_ips': [ip['ip_address'] for ip in port['fixed_ips']],
                'port_mac': port['mac_address'],
                'externalID': port['id'],
                'os_fip': os_fip,
                'vsd_l3domain_id': vsd_l3domain_id
            }

            try:
                enable_spoofing |= self.vsdclient.create_vip(params)
                nuage_vip_dict[params['vip']] = params['mac']

            except Exception as e:
                with excutils.save_and_reraise_exception():
                    LOG.error(
                        "Error in creating vip for ip %(vip)s and mac "
                        "%(mac)s: %(err)s", {
                            'vip': vip,
                            'mac': mac,
                            'err': e.message
                        })
                    self.vsdclient.delete_vips(nuage_vport['ID'],
                                               nuage_vip_dict,
                                               nuage_vip_dict.keys())
        self.vsdclient.update_mac_spoofing_on_vport(
            nuage_vport['ID'],
            constants.ENABLED if enable_spoofing else constants.INHERITED)
Exemplo n.º 4
0
    def get_nuage_redirect_targets(self, context, filters=None, fields=None):
        rtargets = []

        if filters.get('subnet'):
            params = {}

            subnet_mapping = nuagedb.get_subnet_l2dom_by_id(
                context.session, filters['subnet'][0])
            if not subnet_mapping:
                return []
            if self._is_vsd_mgd(subnet_mapping) or self._is_l3(subnet_mapping):
                domain_id = self.vsdclient.get_router_by_domain_subnet_id(
                    subnet_mapping['nuage_subnet_id'])
                if domain_id:
                    params['parentID'] = domain_id
                elif self._is_vsd_mgd(subnet_mapping):
                    params['parentID'] = subnet_mapping['nuage_subnet_id']
                else:
                    return []
            else:
                params['parentID'] = subnet_mapping['nuage_subnet_id']

            rtargets = self.vsdclient.get_nuage_redirect_targets(params)

        elif filters.get('router'):
            router_mapping = nuagedb.get_ent_rtr_mapping_by_rtrid(
                context.session, filters['router'][0])
            if not router_mapping:
                msg = (_("No router mapping found for router %s") %
                       filters['router'][0])
                raise nuage_exc.NuageBadRequest(msg=msg)

            rtargets = self.vsdclient.get_nuage_redirect_targets(
                {'parentID': router_mapping['nuage_router_id']})

        elif filters.get('id'):
            rtargets = self.vsdclient.get_nuage_redirect_targets(
                {'ID': filters.get('id')[0]})

        elif filters.get('name'):
            rtargets = self.vsdclient.get_nuage_redirect_targets(
                {'name': filters.get('name')[0]})

        elif filters.get('ports'):
            rtargets = (rtarget for port_id in filters['ports']
                        for rtarget in self.get_nuage_redirect_targets_by_port(
                            port_id, context))

        return [
            self._make_redirect_target_dict(rtarget, context, fields)
            for rtarget in rtargets
        ]
Exemplo n.º 5
0
    def get_nuage_redirect_targets(self, context, filters=None, fields=None):
        # get all redirect targets
        params = {}
        if filters.get('subnet'):
            subnet_mapping = nuagedb.get_subnet_l2dom_by_id(
                context.session, filters['subnet'][0])
            if not subnet_mapping:
                return []
            if (subnet_mapping['nuage_managed_subnet']
                    or not subnet_mapping['nuage_l2dom_tmplt_id']):
                domain_id = self.nuageclient.get_router_by_domain_subnet_id(
                    subnet_mapping['nuage_subnet_id'])
                if domain_id:
                    params['parentID'] = domain_id
                elif subnet_mapping['nuage_managed_subnet']:
                    params['parentID'] = subnet_mapping['nuage_subnet_id']
                else:
                    return []
            else:
                params['parentID'] = subnet_mapping['nuage_subnet_id']
        elif filters.get('router'):
            router_mapping = nuagedb.get_ent_rtr_mapping_by_rtrid(
                context.session, filters['router'][0])
            if not router_mapping:
                msg = (_("No router mapping found for router %s") %
                       filters['router'][0])
                raise nuage_exc.NuageBadRequest(msg=msg)
            params['parentID'] = router_mapping['nuage_router_id']
        elif filters.get('id'):
            params['ID'] = filters.get('id')[0]
        elif filters.get('name'):
            params['name'] = filters.get('name')[0]

        rtargets = self.nuageclient.get_nuage_redirect_targets(params)
        return [
            self._make_redirect_target_dict(rtarget, context, fields)
            for rtarget in rtargets
        ]
    def get_nuage_redirect_targets(self, context, filters=None, fields=None):
        # get all redirect targets
        params = {}
        if filters.get('subnet'):
            subnet_mapping = nuagedb.get_subnet_l2dom_by_id(
                context.session, filters['subnet'][0])
            if not subnet_mapping:
                return []
            if (subnet_mapping['nuage_managed_subnet'] or
                    not subnet_mapping['nuage_l2dom_tmplt_id']):
                domain_id = self.nuageclient.get_router_by_domain_subnet_id(
                    subnet_mapping['nuage_subnet_id'])
                if domain_id:
                    params['parentID'] = domain_id
                elif subnet_mapping['nuage_managed_subnet']:
                    params['parentID'] = subnet_mapping['nuage_subnet_id']
                else:
                    return []
            else:
                params['parentID'] = subnet_mapping['nuage_subnet_id']
        elif filters.get('router'):
            router_mapping = nuagedb.get_ent_rtr_mapping_by_rtrid(
                context.session, filters['router'][0])
            if not router_mapping:
                msg = (_("No router mapping found for router %s")
                       % filters['router'][0])
                raise nuage_exc.NuageBadRequest(msg=msg)
            params['parentID'] = router_mapping['nuage_router_id']
        elif filters.get('id'):
            params['ID'] = filters.get('id')[0]
        elif filters.get('name'):
            params['name'] = filters.get('name')[0]

        rtargets = self.nuageclient.get_nuage_redirect_targets(params)
        return [self._make_redirect_target_dict(rtarget, context, fields)
                for rtarget in rtargets]
    def _create_vips(self, context, subnet_mapping, port, nuage_vport):
        port_vip_dict = nuage_vip_dict = dict()
        enable_spoofing = False
        vsd_subnet = self._find_vsd_subnet(context, subnet_mapping)
        fips_per_vip = nuagedb.get_floatingip_per_vip_in_network(
            context.session, port['network_id'], self.get_device_owners_vip())
        fips_per_vip = {
            vip: self._make_fip_dict_with_subnet_id(fip)
            for vip, fip in six.iteritems(fips_per_vip)
        }

        if (port.get(constants.VIPS_FOR_PORT_IPS)
                and self._is_l3(subnet_mapping)):
            for vip_ip in port.get(constants.VIPS_FOR_PORT_IPS):
                params = {
                    'vip': vip_ip,
                    'mac': port['mac_address'],
                    'subnet_id': subnet_mapping['nuage_subnet_id'],
                    'vsd_subnet': vsd_subnet,
                    'vport_id': nuage_vport['ID'],
                    'port_ips': [],
                    'port_mac': '',
                    'externalID': port['id'],
                    'os_fip': None,
                    'vsd_l3domain_id': None
                }
                try:
                    enable_spoofing |= self.vsdclient.create_vip(params)
                    port_vip_dict[params['vip']] = params['mac']
                except Exception as e:
                    if not self._get_port_from_neutron(context, port):
                        return
                    with excutils.save_and_reraise_exception():
                        LOG.error(
                            "Error in creating vip for ip %(vip)s and mac "
                            "%(mac)s: %(err)s", {
                                'vip': vip_ip,
                                'mac': port['mac_address'],
                                'err': str(e)
                            })
                        self.vsdclient.delete_vips(nuage_vport['ID'],
                                                   port_vip_dict,
                                                   port_vip_dict)

        for allowed_addr_pair in port[addr_pair.ADDRESS_PAIRS]:
            vip = allowed_addr_pair['ip_address']
            mac = allowed_addr_pair['mac_address']

            os_fip = fips_per_vip.get(vip)
            if os_fip:
                vsd_l3domain_id = nuagedb.get_ent_rtr_mapping_by_rtrid(
                    context.session, os_fip['router_id'])['nuage_router_id']
                subnet_mapping = nuagedb.get_subnet_l2dom_by_id(
                    context.session, os_fip['fip_subnet_id'])
                os_fip['vsd_fip_subnet_id'] = subnet_mapping['nuage_subnet_id']
            else:
                vsd_l3domain_id = None

            params = {
                'vip': vip,
                'mac': mac,
                'subnet_id': subnet_mapping['nuage_subnet_id'],
                'vsd_subnet': vsd_subnet,
                'vport_id': nuage_vport['ID'],
                'port_ips': [ip['ip_address'] for ip in port['fixed_ips']],
                'port_mac': port['mac_address'],
                'externalID': port['id'],
                'os_fip': os_fip,
                'vsd_l3domain_id': vsd_l3domain_id
            }

            try:
                enable_spoofing |= self.vsdclient.create_vip(params)
                nuage_vip_dict[params['vip']] = params['mac']
            except Exception as e:
                if not self._get_port_from_neutron(context, port):
                    return
                with excutils.save_and_reraise_exception():
                    LOG.error(
                        "Error in creating vip for ip %(vip)s and mac "
                        "%(mac)s: %(err)s", {
                            'vip': vip,
                            'mac': mac,
                            'err': str(e)
                        })
                    self.vsdclient.delete_vips(nuage_vport['ID'],
                                               nuage_vip_dict, nuage_vip_dict)
        if port[portsecurity.PORTSECURITY]:
            try:
                self.vsdclient.update_mac_spoofing_on_vport(
                    nuage_vport['ID'], constants.ENABLED
                    if enable_spoofing else constants.DISABLED)
            except Exception:
                if not self._get_port_from_neutron(context, port):
                    return
                raise