Example #1
0
    def add_router_interface(self, context, router_id, interface_info):
        session = context.session
        with session.begin(subtransactions=True):
            rtr_if_info = super(NuagePlugin, self).add_router_interface(context, router_id, interface_info)
            subnet_id = rtr_if_info["subnet_id"]
            subn = self.get_subnet(context, subnet_id)

            rtr_zone_mapping = nuagedb.get_rtr_zone_mapping(session, router_id)
            ent_rtr_mapping = nuagedb.get_ent_rtr_mapping_by_rtrid(session, router_id)
            subnet_l2dom = nuagedb.get_subnet_l2dom_by_id(session, subnet_id)
            if not rtr_zone_mapping or not ent_rtr_mapping:
                super(NuagePlugin, self).remove_router_interface(context, router_id, interface_info)
                msg = (
                    _("Router %s does not hold default zone OR " "net_partition mapping. Router-IF add failed")
                    % router_id
                )
                raise q_exc.BadRequest(resource="router", msg=msg)

            if not subnet_l2dom:
                super(NuagePlugin, self).remove_router_interface(context, router_id, interface_info)
                msg = _("Subnet %s does not hold Nuage VSD reference. " "Router-IF add failed") % subnet_id
                raise q_exc.BadRequest(resource="subnet", msg=msg)

            if subnet_l2dom["net_partition_id"] != ent_rtr_mapping["net_partition_id"]:
                super(NuagePlugin, self).remove_router_interface(context, router_id, interface_info)
                msg = _(
                    "Subnet %(subnet)s and Router %(router)s belong to "
                    "different net_partition Router-IF add "
                    "not permitted"
                ) % {"subnet": subnet_id, "router": router_id}
                raise q_exc.BadRequest(resource="subnet", msg=msg)
            nuage_subnet_id = subnet_l2dom["nuage_subnet_id"]
            nuage_l2dom_tmplt_id = subnet_l2dom["nuage_l2dom_tmplt_id"]
            if self.nuageclient.vms_on_l2domain(nuage_subnet_id):
                super(NuagePlugin, self).remove_router_interface(context, router_id, interface_info)
                msg = _("Subnet %s has one or more active VMs " "Router-IF add not permitted") % subnet_id
                raise q_exc.BadRequest(resource="subnet", msg=msg)
            self.nuageclient.delete_subnet(nuage_subnet_id, nuage_l2dom_tmplt_id)
            net = netaddr.IPNetwork(subn["cidr"])
            params = {"net": net, "zone_id": rtr_zone_mapping["nuage_zone_id"]}
            if not attributes.is_attr_set(subn["gateway_ip"]):
                subn["gateway_ip"] = str(netaddr.IPAddress(net.first + 1))
            try:
                nuage_subnet = self.nuageclient.create_domain_subnet(subn, params)
            except Exception:
                with excutils.save_and_reraise_exception():
                    super(NuagePlugin, self).remove_router_interface(context, router_id, interface_info)
            if nuage_subnet:
                ns_dict = {}
                ns_dict["nuage_subnet_id"] = nuage_subnet["nuage_subnetid"]
                ns_dict["nuage_l2dom_tmplt_id"] = None
                nuagedb.update_subnetl2dom_mapping(subnet_l2dom, ns_dict)
        return rtr_if_info
Example #2
0
    def remove_router_interface(self, context, router_id, interface_info):
        if 'subnet_id' in interface_info:
            subnet_id = interface_info['subnet_id']
            subnet = self.get_subnet(context, subnet_id)
            found = False
            try:
                filters = {
                    'device_id': [router_id],
                    'device_owner': [os_constants.DEVICE_OWNER_ROUTER_INTF],
                    'network_id': [subnet['network_id']]
                }
                ports = self.get_ports(context, filters)

                for p in ports:
                    if p['fixed_ips'][0]['subnet_id'] == subnet_id:
                        found = True
                        break
            except exc.NoResultFound:
                msg = (_("No router interface found for Router %s. "
                         "Router-IF delete failed") % router_id)
                raise q_exc.BadRequest(resource='router', msg=msg)

            if not found:
                msg = (_("No router interface found for Router %s. "
                         "Router-IF delete failed") % router_id)
                raise q_exc.BadRequest(resource='router', msg=msg)
        elif 'port_id' in interface_info:
            port_db = self._get_port(context, interface_info['port_id'])
            if not port_db:
                msg = (_("No router interface found for Router %s. "
                         "Router-IF delete failed") % router_id)
                raise q_exc.BadRequest(resource='router', msg=msg)
            subnet_id = port_db['fixed_ips'][0]['subnet_id']

        session = context.session
        with session.begin(subtransactions=True):
            subnet_l2dom = nuagedb.get_subnet_l2dom_by_id(session, subnet_id)
            nuage_subn_id = subnet_l2dom['nuage_subnet_id']
            if self.nuageclient.vms_on_l2domain(nuage_subn_id):
                msg = (_("Subnet %s has one or more active VMs "
                         "Router-IF delete not permitted") % subnet_id)
                raise q_exc.BadRequest(resource='subnet', msg=msg)

            neutron_subnet = self.get_subnet(context, subnet_id)
            ent_rtr_mapping = nuagedb.get_ent_rtr_mapping_by_rtrid(
                context.session, router_id)
            if not ent_rtr_mapping:
                msg = (_("Router %s does not hold net_partition "
                         "assoc on Nuage VSD. Router-IF delete failed") %
                       router_id)
                raise q_exc.BadRequest(resource='router', msg=msg)
            net = netaddr.IPNetwork(neutron_subnet['cidr'])
            net_part_id = ent_rtr_mapping['net_partition_id']
            net_partition = self.get_net_partition(context, net_part_id)
            params = {
                'net_partition': net_partition,
                'tenant_id': neutron_subnet['tenant_id'],
                'net': net
            }
            nuage_subnet = self.nuageclient.create_subnet(
                neutron_subnet, params)
            self.nuageclient.delete_domain_subnet(nuage_subn_id)
            info = super(NuagePlugin,
                         self).remove_router_interface(context, router_id,
                                                       interface_info)
            if nuage_subnet:
                tmplt_id = str(nuage_subnet['nuage_l2template_id'])
                ns_dict = {}
                ns_dict['nuage_subnet_id'] = nuage_subnet['nuage_l2domain_id']
                ns_dict['nuage_l2dom_tmplt_id'] = tmplt_id
                nuagedb.update_subnetl2dom_mapping(subnet_l2dom, ns_dict)
        return info
Example #3
0
    def add_router_interface(self, context, router_id, interface_info):
        session = context.session
        with session.begin(subtransactions=True):
            rtr_if_info = super(NuagePlugin, self).add_router_interface(
                context, router_id, interface_info)
            subnet_id = rtr_if_info['subnet_id']
            subn = self.get_subnet(context, subnet_id)

            rtr_zone_mapping = nuagedb.get_rtr_zone_mapping(session, router_id)
            ent_rtr_mapping = nuagedb.get_ent_rtr_mapping_by_rtrid(
                session, router_id)
            subnet_l2dom = nuagedb.get_subnet_l2dom_by_id(session, subnet_id)
            if not rtr_zone_mapping or not ent_rtr_mapping:
                super(NuagePlugin,
                      self).remove_router_interface(context, router_id,
                                                    interface_info)
                msg = (_("Router %s does not hold default zone OR "
                         "net_partition mapping. Router-IF add failed") %
                       router_id)
                raise q_exc.BadRequest(resource='router', msg=msg)

            if not subnet_l2dom:
                super(NuagePlugin,
                      self).remove_router_interface(context, router_id,
                                                    interface_info)
                msg = (_("Subnet %s does not hold Nuage VSD reference. "
                         "Router-IF add failed") % subnet_id)
                raise q_exc.BadRequest(resource='subnet', msg=msg)

            if (subnet_l2dom['net_partition_id'] !=
                    ent_rtr_mapping['net_partition_id']):
                super(NuagePlugin,
                      self).remove_router_interface(context, router_id,
                                                    interface_info)
                msg = (_("Subnet %(subnet)s and Router %(router)s belong to "
                         "different net_partition Router-IF add "
                         "not permitted") % {
                             'subnet': subnet_id,
                             'router': router_id
                         })
                raise q_exc.BadRequest(resource='subnet', msg=msg)
            nuage_subnet_id = subnet_l2dom['nuage_subnet_id']
            nuage_l2dom_tmplt_id = subnet_l2dom['nuage_l2dom_tmplt_id']
            if self.nuageclient.vms_on_l2domain(nuage_subnet_id):
                super(NuagePlugin,
                      self).remove_router_interface(context, router_id,
                                                    interface_info)
                msg = (_("Subnet %s has one or more active VMs "
                         "Router-IF add not permitted") % subnet_id)
                raise q_exc.BadRequest(resource='subnet', msg=msg)
            self.nuageclient.delete_subnet(nuage_subnet_id,
                                           nuage_l2dom_tmplt_id)
            net = netaddr.IPNetwork(subn['cidr'])
            params = {'net': net, 'zone_id': rtr_zone_mapping['nuage_zone_id']}
            if not attributes.is_attr_set(subn['gateway_ip']):
                subn['gateway_ip'] = str(netaddr.IPAddress(net.first + 1))
            try:
                nuage_subnet = self.nuageclient.create_domain_subnet(
                    subn, params)
            except Exception:
                with excutils.save_and_reraise_exception():
                    super(NuagePlugin, self).remove_router_interface(
                        context, router_id, interface_info)
            if nuage_subnet:
                ns_dict = {}
                ns_dict['nuage_subnet_id'] = nuage_subnet['nuage_subnetid']
                ns_dict['nuage_l2dom_tmplt_id'] = None
                nuagedb.update_subnetl2dom_mapping(subnet_l2dom, ns_dict)
        return rtr_if_info
Example #4
0
    def remove_router_interface(self, context, router_id, interface_info):
        if 'subnet_id' in interface_info:
            subnet_id = interface_info['subnet_id']
            subnet = self.get_subnet(context, subnet_id)
            found = False
            try:
                filters = {'device_id': [router_id],
                           'device_owner':
                           [os_constants.DEVICE_OWNER_ROUTER_INTF],
                           'network_id': [subnet['network_id']]}
                ports = self.get_ports(context, filters)

                for p in ports:
                    if p['fixed_ips'][0]['subnet_id'] == subnet_id:
                        found = True
                        break
            except exc.NoResultFound:
                msg = (_("No router interface found for Router %s. "
                         "Router-IF delete failed") % router_id)
                raise n_exc.BadRequest(resource='router', msg=msg)

            if not found:
                msg = (_("No router interface found for Router %s. "
                         "Router-IF delete failed") % router_id)
                raise n_exc.BadRequest(resource='router', msg=msg)
        elif 'port_id' in interface_info:
            port_db = self._get_port(context, interface_info['port_id'])
            if not port_db:
                msg = (_("No router interface found for Router %s. "
                         "Router-IF delete failed") % router_id)
                raise n_exc.BadRequest(resource='router', msg=msg)
            subnet_id = port_db['fixed_ips'][0]['subnet_id']

        session = context.session
        with session.begin(subtransactions=True):
            subnet_l2dom = nuagedb.get_subnet_l2dom_by_id(session,
                                                          subnet_id)
            if not subnet_l2dom:
                return super(NuagePlugin,
                             self).remove_router_interface(context,
                                                           router_id,
                                                           interface_info)
            nuage_subn_id = subnet_l2dom['nuage_subnet_id']
            if self.nuageclient.vms_on_l2domain(nuage_subn_id):
                msg = (_("Subnet %s has one or more active VMs "
                         "Router-IF delete not permitted") % subnet_id)
                raise n_exc.BadRequest(resource='subnet', msg=msg)

            neutron_subnet = self.get_subnet(context, subnet_id)
            ent_rtr_mapping = nuagedb.get_ent_rtr_mapping_by_rtrid(
                context.session,
                router_id)
            if not ent_rtr_mapping:
                msg = (_("Router %s does not hold net_partition "
                         "assoc on Nuage VSD. Router-IF delete failed")
                       % router_id)
                raise n_exc.BadRequest(resource='router', msg=msg)
            net = netaddr.IPNetwork(neutron_subnet['cidr'])
            net_part_id = ent_rtr_mapping['net_partition_id']
            net_partition = self.get_net_partition(context,
                                                   net_part_id)
            params = {
                'net_partition': net_partition,
                'tenant_id': neutron_subnet['tenant_id'],
                'net': net
            }
            nuage_subnet = self.nuageclient.create_subnet(neutron_subnet,
                                                          params)
            self.nuageclient.delete_domain_subnet(nuage_subn_id)
            info = super(NuagePlugin,
                         self).remove_router_interface(context, router_id,
                                                       interface_info)
            if nuage_subnet:
                tmplt_id = str(nuage_subnet['nuage_l2template_id'])
                ns_dict = {}
                ns_dict['nuage_subnet_id'] = nuage_subnet['nuage_l2domain_id']
                ns_dict['nuage_l2dom_tmplt_id'] = tmplt_id
                nuagedb.update_subnetl2dom_mapping(subnet_l2dom,
                                                   ns_dict)
        return info