diff --git a/quark/drivers/floating_ip_registry.py b/quark/drivers/floating_ip_registry.py index 13f1b96..6200b70 100644 --- a/quark/drivers/floating_ip_registry.py +++ b/quark/drivers/floating_ip_registry.py @@ -13,14 +13,34 @@ # License for the specific language governing permissions and limitations # under the License. +from oslo_config import cfg + from quark.drivers.registry import DriverRegistryBase from quark.drivers import unicorn_driver as unicorn +CONF = cfg.CONF + +quark_router_opts = [ + cfg.StrOpt('default_floating_ip_driver', + default='Unicorn', + help=_('Driver for floating IP')), +] + +CONF.register_opts(quark_router_opts, 'QUARK') + class FloatingIPDriverRegistry(DriverRegistryBase): def __init__(self): self.drivers = { unicorn.UnicornDriver.get_name(): unicorn.UnicornDriver()} + def get_driver(self, driver_name=None): + if not driver_name: + driver_name = CONF.QUARK.default_floating_ip_driver + + if driver_name in self.drivers: + return self.drivers[driver_name] + + raise Exception("Driver %s is not registered." % driver_name) DRIVER_REGISTRY = FloatingIPDriverRegistry() diff --git a/quark/ipam.py b/quark/ipam.py index 8bd6ccb..8220ec9 100644 --- a/quark/ipam.py +++ b/quark/ipam.py @@ -35,6 +35,7 @@ from oslo_utils import timeutils from quark.db import api as db_api from quark.db import ip_types from quark.db import models +from quark.drivers import floating_ip_registry as registry from quark import exceptions as q_exc from quark import network_strategy from quark import utils @@ -741,10 +742,20 @@ class QuarkIpam(object): # another trip to deallocate each IP, but keeping our # indices smaller probably provides more value than the # cost + # NOTE(aquillin): For floating IPs associated with the port, we do not + # want to deallocate the IP or disassociate the IP from + # the tenant, instead we will disassociate floating's + # fixed IP address. context.session.flush() for ip in ips_to_remove: - if len(ip["ports"]) == 0: - self.deallocate_ip_address(context, ip) + if ip["address_type"] == ip_types.FLOATING: + if ip.fixed_ip: + db_api.floating_ip_disassociate_fixed_ip(context, ip) + driver = registry.DRIVER_REGISTRY.get_driver() + driver.remove_floating_ip(ip) + else: + if len(ip["ports"]) == 0: + self.deallocate_ip_address(context, ip) # NCP-1509(roaet): # - started using admin_context due to tenant not claiming when realloc diff --git a/quark/plugin_modules/floating_ips.py b/quark/plugin_modules/floating_ips.py index e654f08..c872c9e 100644 --- a/quark/plugin_modules/floating_ips.py +++ b/quark/plugin_modules/floating_ips.py @@ -29,9 +29,6 @@ CONF = cfg.CONF LOG = logging.getLogger(__name__) quark_router_opts = [ - cfg.StrOpt('default_floating_ip_driver', - default='Unicorn', - help=_('Driver for floating IP')), cfg.StrOpt('floating_ip_segment_name', default='floating_ip', help=_('Segment name for floating IP subnets')), cfg.StrOpt('floating_ip_ipam_strategy', default='ANY', @@ -133,8 +130,7 @@ def create_floatingip(context, content): flip = db_api.floating_ip_associate_fixed_ip(context, flip, fixed_ip) - flip_driver_type = CONF.QUARK.default_floating_ip_driver - flip_driver = registry.DRIVER_REGISTRY.get_driver(flip_driver_type) + flip_driver = registry.DRIVER_REGISTRY.get_driver() flip_driver.register_floating_ip(flip, port, fixed_ip) @@ -206,8 +202,7 @@ def update_floatingip(context, id, content): flip = db_api.port_associate_ip(context, [port], flip, [port_id]) flip = db_api.floating_ip_associate_fixed_ip(context, flip, fixed_ip) - flip_driver_type = CONF.QUARK.default_floating_ip_driver - flip_driver = registry.DRIVER_REGISTRY.get_driver(flip_driver_type) + flip_driver = registry.DRIVER_REGISTRY.get_driver() if port: if current_port: @@ -261,8 +256,7 @@ def delete_floatingip(context, id): db_api.ip_address_deallocate(context, flip) if flip.fixed_ip: - driver_type = CONF.QUARK.default_floating_ip_driver - driver = registry.DRIVER_REGISTRY.get_driver(driver_type) + driver = registry.DRIVER_REGISTRY.get_driver() driver.remove_floating_ip(flip)