summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/network/linux_net.py17
-rw-r--r--nova/tests/test_network.py27
2 files changed, 38 insertions, 6 deletions
diff --git a/nova/network/linux_net.py b/nova/network/linux_net.py
index 0bcc36081..f55662a7a 100644
--- a/nova/network/linux_net.py
+++ b/nova/network/linux_net.py
@@ -18,7 +18,7 @@ Implements vlans, bridges, and iptables rules using linux utilities.
"""
import os
-import time
+import calendar
from nova import db
from nova import exception
@@ -380,12 +380,17 @@ interface %s
def _host_lease(fixed_ip_ref):
"""Return a host string for an address in leasefile format"""
instance_ref = fixed_ip_ref['instance']
- timestamp = time.mktime(instance_ref['updated_at'].timetuple())
+ if instance_ref['updated_at']:
+ timestamp = instance_ref['updated_at']
+ else:
+ timestamp = instance_ref['created_at']
+
+ seconds_since_epoch = calendar.timegm(timestamp.utctimetuple())
- return "%d %s %s %s" % (timestamp + FLAGS.dhcp_lease_time,
- instance_ref['mac_address'],
- instance_ref['hostname'],
- fixed_ip_ref['address'])
+ return "%d %s %s %s *" % (seconds_since_epoch + FLAGS.dhcp_lease_time,
+ instance_ref['mac_address'],
+ fixed_ip_ref['address'],
+ instance_ref['hostname'] or '*')
def _host_dhcp(fixed_ip_ref):
diff --git a/nova/tests/test_network.py b/nova/tests/test_network.py
index ce1c77210..b7a76be85 100644
--- a/nova/tests/test_network.py
+++ b/nova/tests/test_network.py
@@ -20,6 +20,7 @@ Unit Tests for network code
"""
import IPy
import os
+import time
from nova import context
from nova import db
@@ -29,6 +30,7 @@ from nova import log as logging
from nova import test
from nova import utils
from nova.auth import manager
+from nova.network import linux_net
FLAGS = flags.FLAGS
LOG = logging.getLogger('nova.tests.network')
@@ -321,6 +323,31 @@ class NetworkTestCase(test.TestCase):
network['id'])
self.assertEqual(ip_count, num_available_ips)
+ def test_dhcp_lease_output(self):
+ admin_ctxt = context.get_admin_context()
+ address = self._create_address(0, self.instance_id)
+ lease_ip(address)
+ network_ref = db.network_get_by_instance(admin_ctxt, self.instance_id)
+ leases = linux_net.get_dhcp_leases(context.get_admin_context(),
+ network_ref['id'])
+ for line in leases.split('\n'):
+ seconds, mac, ip, hostname, client_id = line.split(' ')
+ self.assertTrue(int(seconds) > time.time(), 'Lease expires in '
+ 'the past')
+ octets = mac.split(':')
+ self.assertEqual(len(octets), 6, "Wrong number of octets "
+ "in %s" % (max,))
+ for octet in octets:
+ self.assertEqual(len(octet), 2, "Oddly sized octet: %s"
+ % (octet,))
+ # This will throw an exception if the octet is invalid
+ int(octet, 16)
+
+ # And this will raise an exception in case of an invalid IP
+ IPy.IP(ip)
+
+ release_ip(address)
+
def is_allocated_in_project(address, project_id):
"""Returns true if address is in specified project"""