Example #1
0
    def test_s3_parse_manifest(self):
        self.set_mock_db_items(fakes.DB_IMAGE_AKI_1, fakes.DB_IMAGE_ARI_1)
        self.db_api.get_item_by_id.return_value = None
        self.glance.images.get.side_effect = (
            tools.get_by_1st_arg_getter({
                fakes.ID_OS_IMAGE_AKI_1: fakes.OSImage(fakes.OS_IMAGE_AKI_1),
                fakes.ID_OS_IMAGE_ARI_1: fakes.OSImage(fakes.OS_IMAGE_ARI_1)}))

        metadata, image_parts, key, iv = image_api._s3_parse_manifest(
            base.create_context(), AMI_MANIFEST_XML)

        expected_metadata = {
            'disk_format': 'ami',
            'container_format': 'ami',
            'properties': {'architecture': 'x86_64',
                           'kernel_id': fakes.ID_OS_IMAGE_AKI_1,
                           'ramdisk_id': fakes.ID_OS_IMAGE_ARI_1,
                           'mappings': [
                                {"device": "sda1", "virtual": "ami"},
                                {"device": "/dev/sda1", "virtual": "root"},
                                {"device": "sda2", "virtual": "ephemeral0"},
                                {"device": "sda3", "virtual": "swap"}]}}
        self.assertThat(metadata,
                        matchers.DictMatches(expected_metadata,
                                             orderless_lists=True))
        self.assertThat(image_parts,
                        matchers.ListMatches(['foo']))
        self.assertEqual('foo', key)
        self.assertEqual('foo', iv)
        self.db_api.get_items_ids.assert_any_call(
            mock.ANY, 'aki', item_ids=(fakes.ID_EC2_IMAGE_AKI_1,),
            item_os_ids=None)
        self.db_api.get_items_ids.assert_any_call(
            mock.ANY, 'ari', item_ids=(fakes.ID_EC2_IMAGE_ARI_1,),
            item_os_ids=None)
Example #2
0
    def test_get_metadata_integral(self, keystone, network_interface_api, security_group_api):
        service_catalog = mock.MagicMock()
        service_catalog.get_data.return_value = []
        keystone.return_value = mock.Mock(
            auth_user_id="fake_user_id",
            auth_tenant_id=fakes.ID_OS_PROJECT,
            auth_token="fake_token",
            service_catalog=service_catalog,
        )
        fake_context = context.get_os_admin_context()

        self.set_mock_db_items(
            fakes.DB_INSTANCE_1,
            fakes.DB_INSTANCE_2,
            fakes.DB_NETWORK_INTERFACE_1,
            fakes.DB_NETWORK_INTERFACE_2,
            fakes.DB_IMAGE_1,
            fakes.DB_IMAGE_2,
            fakes.DB_IMAGE_ARI_1,
            fakes.DB_IMAGE_AKI_1,
            fakes.DB_VOLUME_1,
            fakes.DB_VOLUME_2,
            fakes.DB_VOLUME_3,
        )
        self.nova_admin.servers.list.return_value = [
            fakes.OSInstance_full(fakes.OS_INSTANCE_1),
            fakes.OSInstance_full(fakes.OS_INSTANCE_2),
        ]
        self.nova_admin.servers.get.side_effect = tools.get_by_1st_arg_getter(
            {
                fakes.ID_OS_INSTANCE_1: fakes.OSInstance_full(fakes.OS_INSTANCE_1),
                fakes.ID_OS_INSTANCE_2: fakes.OSInstance_full(fakes.OS_INSTANCE_2),
            }
        )
        keypair = mock.Mock(public_key=fakes.PUBLIC_KEY_KEY_PAIR)
        keypair.configure_mock(name=fakes.NAME_KEY_PAIR)
        self.nova.keypairs.get.return_value = keypair
        self.cinder.volumes.list.return_value = [
            fakes.OSVolume(fakes.OS_VOLUME_1),
            fakes.OSVolume(fakes.OS_VOLUME_2),
            fakes.OSVolume(fakes.OS_VOLUME_3),
        ]
        network_interface_api.describe_network_interfaces.side_effect = lambda *args, **kwargs: copy.deepcopy(
            {"networkInterfaceSet": [fakes.EC2_NETWORK_INTERFACE_1, fakes.EC2_NETWORK_INTERFACE_2]}
        )
        security_group_api.describe_security_groups.return_value = {
            "securityGroupInfo": [fakes.EC2_SECURITY_GROUP_1, fakes.EC2_SECURITY_GROUP_3]
        }

        retval = api.get_metadata_item(
            fake_context, ["latest", "meta-data", "instance-id"], fakes.ID_OS_INSTANCE_1, fakes.IP_NETWORK_INTERFACE_2
        )
        self.assertEqual(fakes.ID_EC2_INSTANCE_1, retval)

        retval = api.get_metadata_item(
            fake_context, ["latest", "meta-data", "instance-id"], fakes.ID_OS_INSTANCE_2, "10.200.1.15"
        )
        self.assertEqual(fakes.ID_EC2_INSTANCE_2, retval)
Example #3
0
    def test_s3_parse_manifest(self):
        db_api = self.mock_db()
        glance = self.mock_glance()
        db_api.set_mock_items(fakes.DB_IMAGE_AKI_1, fakes.DB_IMAGE_ARI_1)
        glance.images.get.side_effect = (tools.get_by_1st_arg_getter({
            fakes.ID_OS_IMAGE_AKI_1:
            fakes.OSImage(fakes.OS_IMAGE_AKI_1),
            fakes.ID_OS_IMAGE_ARI_1:
            fakes.OSImage(fakes.OS_IMAGE_ARI_1)
        }))

        metadata, image_parts, key, iv = image_api._s3_parse_manifest(
            base.create_context(), AMI_MANIFEST_XML)

        expected_metadata = {
            'disk_format': 'ami',
            'container_format': 'ami',
            'properties': {
                'architecture':
                'x86_64',
                'kernel_id':
                fakes.ID_OS_IMAGE_AKI_1,
                'ramdisk_id':
                fakes.ID_OS_IMAGE_ARI_1,
                'mappings': [{
                    "device": "sda1",
                    "virtual": "ami"
                }, {
                    "device": "/dev/sda1",
                    "virtual": "root"
                }, {
                    "device": "sda2",
                    "virtual": "ephemeral0"
                }, {
                    "device": "sda3",
                    "virtual": "swap"
                }]
            }
        }
        self.assertThat(
            metadata,
            matchers.DictMatches(expected_metadata, orderless_lists=True))
        self.assertThat(image_parts, matchers.ListMatches(['foo']))
        self.assertEqual('foo', key)
        self.assertEqual('foo', iv)
        db_api.get_items_ids.assert_any_call(
            mock.ANY,
            'aki',
            item_ids=(fakes.ID_EC2_IMAGE_AKI_1, ),
            item_os_ids=None)
        db_api.get_items_ids.assert_any_call(
            mock.ANY,
            'ari',
            item_ids=(fakes.ID_EC2_IMAGE_ARI_1, ),
            item_os_ids=None)
Example #4
0
    def test_get_metadata_integral(self, keystone, network_interface_api,
                                   security_group_api):
        service_catalog = mock.MagicMock()
        service_catalog.get_data.return_value = []
        keystone.return_value = mock.Mock(auth_user_id='fake_user_id',
                                          auth_tenant_id=fakes.ID_OS_PROJECT,
                                          auth_token='fake_token',
                                          service_catalog=service_catalog)
        fake_context = context.get_os_admin_context()

        self.set_mock_db_items(fakes.DB_INSTANCE_1, fakes.DB_INSTANCE_2,
                               fakes.DB_NETWORK_INTERFACE_1,
                               fakes.DB_NETWORK_INTERFACE_2, fakes.DB_IMAGE_1,
                               fakes.DB_IMAGE_2, fakes.DB_IMAGE_ARI_1,
                               fakes.DB_IMAGE_AKI_1, fakes.DB_VOLUME_1,
                               fakes.DB_VOLUME_2, fakes.DB_VOLUME_3)
        self.nova_admin.servers.list.return_value = [
            fakes.OSInstance_full(fakes.OS_INSTANCE_1),
            fakes.OSInstance_full(fakes.OS_INSTANCE_2)
        ]
        self.nova_admin.servers.get.side_effect = tools.get_by_1st_arg_getter({
            fakes.ID_OS_INSTANCE_1:
            fakes.OSInstance_full(fakes.OS_INSTANCE_1),
            fakes.ID_OS_INSTANCE_2:
            fakes.OSInstance_full(fakes.OS_INSTANCE_2)
        })
        keypair = mock.Mock(public_key=fakes.PUBLIC_KEY_KEY_PAIR)
        keypair.configure_mock(name=fakes.NAME_KEY_PAIR)
        self.nova.keypairs.get.return_value = keypair
        self.cinder.volumes.list.return_value = [
            fakes.OSVolume(fakes.OS_VOLUME_1),
            fakes.OSVolume(fakes.OS_VOLUME_2),
            fakes.OSVolume(fakes.OS_VOLUME_3)
        ]
        network_interface_api.describe_network_interfaces.side_effect = (
            lambda *args, **kwargs: copy.deepcopy({
                'networkInterfaceSet':
                [fakes.EC2_NETWORK_INTERFACE_1, fakes.EC2_NETWORK_INTERFACE_2]
            }))
        security_group_api.describe_security_groups.return_value = {
            'securityGroupInfo':
            [fakes.EC2_SECURITY_GROUP_1, fakes.EC2_SECURITY_GROUP_3]
        }

        retval = api.get_metadata_item(fake_context,
                                       ['latest', 'meta-data', 'instance-id'],
                                       fakes.ID_OS_INSTANCE_1,
                                       fakes.IP_NETWORK_INTERFACE_2)
        self.assertEqual(fakes.ID_EC2_INSTANCE_1, retval)

        retval = api.get_metadata_item(fake_context,
                                       ['latest', 'meta-data', 'instance-id'],
                                       fakes.ID_OS_INSTANCE_2, '10.200.1.15')
        self.assertEqual(fakes.ID_EC2_INSTANCE_2, retval)
Example #5
0
    def test_get_metadata_integral(self, network_interface_api,
                                   security_group_api, create_region):
        fake_context = base.create_context(is_os_admin=True)

        self.set_mock_db_items(fakes.DB_INSTANCE_1, fakes.DB_INSTANCE_2,
                               fakes.DB_NETWORK_INTERFACE_1,
                               fakes.DB_NETWORK_INTERFACE_2, fakes.DB_IMAGE_1,
                               fakes.DB_IMAGE_2, fakes.DB_IMAGE_ARI_1,
                               fakes.DB_IMAGE_AKI_1, fakes.DB_VOLUME_1,
                               fakes.DB_VOLUME_2, fakes.DB_VOLUME_3)
        self.nova_admin.servers.list.return_value = [
            fakes.OSInstance_full(fakes.OS_INSTANCE_1),
            fakes.OSInstance_full(fakes.OS_INSTANCE_2)
        ]
        self.nova_admin.servers.get.side_effect = tools.get_by_1st_arg_getter({
            fakes.ID_OS_INSTANCE_1:
            fakes.OSInstance_full(fakes.OS_INSTANCE_1),
            fakes.ID_OS_INSTANCE_2:
            fakes.OSInstance_full(fakes.OS_INSTANCE_2)
        })
        self.nova_admin.keypairs._get.return_value = (fakes.NovaKeyPair(
            fakes.OS_KEY_PAIR))
        self.cinder.volumes.list.return_value = [
            fakes.OSVolume(fakes.OS_VOLUME_1),
            fakes.OSVolume(fakes.OS_VOLUME_2),
            fakes.OSVolume(fakes.OS_VOLUME_3)
        ]
        network_interface_api.describe_network_interfaces.side_effect = (
            lambda *args, **kwargs: copy.deepcopy({
                'networkInterfaceSet':
                [fakes.EC2_NETWORK_INTERFACE_1, fakes.EC2_NETWORK_INTERFACE_2]
            }))
        security_group_api.describe_security_groups.return_value = {
            'securityGroupInfo':
            [fakes.EC2_SECURITY_GROUP_1, fakes.EC2_SECURITY_GROUP_3]
        }
        create_region.get.return_value = cache_core.NO_VALUE

        retval = api.get_metadata_item(fake_context,
                                       ['latest', 'meta-data', 'instance-id'],
                                       fakes.ID_OS_INSTANCE_1,
                                       fakes.IP_NETWORK_INTERFACE_2,
                                       create_region)
        self.assertEqual(fakes.ID_EC2_INSTANCE_1, retval)

        retval = api.get_metadata_item(fake_context,
                                       ['latest', 'meta-data', 'instance-id'],
                                       fakes.ID_OS_INSTANCE_2, '10.200.1.15',
                                       create_region)
        self.assertEqual(fakes.ID_EC2_INSTANCE_2, retval)
Example #6
0
    def test_get_metadata_integral(self, network_interface_api,
                                   security_group_api, create_region):
        fake_context = base.create_context(is_os_admin=True)

        self.set_mock_db_items(
            fakes.DB_INSTANCE_1, fakes.DB_INSTANCE_2,
            fakes.DB_NETWORK_INTERFACE_1, fakes.DB_NETWORK_INTERFACE_2,
            fakes.DB_IMAGE_1, fakes.DB_IMAGE_2,
            fakes.DB_IMAGE_ARI_1, fakes.DB_IMAGE_AKI_1,
            fakes.DB_VOLUME_1, fakes.DB_VOLUME_2, fakes.DB_VOLUME_3)
        self.nova_admin.servers.list.return_value = [
            fakes.OSInstance_full(fakes.OS_INSTANCE_1),
            fakes.OSInstance_full(fakes.OS_INSTANCE_2)]
        self.nova_admin.servers.get.side_effect = tools.get_by_1st_arg_getter({
            fakes.ID_OS_INSTANCE_1: fakes.OSInstance_full(fakes.OS_INSTANCE_1),
            fakes.ID_OS_INSTANCE_2: fakes.OSInstance_full(fakes.OS_INSTANCE_2)
        })
        self.nova_admin.keypairs._get.return_value = (
               fakes.NovaKeyPair(fakes.OS_KEY_PAIR))
        self.cinder.volumes.list.return_value = [
            fakes.OSVolume(fakes.OS_VOLUME_1),
            fakes.OSVolume(fakes.OS_VOLUME_2),
            fakes.OSVolume(fakes.OS_VOLUME_3)]
        network_interface_api.describe_network_interfaces.side_effect = (
            lambda *args, **kwargs: copy.deepcopy({
                'networkInterfaceSet': [fakes.EC2_NETWORK_INTERFACE_1,
                                        fakes.EC2_NETWORK_INTERFACE_2]}))
        security_group_api.describe_security_groups.return_value = {
            'securityGroupInfo': [fakes.EC2_SECURITY_GROUP_1,
                                  fakes.EC2_SECURITY_GROUP_3]}
        create_region.get.return_value = cache_core.NO_VALUE

        retval = api.get_metadata_item(
               fake_context, ['latest', 'meta-data', 'instance-id'],
               fakes.ID_OS_INSTANCE_1, fakes.IP_NETWORK_INTERFACE_2,
               create_region)
        self.assertEqual(fakes.ID_EC2_INSTANCE_1, retval)

        retval = api.get_metadata_item(
               fake_context, ['latest', 'meta-data', 'instance-id'],
               fakes.ID_OS_INSTANCE_2, '10.200.1.15',
               create_region)
        self.assertEqual(fakes.ID_EC2_INSTANCE_2, retval)
Example #7
0
    def test_register_image_by_bdm(self, get_os_image):
        self.glance.images.create.return_value = (fakes.OSImage(
            fakes.OS_IMAGE_2))
        self.cinder.volume_snapshots.get.side_effect = (
            tools.get_by_1st_arg_getter(
                {
                    fakes.ID_OS_SNAPSHOT_1:
                    (fakes.OSSnapshot(fakes.OS_SNAPSHOT_1))
                },
                notfound_exception=cinder_exception.NotFound(404)))
        self.db_api.add_item.side_effect = (tools.get_db_api_add_item(
            fakes.ID_EC2_IMAGE_2))
        self.set_mock_db_items(fakes.DB_SNAPSHOT_1, fakes.DB_SNAPSHOT_2,
                               fakes.DB_IMAGE_AKI_1, fakes.DB_IMAGE_ARI_1)
        get_os_image.side_effect = [
            fakes.OSImage(fakes.OS_IMAGE_AKI_1),
            fakes.OSImage(fakes.OS_IMAGE_ARI_1)
        ]

        resp = self.execute(
            'RegisterImage', {
                'RootDeviceName': fakes.ROOT_DEVICE_NAME_IMAGE_2,
                'Name': 'fake_name',
                'KernelId': fakes.ID_EC2_IMAGE_AKI_1,
                'RamdiskId': fakes.ID_EC2_IMAGE_ARI_1,
                'BlockDeviceMapping.1.DeviceName':
                fakes.ROOT_DEVICE_NAME_IMAGE_2,
                'BlockDeviceMapping.1.Ebs.SnapshotId': fakes.ID_EC2_SNAPSHOT_1,
                'BlockDeviceMapping.2.DeviceName': '/dev/vdf',
                'BlockDeviceMapping.2.Ebs.VolumeSize': '100',
                'BlockDeviceMapping.2.Ebs.DeleteOnTermination': 'False',
                'BlockDeviceMapping.3.DeviceName': '/dev/vdg',
                'BlockDeviceMapping.3.Ebs.SnapshotId': fakes.ID_EC2_SNAPSHOT_1,
                'BlockDeviceMapping.3.Ebs.VolumeSize': '55',
                'BlockDeviceMapping.3.Ebs.DeleteOnTermination': 'True',
                'BlockDeviceMapping.4.DeviceName': '/dev/vdh',
                'BlockDeviceMapping.4.Ebs.SnapshotId': fakes.ID_EC2_SNAPSHOT_2
            })
        self.assertThat(
            resp, matchers.DictMatches({'imageId': fakes.ID_EC2_IMAGE_2}))
        self.db_api.add_item.assert_called_once_with(mock.ANY, 'ami', {
            'os_id': fakes.ID_OS_IMAGE_2,
            'is_public': False,
            'description': None
        })
        self.assertEqual(1, self.glance.images.create.call_count)
        self.assertEqual((), self.glance.images.create.call_args[0])
        self.assertIn('properties', self.glance.images.create.call_args[1])
        self.assertIsInstance(
            self.glance.images.create.call_args[1]['properties'], dict)
        bdm = self.glance.images.create.call_args[1]['properties'].pop(
            'block_device_mapping', 'null')
        self.assertEqual(
            {
                'is_public': False,
                'size': 0,
                'name': 'fake_name',
                'properties': {
                    'root_device_name': fakes.ROOT_DEVICE_NAME_IMAGE_2,
                    'kernel_id': fakes.ID_OS_IMAGE_AKI_1,
                    'ramdisk_id': fakes.ID_OS_IMAGE_ARI_1,
                    'bdm_v2': True
                }
            }, self.glance.images.create.call_args[1])
        self.assertEqual([{
            'boot_index': 0,
            'delete_on_termination': True,
            'destination_type': 'volume',
            'device_name': fakes.ROOT_DEVICE_NAME_IMAGE_2,
            'source_type': 'snapshot',
            'snapshot_id': fakes.ID_OS_SNAPSHOT_1,
            'volume_size': 1
        }, {
            'boot_index': -1,
            'delete_on_termination': False,
            'destination_type': 'volume',
            'device_name': '/dev/vdf',
            'source_type': 'blank',
            'volume_size': 100
        }, {
            'boot_index': -1,
            'delete_on_termination': True,
            'destination_type': 'volume',
            'device_name': '/dev/vdg',
            'source_type': 'snapshot',
            'snapshot_id': fakes.ID_OS_SNAPSHOT_1,
            'volume_size': 55
        }, {
            'boot_index': -1,
            'delete_on_termination': True,
            'destination_type': 'volume',
            'device_name': '/dev/vdh',
            'source_type': 'snapshot',
            'snapshot_id': fakes.ID_OS_SNAPSHOT_2
        }], json.loads(bdm))
        get_os_image.assert_has_calls([
            mock.call(mock.ANY, fakes.ID_EC2_IMAGE_AKI_1),
            mock.call(mock.ANY, fakes.ID_EC2_IMAGE_ARI_1)
        ])
        self.cinder.volume_snapshots.get.assert_any_call(
            fakes.ID_OS_SNAPSHOT_1)
Example #8
0
    def test_register_image_by_bdm(self, get_os_image):
        self.glance.images.create.return_value = (
            fakes.OSImage(fakes.OS_IMAGE_2))
        self.glance.images.upload.return_value = (
            fakes.OSImage(fakes.OS_IMAGE_2))
        self.cinder.volume_snapshots.get.side_effect = (
            tools.get_by_1st_arg_getter(
                {fakes.ID_OS_SNAPSHOT_1: (
                    fakes.OSSnapshot(fakes.OS_SNAPSHOT_1))},
                notfound_exception=cinder_exception.NotFound(404)))
        self.db_api.add_item.side_effect = (
            tools.get_db_api_add_item(fakes.ID_EC2_IMAGE_2))
        self.set_mock_db_items(fakes.DB_SNAPSHOT_1, fakes.DB_SNAPSHOT_2,
                               fakes.DB_IMAGE_AKI_1, fakes.DB_IMAGE_ARI_1)
        get_os_image.side_effect = [fakes.OSImage(fakes.OS_IMAGE_AKI_1),
                                    fakes.OSImage(fakes.OS_IMAGE_ARI_1)]

        resp = self.execute(
            'RegisterImage',
            {'RootDeviceName': fakes.ROOT_DEVICE_NAME_IMAGE_2,
             'Name': 'fake_name',
             'KernelId': fakes.ID_EC2_IMAGE_AKI_1,
             'RamdiskId': fakes.ID_EC2_IMAGE_ARI_1,
             'BlockDeviceMapping.1.DeviceName': fakes.ROOT_DEVICE_NAME_IMAGE_2,
             'BlockDeviceMapping.1.Ebs.SnapshotId': fakes.ID_EC2_SNAPSHOT_1,
             'BlockDeviceMapping.2.DeviceName': '/dev/vdf',
             'BlockDeviceMapping.2.Ebs.VolumeSize': '100',
             'BlockDeviceMapping.2.Ebs.DeleteOnTermination': 'False',
             'BlockDeviceMapping.3.DeviceName': '/dev/vdg',
             'BlockDeviceMapping.3.Ebs.SnapshotId': fakes.ID_EC2_SNAPSHOT_1,
             'BlockDeviceMapping.3.Ebs.VolumeSize': '55',
             'BlockDeviceMapping.3.Ebs.DeleteOnTermination': 'True',
             'BlockDeviceMapping.4.DeviceName': '/dev/vdh',
             'BlockDeviceMapping.4.Ebs.SnapshotId': fakes.ID_EC2_SNAPSHOT_2})
        self.assertThat(resp, matchers.DictMatches(
            {'imageId': fakes.ID_EC2_IMAGE_2}))
        self.db_api.add_item.assert_called_once_with(
            mock.ANY, 'ami', {'os_id': fakes.ID_OS_IMAGE_2,
                              'is_public': False,
                              'description': None})
        self.assertEqual(1, self.glance.images.create.call_count)
        self.assertEqual((), self.glance.images.create.call_args[0])
        self.assertIsInstance(
            self.glance.images.create.call_args[1], dict)
        bdm = self.glance.images.create.call_args[1].pop(
            'block_device_mapping', 'null')
        self.assertEqual(
            {'visibility': 'private',
             'name': 'fake_name',
             'kernel_id': fakes.ID_OS_IMAGE_AKI_1,
             'ramdisk_id': fakes.ID_OS_IMAGE_ARI_1,
             'root_device_name': fakes.ROOT_DEVICE_NAME_IMAGE_2,
             'container_format': 'bare',
             'disk_format': 'raw',
             'bdm_v2': 'True'},
            self.glance.images.create.call_args[1])
        self.assertEqual([{'boot_index': 0,
                           'delete_on_termination': True,
                           'destination_type': 'volume',
                           'device_name': fakes.ROOT_DEVICE_NAME_IMAGE_2,
                           'source_type': 'snapshot',
                           'snapshot_id': fakes.ID_OS_SNAPSHOT_1,
                           'volume_size': 1},
                          {'boot_index': -1,
                           'delete_on_termination': False,
                           'destination_type': 'volume',
                           'device_name': '/dev/vdf',
                           'source_type': 'blank',
                           'volume_size': 100},
                          {'boot_index': -1,
                           'delete_on_termination': True,
                           'destination_type': 'volume',
                           'device_name': '/dev/vdg',
                           'source_type': 'snapshot',
                           'snapshot_id': fakes.ID_OS_SNAPSHOT_1,
                           'volume_size': 55},
                          {'boot_index': -1,
                           'delete_on_termination': True,
                           'destination_type': 'volume',
                           'device_name': '/dev/vdh',
                           'source_type': 'snapshot',
                           'snapshot_id': fakes.ID_OS_SNAPSHOT_2}],
                         json.loads(bdm))
        get_os_image.assert_has_calls(
            [mock.call(mock.ANY, fakes.ID_EC2_IMAGE_AKI_1),
             mock.call(mock.ANY, fakes.ID_EC2_IMAGE_ARI_1)])
        self.cinder.volume_snapshots.get.assert_any_call(
            fakes.ID_OS_SNAPSHOT_1)