diff --git a/nova/api/ec2/ec2utils.py b/nova/api/ec2/ec2utils.py index fdff3d9f470d..93fa522acc8c 100644 --- a/nova/api/ec2/ec2utils.py +++ b/nova/api/ec2/ec2utils.py @@ -129,7 +129,9 @@ def id_to_ec2_id(instance_id, template='i-%08x'): def id_to_ec2_inst_id(instance_id): """Get or create an ec2 instance ID (i-[base 16 number]) from uuid.""" - if utils.is_uuid_like(instance_id): + if instance_id is None: + return None + elif utils.is_uuid_like(instance_id): ctxt = context.get_admin_context() int_id = get_int_id_from_instance_uuid(ctxt, instance_id) return id_to_ec2_id(int_id) diff --git a/nova/tests/api/ec2/test_cloud.py b/nova/tests/api/ec2/test_cloud.py index 234d84ec8b61..b9fab73a5ce2 100644 --- a/nova/tests/api/ec2/test_cloud.py +++ b/nova/tests/api/ec2/test_cloud.py @@ -312,6 +312,18 @@ class CloudTestCase(test.TestCase): self.cloud.disassociate_address, self.context, public_ip=address) + def test_disassociate_unassociated_address(self): + address = "10.10.10.10" + db.floating_ip_create(self.context, + {'address': address, + 'pool': 'nova'}) + self.cloud.allocate_address(self.context) + self.cloud.describe_addresses(self.context) + self.assertRaises(exception.InstanceNotFound, + self.cloud.disassociate_address, + self.context, public_ip=address) + db.floating_ip_destroy(self.context, address) + def test_describe_security_groups(self): """Makes sure describe_security_groups works and filters results.""" sec = db.security_group_create(self.context, diff --git a/nova/tests/api/ec2/test_middleware.py b/nova/tests/api/ec2/test_middleware.py index a618817bd18e..7f30b924e015 100644 --- a/nova/tests/api/ec2/test_middleware.py +++ b/nova/tests/api/ec2/test_middleware.py @@ -116,6 +116,15 @@ class ExecutorTestCase(test.TestCase): result = self._execute(not_found) self.assertIn('i-00000005', self._extract_message(result)) + def test_instance_not_found_none(self): + def not_found(context): + raise exception.InstanceNotFound(instance_id=None) + + # NOTE(mikal): we want no exception to be raised here, which was what + # was happening in bug/1080406 + result = self._execute(not_found) + self.assertIn('None', self._extract_message(result)) + def test_snapshot_not_found(self): def not_found(context): raise exception.SnapshotNotFound(snapshot_id=5)