Return collections instead of object lists
Every time we need to return more than one object a collection should be used instead of a list of those objects. This allows to render the objects taking into account their context. If returning a single object controllers must return the object instead of a list. Change-Id: I0caa3334dbd14374f39bf41acf45528fc7befa45
This commit is contained in:
parent
43995a96dc
commit
38cccfe3c5
@ -264,7 +264,7 @@ class Controller(ooi.api.base.Controller):
|
|||||||
net_id = "FIXED"
|
net_id = "FIXED"
|
||||||
comp.add_link(_create_network_link(addr, comp, net_id))
|
comp.add_link(_create_network_link(addr, comp, net_id))
|
||||||
|
|
||||||
return [comp]
|
return comp
|
||||||
|
|
||||||
def _get_server_floating_ips(self, req, server_id):
|
def _get_server_floating_ips(self, req, server_id):
|
||||||
s = self.os_helper.get_server(req, server_id)
|
s = self.os_helper.get_server(req, server_id)
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
from ooi.api import base
|
from ooi.api import base
|
||||||
import ooi.api.helpers
|
import ooi.api.helpers
|
||||||
|
from ooi.occi.core import collection
|
||||||
from ooi.occi.core import entity
|
from ooi.occi.core import entity
|
||||||
from ooi.occi.core import link
|
from ooi.occi.core import link
|
||||||
from ooi.occi.core import resource
|
from ooi.occi.core import resource
|
||||||
@ -72,42 +73,46 @@ class Controller(base.Controller):
|
|||||||
return occi_ip_pools
|
return occi_ip_pools
|
||||||
|
|
||||||
def index(self, req):
|
def index(self, req):
|
||||||
l = []
|
|
||||||
# OCCI Core Kinds:
|
# OCCI Core Kinds:
|
||||||
l.append(entity.Entity.kind)
|
kinds = []
|
||||||
l.append(resource.Resource.kind)
|
actions = []
|
||||||
l.append(link.Link.kind)
|
mixins = []
|
||||||
|
kinds.append(entity.Entity.kind)
|
||||||
|
kinds.append(resource.Resource.kind)
|
||||||
|
kinds.append(link.Link.kind)
|
||||||
|
|
||||||
# OCCI infra Compute:
|
# OCCI infra Compute:
|
||||||
l.append(compute.ComputeResource.kind)
|
kinds.append(compute.ComputeResource.kind)
|
||||||
l.extend(compute.ComputeResource.actions)
|
actions.extend(compute.ComputeResource.actions)
|
||||||
|
|
||||||
# OCCI infra Storage
|
# OCCI infra Storage
|
||||||
l.append(storage.StorageResource.kind)
|
kinds.append(storage.StorageResource.kind)
|
||||||
l.append(storage_link.StorageLink.kind)
|
kinds.append(storage_link.StorageLink.kind)
|
||||||
l.extend(storage.StorageResource.actions)
|
actions.extend(storage.StorageResource.actions)
|
||||||
|
|
||||||
# OCCI infra network
|
# OCCI infra network
|
||||||
l.append(network.NetworkResource.kind)
|
kinds.append(network.NetworkResource.kind)
|
||||||
l.extend(network.NetworkResource.actions)
|
actions.extend(network.NetworkResource.actions)
|
||||||
if self.neutron_ooi_endpoint:
|
if self.neutron_ooi_endpoint:
|
||||||
l.append(os_network.neutron_network)
|
mixins.append(os_network.neutron_network)
|
||||||
l.append(network.ip_network)
|
mixins.append(network.ip_network)
|
||||||
l.append(network_link.NetworkInterface.kind)
|
kinds.append(network_link.NetworkInterface.kind)
|
||||||
l.append(network_link.ip_network_interface)
|
mixins.append(network_link.ip_network_interface)
|
||||||
|
|
||||||
# OCCI infra compute mixins
|
# OCCI infra compute mixins
|
||||||
l.append(infra_templates.os_tpl)
|
mixins.append(infra_templates.os_tpl)
|
||||||
l.append(infra_templates.resource_tpl)
|
mixins.append(infra_templates.resource_tpl)
|
||||||
|
|
||||||
# OpenStack flavors & images
|
# OpenStack flavors & images
|
||||||
l.extend(self._resource_tpls(req))
|
mixins.extend(self._resource_tpls(req))
|
||||||
l.extend(self._os_tpls(req))
|
mixins.extend(self._os_tpls(req))
|
||||||
|
|
||||||
# OpenStack Contextualization
|
# OpenStack Contextualization
|
||||||
l.append(contextualization.user_data)
|
mixins.append(contextualization.user_data)
|
||||||
l.append(contextualization.public_key)
|
mixins.append(contextualization.public_key)
|
||||||
|
|
||||||
# OpenStack Floating IP Pools
|
# OpenStack Floating IP Pools
|
||||||
l.extend(self._ip_pools(req))
|
mixins.extend(self._ip_pools(req))
|
||||||
return l
|
return collection.Collection(kinds=kinds,
|
||||||
|
mixins=mixins,
|
||||||
|
actions=actions)
|
||||||
|
@ -45,7 +45,7 @@ class Controller(base.Controller):
|
|||||||
state = helpers.vol_state(v["status"])
|
state = helpers.vol_state(v["status"])
|
||||||
st = storage.StorageResource(title=v["displayName"], id=v["id"],
|
st = storage.StorageResource(title=v["displayName"], id=v["id"],
|
||||||
size=v["size"], state=state)
|
size=v["size"], state=state)
|
||||||
return [st]
|
return st
|
||||||
|
|
||||||
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)
|
||||||
|
@ -61,7 +61,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["device"])
|
||||||
|
|
||||||
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)
|
||||||
|
@ -198,7 +198,7 @@ class TestComputeController(base.TestController):
|
|||||||
|
|
||||||
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?
|
||||||
self.assertIsInstance(ret[0], occi_compute.ComputeResource)
|
self.assertIsInstance(ret, occi_compute.ComputeResource)
|
||||||
m_server.assert_called_with(None, server["id"])
|
m_server.assert_called_with(None, server["id"])
|
||||||
m_flavor.assert_called_with(None, flavor["id"])
|
m_flavor.assert_called_with(None, flavor["id"])
|
||||||
m_image.assert_called_with(None, image["id"])
|
m_image.assert_called_with(None, image["id"])
|
||||||
@ -229,7 +229,7 @@ class TestComputeController(base.TestController):
|
|||||||
|
|
||||||
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?
|
||||||
self.assertIsInstance(ret[0], occi_compute.ComputeResource)
|
self.assertIsInstance(ret, occi_compute.ComputeResource)
|
||||||
m_server.assert_called_with(None, server["id"])
|
m_server.assert_called_with(None, server["id"])
|
||||||
m_flavor.assert_called_with(None, flavor["id"])
|
m_flavor.assert_called_with(None, flavor["id"])
|
||||||
m_image.assert_called_with(None, image["id"])
|
m_image.assert_called_with(None, image["id"])
|
||||||
|
@ -55,50 +55,51 @@ class TestQueryController(base.TestController):
|
|||||||
ip_pool = os_network.OSFloatingIPPool("foo")
|
ip_pool = os_network.OSFloatingIPPool("foo")
|
||||||
m_pools.return_value = [ip_pool]
|
m_pools.return_value = [ip_pool]
|
||||||
|
|
||||||
expected = [
|
expected_kinds = [
|
||||||
res_tpl,
|
|
||||||
os_tpl,
|
|
||||||
ip_pool,
|
|
||||||
# OCCI Core Kinds:
|
|
||||||
entity.Entity.kind,
|
entity.Entity.kind,
|
||||||
resource.Resource.kind,
|
resource.Resource.kind,
|
||||||
link.Link.kind,
|
link.Link.kind,
|
||||||
|
|
||||||
# OCCI infra Compute:
|
|
||||||
compute.ComputeResource.kind,
|
compute.ComputeResource.kind,
|
||||||
|
storage.StorageResource.kind,
|
||||||
|
storage_link.StorageLink.kind,
|
||||||
|
network.NetworkResource.kind,
|
||||||
|
network_link.NetworkInterface.kind,
|
||||||
|
]
|
||||||
|
|
||||||
|
expected_mixins = [
|
||||||
|
res_tpl,
|
||||||
|
os_tpl,
|
||||||
|
ip_pool,
|
||||||
|
network.ip_network,
|
||||||
|
network_link.ip_network_interface,
|
||||||
|
infra_templates.os_tpl,
|
||||||
|
infra_templates.resource_tpl,
|
||||||
|
contextualization.user_data,
|
||||||
|
contextualization.public_key,
|
||||||
|
]
|
||||||
|
|
||||||
|
expected_actions = [
|
||||||
compute.start,
|
compute.start,
|
||||||
compute.stop,
|
compute.stop,
|
||||||
compute.restart,
|
compute.restart,
|
||||||
compute.suspend,
|
compute.suspend,
|
||||||
|
|
||||||
# OCCI infra Storage
|
|
||||||
storage.StorageResource.kind,
|
|
||||||
storage_link.StorageLink.kind,
|
|
||||||
storage.online,
|
storage.online,
|
||||||
storage.offline,
|
storage.offline,
|
||||||
storage.backup,
|
storage.backup,
|
||||||
storage.snapshot,
|
storage.snapshot,
|
||||||
storage.resize,
|
storage.resize,
|
||||||
|
|
||||||
# OCCI infra network
|
|
||||||
network.NetworkResource.kind,
|
|
||||||
network.up,
|
network.up,
|
||||||
network.down,
|
network.down,
|
||||||
network.ip_network,
|
|
||||||
network_link.NetworkInterface.kind,
|
|
||||||
network_link.ip_network_interface,
|
|
||||||
|
|
||||||
# OCCI infra compute mixins
|
|
||||||
infra_templates.os_tpl,
|
|
||||||
infra_templates.resource_tpl,
|
|
||||||
|
|
||||||
# OpenStack Contextualization
|
|
||||||
contextualization.user_data,
|
|
||||||
contextualization.public_key,
|
|
||||||
]
|
]
|
||||||
|
|
||||||
ret = self.controller.index(req)
|
ret = self.controller.index(req)
|
||||||
self.assertItemsEqual(expected, ret)
|
self.assertItemsEqual(expected_kinds, ret.kinds)
|
||||||
|
self.assertItemsEqual(expected_mixins, ret.mixins)
|
||||||
|
self.assertItemsEqual(expected_actions, ret.actions)
|
||||||
|
self.assertEqual([], ret.resources)
|
||||||
|
self.assertEqual([], ret.links)
|
||||||
|
|
||||||
@mock.patch.object(query.Controller, "_os_tpls")
|
@mock.patch.object(query.Controller, "_os_tpls")
|
||||||
@mock.patch.object(query.Controller, "_resource_tpls")
|
@mock.patch.object(query.Controller, "_resource_tpls")
|
||||||
@ -120,51 +121,52 @@ class TestQueryController(base.TestController):
|
|||||||
ip_pool = os_network.OSFloatingIPPool("foo")
|
ip_pool = os_network.OSFloatingIPPool("foo")
|
||||||
m_pools.return_value = [ip_pool]
|
m_pools.return_value = [ip_pool]
|
||||||
|
|
||||||
expected = [
|
expected_kinds = [
|
||||||
res_tpl,
|
|
||||||
os_tpl,
|
|
||||||
ip_pool,
|
|
||||||
# OCCI Core Kinds:
|
|
||||||
entity.Entity.kind,
|
entity.Entity.kind,
|
||||||
resource.Resource.kind,
|
resource.Resource.kind,
|
||||||
link.Link.kind,
|
link.Link.kind,
|
||||||
|
|
||||||
# OCCI infra Compute:
|
|
||||||
compute.ComputeResource.kind,
|
compute.ComputeResource.kind,
|
||||||
|
storage.StorageResource.kind,
|
||||||
|
storage_link.StorageLink.kind,
|
||||||
|
network.NetworkResource.kind,
|
||||||
|
network_link.NetworkInterface.kind,
|
||||||
|
]
|
||||||
|
|
||||||
|
expected_mixins = [
|
||||||
|
res_tpl,
|
||||||
|
os_tpl,
|
||||||
|
ip_pool,
|
||||||
|
os_network.neutron_network,
|
||||||
|
network.ip_network,
|
||||||
|
network_link.ip_network_interface,
|
||||||
|
infra_templates.os_tpl,
|
||||||
|
infra_templates.resource_tpl,
|
||||||
|
contextualization.user_data,
|
||||||
|
contextualization.public_key,
|
||||||
|
]
|
||||||
|
|
||||||
|
expected_actions = [
|
||||||
compute.start,
|
compute.start,
|
||||||
compute.stop,
|
compute.stop,
|
||||||
compute.restart,
|
compute.restart,
|
||||||
compute.suspend,
|
compute.suspend,
|
||||||
|
|
||||||
# OCCI infra Storage
|
|
||||||
storage.StorageResource.kind,
|
|
||||||
storage_link.StorageLink.kind,
|
|
||||||
storage.online,
|
storage.online,
|
||||||
storage.offline,
|
storage.offline,
|
||||||
storage.backup,
|
storage.backup,
|
||||||
storage.snapshot,
|
storage.snapshot,
|
||||||
storage.resize,
|
storage.resize,
|
||||||
|
|
||||||
# OCCI infra network
|
|
||||||
network.NetworkResource.kind,
|
|
||||||
network.up,
|
network.up,
|
||||||
network.down,
|
network.down,
|
||||||
os_network.neutron_network,
|
|
||||||
network.ip_network,
|
|
||||||
network_link.NetworkInterface.kind,
|
|
||||||
network_link.ip_network_interface,
|
|
||||||
|
|
||||||
# OCCI infra compute mixins
|
|
||||||
infra_templates.os_tpl,
|
|
||||||
infra_templates.resource_tpl,
|
|
||||||
|
|
||||||
# OpenStack Contextualization
|
|
||||||
contextualization.user_data,
|
|
||||||
contextualization.public_key,
|
|
||||||
]
|
]
|
||||||
|
|
||||||
ret = neutron_controller.index(req)
|
ret = neutron_controller.index(req)
|
||||||
self.assertItemsEqual(expected, ret)
|
self.assertItemsEqual(expected_kinds, ret.kinds)
|
||||||
|
self.assertItemsEqual(expected_mixins, ret.mixins)
|
||||||
|
self.assertItemsEqual(expected_actions, ret.actions)
|
||||||
|
self.assertEqual([], ret.resources)
|
||||||
|
self.assertEqual([], ret.links)
|
||||||
|
|
||||||
@mock.patch.object(helpers.OpenStackHelper, "get_flavors")
|
@mock.patch.object(helpers.OpenStackHelper, "get_flavors")
|
||||||
def test_get_resource_tpls(self, m_get_flavors):
|
def test_get_resource_tpls(self, m_get_flavors):
|
||||||
|
@ -74,7 +74,7 @@ class TestStorageController(base.TestController):
|
|||||||
vols = fakes.volumes[tenant["id"]]
|
vols = fakes.volumes[tenant["id"]]
|
||||||
for idx, vol in enumerate(vols):
|
for idx, vol in enumerate(vols):
|
||||||
m_vol.return_value = vol
|
m_vol.return_value = vol
|
||||||
ret = self.controller.show(None, vol["id"])[0]
|
ret = self.controller.show(None, vol["id"])
|
||||||
self.assertIsInstance(ret, storage.StorageResource)
|
self.assertIsInstance(ret, storage.StorageResource)
|
||||||
self.assertEqual(vol["id"], ret.id)
|
self.assertEqual(vol["id"], ret.id)
|
||||||
self.assertEqual(vol["displayName"], ret.title)
|
self.assertEqual(vol["displayName"], ret.title)
|
||||||
|
@ -74,8 +74,7 @@ class TestStorageLinkController(base.TestController):
|
|||||||
"volumeId": vol_id,
|
"volumeId": vol_id,
|
||||||
"device": "/dev/sda",
|
"device": "/dev/sda",
|
||||||
}
|
}
|
||||||
ret = self.controller.show(None, link_id)
|
link = self.controller.show(None, link_id)
|
||||||
link = ret.pop()
|
|
||||||
self.assertIsInstance(link, storage_link.StorageLink)
|
self.assertIsInstance(link, storage_link.StorageLink)
|
||||||
self.assertIsInstance(link.source, compute.ComputeResource)
|
self.assertIsInstance(link.source, compute.ComputeResource)
|
||||||
self.assertIsInstance(link.target, storage.StorageResource)
|
self.assertIsInstance(link.target, storage.StorageResource)
|
||||||
|
Loading…
Reference in New Issue
Block a user