Remove ipv6-preferred and rely on interface_ip

shade/occ have a force-ipv4 setting which can be used to change
autodetected behavior, but also have detection for ipv6 viability.
This makes us aggressively use IPv6 and only us v4 if v6 is not
available or has been explicitly disabled. Yay us.

Incidentally, this should also help people use zuul in places that are
completely non-public - as a zuul running in a cloud with a private
network on it and spinning up nodes that only have private networks
means public_v4 won't really have anything in it - but clouds.yaml
supports a private=True setting which will cause the private ip to be
listed as the ip that is desired.

Change-Id: I2b4d992e3b21c00cefe98023267347c02dd961dc
This commit is contained in:
Monty Taylor 2017-03-24 11:14:13 -05:00 committed by James E. Blair
parent 1a1521b489
commit 34cabe207a
9 changed files with 27 additions and 56 deletions

View File

@ -231,7 +231,6 @@ Example::
launch-retries: 3
image-name-format: 'template-{image_name}-{timestamp}'
hostname-format: '{label.name}-{provider.name}-{node.id}'
ipv6-preferred: False
diskimages:
- name: trusty
meta:

View File

@ -56,7 +56,6 @@ class ConfigValidator:
'region-name': str,
'cloud': str,
'max-concurrency': int,
'ipv6-preferred': bool,
'boot-timeout': int,
'launch-timeout': int,
'launch-retries': int,

View File

@ -45,7 +45,6 @@ class Provider(ConfigValue):
other.rate != self.rate or
other.boot_timeout != self.boot_timeout or
other.launch_timeout != self.launch_timeout or
other.ipv6_preferred != self.ipv6_preferred or
other.clean_floating_ips != self.clean_floating_ips or
other.max_concurrency != self.max_concurrency or
other.diskimages != self.diskimages):
@ -216,7 +215,6 @@ def loadConfig(config_path):
p.boot_timeout = provider.get('boot-timeout', 60)
p.launch_timeout = provider.get('launch-timeout', 3600)
p.launch_retries = provider.get('launch-retries', 3)
p.ipv6_preferred = provider.get('ipv6-preferred')
p.clean_floating_ips = provider.get('clean-floating-ips')
p.hostname_format = provider.get(
'hostname-format',

View File

@ -129,6 +129,7 @@ class FakeOpenStackCloud(object):
public_v6 = 'fake_v6'
public_v4 = 'fake'
private_v4 = 'fake'
interface_ip = 'fake_v6'
break
if not addresses:
addresses = dict(
@ -138,6 +139,7 @@ class FakeOpenStackCloud(object):
public_v6 = ''
public_v4 = 'fake'
private_v4 = 'fake'
interface_ip = 'fake'
s = Dummy(instance_type,
id=uuid.uuid4().hex,
@ -148,6 +150,7 @@ class FakeOpenStackCloud(object):
public_v4=public_v4,
public_v6=public_v6,
private_v4=private_v4,
interface_ip=interface_ip,
location=Dummy(Dummy.LOCATION, zone=kw.get('az')),
metadata=kw.get('meta', {}),
manager=self,
@ -210,6 +213,7 @@ class FakeOpenStackCloud(object):
server.public_v4 = 'fake'
server.public_v6 = 'fake'
server.private_v4 = 'fake'
server.interface_ip = 'fake'
return server
def create_server(self, **kw):

View File

@ -324,22 +324,16 @@ class NodeLauncher(threading.Thread, StatsReporter):
if not self._node.az:
self._node.az = server.location.zone
self._node.public_ipv4 = server.public_v4
self._node.public_ipv6 = server.public_v6
preferred_ip = server.public_v4
if self._provider.ipv6_preferred:
if server.public_v6:
preferred_ip = server.public_v6
else:
self.log.warning('Preferred ipv6 not available, '
'falling back to ipv4.')
if not preferred_ip:
interface_ip = server.interface_ip
if not interface_ip:
self.log.debug(
"Server data for failed IP: %s" % pprint.pformat(
server))
raise LaunchNetworkException("Unable to find public IP of server")
self._node.interface_ip = interface_ip
self._node.public_ipv4 = server.public_v4
self._node.public_ipv6 = server.public_v6
self._node.private_ipv4 = server.private_v4
# devstack-gate multi-node depends on private_v4 being populated
# with something. On clouds that don't have a private address, use
@ -350,14 +344,15 @@ class NodeLauncher(threading.Thread, StatsReporter):
# Checkpoint save the updated node info
self._zk.storeNode(self._node)
self.log.debug("Node %s is running [az: %s, ipv4: %s, ipv6: %s]" %
(self._node.id, self._node.az, self._node.public_ipv4,
self._node.public_ipv6))
self.log.debug(
"Node %s is running [az: %s, ip: %s ipv4: %s, ipv6: %s]" %
(self._node.id, self._node.az, self._node.interface_ip,
self._node.public_ipv4, self._node.public_ipv6))
# Get the SSH public keys for the new node and record in ZooKeeper
self.log.debug("Gathering host keys for node %s", self._node.id)
host_keys = utils.keyscan(
preferred_ip, timeout=self._provider.boot_timeout)
interface_ip, timeout=self._provider.boot_timeout)
if not host_keys:
raise LaunchKeyscanException("Unable to gather host keys")
self._node.host_keys = host_keys
@ -381,6 +376,7 @@ class NodeLauncher(threading.Thread, StatsReporter):
self._node.external_id = None
self._node.public_ipv4 = None
self._node.public_ipv6 = None
self._node.inerface_ip = None
self._zk.storeNode(self._node)
if attempts == self._retries:
raise

View File

@ -12,4 +12,4 @@ clouds:
password: 'fake'
project_id: 'fake'
auth_url: 'fake'
image_format: 'vhd'
image_format: 'vhd'

View File

@ -17,14 +17,10 @@ labels:
- name: fake-label2
min-ready: 1
- name: fake-label3
min-ready: 1
providers:
- name: fake-provider1
cloud: fake
region-name: fake-region
ipv6-preferred: True
rate: 0.0001
diskimages:
- name: fake-image
@ -44,25 +40,6 @@ providers:
cloud: fake
region-name: fake-region
rate: 0.0001
diskimages:
- name: fake-image
pools:
- name: main
max-servers: 96
networks:
# This activates a flag in fakeprovider to give us an ipv6
# network
- 'fake-ipv6-network-name'
labels:
- name: fake-label2
diskimage: fake-image
min-ram: 8192
- name: fake-provider3
cloud: fake
region-name: fake-region
ipv6-preferred: True
rate: 0.0001
diskimages:
- name: fake-image
pools:
@ -71,7 +48,7 @@ providers:
networks:
- 'some-name'
labels:
- name: fake-label3
- name: fake-label2
diskimage: fake-image
min-ram: 8192

View File

@ -305,36 +305,30 @@ class TestNodepool(tests.DBTestCase):
self.assertEqual(nodes[0].az, 'az1')
def test_node_ipv6(self):
"""Test that a node is created w/ or w/o ipv6 preferred flag"""
"""Test that ipv6 existence either way works fine."""
configfile = self.setup_config('node_ipv6.yaml')
pool = self.useNodepool(configfile, watermark_sleep=1)
self._useBuilder(configfile)
pool.start()
self.waitForImage('fake-provider1', 'fake-image')
self.waitForImage('fake-provider2', 'fake-image')
self.waitForImage('fake-provider3', 'fake-image')
label1_nodes = self.waitForNodes('fake-label1')
label2_nodes = self.waitForNodes('fake-label2')
label3_nodes = self.waitForNodes('fake-label3')
self.assertEqual(len(label1_nodes), 1)
self.assertEqual(len(label2_nodes), 1)
self.assertEqual(len(label3_nodes), 1)
# ipv6 preferred set to true and ipv6 address available
# ipv6 address available
self.assertEqual(label1_nodes[0].provider, 'fake-provider1')
self.assertEqual(label1_nodes[0].public_ipv4, 'fake')
self.assertEqual(label1_nodes[0].public_ipv6, 'fake_v6')
self.assertEqual(label1_nodes[0].interface_ip, 'fake_v6')
# ipv6 preferred unspecified and ipv6 address available
# ipv6 address unavailable
self.assertEqual(label2_nodes[0].provider, 'fake-provider2')
self.assertEqual(label2_nodes[0].public_ipv4, 'fake')
self.assertEqual(label2_nodes[0].public_ipv6, 'fake_v6')
# ipv6 preferred set to true but ipv6 address unavailable
self.assertEqual(label3_nodes[0].provider, 'fake-provider3')
self.assertEqual(label3_nodes[0].public_ipv4, 'fake')
self.assertEqual(label3_nodes[0].public_ipv6, '')
self.assertEqual(label2_nodes[0].public_ipv6, '')
self.assertEqual(label2_nodes[0].interface_ip, 'fake')
def test_node_delete_success(self):
configfile = self.setup_config('node.yaml')

View File

@ -411,6 +411,7 @@ class Node(BaseModel):
self.public_ipv4 = None
self.private_ipv4 = None
self.public_ipv6 = None
self.interface_ip = None
self.image_id = None
self.launcher = None
self.created_time = None
@ -438,6 +439,7 @@ class Node(BaseModel):
self.public_ipv4 == other.public_ipv4 and
self.private_ipv4 == other.private_ipv4 and
self.public_ipv6 == other.public_ipv6 and
self.interface_ip == other.interface_ip and
self.image_id == other.image_id and
self.launcher == other.launcher and
self.created_time == other.created_time and
@ -461,6 +463,7 @@ class Node(BaseModel):
d['public_ipv4'] = self.public_ipv4
d['private_ipv4'] = self.private_ipv4
d['public_ipv6'] = self.public_ipv6
d['interface_ip'] = self.interface_ip
d['image_id'] = self.image_id
d['launcher'] = self.launcher
d['created_time'] = self.created_time
@ -490,6 +493,7 @@ class Node(BaseModel):
o.public_ipv4 = d.get('public_ipv4')
o.private_ipv4 = d.get('private_ipv4')
o.public_ipv6 = d.get('public_ipv6')
o.interface_ip = d.get('interface_ip')
o.image_id = d.get('image_id')
o.launcher = d.get('launcher')
o.created_time = d.get('created_time')