summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHisaharu Ishii <ishii.hisaharu@lab.ntt.co.jp>2011-08-22 08:59:35 -0700
committerHisaharu Ishii <ishii.hisaharu@lab.ntt.co.jp>2011-08-22 08:59:35 -0700
commit9508bb599c15035f7afbdc80fe70d539e8598edf (patch)
tree970aa2f5560d24e7e30418c725293efe3f6fb8e2
parentb3d3f735a7402c49b8db0e19c9b1f8521187378b (diff)
Add 'nova-manage network modify' command.
-rwxr-xr-xbin/nova-manage30
-rw-r--r--nova/db/api.py5
-rw-r--r--nova/db/sqlalchemy/api.py32
-rw-r--r--nova/tests/test_nova_manage.py50
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)