예제 #1
0
    def _update_router_gw_info(self, context, router_id, info,
                               is_routes_update=False):
        router = self.plugin._get_router(context, router_id)
        org_ext_net_id = router.gw_port_id and router.gw_port.network_id
        org_enable_snat = router.enable_snat
        orgaddr, orgmask, orgnexthop = (
            self.plugin._get_external_attachment_info(
                context, router))

        super(nsx_v.NsxVPluginV2, self.plugin)._update_router_gw_info(
            context, router_id, info, router=router)

        new_ext_net_id = router.gw_port_id and router.gw_port.network_id
        new_enable_snat = router.enable_snat
        newaddr, newmask, newnexthop = (
            self.plugin._get_external_attachment_info(
                context, router))

        plr_id = self.edge_manager.get_plr_by_tlr_id(context, router_id)
        if not new_ext_net_id:
            if plr_id:
                # delete all plr relative conf
                self.edge_manager.delete_plr_by_tlr_id(
                    context, plr_id, router_id)
        else:
            # Connecting plr to the tlr if new_ext_net_id is not None.
            if not plr_id:
                plr_id = self.edge_manager.create_plr_with_tlr_id(
                    context, router_id, router.get('name'))
            if new_ext_net_id != org_ext_net_id and orgnexthop:
                # network changed, so need to remove default gateway
                # and all static routes before vnic can be configured
                edge_utils.clear_gateway(self.nsx_v, context, plr_id)

            # Update external vnic if addr or mask is changed
            if orgaddr != newaddr or orgmask != newmask:
                edge_utils.update_external_interface(
                    self.nsx_v, context, plr_id,
                    new_ext_net_id, newaddr, newmask)

            # Update SNAT rules if ext net changed
            # or ext net not changed but snat is changed.
            if (new_ext_net_id != org_ext_net_id or
                (new_ext_net_id == org_ext_net_id and
                 new_enable_snat != org_enable_snat)):
                self.plugin._update_nat_rules(context, router, plr_id)

            if (new_ext_net_id != org_ext_net_id or
                new_enable_snat != org_enable_snat or
                is_routes_update):
                # Open firewall flows on plr
                self.plugin._update_subnets_and_dnat_firewall(
                    context, router, router_id=plr_id)

        # update static routes in all
        self.update_routes(context, router_id, newnexthop)
        if self.plugin.metadata_proxy_handler:
            self._metadata_route_setup(context, router_id)
예제 #2
0
    def _update_router_gw_info(self, context, router_id, info,
                               is_routes_update=False):
        router = self.plugin._get_router(context, router_id)
        org_ext_net_id = router.gw_port_id and router.gw_port.network_id
        org_enable_snat = router.enable_snat
        orgaddr, orgmask, orgnexthop = (
            self.plugin._get_external_attachment_info(
                context, router))

        super(nsx_v.NsxVPluginV2, self.plugin)._update_router_gw_info(
            context, router_id, info, router=router)

        new_ext_net_id = router.gw_port_id and router.gw_port.network_id
        new_enable_snat = router.enable_snat
        newaddr, newmask, newnexthop = (
            self.plugin._get_external_attachment_info(
                context, router))

        edge_id = self._get_router_edge_id(context, router_id)
        with locking.LockManager.get_lock(edge_id, external=True):
            if new_ext_net_id != org_ext_net_id and orgnexthop:
                # network changed, so need to remove default gateway before
                # vnic can be configured
                LOG.debug("Delete default gateway %s", orgnexthop)
                edge_utils.clear_gateway(self.nsx_v, context, router_id)

            # Update external vnic if addr or mask is changed
            if orgaddr != newaddr or orgmask != newmask:
                edge_utils.update_external_interface(
                    self.nsx_v, context, router_id,
                    new_ext_net_id, newaddr, newmask)

            # Update SNAT rules if ext net changed
            # or ext net not changed but snat is changed.
            if (new_ext_net_id != org_ext_net_id or
                (new_ext_net_id == org_ext_net_id and
                 new_enable_snat != org_enable_snat)):
                self.plugin._update_nat_rules(context, router)

            if (new_ext_net_id != org_ext_net_id or
                new_enable_snat != org_enable_snat or
                is_routes_update):
                self.plugin._update_subnets_and_dnat_firewall(context, router)

            # Update static routes in all.
            self.plugin._update_routes(context, router_id, newnexthop)
예제 #3
0
 def _update_external_interface_on_routers(self, context,
                                           target_router_id, router_ids):
     ext_net_ids = self._get_ext_net_ids(context, router_ids)
     if len(ext_net_ids) > 1:
         msg = _("Can't configure external interface on multiple external "
                 "networks")
         raise nsx_exc.NsxPluginException(err_msg=msg)
     gateway_primary_addr = None
     gateway_mask = None
     gateway_nexthop = None
     secondary = []
     if not ext_net_ids:
         ext_net_id = None
     else:
         ext_net_id = ext_net_ids[0]
     for router_id in router_ids:
         router_qry = context.session.query(l3_db.Router)
         router = router_qry.filter_by(id=router_id).one()
         addr, mask, nexthop = self.plugin._get_external_attachment_info(
             context, router)
         if addr:
             if not gateway_primary_addr:
                 gateway_primary_addr = addr
             else:
                 secondary.append(addr)
         if mask and not gateway_mask:
             gateway_mask = mask
         if nexthop and not gateway_nexthop:
             gateway_nexthop = nexthop
         secondary.extend(self.plugin._get_floatingips_by_router(
             context, router_id))
     LOG.debug('Configure ext interface as following, ext_net: %s, '
               'primaryAddress: %s, netmask: %s, nexthop: %s, secondary: '
               '%s.', ext_net_id, gateway_primary_addr, gateway_mask,
               gateway_nexthop, secondary)
     edge_utils.update_external_interface(
         self.nsx_v, context, target_router_id, ext_net_id,
         gateway_primary_addr, gateway_mask, secondary)