Fix block_device_mapping on compute creation

Use block_device_mapping instead of block_device_mapping_v2 that seems
to not attach properly volumes on creation. This legacy option is enough
to support the requested use case (attaching volumes on boot).

Change-Id: I39f17faec6a48e90740e5e4757c1278df0b9830c
Closes-bug: #1679498
This commit is contained in:
Enol Fernandez 2017-04-04 07:50:18 +01:00
parent 2e6c6b22c0
commit 571cca3752
4 changed files with 30 additions and 75 deletions

View File

@ -111,9 +111,7 @@ class Controller(ooi.api.base.Controller):
l.get("target"),
storage.StorageResource.kind)
mapping = {
"source_type": "volume",
"uuid": vol_id,
"delete_on_termination": False,
"volume_id": vol_id,
}
try:
device_name = l['attributes']['occi.storagelink.deviceid']
@ -121,16 +119,6 @@ class Controller(ooi.api.base.Controller):
except KeyError:
pass
mappings.append(mapping)
# this needs to be there if we have a mapping
if mappings:
image = obj["schemes"][templates.OpenStackOSTemplate.scheme][0]
mappings.insert(0, {
"source_type": "image",
"destination_type": "local",
"boot_index": 0,
"delete_on_termination": True,
"uuid": image,
})
return mappings
def _get_network_from_req(self, req, obj):
@ -215,7 +203,7 @@ class Controller(ooi.api.base.Controller):
self.os_helper.keypair_create(req, key_name,
public_key=key_data)
block_device_mapping_v2 = self._build_block_mapping(req, obj)
block_device_mapping = self._build_block_mapping(req, obj)
networks = self._get_network_from_req(req, obj)
server = self.os_helper.create_server(
req,
@ -224,7 +212,7 @@ class Controller(ooi.api.base.Controller):
flavor,
user_data=user_data,
key_name=key_name,
block_device_mapping_v2=block_device_mapping_v2,
block_device_mapping=block_device_mapping,
networks=networks
)
# The returned JSON does not contain the server name

View File

@ -342,7 +342,7 @@ class OpenStackHelper(BaseHelper):
def _get_create_server_req(self, req, name, image, flavor,
user_data=None,
key_name=None,
block_device_mapping_v2=None,
block_device_mapping=None,
networks=None):
tenant_id = self.tenant_from_req(req)
path = "/%s/servers" % tenant_id
@ -358,8 +358,8 @@ class OpenStackHelper(BaseHelper):
body["server"]["user_data"] = user_data
if key_name is not None:
body["server"]["key_name"] = key_name
if block_device_mapping_v2:
body["server"]["block_device_mapping_v2"] = block_device_mapping_v2
if block_device_mapping:
body["server"]["block_device_mapping"] = block_device_mapping
if networks:
body["server"]["networks"] = networks
@ -371,7 +371,7 @@ class OpenStackHelper(BaseHelper):
def create_server(self, req, name, image, flavor,
user_data=None, key_name=None,
block_device_mapping_v2=None,
block_device_mapping=None,
networks=None):
"""Create a server.
@ -389,7 +389,7 @@ class OpenStackHelper(BaseHelper):
flavor,
user_data=user_data,
key_name=key_name,
block_device_mapping_v2=block_device_mapping_v2,
block_device_mapping=block_device_mapping,
networks=networks)
response = req.get_response(self.app)
# We only get one server

View File

@ -284,7 +284,7 @@ class TestComputeController(base.TestController):
m_create.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
user_data=None,
key_name=None,
block_device_mapping_v2=[],
block_device_mapping=[],
networks=net)
@mock.patch.object(helpers.OpenStackHelper, "create_server")
@ -320,7 +320,7 @@ class TestComputeController(base.TestController):
m_create.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
user_data="bazonk",
key_name=None,
block_device_mapping_v2=[],
block_device_mapping=[],
networks=net)
@mock.patch.object(helpers.OpenStackHelper, "create_server")
@ -356,7 +356,7 @@ class TestComputeController(base.TestController):
m_create.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
user_data="bazonk",
key_name=None,
block_device_mapping_v2=[],
block_device_mapping=[],
networks=net)
@mock.patch("ooi.occi.validator.Validator")
@ -415,7 +415,7 @@ class TestComputeController(base.TestController):
m_server.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
user_data=None,
key_name="wtfoo",
block_device_mapping_v2=[],
block_device_mapping=[],
networks=net)
@mock.patch.object(helpers.OpenStackHelper, "keypair_delete")
@ -454,7 +454,7 @@ class TestComputeController(base.TestController):
m_server.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
user_data=None,
key_name=mock.ANY,
block_device_mapping_v2=[],
block_device_mapping=[],
networks=net)
m_keypair_delete.assert_called_with(mock.ANY, mock.ANY)
@ -494,7 +494,7 @@ class TestComputeController(base.TestController):
m_server.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
user_data=None,
key_name=mock.ANY,
block_device_mapping_v2=[],
block_device_mapping=[],
networks=net)
m_keypair_delete.assert_called_with(mock.ANY, mock.ANY)
@ -530,45 +530,24 @@ class TestComputeController(base.TestController):
@mock.patch("ooi.api.helpers.get_id_with_kind")
def test_build_block_mapping(self, m_get_id):
vol_id = uuid.uuid4().hex
image_id = uuid.uuid4().hex
vol_ids = [uuid.uuid4().hex, uuid.uuid4().hex]
obj = {
"links": {
"http://schemas.ogf.org/occi/infrastructure#storage": [
{
"id": "l1",
"target": vol_id,
}
]
},
"schemes": {
templates.OpenStackOSTemplate.scheme: [image_id],
"http://schemas.ogf.org/occi/infrastructure#storage":
[{"id": i, "target": v} for i, v in enumerate(vol_ids)]
}
}
m_get_id.return_value = (None, vol_id)
m_get_id.side_effect = [(None, v) for v in vol_ids]
ret = self.controller._build_block_mapping(None, obj)
expected = [
{
"source_type": "image",
"destination_type": "local",
"boot_index": 0,
"delete_on_termination": True,
"uuid": image_id,
},
{
"source_type": "volume",
"uuid": vol_id,
"delete_on_termination": False,
}
]
expected = [{"volume_id": v} for v in vol_ids]
self.assertEqual(expected, ret)
m_get_id.assert_called_with(None, vol_id,
occi_storage.StorageResource.kind)
m_get_id.assert_has_calls(
[mock.call(None, v, occi_storage.StorageResource.kind)
for v in vol_ids])
@mock.patch("ooi.api.helpers.get_id_with_kind")
def test_build_block_mapping_device_id(self, m_get_id):
vol_id = uuid.uuid4().hex
image_id = uuid.uuid4().hex
obj = {
"links": {
"http://schemas.ogf.org/occi/infrastructure#storage": [
@ -580,25 +559,13 @@ class TestComputeController(base.TestController):
}
}
]
},
"schemes": {
templates.OpenStackOSTemplate.scheme: [image_id],
}
}
m_get_id.return_value = (None, vol_id)
ret = self.controller._build_block_mapping(None, obj)
expected = [
{
"source_type": "image",
"destination_type": "local",
"boot_index": 0,
"delete_on_termination": True,
"uuid": image_id,
},
{
"source_type": "volume",
"uuid": vol_id,
"delete_on_termination": False,
"volume_id": vol_id,
"device_name": "baz",
}
]
@ -636,7 +603,7 @@ class TestComputeController(base.TestController):
m_server.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
user_data=None,
key_name=mock.ANY,
block_device_mapping_v2="mapping",
block_device_mapping="mapping",
networks=net)
m_block.assert_called_with(req, obj)
@ -738,7 +705,7 @@ class TestComputeController(base.TestController):
m_server.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
user_data=None,
key_name=mock.ANY,
block_device_mapping_v2=[],
block_device_mapping=[],
networks=net)
m_net.assert_called_with(req, obj)
@ -770,6 +737,6 @@ class TestComputeController(base.TestController):
m_server.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
user_data=None,
key_name=mock.ANY,
block_device_mapping_v2=[],
block_device_mapping=[],
networks=net)
m_net.assert_called_with(req, obj)

View File

@ -632,11 +632,11 @@ class TestOpenStackHelper(TestBaseHelper):
ret = self.helper.create_server(None, name, image, flavor,
user_data=user_data,
key_name=key_name,
block_device_mapping_v2=bdm,
block_device_mapping=bdm,
networks=None)
self.assertEqual("FOO", ret)
m.assert_called_with(None, name, image, flavor, user_data=user_data,
key_name=key_name, block_device_mapping_v2=bdm,
key_name=key_name, block_device_mapping=bdm,
networks=None)
@mock.patch("ooi.api.helpers.exception_from_response")
@ -662,9 +662,9 @@ class TestOpenStackHelper(TestBaseHelper):
flavor,
user_data=user_data,
key_name=key_name,
block_device_mapping_v2=bdm)
block_device_mapping=bdm)
m.assert_called_with(None, name, image, flavor, user_data=user_data,
key_name=key_name, block_device_mapping_v2=bdm,
key_name=key_name, block_device_mapping=bdm,
networks=None)
m_exc.assert_called_with(resp)