summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xbin/nova-dhcpbridge4
-rw-r--r--etc/nova/nova.conf.sample2
-rw-r--r--nova/network/linux_net.py9
-rw-r--r--nova/servicegroup/drivers/zk.py12
-rw-r--r--nova/tests/network/test_linux_net.py3
-rw-r--r--nova/tests/test_libvirt.py6
-rw-r--r--nova/tests/test_migrations.py3
-rw-r--r--nova/tests/test_xenapi.py6
-rw-r--r--nova/virt/firewall.py12
-rwxr-xr-xtools/hacking.py3
10 files changed, 41 insertions, 19 deletions
diff --git a/bin/nova-dhcpbridge b/bin/nova-dhcpbridge
index c00578821..1acaf4cd1 100755
--- a/bin/nova-dhcpbridge
+++ b/bin/nova-dhcpbridge
@@ -42,6 +42,7 @@ from nova import context
from nova import db
from nova.network import rpcapi as network_rpcapi
from nova.openstack.common import importutils
+from nova.openstack.common import jsonutils
from nova.openstack.common import log as logging
from nova.openstack.common import rpc
@@ -121,7 +122,8 @@ def main():
except KeyError:
config_file = os.environ['FLAGFILE']
- config.parse_args(sys.argv, default_config_files=[config_file])
+ config.parse_args(sys.argv,
+ default_config_files=jsonutils.loads(config_file))
logging.setup("nova")
diff --git a/etc/nova/nova.conf.sample b/etc/nova/nova.conf.sample
index 9cbb8c1a5..a094469f7 100644
--- a/etc/nova/nova.conf.sample
+++ b/etc/nova/nova.conf.sample
@@ -970,7 +970,7 @@
# Options defined in nova.network.linux_net
#
-# location of flagfile for dhcpbridge (string value)
+# location of flagfile(s) for dhcpbridge (multi valued)
#dhcpbridge_flagfile=/etc/nova/nova-dhcpbridge.conf
# Location to keep network config files (string value)
diff --git a/nova/network/linux_net.py b/nova/network/linux_net.py
index 29b882a02..5c20f9ce8 100644
--- a/nova/network/linux_net.py
+++ b/nova/network/linux_net.py
@@ -31,6 +31,7 @@ from nova import db
from nova import exception
from nova.openstack.common import fileutils
from nova.openstack.common import importutils
+from nova.openstack.common import jsonutils
from nova.openstack.common import lockutils
from nova.openstack.common import log as logging
from nova.openstack.common import timeutils
@@ -41,9 +42,9 @@ LOG = logging.getLogger(__name__)
linux_net_opts = [
- cfg.StrOpt('dhcpbridge_flagfile',
- default='/etc/nova/nova-dhcpbridge.conf',
- help='location of flagfile for dhcpbridge'),
+ cfg.MultiStrOpt('dhcpbridge_flagfile',
+ default=['/etc/nova/nova-dhcpbridge.conf'],
+ help='location of flagfiles for dhcpbridge'),
cfg.StrOpt('networks_path',
default=paths.state_path_def('networks'),
help='Location to keep network config files'),
@@ -994,7 +995,7 @@ def restart_dhcp(context, dev, network_ref):
LOG.debug(_('Pid %d is stale, relaunching dnsmasq'), pid)
cmd = ['env',
- 'CONFIG_FILE=%s' % CONF.dhcpbridge_flagfile,
+ 'CONFIG_FILE=%s' % jsonutils.dumps(CONF.dhcpbridge_flagfile),
'NETWORK_ID=%s' % str(network_ref['id']),
'dnsmasq',
'--strict-order',
diff --git a/nova/servicegroup/drivers/zk.py b/nova/servicegroup/drivers/zk.py
index 92b49f274..b3c2ba965 100644
--- a/nova/servicegroup/drivers/zk.py
+++ b/nova/servicegroup/drivers/zk.py
@@ -59,15 +59,15 @@ class ZooKeeperDriver(api.ServiceGroupDriver):
def __init__(self, *args, **kwargs):
"""Create the zk session object."""
null = open(os.devnull, "w")
- self._session = evzookeeper.ZKSession(CONF.zk.address,
+ self._session = evzookeeper.ZKSession(CONF.zookeeper.address,
recv_timeout=
- CONF.zk.recv_timeout,
+ CONF.zookeeper.recv_timeout,
zklog_fd=null)
self._memberships = {}
self._monitors = {}
# Make sure the prefix exists
try:
- self._session.create(CONF.zk.sg_prefix, "",
+ self._session.create(CONF.zookeeper.sg_prefix, "",
acl=[evzookeeper.ZOO_OPEN_ACL_UNSAFE])
except zookeeper.NodeExistsException:
pass
@@ -82,7 +82,7 @@ class ZooKeeperDriver(api.ServiceGroupDriver):
member = self._memberships.get((group, member_id), None)
if member is None:
# the first time to join. Generate a new object
- path = "%s/%s" % (CONF.zk.sg_prefix, group)
+ path = "%s/%s" % (CONF.zookeeper.sg_prefix, group)
try:
member = membership.Membership(self._session, path, member_id)
except RuntimeError:
@@ -90,7 +90,7 @@ class ZooKeeperDriver(api.ServiceGroupDriver):
"another node exists with the same name, or "
"this node just restarted. We will try "
"again in a short while to make sure."))
- eventlet.sleep(CONF.zk.sg_retry_interval)
+ eventlet.sleep(CONF.zookeeper.sg_retry_interval)
member = membership.Membership(self._session, path, member_id)
self._memberships[(group, member_id)] = member
return FakeLoopingCall(self, member_id, group)
@@ -120,7 +120,7 @@ class ZooKeeperDriver(api.ServiceGroupDriver):
"""
monitor = self._monitors.get(group_id, None)
if monitor is None:
- path = "%s/%s" % (CONF.zk.sg_prefix, group_id)
+ path = "%s/%s" % (CONF.zookeeper.sg_prefix, group_id)
monitor = membership.MembershipMonitor(self._session, path)
self._monitors[group_id] = monitor
# Note(maoy): When initialized for the first time, it takes a
diff --git a/nova/tests/network/test_linux_net.py b/nova/tests/network/test_linux_net.py
index cba08d9ce..4eac0c88c 100644
--- a/nova/tests/network/test_linux_net.py
+++ b/nova/tests/network/test_linux_net.py
@@ -26,6 +26,7 @@ from nova import db
from nova.network import driver
from nova.network import linux_net
from nova.openstack.common import fileutils
+from nova.openstack.common import jsonutils
from nova.openstack.common import log as logging
from nova.openstack.common import timeutils
from nova import test
@@ -496,7 +497,7 @@ class LinuxNetworkTestCase(test.TestCase):
dev = 'br100'
linux_net.restart_dhcp(self.context, dev, network_ref)
expected = ['env',
- 'CONFIG_FILE=%s' % CONF.dhcpbridge_flagfile,
+ 'CONFIG_FILE=%s' % jsonutils.dumps(CONF.dhcpbridge_flagfile),
'NETWORK_ID=fake',
'dnsmasq',
'--strict-order',
diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py
index cad556851..fcd66dae8 100644
--- a/nova/tests/test_libvirt.py
+++ b/nova/tests/test_libvirt.py
@@ -3948,8 +3948,10 @@ class IptablesFirewallTestCase(test.TestCase):
ipv6 = self.fw.iptables.ipv6['filter'].rules
ipv4_network_rules = len(ipv4) - len(inst_ipv4) - ipv4_len
ipv6_network_rules = len(ipv6) - len(inst_ipv6) - ipv6_len
- self.assertEquals(ipv4_network_rules,
- ipv4_rules_per_addr * ipv4_addr_per_network * networks_count)
+ # Extra rule is for the DHCP request
+ rules = (ipv4_rules_per_addr * ipv4_addr_per_network *
+ networks_count) + 1
+ self.assertEquals(ipv4_network_rules, rules)
self.assertEquals(ipv6_network_rules,
ipv6_rules_per_addr * ipv6_addr_per_network * networks_count)
diff --git a/nova/tests/test_migrations.py b/nova/tests/test_migrations.py
index 55963a81b..ef25ca726 100644
--- a/nova/tests/test_migrations.py
+++ b/nova/tests/test_migrations.py
@@ -248,7 +248,8 @@ class BaseMigrationTestCase(test.TestCase):
def execute_cmd(cmd=None):
status, output = commands.getstatusoutput(cmd)
LOG.debug(output)
- self.assertEqual(0, status)
+ self.assertEqual(0, status,
+ "Failed to run: %s\n%s" % (cmd, output))
for key, engine in self.engines.items():
conn_string = self.test_databases[key]
conn_pieces = urlparse.urlparse(conn_string)
diff --git a/nova/tests/test_xenapi.py b/nova/tests/test_xenapi.py
index 84c3caa63..10dc70741 100644
--- a/nova/tests/test_xenapi.py
+++ b/nova/tests/test_xenapi.py
@@ -2068,8 +2068,10 @@ class XenAPIDom0IptablesFirewallTestCase(stubs.XenAPITestBase):
ipv6 = self.fw.iptables.ipv6['filter'].rules
ipv4_network_rules = len(ipv4) - len(inst_ipv4) - ipv4_len
ipv6_network_rules = len(ipv6) - len(inst_ipv6) - ipv6_len
- self.assertEquals(ipv4_network_rules,
- ipv4_rules_per_addr * ipv4_addr_per_network * networks_count)
+ # Extra rule is for the DHCP request
+ rules = (ipv4_rules_per_addr * ipv4_addr_per_network *
+ networks_count) + 1
+ self.assertEquals(ipv4_network_rules, rules)
self.assertEquals(ipv6_network_rules,
ipv6_rules_per_addr * ipv6_addr_per_network * networks_count)
diff --git a/nova/virt/firewall.py b/nova/virt/firewall.py
index a36beb7f0..d9502ec46 100644
--- a/nova/virt/firewall.py
+++ b/nova/virt/firewall.py
@@ -149,6 +149,10 @@ class IptablesFirewallDriver(FirewallDriver):
self.network_infos = {}
self.basically_filtered = False
+ # Flags for DHCP request rule
+ self.dhcp_create = False
+ self.dhcp_created = False
+
self.iptables.ipv4['filter'].add_chain('sg-fallback')
self.iptables.ipv4['filter'].add_rule('sg-fallback', '-j DROP')
self.iptables.ipv6['filter'].add_chain('sg-fallback')
@@ -191,6 +195,13 @@ class IptablesFirewallDriver(FirewallDriver):
LOG.debug(_('Filters added to instance'), instance=instance)
self.refresh_provider_fw_rules()
LOG.debug(_('Provider Firewall Rules refreshed'), instance=instance)
+ # Ensure that DHCP request rule is updated if necessary
+ if (self.dhcp_create and not self.dhcp_created):
+ self.iptables.ipv4['filter'].add_rule(
+ 'INPUT',
+ '-s 0.0.0.0/32 -d 255.255.255.255/32 '
+ '-p udp -m udp --sport 68 --dport 67 -j ACCEPT')
+ self.dhcp_created = True
self.iptables.apply()
def _create_filter(self, ips, chain_name):
@@ -272,6 +283,7 @@ class IptablesFirewallDriver(FirewallDriver):
if dhcp_server:
ipv4_rules.append('-s %s -p udp --sport 67 --dport 68 '
'-j ACCEPT' % (dhcp_server,))
+ self.dhcp_create = True
def _do_project_network_rules(self, ipv4_rules, ipv6_rules, network_info):
# make sure this is legacy nw_info
diff --git a/tools/hacking.py b/tools/hacking.py
index 1279e87e9..5b301d540 100755
--- a/tools/hacking.py
+++ b/tools/hacking.py
@@ -201,7 +201,8 @@ def nova_import_rules(logical_line):
# NOTE(vish): the import error might be due
# to a missing dependency
missing = str(exc).split()[-1]
- if missing != mod.split('.')[-1]:
+ if (missing != mod.split('.')[-1] or
+ "cannot import" in str(exc)):
_missingImport.add(missing)
return True
return False