summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustin Santa Barbara <justin@fathomdb.com>2012-02-06 11:25:40 -0800
committerJustin Santa Barbara <justin@fathomdb.com>2012-02-21 17:09:29 -0800
commit9c6bf7cf462346ed9379ff217774e2787e64f5f5 (patch)
treecd1e9e432a70981d7ccddac4df30e6a9fdbd83aa
parentadaf9049c8fb3652c0962909a3c835e1724d8a17 (diff)
Support fixed_ip range that is a subnet of the network block
This enables flat deployments where the instances live on the 'general' network. For example, a typical home router uses 192.168.0.0/16 for the private network. Cloud machines can be assigned 192.168.100.0/24. An example network create command: nova-manage network create private 192.168.0.0/16 1 65536 \ --fixed_cidr=192.168.100.0/24 --gateway=192.168.1.1 Change-Id: I17edd81e9bc21ca3320233b606c99e03e25201bc
-rwxr-xr-xbin/nova-manage10
-rw-r--r--nova/network/manager.py14
-rw-r--r--nova/tests/fake_network.py2
-rw-r--r--nova/tests/test_network.py2
4 files changed, 18 insertions, 10 deletions
diff --git a/bin/nova-manage b/bin/nova-manage
index 27541965f..35f6f197f 100755
--- a/bin/nova-manage
+++ b/bin/nova-manage
@@ -770,6 +770,8 @@ class NetworkCommands(object):
@args('--dns2', dest="dns2", metavar="<DNS Address>", help='Second DNS')
@args('--uuid', dest="uuid", metavar="<network uuid>",
help='Network UUID')
+ @args('--fixed_cidr', dest="fixed_cidr", metavar='<x.x.x.x/yy>',
+ help='IPv4 subnet for fixed IPS (ex: 10.20.0.0/16)')
@args('--project_id', dest="project_id", metavar="<project id>",
help='Project id')
@args('--priority', dest="priority", metavar="<number>",
@@ -779,7 +781,7 @@ class NetworkCommands(object):
vpn_start=None, fixed_range_v6=None, gateway=None,
gateway_v6=None, bridge=None, bridge_interface=None,
dns1=None, dns2=None, project_id=None, priority=None,
- uuid=None):
+ uuid=None, fixed_cidr=None):
"""Creates fixed ips for host by range"""
# check for certain required inputs
@@ -831,6 +833,9 @@ class NetworkCommands(object):
if not network_size:
network_size = FLAGS.network_size
+ if fixed_cidr:
+ fixed_cidr = netaddr.IPNetwork(fixed_cidr)
+
# create the network
net_manager = utils.import_object(FLAGS.network_manager)
net_manager.create_networks(context.get_admin_context(),
@@ -850,7 +855,8 @@ class NetworkCommands(object):
dns2=dns2,
project_id=project_id,
priority=priority,
- uuid=uuid)
+ uuid=uuid,
+ fixed_cidr=fixed_cidr)
def list(self):
"""List all created networks"""
diff --git a/nova/network/manager.py b/nova/network/manager.py
index d171b0489..493cdbe1b 100644
--- a/nova/network/manager.py
+++ b/nova/network/manager.py
@@ -1223,7 +1223,8 @@ class NetworkManager(manager.SchedulerDependentManager):
def create_networks(self, context, label, cidr, multi_host, num_networks,
network_size, cidr_v6, gateway, gateway_v6, bridge,
- bridge_interface, dns1=None, dns2=None, **kwargs):
+ bridge_interface, dns1=None, dns2=None,
+ fixed_cidr=None, **kwargs):
"""Create networks based on parameters."""
# NOTE(jkoelker): these are dummy values to make sure iter works
# TODO(tr3buchet): disallow carving up networks
@@ -1353,7 +1354,7 @@ class NetworkManager(manager.SchedulerDependentManager):
networks.append(network)
if network and cidr and subnet_v4:
- self._create_fixed_ips(context, network['id'])
+ self._create_fixed_ips(context, network['id'], fixed_cidr)
return networks
@wrap_check_policy
@@ -1381,18 +1382,19 @@ class NetworkManager(manager.SchedulerDependentManager):
"""Number of reserved ips at the top of the range."""
return 1 # broadcast
- def _create_fixed_ips(self, context, network_id):
+ def _create_fixed_ips(self, context, network_id, fixed_cidr=None):
"""Create all fixed ips for network."""
network = self._get_network_by_id(context, network_id)
# NOTE(vish): Should these be properties of the network as opposed
# to properties of the manager class?
bottom_reserved = self._bottom_reserved_ips
top_reserved = self._top_reserved_ips
- project_net = netaddr.IPNetwork(network['cidr'])
- num_ips = len(project_net)
+ if not fixed_cidr:
+ fixed_cidr = netaddr.IPNetwork(network['cidr'])
+ num_ips = len(fixed_cidr)
ips = []
for index in range(num_ips):
- address = str(project_net[index])
+ address = str(fixed_cidr[index])
if index < bottom_reserved or num_ips - index <= top_reserved:
reserved = True
else:
diff --git a/nova/tests/fake_network.py b/nova/tests/fake_network.py
index 3eccf9703..5ab4c74cb 100644
--- a/nova/tests/fake_network.py
+++ b/nova/tests/fake_network.py
@@ -150,7 +150,7 @@ class FakeNetworkManager(network_manager.NetworkManager):
def deallocate_fixed_ip(self, context, address):
self.deallocate_called = address
- def _create_fixed_ips(self, context, network_id):
+ def _create_fixed_ips(self, context, network_id, fixed_cidr=None):
pass
diff --git a/nova/tests/test_network.py b/nova/tests/test_network.py
index 832aaca91..7b4269463 100644
--- a/nova/tests/test_network.py
+++ b/nova/tests/test_network.py
@@ -849,7 +849,7 @@ class CommonNetworkTestCase(test.TestCase):
super(CommonNetworkTestCase, self).setUp()
self.context = context.RequestContext('fake', 'fake')
- def fake_create_fixed_ips(self, context, network_id):
+ def fake_create_fixed_ips(self, context, network_id, fixed_cidr=None):
return None
def test_remove_fixed_ip_from_instance(self):