Adds a new EC2Ids object to store ec2 ids associated with an instance. The object structure resembles what's being returned from the current conductor helper method get_ec2_ids(). This object does not correspond directly with any database table but rather a collection of values gathered from issuing different db calls and converting returned values to ec2 format. Related to blueprint liberty-objects Change-Id: I068acf687c116e3c75a352616b9555486a165423
		
			
				
	
	
		
			278 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			278 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# Copyright (C) 2014, Red Hat, Inc.
 | 
						|
#
 | 
						|
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
 | 
						|
#    not use this file except in compliance with the License. You may obtain
 | 
						|
#    a copy of the License at
 | 
						|
#
 | 
						|
#         http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
#
 | 
						|
#    Unless required by applicable law or agreed to in writing, software
 | 
						|
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
						|
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 | 
						|
#    License for the specific language governing permissions and limitations
 | 
						|
#    under the License.
 | 
						|
 | 
						|
import mock
 | 
						|
 | 
						|
from nova import db
 | 
						|
from nova import objects
 | 
						|
from nova.objects import ec2 as ec2_obj
 | 
						|
from nova.tests.unit.objects import test_objects
 | 
						|
 | 
						|
 | 
						|
fake_map = {
 | 
						|
    'created_at': None,
 | 
						|
    'updated_at': None,
 | 
						|
    'deleted_at': None,
 | 
						|
    'deleted': 0,
 | 
						|
    'id': 1,
 | 
						|
    'uuid': 'fake-uuid-2',
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
class _TestEC2InstanceMapping(object):
 | 
						|
    @staticmethod
 | 
						|
    def _compare(test, db, obj):
 | 
						|
        for field, value in db.items():
 | 
						|
            test.assertEqual(db[field], obj[field])
 | 
						|
 | 
						|
    def test_create(self):
 | 
						|
        imap = ec2_obj.EC2InstanceMapping(context=self.context)
 | 
						|
        imap.uuid = 'fake-uuid-2'
 | 
						|
 | 
						|
        with mock.patch.object(db, 'ec2_instance_create') as create:
 | 
						|
            create.return_value = fake_map
 | 
						|
            imap.create()
 | 
						|
 | 
						|
        self.assertEqual(self.context, imap._context)
 | 
						|
        imap._context = None
 | 
						|
        self._compare(self, fake_map, imap)
 | 
						|
 | 
						|
    def test_get_by_uuid(self):
 | 
						|
        with mock.patch.object(db, 'ec2_instance_get_by_uuid') as get:
 | 
						|
            get.return_value = fake_map
 | 
						|
            imap = ec2_obj.EC2InstanceMapping.get_by_uuid(self.context,
 | 
						|
                                                     'fake-uuid-2')
 | 
						|
            self._compare(self, fake_map, imap)
 | 
						|
 | 
						|
    def test_get_by_ec2_id(self):
 | 
						|
        with mock.patch.object(db, 'ec2_instance_get_by_id') as get:
 | 
						|
            get.return_value = fake_map
 | 
						|
            imap = ec2_obj.EC2InstanceMapping.get_by_id(self.context, 1)
 | 
						|
            self._compare(self, fake_map, imap)
 | 
						|
 | 
						|
 | 
						|
class TestEC2InstanceMapping(test_objects._LocalTest, _TestEC2InstanceMapping):
 | 
						|
    pass
 | 
						|
 | 
						|
 | 
						|
class TestRemoteEC2InstanceMapping(test_objects._RemoteTest,
 | 
						|
                                   _TestEC2InstanceMapping):
 | 
						|
    pass
 | 
						|
 | 
						|
 | 
						|
class _TestEC2VolumeMapping(object):
 | 
						|
    @staticmethod
 | 
						|
    def _compare(test, db, obj):
 | 
						|
        for field, value in db.items():
 | 
						|
            test.assertEqual(db[field], obj[field])
 | 
						|
 | 
						|
    def test_create(self):
 | 
						|
        vmap = ec2_obj.EC2VolumeMapping(context=self.context)
 | 
						|
        vmap.uuid = 'fake-uuid-2'
 | 
						|
 | 
						|
        with mock.patch.object(db, 'ec2_volume_create') as create:
 | 
						|
            create.return_value = fake_map
 | 
						|
            vmap.create()
 | 
						|
 | 
						|
        self.assertEqual(self.context, vmap._context)
 | 
						|
        vmap._context = None
 | 
						|
        self._compare(self, fake_map, vmap)
 | 
						|
 | 
						|
    def test_get_by_uuid(self):
 | 
						|
        with mock.patch.object(db, 'ec2_volume_get_by_uuid') as get:
 | 
						|
            get.return_value = fake_map
 | 
						|
            vmap = ec2_obj.EC2VolumeMapping.get_by_uuid(self.context,
 | 
						|
                                                     'fake-uuid-2')
 | 
						|
            self._compare(self, fake_map, vmap)
 | 
						|
 | 
						|
    def test_get_by_ec2_id(self):
 | 
						|
        with mock.patch.object(db, 'ec2_volume_get_by_id') as get:
 | 
						|
            get.return_value = fake_map
 | 
						|
            vmap = ec2_obj.EC2VolumeMapping.get_by_id(self.context, 1)
 | 
						|
            self._compare(self, fake_map, vmap)
 | 
						|
 | 
						|
 | 
						|
class TestEC2VolumeMapping(test_objects._LocalTest, _TestEC2VolumeMapping):
 | 
						|
    pass
 | 
						|
 | 
						|
 | 
						|
class TestRemoteEC2VolumeMapping(test_objects._RemoteTest,
 | 
						|
                                 _TestEC2VolumeMapping):
 | 
						|
    pass
 | 
						|
 | 
						|
 | 
						|
class _TestEC2SnapshotMapping(object):
 | 
						|
    @staticmethod
 | 
						|
    def _compare(test, db, obj):
 | 
						|
        for field, value in db.items():
 | 
						|
            test.assertEqual(db[field], obj[field])
 | 
						|
 | 
						|
    def test_create(self):
 | 
						|
        smap = ec2_obj.EC2SnapshotMapping(context=self.context)
 | 
						|
        smap.uuid = 'fake-uuid-2'
 | 
						|
 | 
						|
        with mock.patch.object(db, 'ec2_snapshot_create') as create:
 | 
						|
            create.return_value = fake_map
 | 
						|
            smap.create()
 | 
						|
 | 
						|
        self.assertEqual(self.context, smap._context)
 | 
						|
        smap._context = None
 | 
						|
        self._compare(self, fake_map, smap)
 | 
						|
 | 
						|
    def test_get_by_uuid(self):
 | 
						|
        with mock.patch.object(db, 'ec2_snapshot_get_by_uuid') as get:
 | 
						|
            get.return_value = fake_map
 | 
						|
            smap = ec2_obj.EC2SnapshotMapping.get_by_uuid(self.context,
 | 
						|
                                                          'fake-uuid-2')
 | 
						|
            self._compare(self, fake_map, smap)
 | 
						|
 | 
						|
    def test_get_by_ec2_id(self):
 | 
						|
        with mock.patch.object(db, 'ec2_snapshot_get_by_ec2_id') as get:
 | 
						|
            get.return_value = fake_map
 | 
						|
            smap = ec2_obj.EC2SnapshotMapping.get_by_id(self.context, 1)
 | 
						|
            self._compare(self, fake_map, smap)
 | 
						|
 | 
						|
 | 
						|
class TestEC2SnapshotMapping(test_objects._LocalTest, _TestEC2SnapshotMapping):
 | 
						|
    pass
 | 
						|
 | 
						|
 | 
						|
class TestRemoteEC2SnapshotMapping(test_objects._RemoteTest,
 | 
						|
                                   _TestEC2SnapshotMapping):
 | 
						|
    pass
 | 
						|
 | 
						|
 | 
						|
class _TestS3ImageMapping(object):
 | 
						|
    @staticmethod
 | 
						|
    def _compare(test, db, obj):
 | 
						|
        for field, value in db.items():
 | 
						|
            test.assertEqual(db[field], obj[field])
 | 
						|
 | 
						|
    def test_create(self):
 | 
						|
        s3imap = ec2_obj.S3ImageMapping(context=self.context)
 | 
						|
        s3imap.uuid = 'fake-uuid-2'
 | 
						|
 | 
						|
        with mock.patch.object(db, 's3_image_create') as create:
 | 
						|
            create.return_value = fake_map
 | 
						|
            s3imap.create()
 | 
						|
 | 
						|
        self.assertEqual(self.context, s3imap._context)
 | 
						|
        s3imap._context = None
 | 
						|
        self._compare(self, fake_map, s3imap)
 | 
						|
 | 
						|
    def test_get_by_uuid(self):
 | 
						|
        with mock.patch.object(db, 's3_image_get_by_uuid') as get:
 | 
						|
            get.return_value = fake_map
 | 
						|
            s3imap = ec2_obj.S3ImageMapping.get_by_uuid(self.context,
 | 
						|
                                                        'fake-uuid-2')
 | 
						|
            self._compare(self, fake_map, s3imap)
 | 
						|
 | 
						|
    def test_get_by_s3_id(self):
 | 
						|
        with mock.patch.object(db, 's3_image_get') as get:
 | 
						|
            get.return_value = fake_map
 | 
						|
            s3imap = ec2_obj.S3ImageMapping.get_by_id(self.context, 1)
 | 
						|
            self._compare(self, fake_map, s3imap)
 | 
						|
 | 
						|
 | 
						|
class TestS3ImageMapping(test_objects._LocalTest, _TestS3ImageMapping):
 | 
						|
    pass
 | 
						|
 | 
						|
 | 
						|
class TestRemoteS3ImageMapping(test_objects._RemoteTest, _TestS3ImageMapping):
 | 
						|
    pass
 | 
						|
 | 
						|
 | 
						|
class _TestEC2Ids(object):
 | 
						|
    @mock.patch('nova.api.ec2.ec2utils.image_type')
 | 
						|
    @mock.patch('nova.api.ec2.ec2utils.glance_id_to_ec2_id')
 | 
						|
    @mock.patch('nova.api.ec2.ec2utils.id_to_ec2_inst_id')
 | 
						|
    def test_get_by_instance(self, mock_inst, mock_glance, mock_type):
 | 
						|
        mock_inst.return_value = 'fake-ec2-inst-id'
 | 
						|
        mock_glance.side_effect = ['fake-ec2-ami-id',
 | 
						|
                                   'fake-ec2-kernel-id',
 | 
						|
                                   'fake-ec2-ramdisk-id']
 | 
						|
        mock_type.side_effect = [mock.sentinel.ec2_kernel_type,
 | 
						|
                                 mock.sentinel.ec2_ramdisk_type]
 | 
						|
        inst = objects.Instance(uuid='fake-uuid', image_ref='fake-image-id',
 | 
						|
                                kernel_id='fake-kernel-id',
 | 
						|
                                ramdisk_id='fake-ramdisk-id')
 | 
						|
 | 
						|
        result = ec2_obj.EC2Ids.get_by_instance(self.context, inst)
 | 
						|
 | 
						|
        self.assertEqual('fake-ec2-inst-id', result.instance_id)
 | 
						|
        self.assertEqual('fake-ec2-ami-id', result.ami_id)
 | 
						|
        self.assertEqual('fake-ec2-kernel-id', result.kernel_id)
 | 
						|
        self.assertEqual('fake-ec2-ramdisk-id', result.ramdisk_id)
 | 
						|
 | 
						|
    @mock.patch('nova.api.ec2.ec2utils.glance_id_to_ec2_id')
 | 
						|
    @mock.patch('nova.api.ec2.ec2utils.id_to_ec2_inst_id')
 | 
						|
    def test_get_by_instance_no_image_ref(self, mock_inst, mock_glance):
 | 
						|
        mock_inst.return_value = 'fake-ec2-inst-id'
 | 
						|
        mock_glance.return_value = None
 | 
						|
        inst = objects.Instance(uuid='fake-uuid', image_ref=None,
 | 
						|
                                kernel_id=None, ramdisk_id=None)
 | 
						|
 | 
						|
        result = ec2_obj.EC2Ids.get_by_instance(self.context, inst)
 | 
						|
 | 
						|
        self.assertEqual('fake-ec2-inst-id', result.instance_id)
 | 
						|
        self.assertIsNone(result.ami_id)
 | 
						|
        self.assertIsNone(result.kernel_id)
 | 
						|
        self.assertIsNone(result.ramdisk_id)
 | 
						|
 | 
						|
    @mock.patch('nova.api.ec2.ec2utils.image_type')
 | 
						|
    @mock.patch('nova.api.ec2.ec2utils.glance_id_to_ec2_id')
 | 
						|
    @mock.patch('nova.api.ec2.ec2utils.id_to_ec2_inst_id')
 | 
						|
    def test_get_by_instance_no_kernel_id(self, mock_inst, mock_glance,
 | 
						|
                                          mock_type):
 | 
						|
        mock_inst.return_value = 'fake-ec2-inst-id'
 | 
						|
        mock_glance.side_effect = ['fake-ec2-ami-id',
 | 
						|
                                   'fake-ec2-ramdisk-id']
 | 
						|
        mock_type.return_value = mock.sentinel.ec2_ramdisk_type
 | 
						|
        inst = objects.Instance(uuid='fake-uuid', image_ref='fake-image-id',
 | 
						|
                                kernel_id=None, ramdisk_id='fake-ramdisk-id')
 | 
						|
 | 
						|
        result = ec2_obj.EC2Ids.get_by_instance(self.context, inst)
 | 
						|
 | 
						|
        self.assertEqual('fake-ec2-inst-id', result.instance_id)
 | 
						|
        self.assertEqual('fake-ec2-ami-id', result.ami_id)
 | 
						|
        self.assertIsNone(result.kernel_id)
 | 
						|
        self.assertEqual('fake-ec2-ramdisk-id', result.ramdisk_id)
 | 
						|
 | 
						|
    @mock.patch('nova.api.ec2.ec2utils.image_type')
 | 
						|
    @mock.patch('nova.api.ec2.ec2utils.glance_id_to_ec2_id')
 | 
						|
    @mock.patch('nova.api.ec2.ec2utils.id_to_ec2_inst_id')
 | 
						|
    def test_get_by_instance_no_ramdisk_id(self, mock_inst, mock_glance,
 | 
						|
                                          mock_type):
 | 
						|
        mock_inst.return_value = 'fake-ec2-inst-id'
 | 
						|
        mock_glance.side_effect = ['fake-ec2-ami-id',
 | 
						|
                                   'fake-ec2-kernel-id']
 | 
						|
        mock_type.return_value = mock.sentinel.ec2_kernel_type
 | 
						|
        inst = objects.Instance(uuid='fake-uuid', image_ref='fake-image-id',
 | 
						|
                                kernel_id='fake-kernel-id', ramdisk_id=None)
 | 
						|
 | 
						|
        result = ec2_obj.EC2Ids.get_by_instance(self.context, inst)
 | 
						|
 | 
						|
        self.assertEqual('fake-ec2-inst-id', result.instance_id)
 | 
						|
        self.assertEqual('fake-ec2-ami-id', result.ami_id)
 | 
						|
        self.assertEqual('fake-ec2-kernel-id', result.kernel_id)
 | 
						|
        self.assertIsNone(result.ramdisk_id)
 | 
						|
 | 
						|
 | 
						|
class TestEC2Ids(test_objects._LocalTest, _TestEC2Ids):
 | 
						|
    pass
 | 
						|
 | 
						|
 | 
						|
class TestRemoteEC2Ids(test_objects._RemoteTest, _TestEC2Ids):
 | 
						|
    pass
 |