Merge "Fix block_device_mapping on compute creation"
This commit is contained in:
commit
5032dbdf08
|
@ -133,9 +133,7 @@ class Controller(ooi.api.base.Controller):
|
||||||
l.get("target"),
|
l.get("target"),
|
||||||
storage.StorageResource.kind)
|
storage.StorageResource.kind)
|
||||||
mapping = {
|
mapping = {
|
||||||
"source_type": "volume",
|
"volume_id": vol_id,
|
||||||
"uuid": vol_id,
|
|
||||||
"delete_on_termination": False,
|
|
||||||
}
|
}
|
||||||
try:
|
try:
|
||||||
device_name = l['attributes']['occi.storagelink.deviceid']
|
device_name = l['attributes']['occi.storagelink.deviceid']
|
||||||
|
@ -143,16 +141,6 @@ class Controller(ooi.api.base.Controller):
|
||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
mappings.append(mapping)
|
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
|
return mappings
|
||||||
|
|
||||||
def _get_network_from_req(self, req, obj):
|
def _get_network_from_req(self, req, obj):
|
||||||
|
@ -237,7 +225,7 @@ class Controller(ooi.api.base.Controller):
|
||||||
self.os_helper.keypair_create(req, key_name,
|
self.os_helper.keypair_create(req, key_name,
|
||||||
public_key=key_data)
|
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)
|
networks = self._get_network_from_req(req, obj)
|
||||||
server = self.os_helper.create_server(
|
server = self.os_helper.create_server(
|
||||||
req,
|
req,
|
||||||
|
@ -246,7 +234,7 @@ class Controller(ooi.api.base.Controller):
|
||||||
flavor,
|
flavor,
|
||||||
user_data=user_data,
|
user_data=user_data,
|
||||||
key_name=key_name,
|
key_name=key_name,
|
||||||
block_device_mapping_v2=block_device_mapping_v2,
|
block_device_mapping=block_device_mapping,
|
||||||
networks=networks
|
networks=networks
|
||||||
)
|
)
|
||||||
# The returned JSON does not contain the server name
|
# The returned JSON does not contain the server name
|
||||||
|
|
|
@ -348,7 +348,7 @@ class OpenStackHelper(BaseHelper):
|
||||||
def _get_create_server_req(self, req, name, image, flavor,
|
def _get_create_server_req(self, req, name, image, flavor,
|
||||||
user_data=None,
|
user_data=None,
|
||||||
key_name=None,
|
key_name=None,
|
||||||
block_device_mapping_v2=None,
|
block_device_mapping=None,
|
||||||
networks=None):
|
networks=None):
|
||||||
tenant_id = self.tenant_from_req(req)
|
tenant_id = self.tenant_from_req(req)
|
||||||
path = "/%s/servers" % tenant_id
|
path = "/%s/servers" % tenant_id
|
||||||
|
@ -364,8 +364,8 @@ class OpenStackHelper(BaseHelper):
|
||||||
body["server"]["user_data"] = user_data
|
body["server"]["user_data"] = user_data
|
||||||
if key_name is not None:
|
if key_name is not None:
|
||||||
body["server"]["key_name"] = key_name
|
body["server"]["key_name"] = key_name
|
||||||
if block_device_mapping_v2:
|
if block_device_mapping:
|
||||||
body["server"]["block_device_mapping_v2"] = block_device_mapping_v2
|
body["server"]["block_device_mapping"] = block_device_mapping
|
||||||
if networks:
|
if networks:
|
||||||
body["server"]["networks"] = networks
|
body["server"]["networks"] = networks
|
||||||
|
|
||||||
|
@ -377,7 +377,7 @@ class OpenStackHelper(BaseHelper):
|
||||||
|
|
||||||
def create_server(self, req, name, image, flavor,
|
def create_server(self, req, name, image, flavor,
|
||||||
user_data=None, key_name=None,
|
user_data=None, key_name=None,
|
||||||
block_device_mapping_v2=None,
|
block_device_mapping=None,
|
||||||
networks=None):
|
networks=None):
|
||||||
"""Create a server.
|
"""Create a server.
|
||||||
|
|
||||||
|
@ -395,7 +395,7 @@ class OpenStackHelper(BaseHelper):
|
||||||
flavor,
|
flavor,
|
||||||
user_data=user_data,
|
user_data=user_data,
|
||||||
key_name=key_name,
|
key_name=key_name,
|
||||||
block_device_mapping_v2=block_device_mapping_v2,
|
block_device_mapping=block_device_mapping,
|
||||||
networks=networks)
|
networks=networks)
|
||||||
response = req.get_response(self.app)
|
response = req.get_response(self.app)
|
||||||
# We only get one server
|
# We only get one server
|
||||||
|
|
|
@ -332,7 +332,7 @@ class TestComputeController(base.TestController):
|
||||||
m_create.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
|
m_create.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
|
||||||
user_data=None,
|
user_data=None,
|
||||||
key_name=None,
|
key_name=None,
|
||||||
block_device_mapping_v2=[],
|
block_device_mapping=[],
|
||||||
networks=net)
|
networks=net)
|
||||||
|
|
||||||
@mock.patch.object(helpers.OpenStackHelper, "create_server")
|
@mock.patch.object(helpers.OpenStackHelper, "create_server")
|
||||||
|
@ -368,7 +368,7 @@ class TestComputeController(base.TestController):
|
||||||
m_create.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
|
m_create.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
|
||||||
user_data="bazonk",
|
user_data="bazonk",
|
||||||
key_name=None,
|
key_name=None,
|
||||||
block_device_mapping_v2=[],
|
block_device_mapping=[],
|
||||||
networks=net)
|
networks=net)
|
||||||
|
|
||||||
@mock.patch.object(helpers.OpenStackHelper, "create_server")
|
@mock.patch.object(helpers.OpenStackHelper, "create_server")
|
||||||
|
@ -404,7 +404,7 @@ class TestComputeController(base.TestController):
|
||||||
m_create.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
|
m_create.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
|
||||||
user_data="bazonk",
|
user_data="bazonk",
|
||||||
key_name=None,
|
key_name=None,
|
||||||
block_device_mapping_v2=[],
|
block_device_mapping=[],
|
||||||
networks=net)
|
networks=net)
|
||||||
|
|
||||||
@mock.patch("ooi.occi.validator.Validator")
|
@mock.patch("ooi.occi.validator.Validator")
|
||||||
|
@ -463,7 +463,7 @@ class TestComputeController(base.TestController):
|
||||||
m_server.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
|
m_server.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
|
||||||
user_data=None,
|
user_data=None,
|
||||||
key_name="wtfoo",
|
key_name="wtfoo",
|
||||||
block_device_mapping_v2=[],
|
block_device_mapping=[],
|
||||||
networks=net)
|
networks=net)
|
||||||
|
|
||||||
@mock.patch.object(helpers.OpenStackHelper, "keypair_delete")
|
@mock.patch.object(helpers.OpenStackHelper, "keypair_delete")
|
||||||
|
@ -502,7 +502,7 @@ class TestComputeController(base.TestController):
|
||||||
m_server.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
|
m_server.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
|
||||||
user_data=None,
|
user_data=None,
|
||||||
key_name=mock.ANY,
|
key_name=mock.ANY,
|
||||||
block_device_mapping_v2=[],
|
block_device_mapping=[],
|
||||||
networks=net)
|
networks=net)
|
||||||
m_keypair_delete.assert_called_with(mock.ANY, mock.ANY)
|
m_keypair_delete.assert_called_with(mock.ANY, mock.ANY)
|
||||||
|
|
||||||
|
@ -542,7 +542,7 @@ class TestComputeController(base.TestController):
|
||||||
m_server.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
|
m_server.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
|
||||||
user_data=None,
|
user_data=None,
|
||||||
key_name=mock.ANY,
|
key_name=mock.ANY,
|
||||||
block_device_mapping_v2=[],
|
block_device_mapping=[],
|
||||||
networks=net)
|
networks=net)
|
||||||
m_keypair_delete.assert_called_with(mock.ANY, mock.ANY)
|
m_keypair_delete.assert_called_with(mock.ANY, mock.ANY)
|
||||||
|
|
||||||
|
@ -578,45 +578,24 @@ class TestComputeController(base.TestController):
|
||||||
|
|
||||||
@mock.patch("ooi.api.helpers.get_id_with_kind")
|
@mock.patch("ooi.api.helpers.get_id_with_kind")
|
||||||
def test_build_block_mapping(self, m_get_id):
|
def test_build_block_mapping(self, m_get_id):
|
||||||
vol_id = uuid.uuid4().hex
|
vol_ids = [uuid.uuid4().hex, uuid.uuid4().hex]
|
||||||
image_id = uuid.uuid4().hex
|
|
||||||
obj = {
|
obj = {
|
||||||
"links": {
|
"links": {
|
||||||
"http://schemas.ogf.org/occi/infrastructure#storage": [
|
"http://schemas.ogf.org/occi/infrastructure#storage":
|
||||||
{
|
[{"id": i, "target": v} for i, v in enumerate(vol_ids)]
|
||||||
"id": "l1",
|
|
||||||
"target": vol_id,
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"schemes": {
|
|
||||||
templates.OpenStackOSTemplate.scheme: [image_id],
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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)
|
ret = self.controller._build_block_mapping(None, obj)
|
||||||
expected = [
|
expected = [{"volume_id": v} for v in vol_ids]
|
||||||
{
|
|
||||||
"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,
|
|
||||||
}
|
|
||||||
]
|
|
||||||
self.assertEqual(expected, ret)
|
self.assertEqual(expected, ret)
|
||||||
m_get_id.assert_called_with(None, vol_id,
|
m_get_id.assert_has_calls(
|
||||||
occi_storage.StorageResource.kind)
|
[mock.call(None, v, occi_storage.StorageResource.kind)
|
||||||
|
for v in vol_ids])
|
||||||
|
|
||||||
@mock.patch("ooi.api.helpers.get_id_with_kind")
|
@mock.patch("ooi.api.helpers.get_id_with_kind")
|
||||||
def test_build_block_mapping_device_id(self, m_get_id):
|
def test_build_block_mapping_device_id(self, m_get_id):
|
||||||
vol_id = uuid.uuid4().hex
|
vol_id = uuid.uuid4().hex
|
||||||
image_id = uuid.uuid4().hex
|
|
||||||
obj = {
|
obj = {
|
||||||
"links": {
|
"links": {
|
||||||
"http://schemas.ogf.org/occi/infrastructure#storage": [
|
"http://schemas.ogf.org/occi/infrastructure#storage": [
|
||||||
|
@ -628,25 +607,13 @@ class TestComputeController(base.TestController):
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
|
||||||
"schemes": {
|
|
||||||
templates.OpenStackOSTemplate.scheme: [image_id],
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_get_id.return_value = (None, vol_id)
|
m_get_id.return_value = (None, vol_id)
|
||||||
ret = self.controller._build_block_mapping(None, obj)
|
ret = self.controller._build_block_mapping(None, obj)
|
||||||
expected = [
|
expected = [
|
||||||
{
|
{
|
||||||
"source_type": "image",
|
"volume_id": vol_id,
|
||||||
"destination_type": "local",
|
|
||||||
"boot_index": 0,
|
|
||||||
"delete_on_termination": True,
|
|
||||||
"uuid": image_id,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"source_type": "volume",
|
|
||||||
"uuid": vol_id,
|
|
||||||
"delete_on_termination": False,
|
|
||||||
"device_name": "baz",
|
"device_name": "baz",
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -684,7 +651,7 @@ class TestComputeController(base.TestController):
|
||||||
m_server.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
|
m_server.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
|
||||||
user_data=None,
|
user_data=None,
|
||||||
key_name=mock.ANY,
|
key_name=mock.ANY,
|
||||||
block_device_mapping_v2="mapping",
|
block_device_mapping="mapping",
|
||||||
networks=net)
|
networks=net)
|
||||||
m_block.assert_called_with(req, obj)
|
m_block.assert_called_with(req, obj)
|
||||||
|
|
||||||
|
@ -786,7 +753,7 @@ class TestComputeController(base.TestController):
|
||||||
m_server.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
|
m_server.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
|
||||||
user_data=None,
|
user_data=None,
|
||||||
key_name=mock.ANY,
|
key_name=mock.ANY,
|
||||||
block_device_mapping_v2=[],
|
block_device_mapping=[],
|
||||||
networks=net)
|
networks=net)
|
||||||
m_net.assert_called_with(req, obj)
|
m_net.assert_called_with(req, obj)
|
||||||
|
|
||||||
|
@ -818,6 +785,6 @@ class TestComputeController(base.TestController):
|
||||||
m_server.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
|
m_server.assert_called_with(mock.ANY, "foo instance", "foo", "bar",
|
||||||
user_data=None,
|
user_data=None,
|
||||||
key_name=mock.ANY,
|
key_name=mock.ANY,
|
||||||
block_device_mapping_v2=[],
|
block_device_mapping=[],
|
||||||
networks=net)
|
networks=net)
|
||||||
m_net.assert_called_with(req, obj)
|
m_net.assert_called_with(req, obj)
|
||||||
|
|
|
@ -632,11 +632,11 @@ class TestOpenStackHelper(TestBaseHelper):
|
||||||
ret = self.helper.create_server(None, name, image, flavor,
|
ret = self.helper.create_server(None, name, image, flavor,
|
||||||
user_data=user_data,
|
user_data=user_data,
|
||||||
key_name=key_name,
|
key_name=key_name,
|
||||||
block_device_mapping_v2=bdm,
|
block_device_mapping=bdm,
|
||||||
networks=None)
|
networks=None)
|
||||||
self.assertEqual("FOO", ret)
|
self.assertEqual("FOO", ret)
|
||||||
m.assert_called_with(None, name, image, flavor, user_data=user_data,
|
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)
|
networks=None)
|
||||||
|
|
||||||
@mock.patch("ooi.api.helpers.exception_from_response")
|
@mock.patch("ooi.api.helpers.exception_from_response")
|
||||||
|
@ -662,9 +662,9 @@ class TestOpenStackHelper(TestBaseHelper):
|
||||||
flavor,
|
flavor,
|
||||||
user_data=user_data,
|
user_data=user_data,
|
||||||
key_name=key_name,
|
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,
|
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)
|
networks=None)
|
||||||
m_exc.assert_called_with(resp)
|
m_exc.assert_called_with(resp)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue