Ejemplo n.º 1
0
 def create_vip(self, context, vip):
     self._validate_vip(vip)
     db_vip = self.plugin.populate_vip_graph(context, vip)
     vip_port = self.plugin._core_plugin._get_port(context,
                                                   db_vip['port_id'])
     vip_utif_info = self._retrieve_utif_info(context, vip_port)
     vip_ip_allocation_info = utils.retrieve_ip_allocation_info(
         context, vip_port)
     vip_ip_allocation_info.is_gw = True
     db_pool = pool_utif_info = pool_ip_allocation_info = None
     members = monitors = []
     if db_vip['pool_id']:
         db_pool = self.plugin.get_pool(
             context, db_vip['pool_id'])
         pool_port = edb.get_pool_port(context, db_pool["id"])
         if pool_port:
             db_port = self.plugin._core_plugin._get_port(
                 context, pool_port["port_id"])
             pool_utif_info = self._retrieve_utif_info(context, db_port)
             pool_ip_allocation_info = utils.retrieve_ip_allocation_info(
                 context, db_port)
         members = self.plugin.get_members(
             context, filters={'id': db_pool['members']})
         monitors = self.plugin.get_members(
             context, filters={'id': db_pool['health_monitors']})
     self._dispatcher.dispatch_lb(
         embrane_ctx.DispatcherContext(econ.Events.CREATE_VIP,
                                       db_vip, context, None),
         self._flavor, vip_utif_info, vip_ip_allocation_info,
         pool_utif_info, pool_ip_allocation_info, db_pool, members,
         monitors)
Ejemplo n.º 2
0
    def update_vip(self, context, old_vip, vip):
        new_pool = old_port_id = removed_ip = None
        new_pool_utif = new_pool_ip_allocation = None
        old_pool = {}
        members = monitors = []
        if old_vip['pool_id'] != vip['pool_id']:
            new_pool = self.plugin.get_pool(
                context, vip['pool_id'])
            members = self.plugin.get_members(
                context, filters={'id': new_pool['members']})
            monitors = self.plugin.get_members(
                context, filters={'id': new_pool['health_monitors']})
            new_pool_port = edb.get_pool_port(context, new_pool["id"])
            if new_pool_port:
                db_port = self.plugin._core_plugin._get_port(
                    context, new_pool_port["port_id"])
                new_pool_utif = self._retrieve_utif_info(context, db_port)
                new_pool_ip_allocation = utils.retrieve_ip_allocation_info(
                    context, db_port)
            old_pool = self.plugin.get_pool(
                context, old_vip['pool_id'])
            old_pool_port = edb.get_pool_port(context, old_pool["id"])
            if old_pool_port:
                old_port = self.plugin._core_plugin._get_port(
                    context, old_pool_port['port_id'])
                # remove that subnet ip
                removed_ip = old_port['fixed_ips'][0]['ip_address']
                old_port_id = old_port['id']

        self._dispatcher.dispatch_lb(
            embrane_ctx.DispatcherContext(econ.Events.UPDATE_VIP, vip,
                                          context, None),
            old_pool.get('id'), old_port_id, removed_ip, new_pool_utif,
            new_pool_ip_allocation, new_pool, members, monitors)
Ejemplo n.º 3
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.º 4
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.º 5
0
    def create_router(self, context, router):
        r = router["router"]
        self._get_tenant_id_for_create(context, r)
        with context.session.begin(subtransactions=True):
            neutron_router = self._l3super.create_router(self, context, router)
            network_id = None
            gw_port = None
            ext_gw_info = neutron_router.get(l3_db.EXTERNAL_GW_INFO)
            if ext_gw_info:
                network_id = ext_gw_info.get("network_id")
                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]

            # For now, only small flavor is used
            utif_info = (self._plugin_support.retrieve_utif_info(
                context, gw_port) if network_id else None)
            ip_allocation_info = (utils.retrieve_ip_allocation_info(
                self, context, gw_port) if network_id else None)
            neutron_router = self._l3super._get_router(self, context,
                                                       neutron_router["id"])
            neutron_router["status"] = p_con.Status.CREATING
            self._dispatcher.dispatch_l3(
                d_context=embrane_ctx.DispatcherContext(
                    p_con.Events.CREATE_ROUTER, neutron_router, context, None),
                args=(h_con.Flavor.SMALL, utif_info, ip_allocation_info))
            return self._make_router_dict(neutron_router)
Ejemplo n.º 6
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.º 7
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.º 8
0
 def update_member(self, context, old_member, member):
     db_pool = self.plugin.get_pool(context, member['pool_id'])
     if member['pool_id'] != old_member['pool_id']:
         old_pool = self.plugin.get_pool(context, old_member['pool_id'])
         if old_pool['vip_id']:
             db_vip = self.plugin._get_resource(context, ldb.Vip,
                                                old_pool['vip_id'])
             self._dispatcher.dispatch_lb(
                 embrane_ctx.DispatcherContext(
                     econ.Events.REMOVE_MEMBER, db_vip, context, None),
                 old_member)
     if db_pool['vip_id']:
         db_vip = self.plugin._get_resource(
             context, ldb.Vip, db_pool['vip_id'])
         self._dispatcher.dispatch_lb(
             embrane_ctx.DispatcherContext(
                 econ.Events.ADD_OR_UPDATE_MEMBER, db_vip, context, None),
             member, db_pool['protocol'])
Ejemplo n.º 9
0
 def update_pool_health_monitor(self, context, old_health_monitor,
                                health_monitor, pool_id):
     db_pool = self.plugin.get_pool(context, pool_id)
     if db_pool['vip_id']:
         db_vip = self.plugin._get_resource(context, ldb.Vip,
                                            db_pool['vip_id'])
         self._dispatcher.dispatch_lb(
             embrane_ctx.DispatcherContext(
                 econ.Events.UPDATE_POOL_HM, db_vip, context, None),
             health_monitor, pool_id)
Ejemplo n.º 10
0
 def create_pool_health_monitor(self, context, health_monitor, pool_id):
     db_pool = self.plugin.get_pool(context, pool_id)
     # API call only if vip exists
     if db_pool['vip_id']:
         db_vip = self.plugin._get_resource(context, ldb.Vip,
                                            db_pool['vip_id'])
         self._dispatcher.dispatch_lb(
             embrane_ctx.DispatcherContext(
                 econ.Events.ADD_POOL_HM, db_vip, context, None),
             health_monitor, pool_id)
Ejemplo n.º 11
0
 def delete_member(self, context, member):
     db_pool = self.plugin.get_pool(context, member['pool_id'])
     if db_pool['vip_id']:
         db_vip = self.plugin._get_resource(context, ldb.Vip,
                                            db_pool['vip_id'])
         self._dispatcher.dispatch_lb(
             embrane_ctx.DispatcherContext(econ.Events.DELETE_MEMBER,
                                           db_vip, context, None), member)
     else:
         self._delete_member(context, member)
Ejemplo n.º 12
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.º 13
0
 def synchronize_vips(self, ctx):
     session = ctx.session
     vips = session.query(ldb.Vip).join(
         sdb.ProviderResourceAssociation,
         sdb.ProviderResourceAssociation.resource_id ==
         ldb.Vip.pool_id).filter(
             sdb.ProviderResourceAssociation.provider_name == self.provider)
     # No need to check pending states
     for vip in vips:
         if vip['status'] not in skip_states:
             self.dispatcher.dispatch_lb(
                 d_context=embrane_ctx.DispatcherContext(
                     econ.Events.POLL_GRAPH, vip, ctx, None),
                 args=())
Ejemplo n.º 14
0
 def update_pool(self, context, old_pool, pool):
     with context.session.begin(subtransactions=True):
         if old_pool['vip_id']:
             try:
                 db_vip = self.plugin._get_resource(
                     context, ldb.Vip, old_pool['vip_id'])
             except lb_ext.VipNotFound:
                 return
             monitors = self.plugin.get_members(
                 context, filters={'id': old_pool['health_monitors']})
             self._dispatcher.dispatch_lb(
                 embrane_ctx.DispatcherContext(econ.Events.UPDATE_POOL,
                                               db_vip, context, None),
                 pool, monitors)
Ejemplo n.º 15
0
 def create_router(self, context, router):
     r = router["router"]
     self._get_tenant_id_for_create(context, r)
     db_router = self._l3super.create_router(self, context, router)
     neutron_router = self._get_router(context, db_router['id'])
     gw_port = neutron_router.gw_port
     # For now, only small flavor is used
     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)
     neutron_router = self._l3super._get_router(self, context,
                                                neutron_router["id"])
     neutron_router["status"] = p_con.Status.CREATING
     self._dispatcher.dispatch_l3(d_context=embrane_ctx.DispatcherContext(
         p_con.Events.CREATE_ROUTER, neutron_router, context, None),
                                  args=(h_con.Flavor.SMALL, utif_info,
                                        ip_allocation_info))
     return self._make_router_dict(neutron_router)
Ejemplo n.º 16
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.º 17
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.º 18
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)
Ejemplo n.º 19
0
 def delete_vip(self, context, vip):
     db_vip = self.plugin.populate_vip_graph(context, vip)
     self._dispatcher.dispatch_lb(
         embrane_ctx.DispatcherContext(
             econ.Events.DELETE_VIP, db_vip, context, None))