def test_describe_volumes(self): self.cinder.volumes.list.return_value = [ fakes.OSVolume(fakes.OS_VOLUME_1), fakes.OSVolume(fakes.OS_VOLUME_2), fakes.OSVolume(fakes.OS_VOLUME_3) ] self.set_mock_db_items(fakes.DB_VOLUME_1, fakes.DB_VOLUME_2, fakes.DB_INSTANCE_1, fakes.DB_INSTANCE_2, fakes.DB_SNAPSHOT_1, fakes.DB_SNAPSHOT_2) self.db_api.add_item.side_effect = (tools.get_db_api_add_item( fakes.ID_EC2_VOLUME_3)) resp = self.execute('DescribeVolumes', {}) self.assertThat( resp, matchers.DictMatches( { 'volumeSet': [ fakes.EC2_VOLUME_1, fakes.EC2_VOLUME_2, fakes.EC2_VOLUME_3 ] }, orderless_lists=True)) self.db_api.get_items.assert_any_call(mock.ANY, 'vol') self.db_api.get_items_by_ids = tools.CopyingMock( return_value=[fakes.DB_VOLUME_1]) resp = self.execute('DescribeVolumes', {'VolumeId.1': fakes.ID_EC2_VOLUME_1}) self.assertThat( resp, matchers.DictMatches({'volumeSet': [fakes.EC2_VOLUME_1]}, orderless_lists=True)) self.db_api.get_items_by_ids.assert_any_call( mock.ANY, set([fakes.ID_EC2_VOLUME_1])) self.check_filtering( 'DescribeVolumes', 'volumeSet', [ ('availability-zone', fakes.NAME_AVAILABILITY_ZONE), ('create-time', fakes.TIME_CREATE_VOLUME_2), ('encrypted', False), # TODO(ft): declare a constant for the volume size in fakes ('size', 1), ('snapshot-id', fakes.ID_EC2_SNAPSHOT_1), ('status', 'available'), ('volume-id', fakes.ID_EC2_VOLUME_1), # TODO(ft): support filtering by none/empty value # ('volume-type', ''), ('attachment.device', fakes.ROOT_DEVICE_NAME_INSTANCE_2), ('attachment.instance-id', fakes.ID_EC2_INSTANCE_2), ('attachment.status', 'attached') ]) self.check_tag_support('DescribeVolumes', 'volumeSet', fakes.ID_EC2_VOLUME_1, 'volumeId')
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)
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)
def test_describe_volumes_invalid_parameters(self): self.cinder.volumes.list.return_value = [ fakes.OSVolume(fakes.OS_VOLUME_1), fakes.OSVolume(fakes.OS_VOLUME_2) ] self.assert_execution_error('InvalidVolume.NotFound', 'DescribeVolumes', {'VolumeId.1': fakes.random_ec2_id('vol')}) self.cinder.volumes.list.side_effect = lambda: [] self.assert_execution_error('InvalidVolume.NotFound', 'DescribeVolumes', {'VolumeId.1': fakes.ID_EC2_VOLUME_1})
def test_detach_volume_invalid_parameters(self): self.set_mock_db_items(fakes.DB_VOLUME_1) self.cinder.volumes.get.return_value = (fakes.OSVolume( fakes.OS_VOLUME_1)) self.assert_execution_error('IncorrectState', 'DetachVolume', {'VolumeId': fakes.ID_EC2_VOLUME_1})
def test_attach_volume(self): self.set_mock_db_items(fakes.DB_INSTANCE_2, fakes.DB_VOLUME_3) os_volume = fakes.OSVolume(fakes.OS_VOLUME_3) os_volume.attachments.append({ 'device': '/dev/vdf', 'server_id': fakes.ID_OS_INSTANCE_2 }) os_volume.status = 'attaching' self.cinder.volumes.get.return_value = os_volume resp = self.execute( 'AttachVolume', { 'VolumeId': fakes.ID_EC2_VOLUME_3, 'InstanceId': fakes.ID_EC2_INSTANCE_2, 'Device': '/dev/vdf' }) self.assertEqual( { 'device': '/dev/vdf', 'instanceId': fakes.ID_EC2_INSTANCE_2, 'status': 'attaching', 'volumeId': fakes.ID_EC2_VOLUME_3 }, resp) self.nova.volumes.create_server_volume.assert_called_once_with( fakes.ID_OS_INSTANCE_2, fakes.ID_OS_VOLUME_3, '/dev/vdf')
def test_create_volume_from_snapshot(self): self.cinder.volumes.create.return_value = (fakes.OSVolume( fakes.OS_VOLUME_3)) self.db_api.add_item.side_effect = (tools.get_db_api_add_item( fakes.ID_EC2_VOLUME_3)) self.set_mock_db_items(fakes.DB_SNAPSHOT_1) resp = self.execute( 'CreateVolume', { 'AvailabilityZone': fakes.NAME_AVAILABILITY_ZONE, 'SnapshotId': fakes.ID_EC2_SNAPSHOT_1 }) self.assertThat(fakes.EC2_VOLUME_3, matchers.DictMatches(resp)) self.db_api.add_item.assert_called_once_with(mock.ANY, 'vol', tools.purge_dict( fakes.DB_VOLUME_3, ('id', )), project_id=None) self.cinder.volumes.create.assert_called_once_with( None, snapshot_id=fakes.ID_OS_SNAPSHOT_1, volume_type=None, availability_zone=fakes.NAME_AVAILABILITY_ZONE)
def test_describe_new_instance_then_its_volume(self): os_instance_id = fakes.random_os_id() os_volume_id = fakes.random_os_id() os_instance = { 'id': os_instance_id, 'flavor': { 'id': 'fake' }, 'volumes_attached': [{ 'id': os_volume_id }], } os_volume = { 'id': os_volume_id, 'status': 'in-use', 'attachments': [{ 'device': '/dev/vdb', 'server_id': os_instance_id }], } self.nova_admin.servers.list.return_value = [ fakes.OSInstance_full(os_instance) ] self.cinder.volumes.list.return_value = [fakes.OSVolume(os_volume)] reservations = instance_api.describe_instances(self.context) instance = reservations['reservationSet'][0]['instancesSet'][0] volume_id = instance['blockDeviceMapping'][0]['ebs']['volumeId'] volume_api.describe_volumes(self.context, [volume_id])
def test_create_snapshot_from_volume(self): self.cinder.volume_snapshots.create.return_value = (fakes.OSSnapshot( fakes.OS_SNAPSHOT_1)) self.db_api.add_item.side_effect = (tools.get_db_api_add_item( fakes.ID_EC2_SNAPSHOT_1)) self.set_mock_db_items(fakes.DB_VOLUME_2) self.cinder.volumes.get.side_effect = ( lambda vol_id: (fakes.OSVolume(fakes.OS_VOLUME_2) if vol_id == fakes.ID_OS_VOLUME_2 else None)) resp = self.execute('CreateSnapshot', {'VolumeId': fakes.ID_EC2_VOLUME_2}) self.assertThat(fakes.EC2_SNAPSHOT_1, matchers.DictMatches(resp)) self.db_api.add_item.assert_called_once_with( mock.ANY, 'snap', tools.purge_dict(fakes.DB_SNAPSHOT_1, ('id', ))) self.cinder.volume_snapshots.create.assert_called_once_with( fakes.ID_OS_VOLUME_2, force=True)
def test_detach_volume(self, os_volume_get): self.set_mock_db_items(fakes.DB_INSTANCE_1, fakes.DB_INSTANCE_2, fakes.DB_VOLUME_2) os_volume = fakes.OSVolume(fakes.OS_VOLUME_2) self.cinder.volumes.get.return_value = os_volume os_volume_get.side_effect = ( lambda vol: setattr(vol, 'status', 'detaching')) resp = self.execute('DetachVolume', {'VolumeId': fakes.ID_EC2_VOLUME_2}) self.assertEqual({'device': os_volume.attachments[0]['device'], 'instanceId': fakes.ID_EC2_INSTANCE_2, 'status': 'detaching', 'volumeId': fakes.ID_EC2_VOLUME_2}, resp) self.nova.volumes.delete_server_volume.assert_called_once_with( fakes.ID_OS_INSTANCE_2, fakes.ID_OS_VOLUME_2) self.cinder.volumes.get.assert_called_once_with(fakes.ID_OS_VOLUME_2)
def test_format_volume_maps_status(self): fake_volume = fakes.OSVolume(fakes.OS_VOLUME_1) self.cinder.volumes.list.return_value = [fake_volume] self.set_mock_db_items(fakes.DB_VOLUME_1) fake_volume.status = 'creating' resp = self.execute('DescribeVolumes', {}) self.assertEqual('creating', resp['volumeSet'][0]['status']) fake_volume.status = 'attaching' resp = self.execute('DescribeVolumes', {}) self.assertEqual('in-use', resp['volumeSet'][0]['status']) fake_volume.status = 'detaching' resp = self.execute('DescribeVolumes', {}) self.assertEqual('in-use', resp['volumeSet'][0]['status']) fake_volume.status = 'banana' resp = self.execute('DescribeVolumes', {}) self.assertEqual('banana', resp['volumeSet'][0]['status'])