From 60e49f110bdf3f7f20134a08859bf3b28992887f Mon Sep 17 00:00:00 2001 From: Monty Taylor Date: Tue, 19 Apr 2016 07:22:58 -0500 Subject: [PATCH] Cleanup leaked floating ips periodically It should not happen in a neutron setup that we have leaked floating ips. However, sometimes it seems that it happens around startup. It's also safe in a neutron context to just clean the unattached ones. So assume that sometimes clouds get into weird states and just clean them. Change-Id: I1a30efb3b7994381592c2391881711d6b1f32dff Depends-On: I93b0c7d0b0eefdfe0fb1cd4a66cdbba9baabeb09 --- doc/source/configuration.rst | 5 +++++ nodepool/config.py | 2 ++ nodepool/nodepool.py | 2 ++ nodepool/provider_manager.py | 4 ++++ requirements.txt | 2 +- 5 files changed, 14 insertions(+), 1 deletion(-) diff --git a/doc/source/configuration.rst b/doc/source/configuration.rst index cdaef9b76..6b09d60e3 100644 --- a/doc/source/configuration.rst +++ b/doc/source/configuration.rst @@ -440,6 +440,11 @@ provider, the Nodepool image types are also defined (see ``rate`` In seconds. Default 1.0. + ``clean-floating-ips`` + If it is set to True, nodepool will assume it is the only user of the + OpenStack project and will attempt to clean unattached floating ips that + may have leaked around restarts. + .. _images: images diff --git a/nodepool/config.py b/nodepool/config.py index 6e75aff15..95580da0b 100644 --- a/nodepool/config.py +++ b/nodepool/config.py @@ -47,6 +47,7 @@ class Provider(ConfigValue): other.launch_timeout != self.launch_timeout or other.networks != self.networks or other.ipv6_preferred != self.ipv6_preferred or + other.clean_floating_ips != self.clean_floating_ips or other.azs != self.azs): return False new_images = other.images @@ -184,6 +185,7 @@ def loadConfig(config_path): n.id = None n.public = network.get('public', False) p.ipv6_preferred = provider.get('ipv6-preferred') + p.clean_floating_ips = provider.get('clean_floating_ips') p.azs = provider.get('availability-zones') p.template_hostname = provider.get( 'template-hostname', diff --git a/nodepool/nodepool.py b/nodepool/nodepool.py index 7e8ed6e0b..980e517a3 100644 --- a/nodepool/nodepool.py +++ b/nodepool/nodepool.py @@ -2083,6 +2083,8 @@ class NodePool(threading.Thread): server['name'], server['id'], provider.name)) continue + if provider.clean_floating_ips: + manager.cleanupLeakedFloaters() def cleanupOneNode(self, session, node): now = time.time() diff --git a/nodepool/provider_manager.py b/nodepool/provider_manager.py index 23387a7b6..4a25dd031 100644 --- a/nodepool/provider_manager.py +++ b/nodepool/provider_manager.py @@ -342,6 +342,10 @@ class ProviderManager(TaskManager): self.log.debug('Deleting server %s' % server_id) self.deleteServer(server_id) + def cleanupLeakedFloaters(self): + with shade_inner_exceptions(): + self._client.delete_unattached_floating_ips() + class FakeProviderManager(ProviderManager): def __init__(self, provider): diff --git a/requirements.txt b/requirements.txt index 4be3d4cb0..3ae332137 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,6 +15,6 @@ PrettyTable>=0.6,<0.8 # shade has a looser requirement on six than nodepool, so install six first six>=1.7.0 os-client-config>=1.2.0 -shade>=1.6.2 +shade>=1.8.0 diskimage-builder voluptuous