Set type for error'ed instances

When a server creation fails but has an external id we create a new
znode to offload the deletion of that node. This currently misses the
node type which will trigger an exception during node launch [1]. This
wedges the provider until the node deleter kicked in and deleted that
node successfully. Fix this by storing the node type in this znode.

[1] Exception
Traceback (most recent call last):
  File "nodepool/driver/__init__.py", line 639, in run
    self._runHandler()
  File "nodepool/driver/__init__.py", line 563, in _runHandler
    self._waitForNodeSet()
  File "nodepool/driver/__init__.py", line 463, in _waitForNodeSet
    if not self.hasRemainingQuota(ntype):
  File "nodepool/driver/openstack/handler.py", line 314, in hasRemainingQuota
    self.manager.estimatedNodepoolQuotaUsed())
  File "nodepool/driver/openstack/provider.py", line 164, in estimatedNodepoolQuotaUsed
    if node.type[0] not in provider_pool.labels:
IndexError: list index out of range

Change-Id: I67b269069dddb8349959802d7b1ee049a826d0c5
Co-authored-by: Tobias Henkel <tobias.henkel@bmw.de>
This commit is contained in:
Tristan Cacqueray
2018-12-04 08:44:28 +00:00
committed by Tobias Henkel
parent 1b5d416f36
commit 6fe861f42a
3 changed files with 42 additions and 0 deletions

View File

@@ -24,6 +24,7 @@ import openstack.exceptions
from nodepool import exceptions
from nodepool.driver.openstack.provider import OpenStackProvider
from nodepool.driver.fake.handler import FakeNodeRequestHandler
from openstack.cloud.exc import OpenStackCloudCreateException
class Dummy(object):
@@ -340,6 +341,7 @@ class FakeProvider(OpenStackProvider):
def __init__(self, provider, use_taskmanager):
self.createServer_fails = 0
self.createServer_fails_with_external_id = 0
self.__client = FakeProvider.fake_cloud()
super(FakeProvider, self).__init__(provider, use_taskmanager)
@@ -350,6 +352,9 @@ class FakeProvider(OpenStackProvider):
while self.createServer_fails:
self.createServer_fails -= 1
raise Exception("Expected createServer exception")
while self.createServer_fails_with_external_id:
self.createServer_fails_with_external_id -= 1
raise OpenStackCloudCreateException('server', 'fakeid')
return super(FakeProvider, self).createServer(*args, **kwargs)
def getRequestHandler(self, poolworker, request):