diff options
Diffstat (limited to 'nova/tests')
| -rw-r--r-- | nova/tests/api/ec2/test_cloud.py | 18 | ||||
| -rw-r--r-- | nova/tests/api/openstack/contrib/test_floating_ips.py | 178 | ||||
| -rw-r--r-- | nova/tests/test_network.py | 197 |
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') |
