diff options
| author | Hisaharu Ishii <ishii.hisaharu@lab.ntt.co.jp> | 2011-08-22 08:59:35 -0700 |
|---|---|---|
| committer | Hisaharu Ishii <ishii.hisaharu@lab.ntt.co.jp> | 2011-08-22 08:59:35 -0700 |
| commit | 9508bb599c15035f7afbdc80fe70d539e8598edf (patch) | |
| tree | 970aa2f5560d24e7e30418c725293efe3f6fb8e2 | |
| parent | b3d3f735a7402c49b8db0e19c9b1f8521187378b (diff) | |
Add 'nova-manage network modify' command.
| -rwxr-xr-x | bin/nova-manage | 30 | ||||
| -rw-r--r-- | nova/db/api.py | 5 | ||||
| -rw-r--r-- | nova/db/sqlalchemy/api.py | 32 | ||||
| -rw-r--r-- | nova/tests/test_nova_manage.py | 50 |
4 files changed, 106 insertions, 11 deletions
diff --git a/bin/nova-manage b/bin/nova-manage index 62504f827..0a8edb9f3 100755 --- a/bin/nova-manage +++ b/bin/nova-manage @@ -795,6 +795,36 @@ class NetworkCommands(object): ' before delete' % network.project_id)) db.network_delete_safe(context.get_admin_context(), network.id) + @args('--network', dest="fixed_range", metavar='<x.x.x.x/yy>', + help='Network to modify') + @args('--project', dest="project", metavar='<project name>', + help='Project name to associate/disasscociate') + @args('--host', dest="host", metavar='<host>', + help='Host to associate/disasscociate') + def modify(self, fixed_range, project=None, host=None): + """Associate/Disasscociate Network with Project and/or Host + arguments: network project host + specify 'None' to disassociate it + leave any field blank to ignore it + """ + admin_context = context.get_admin_context() + network = db.network_get_by_cidr(admin_context, fixed_range) + if project != "None": + if project: + project_id = manager.Project.safe_id(project) + db.network_associate_by_id(admin_context, network_id=network['id'], project_id=project, force=True) + else: + db.network_disassociate(admin_context, network_id=network['id']) + if host != "None": + if host: + db.network_set_host(admin_context, + network['id'], + host) + else: + db.network_set_host(admin_context, + network['id'], + None) + class VmCommands(object): """Class for mangaging VM instances.""" diff --git a/nova/db/api.py b/nova/db/api.py index 6833e6312..ec701ebdc 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -623,6 +623,11 @@ def network_associate(context, project_id, force=False): return IMPL.network_associate(context, project_id, force) +def network_associate_by_id(context, network_id, project_id, force=False): + """Associate a project with a network specified by id.""" + return IMPL.network_associate_by_id(context, network_id, project_id, force=False) + + def network_count(context): """Return the number of networks.""" return IMPL.network_count(context) diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 2f9cab1ab..37dac1444 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -1670,6 +1670,38 @@ def network_associate(context, project_id, force=False): @require_admin_context +def network_associate_by_id(context, network_id, project_id, force=False): + """Associate a project with a network specified by id. + + only associate if the network isn't already associated + with a project or if force is True + """ + session = get_session() + with session.begin(): + + def network_query(network_filter): + if force: + return session.query(models.Network).\ + filter_by(deleted=False).\ + filter_by(id=network_filter).\ + with_lockmode('update').\ + first() + else: + return session.query(models.Network).\ + filter_by(deleted=False).\ + filter_by(project_id=None).\ + filter_by(id=network_filter).\ + with_lockmode('update').\ + first() + network_ref = network_query(network_id) + if network_ref: + network_ref['project_id'] = project_id + session.add(network_ref) + LOG.debug("piyo: network_ref['project_id']=%s" % network_ref['project_id']) + return network_ref + + +@require_admin_context def network_count(context): session = get_session() return session.query(models.Network).\ diff --git a/nova/tests/test_nova_manage.py b/nova/tests/test_nova_manage.py index e4914e0b1..4c828da16 100644 --- a/nova/tests/test_nova_manage.py +++ b/nova/tests/test_nova_manage.py @@ -39,8 +39,10 @@ from nova import db from nova import flags from nova import test from nova import exception +from nova import log as logging FLAGS = flags.FLAGS +LOG = logging.getLogger('nova.tests.nova_manage') class FixedIpCommandsTestCase(test.TestCase): @@ -88,7 +90,6 @@ class FixedIpCommandsTestCase(test.TestCase): class NetworkCommandsTestCase(test.TestCase): def setUp(self): -# print 'piyo' super(NetworkCommandsTestCase, self).setUp() self.commands = nova_manage.NetworkCommands() self.context = context.get_admin_context() @@ -100,22 +101,29 @@ class NetworkCommandsTestCase(test.TestCase): super(NetworkCommandsTestCase, self).tearDown() def test_create(self): + FLAGS.network_manager='nova.network.manager.VlanManager' self.commands.create( - label = 'Test', - fixed_range_v4 = '10.2.0.0/24', - fixed_range_v6 = 'fd00:2::/120', - num_networks = 1, - network_size = 256, - vlan_start = 200, - bridge_interface = 'eth0', - ) + label='Test', + fixed_range_v4='10.2.0.0/24', + num_networks=1, + network_size=256, + multi_host='F', + vlan_start=200, + vpn_start=2000, + fixed_range_v6='fd00:2::/120', + gateway_v6='fd00:2::22', + bridge_interface='eth0') net = db.network_get_by_cidr(self.context, '10.2.0.0/24') self.assertEqual(net['label'], 'Test') self.assertEqual(net['cidr'], '10.2.0.0/24') self.assertEqual(net['netmask'], '255.255.255.0') + self.assertEqual(net['multi_host'], False) + self.assertEqual(net['vlan'], 200) + self.assertEqual(net['bridge'], 'br200') + self.assertEqual(net['vpn_public_port'], 2000) self.assertEqual(net['cidr_v6'], 'fd00:2::/120') + self.assertEqual(net['gateway_v6'], 'fd00:2::22') self.assertEqual(net['bridge_interface'], 'eth0') - self.assertEqual(net['vlan'], 200) def test_list(self): self.test_create() @@ -150,10 +158,30 @@ class NetworkCommandsTestCase(test.TestCase): def test_delete(self): self.test_create() - self.commands.delete(fixed_range = '10.2.0.0/24') + self.commands.delete(fixed_range='10.2.0.0/24') net_exist = True try: net = db.network_get_by_cidr(self.context, '10.2.0.0/24') except exception.NetworkNotFoundForCidr, e: net_exist = False self.assertEqual(net_exist, False) + + def test_modify(self): + self.test_create() + net = db.network_get_by_cidr(self.context, '10.2.0.0/24') + db.network_disassociate(self.context, net['id']) + net = db.network_get_by_cidr(self.context, '10.2.0.0/24') + self.assertEqual(net['project_id'], None) + self.assertEqual(net['host'], None) + self.commands.modify('10.2.0.0/24', project='test_project', host='test_host') + net = db.network_get_by_cidr(self.context, '10.2.0.0/24') + self.assertEqual(net['project_id'], 'test_project') + self.assertEqual(net['host'], 'test_host') + self.commands.modify('10.2.0.0/24') + net = db.network_get_by_cidr(self.context, '10.2.0.0/24') + self.assertEqual(net['project_id'], 'test_project') + self.assertEqual(net['host'], 'test_host') + self.commands.modify('10.2.0.0/24', project='None', host='None') + net = db.network_get_by_cidr(self.context, '10.2.0.0/24') + self.assertEqual(net['project_id'], None) + self.assertEqual(net['host'], None) |
