From cde60d2ead3211be949bb2a9855e951b8b9cf85e Mon Sep 17 00:00:00 2001 From: Margarita Shakhova Date: Wed, 22 Mar 2017 18:36:36 +0300 Subject: [PATCH] Add endpoint_type option for openstack clients. Interface type internalURL' is used as a default value. Change-Id: Ia1acbfbfd2a1eecd85e5aa1d2e19665d411c4c58 Closes-Bug: #1671405 --- watcher/common/clients.py | 28 ++++++++- watcher/conf/ceilometer_client.py | 7 ++- watcher/conf/cinder_client.py | 7 ++- watcher/conf/glance_client.py | 7 ++- watcher/conf/gnocchi_client.py | 5 ++ watcher/conf/monasca_client.py | 7 ++- watcher/conf/neutron_client.py | 7 ++- watcher/conf/nova_client.py | 7 ++- watcher/tests/common/test_clients.py | 86 ++++++++++++++++++++++++---- 9 files changed, 142 insertions(+), 19 deletions(-) diff --git a/watcher/common/clients.py b/watcher/common/clients.py index a734b68c7..6050db4fc 100644 --- a/watcher/common/clients.py +++ b/watcher/common/clients.py @@ -80,7 +80,9 @@ class OpenStackClients(object): return self._nova novaclient_version = self._get_client_option('nova', 'api_version') + nova_endpoint_type = self._get_client_option('nova', 'endpoint_type') self._nova = nvclient.Client(novaclient_version, + endpoint_type=nova_endpoint_type, session=self.session) return self._nova @@ -90,7 +92,10 @@ class OpenStackClients(object): return self._glance glanceclient_version = self._get_client_option('glance', 'api_version') + glance_endpoint_type = self._get_client_option('glance', + 'endpoint_type') self._glance = glclient.Client(glanceclient_version, + interface=glance_endpoint_type, session=self.session) return self._glance @@ -101,7 +106,10 @@ class OpenStackClients(object): gnocchiclient_version = self._get_client_option('gnocchi', 'api_version') + gnocchiclient_interface = self._get_client_option('gnocchi', + 'endpoint_type') self._gnocchi = gnclient.Client(gnocchiclient_version, + interface=gnocchiclient_interface, session=self.session) return self._gnocchi @@ -111,7 +119,10 @@ class OpenStackClients(object): return self._cinder cinderclient_version = self._get_client_option('cinder', 'api_version') + cinder_endpoint_type = self._get_client_option('cinder', + 'endpoint_type') self._cinder = ciclient.Client(cinderclient_version, + endpoint_type=cinder_endpoint_type, session=self.session) return self._cinder @@ -122,8 +133,12 @@ class OpenStackClients(object): ceilometerclient_version = self._get_client_option('ceilometer', 'api_version') - self._ceilometer = ceclient.get_client(ceilometerclient_version, - session=self.session) + ceilometer_endpoint_type = self._get_client_option('ceilometer', + 'endpoint_type') + self._ceilometer = ceclient.get_client( + ceilometerclient_version, + endpoint_type=ceilometer_endpoint_type, + session=self.session) return self._ceilometer @exception.wrap_keystone_exception @@ -133,6 +148,8 @@ class OpenStackClients(object): monascaclient_version = self._get_client_option( 'monasca', 'api_version') + monascaclient_interface = self._get_client_option( + 'monasca', 'interface') token = self.session.get_token() watcher_clients_auth_config = CONF.get(_CLIENTS_AUTH_GROUP) service_type = 'monitoring' @@ -148,7 +165,8 @@ class OpenStackClients(object): 'username': watcher_clients_auth_config.username, 'password': watcher_clients_auth_config.password, } - endpoint = self.session.get_endpoint(service_type=service_type) + endpoint = self.session.get_endpoint(service_type=service_type, + interface=monascaclient_interface) self._monasca = monclient.Client( monascaclient_version, endpoint, **monasca_kwargs) @@ -162,7 +180,11 @@ class OpenStackClients(object): neutronclient_version = self._get_client_option('neutron', 'api_version') + neutron_endpoint_type = self._get_client_option('neutron', + 'endpoint_type') + self._neutron = netclient.Client(neutronclient_version, + endpoint_type=neutron_endpoint_type, session=self.session) self._neutron.format = 'json' return self._neutron diff --git a/watcher/conf/ceilometer_client.py b/watcher/conf/ceilometer_client.py index 184fa6eb5..48fdf88aa 100644 --- a/watcher/conf/ceilometer_client.py +++ b/watcher/conf/ceilometer_client.py @@ -25,7 +25,12 @@ CEILOMETER_CLIENT_OPTS = [ cfg.StrOpt('api_version', default='2', help='Version of Ceilometer API to use in ' - 'ceilometerclient.')] + 'ceilometerclient.'), + cfg.StrOpt('endpoint_type', + default='internalURL', + help='Type of endpoint to use in ceilometerclient.' + 'Supported values: internalURL, publicURL, adminURL' + 'The default is internalURL.')] def register_opts(conf): diff --git a/watcher/conf/cinder_client.py b/watcher/conf/cinder_client.py index 6021fadec..835d350e8 100644 --- a/watcher/conf/cinder_client.py +++ b/watcher/conf/cinder_client.py @@ -24,7 +24,12 @@ cinder_client = cfg.OptGroup(name='cinder_client', CINDER_CLIENT_OPTS = [ cfg.StrOpt('api_version', default='2', - help='Version of Cinder API to use in cinderclient.')] + help='Version of Cinder API to use in cinderclient.'), + cfg.StrOpt('endpoint_type', + default='internalURL', + help='Type of endpoint to use in cinderclient.' + 'Supported values: internalURL, publicURL, adminURL' + 'The default is internalURL.')] def register_opts(conf): diff --git a/watcher/conf/glance_client.py b/watcher/conf/glance_client.py index a796ffdff..4207b6aa7 100644 --- a/watcher/conf/glance_client.py +++ b/watcher/conf/glance_client.py @@ -24,7 +24,12 @@ glance_client = cfg.OptGroup(name='glance_client', GLANCE_CLIENT_OPTS = [ cfg.StrOpt('api_version', default='2', - help='Version of Glance API to use in glanceclient.')] + help='Version of Glance API to use in glanceclient.'), + cfg.StrOpt('endpoint_type', + default='internalURL', + help='Type of endpoint to use in glanceclient.' + 'Supported values: internalURL, publicURL, adminURL' + 'The default is internalURL.')] def register_opts(conf): diff --git a/watcher/conf/gnocchi_client.py b/watcher/conf/gnocchi_client.py index 1ab0b5585..0e3acce71 100644 --- a/watcher/conf/gnocchi_client.py +++ b/watcher/conf/gnocchi_client.py @@ -25,6 +25,11 @@ GNOCCHI_CLIENT_OPTS = [ cfg.StrOpt('api_version', default='1', help='Version of Gnocchi API to use in gnocchiclient.'), + cfg.StrOpt('endpoint_type', + default='internalURL', + help='Type of endpoint to use in gnocchi client.' + 'Supported values: internalURL, publicURL, adminURL' + 'The default is internalURL.'), cfg.IntOpt('query_max_retries', default=10, help='How many times Watcher is trying to query again'), diff --git a/watcher/conf/monasca_client.py b/watcher/conf/monasca_client.py index 72a279d17..26d54f415 100644 --- a/watcher/conf/monasca_client.py +++ b/watcher/conf/monasca_client.py @@ -24,7 +24,12 @@ monasca_client = cfg.OptGroup(name='monasca_client', MONASCA_CLIENT_OPTS = [ cfg.StrOpt('api_version', default='2_0', - help='Version of Monasca API to use in monascaclient.')] + help='Version of Monasca API to use in monascaclient.'), + cfg.StrOpt('interface', + default='internal', + help='Type of interface used for monasca endpoint.' + 'Supported values: internal, public, admin' + 'The default is internal.')] def register_opts(conf): diff --git a/watcher/conf/neutron_client.py b/watcher/conf/neutron_client.py index 15d089fe3..b8af6cdca 100644 --- a/watcher/conf/neutron_client.py +++ b/watcher/conf/neutron_client.py @@ -24,7 +24,12 @@ neutron_client = cfg.OptGroup(name='neutron_client', NEUTRON_CLIENT_OPTS = [ cfg.StrOpt('api_version', default='2.0', - help='Version of Neutron API to use in neutronclient.')] + help='Version of Neutron API to use in neutronclient.'), + cfg.StrOpt('endpoint_type', + default='internalURL', + help='Type of endpoint to use in neutronclient.' + 'Supported values: internalURL, publicURL, adminURL' + 'The default is internalURL.')] def register_opts(conf): diff --git a/watcher/conf/nova_client.py b/watcher/conf/nova_client.py index 64f969c5f..519ed49e3 100644 --- a/watcher/conf/nova_client.py +++ b/watcher/conf/nova_client.py @@ -24,7 +24,12 @@ nova_client = cfg.OptGroup(name='nova_client', NOVA_CLIENT_OPTS = [ cfg.StrOpt('api_version', default='2', - help='Version of Nova API to use in novaclient.')] + help='Version of Nova API to use in novaclient.'), + cfg.StrOpt('endpoint_type', + default='internalURL', + help='Type of endpoint to use in novaclient.' + 'Supported values: internalURL, publicURL, adminURL' + 'The default is internalURL.')] def register_opts(conf): diff --git a/watcher/tests/common/test_clients.py b/watcher/tests/common/test_clients.py index fbc8e65f9..56fd5f242 100644 --- a/watcher/tests/common/test_clients.py +++ b/watcher/tests/common/test_clients.py @@ -115,8 +115,10 @@ class TestClients(base.TestCase): osc = clients.OpenStackClients() osc._nova = None osc.nova() - mock_call.assert_called_once_with(CONF.nova_client.api_version, - session=mock_session) + mock_call.assert_called_once_with( + CONF.nova_client.api_version, + endpoint_type=CONF.nova_client.endpoint_type, + session=mock_session) @mock.patch.object(clients.OpenStackClients, 'session') def test_clients_nova_diff_vers(self, mock_session): @@ -126,6 +128,14 @@ class TestClients(base.TestCase): osc.nova() self.assertEqual('2.3', osc.nova().api_version.get_string()) + @mock.patch.object(clients.OpenStackClients, 'session') + def test_clients_nova_diff_endpoint(self, mock_session): + CONF.set_override('endpoint_type', 'publicURL', group='nova_client') + osc = clients.OpenStackClients() + osc._nova = None + osc.nova() + self.assertEqual('publicURL', osc.nova().client.interface) + @mock.patch.object(clients.OpenStackClients, 'session') def test_clients_nova_cached(self, mock_session): osc = clients.OpenStackClients() @@ -140,8 +150,10 @@ class TestClients(base.TestCase): osc = clients.OpenStackClients() osc._glance = None osc.glance() - mock_call.assert_called_once_with(CONF.glance_client.api_version, - session=mock_session) + mock_call.assert_called_once_with( + CONF.glance_client.api_version, + interface=CONF.glance_client.endpoint_type, + session=mock_session) @mock.patch.object(clients.OpenStackClients, 'session') def test_clients_glance_diff_vers(self, mock_session): @@ -151,6 +163,14 @@ class TestClients(base.TestCase): osc.glance() self.assertEqual(1.0, osc.glance().version) + @mock.patch.object(clients.OpenStackClients, 'session') + def test_clients_glance_diff_endpoint(self, mock_session): + CONF.set_override('endpoint_type', 'publicURL', group='glance_client') + osc = clients.OpenStackClients() + osc._glance = None + osc.glance() + self.assertEqual('publicURL', osc.glance().http_client.interface) + @mock.patch.object(clients.OpenStackClients, 'session') def test_clients_glance_cached(self, mock_session): osc = clients.OpenStackClients() @@ -165,8 +185,10 @@ class TestClients(base.TestCase): osc = clients.OpenStackClients() osc._gnocchi = None osc.gnocchi() - mock_call.assert_called_once_with(CONF.gnocchi_client.api_version, - session=mock_session) + mock_call.assert_called_once_with( + CONF.gnocchi_client.api_version, + interface=CONF.gnocchi_client.endpoint_type, + session=mock_session) @mock.patch.object(clients.OpenStackClients, 'session') def test_clients_gnocchi_diff_vers(self, mock_session): @@ -177,6 +199,15 @@ class TestClients(base.TestCase): osc.gnocchi() self.assertEqual(gnclient_v1.Client, type(osc.gnocchi())) + @mock.patch.object(clients.OpenStackClients, 'session') + def test_clients_gnocchi_diff_endpoint(self, mock_session): + # gnocchiclient currently only has one version (v1) + CONF.set_override('endpoint_type', 'publicURL', group='gnocchi_client') + osc = clients.OpenStackClients() + osc._gnocchi = None + osc.gnocchi() + self.assertEqual('publicURL', osc.gnocchi().api.interface) + @mock.patch.object(clients.OpenStackClients, 'session') def test_clients_gnocchi_cached(self, mock_session): osc = clients.OpenStackClients() @@ -191,8 +222,10 @@ class TestClients(base.TestCase): osc = clients.OpenStackClients() osc._cinder = None osc.cinder() - mock_call.assert_called_once_with(CONF.cinder_client.api_version, - session=mock_session) + mock_call.assert_called_once_with( + CONF.cinder_client.api_version, + endpoint_type=CONF.cinder_client.endpoint_type, + session=mock_session) @mock.patch.object(clients.OpenStackClients, 'session') def test_clients_cinder_diff_vers(self, mock_session): @@ -202,6 +235,14 @@ class TestClients(base.TestCase): osc.cinder() self.assertEqual(ciclient_v1.Client, type(osc.cinder())) + @mock.patch.object(clients.OpenStackClients, 'session') + def test_clients_cinder_diff_endpoint(self, mock_session): + CONF.set_override('endpoint_type', 'publicURL', group='cinder_client') + osc = clients.OpenStackClients() + osc._cinder = None + osc.cinder() + self.assertEqual('publicURL', osc.cinder().client.interface) + @mock.patch.object(clients.OpenStackClients, 'session') def test_clients_cinder_cached(self, mock_session): osc = clients.OpenStackClients() @@ -219,6 +260,7 @@ class TestClients(base.TestCase): mock_call.assert_called_once_with( CONF.ceilometer_client.api_version, None, + endpoint_type=CONF.ceilometer_client.endpoint_type, session=mock_session) @mock.patch.object(clients.OpenStackClients, 'session') @@ -235,6 +277,18 @@ class TestClients(base.TestCase): self.assertEqual(ceclient_v2.Client, type(osc.ceilometer())) + @mock.patch.object(clients.OpenStackClients, 'session') + @mock.patch.object(ceclient_v2.Client, '_get_redirect_client') + def test_clients_ceilometer_diff_endpoint(self, mock_get_redirect_client, + mock_session): + mock_get_redirect_client.return_value = [mock.Mock(), mock.Mock()] + CONF.set_override('endpoint_type', 'publicURL', + group='ceilometer_client') + osc = clients.OpenStackClients() + osc._ceilometer = None + osc.ceilometer() + self.assertEqual('publicURL', osc.ceilometer().http_client.interface) + @mock.patch.object(clients.OpenStackClients, 'session') @mock.patch.object(ceclient_v2.Client, '_get_redirect_client') def test_clients_ceilometer_cached(self, mock_get_redirect_client, @@ -252,8 +306,10 @@ class TestClients(base.TestCase): osc = clients.OpenStackClients() osc._neutron = None osc.neutron() - mock_call.assert_called_once_with(CONF.neutron_client.api_version, - session=mock_session) + mock_call.assert_called_once_with( + CONF.neutron_client.api_version, + endpoint_type=CONF.neutron_client.endpoint_type, + session=mock_session) @mock.patch.object(clients.OpenStackClients, 'session') def test_clients_neutron_diff_vers(self, mock_session): @@ -266,6 +322,16 @@ class TestClients(base.TestCase): self.assertEqual(netclient_v2.Client, type(osc.neutron())) + @mock.patch.object(clients.OpenStackClients, 'session') + def test_clients_neutron_diff_endpoint(self, mock_session): + '''neutronclient currently only has one version (v2)''' + CONF.set_override('endpoint_type', 'publicURL', + group='neutron_client') + osc = clients.OpenStackClients() + osc._neutron = None + osc.neutron() + self.assertEqual('publicURL', osc.neutron().httpclient.interface) + @mock.patch.object(clients.OpenStackClients, 'session') def test_clients_neutron_cached(self, mock_session): osc = clients.OpenStackClients()