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:
parent
6611f3781b
commit
8b23c2690c
openstackclient
@ -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):
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user