Ignore unrelated error labels in request handler

Nodepool was declining node requests when other unrelated instance types
of a provider were unavailable:

    Declining node request <NodeRequest {... 'node_types': ['ubuntu'],
    ... }> due to ['node type(s) [ubuntu-invalid] not available']

To fix this we will the check error labels against the requested labels
before including them in the list of invalid node types.

Change-Id: I7bbb3b813ca82baf80821a9e84cc10385ea95a01
This commit is contained in:
Simon Westphahl 2023-11-09 11:38:57 +01:00
parent 49e7dab5f5
commit 2aeaee92f1
No known key found for this signature in database
3 changed files with 20 additions and 3 deletions

View File

@ -429,7 +429,8 @@ class NodeRequestHandler(NodeRequestHandlerNotifications,
if ntype not in valid:
invalid.add(ntype)
for ntype in self.manager.errorLabels():
invalid.add(ntype)
if ntype in self.request.node_types:
invalid.add(ntype)
return invalid
def _waitForNodeSet(self):

View File

@ -13,6 +13,7 @@ tenant-resource-limits:
max-cores: 1024
labels:
- name: ubuntu-invalid
- name: ubuntu
providers:
@ -32,7 +33,11 @@ providers:
key1: value1
key2: value2
labels:
- name: ubuntu
- name: ubuntu-invalid
cloud-image: ubuntu
instance-type: t3.nope
key-name: zuul
- name: ubuntu
cloud-image: ubuntu
instance-type: t3.medium
key-name: zuul

View File

@ -756,10 +756,21 @@ class TestDriverAws(tests.DBTestCase):
self.assertTrue(response['EbsOptimized']['Value'])
def test_aws_invalid_instance_type(self):
req = self.requestNode('aws/aws-invalid.yaml', 'ubuntu')
req = self.requestNode('aws/aws-invalid.yaml', 'ubuntu-invalid')
self.assertEqual(req.state, zk.FAILED)
self.assertEqual(req.nodes, [])
# Make sure other instance types are not affected
req = zk.NodeRequest()
req.state = zk.REQUESTED
req.tenant_name = 'tenant-1'
req.node_types.append('ubuntu')
self.zk.storeNodeRequest(req)
req = self.waitForNodeRequest(req)
self.assertEqual(req.state, zk.FULFILLED)
self.assertEqual(len(req.nodes), 1)
def test_aws_diskimage_snapshot(self):
self.fake_aws.fail_import_count = 1
configfile = self.setup_config('aws/diskimage.yaml')