diff options
| author | Trey Morris <trey.morris@rackspace.com> | 2011-12-01 16:54:40 -0600 |
|---|---|---|
| committer | Trey Morris <treyemorris@gmail.com> | 2011-12-08 17:33:04 -0600 |
| commit | d8e84937c19169e3de73e7ad6b7382d954d753ac (patch) | |
| tree | ab50a17c95db9378666350c0657bff1e8d2b9490 /nova/tests | |
| parent | 10c829ff39500d68f1e3493f5fa1a4e2f5bc26d6 (diff) | |
Adds network model and network info cache.
The next merge will prepopulate the cache, and use the model to keep the
cache up to date.
I realize "cache" is a bit of a stretch for what this is doing.
blueprint network-info-model
blueprint compute-network-info
Change-Id: I0f0f4ba3de1310e1ff89239dab6ea8e24c85f2c8
Diffstat (limited to 'nova/tests')
| -rw-r--r-- | nova/tests/fake_network_cache_model.py | 72 | ||||
| -rw-r--r-- | nova/tests/test_network_info.py | 328 |
2 files changed, 400 insertions, 0 deletions
diff --git a/nova/tests/fake_network_cache_model.py b/nova/tests/fake_network_cache_model.py new file mode 100644 index 000000000..c85b1b025 --- /dev/null +++ b/nova/tests/fake_network_cache_model.py @@ -0,0 +1,72 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from nova.network import model + + +def new_ip(ip_dict=None): + new_ip = dict(address='192.168.1.100') + ip_dict = ip_dict or {} + new_ip.update(ip_dict) + return model.FixedIP(**new_ip) + + +def new_route(route_dict=None): + new_route = dict( + cidr='0.0.0.0/24', + gateway=new_ip(dict(address='192.168.1.1')), + interface='eth0') + + route_dict = route_dict or {} + new_route.update(route_dict) + return model.Route(**new_route) + + +def new_subnet(subnet_dict=None): + new_subnet = dict( + cidr='255.255.255.0', + dns=[new_ip(dict(address='1.2.3.4')), + new_ip(dict(address='2.3.4.5'))], + gateway=new_ip(dict(address='192.168.1.1')), + ips=[new_ip(dict(address='192.168.1.100')), + new_ip(dict(address='192.168.1.101'))], + routes=[new_route()], + version=4) + subnet_dict = subnet_dict or {} + new_subnet.update(subnet_dict) + return model.Subnet(**new_subnet) + + +def new_network(network_dict=None): + new_net = dict( + id=1, + bridge='br0', + label='public', + subnets=[new_subnet(), new_subnet(dict(cidr='255.255.255.255'))]) + network_dict = network_dict or {} + new_net.update(network_dict) + return model.Network(**new_net) + + +def new_vif(vif_dict=None): + vif = dict( + id=1, + address='aa:aa:aa:aa:aa:aa', + network=new_network()) + vif_dict = vif_dict or {} + vif.update(vif_dict) + return model.VIF(**vif) diff --git a/nova/tests/test_network_info.py b/nova/tests/test_network_info.py new file mode 100644 index 000000000..1fd30dc9a --- /dev/null +++ b/nova/tests/test_network_info.py @@ -0,0 +1,328 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import json + +from nova import exception +from nova import log as logging +from nova.network import model +from nova import test +from nova.tests import fake_network_cache_model + +LOG = logging.getLogger('nova.tests.network') + + +class RouteTests(test.TestCase): + def test_create_route_with_attrs(self): + route = fake_network_cache_model.new_route() + ip = fake_network_cache_model.new_ip(dict(address='192.168.1.1')) + self.assertEqual(route['cidr'], '0.0.0.0/24') + self.assertEqual(route['gateway']['address'], '192.168.1.1') + self.assertEqual(route['interface'], 'eth0') + + def test_routes_equal(self): + route1 = fake_network_cache_model.new_route() + route2 = fake_network_cache_model.new_route() + self.assertEqual(route1, route2) + + def test_routes_not_equal(self): + route1 = fake_network_cache_model.new_route() + route2 = fake_network_cache_model.new_route(dict(cidr='1.1.1.1/24')) + self.assertNotEqual(route1, route2) + + def test_hydrate(self): + route = model.Route.hydrate( + {'gateway': fake_network_cache_model.new_ip( + dict(address='192.168.1.1'))}) + self.assertEqual(route['cidr'], None) + self.assertEqual(route['gateway']['address'], '192.168.1.1') + self.assertEqual(route['interface'], None) + + +class FixedIPTests(test.TestCase): + def test_createnew_fixed_ip_with_attrs(self): + fixed_ip = model.FixedIP(address='192.168.1.100') + self.assertEqual(fixed_ip['address'], '192.168.1.100') + self.assertEqual(fixed_ip['floating_ips'], []) + self.assertEqual(fixed_ip['type'], 'fixed') + self.assertEqual(fixed_ip['version'], 4) + + def test_create_fixed_ipv6(self): + fixed_ip = model.FixedIP(address='::1') + self.assertEqual(fixed_ip['address'], '::1') + self.assertEqual(fixed_ip['floating_ips'], []) + self.assertEqual(fixed_ip['type'], 'fixed') + self.assertEqual(fixed_ip['version'], 6) + + def test_create_fixed_bad_ip_fails(self): + self.assertRaises(exception.InvalidIpAddressError, + model.FixedIP, + address='picklespicklespickles') + + def test_equate_two_fixed_ips(self): + fixed_ip = model.FixedIP(address='::1') + fixed_ip2 = model.FixedIP(address='::1') + self.assertEqual(fixed_ip, fixed_ip2) + + def test_equate_two_dissimilar_fixed_ips_fails(self): + fixed_ip = model.FixedIP(address='::1') + fixed_ip2 = model.FixedIP(address='::2') + self.assertNotEqual(fixed_ip, fixed_ip2) + + def test_hydrate(self): + fixed_ip = model.FixedIP.hydrate({}) + self.assertEqual(fixed_ip['floating_ips'], []) + self.assertEqual(fixed_ip['address'], None) + self.assertEqual(fixed_ip['type'], 'fixed') + self.assertEqual(fixed_ip['version'], None) + + def test_add_floating_ip(self): + fixed_ip = model.FixedIP(address='192.168.1.100') + fixed_ip.add_floating_ip('192.168.1.101') + self.assertEqual(fixed_ip['floating_ips'], ['192.168.1.101']) + + def test_add_floating_ip_repeatedly_only_one_instance(self): + fixed_ip = model.FixedIP(address='192.168.1.100') + for i in xrange(10): + fixed_ip.add_floating_ip('192.168.1.101') + self.assertEqual(fixed_ip['floating_ips'], ['192.168.1.101']) + + +class SubnetTests(test.TestCase): + def test_create_subnet_with_attrs(self): + subnet = fake_network_cache_model.new_subnet() + + route1 = fake_network_cache_model.new_route() + + self.assertEqual(subnet['cidr'], '255.255.255.0') + self.assertEqual(subnet['dns'], + [fake_network_cache_model.new_ip(dict(address='1.2.3.4')), + fake_network_cache_model.new_ip(dict(address='2.3.4.5'))]) + self.assertEqual(subnet['gateway']['address'], '192.168.1.1') + self.assertEqual(subnet['ips'], + [fake_network_cache_model.new_ip( + dict(address='192.168.1.100')), + fake_network_cache_model.new_ip( + dict(address='192.168.1.101'))]) + self.assertEqual(subnet['routes'], [route1]) + self.assertEqual(subnet['version'], 4) + + def test_add_route(self): + subnet = fake_network_cache_model.new_subnet() + route1 = fake_network_cache_model.new_route() + route2 = fake_network_cache_model.new_route({'cidr': '1.1.1.1/24'}) + subnet.add_route(route2) + self.assertEqual(subnet['routes'], [route1, route2]) + + def test_add_route_a_lot(self): + subnet = fake_network_cache_model.new_subnet() + route1 = fake_network_cache_model.new_route() + route2 = fake_network_cache_model.new_route({'cidr': '1.1.1.1/24'}) + for i in xrange(10): + subnet.add_route(route2) + self.assertEqual(subnet['routes'], [route1, route2]) + + def test_add_dns(self): + subnet = fake_network_cache_model.new_subnet() + dns = fake_network_cache_model.new_ip(dict(address='9.9.9.9')) + subnet.add_dns(dns) + self.assertEqual(subnet['dns'], + [fake_network_cache_model.new_ip(dict(address='1.2.3.4')), + fake_network_cache_model.new_ip(dict(address='2.3.4.5')), + fake_network_cache_model.new_ip(dict(address='9.9.9.9'))]) + + def test_add_dns_a_lot(self): + subnet = fake_network_cache_model.new_subnet() + for i in xrange(10): + subnet.add_dns(fake_network_cache_model.new_ip( + dict(address='9.9.9.9'))) + self.assertEqual(subnet['dns'], + [fake_network_cache_model.new_ip(dict(address='1.2.3.4')), + fake_network_cache_model.new_ip(dict(address='2.3.4.5')), + fake_network_cache_model.new_ip(dict(address='9.9.9.9'))]) + + def test_add_ip(self): + subnet = fake_network_cache_model.new_subnet() + subnet.add_ip(fake_network_cache_model.new_ip( + dict(address='192.168.1.102'))) + self.assertEqual(subnet['ips'], + [fake_network_cache_model.new_ip( + dict(address='192.168.1.100')), + fake_network_cache_model.new_ip( + dict(address='192.168.1.101')), + fake_network_cache_model.new_ip( + dict(address='192.168.1.102'))]) + + def test_add_ip_a_lot(self): + subnet = fake_network_cache_model.new_subnet() + for i in xrange(10): + subnet.add_ip(fake_network_cache_model.new_ip( + dict(address='192.168.1.102'))) + self.assertEqual(subnet['ips'], + [fake_network_cache_model.new_ip( + dict(address='192.168.1.100')), + fake_network_cache_model.new_ip( + dict(address='192.168.1.101')), + fake_network_cache_model.new_ip( + dict(address='192.168.1.102'))]) + + def test_hydrate(self): + subnet_dict = { + 'cidr': '255.255.255.0', + 'dns': [fake_network_cache_model.new_ip(dict(address='1.1.1.1'))], + 'ips': [fake_network_cache_model.new_ip(dict(address='2.2.2.2'))], + 'routes': [fake_network_cache_model.new_route()], + 'version': 4, + 'gateway': fake_network_cache_model.new_ip( + dict(address='3.3.3.3'))} + subnet = model.Subnet.hydrate(subnet_dict) + + self.assertEqual(subnet['cidr'], '255.255.255.0') + self.assertEqual(subnet['dns'], [fake_network_cache_model.new_ip( + dict(address='1.1.1.1'))]) + self.assertEqual(subnet['gateway']['address'], '3.3.3.3') + self.assertEqual(subnet['ips'], [fake_network_cache_model.new_ip( + dict(address='2.2.2.2'))]) + self.assertEqual(subnet['routes'], [ + fake_network_cache_model.new_route()]) + self.assertEqual(subnet['version'], 4) + + +class NetworkTests(test.TestCase): + def test_create_network(self): + network = fake_network_cache_model.new_network() + self.assertEqual(network['id'], 1) + self.assertEqual(network['bridge'], 'br0') + self.assertEqual(network['label'], 'public') + self.assertEqual(network['subnets'], + [fake_network_cache_model.new_subnet(), + fake_network_cache_model.new_subnet( + dict(cidr='255.255.255.255'))]) + + def test_add_subnet(self): + network = fake_network_cache_model.new_network() + network.add_subnet(fake_network_cache_model.new_subnet( + dict(cidr='0.0.0.0'))) + self.assertEqual(network['subnets'], + [fake_network_cache_model.new_subnet(), + fake_network_cache_model.new_subnet( + dict(cidr='255.255.255.255')), + fake_network_cache_model.new_subnet(dict(cidr='0.0.0.0'))]) + + def test_add_subnet_a_lot(self): + network = fake_network_cache_model.new_network() + for i in xrange(10): + network.add_subnet(fake_network_cache_model.new_subnet( + dict(cidr='0.0.0.0'))) + self.assertEqual(network['subnets'], + [fake_network_cache_model.new_subnet(), + fake_network_cache_model.new_subnet( + dict(cidr='255.255.255.255')), + fake_network_cache_model.new_subnet(dict(cidr='0.0.0.0'))]) + + def test_hydrate(self): + new_network = dict( + id=1, + bridge='br0', + label='public', + subnets=[fake_network_cache_model.new_subnet(), + fake_network_cache_model.new_subnet( + dict(cidr='255.255.255.255'))]) + network = model.Network.hydrate(fake_network_cache_model.new_network()) + + self.assertEqual(network['id'], 1) + self.assertEqual(network['bridge'], 'br0') + self.assertEqual(network['label'], 'public') + self.assertEqual(network['subnets'], + [fake_network_cache_model.new_subnet(), + fake_network_cache_model.new_subnet( + dict(cidr='255.255.255.255'))]) + + +class VIFTests(test.TestCase): + def test_create_vif(self): + vif = fake_network_cache_model.new_vif() + self.assertEqual(vif['id'], 1) + self.assertEqual(vif['address'], 'aa:aa:aa:aa:aa:aa') + self.assertEqual(vif['network'], + fake_network_cache_model.new_network()) + + def test_vif_get_fixed_ips(self): + vif = fake_network_cache_model.new_vif() + fixed_ips = vif.fixed_ips() + ips = [fake_network_cache_model.new_ip(dict(address='192.168.1.100')), + fake_network_cache_model.new_ip( + dict(address='192.168.1.101'))] * 2 + self.assertEqual(fixed_ips, ips) + + def test_vif_get_floating_ips(self): + vif = fake_network_cache_model.new_vif() + vif['network']['subnets'][0]['ips'][0].add_floating_ip('192.168.1.1') + floating_ips = vif.floating_ips() + self.assertEqual(floating_ips, ['192.168.1.1']) + + def test_vif_get_labeled_ips(self): + vif = fake_network_cache_model.new_vif() + labeled_ips = vif.labeled_ips() + ip_dict = { + 'network_id': 1, + 'ips': [fake_network_cache_model.new_ip( + {'address': '192.168.1.100'}), + fake_network_cache_model.new_ip( + {'address': '192.168.1.101'})] * 2, + 'network_label': 'public'} + self.assertEqual(labeled_ips, ip_dict) + + def test_hydrate(self): + new_vif = dict( + id=1, + address='127.0.0.1', + network=fake_network_cache_model.new_network()) + vif = model.VIF.hydrate(fake_network_cache_model.new_vif()) + self.assertEqual(vif['id'], 1) + self.assertEqual(vif['address'], 'aa:aa:aa:aa:aa:aa') + self.assertEqual(vif['network'], + fake_network_cache_model.new_network()) + + +class NetworkInfoTests(test.TestCase): + def test_create_model(self): + ninfo = model.NetworkInfo([fake_network_cache_model.new_vif(), + fake_network_cache_model.new_vif( + {'address':'bb:bb:bb:bb:bb:bb'})]) + self.assertEqual(ninfo.fixed_ips(), + [fake_network_cache_model.new_ip({'address': '192.168.1.100'}), + fake_network_cache_model.new_ip( + {'address': '192.168.1.101'})] * 4) + + def test_get_floating_ips(self): + vif = fake_network_cache_model.new_vif() + vif['network']['subnets'][0]['ips'][0].add_floating_ip('192.168.1.1') + ninfo = model.NetworkInfo([vif, + fake_network_cache_model.new_vif( + {'address':'bb:bb:bb:bb:bb:bb'})]) + self.assertEqual(ninfo.floating_ips(), ['192.168.1.1']) + + def test_hydrate(self): + ninfo = model.NetworkInfo([fake_network_cache_model.new_vif(), + fake_network_cache_model.new_vif( + {'address':'bb:bb:bb:bb:bb:bb'})]) + deserialized = model.NetworkInfo.hydrate(ninfo) + self.assertEqual(ninfo.fixed_ips(), + [fake_network_cache_model.new_ip({'address': '192.168.1.100'}), + fake_network_cache_model.new_ip( + {'address': '192.168.1.101'})] * 4) |
