summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHisaharu Ishii <ishii.hisaharu@lab.ntt.co.jp>2011-01-27 10:08:30 +0000
committerTarmac <>2011-01-27 10:08:30 +0000
commit0a6ab4362284d92cddd22ee6bfa4182c64299064 (patch)
treec67d721ed0203533fc38864552f2e0c0bdffcf1b
parentabb1111ee67d1d157b249c004584dfc16642536e (diff)
parent6273b2f95a905d98c217e98c1dbfc46b097b7533 (diff)
Fix Bug #703037. ra_server is None
-rwxr-xr-xbin/nova-manage4
-rw-r--r--nova/network/linux_net.py11
-rw-r--r--nova/network/manager.py6
-rw-r--r--nova/test.py3
-rw-r--r--nova/tests/test_virt.py13
-rw-r--r--nova/utils.py16
-rw-r--r--nova/virt/libvirt.xml.template6
-rw-r--r--nova/virt/libvirt_conn.py29
8 files changed, 56 insertions, 32 deletions
diff --git a/bin/nova-manage b/bin/nova-manage
index 1b70ebf17..7835ca551 100755
--- a/bin/nova-manage
+++ b/bin/nova-manage
@@ -495,9 +495,9 @@ class NetworkCommands(object):
cidr=fixed_range,
num_networks=int(num_networks),
network_size=int(network_size),
+ cidr_v6=fixed_range_v6,
vlan_start=int(vlan_start),
- vpn_start=int(vpn_start),
- cidr_v6=fixed_range_v6)
+ vpn_start=int(vpn_start))
class ServiceCommands(object):
diff --git a/nova/network/linux_net.py b/nova/network/linux_net.py
index d29e17603..cdd1f666a 100644
--- a/nova/network/linux_net.py
+++ b/nova/network/linux_net.py
@@ -198,9 +198,9 @@ def ensure_bridge(bridge, interface, net_attrs=None):
net_attrs['broadcast'],
net_attrs['netmask']))
if(FLAGS.use_ipv6):
- _execute("sudo ifconfig %s add %s up" % \
- (bridge,
- net_attrs['cidr_v6']))
+ _execute("sudo ip -f inet6 addr change %s dev %s" %
+ (net_attrs['cidr_v6'], bridge))
+ _execute("sudo ifconfig %s up" % bridge)
else:
_execute("sudo ifconfig %s up" % bridge)
if FLAGS.use_nova_chains:
@@ -298,10 +298,9 @@ interface %s
% pid, check_exit_code=False)
if conffile in out:
try:
- _execute('sudo kill -HUP %d' % pid)
- return
+ _execute('sudo kill %d' % pid)
except Exception as exc: # pylint: disable-msg=W0703
- LOG.debug(_("Hupping radvd threw %s"), exc)
+ LOG.debug(_("killing radvd threw %s"), exc)
else:
LOG.debug(_("Pid %d is stale, relaunching radvd"), pid)
command = _ra_cmd(network_ref)
diff --git a/nova/network/manager.py b/nova/network/manager.py
index fe99f2612..fbcbea131 100644
--- a/nova/network/manager.py
+++ b/nova/network/manager.py
@@ -428,6 +428,10 @@ class FlatDHCPManager(FlatManager):
self.driver.ensure_bridge(network_ref['bridge'],
FLAGS.flat_interface,
network_ref)
+ if not FLAGS.fake_network:
+ self.driver.update_dhcp(context, network_id)
+ if(FLAGS.use_ipv6):
+ self.driver.update_ra(context, network_id)
class VlanManager(NetworkManager):
@@ -497,7 +501,7 @@ class VlanManager(NetworkManager):
network_ref['bridge'])
def create_networks(self, context, cidr, num_networks, network_size,
- vlan_start, vpn_start, cidr_v6):
+ cidr_v6, vlan_start, vpn_start):
"""Create networks based on parameters."""
fixed_net = IPy.IP(cidr)
fixed_net_v6 = IPy.IP(cidr_v6)
diff --git a/nova/test.py b/nova/test.py
index 881baccd5..a12cf9d32 100644
--- a/nova/test.py
+++ b/nova/test.py
@@ -69,9 +69,10 @@ class TestCase(unittest.TestCase):
network_manager.VlanManager().create_networks(ctxt,
FLAGS.fixed_range,
5, 16,
+ FLAGS.fixed_range_v6,
FLAGS.vlan_start,
FLAGS.vpn_start,
- FLAGS.fixed_range_v6)
+ )
# emulate some of the mox stuff, we can't use the metaclass
# because it screws with our generators
diff --git a/nova/tests/test_virt.py b/nova/tests/test_virt.py
index 0b9b847a0..95282dbcf 100644
--- a/nova/tests/test_virt.py
+++ b/nova/tests/test_virt.py
@@ -474,6 +474,19 @@ class NWFilterTestCase(test.TestCase):
'project_id': 'fake'})
inst_id = instance_ref['id']
+ ip = '10.11.12.13'
+
+ network_ref = db.project_get_network(self.context,
+ 'fake')
+
+ fixed_ip = {'address': ip,
+ 'network_id': network_ref['id']}
+
+ admin_ctxt = context.get_admin_context()
+ db.fixed_ip_create(admin_ctxt, fixed_ip)
+ db.fixed_ip_update(admin_ctxt, ip, {'allocated': True,
+ 'instance_id': instance_ref['id']})
+
def _ensure_all_called():
instance_filter = 'nova-instance-%s' % instance_ref['name']
secgroup_filter = 'nova-secgroup-%s' % self.security_group['id']
diff --git a/nova/utils.py b/nova/utils.py
index 2f3bd2894..f71a4d880 100644
--- a/nova/utils.py
+++ b/nova/utils.py
@@ -206,21 +206,17 @@ def last_octet(address):
def get_my_linklocal(interface):
try:
if_str = execute("ip -f inet6 -o addr show %s" % interface)
- condition = "\s+inet6\s+([0-9a-f:]+/\d+)\s+scope\s+link"
+ condition = "\s+inet6\s+([0-9a-f:]+)/\d+\s+scope\s+link"
links = [re.search(condition, x) for x in if_str[0].split('\n')]
address = [w.group(1) for w in links if w is not None]
if address[0] is not None:
return address[0]
else:
- return 'fe00::'
- except IndexError as ex:
- LOG.warn(_("Couldn't get Link Local IP of %(interface)s :%(ex)s")
- % locals())
- except ProcessExecutionError as ex:
- LOG.warn(_("Couldn't get Link Local IP of %(interface)s :%(ex)s")
- % locals())
- except:
- return 'fe00::'
+ raise exception.Error(_("Link Local address is not found.:%s")
+ % if_str)
+ except Exception as ex:
+ raise exception.Error(_("Couldn't get Link Local IP of %s :%s")
+ % (interface, ex))
def to_global_ipv6(prefix, mac):
diff --git a/nova/virt/libvirt.xml.template b/nova/virt/libvirt.xml.template
index 8139c3620..88bfbc668 100644
--- a/nova/virt/libvirt.xml.template
+++ b/nova/virt/libvirt.xml.template
@@ -75,11 +75,13 @@
<!-- <model type='virtio'/> CANT RUN virtio network right now -->
<filterref filter="nova-instance-${name}">
<parameter name="IP" value="${ip_address}" />
- <parameter name="DHCPSERVER" value="${dhcp_server}" />
- <parameter name="RASERVER" value="${ra_server}" />
+ <parameter name="DHCPSERVER" value="${dhcp_server}" />
#if $getVar('extra_params', False)
${extra_params}
#end if
+#if $getVar('ra_server', False)
+ <parameter name="RASERVER" value="${ra_server}" />
+#end if
</filterref>
</interface>
diff --git a/nova/virt/libvirt_conn.py b/nova/virt/libvirt_conn.py
index bd5c9c4ee..3562fbd6b 100644
--- a/nova/virt/libvirt_conn.py
+++ b/nova/virt/libvirt_conn.py
@@ -678,8 +678,7 @@ class LibvirtConnection(object):
# Assume that the gateway also acts as the dhcp server.
dhcp_server = network['gateway']
ra_server = network['ra_server']
- if not ra_server:
- ra_server = 'fd00::'
+
if FLAGS.allow_project_net_traffic:
if FLAGS.use_ipv6:
net, mask = _get_net_and_mask(network['cidr'])
@@ -718,11 +717,13 @@ class LibvirtConnection(object):
'mac_address': instance['mac_address'],
'ip_address': ip_address,
'dhcp_server': dhcp_server,
- 'ra_server': ra_server,
'extra_params': extra_params,
'rescue': rescue,
'local': instance_type['local_gb'],
'driver_type': driver_type}
+
+ if ra_server:
+ xml_info['ra_server'] = ra_server + "/128"
if not rescue:
if instance['kernel_id']:
xml_info['kernel'] = xml_info['basepath'] + "/kernel"
@@ -905,6 +906,11 @@ class FirewallDriver(object):
the security group."""
raise NotImplementedError()
+ def _ra_server_for_instance(self, instance):
+ network = db.network_get_by_instance(context.get_admin_context(),
+ instance['id'])
+ return network['ra_server']
+
class NWFilterFirewall(FirewallDriver):
"""
@@ -957,6 +963,10 @@ class NWFilterFirewall(FirewallDriver):
self.static_filters_configured = False
self.handle_security_groups = False
+ def apply_instance_filter(self, instance):
+ """No-op. Everything is done in prepare_instance_filter"""
+ pass
+
def _get_connection(self):
return self._libvirt_get_connection()
_conn = property(_get_connection)
@@ -1115,7 +1125,9 @@ class NWFilterFirewall(FirewallDriver):
'nova-base-ipv6',
'nova-allow-dhcp-server']
if FLAGS.use_ipv6:
- instance_secgroup_filter_children += ['nova-allow-ra-server']
+ ra_server = self._ra_server_for_instance(instance)
+ if ra_server:
+ instance_secgroup_filter_children += ['nova-allow-ra-server']
ctxt = context.get_admin_context()
@@ -1142,10 +1154,6 @@ class NWFilterFirewall(FirewallDriver):
return
- def apply_instance_filter(self, instance):
- """No-op. Everything is done in prepare_instance_filter"""
- pass
-
def refresh_security_group_rules(self, security_group_id):
return self._define_filter(
self.security_group_to_nwfilter_xml(security_group_id))
@@ -1301,8 +1309,9 @@ class IptablesFirewallDriver(FirewallDriver):
elif(ip_version == 6):
# Allow RA responses
ra_server = self._ra_server_for_instance(instance)
- our_rules += ['-A %s -s %s -p icmpv6 '
- '-j ACCEPT' % (chain_name, ra_server)]
+ if ra_server:
+ our_rules += ['-A %s -s %s -p icmpv6 -j ACCEPT' %
+ (chain_name, ra_server + "/128")]
#Allow project network traffic
if (FLAGS.allow_project_net_traffic):
cidrv6 = self._project_cidrv6_for_instance(instance)