From 257e26b0a41e59a8d7a2340e8b627cce6b260343 Mon Sep 17 00:00:00 2001 From: Clark Boylan Date: Mon, 20 Apr 2020 15:45:18 -0700 Subject: [PATCH] Set pool info on leaked instances We need to set pool info on leaked instances so that they are properly accounted for against quota. When a znode has provider details but not pool details we can't count it against quota used but also don't count it as unmanaged quota so end up in limbo. To fix this we set pool info metadata so that when an instance leaks we can recover the pool info and set it on the phony instance znode records used to delete those instances. Change-Id: Iba51655f7bf86987f9f88bb45059464f9f211ee9 --- nodepool/driver/openstack/handler.py | 1 + nodepool/driver/openstack/provider.py | 3 +++ nodepool/tests/unit/test_launcher.py | 20 ++++++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/nodepool/driver/openstack/handler.py b/nodepool/driver/openstack/handler.py index 4e160208d..0d76701f5 100644 --- a/nodepool/driver/openstack/handler.py +++ b/nodepool/driver/openstack/handler.py @@ -133,6 +133,7 @@ class OpenStackNodeLauncher(NodeLauncher): nodepool_node_id=self.node.id, nodepool_node_label=self.node.type[0], nodepool_image_name=image_name, + nodepool_pool_name=self.node.pool, networks=self.label.networks, security_groups=self.pool.security_groups, boot_from_volume=self.label.boot_from_volume, diff --git a/nodepool/driver/openstack/provider.py b/nodepool/driver/openstack/provider.py index 0a3056152..37a093bba 100755 --- a/nodepool/driver/openstack/provider.py +++ b/nodepool/driver/openstack/provider.py @@ -290,6 +290,7 @@ class OpenStackProvider(Provider): az=None, key_name=None, config_drive=True, nodepool_node_id=None, nodepool_node_label=None, nodepool_image_name=None, + nodepool_pool_name=None, networks=None, security_groups=None, boot_from_volume=False, volume_size=50, instance_properties=None, userdata=None): @@ -338,6 +339,7 @@ class OpenStackProvider(Provider): meta = dict( groups=",".join(groups_list), nodepool_provider_name=self.provider.name, + nodepool_pool_name=nodepool_pool_name, ) # merge in any provided properties if instance_properties: @@ -533,6 +535,7 @@ class OpenStackProvider(Provider): node = zk.Node() node.external_id = server.id node.provider = self.provider.name + node.pool = meta.get('nodepool_pool_name') node.state = zk.DELETING self._zk.storeNode(node) diff --git a/nodepool/tests/unit/test_launcher.py b/nodepool/tests/unit/test_launcher.py index 79d615aa6..560f69838 100644 --- a/nodepool/tests/unit/test_launcher.py +++ b/nodepool/tests/unit/test_launcher.py @@ -495,6 +495,26 @@ class TestLauncher(tests.DBTestCase): self.assertEqual(nodes[0].attributes, {'key1': 'value1', 'key2': 'value2'}) + def test_node_metadata(self): + """Test that node metadata is set""" + configfile = self.setup_config('node.yaml') + pool = self.useNodepool(configfile, watermark_sleep=1) + self.useBuilder(configfile) + pool.start() + image = self.waitForImage('fake-provider', 'fake-image') + self.assertEqual(image.username, 'zuul') + nodes = self.waitForNodes('fake-label') + + self.assertEqual(len(nodes), 1) + + # We check the "cloud" side attributes are set from nodepool side + provider = pool.getProviderManager('fake-provider') + cloud_node = provider.getServer(nodes[0].hostname) + self.assertEqual( + cloud_node.metadata['nodepool_provider_name'], + 'fake-provider') + self.assertEqual(cloud_node.metadata['nodepool_pool_name'], 'main') + def test_node_network_cli(self): """Same as test_node but using connection-type network_cli""" configfile = self.setup_config('node-network_cli.yaml')