Ejemplo n.º 1
0
 def remove_router_interface(self, context, router_id, interface_info):
     port_id = None
     if "port_id" in interface_info:
         port_id = interface_info["port_id"]
     elif "subnet_id" in interface_info:
         subnet_id = interface_info["subnet_id"]
         subnet = utils.retrieve_subnet(context, subnet_id)
         rport_qry = context.session.query(models_v2.Port)
         ports = rport_qry.filter_by(
             device_id=router_id,
             device_owner=l3_constants.DEVICE_OWNER_ROUTER_INTF,
             network_id=subnet["network_id"])
         for p in ports:
             if p["fixed_ips"][0]["subnet_id"] == subnet_id:
                 port_id = p["id"]
                 break
     neutron_router = self._get_router(context, router_id)
     self._l3super.remove_router_interface(self, context, router_id,
                                           interface_info)
     state_change = operation.Operation(self._set_db_router_state,
                                        args=(context, neutron_router,
                                              p_con.Status.UPDATING))
     self._dispatcher.dispatch_l3(d_context=embrane_ctx.DispatcherContext(
         p_con.Events.SHRINK_ROUTER_IF, neutron_router, context,
         state_change),
                                  args=(port_id, ))
Ejemplo n.º 2
0
    def create_floatingip(self, context, floatingip):
        result = self._l3super.create_floatingip(
            self, context, floatingip)

        if result["port_id"]:
            neutron_router = self._get_router(context, result["router_id"])
            db_fixed_port = self._get_port(context, result["port_id"])
            fixed_prefix = self._retrieve_prefix_from_port(context,
                                                           db_fixed_port)
            db_floating_port = neutron_router["gw_port"]
            floating_prefix = self._retrieve_prefix_from_port(
                context, db_floating_port)
            nat_info = utils.retrieve_nat_info(context, result,
                                               fixed_prefix,
                                               floating_prefix,
                                               neutron_router)
            state_change = operation.Operation(
                self._set_db_router_state,
                args=(context, neutron_router, p_con.Status.UPDATING))

            self._dispatcher.dispatch_l3(
                d_context=embrane_ctx.DispatcherContext(
                    p_con.Events.SET_NAT_RULE, neutron_router, context,
                    state_change),
                args=(nat_info,))
        return result
Ejemplo n.º 3
0
    def delete_router(self, context, id):
        """Deletes the DVA with the specific router id."""
        # Copy of the parent validation code, shouldn't the base modules
        # provide functions for validating operations?
        device_owner_router_intf = l3_constants.DEVICE_OWNER_ROUTER_INTF
        fips = self.get_floatingips_count(context.elevated(),
                                          filters={"router_id": [id]})
        if fips:
            raise l3.RouterInUse(router_id=id)

        device_filter = {
            "device_id": [id],
            "device_owner": [device_owner_router_intf]
        }
        ports = self.get_ports_count(context.elevated(), filters=device_filter)
        if ports:
            raise l3.RouterInUse(router_id=id)
        neutron_router = self._get_router(context, id)
        state_change = operation.Operation(self._set_db_router_state,
                                           args=(context, neutron_router,
                                                 p_con.Status.DELETING))
        self._dispatcher.dispatch_l3(d_context=embrane_ctx.DispatcherContext(
            p_con.Events.DELETE_ROUTER, neutron_router, context, state_change),
                                     args=())
        LOG.debug(_("Deleting router=%s"), neutron_router)
        return neutron_router
Ejemplo n.º 4
0
 def add_router_interface(self, context, router_id, interface_info):
     """Grows DVA interface in the specified subnet."""
     neutron_router = self._get_router(context, router_id)
     rport_qry = context.session.query(models_v2.Port)
     ports = rport_qry.filter_by(
         device_id=router_id).all()
     if len(ports) >= p_con.UTIF_LIMIT:
         raise neutron_exc.BadRequest(
             resource=router_id,
             msg=("this router doesn't support more than "
                  + str(p_con.UTIF_LIMIT) + " interfaces"))
     neutron_router_iface = self._l3super.add_router_interface(
         self, context, router_id, interface_info)
     port = self._get_port(context, neutron_router_iface["port_id"])
     utif_info = self._plugin_support.retrieve_utif_info(context, port)
     ip_allocation_info = utils.retrieve_ip_allocation_info(context,
                                                            port)
     state_change = operation.Operation(self._set_db_router_state,
                                        args=(context, neutron_router,
                                              p_con.Status.UPDATING))
     self._dispatcher.dispatch_l3(
         d_context=embrane_ctx.DispatcherContext(
             p_con.Events.GROW_ROUTER_IF, neutron_router, context,
             state_change),
         args=(utif_info, ip_allocation_info))
     return neutron_router_iface
Ejemplo n.º 5
0
    def update_floatingip(self, context, id, floatingip):
        with context.session.begin(subtransactions=True):
            db_fip = self._l3super.get_floatingip(self, context, id)
            result = self._l3super.update_floatingip(self, context, id,
                                                     floatingip)

            if db_fip["port_id"]:
                neutron_router = self._get_router(context, db_fip["router_id"])
                fip_id = db_fip["id"]
                state_change = operation.Operation(
                    self._set_db_router_state,
                    args=(context, neutron_router, p_con.Status.UPDATING))

                self._dispatcher.dispatch_l3(
                    d_context=embrane_ctx.DispatcherContext(
                        p_con.Events.RESET_NAT_RULE, neutron_router, context,
                        state_change),
                    args=(fip_id, ))
            if floatingip["floatingip"]["port_id"]:
                neutron_router = self._get_router(context, result["router_id"])
                db_fixed_port = self._get_port(context, result["port_id"])
                fixed_prefix = self._retrieve_prefix_from_port(
                    context, db_fixed_port)
                db_floating_port = neutron_router["gw_port"]
                floating_prefix = self._retrieve_prefix_from_port(
                    context, db_floating_port)
                nat_info = utils.retrieve_nat_info(context, result,
                                                   fixed_prefix,
                                                   floating_prefix,
                                                   neutron_router)
                state_change = operation.Operation(
                    self._set_db_router_state,
                    args=(context, neutron_router, p_con.Status.UPDATING))

                self._dispatcher.dispatch_l3(
                    d_context=embrane_ctx.DispatcherContext(
                        p_con.Events.SET_NAT_RULE, neutron_router, context,
                        state_change),
                    args=(nat_info, ))
        return result
Ejemplo n.º 6
0
    def update_router(self, context, id, router):
        db_router = self._l3super.update_router(self, context, id, router)
        neutron_router = self._get_router(context, db_router['id'])
        gw_port = neutron_router.gw_port
        utif_info = (self._plugin_support.retrieve_utif_info(context, gw_port)
                     if gw_port else None)
        ip_allocation_info = (utils.retrieve_ip_allocation_info(
            context, gw_port) if gw_port else None)

        routes_info = router["router"].get("routes")

        neutron_router = self._l3super._get_router(self, context, id)
        state_change = operation.Operation(self._set_db_router_state,
                                           args=(context, neutron_router,
                                                 p_con.Status.UPDATING))
        self._dispatcher.dispatch_l3(d_context=embrane_ctx.DispatcherContext(
            p_con.Events.UPDATE_ROUTER, neutron_router, context, state_change),
                                     args=(utif_info, ip_allocation_info,
                                           routes_info))
        return self._make_router_dict(neutron_router)
Ejemplo n.º 7
0
    def disassociate_floatingips(self, context, port_id):
        try:
            fip_qry = context.session.query(l3_db.FloatingIP)
            floating_ip = fip_qry.filter_by(fixed_port_id=port_id).one()
            router_id = floating_ip["router_id"]
        except exc.NoResultFound:
            return
        self._l3super.disassociate_floatingips(self, context, port_id)
        if router_id:
            neutron_router = self._get_router(context, router_id)
            fip_id = floating_ip["id"]
            state_change = operation.Operation(self._set_db_router_state,
                                               args=(context, neutron_router,
                                                     p_con.Status.UPDATING))

            self._dispatcher.dispatch_l3(
                d_context=embrane_ctx.DispatcherContext(
                    p_con.Events.RESET_NAT_RULE, neutron_router, context,
                    state_change),
                args=(fip_id, ))
Ejemplo n.º 8
0
    def update_router(self, context, id, router):
        with context.session.begin(subtransactions=True):
            db_router = self._l3super.update_router(self, context, id, router)
            gw_port = None
            ext_gw_info = db_router.get(l3_db.EXTERNAL_GW_INFO)
            if ext_gw_info:
                ext_gw_info = db_router[l3_db.EXTERNAL_GW_INFO]
                network_id = (ext_gw_info.get("network_id")
                              if ext_gw_info else None)
                if network_id:
                    gw_ports = self.get_ports(
                        context, {
                            "device_id": [id],
                            "device_owner": ["network:router_gateway"]
                        })
                    if len(gw_ports) != 1:
                        raise c_exc.EmbranePluginException(
                            err_msg=_("There must be only one gateway port "
                                      "per router at once"))
                    gw_port = gw_ports[0]

            utif_info = (self._plugin_support.retrieve_utif_info(
                context, gw_port) if gw_port else None)
            ip_allocation_info = (utils.retrieve_ip_allocation_info(
                self, context, gw_port) if gw_port else None)

            routes_info = router["router"].get("routes")

            neutron_router = self._l3super._get_router(self, context, id)
            state_change = operation.Operation(self._set_db_router_state,
                                               args=(context, neutron_router,
                                                     p_con.Status.UPDATING))
            self._dispatcher.dispatch_l3(
                d_context=embrane_ctx.DispatcherContext(
                    p_con.Events.UPDATE_ROUTER, neutron_router, context,
                    state_change),
                args=(utif_info, ip_allocation_info, routes_info))
        return self._make_router_dict(neutron_router)