summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMonty Taylor <mordred@inaugust.com>2015-06-26 10:58:37 -0400
committerMonty Taylor <mordred@inaugust.com>2015-06-26 17:10:41 -0400
commit65dd84515be415fe9f0c5751ecb8b6c51e3fabcb (patch)
tree81428dc86fd2283796078595dae0aca6d05fc9da
parentb631da86fee360533111eb9993e215d6cb64f522 (diff)
downloados-client-config-65dd84515be415fe9f0c5751ecb8b6c51e3fabcb.tar.gz
Add support for indicating preference for IPv6
People, such as Infra, would like to use IPv6 when it's there, but don't want to need to write the "if ipv6, awesome, else, ipv4" code all the time. Change-Id: I870955863f1e8851c684dc604584c1ef3e20dd6b
-rw-r--r--README.rst31
-rw-r--r--os_client_config/cloud_config.py7
-rw-r--r--os_client_config/config.py15
-rw-r--r--os_client_config/tests/base.py3
-rw-r--r--os_client_config/tests/test_cloud_config.py8
-rw-r--r--os_client_config/tests/test_config.py12
-rw-r--r--os_client_config/tests/test_environ.py8
7 files changed, 82 insertions, 2 deletions
diff --git a/README.rst b/README.rst
index 9cdda45..b265341 100644
--- a/README.rst
+++ b/README.rst
@@ -185,6 +185,37 @@ are connecting to OpenStack can share a cache should you desire.
dns_service_type: hpext:dns
+IPv6
+----
+
+IPv6 may be a thing you would prefer to use not only if the cloud supports it,
+but also if your local machine support it. A simple boolean flag is settable
+either in an environment variable, `OS_PREFER_IPV6`, or in the client section
+of the clouds.yaml.
+
+::
+ client:
+ prefer_ipv6: true
+ clouds:
+ mordred:
+ profile: hp
+ auth:
+ username: mordred@inaugust.com
+ password: XXXXXXXXX
+ project_name: mordred@inaugust.com
+ region_name: region-b.geo-1
+ monty:
+ profile: rax
+ auth:
+ username: mordred@inaugust.com
+ password: XXXXXXXXX
+ project_name: mordred@inaugust.com
+ region_name: DFW
+
+The above snippet will tell client programs to prefer returning an IPv6
+address. This will result in calls to, for instance, `shade`'s `get_public_ip`
+to return an IPv4 address on HP, and an IPv6 address on Rackspace.
+
Usage
-----
diff --git a/os_client_config/cloud_config.py b/os_client_config/cloud_config.py
index 19f1bb4..d0586f2 100644
--- a/os_client_config/cloud_config.py
+++ b/os_client_config/cloud_config.py
@@ -16,10 +16,11 @@ import warnings
class CloudConfig(object):
- def __init__(self, name, region, config):
+ def __init__(self, name, region, config, prefer_ipv6=False):
self.name = name
self.region = region
self.config = config
+ self._prefer_ipv6 = prefer_ipv6
def __getattr__(self, key):
"""Return arbitrary attributes."""
@@ -96,3 +97,7 @@ class CloudConfig(object):
def get_service_name(self, service_type):
key = '{service_type}_service_name'.format(service_type=service_type)
return self.config.get(key, service_type)
+
+ @property
+ def prefer_ipv6(self):
+ return self._prefer_ipv6
diff --git a/os_client_config/config.py b/os_client_config/config.py
index d2bc816..7961e72 100644
--- a/os_client_config/config.py
+++ b/os_client_config/config.py
@@ -68,6 +68,8 @@ def set_default(key, value):
def get_boolean(value):
+ if type(value) is bool:
+ return value
if value.lower() == 'true':
return True
return False
@@ -116,6 +118,14 @@ class OpenStackConfig(object):
if 'clouds' not in self.cloud_config:
self.cloud_config['clouds'] = {}
+ # Grab ipv6 preference settings from env
+ client_config = self.cloud_config.get('client', {})
+ self.prefer_ipv6 = get_boolean(
+ os.environ.pop(
+ 'OS_PREFER_IPV6', client_config.get(
+ 'prefer_ipv6', client_config.get(
+ 'prefer-ipv6', False))))
+
# Next, process environment variables and add them to the mix
self.envvar_key = os.environ.pop('OS_CLOUD_NAME', 'envvars')
if self.envvar_key in self.cloud_config['clouds']:
@@ -427,13 +437,16 @@ class OpenStackConfig(object):
if hasattr(value, 'format'):
config[key] = value.format(**config)
+ prefer_ipv6 = config.pop('prefer_ipv6', self.prefer_ipv6)
+
if cloud is None:
cloud_name = ''
else:
cloud_name = str(cloud)
return cloud_config.CloudConfig(
name=cloud_name, region=config['region_name'],
- config=self._normalize_keys(config))
+ config=self._normalize_keys(config),
+ prefer_ipv6=prefer_ipv6)
@staticmethod
def set_one_cloud(config_file, cloud, set_config=None):
diff --git a/os_client_config/tests/base.py b/os_client_config/tests/base.py
index 0a4f456..8bb9145 100644
--- a/os_client_config/tests/base.py
+++ b/os_client_config/tests/base.py
@@ -38,6 +38,9 @@ VENDOR_CONF = {
}
}
USER_CONF = {
+ 'client': {
+ 'prefer_ipv6': True,
+ },
'clouds': {
'_test-cloud_': {
'profile': '_test_cloud_in_our_cloud',
diff --git a/os_client_config/tests/test_cloud_config.py b/os_client_config/tests/test_cloud_config.py
index 5f964db..1a20ebf 100644
--- a/os_client_config/tests/test_cloud_config.py
+++ b/os_client_config/tests/test_cloud_config.py
@@ -39,6 +39,9 @@ class TestCloudConfig(base.TestCase):
# Lookup mystery attribute
self.assertIsNone(cc.x)
+ # Test default ipv6
+ self.assertFalse(cc.prefer_ipv6)
+
def test_iteration(self):
cc = cloud_config.CloudConfig("test1", "region-al", fake_config_dict)
self.assertTrue('a' in cc)
@@ -100,3 +103,8 @@ class TestCloudConfig(base.TestCase):
cc = cloud_config.CloudConfig("test1", "region-xx", config_dict)
(verify, cert) = cc.get_requests_verify_args()
self.assertEqual(("cert", "key"), cert)
+
+ def test_ipv6(self):
+ cc = cloud_config.CloudConfig(
+ "test1", "region-al", fake_config_dict, prefer_ipv6=True)
+ self.assertTrue(cc.prefer_ipv6)
diff --git a/os_client_config/tests/test_config.py b/os_client_config/tests/test_config.py
index f23a6b9..4c244d2 100644
--- a/os_client_config/tests/test_config.py
+++ b/os_client_config/tests/test_config.py
@@ -107,6 +107,18 @@ class TestConfig(base.TestCase):
self.useFixture(fixtures.EnvironmentVariable(k))
c.get_one_cloud(cloud='defaults')
+ def test_prefer_ipv6_true(self):
+ c = config.OpenStackConfig(config_files=[self.cloud_yaml],
+ vendor_files=[self.vendor_yaml])
+ cc = c.get_one_cloud(cloud='_test-cloud_')
+ self.assertTrue(cc.prefer_ipv6)
+
+ def test_prefer_ipv6_false(self):
+ c = config.OpenStackConfig(config_files=[self.no_yaml],
+ vendor_files=[self.no_yaml])
+ cc = c.get_one_cloud(cloud='defaults')
+ self.assertFalse(cc.prefer_ipv6)
+
def test_get_one_cloud_auth_merge(self):
c = config.OpenStackConfig(config_files=[self.cloud_yaml])
cc = c.get_one_cloud(cloud='_test-cloud_', auth={'username': 'user'})
diff --git a/os_client_config/tests/test_environ.py b/os_client_config/tests/test_environ.py
index 365ad67..ff44afc 100644
--- a/os_client_config/tests/test_environ.py
+++ b/os_client_config/tests/test_environ.py
@@ -51,6 +51,14 @@ class TestEnviron(base.TestCase):
cc = c.get_one_cloud('override')
self._assert_cloud_details(cc)
+ def test_envvar_prefer_ipv6_override(self):
+ self.useFixture(
+ fixtures.EnvironmentVariable('OS_PREFER_IPV6', 'false'))
+ c = config.OpenStackConfig(config_files=[self.cloud_yaml],
+ vendor_files=[self.vendor_yaml])
+ cc = c.get_one_cloud('_test-cloud_')
+ self.assertFalse(cc.prefer_ipv6)
+
def test_environ_exists(self):
c = config.OpenStackConfig(config_files=[self.cloud_yaml],
vendor_files=[self.vendor_yaml])