Add use-internal-endpoints configuration option

Point OpenStack clients in the charm code at the requested
endpoint type.

Co-authored-by: Vern Hart <vern.hart@canonical.com>
Change-Id: Iad176d8b6a05b0c3a5bf4df3fdbb8097757799d3
Closes-Bug: #1895088
This commit is contained in:
Frode Nordahl 2020-09-11 10:24:35 +02:00
parent b3f7acc571
commit 035c228f7c
No known key found for this signature in database
GPG Key ID: 6A5D59A3BA48373F
6 changed files with 38 additions and 8 deletions

View File

@ -23,6 +23,5 @@ config:
- ssl_ca - ssl_ca
- ssl_cert - ssl_cert
- ssl_key - ssl_key
- use-internal-endpoints
- use-syslog - use-syslog
- verbose - verbose

View File

@ -47,15 +47,20 @@ def session_from_identity_credentials(identity_credentials):
return session return session
def get_glance_client(session): def get_glance_client(session, endpoint_type=None):
"""Get Glance Client from Keystone Session. """Get Glance Client from Keystone Session.
:param session: Keystone Session object :param session: Keystone Session object
:type session: keystoneauth1.session.Session :type session: keystoneauth1.session.Session
:param endpoint_type: Type of endpoint the client should connect to
:type endpoint_type: Optional[str]
:returns: Glance Client :returns: Glance Client
:rtype: glanceclient.Client :rtype: glanceclient.Client
""" """
return glanceclient.Client('2', session=session) endpoint = session.auth.get_endpoint(
session, service_type='image', interface=endpoint_type or 'publicURL')
return glanceclient.Client(
'2', session=session, endpoint=endpoint)
def get_product_name(stream=None, variant=None, release=None, arch=None): def get_product_name(stream=None, variant=None, release=None, arch=None):

View File

@ -73,6 +73,16 @@ class OctaviaDiskimageRetrofitCharm(charms_openstack.charm.OpenStackCharm):
project='services', project='services',
domain='service_domain') domain='service_domain')
def endpoint_type(self):
"""Determine which endpoint type to use for OpenStack clients.
:returns: Endpoint type to use
:rtype: str
"""
if self.options.use_internal_endpoints:
return 'internalURL'
return 'publicURL'
def retrofit(self, keystone_endpoint, force=False, image_id=''): def retrofit(self, keystone_endpoint, force=False, image_id=''):
"""Use ``octavia-diskimage-retrofit`` tool to retrofit an image. """Use ``octavia-diskimage-retrofit`` tool to retrofit an image.
@ -88,7 +98,8 @@ class OctaviaDiskimageRetrofitCharm(charms_openstack.charm.OpenStackCharm):
""" """
session = glance_retrofitter.session_from_identity_credentials( session = glance_retrofitter.session_from_identity_credentials(
keystone_endpoint) keystone_endpoint)
glance = glance_retrofitter.get_glance_client(session) glance = glance_retrofitter.get_glance_client(
session, endpoint_type=self.endpoint_type())
ubuntu_release = self.get_ubuntu_release( ubuntu_release = self.get_ubuntu_release(
series=self.config['retrofit-series']) series=self.config['retrofit-series'])

View File

@ -4,7 +4,7 @@
# https://github.com/openstack-charmers/release-tools # https://github.com/openstack-charmers/release-tools
# #
# Lint and unit test requirements # Lint and unit test requirements
flake8>=2.2.4,<=2.4.1 flake8>=2.2.4
stestr>=2.2.0 stestr>=2.2.0
requests>=2.18.4 requests>=2.18.4
charms.reactive charms.reactive

View File

@ -48,9 +48,19 @@ class TestGlanceRetrofitter(test_utils.PatchHelper):
def test_get_glance_client(self): def test_get_glance_client(self):
self.patch_object(glance_retrofitter.glanceclient, 'Client') self.patch_object(glance_retrofitter.glanceclient, 'Client')
result = glance_retrofitter.get_glance_client('aSession') session = mock.MagicMock()
self.Client.assert_called_once_with('2', session='aSession') result = glance_retrofitter.get_glance_client(
session, endpoint_type='aEndpointType')
session.auth.get_endpoint.assert_called_once_with(
session, service_type='image', interface='aEndpointType')
self.Client.assert_called_once_with(
'2', session=session, endpoint=session.auth.get_endpoint())
self.assertEquals(result, self.Client()) self.assertEquals(result, self.Client())
session.reset_mock()
result = glance_retrofitter.get_glance_client(
session)
session.auth.get_endpoint.assert_called_once_with(
session, service_type='image', interface='publicURL')
def test_get_product_name(self): def test_get_product_name(self):
self.patch_object(glance_retrofitter.subprocess, 'check_output') self.patch_object(glance_retrofitter.subprocess, 'check_output')

View File

@ -27,6 +27,10 @@ class TestOctaviaDiskimageRetrofitCharm(test_utils.PatchHelper):
super().setUp() super().setUp()
self.patch_release( self.patch_release(
octavia_diskimage_retrofit.OctaviaDiskimageRetrofitCharm.release) octavia_diskimage_retrofit.OctaviaDiskimageRetrofitCharm.release)
self.patch_object(octavia_diskimage_retrofit.ch_core.hookenv, 'config')
self.config.side_effect = lambda: {
'use-internal-endpoints': False,
}
self.target = ( self.target = (
octavia_diskimage_retrofit.OctaviaDiskimageRetrofitCharm()) octavia_diskimage_retrofit.OctaviaDiskimageRetrofitCharm())
@ -144,7 +148,8 @@ class TestOctaviaDiskimageRetrofitCharm(test_utils.PatchHelper):
self.glance_retrofitter.session_from_identity_credentials.\ self.glance_retrofitter.session_from_identity_credentials.\
assert_called_once_with('aKeystone') assert_called_once_with('aKeystone')
self.glance_retrofitter.get_glance_client.assert_called_once_with( self.glance_retrofitter.get_glance_client.assert_called_once_with(
self.glance_retrofitter.session_from_identity_credentials()) self.glance_retrofitter.session_from_identity_credentials(),
endpoint_type='publicURL')
self.glance_retrofitter.find_destination_image.return_value = \ self.glance_retrofitter.find_destination_image.return_value = \
[] []
self.hookenv.env_proxy_settings.return_value = proxy_envvars self.hookenv.env_proxy_settings.return_value = proxy_envvars