summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Gundlach <michael.gundlach@rackspace.com>2010-08-26 12:45:20 -0400
committerMichael Gundlach <michael.gundlach@rackspace.com>2010-08-26 12:45:20 -0400
commit2e2a180f02a262f73097bea5f48b6572af4851bb (patch)
tree10fe2897471a00fb424c8e25fad3c86326b27019
parent428b3256ad7e47e9f389ac8ce0ff70cc3d720e9e (diff)
parent75eaa1b8f871753b9bd61c2ccd93efd813d651f9 (diff)
downloadnova-2e2a180f02a262f73097bea5f48b6572af4851bb.tar.gz
nova-2e2a180f02a262f73097bea5f48b6572af4851bb.tar.xz
nova-2e2a180f02a262f73097bea5f48b6572af4851bb.zip
get to look like trunk
-rw-r--r--nova/network/model.py44
-rw-r--r--nova/tests/network_unittest.py33
-rw-r--r--tools/install_venv.py4
3 files changed, 51 insertions, 30 deletions
diff --git a/nova/network/model.py b/nova/network/model.py
index 6e4fcc47e..557fc92a6 100644
--- a/nova/network/model.py
+++ b/nova/network/model.py
@@ -231,7 +231,8 @@ class BaseNetwork(datastore.BasicModel):
self.network_id = network_id
self.network_str = network_str
super(BaseNetwork, self).__init__()
- self.save()
+ if self.is_new_record():
+ self._create_assigned_set()
@property
def network(self):
@@ -278,6 +279,21 @@ class BaseNetwork(datastore.BasicModel):
"""Remove a host from the datastore"""
self.address_class(ip_address).destroy()
+ def _create_assigned_set(self):
+ for idx in range(self.num_bottom_reserved_ips,
+ len(self.network) - self.num_top_reserved_ips):
+ redis = datastore.Redis.instance()
+ redis.sadd(self._available_key, str(self.network[idx]))
+
+ @property
+ def _available_key(self):
+ return 'available:%s' % self.identifier
+
+ @property
+ def num_available_ips(self):
+ redis = datastore.Redis.instance()
+ return redis.scard(self._available_key)
+
@property
def assigned(self):
"""Returns a list of all assigned addresses"""
@@ -295,15 +311,6 @@ class BaseNetwork(datastore.BasicModel):
return None
@property
- def available(self):
- """Returns a list of all available addresses in the network"""
- for idx in range(self.num_bottom_reserved_ips,
- len(self.network) - self.num_top_reserved_ips):
- address = str(self.network[idx])
- if not address in self.assigned:
- yield address
-
- @property
def num_bottom_reserved_ips(self):
"""Returns number of ips reserved at the bottom of the range"""
return 2 # Network, Gateway
@@ -315,13 +322,14 @@ class BaseNetwork(datastore.BasicModel):
def allocate_ip(self, user_id, project_id, mac, hostname=None):
"""Allocates an ip to a mac address"""
- for address in self.available:
- logging.debug("Allocating IP %s to %s", address, project_id)
- self._add_host(user_id, project_id, address, mac, hostname)
- self.express(address=address)
- return address
- raise exception.NoMoreAddresses("Project %s with network %s" %
- (project_id, str(self.network)))
+ address = datastore.Redis.instance().spop(self._available_key)
+ if not address:
+ raise exception.NoMoreAddresses("Project %s with network %s" %
+ (project_id, str(self.network)))
+ logging.debug("Allocating IP %s to %s", address, project_id)
+ self._add_host(user_id, project_id, address, mac, hostname)
+ self.express(address=address)
+ return address
def lease_ip(self, ip_str):
"""Called when DHCP lease is activated"""
@@ -342,6 +350,7 @@ class BaseNetwork(datastore.BasicModel):
logging.debug("Releasing IP %s", ip_str)
self._rem_host(ip_str)
self.deexpress(address=ip_str)
+ datastore.Redis.instance().sadd(self._available_key, ip_str)
def deallocate_ip(self, ip_str):
"""Deallocates an allocated ip"""
@@ -400,7 +409,6 @@ class BridgedNetwork(BaseNetwork):
def __init__(self, *args, **kwargs):
super(BridgedNetwork, self).__init__(*args, **kwargs)
self['bridge_dev'] = FLAGS.bridge_dev
- self.save()
def express(self, address=None):
super(BridgedNetwork, self).express(address=address)
diff --git a/nova/tests/network_unittest.py b/nova/tests/network_unittest.py
index 34b68f1ed..00b0b97e7 100644
--- a/nova/tests/network_unittest.py
+++ b/nova/tests/network_unittest.py
@@ -184,13 +184,23 @@ class NetworkTestCase(test.TrialTestCase):
def test_ips_are_reused(self):
"""Makes sure that ip addresses that are deallocated get reused"""
- result = self.service.allocate_fixed_ip(
- self.user.id, self.projects[0].id)
- mac = result['mac_address']
- address = result['private_dns_name']
+ net = model.get_project_network(self.projects[0].id, "default")
hostname = "reuse-host"
- net = model.get_project_network(self.projects[0].id, "default")
+ macs = {}
+ addresses = {}
+ num_available_ips = net.num_available_ips
+ for i in range(num_available_ips - 1):
+ result = self.service.allocate_fixed_ip(self.user.id,
+ self.projects[0].id)
+ macs[i] = result['mac_address']
+ addresses[i] = result['private_dns_name']
+ issue_ip(macs[i], addresses[i], hostname, net.bridge_name)
+
+ result = self.service.allocate_fixed_ip(self.user.id,
+ self.projects[0].id)
+ mac = result['mac_address']
+ address = result['private_dns_name']
issue_ip(mac, address, hostname, net.bridge_name)
self.service.deallocate_fixed_ip(address)
@@ -205,6 +215,10 @@ class NetworkTestCase(test.TrialTestCase):
self.service.deallocate_fixed_ip(secondaddress)
release_ip(secondmac, secondaddress, hostname, net.bridge_name)
+ for i in range(len(addresses)):
+ self.service.deallocate_fixed_ip(addresses[i])
+ release_ip(macs[i], addresses[i], hostname, net.bridge_name)
+
def test_available_ips(self):
"""Make sure the number of available ips for the network is correct
@@ -222,7 +236,7 @@ class NetworkTestCase(test.TrialTestCase):
num_available_ips = net_size - (net.num_bottom_reserved_ips +
num_preallocated_ips +
net.num_top_reserved_ips)
- self.assertEqual(num_available_ips, len(list(net.available)))
+ self.assertEqual(num_available_ips, net.num_available_ips)
def test_too_many_addresses(self):
"""Test for a NoMoreAddresses exception when all fixed ips are used.
@@ -232,8 +246,7 @@ class NetworkTestCase(test.TrialTestCase):
hostname = "toomany-hosts"
macs = {}
addresses = {}
- # Number of availaible ips is len of the available list
- num_available_ips = len(list(net.available))
+ num_available_ips = net.num_available_ips
for i in range(num_available_ips):
result = self.service.allocate_fixed_ip(self.user.id,
self.projects[0].id)
@@ -241,14 +254,14 @@ class NetworkTestCase(test.TrialTestCase):
addresses[i] = result['private_dns_name']
issue_ip(macs[i], addresses[i], hostname, net.bridge_name)
- self.assertEqual(len(list(net.available)), 0)
+ self.assertEqual(net.num_available_ips, 0)
self.assertRaises(NoMoreAddresses, self.service.allocate_fixed_ip,
self.user.id, self.projects[0].id)
for i in range(len(addresses)):
self.service.deallocate_fixed_ip(addresses[i])
release_ip(macs[i], addresses[i], hostname, net.bridge_name)
- self.assertEqual(len(list(net.available)), num_available_ips)
+ self.assertEqual(net.num_available_ips, num_available_ips)
def is_in_project(address, project_id):
diff --git a/tools/install_venv.py b/tools/install_venv.py
index 1f0fa3cc7..5d2369a96 100644
--- a/tools/install_venv.py
+++ b/tools/install_venv.py
@@ -95,8 +95,8 @@ def install_dependencies(venv=VENV):
# Tell the virtual env how to "import nova"
- pathfile=os.path.join(venv, "lib", "python2.6", "site-packages", "nova.pth")
- f=open(pathfile, 'w')
+ pthfile = os.path.join(venv, "lib", "python2.6", "site-packages", "nova.pth")
+ f = open(pthfile, 'w')
f.write("%s\n" % ROOT)