예제 #1
0
    def delete_router(self, context, id):
        neutron_router = self.get_router(context, id)
        session = context.session
        ent_rtr_mapping = nuagedb.get_ent_rtr_mapping_by_rtrid(session,
                                                               id)
        if ent_rtr_mapping:
            filters = {
                'device_id': [id],
                'device_owner': [os_constants.DEVICE_OWNER_ROUTER_INTF]
            }
            ports = self.get_ports(context, filters)
            if ports:
                raise l3.RouterInUse(router_id=id)
            nuage_domain_id = ent_rtr_mapping['nuage_router_id']
            self.nuageclient.delete_router(nuage_domain_id)

        super(NuagePlugin, self).delete_router(context, id)

        nuage_zone = self.nuageclient.get_zone_by_routerid(id)
        if nuage_zone and not self._check_router_subnet_for_tenant(
                context, neutron_router['tenant_id']):
            user_id, group_id = self.nuageclient.get_usergroup(
                neutron_router['tenant_id'],
                ent_rtr_mapping['net_partition_id'])
            self.nuageclient.delete_user(user_id)
            self.nuageclient.delete_group(group_id)
예제 #2
0
 def delete_floatingip(self, context, id):
     fip = self._get_floatingip(context, id)
     port_id = fip['fixed_port_id']
     with context.session.begin(subtransactions=True):
         if port_id:
             params = {
                 'neutron_port_id': id,
             }
             nuage_port = self.nuageclient.get_nuage_port_by_id(params)
             if (nuage_port and
                 nuage_port['nuage_vport_id'] is not None):
                 params = {
                     'nuage_vport_id': nuage_port['nuage_vport_id'],
                     'nuage_fip_id': None
                 }
                 self.nuageclient.update_nuage_vm_vport(params)
         rtr_id = fip['last_known_router_id']
         if rtr_id:
             ent_rtr_mapping = nuagedb.get_ent_rtr_mapping_by_rtrid(
                 context.session,
                 rtr_id)
             if not ent_rtr_mapping:
                 msg = _('router %s is not associated with '
                         'any net-partition') % rtr_id
                 raise n_exc.BadRequest(resource='floatingip',
                                    msg=msg)
             params = {
                 'router_id': ent_rtr_mapping['nuage_router_id'],
                 'fip_id': id
             }
             fip = self.nuageclient.get_nuage_fip_by_id(params)
             if fip:
                 self.nuageclient.delete_nuage_floatingip(
                     fip['nuage_fip_id'])
         super(NuagePlugin, self).delete_floatingip(context, id)
예제 #3
0
 def delete_floatingip(self, context, id):
     fip = self._get_floatingip(context, id)
     port_id = fip['fixed_port_id']
     with context.session.begin(subtransactions=True):
         if port_id:
             params = {
                 'neutron_port_id': id,
             }
             nuage_port = self.nuageclient.get_nuage_port_by_id(params)
             if (nuage_port and nuage_port['nuage_vport_id'] is not None):
                 params = {
                     'nuage_vport_id': nuage_port['nuage_vport_id'],
                     'nuage_fip_id': None
                 }
                 self.nuageclient.update_nuage_vm_vport(params)
         rtr_id = fip['last_known_router_id']
         if rtr_id:
             ent_rtr_mapping = nuagedb.get_ent_rtr_mapping_by_rtrid(
                 context.session, rtr_id)
             if not ent_rtr_mapping:
                 msg = _('router %s is not associated with '
                         'any net-partition') % rtr_id
                 raise n_exc.BadRequest(resource='floatingip', msg=msg)
             params = {
                 'router_id': ent_rtr_mapping['nuage_router_id'],
                 'fip_id': id
             }
             fip = self.nuageclient.get_nuage_fip_by_id(params)
             if fip:
                 self.nuageclient.delete_nuage_floatingip(
                     fip['nuage_fip_id'])
         super(NuagePlugin, self).delete_floatingip(context, id)
예제 #4
0
    def delete_router(self, context, id):
        neutron_router = self.get_router(context, id)
        session = context.session
        ent_rtr_mapping = nuagedb.get_ent_rtr_mapping_by_rtrid(session, id)
        if ent_rtr_mapping:
            filters = {
                'device_id': [id],
                'device_owner': [os_constants.DEVICE_OWNER_ROUTER_INTF]
            }
            ports = self.get_ports(context, filters)
            if ports:
                raise l3.RouterInUse(router_id=id)
            nuage_domain_id = ent_rtr_mapping['nuage_router_id']
            self.nuageclient.delete_router(nuage_domain_id)

        super(NuagePlugin, self).delete_router(context, id)

        nuage_zone = self.nuageclient.get_zone_by_routerid(id)
        if nuage_zone and not self._check_router_subnet_for_tenant(
                context, neutron_router['tenant_id']):
            user_id, group_id = self.nuageclient.get_usergroup(
                neutron_router['tenant_id'],
                ent_rtr_mapping['net_partition_id'])
            self.nuageclient.delete_user(user_id)
            self.nuageclient.delete_group(group_id)
예제 #5
0
    def _create_update_floatingip(self, context,
                                  neutron_fip, port_id):
        rtr_id = neutron_fip['router_id']
        net_id = neutron_fip['floating_network_id']

        fip_pool = self.nuageclient.get_nuage_fip_pool_by_id(net_id)
        if not fip_pool:
            msg = _('sharedresource %s not found on VSD') % net_id
            raise n_exc.BadRequest(resource='floatingip',
                                   msg=msg)

        ent_rtr_mapping = nuagedb.get_ent_rtr_mapping_by_rtrid(context.session,
                                                               rtr_id)
        if not ent_rtr_mapping:
            msg = _('router %s is not associated with '
                    'any net-partition') % rtr_id
            raise n_exc.BadRequest(resource='floatingip',
                                   msg=msg)

        params = {
            'router_id': ent_rtr_mapping['nuage_router_id'],
            'fip_id': neutron_fip['id'],
            'neutron_fip': neutron_fip
        }

        fip = self.nuageclient.get_nuage_fip_by_id(params)
        if not fip:
            params = {
                'nuage_rtr_id': ent_rtr_mapping['nuage_router_id'],
                'nuage_fippool_id': fip_pool['nuage_fip_pool_id'],
                'neutron_fip_ip': neutron_fip['floating_ip_address'],
                'neutron_fip_id': neutron_fip['id']
            }
            nuage_fip_id = self.nuageclient.create_nuage_floatingip(params)
        else:
            nuage_fip_id = fip['nuage_fip_id']

        # Update VM if required
        params = {
            'neutron_port_id': port_id,
            'nuage_fip_id': nuage_fip_id,
            'nuage_rtr_id': ent_rtr_mapping['nuage_router_id']
        }
        nuage_port = self.nuageclient.get_nuage_port_by_id(params)
        if nuage_port:
            if (nuage_port['nuage_domain_id']) != (
                    ent_rtr_mapping['nuage_router_id']):
                msg = _('Floating IP can not be associated to VM in '
                        'different router context')
                raise nuage_exc.OperationNotSupported(msg=msg)

            params = {
                'nuage_vport_id': nuage_port['nuage_vport_id'],
                'nuage_fip_id': nuage_fip_id
            }
            self.nuageclient.update_nuage_vm_vport(params)
예제 #6
0
파일: plugin.py 프로젝트: mshabdiz/neutron
 def delete_router(self, context, id):
     session = context.session
     ent_rtr_mapping = nuagedb.get_ent_rtr_mapping_by_rtrid(session, id)
     if ent_rtr_mapping:
         nuage_router_id = ent_rtr_mapping['nuage_router_id']
         self.nuageclient.delete_router(nuage_router_id)
     router_zone = nuagedb.get_rtr_zone_mapping(session, id)
     super(NuagePlugin, self).delete_router(context, id)
     if router_zone and not self._check_router_subnet_for_tenant(context):
         self.nuageclient.delete_user(router_zone['nuage_user_id'])
         self.nuageclient.delete_group(router_zone['nuage_group_id'])
예제 #7
0
파일: plugin.py 프로젝트: kavonm/neutron
 def delete_router(self, context, id):
     session = context.session
     ent_rtr_mapping = nuagedb.get_ent_rtr_mapping_by_rtrid(session, id)
     if ent_rtr_mapping:
         nuage_router_id = ent_rtr_mapping["nuage_router_id"]
         self.nuageclient.delete_router(nuage_router_id)
     router_zone = nuagedb.get_rtr_zone_mapping(session, id)
     super(NuagePlugin, self).delete_router(context, id)
     if router_zone and not self._check_router_subnet_for_tenant(context):
         self.nuageclient.delete_user(router_zone["nuage_user_id"])
         self.nuageclient.delete_group(router_zone["nuage_group_id"])
예제 #8
0
    def _create_update_floatingip(self, context, neutron_fip, port_id):
        rtr_id = neutron_fip['router_id']
        net_id = neutron_fip['floating_network_id']

        fip_pool = self.nuageclient.get_nuage_fip_pool_by_id(net_id)
        if not fip_pool:
            msg = _('sharedresource %s not found on VSD') % net_id
            raise n_exc.BadRequest(resource='floatingip', msg=msg)

        ent_rtr_mapping = nuagedb.get_ent_rtr_mapping_by_rtrid(
            context.session, rtr_id)
        if not ent_rtr_mapping:
            msg = _('router %s is not associated with '
                    'any net-partition') % rtr_id
            raise n_exc.BadRequest(resource='floatingip', msg=msg)

        params = {
            'router_id': ent_rtr_mapping['nuage_router_id'],
            'fip_id': neutron_fip['id'],
            'neutron_fip': neutron_fip
        }

        fip = self.nuageclient.get_nuage_fip_by_id(params)
        if not fip:
            params = {
                'nuage_rtr_id': ent_rtr_mapping['nuage_router_id'],
                'nuage_fippool_id': fip_pool['nuage_fip_pool_id'],
                'neutron_fip_ip': neutron_fip['floating_ip_address'],
                'neutron_fip_id': neutron_fip['id']
            }
            nuage_fip_id = self.nuageclient.create_nuage_floatingip(params)
        else:
            nuage_fip_id = fip['nuage_fip_id']

        # Update VM if required
        params = {
            'neutron_port_id': port_id,
            'nuage_fip_id': nuage_fip_id,
            'nuage_rtr_id': ent_rtr_mapping['nuage_router_id']
        }
        nuage_port = self.nuageclient.get_nuage_port_by_id(params)
        if nuage_port:
            if (nuage_port['nuage_domain_id']) != (
                    ent_rtr_mapping['nuage_router_id']):
                msg = _('Floating IP can not be associated to VM in '
                        'different router context')
                raise nuage_exc.OperationNotSupported(msg=msg)

            params = {
                'nuage_vport_id': nuage_port['nuage_vport_id'],
                'nuage_fip_id': nuage_fip_id
            }
            self.nuageclient.update_nuage_vm_vport(params)
예제 #9
0
파일: plugin.py 프로젝트: kavonm/neutron
    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
예제 #10
0
파일: plugin.py 프로젝트: PFZheng/neutron
    def _create_update_floatingip(self, context,
                                  neutron_fip, port_id):
        rtr_id = neutron_fip['router_id']
        net_id = neutron_fip['floating_network_id']

        fip_pool_mapping = nuagedb.get_fip_pool_from_netid(context.session,
                                                           net_id)
        fip_mapping = nuagedb.get_fip_mapping_by_id(context.session,
                                                    neutron_fip['id'])

        if not fip_mapping:
            ent_rtr_mapping = nuagedb.get_ent_rtr_mapping_by_rtrid(
                context.session, rtr_id)
            if not ent_rtr_mapping:
                msg = _('router %s is not associated with '
                        'any net-partition') % rtr_id
                raise n_exc.BadRequest(resource='floatingip',
                                       msg=msg)
            params = {
                'nuage_rtr_id': ent_rtr_mapping['nuage_router_id'],
                'nuage_fippool_id': fip_pool_mapping['fip_pool_id'],
                'neutron_fip_ip': neutron_fip['floating_ip_address']
            }
            nuage_fip_id = self.nuageclient.create_nuage_floatingip(params)
            nuagedb.add_fip_mapping(context.session,
                                    neutron_fip['id'],
                                    rtr_id, nuage_fip_id)
        else:
            if rtr_id != fip_mapping['router_id']:
                msg = _('Floating IP can not be associated to VM in '
                        'different router context')
                raise nuage_exc.OperationNotSupported(msg=msg)
            nuage_fip_id = fip_mapping['nuage_fip_id']

        fip_pool_dict = {'router_id': neutron_fip['router_id']}
        nuagedb.update_fip_pool_mapping(fip_pool_mapping,
                                        fip_pool_dict)

        # Update VM if required
        port_mapping = nuagedb.get_port_mapping_by_id(context.session,
                                                      port_id)
        if port_mapping:
            params = {
                'nuage_vport_id': port_mapping['nuage_vport_id'],
                'nuage_fip_id': nuage_fip_id
            }
            self.nuageclient.update_nuage_vm_vport(params)
예제 #11
0
    def _create_update_floatingip(self, context,
                                  neutron_fip, port_id):
        rtr_id = neutron_fip['router_id']
        net_id = neutron_fip['floating_network_id']

        fip_pool_mapping = nuagedb.get_fip_pool_from_netid(context.session,
                                                           net_id)
        fip_mapping = nuagedb.get_fip_mapping_by_id(context.session,
                                                    neutron_fip['id'])

        if not fip_mapping:
            ent_rtr_mapping = nuagedb.get_ent_rtr_mapping_by_rtrid(
                context.session, rtr_id)
            if not ent_rtr_mapping:
                msg = _('router %s is not associated with '
                        'any net-partition') % rtr_id
                raise n_exc.BadRequest(resource='floatingip',
                                       msg=msg)
            params = {
                'nuage_rtr_id': ent_rtr_mapping['nuage_router_id'],
                'nuage_fippool_id': fip_pool_mapping['fip_pool_id'],
                'neutron_fip_ip': neutron_fip['floating_ip_address']
            }
            nuage_fip_id = self.nuageclient.create_nuage_floatingip(params)
            nuagedb.add_fip_mapping(context.session,
                                    neutron_fip['id'],
                                    rtr_id, nuage_fip_id)
        else:
            if rtr_id != fip_mapping['router_id']:
                msg = _('Floating IP can not be associated to VM in '
                        'different router context')
                raise nuage_exc.OperationNotSupported(msg=msg)
            nuage_fip_id = fip_mapping['nuage_fip_id']

        fip_pool_dict = {'router_id': neutron_fip['router_id']}
        nuagedb.update_fip_pool_mapping(fip_pool_mapping,
                                        fip_pool_dict)

        # Update VM if required
        port_mapping = nuagedb.get_port_mapping_by_id(context.session,
                                                      port_id)
        if port_mapping:
            params = {
                'nuage_vport_id': port_mapping['nuage_vport_id'],
                'nuage_fip_id': nuage_fip_id
            }
            self.nuageclient.update_nuage_vm_vport(params)
예제 #12
0
 def delete_router(self, context, id):
     session = context.session
     ent_rtr_mapping = nuagedb.get_ent_rtr_mapping_by_rtrid(session, id)
     if ent_rtr_mapping:
         filters = {
             'device_id': [id],
             'device_owner': [os_constants.DEVICE_OWNER_ROUTER_INTF]
         }
         ports = self.get_ports(context, filters)
         if ports:
             raise l3.RouterInUse(router_id=id)
         nuage_router_id = ent_rtr_mapping['nuage_router_id']
         self.nuageclient.delete_router(nuage_router_id)
     router_zone = nuagedb.get_rtr_zone_mapping(session, id)
     super(NuagePlugin, self).delete_router(context, id)
     if router_zone and not self._check_router_subnet_for_tenant(context):
         self.nuageclient.delete_user(router_zone['nuage_user_id'])
         self.nuageclient.delete_group(router_zone['nuage_group_id'])
예제 #13
0
 def update_router(self, context, id, router):
     r = router['router']
     with context.session.begin(subtransactions=True):
         if 'routes' in r:
             old_routes = self._get_extra_routes_by_router_id(context,
                                                              id)
             added, removed = utils.diff_list_of_dict(old_routes,
                                                      r['routes'])
             self._validate_nuage_staticroutes(old_routes, added, removed)
             ent_rtr_mapping = nuagedb.get_ent_rtr_mapping_by_rtrid(
                 context.session, id)
             if not ent_rtr_mapping:
                 msg = (_("Router %s does not hold net-partition "
                          "assoc on VSD. extra-route failed") % id)
                 raise n_exc.BadRequest(resource='router', msg=msg)
             # Let it do internal checks first and verify it.
             router_updated = super(NuagePlugin,
                                    self).update_router(context,
                                                        id,
                                                        router)
             for route in removed:
                 rtr_rt_mapping = nuagedb.get_router_route_mapping(
                     context.session, id, route)
                 if rtr_rt_mapping:
                     self.nuageclient.delete_nuage_staticroute(
                         rtr_rt_mapping['nuage_route_id'])
                     nuagedb.delete_static_route(context.session,
                                                 rtr_rt_mapping)
             for route in added:
                 params = {
                     'parent_id': ent_rtr_mapping['nuage_router_id'],
                     'net': netaddr.IPNetwork(route['destination']),
                     'nexthop': route['nexthop']
                 }
                 nuage_rt_id = self.nuageclient.create_nuage_staticroute(
                     params)
                 nuagedb.add_static_route(context.session,
                                          id, nuage_rt_id,
                                          route['destination'],
                                          route['nexthop'])
         else:
             router_updated = super(NuagePlugin, self).update_router(
                 context, id, router)
     return router_updated
예제 #14
0
파일: plugin.py 프로젝트: PFZheng/neutron
 def update_router(self, context, id, router):
     r = router['router']
     with context.session.begin(subtransactions=True):
         if 'routes' in r:
             old_routes = self._get_extra_routes_by_router_id(context,
                                                              id)
             added, removed = utils.diff_list_of_dict(old_routes,
                                                      r['routes'])
             self._validate_nuage_staticroutes(old_routes, added, removed)
             ent_rtr_mapping = nuagedb.get_ent_rtr_mapping_by_rtrid(
                 context.session, id)
             if not ent_rtr_mapping:
                 msg = (_("Router %s does not hold net-partition "
                          "assoc on VSD. extra-route failed") % id)
                 raise n_exc.BadRequest(resource='router', msg=msg)
             # Let it do internal checks first and verify it.
             router_updated = super(NuagePlugin,
                                    self).update_router(context,
                                                        id,
                                                        router)
             for route in removed:
                 rtr_rt_mapping = nuagedb.get_router_route_mapping(
                     context.session, id, route)
                 if rtr_rt_mapping:
                     self.nuageclient.delete_nuage_staticroute(
                         rtr_rt_mapping['nuage_route_id'])
                     nuagedb.delete_static_route(context.session,
                                                 rtr_rt_mapping)
             for route in added:
                 params = {
                     'parent_id': ent_rtr_mapping['nuage_router_id'],
                     'net': netaddr.IPNetwork(route['destination']),
                     'nexthop': route['nexthop']
                 }
                 nuage_rt_id = self.nuageclient.create_nuage_staticroute(
                     params)
                 nuagedb.add_static_route(context.session,
                                          id, nuage_rt_id,
                                          route['destination'],
                                          route['nexthop'])
         else:
             router_updated = super(NuagePlugin, self).update_router(
                 context, id, router)
     return router_updated
예제 #15
0
파일: plugin.py 프로젝트: PFZheng/neutron
 def delete_router(self, context, id):
     session = context.session
     ent_rtr_mapping = nuagedb.get_ent_rtr_mapping_by_rtrid(session,
                                                            id)
     if ent_rtr_mapping:
         filters = {
             'device_id': [id],
             'device_owner': [os_constants.DEVICE_OWNER_ROUTER_INTF]
         }
         ports = self.get_ports(context, filters)
         if ports:
             raise l3.RouterInUse(router_id=id)
         nuage_router_id = ent_rtr_mapping['nuage_router_id']
         self.nuageclient.delete_router(nuage_router_id)
     router_zone = nuagedb.get_rtr_zone_mapping(session, id)
     super(NuagePlugin, self).delete_router(context, id)
     if router_zone and not self._check_router_subnet_for_tenant(context):
         self.nuageclient.delete_user(router_zone['nuage_user_id'])
         self.nuageclient.delete_group(router_zone['nuage_group_id'])
예제 #16
0
파일: plugin.py 프로젝트: mshabdiz/neutron
    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
예제 #17
0
파일: plugin.py 프로젝트: mshabdiz/neutron
    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
예제 #18
0
파일: plugin.py 프로젝트: PFZheng/neutron
    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