From 885c98a40368c6d4877b49b4d9e1b631a13ad03a Mon Sep 17 00:00:00 2001 From: Nir Magnezi Date: Mon, 15 Jul 2019 15:24:19 +0300 Subject: [PATCH] Adds octavia client integration Change-Id: I8ebec7f260c4b7a8c7202f6161d2a5947463ac50 --- requirements.txt | 1 + tobiko/openstack/octavia/__init__.py | 21 ++++ tobiko/openstack/octavia/_client.py | 62 ++++++++++ .../tests/unit/openstack/octavia/__init__.py | 0 .../unit/openstack/octavia/test_client.py | 106 ++++++++++++++++++ 5 files changed, 190 insertions(+) create mode 100644 tobiko/openstack/octavia/__init__.py create mode 100644 tobiko/openstack/octavia/_client.py create mode 100644 tobiko/tests/unit/openstack/octavia/__init__.py create mode 100644 tobiko/tests/unit/openstack/octavia/test_client.py diff --git a/requirements.txt b/requirements.txt index 2982839d4..c3f9be387 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,6 +14,7 @@ pbr>=4.0.0 # Apache-2.0 python-heatclient>=1.5.0 # Apache-2.0 python-neutronclient>=6.7.0 # Apache-2.0 python-novaclient>=9.1.0 # Apache-2.0 +python-octaviaclient>=1.9.0 # Apache-2.0 python-openstackclient>=3.0.0 # Apache-2.0 stestr>=2.0 # Apache-2.0 six>=1.10.0 # MIT diff --git a/tobiko/openstack/octavia/__init__.py b/tobiko/openstack/octavia/__init__.py new file mode 100644 index 000000000..630f8254b --- /dev/null +++ b/tobiko/openstack/octavia/__init__.py @@ -0,0 +1,21 @@ +# Copyright 2019 Red Hat +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +from __future__ import absolute_import + +from tobiko.openstack.octavia import _client + + +octavia_client = _client.octavia_client +get_octavia_client = _client.get_octavia_client +OctaviaClientFixture = _client.OctaviaClientFixture diff --git a/tobiko/openstack/octavia/_client.py b/tobiko/openstack/octavia/_client.py new file mode 100644 index 000000000..fb84f6463 --- /dev/null +++ b/tobiko/openstack/octavia/_client.py @@ -0,0 +1,62 @@ +# Copyright 2019 Red Hat +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +from __future__ import absolute_import + +from octaviaclient.api.v2 import octavia + +import tobiko +from tobiko.openstack import _client +from tobiko.openstack import keystone + + +class OctaviaClientFixture(_client.OpenstackClientFixture): + + def init_client(self, session): + keystone_client = keystone.get_keystone_client(session=session) + endpoint = keystone.find_service_endpoint(name='octavia', + client=keystone_client) + return octavia.OctaviaAPI(session=session, endpoint=endpoint.url) + + +class OctaviaClientManatger(_client.OpenstackClientManager): + + def create_client(self, session): + return OctaviaClientFixture(session=session) + + +CLIENTS = OctaviaClientManatger() + + +def octavia_client(obj): + if not obj: + return get_octavia_client() + + if isinstance(obj, octavia.OctaviaAPI): + return obj + + fixture = tobiko.setup_fixture(obj) + if isinstance(fixture, OctaviaClientFixture): + return fixture.client + + message = "Object {!r} is not an OctaviaClientFixture".format(obj) + raise TypeError(message) + + +def get_octavia_client(session=None, shared=True, init_client=None, + manager=None): + manager = manager or CLIENTS + client = manager.get_client(session=session, shared=shared, + init_client=init_client) + tobiko.setup_fixture(client) + return client.client diff --git a/tobiko/tests/unit/openstack/octavia/__init__.py b/tobiko/tests/unit/openstack/octavia/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tobiko/tests/unit/openstack/octavia/test_client.py b/tobiko/tests/unit/openstack/octavia/test_client.py new file mode 100644 index 000000000..ee76e98fc --- /dev/null +++ b/tobiko/tests/unit/openstack/octavia/test_client.py @@ -0,0 +1,106 @@ +# Copyright 2019 Red Hat +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +from __future__ import absolute_import + +import inspect + +from keystoneclient.v3 import endpoints +from octaviaclient.api.v2 import octavia as octaviaclient + +from tobiko.openstack import keystone +from tobiko.openstack import octavia +from tobiko.tests import unit +from tobiko.tests.unit import openstack +from tobiko.tests.unit.openstack import test_client + + +class KeystoneModulePatch(unit.PatchFixture): + + client = object() + endpoint = endpoints.Endpoint(manager=None, + info={'url': 'http://some/endpoint'}) + session = None + name = None + + def setup_fixture(self): + module = inspect.getmodule(octavia.OctaviaClientFixture) + self.patch(module, 'keystone', self) + + def get_keystone_client(self, session): + self.session = session + return self.client + + def find_service_endpoint(self, name, client): + self.name = name + assert self.client is client + return self.endpoint + + +class OctaviaClientFixtureTest(test_client.OpenstackClientFixtureTest): + + def setUp(self): + super(OctaviaClientFixtureTest, self).setUp() + self.useFixture(KeystoneModulePatch()) + + def create_client(self, session=None): + return octavia.OctaviaClientFixture(session=session) + + +class GetOctaviaClientTest(openstack.OpenstackTest): + + def setUp(self): + super(GetOctaviaClientTest, self).setUp() + self.useFixture(KeystoneModulePatch()) + + def test_get_octavia_client(self, session=None, shared=True): + client1 = octavia.get_octavia_client(session=session, shared=shared) + client2 = octavia.get_octavia_client(session=session, shared=shared) + if shared: + self.assertIs(client1, client2) + else: + self.assertIsNot(client1, client2) + self.assertIsInstance(client1, octaviaclient.OctaviaAPI) + self.assertIsInstance(client2, octaviaclient.OctaviaAPI) + + def test_get_octavia_client_with_not_shared(self): + self.test_get_octavia_client(shared=False) + + def test_get_octavia_client_with_session(self): + session = keystone.get_keystone_session() + self.test_get_octavia_client(session=session) + + +class OctaviaClientTest(openstack.OpenstackTest): + + def setUp(self): + super(OctaviaClientTest, self).setUp() + self.useFixture(KeystoneModulePatch()) + + def test_octavia_client_with_none(self): + default_client = octavia.get_octavia_client() + client = octavia.octavia_client(None) + self.assertIsInstance(client, octaviaclient.OctaviaAPI) + self.assertIs(default_client, client) + + def test_octavia_client_with_client(self): + default_client = octavia.get_octavia_client() + client = octavia.octavia_client(default_client) + self.assertIsInstance(client, octaviaclient.OctaviaAPI) + self.assertIs(default_client, client) + + def test_octavia_client_with_fixture(self): + fixture = octavia.OctaviaClientFixture() + client = octavia.octavia_client(fixture) + self.assertIsInstance(client, octaviaclient.OctaviaAPI) + self.assertIs(client, fixture.client)