Refactor of network
Removed the /network/floating/<pool> routes to only have /network/fixed and /network/public. This allows for faster build of the compute objects and does not remove relevant information to the user since the pools cannot be controlled from OCCI anyway. Change-Id: Ida9f3b3e1db676f13824b0de83639a23846058dc
This commit is contained in:
parent
4e139317ee
commit
a6d3a90fc6
@ -30,15 +30,12 @@ from ooi.openstack import network as os_network
|
|||||||
from ooi.openstack import templates
|
from ooi.openstack import templates
|
||||||
|
|
||||||
|
|
||||||
def _create_network_link(addr, comp, floating_ips):
|
def _create_network_link(addr, comp):
|
||||||
if addr["OS-EXT-IPS:type"] == "floating":
|
if addr["OS-EXT-IPS:type"] == "floating":
|
||||||
for ip in floating_ips:
|
net_id = network_api.FLOATING_PREFIX
|
||||||
if addr["addr"] == ip["ip"]:
|
|
||||||
net = network.NetworkResource(
|
|
||||||
title="network",
|
|
||||||
id="%s/%s" % (network_api.FLOATING_PREFIX, ip["pool"]))
|
|
||||||
else:
|
else:
|
||||||
net = network.NetworkResource(title="network", id="fixed")
|
net_id = network_api.FIXED_PREFIX
|
||||||
|
net = network.NetworkResource(title="network", id=net_id)
|
||||||
return os_network.OSNetworkInterface(comp, net,
|
return os_network.OSNetworkInterface(comp, net,
|
||||||
addr["OS-EXT-IPS-MAC:mac_addr"],
|
addr["OS-EXT-IPS-MAC:mac_addr"],
|
||||||
addr["addr"])
|
addr["addr"])
|
||||||
@ -173,11 +170,9 @@ class Controller(ooi.api.base.Controller):
|
|||||||
# network links
|
# network links
|
||||||
addresses = s.get("addresses", {})
|
addresses = s.get("addresses", {})
|
||||||
if addresses:
|
if addresses:
|
||||||
floating_ips = self.os_helper.get_floating_ips(req)
|
|
||||||
for addr_set in addresses.values():
|
for addr_set in addresses.values():
|
||||||
for addr in addr_set:
|
for addr in addr_set:
|
||||||
comp.add_link(_create_network_link(addr, comp,
|
comp.add_link(_create_network_link(addr, comp))
|
||||||
floating_ips))
|
|
||||||
|
|
||||||
return [comp]
|
return [comp]
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@ from ooi.occi.core import collection
|
|||||||
from ooi.occi.infrastructure import network
|
from ooi.occi.infrastructure import network
|
||||||
|
|
||||||
FLOATING_PREFIX = "floating"
|
FLOATING_PREFIX = "floating"
|
||||||
|
FIXED_PREFIX = "fixed"
|
||||||
|
|
||||||
|
|
||||||
def _build_network(name, prefix=None):
|
def _build_network(name, prefix=None):
|
||||||
@ -44,29 +45,21 @@ class Controller(base.Controller):
|
|||||||
|
|
||||||
def _floating_index(self, req):
|
def _floating_index(self, req):
|
||||||
pools = self.os_helper.get_floating_ip_pools(req)
|
pools = self.os_helper.get_floating_ip_pools(req)
|
||||||
|
|
||||||
occi_network_resources = []
|
occi_network_resources = []
|
||||||
for p in pools:
|
if pools:
|
||||||
occi_network_resources.append(_build_network(p["name"],
|
occi_network_resources.append(_build_network(FLOATING_PREFIX))
|
||||||
FLOATING_PREFIX))
|
|
||||||
return occi_network_resources
|
return occi_network_resources
|
||||||
|
|
||||||
def general_index(self, req):
|
|
||||||
occi_network_resources = self._floating_index(req)
|
|
||||||
occi_network_resources.append(_build_network("fixed"))
|
|
||||||
return collection.Collection(resources=occi_network_resources)
|
|
||||||
|
|
||||||
def index(self, req):
|
def index(self, req):
|
||||||
occi_network_resources = self._floating_index(req)
|
occi_network_resources = self._floating_index(req)
|
||||||
|
occi_network_resources.append(_build_network(FIXED_PREFIX))
|
||||||
return collection.Collection(resources=occi_network_resources)
|
return collection.Collection(resources=occi_network_resources)
|
||||||
|
|
||||||
def show_fixed(self, req):
|
|
||||||
return _build_network("fixed")
|
|
||||||
|
|
||||||
def show(self, req, id):
|
def show(self, req, id):
|
||||||
|
if id == FIXED_PREFIX:
|
||||||
|
return [_build_network(id)]
|
||||||
|
elif id == FLOATING_PREFIX:
|
||||||
pools = self.os_helper.get_floating_ip_pools(req)
|
pools = self.os_helper.get_floating_ip_pools(req)
|
||||||
|
if pools:
|
||||||
for p in pools:
|
return [_build_network(id)]
|
||||||
if p['name'] == id:
|
|
||||||
return [_build_network(p["name"], FLOATING_PREFIX)]
|
|
||||||
raise exception.NetworkNotFound(resource_id=id)
|
raise exception.NetworkNotFound(resource_id=id)
|
||||||
|
@ -126,12 +126,11 @@ class TestComputeController(base.TestController):
|
|||||||
self.assertEqual([], ret)
|
self.assertEqual([], ret)
|
||||||
m_run_action.assert_called_with(mock.ANY, action, server_uuid)
|
m_run_action.assert_called_with(mock.ANY, action, server_uuid)
|
||||||
|
|
||||||
@mock.patch.object(helpers.OpenStackHelper, "get_floating_ips")
|
|
||||||
@mock.patch.object(helpers.OpenStackHelper, "get_server_volumes_link")
|
@mock.patch.object(helpers.OpenStackHelper, "get_server_volumes_link")
|
||||||
@mock.patch.object(helpers.OpenStackHelper, "get_image")
|
@mock.patch.object(helpers.OpenStackHelper, "get_image")
|
||||||
@mock.patch.object(helpers.OpenStackHelper, "get_flavor")
|
@mock.patch.object(helpers.OpenStackHelper, "get_flavor")
|
||||||
@mock.patch.object(helpers.OpenStackHelper, "get_server")
|
@mock.patch.object(helpers.OpenStackHelper, "get_server")
|
||||||
def test_show(self, m_server, m_flavor, m_image, m_vol, m_ips):
|
def test_show(self, m_server, m_flavor, m_image, m_vol):
|
||||||
for tenant in fakes.tenants.values():
|
for tenant in fakes.tenants.values():
|
||||||
servers = fakes.servers[tenant["id"]]
|
servers = fakes.servers[tenant["id"]]
|
||||||
for server in servers:
|
for server in servers:
|
||||||
@ -140,13 +139,11 @@ class TestComputeController(base.TestController):
|
|||||||
volumes = fakes.volumes.get(tenant["id"], [])
|
volumes = fakes.volumes.get(tenant["id"], [])
|
||||||
if volumes:
|
if volumes:
|
||||||
volumes = volumes[0]["attachments"]
|
volumes = volumes[0]["attachments"]
|
||||||
floating_ips = fakes.floating_ips[tenant["id"]]
|
|
||||||
|
|
||||||
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 = volumes
|
||||||
m_ips.return_value = floating_ips
|
|
||||||
|
|
||||||
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?
|
||||||
@ -155,8 +152,6 @@ class TestComputeController(base.TestController):
|
|||||||
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"])
|
||||||
m_vol.assert_called_with(None, server["id"])
|
m_vol.assert_called_with(None, server["id"])
|
||||||
if server.get("addresses"):
|
|
||||||
m_ips.assert_called_with(None)
|
|
||||||
|
|
||||||
@mock.patch.object(helpers.OpenStackHelper, "create_server")
|
@mock.patch.object(helpers.OpenStackHelper, "create_server")
|
||||||
@mock.patch("ooi.occi.validator.Validator")
|
@mock.patch("ooi.occi.validator.Validator")
|
||||||
|
@ -42,22 +42,9 @@ class TestController(base.TestController):
|
|||||||
|
|
||||||
return webob.Request.blank(path, environ=environ, **kwargs)
|
return webob.Request.blank(path, environ=environ, **kwargs)
|
||||||
|
|
||||||
@mock.patch.object(network_api.Controller, "_floating_index")
|
|
||||||
def test_index(self, m_float):
|
|
||||||
res = network.NetworkResource(title="foo",
|
|
||||||
id="foo",
|
|
||||||
state="active",
|
|
||||||
mixins=[network.ip_network])
|
|
||||||
|
|
||||||
m_float.return_value = [res]
|
|
||||||
ret = self.controller.index(None)
|
|
||||||
self.assertIsInstance(ret, collection.Collection)
|
|
||||||
self.assertEqual(res, ret.resources[0])
|
|
||||||
m_float.assert_called_with(None)
|
|
||||||
|
|
||||||
@mock.patch("ooi.api.network._build_network")
|
@mock.patch("ooi.api.network._build_network")
|
||||||
@mock.patch.object(network_api.Controller, "_floating_index")
|
@mock.patch.object(network_api.Controller, "_floating_index")
|
||||||
def test_general_index(self, m_float, m_build):
|
def test_index(self, m_float, m_build):
|
||||||
res = network.NetworkResource(title="foo",
|
res = network.NetworkResource(title="foo",
|
||||||
id="foo",
|
id="foo",
|
||||||
state="active",
|
state="active",
|
||||||
@ -69,19 +56,12 @@ class TestController(base.TestController):
|
|||||||
|
|
||||||
m_float.return_value = [res]
|
m_float.return_value = [res]
|
||||||
m_build.return_value = res_fixed
|
m_build.return_value = res_fixed
|
||||||
ret = self.controller.general_index(None)
|
ret = self.controller.index(None)
|
||||||
self.assertIsInstance(ret, collection.Collection)
|
self.assertIsInstance(ret, collection.Collection)
|
||||||
self.assertEqual([res, res_fixed], ret.resources)
|
self.assertEqual([res, res_fixed], ret.resources)
|
||||||
m_float.assert_called_with(None)
|
m_float.assert_called_with(None)
|
||||||
m_build.assert_called_with("fixed")
|
m_build.assert_called_with("fixed")
|
||||||
|
|
||||||
def test_fixed(self):
|
|
||||||
ret = self.controller.show_fixed(None)
|
|
||||||
self.assertIsInstance(ret, network.NetworkResource)
|
|
||||||
self.assertEqual("fixed", ret.title)
|
|
||||||
self.assertEqual("fixed", ret.id)
|
|
||||||
self.assertEqual([network.ip_network], ret.mixins)
|
|
||||||
|
|
||||||
def test_build(self):
|
def test_build(self):
|
||||||
ret = network_api._build_network("foo")
|
ret = network_api._build_network("foo")
|
||||||
self.assertIsInstance(ret, network.NetworkResource)
|
self.assertIsInstance(ret, network.NetworkResource)
|
||||||
@ -100,14 +80,13 @@ class TestController(base.TestController):
|
|||||||
def test_show(self, m_pools):
|
def test_show(self, m_pools):
|
||||||
for tenant in fakes.tenants.values():
|
for tenant in fakes.tenants.values():
|
||||||
pools = fakes.pools[tenant["id"]]
|
pools = fakes.pools[tenant["id"]]
|
||||||
|
if not pools:
|
||||||
|
continue
|
||||||
m_pools.return_value = pools
|
m_pools.return_value = pools
|
||||||
for idx, pool in enumerate(pools):
|
ret = self.controller.show(None, "floating")[0]
|
||||||
pool = pools[0]
|
|
||||||
ret = self.controller.show(None, pool["name"])[0]
|
|
||||||
self.assertIsInstance(ret, network.NetworkResource)
|
self.assertIsInstance(ret, network.NetworkResource)
|
||||||
self.assertEqual(pool["name"], ret.title)
|
self.assertEqual("floating", ret.title)
|
||||||
self.assertEqual("%s/%s" % (network_api.FLOATING_PREFIX,
|
self.assertEqual("floating", ret.id)
|
||||||
pool["name"]), ret.id)
|
|
||||||
self.assertEqual([network.ip_network], ret.mixins)
|
self.assertEqual([network.ip_network], ret.mixins)
|
||||||
m_pools.assert_called_with(None)
|
m_pools.assert_called_with(None)
|
||||||
|
|
||||||
@ -121,12 +100,19 @@ class TestController(base.TestController):
|
|||||||
None, uuid.uuid4().hex)
|
None, uuid.uuid4().hex)
|
||||||
|
|
||||||
@mock.patch.object(helpers.OpenStackHelper, "get_floating_ip_pools")
|
@mock.patch.object(helpers.OpenStackHelper, "get_floating_ip_pools")
|
||||||
def test_show_empty(self, m_pools):
|
def test_show_empty_floating(self, m_pools):
|
||||||
|
m_pools.return_value = []
|
||||||
|
self.assertRaises(exception.NetworkNotFound,
|
||||||
|
self.controller.show,
|
||||||
|
None, "floating")
|
||||||
|
m_pools.assert_called_with(None)
|
||||||
|
|
||||||
|
@mock.patch.object(helpers.OpenStackHelper, "get_floating_ip_pools")
|
||||||
|
def test_show_non_existent(self, m_pools):
|
||||||
m_pools.return_value = []
|
m_pools.return_value = []
|
||||||
self.assertRaises(exception.NetworkNotFound,
|
self.assertRaises(exception.NetworkNotFound,
|
||||||
self.controller.show,
|
self.controller.show,
|
||||||
None, None)
|
None, None)
|
||||||
m_pools.assert_called_with(None)
|
|
||||||
|
|
||||||
@mock.patch.object(helpers.OpenStackHelper, "get_floating_ip_pools")
|
@mock.patch.object(helpers.OpenStackHelper, "get_floating_ip_pools")
|
||||||
def test_floating_ips(self, m_pools):
|
def test_floating_ips(self, m_pools):
|
||||||
@ -134,11 +120,11 @@ class TestController(base.TestController):
|
|||||||
pools = fakes.pools[tenant["id"]]
|
pools = fakes.pools[tenant["id"]]
|
||||||
m_pools.return_value = pools
|
m_pools.return_value = pools
|
||||||
ret = self.controller._floating_index(None)
|
ret = self.controller._floating_index(None)
|
||||||
self.assertEqual(len(pools), len(ret))
|
if pools:
|
||||||
for idx, el in enumerate(ret):
|
self.assertEqual(1, len(ret))
|
||||||
self.assertIsInstance(el, network.NetworkResource)
|
self.assertIsInstance(ret[0], network.NetworkResource)
|
||||||
self.assertEqual(pools[idx]["name"], el.title)
|
self.assertEqual("floating", ret[0].title)
|
||||||
self.assertEqual("%s/%s" % (network_api.FLOATING_PREFIX,
|
self.assertEqual("floating", ret[0].id)
|
||||||
pools[idx]["name"]), el.id)
|
else:
|
||||||
|
self.assertEqual(0, len(ret))
|
||||||
m_pools.assert_called_with(None)
|
m_pools.assert_called_with(None)
|
||||||
|
@ -329,8 +329,7 @@ class TestComputeController(test_middleware.TestMiddleware):
|
|||||||
if addr["OS-EXT-IPS:type"] == "fixed":
|
if addr["OS-EXT-IPS:type"] == "fixed":
|
||||||
net_id = "fixed"
|
net_id = "fixed"
|
||||||
else:
|
else:
|
||||||
name = fakes.pools[tenant["id"]][0]["name"]
|
net_id = "floating"
|
||||||
net_id = "floating/%s" % name
|
|
||||||
target = utils.join_url(self.application_url + "/",
|
target = utils.join_url(self.application_url + "/",
|
||||||
"network/%s" % net_id)
|
"network/%s" % net_id)
|
||||||
self.assertResultIncludesLink(link_id, source, target,
|
self.assertResultIncludesLink(link_id, source, target,
|
||||||
|
@ -23,7 +23,7 @@ from ooi.tests.middleware import test_middleware
|
|||||||
from ooi import utils
|
from ooi import utils
|
||||||
|
|
||||||
|
|
||||||
def build_occi_network(pool, floating=True):
|
def build_occi_network(pool_name):
|
||||||
cats = []
|
cats = []
|
||||||
cats.append('network; '
|
cats.append('network; '
|
||||||
'scheme="http://schemas.ogf.org/occi/infrastructure#"; '
|
'scheme="http://schemas.ogf.org/occi/infrastructure#"; '
|
||||||
@ -32,25 +32,20 @@ def build_occi_network(pool, floating=True):
|
|||||||
cats.append('ipnetwork; '
|
cats.append('ipnetwork; '
|
||||||
'scheme="http://schemas.ogf.org/occi/infrastructure/'
|
'scheme="http://schemas.ogf.org/occi/infrastructure/'
|
||||||
'network#"; class="mixin"; title="IP Networking Mixin"')
|
'network#"; class="mixin"; title="IP Networking Mixin"')
|
||||||
|
|
||||||
if floating:
|
|
||||||
pool_id = "floating/%s" % pool["name"]
|
|
||||||
else:
|
|
||||||
pool_id = pool["name"]
|
|
||||||
attrs = [
|
attrs = [
|
||||||
'occi.core.title="%s"' % pool["name"],
|
'occi.core.title="%s"' % pool_name,
|
||||||
'occi.network.state="active"',
|
'occi.network.state="active"',
|
||||||
'occi.core.id="%s"' % pool_id,
|
'occi.core.id="%s"' % pool_name,
|
||||||
]
|
]
|
||||||
links = []
|
links = []
|
||||||
links.append('<%s/network/%s?action=up>; '
|
links.append('<%s/network/%s?action=up>; '
|
||||||
'rel="http://schemas.ogf.org/occi/'
|
'rel="http://schemas.ogf.org/occi/'
|
||||||
'infrastructure/network/action#up"' %
|
'infrastructure/network/action#up"' %
|
||||||
(fakes.application_url, pool_id))
|
(fakes.application_url, pool_name))
|
||||||
links.append('<%s/network/%s?action=down>; '
|
links.append('<%s/network/%s?action=down>; '
|
||||||
'rel="http://schemas.ogf.org/occi/'
|
'rel="http://schemas.ogf.org/occi/'
|
||||||
'infrastructure/network/action#down"' %
|
'infrastructure/network/action#down"' %
|
||||||
(fakes.application_url, pool_id))
|
(fakes.application_url, pool_name))
|
||||||
result = []
|
result = []
|
||||||
for c in cats:
|
for c in cats:
|
||||||
result.append(("Category", c))
|
result.append(("Category", c))
|
||||||
@ -99,11 +94,11 @@ class TestNetworkController(test_middleware.TestMiddleware):
|
|||||||
("X-OCCI-Location",
|
("X-OCCI-Location",
|
||||||
utils.join_url(self.application_url + "/", "network/fixed"))
|
utils.join_url(self.application_url + "/", "network/fixed"))
|
||||||
]
|
]
|
||||||
for s in fakes.pools[tenant["id"]]:
|
if fakes.pools[tenant["id"]]:
|
||||||
expected.append(
|
expected.append(
|
||||||
("X-OCCI-Location",
|
("X-OCCI-Location",
|
||||||
utils.join_url(self.application_url + "/",
|
utils.join_url(self.application_url + "/",
|
||||||
"network/floating/%s" % s["name"]))
|
"network/floating"))
|
||||||
)
|
)
|
||||||
self.assertDefaults(resp)
|
self.assertDefaults(resp)
|
||||||
self.assertExpectedResult(expected, resp)
|
self.assertExpectedResult(expected, resp)
|
||||||
@ -113,11 +108,10 @@ class TestNetworkController(test_middleware.TestMiddleware):
|
|||||||
app = self.get_app()
|
app = self.get_app()
|
||||||
|
|
||||||
for pool in fakes.pools[tenant["id"]]:
|
for pool in fakes.pools[tenant["id"]]:
|
||||||
req = self._build_req("/network/floating/%s" % pool["name"],
|
req = self._build_req("/network/floating", tenant["id"],
|
||||||
tenant["id"], method="GET")
|
method="GET")
|
||||||
|
|
||||||
resp = req.get_response(app)
|
resp = req.get_response(app)
|
||||||
expected = build_occi_network(pool)
|
expected = build_occi_network("floating")
|
||||||
self.assertDefaults(resp)
|
self.assertDefaults(resp)
|
||||||
self.assertExpectedResult(expected, resp)
|
self.assertExpectedResult(expected, resp)
|
||||||
self.assertEqual(200, resp.status_code)
|
self.assertEqual(200, resp.status_code)
|
||||||
@ -129,7 +123,7 @@ class TestNetworkController(test_middleware.TestMiddleware):
|
|||||||
req = self._build_req("/network/fixed", tenant["id"], method="GET")
|
req = self._build_req("/network/fixed", tenant["id"], method="GET")
|
||||||
|
|
||||||
resp = req.get_response(app)
|
resp = req.get_response(app)
|
||||||
expected = build_occi_network({"name": "fixed"}, False)
|
expected = build_occi_network("fixed")
|
||||||
self.assertDefaults(resp)
|
self.assertDefaults(resp)
|
||||||
self.assertExpectedResult(expected, resp)
|
self.assertExpectedResult(expected, resp)
|
||||||
self.assertEqual(200, resp.status_code)
|
self.assertEqual(200, resp.status_code)
|
||||||
@ -138,7 +132,7 @@ class TestNetworkController(test_middleware.TestMiddleware):
|
|||||||
tenant = fakes.tenants["foo"]
|
tenant = fakes.tenants["foo"]
|
||||||
|
|
||||||
app = self.get_app()
|
app = self.get_app()
|
||||||
req = self._build_req("/network/floating/%s" % uuid.uuid4().hex,
|
req = self._build_req("/network/%s" % uuid.uuid4().hex,
|
||||||
tenant["id"], method="GET")
|
tenant["id"], method="GET")
|
||||||
resp = req.get_response(app)
|
resp = req.get_response(app)
|
||||||
self.assertEqual(404, resp.status_code)
|
self.assertEqual(404, resp.status_code)
|
||||||
|
@ -185,30 +185,10 @@ class OCCIMiddleware(object):
|
|||||||
self._setup_resource_routes("networklink",
|
self._setup_resource_routes("networklink",
|
||||||
self.resources["networklink"])
|
self.resources["networklink"])
|
||||||
|
|
||||||
# TODO(enolfc): move to _setup_resource_routes or similar
|
|
||||||
# Network is a bit different from other resources
|
|
||||||
# we have /network and below that /network/fixed
|
|
||||||
# and /network/floating/* for the pools
|
|
||||||
self.resources["network"] = self._create_resource(
|
self.resources["network"] = self._create_resource(
|
||||||
ooi.api.network.Controller)
|
ooi.api.network.Controller)
|
||||||
self.mapper.connect("network", "/network",
|
self._setup_resource_routes("network",
|
||||||
controller=self.resources["network"],
|
self.resources["network"])
|
||||||
action="general_index",
|
|
||||||
conditions=dict(method=["GET"]))
|
|
||||||
# OCCI states that paths must end with a "/" when operating on pahts,
|
|
||||||
# that are not location pahts or resource instances, so we should add
|
|
||||||
# this rule manually
|
|
||||||
self.mapper.connect("network", "/network/",
|
|
||||||
controller=self.resources["network"],
|
|
||||||
action="general_index",
|
|
||||||
conditions=dict(method=["GET"]))
|
|
||||||
self.mapper.connect("fixed_network", "/network/fixed",
|
|
||||||
controller=self.resources["network"],
|
|
||||||
action="show_fixed",
|
|
||||||
conditions=dict(method=["GET"]))
|
|
||||||
netpool_name = "network/%s" % ooi.api.network.FLOATING_PREFIX
|
|
||||||
self.mapper.resource("floating_network", netpool_name,
|
|
||||||
controller=self.resources["network"])
|
|
||||||
|
|
||||||
@webob.dec.wsgify(RequestClass=Request)
|
@webob.dec.wsgify(RequestClass=Request)
|
||||||
def __call__(self, req):
|
def __call__(self, req):
|
||||||
|
Loading…
Reference in New Issue
Block a user