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:
parent
1a1521b489
commit
34cabe207a
|
@ -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:
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -12,4 +12,4 @@ clouds:
|
|||
password: 'fake'
|
||||
project_id: 'fake'
|
||||
auth_url: 'fake'
|
||||
image_format: 'vhd'
|
||||
image_format: 'vhd'
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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')
|
||||
|
|
Loading…
Reference in New Issue