summaryrefslogtreecommitdiffstats
path: root/nova/tests
diff options
context:
space:
mode:
Diffstat (limited to 'nova/tests')
-rw-r--r--nova/tests/api/ec2/test_cloud.py18
-rw-r--r--nova/tests/api/openstack/contrib/test_floating_ips.py178
-rw-r--r--nova/tests/test_network.py197
3 files changed, 214 insertions, 179 deletions
diff --git a/nova/tests/api/ec2/test_cloud.py b/nova/tests/api/ec2/test_cloud.py
index 7053ebab7..0f22df751 100644
--- a/nova/tests/api/ec2/test_cloud.py
+++ b/nova/tests/api/ec2/test_cloud.py
@@ -130,24 +130,6 @@ class CloudTestCase(test.TestCase):
result = self.cloud.release_address(self.context, address)
self.assertEqual(result['releaseResponse'], ['Address released.'])
- def test_release_address_still_associated(self):
- address = "10.10.10.10"
- fixed_ip = {'instance': {'id': 1}}
- floating_ip = {'id': 0,
- 'address': address,
- 'fixed_ip_id': 0,
- 'fixed_ip': fixed_ip,
- 'project_id': None,
- 'auto_assigned': False}
- network_api = network.api.API()
- self.mox.StubOutWithMock(network_api.db, 'floating_ip_get_by_address')
- network_api.db.floating_ip_get_by_address(mox.IgnoreArg(),
- mox.IgnoreArg()).AndReturn(floating_ip)
- self.mox.ReplayAll()
- release = self.cloud.release_address
- # ApiError: Floating ip is in use. Disassociate it before releasing.
- self.assertRaises(exception.ApiError, release, self.context, address)
-
def test_associate_disassociate_address(self):
"""Verifies associate runs cleanly without raising an exception"""
address = "10.10.10.10"
diff --git a/nova/tests/api/openstack/contrib/test_floating_ips.py b/nova/tests/api/openstack/contrib/test_floating_ips.py
index d4e08b303..7f1583964 100644
--- a/nova/tests/api/openstack/contrib/test_floating_ips.py
+++ b/nova/tests/api/openstack/contrib/test_floating_ips.py
@@ -36,12 +36,12 @@ def network_api_get_floating_ip(self, context, id):
'fixed_ip': None}
-def network_api_get_floating_ip_by_ip(self, context, address):
+def network_api_get_floating_ip_by_address(self, context, address):
return {'id': 1, 'address': '10.10.10.10',
- 'fixed_ip': {'address': '10.0.0.1', 'instance_id': 1}},
+ 'fixed_ip': {'address': '10.0.0.1', 'instance_id': 1}}
-def network_api_list_floating_ips(self, context):
+def network_api_get_floating_ips_by_project(self, context):
return [{'id': 1,
'address': '10.10.10.10',
'fixed_ip': {'address': '10.0.0.1', 'instance_id': 1}},
@@ -57,11 +57,11 @@ def network_api_release(self, context, address):
pass
-def compute_api_associate(self, context, instance_id, floating_ip):
+def compute_api_associate(self, context, instance_id, address):
pass
-def network_api_associate(self, context, floating_ip, fixed_ip):
+def network_api_associate(self, context, floating_address, fixed_address):
pass
@@ -110,10 +110,10 @@ class FloatingIpTest(test.TestCase):
super(FloatingIpTest, self).setUp()
self.stubs.Set(network.api.API, "get_floating_ip",
network_api_get_floating_ip)
- self.stubs.Set(network.api.API, "get_floating_ip_by_ip",
- network_api_get_floating_ip)
- self.stubs.Set(network.api.API, "list_floating_ips",
- network_api_list_floating_ips)
+ self.stubs.Set(network.api.API, "get_floating_ip_by_address",
+ network_api_get_floating_ip_by_address)
+ self.stubs.Set(network.api.API, "get_floating_ips_by_project",
+ network_api_get_floating_ips_by_project)
self.stubs.Set(network.api.API, "release_floating_ip",
network_api_release)
self.stubs.Set(network.api.API, "disassociate_floating_ip",
@@ -184,6 +184,7 @@ class FloatingIpTest(test.TestCase):
self.assertEqual(res_dict['floating_ip']['ip'], '10.10.10.10')
self.assertEqual(res_dict['floating_ip']['instance_id'], 1)
+# test floating ip allocate/release(deallocate)
def test_floating_ip_allocate_no_free_ips(self):
def fake_call(*args, **kwargs):
raise(rpc.RemoteError('NoMoreFloatingIps', '', ''))
@@ -196,8 +197,16 @@ class FloatingIpTest(test.TestCase):
self.assertEqual(res.status_int, 400)
def test_floating_ip_allocate(self):
+ def fake1(*args, **kwargs):
+ pass
+
+ def fake2(*args, **kwargs):
+ return {'id': 1, 'address': '10.10.10.10'}
+
self.stubs.Set(network.api.API, "allocate_floating_ip",
- network_api_allocate)
+ fake1)
+ self.stubs.Set(network.api.API, "get_floating_ip_by_address",
+ fake2)
req = webob.Request.blank('/v1.1/123/os-floating-ips')
req.method = 'POST'
req.headers['Content-Type'] = 'application/json'
@@ -212,107 +221,15 @@ class FloatingIpTest(test.TestCase):
"fixed_ip": None}
self.assertEqual(ip, expected)
- def test_floating_ip_release_associated(self):
- self.disassociated = False
-
- def get_floating_ip(ignore, context, id):
- return {'id': 1, 'address': '10.10.10.10',
- 'fixed_ip': {'id': 1}}
-
- def disassociate(ignore, context, floating_address):
- self.disassociated = True
-
- self.stubs.Set(network.api.API, "get_floating_ip",
- get_floating_ip)
- self.stubs.Set(network.api.API, "disassociate_floating_ip",
- disassociate)
- req = webob.Request.blank('/v1.1/123/os-floating-ips/1')
- req.method = 'DELETE'
- res = req.get_response(fakes.wsgi_app())
- self.assertEqual(res.status_int, 202)
- self.assertTrue(self.disassociated)
-
- def test_floating_ip_release_disassociated(self):
- self.disassociated = False
-
- def fake_get_floating_ip(ignore, context, id):
- return {'id': 1, 'address': '10.10.10.10',
- 'fixed_ip': None}
-
- def fake_disassociate(ignore, context, floating_address):
- self.disassociated = True
-
- self.stubs.Set(network.api.API, "get_floating_ip",
- fake_get_floating_ip)
- self.stubs.Set(network.api.API, "disassociate_floating_ip",
- fake_disassociate)
+ def test_floating_ip_release(self):
req = webob.Request.blank('/v1.1/123/os-floating-ips/1')
req.method = 'DELETE'
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 202)
- self.assertFalse(self.disassociated)
-
- def test_add_floating_ip_to_instance(self):
- self.stubs.Set(network.api.API, "associate_floating_ip",
- network_api_associate)
- body = dict(addFloatingIp=dict(address='11.0.0.1'))
- req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
- req.method = "POST"
- req.body = json.dumps(body)
- req.headers["content-type"] = "application/json"
-
- resp = req.get_response(fakes.wsgi_app())
- self.assertEqual(resp.status_int, 202)
-
- def test_associate_floating_ip_to_instance_wrong_project_id(self):
- def fake_fixed_ip_get_by_address(ctx, address, session=None):
- return {'address': address, 'network': {'multi_host': None,
- 'host': 'fake'}}
- self.stubs.Set(db.api, "fixed_ip_get_by_address",
- fake_fixed_ip_get_by_address)
- db.floating_ip_update(self.context, self.address, {'project_id': 'bad',
- 'fixed_ip_id': 1})
- body = dict(addFloatingIp=dict(address=self.address))
- req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
- req.method = "POST"
- req.body = json.dumps(body)
- req.headers["content-type"] = "application/json"
- resp = req.get_response(fakes.wsgi_app())
- self.assertEqual(resp.status_int, 401)
-
- def test_associate_floating_ip_to_instance_no_project_id(self):
- def fake_fixed_ip_get_by_address(ctx, address, session=None):
- return {'address': address, 'network': {'multi_host': None,
- 'host': 'fake'}}
- self.stubs.Set(db.api, "fixed_ip_get_by_address",
- fake_fixed_ip_get_by_address)
- db.floating_ip_update(self.context, self.address, {'project_id': None,
- 'fixed_ip_id': 1})
- body = dict(addFloatingIp=dict(address=self.address))
- req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
- req.method = "POST"
- req.body = json.dumps(body)
- req.headers["content-type"] = "application/json"
- resp = req.get_response(fakes.wsgi_app())
- self.assertEqual(resp.status_int, 400)
-
- def test_add_associated_floating_ip_to_instance(self):
- def fake_fixed_ip_get_by_address(ctx, address, session=None):
- return {'address': address, 'network': {'multi_host': None,
- 'host': 'fake'}}
-
- self.disassociated = False
-
- def fake_network_api_disassociate(local_self, ctx, floating_address):
- self.disassociated = True
- db.floating_ip_update(self.context, self.address, {'project_id': '123',
- 'fixed_ip_id': 1})
- self.stubs.Set(network.api.API, "disassociate_floating_ip",
- fake_network_api_disassociate)
- self.stubs.Set(db.api, "fixed_ip_get_by_address",
- fake_fixed_ip_get_by_address)
+# test floating ip add/remove -> associate/disassociate
+ def test_floating_ip_associate(self):
body = dict(addFloatingIp=dict(address=self.address))
req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
req.method = "POST"
@@ -321,22 +238,8 @@ class FloatingIpTest(test.TestCase):
resp = req.get_response(fakes.wsgi_app())
self.assertEqual(resp.status_int, 202)
- self.assertTrue(self.disassociated)
-
- def test_remove_associated_floating_ip_from_instance(self):
- self.disassociated = False
-
- def fake_get_floating_ip_by_ip(ignore, context, ip):
- return {'id': 1, 'address': '10.10.10.10',
- 'fixed_ip': {'id': 1}}
-
- def fake_disassociate(ignore, context, floating_address):
- self.disassociated = True
- self.stubs.Set(network.api.API, "get_floating_ip_by_ip",
- fake_get_floating_ip_by_ip)
- self.stubs.Set(network.api.API, "disassociate_floating_ip",
- fake_disassociate)
+ def test_floating_ip_disassociate(self):
body = dict(removeFloatingIp=dict(address='10.10.10.10'))
req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
req.method = "POST"
@@ -345,31 +248,8 @@ class FloatingIpTest(test.TestCase):
resp = req.get_response(fakes.wsgi_app())
self.assertEqual(resp.status_int, 202)
- self.assertTrue(self.disassociated)
-
- def test_remove_disassociated_floating_ip_from_instance(self):
- self.disassociated = False
-
- def fake_get_floating_ip_by_ip(ignore, context, ip):
- return {'id': 1, 'address': '10.10.10.10',
- 'fixed_ip': None}
- def fake_disassociate(ignore, context, floating_address):
- self.disassociated = True
-
- self.stubs.Set(network.api.API, "get_floating_ip_by_ip",
- fake_get_floating_ip_by_ip)
- self.stubs.Set(network.api.API, "disassociate_floating_ip",
- fake_disassociate)
- body = dict(removeFloatingIp=dict(address='10.10.10.10'))
- req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
- req.method = "POST"
- req.body = json.dumps(body)
- req.headers["content-type"] = "application/json"
-
- resp = req.get_response(fakes.wsgi_app())
- self.assertEqual(resp.status_int, 202)
- self.assertFalse(self.disassociated)
+# these are a few bad param tests
def test_bad_address_param_in_remove_floating_ip(self):
body = dict(removeFloatingIp=dict(badparam='11.0.0.1'))
@@ -391,16 +271,6 @@ class FloatingIpTest(test.TestCase):
resp = req.get_response(fakes.wsgi_app())
self.assertEqual(resp.status_int, 400)
- def test_bad_address_param_in_add_floating_ip(self):
- body = dict(addFloatingIp=dict(badparam='11.0.0.1'))
- req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
- req.method = "POST"
- req.body = json.dumps(body)
- req.headers["content-type"] = "application/json"
-
- resp = req.get_response(fakes.wsgi_app())
- self.assertEqual(resp.status_int, 400)
-
def test_missing_dict_param_in_add_floating_ip(self):
body = dict(addFloatingIp='11.0.0.1')
req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
diff --git a/nova/tests/test_network.py b/nova/tests/test_network.py
index 6344bc4c6..e3d27e091 100644
--- a/nova/tests/test_network.py
+++ b/nova/tests/test_network.py
@@ -20,6 +20,8 @@ from nova import context
from nova import db
from nova import exception
from nova import log as logging
+from nova import quota
+from nova import rpc
from nova import test
from nova.network import manager as network_manager
from nova.tests import fake_network
@@ -394,22 +396,203 @@ class VlanNetworkTestCase(test.TestCase):
self.mox.ReplayAll()
self.network.validate_networks(self.context, requested_networks)
- def test_cant_associate_associated_floating_ip(self):
+ def test_floating_ip_owned_by_project(self):
ctxt = context.RequestContext('testuser', 'testproject',
is_admin=False)
- def fake_floating_ip_get_by_address(context, address):
- return {'address': '10.10.10.10',
- 'fixed_ip': {'address': '10.0.0.1'}}
- self.stubs.Set(self.network.db, 'floating_ip_get_by_address',
- fake_floating_ip_get_by_address)
+ # raises because floating_ip project_id is None
+ floating_ip = {'address': '10.0.0.1',
+ 'project_id': None}
+ self.assertRaises(exception.NotAuthorized,
+ self.network._floating_ip_owned_by_project,
+ ctxt,
+ floating_ip)
+
+ # raises because floating_ip project_id is not equal to ctxt project_id
+ floating_ip = {'address': '10.0.0.1',
+ 'project_id': ctxt.project_id + '1'}
+ self.assertRaises(exception.NotAuthorized,
+ self.network._floating_ip_owned_by_project,
+ ctxt,
+ floating_ip)
+
+ # does not raise (floating ip is owned by ctxt project)
+ floating_ip = {'address': '10.0.0.1',
+ 'project_id': ctxt.project_id}
+ self.network._floating_ip_owned_by_project(ctxt, floating_ip)
+
+ def test_allocate_floating_ip(self):
+ ctxt = context.RequestContext('testuser', 'testproject',
+ is_admin=False)
+
+ def fake1(*args, **kwargs):
+ return {'address': '10.0.0.1'}
+
+ def fake2(*args, **kwargs):
+ return 25
+
+ def fake3(*args, **kwargs):
+ return 0
+
+ self.stubs.Set(self.network.db, 'floating_ip_allocate_address', fake1)
+
+ # this time should raise
+ self.stubs.Set(self.network.db, 'floating_ip_count_by_project', fake2)
+ self.assertRaises(quota.QuotaError,
+ self.network.allocate_floating_ip,
+ ctxt,
+ ctxt.project_id)
+
+ # this time should not
+ self.stubs.Set(self.network.db, 'floating_ip_count_by_project', fake3)
+ self.network.allocate_floating_ip(ctxt, ctxt.project_id)
+
+ def test_deallocate_floating_ip(self):
+ ctxt = context.RequestContext('testuser', 'testproject',
+ is_admin=False)
+
+ def fake1(*args, **kwargs):
+ pass
+
+ def fake2(*args, **kwargs):
+ return {'address': '10.0.0.1', 'fixed_ip_id': 1}
+
+ def fake3(*args, **kwargs):
+ return {'address': '10.0.0.1', 'fixed_ip_id': None}
+
+ self.stubs.Set(self.network.db, 'floating_ip_deallocate', fake1)
+ self.stubs.Set(self.network, '_floating_ip_owned_by_project', fake1)
+
+ # this time should raise because floating ip is associated to fixed_ip
+ self.stubs.Set(self.network.db, 'floating_ip_get_by_address', fake2)
+ self.assertRaises(exception.FloatingIpAssociated,
+ self.network.deallocate_floating_ip,
+ ctxt,
+ mox.IgnoreArg())
+
+ # this time should not raise
+ self.stubs.Set(self.network.db, 'floating_ip_get_by_address', fake3)
+ self.network.deallocate_floating_ip(ctxt, ctxt.project_id)
- self.assertRaises(exception.FloatingIpAlreadyInUse,
+ def test_associate_floating_ip(self):
+ ctxt = context.RequestContext('testuser', 'testproject',
+ is_admin=False)
+
+ def fake1(*args, **kwargs):
+ pass
+
+ # floating ip that's already associated
+ def fake2(*args, **kwargs):
+ return {'address': '10.0.0.1',
+ 'fixed_ip_id': 1}
+
+ # floating ip that isn't associated
+ def fake3(*args, **kwargs):
+ return {'address': '10.0.0.1',
+ 'fixed_ip_id': None}
+
+ # fixed ip with remote host
+ def fake4(*args, **kwargs):
+ return {'address': '10.0.0.1',
+ 'network': {'multi_host': False, 'host': 'jibberjabber'}}
+
+ # fixed ip with local host
+ def fake5(*args, **kwargs):
+ return {'address': '10.0.0.1',
+ 'network': {'multi_host': False, 'host': 'testhost'}}
+
+ def fake6(*args, **kwargs):
+ self.local = False
+
+ def fake7(*args, **kwargs):
+ self.local = True
+
+ self.stubs.Set(self.network, '_floating_ip_owned_by_project', fake1)
+
+ # raises because floating_ip is already associated to a fixed_ip
+ self.stubs.Set(self.network.db, 'floating_ip_get_by_address', fake2)
+ self.assertRaises(exception.FloatingIpAssociated,
self.network.associate_floating_ip,
ctxt,
mox.IgnoreArg(),
mox.IgnoreArg())
+ self.stubs.Set(self.network.db, 'floating_ip_get_by_address', fake3)
+
+ # does not raise and makes call remotely
+ self.local = True
+ self.stubs.Set(self.network.db, 'fixed_ip_get_by_address', fake4)
+ self.stubs.Set(rpc, 'cast', fake6)
+ self.network.associate_floating_ip(ctxt, mox.IgnoreArg(),
+ mox.IgnoreArg())
+ self.assertFalse(self.local)
+
+ # does not raise and makes call locally
+ self.local = False
+ self.stubs.Set(self.network.db, 'fixed_ip_get_by_address', fake5)
+ self.stubs.Set(self.network, '_associate_floating_ip', fake7)
+ self.network.associate_floating_ip(ctxt, mox.IgnoreArg(),
+ mox.IgnoreArg())
+ self.assertTrue(self.local)
+
+ def test_disassociate_floating_ip(self):
+ ctxt = context.RequestContext('testuser', 'testproject',
+ is_admin=False)
+
+ def fake1(*args, **kwargs):
+ pass
+
+ # floating ip that isn't associated
+ def fake2(*args, **kwargs):
+ return {'address': '10.0.0.1',
+ 'fixed_ip_id': None}
+
+ # floating ip that is associated
+ def fake3(*args, **kwargs):
+ return {'address': '10.0.0.1',
+ 'fixed_ip_id': 1}
+
+ # fixed ip with remote host
+ def fake4(*args, **kwargs):
+ return {'address': '10.0.0.1',
+ 'network': {'multi_host': False, 'host': 'jibberjabber'}}
+
+ # fixed ip with local host
+ def fake5(*args, **kwargs):
+ return {'address': '10.0.0.1',
+ 'network': {'multi_host': False, 'host': 'testhost'}}
+
+ def fake6(*args, **kwargs):
+ self.local = False
+
+ def fake7(*args, **kwargs):
+ self.local = True
+
+ self.stubs.Set(self.network, '_floating_ip_owned_by_project', fake1)
+
+ # raises because floating_ip is not associated to a fixed_ip
+ self.stubs.Set(self.network.db, 'floating_ip_get_by_address', fake2)
+ self.assertRaises(exception.FloatingIpNotAssociated,
+ self.network.disassociate_floating_ip,
+ ctxt,
+ mox.IgnoreArg())
+
+ self.stubs.Set(self.network.db, 'floating_ip_get_by_address', fake3)
+
+ # does not raise and makes call remotely
+ self.local = True
+ self.stubs.Set(self.network.db, 'fixed_ip_get', fake4)
+ self.stubs.Set(rpc, 'cast', fake6)
+ self.network.disassociate_floating_ip(ctxt, mox.IgnoreArg())
+ self.assertFalse(self.local)
+
+ # does not raise and makes call locally
+ self.local = False
+ self.stubs.Set(self.network.db, 'fixed_ip_get', fake5)
+ self.stubs.Set(self.network, '_disassociate_floating_ip', fake7)
+ self.network.disassociate_floating_ip(ctxt, mox.IgnoreArg())
+ self.assertTrue(self.local)
+
def test_add_fixed_ip_instance_without_vpn_requested_networks(self):
self.mox.StubOutWithMock(db, 'network_get')
self.mox.StubOutWithMock(db, 'fixed_ip_associate_pool')