
* EC2 snapshot id correctly translated instead of volume uuid. * Add unit tests changes for the existing test. Fixes LP Bug #1089371 Change-Id: Id650ba53dc6cda946531493e3887a01fc5d9bda4
252 lines
9.1 KiB
Python
252 lines
9.1 KiB
Python
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
|
|
# Copyright 2011 Isaku Yamahata
|
|
# All Rights Reserved.
|
|
#
|
|
# 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.
|
|
|
|
"""
|
|
Tests for Block Device Mapping Code.
|
|
"""
|
|
|
|
from nova.api.ec2 import cloud
|
|
from nova.api.ec2 import ec2utils
|
|
from nova import test
|
|
from nova.tests import matchers
|
|
|
|
|
|
class BlockDeviceMappingEc2CloudTestCase(test.TestCase):
|
|
"""Test Case for Block Device Mapping"""
|
|
|
|
def fake_ec2_vol_id_to_uuid(obj, ec2_id):
|
|
if ec2_id == 'vol-87654321':
|
|
return '22222222-3333-4444-5555-666666666666'
|
|
elif ec2_id == 'vol-98765432':
|
|
return '77777777-8888-9999-0000-aaaaaaaaaaaa'
|
|
else:
|
|
return 'OhNoooo'
|
|
|
|
def fake_ec2_snap_id_to_uuid(obj, ec2_id):
|
|
if ec2_id == 'snap-12345678':
|
|
return '00000000-1111-2222-3333-444444444444'
|
|
elif ec2_id == 'snap-23456789':
|
|
return '11111111-2222-3333-4444-555555555555'
|
|
else:
|
|
return 'OhNoooo'
|
|
|
|
def _assertApply(self, action, bdm_list):
|
|
for bdm, expected_result in bdm_list:
|
|
self.assertThat(action(bdm), matchers.DictMatches(expected_result))
|
|
|
|
def test_parse_block_device_mapping(self):
|
|
self.stubs.Set(ec2utils,
|
|
'ec2_vol_id_to_uuid',
|
|
self.fake_ec2_vol_id_to_uuid)
|
|
self.stubs.Set(ec2utils,
|
|
'ec2_snap_id_to_uuid',
|
|
self.fake_ec2_snap_id_to_uuid)
|
|
bdm_list = [
|
|
({'device_name': '/dev/fake0',
|
|
'ebs': {'snapshot_id': 'snap-12345678',
|
|
'volume_size': 1}},
|
|
{'device_name': '/dev/fake0',
|
|
'snapshot_id': '00000000-1111-2222-3333-444444444444',
|
|
'volume_size': 1,
|
|
'delete_on_termination': True}),
|
|
|
|
({'device_name': '/dev/fake1',
|
|
'ebs': {'snapshot_id': 'snap-23456789',
|
|
'delete_on_termination': False}},
|
|
{'device_name': '/dev/fake1',
|
|
'snapshot_id': '11111111-2222-3333-4444-555555555555',
|
|
'delete_on_termination': False}),
|
|
|
|
({'device_name': '/dev/fake2',
|
|
'ebs': {'snapshot_id': 'vol-87654321',
|
|
'volume_size': 2}},
|
|
{'device_name': '/dev/fake2',
|
|
'volume_id': '22222222-3333-4444-5555-666666666666',
|
|
'volume_size': 2,
|
|
'delete_on_termination': True}),
|
|
|
|
({'device_name': '/dev/fake3',
|
|
'ebs': {'snapshot_id': 'vol-98765432',
|
|
'delete_on_termination': False}},
|
|
{'device_name': '/dev/fake3',
|
|
'volume_id': '77777777-8888-9999-0000-aaaaaaaaaaaa',
|
|
'delete_on_termination': False}),
|
|
|
|
({'device_name': '/dev/fake4',
|
|
'ebs': {'no_device': True}},
|
|
{'device_name': '/dev/fake4',
|
|
'no_device': True}),
|
|
|
|
({'device_name': '/dev/fake5',
|
|
'virtual_name': 'ephemeral0'},
|
|
{'device_name': '/dev/fake5',
|
|
'virtual_name': 'ephemeral0'}),
|
|
|
|
({'device_name': '/dev/fake6',
|
|
'virtual_name': 'swap'},
|
|
{'device_name': '/dev/fake6',
|
|
'virtual_name': 'swap'}),
|
|
]
|
|
self._assertApply(cloud._parse_block_device_mapping, bdm_list)
|
|
|
|
def test_format_block_device_mapping(self):
|
|
bdm_list = [
|
|
({'device_name': '/dev/fake0',
|
|
'snapshot_id': 0x12345678,
|
|
'volume_size': 1,
|
|
'delete_on_termination': True},
|
|
{'deviceName': '/dev/fake0',
|
|
'ebs': {'snapshotId': 'snap-12345678',
|
|
'volumeSize': 1,
|
|
'deleteOnTermination': True}}),
|
|
|
|
({'device_name': '/dev/fake1',
|
|
'snapshot_id': 0x23456789},
|
|
{'deviceName': '/dev/fake1',
|
|
'ebs': {'snapshotId': 'snap-23456789'}}),
|
|
|
|
({'device_name': '/dev/fake2',
|
|
'snapshot_id': 0x23456789,
|
|
'delete_on_termination': False},
|
|
{'deviceName': '/dev/fake2',
|
|
'ebs': {'snapshotId': 'snap-23456789',
|
|
'deleteOnTermination': False}}),
|
|
|
|
({'device_name': '/dev/fake3',
|
|
'volume_id': 0x12345678,
|
|
'volume_size': 1,
|
|
'delete_on_termination': True},
|
|
{'deviceName': '/dev/fake3',
|
|
'ebs': {'snapshotId': 'vol-12345678',
|
|
'volumeSize': 1,
|
|
'deleteOnTermination': True}}),
|
|
|
|
({'device_name': '/dev/fake4',
|
|
'volume_id': 0x23456789},
|
|
{'deviceName': '/dev/fake4',
|
|
'ebs': {'snapshotId': 'vol-23456789'}}),
|
|
|
|
({'device_name': '/dev/fake5',
|
|
'volume_id': 0x23456789,
|
|
'delete_on_termination': False},
|
|
{'deviceName': '/dev/fake5',
|
|
'ebs': {'snapshotId': 'vol-23456789',
|
|
'deleteOnTermination': False}}),
|
|
]
|
|
self._assertApply(cloud._format_block_device_mapping, bdm_list)
|
|
|
|
def test_format_mapping(self):
|
|
properties = {
|
|
'mappings': [
|
|
{'virtual': 'ami',
|
|
'device': 'sda1'},
|
|
{'virtual': 'root',
|
|
'device': '/dev/sda1'},
|
|
|
|
{'virtual': 'swap',
|
|
'device': 'sdb1'},
|
|
{'virtual': 'swap',
|
|
'device': 'sdb2'},
|
|
{'virtual': 'swap',
|
|
'device': 'sdb3'},
|
|
{'virtual': 'swap',
|
|
'device': 'sdb4'},
|
|
|
|
{'virtual': 'ephemeral0',
|
|
'device': 'sdc1'},
|
|
{'virtual': 'ephemeral1',
|
|
'device': 'sdc2'},
|
|
{'virtual': 'ephemeral2',
|
|
'device': 'sdc3'},
|
|
],
|
|
|
|
'block_device_mapping': [
|
|
# root
|
|
{'device_name': '/dev/sda1',
|
|
'snapshot_id': 0x12345678,
|
|
'delete_on_termination': False},
|
|
|
|
|
|
# overwrite swap
|
|
{'device_name': '/dev/sdb2',
|
|
'snapshot_id': 0x23456789,
|
|
'delete_on_termination': False},
|
|
{'device_name': '/dev/sdb3',
|
|
'snapshot_id': 0x3456789A},
|
|
{'device_name': '/dev/sdb4',
|
|
'no_device': True},
|
|
|
|
# overwrite ephemeral
|
|
{'device_name': '/dev/sdc2',
|
|
'snapshot_id': 0x3456789A,
|
|
'delete_on_termination': False},
|
|
{'device_name': '/dev/sdc3',
|
|
'snapshot_id': 0x456789AB},
|
|
{'device_name': '/dev/sdc4',
|
|
'no_device': True},
|
|
|
|
# volume
|
|
{'device_name': '/dev/sdd1',
|
|
'snapshot_id': 0x87654321,
|
|
'delete_on_termination': False},
|
|
{'device_name': '/dev/sdd2',
|
|
'snapshot_id': 0x98765432},
|
|
{'device_name': '/dev/sdd3',
|
|
'snapshot_id': 0xA9875463},
|
|
{'device_name': '/dev/sdd4',
|
|
'no_device': True}]}
|
|
|
|
expected_result = {
|
|
'blockDeviceMapping': [
|
|
# root
|
|
{'deviceName': '/dev/sda1',
|
|
'ebs': {'snapshotId': 'snap-12345678',
|
|
'deleteOnTermination': False}},
|
|
|
|
# swap
|
|
{'deviceName': '/dev/sdb1',
|
|
'virtualName': 'swap'},
|
|
{'deviceName': '/dev/sdb2',
|
|
'ebs': {'snapshotId': 'snap-23456789',
|
|
'deleteOnTermination': False}},
|
|
{'deviceName': '/dev/sdb3',
|
|
'ebs': {'snapshotId': 'snap-3456789a'}},
|
|
|
|
# ephemeral
|
|
{'deviceName': '/dev/sdc1',
|
|
'virtualName': 'ephemeral0'},
|
|
{'deviceName': '/dev/sdc2',
|
|
'ebs': {'snapshotId': 'snap-3456789a',
|
|
'deleteOnTermination': False}},
|
|
{'deviceName': '/dev/sdc3',
|
|
'ebs': {'snapshotId': 'snap-456789ab'}},
|
|
|
|
# volume
|
|
{'deviceName': '/dev/sdd1',
|
|
'ebs': {'snapshotId': 'snap-87654321',
|
|
'deleteOnTermination': False}},
|
|
{'deviceName': '/dev/sdd2',
|
|
'ebs': {'snapshotId': 'snap-98765432'}},
|
|
{'deviceName': '/dev/sdd3',
|
|
'ebs': {'snapshotId': 'snap-a9875463'}}]}
|
|
|
|
result = {}
|
|
cloud._format_mappings(properties, result)
|
|
print result
|
|
self.assertEqual(result['blockDeviceMapping'].sort(),
|
|
expected_result['blockDeviceMapping'].sort())
|