AWS: handle 'InvalidConversionTaskId.Malformed' error

When we call the describe_import_image_tasks paginator with a
task id specified and that task id does not exist, AWS can return
a InvalidConversionTaskId.Malformed error instead of the expected
empty list.  Handle that case and add a test for it.

Change-Id: I1a3a9297e123a50a4beeb7e18124b8cc17aa28bb
This commit is contained in:
James E. Blair
2023-09-05 16:09:26 -07:00
parent 711104d3b4
commit b3921d5c40
3 changed files with 25 additions and 4 deletions

View File

@@ -824,10 +824,19 @@ class AwsAdapter(statemachine.Adapter):
paginator = self.ec2_client.get_paginator(
'describe_import_image_tasks')
with self.non_mutating_rate_limiter:
for page in paginator.paginate(ImportTaskIds=[task_id]):
for task in page['ImportImageTasks']:
# Return the first and only task
return task
try:
for page in paginator.paginate(ImportTaskIds=[task_id]):
for task in page['ImportImageTasks']:
# Return the first and only task
return task
except botocore.exceptions.ClientError as error:
if (error.response['Error']['Code'] ==
'InvalidConversionTaskId.Malformed'):
# In practice, this can mean that the task no
# longer exists
pass
else:
raise
return None
def _listImportSnapshotTasks(self):

View File

@@ -120,6 +120,10 @@ class ImportImageTaskPaginator:
if 'ImportTaskIds' in kw:
tasks = [t for t in tasks
if t['ImportTaskId'] in kw['ImportTaskIds']]
if not tasks:
raise botocore.exceptions.ClientError(
{'Error': {'Code': 'InvalidConversionTaskId.Malformed'}},
'DescribeImportImageTasks')
# A page of tasks
ret = [{'ImportImageTasks': tasks}]

View File

@@ -1042,6 +1042,14 @@ class TestDriverAws(tests.DBTestCase):
# Probably not found
break
def test_aws_get_import_image_task(self):
# A unit test of the unusual error handling for missing tasks
configfile = self.setup_config('aws/diskimage.yaml')
pool = self.useNodepool(configfile, watermark_sleep=1)
self.startPool(pool)
adapter = pool.getProviderManager('ec2-us-west-2').adapter
self.assertIsNone(adapter._getImportImageTask("fake-id"))
def test_aws_provisioning_spot_instances(self):
# Test creating a spot instances instead of an on-demand on.
req = self.requestNode('aws/aws-spot.yaml', 'ubuntu1404-spot')