Fixed issue where floating ips were not cleaned up correctly on port delete
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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,8 +742,18 @@ 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 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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user