diff options
| author | Michael Gundlach <michael.gundlach@rackspace.com> | 2010-08-26 12:45:20 -0400 |
|---|---|---|
| committer | Michael Gundlach <michael.gundlach@rackspace.com> | 2010-08-26 12:45:20 -0400 |
| commit | 2e2a180f02a262f73097bea5f48b6572af4851bb (patch) | |
| tree | 10fe2897471a00fb424c8e25fad3c86326b27019 | |
| parent | 428b3256ad7e47e9f389ac8ce0ff70cc3d720e9e (diff) | |
| parent | 75eaa1b8f871753b9bd61c2ccd93efd813d651f9 (diff) | |
| download | nova-2e2a180f02a262f73097bea5f48b6572af4851bb.tar.gz nova-2e2a180f02a262f73097bea5f48b6572af4851bb.tar.xz nova-2e2a180f02a262f73097bea5f48b6572af4851bb.zip | |
get to look like trunk
| -rw-r--r-- | nova/network/model.py | 44 | ||||
| -rw-r--r-- | nova/tests/network_unittest.py | 33 | ||||
| -rw-r--r-- | tools/install_venv.py | 4 |
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) |
