Do not crash on volume attachments without device

Sometimes OpenStack does not return any device in the attached volumes, this
change avoids a KeyError when not defined.

Change-Id: If96fa02a7d6fd93e31667b2481943c6294173f72
Closes-Bug: #1663491
This commit is contained in:
Enol Fernandez 2017-02-13 07:09:55 +00:00
parent bb194c3e8e
commit a8cfcb58e8
4 changed files with 28 additions and 7 deletions

View File

@ -268,7 +268,8 @@ class Controller(ooi.api.base.Controller):
for v in vols: for v in vols:
st = storage.StorageResource(title="storage", id=v["volumeId"]) st = storage.StorageResource(title="storage", id=v["volumeId"])
comp.add_link(storage_link.StorageLink(comp, st, comp.add_link(storage_link.StorageLink(comp, st,
deviceid=v["device"])) deviceid=v.get("device",
None)))
# network links # network links
addresses = s.get("addresses", {}) addresses = s.get("addresses", {})

View File

@ -40,7 +40,8 @@ class Controller(base.Controller):
id=attach["serverId"]) id=attach["serverId"])
s = storage.StorageResource(title="Storage", id=v["id"]) s = storage.StorageResource(title="Storage", id=v["id"])
l = storage_link.StorageLink(c, s, l = storage_link.StorageLink(c, s,
deviceid=attach["device"]) deviceid=attach.get("device",
None))
occi_link_resources.append(l) occi_link_resources.append(l)
return collection.Collection(resources=occi_link_resources) return collection.Collection(resources=occi_link_resources)
@ -61,7 +62,7 @@ class Controller(base.Controller):
v = self._get_attachment_from_id(req, id) v = self._get_attachment_from_id(req, id)
c = compute.ComputeResource(title="Compute", id=v["serverId"]) c = compute.ComputeResource(title="Compute", id=v["serverId"])
s = storage.StorageResource(title="Storage", id=v["volumeId"]) s = storage.StorageResource(title="Storage", id=v["volumeId"])
return storage_link.StorageLink(c, s, deviceid=v["device"]) return storage_link.StorageLink(c, s, deviceid=v.get("device", None))
def create(self, req, body): def create(self, req, body):
parser = req.get_parser()(req.headers, req.body) parser = req.get_parser()(req.headers, req.body)

View File

@ -95,6 +95,12 @@ volumes = {
"size": 5, "size": 5,
"status": "in-use", "status": "in-use",
}, },
{
"id": uuid.uuid4().hex,
"displayName": "volume-nodev",
"size": 6,
"status": "in-use",
},
], ],
} }
@ -213,7 +219,8 @@ servers = {
"image": {"id": images["bar"]["id"]}, "image": {"id": images["bar"]["id"]},
"status": "ACTIVE", "status": "ACTIVE",
"os-extended-volumes:volumes_attached": [ "os-extended-volumes:volumes_attached": [
{"id": volumes[tenants["baz"]["id"]][0]["id"]} {"id": volumes[tenants["baz"]["id"]][0]["id"]},
{"id": volumes[tenants["baz"]["id"]][1]["id"]}
], ],
"addresses": { "addresses": {
"private": [ "private": [
@ -249,6 +256,15 @@ volumes[tenants["baz"]["id"]][0]["attachments"] = [{
"id": volumes[tenants["baz"]["id"]][0]["id"], "id": volumes[tenants["baz"]["id"]][0]["id"],
}] }]
volumes[tenants["baz"]["id"]][1]["attachments"] = [{
"server_id": servers[tenants["baz"]["id"]][0]["id"],
"serverId": servers[tenants["baz"]["id"]][0]["id"],
"attachment_id": uuid.uuid4().hex,
"volumeId": volumes[tenants["baz"]["id"]][1]["id"],
"volume_id": volumes[tenants["baz"]["id"]][1]["id"],
"id": volumes[tenants["baz"]["id"]][0]["id"],
}]
def fake_query_results(): def fake_query_results():
cats = [] cats = []

View File

@ -186,8 +186,11 @@ class TestComputeController(base.TestController):
flavor = fakes.flavors[server["flavor"]["id"]] flavor = fakes.flavors[server["flavor"]["id"]]
image = fakes.images[server["image"]["id"]] image = fakes.images[server["image"]["id"]]
volumes = fakes.volumes.get(tenant["id"], []) volumes = fakes.volumes.get(tenant["id"], [])
if volumes: attachments = []
volumes = volumes[0]["attachments"] for v in volumes:
for att in v["attachments"]:
if att["server_id"] == server["id"]:
attachments.append(att)
net_id = fakes.networks.get(tenant["id"], []) net_id = fakes.networks.get(tenant["id"], [])
if net_id: if net_id:
net_id = net_id[0]['id'] net_id = net_id[0]['id']
@ -195,7 +198,7 @@ class TestComputeController(base.TestController):
m_server.return_value = server m_server.return_value = server
m_flavor.return_value = flavor m_flavor.return_value = flavor
m_image.return_value = image m_image.return_value = image
m_vol.return_value = volumes m_vol.return_value = attachments
ret = self.controller.show(None, server["id"]) ret = self.controller.show(None, server["id"])
# FIXME(aloga): Should we test the resource? # FIXME(aloga): Should we test the resource?