Split the vol_id from a dev mapping

Add a split into the dev mapping to get the right vol_id.

Change-Id: I1a7bf6351491b1321c5ca0fa4a27f29825400eaf
Closes-Bug: #1514394
This commit is contained in:
xiexs 2015-11-10 02:39:28 -05:00
parent 6611f3781b
commit 8b23c2690c
3 changed files with 94 additions and 4 deletions
openstackclient
compute/v2
tests/compute/v2

@ -425,10 +425,17 @@ class CreateServer(show.ShowOne):
dev_key, dev_vol = dev_map.split('=', 1)
block_volume = None
if dev_vol:
block_volume = utils.find_resource(
volume_client.volumes,
dev_vol,
).id
vol = dev_vol.split(':', 1)[0]
if vol:
vol_id = utils.find_resource(
volume_client.volumes,
vol,
).id
block_volume = dev_vol.replace(vol, vol_id)
else:
msg = _("Volume name or ID must be specified if "
"--block-device-mapping is specified")
raise exceptions.CommandError(msg)
block_device_mapping.update({dev_key: block_volume})
nics = []

@ -20,6 +20,7 @@ from openstackclient.tests.identity.v2_0 import fakes as identity_fakes
from openstackclient.tests.image.v2 import fakes as image_fakes
from openstackclient.tests.network.v2 import fakes as network_fakes
from openstackclient.tests import utils
from openstackclient.tests.volume.v2 import fakes as volume_fakes
server_id = 'serv1'
@ -80,6 +81,8 @@ QUOTA = {
QUOTA_columns = tuple(sorted(QUOTA))
QUOTA_data = tuple(QUOTA[x] for x in sorted(QUOTA))
block_device_mapping = 'vda=' + volume_fakes.volume_name + ':::0'
class FakeComputev2Client(object):
def __init__(self, **kwargs):
@ -95,6 +98,8 @@ class FakeComputev2Client(object):
self.flavors.resource_class = fakes.FakeResource(None, {})
self.quotas = mock.Mock()
self.quotas.resource_class = fakes.FakeResource(None, {})
self.volumes = mock.Mock()
self.volumes.resource_class = fakes.FakeResource(None, {})
self.auth_token = kwargs['token']
self.management_url = kwargs['endpoint']
@ -122,3 +127,8 @@ class TestComputev2(utils.TestCommand):
endpoint=fakes.AUTH_URL,
token=fakes.AUTH_TOKEN,
)
self.app.client_manager.volume = volume_fakes.FakeVolumeClient(
endpoint=fakes.AUTH_URL,
token=fakes.AUTH_TOKEN,
)

@ -24,6 +24,7 @@ from openstackclient.tests.compute.v2 import fakes as compute_fakes
from openstackclient.tests import fakes
from openstackclient.tests.image.v2 import fakes as image_fakes
from openstackclient.tests import utils
from openstackclient.tests.volume.v2 import fakes as volume_fakes
class TestServer(compute_fakes.TestComputev2):
@ -47,6 +48,10 @@ class TestServer(compute_fakes.TestComputev2):
self.images_mock = self.app.client_manager.image.images
self.images_mock.reset_mock()
# Get a shortcut to the VolumeManager Mock
self.volumes_mock = self.app.client_manager.volume.volumes
self.volumes_mock.reset_mock()
class TestServerCreate(TestServer):
@ -80,6 +85,13 @@ class TestServerCreate(TestServer):
)
self.flavors_mock.get.return_value = self.flavor
self.volume = fakes.FakeResource(
None,
copy.deepcopy(volume_fakes.VOLUME),
loaded=True,
)
self.volumes_mock.get.return_value = self.volume
# Get the command object to test
self.cmd = server.CreateServer(self.app, None)
@ -289,6 +301,67 @@ class TestServerCreate(TestServer):
)
self.assertEqual(datalist, data)
def test_server_create_with_block_device_mapping(self):
arglist = [
'--image', 'image1',
'--flavor', compute_fakes.flavor_id,
'--block-device-mapping', compute_fakes.block_device_mapping,
compute_fakes.server_name,
]
verifylist = [
('image', 'image1'),
('flavor', compute_fakes.flavor_id),
('block_device_mapping', [compute_fakes.block_device_mapping]),
('config_drive', False),
('server_name', compute_fakes.server_name),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
# CreateServer.take_action() returns two tuples
columns, data = self.cmd.take_action(parsed_args)
real_volume_mapping = (
(compute_fakes.block_device_mapping.split('=', 1)[1]).replace(
volume_fakes.volume_name,
volume_fakes.volume_id))
# Set expected values
kwargs = dict(
meta=None,
files={},
reservation_id=None,
min_count=1,
max_count=1,
security_groups=[],
userdata=None,
key_name=None,
availability_zone=None,
block_device_mapping={
'vda': real_volume_mapping
},
nics=[],
scheduler_hints={},
config_drive=None,
)
# ServerManager.create(name, image, flavor, **kwargs)
self.servers_mock.create.assert_called_with(
compute_fakes.server_name,
self.image,
self.flavor,
**kwargs
)
collist = ('addresses', 'flavor', 'id', 'name', 'properties')
self.assertEqual(collist, columns)
datalist = (
'',
'Large ()',
compute_fakes.server_id,
compute_fakes.server_name,
'',
)
self.assertEqual(datalist, data)
class TestServerDelete(TestServer):