From 8baa156ea67186ce5bc8416e01aa2c853cb66508 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Wed, 15 Oct 2014 13:36:07 -0600 Subject: [PATCH] High level interface High level interface using the connection classes to access the various services. Only identity projects and list_flavors in compute are implemented: projects = conn.identity.list_projects() The service filter has a valid_versions added to it to map the module name to the version component of the endpoint URL. For example, the v2.0 endpoint path is supported by the v2 SDK network module: https://region-a.geo-1.network.hpcloudsvc.com/v2.0/ is supported by the SDK module openstack.network.v2. Implements: blueprint highlevel-interface Change-Id: Ie52986a9da84c8f3395757c08de7a01be30e0f2a --- openstack/auth/service_filter.py | 30 +++++++++++++ openstack/compute/compute_service.py | 2 + openstack/compute/v2/_proxy.py | 22 ++++++++++ openstack/connection.py | 22 ++++++++++ openstack/database/database_service.py | 2 + openstack/database/v1/_proxy.py | 17 ++++++++ openstack/identity/identity_service.py | 5 +++ openstack/identity/v2/_proxy.py | 17 ++++++++ openstack/identity/v3/_proxy.py | 43 +++++++++++++++++++ openstack/image/image_service.py | 2 + openstack/image/v1/_proxy.py | 17 ++++++++ openstack/network/network_service.py | 2 + openstack/network/v2/_proxy.py | 17 ++++++++ .../object_store/object_store_service.py | 2 + openstack/object_store/v1/_proxy.py | 17 ++++++++ .../orchestration/orchestration_service.py | 2 + openstack/orchestration/v1/_proxy.py | 17 ++++++++ openstack/telemetry/telemetry_service.py | 2 + openstack/telemetry/v2/_proxy.py | 17 ++++++++ openstack/tests/auth/test_service_filter.py | 13 ++++++ .../tests/compute/test_compute_service.py | 3 ++ .../tests/database/test_database_service.py | 3 ++ .../tests/identity/test_identity_service.py | 5 +++ openstack/tests/image/test_image_service.py | 3 ++ .../tests/network/test_network_service.py | 3 ++ .../object_store/test_object_store_service.py | 3 ++ .../test_orchestration_service.py | 3 ++ .../tests/telemetry/test_telemetry_service.py | 3 ++ openstack/tests/test_connection.py | 37 ++++++++++++++-- 29 files changed, 327 insertions(+), 4 deletions(-) create mode 100644 openstack/compute/v2/_proxy.py create mode 100644 openstack/database/v1/_proxy.py create mode 100644 openstack/identity/v2/_proxy.py create mode 100644 openstack/identity/v3/_proxy.py create mode 100644 openstack/image/v1/_proxy.py create mode 100644 openstack/network/v2/_proxy.py create mode 100644 openstack/object_store/v1/_proxy.py create mode 100644 openstack/orchestration/v1/_proxy.py create mode 100644 openstack/telemetry/v2/_proxy.py diff --git a/openstack/auth/service_filter.py b/openstack/auth/service_filter.py index bcd62c815..2565e2120 100644 --- a/openstack/auth/service_filter.py +++ b/openstack/auth/service_filter.py @@ -25,12 +25,25 @@ filter to match a service. from openstack import exceptions +class ValidVersion(object): + + def __init__(self, module, path=None): + """" Valid service version. + + :param string module: Module associated with version. + :param string path: URL path version. + """ + self.module = module + self.path = path or module + + class ServiceFilter(object): ANY = 'any' PUBLIC = 'public' INTERNAL = 'internal' ADMIN = 'admin' VISIBILITY = [PUBLIC, INTERNAL, ADMIN] + valid_versions = [] def __init__(self, service_type=ANY, visibility=PUBLIC, region=None, service_name=None, version=None): @@ -115,3 +128,20 @@ class ServiceFilter(object): msg = "Visibility <%s> not in %s" % (visibility, self.VISIBILITY) raise exceptions.SDKException(msg) self.visibility = visibility + + def get_module(self): + """Get the full module name associated with the service.""" + module = self.__class__.__module__.split('.') + module = ".".join(module[:-1]) + # NOTE(thowe): Only support for one valid version right now. + module = module + "." + self.valid_versions[0].module + return module + + def get_service_module(self): + """Get the module version of the service name. + + This would often be the same as the service type except in cases like + object store where the service type is `object-store` and the module + is `object_store`. + """ + return self.__class__.__module__.split('.')[1] diff --git a/openstack/compute/compute_service.py b/openstack/compute/compute_service.py index c8f1fd039..c85d2017e 100644 --- a/openstack/compute/compute_service.py +++ b/openstack/compute/compute_service.py @@ -16,6 +16,8 @@ from openstack.auth import service_filter class ComputeService(service_filter.ServiceFilter): """The compute service.""" + valid_versions = [service_filter.ValidVersion('v2')] + def __init__(self): """Create an compute service.""" super(ComputeService, self).__init__(service_type='compute') diff --git a/openstack/compute/v2/_proxy.py b/openstack/compute/v2/_proxy.py new file mode 100644 index 000000000..47dbfd889 --- /dev/null +++ b/openstack/compute/v2/_proxy.py @@ -0,0 +1,22 @@ +# 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 openstack.compute.v2 import flavor + + +class Proxy(object): + + def __init__(self, session): + self.session = session + + def list_flavors(self, **params): + return flavor.Flavor.list(self.session, **params) diff --git a/openstack/connection.py b/openstack/connection.py index 8cfd649f0..e1008c98b 100644 --- a/openstack/connection.py +++ b/openstack/connection.py @@ -58,6 +58,8 @@ try to find it and if that fails, you would create it:: network = conn.network.create_network({"name": "jenkins"}) """ +import logging +import sys from stevedore import driver @@ -68,6 +70,7 @@ from openstack import transport as xport USER_AGENT = 'OSPythonSDK' """Default value for the HTTP User-Agent header""" +_logger = logging.getLogger(__name__) class Connection(object): @@ -128,6 +131,7 @@ class Connection(object): **auth_args) self.session = session.Session(self.transport, self.authenticator, preference) + self._open() def _create_transport(self, transport, verify, user_agent): if transport: @@ -157,3 +161,21 @@ class Connection(object): valid_list = plugin.valid_options args = dict((n, auth_args[n]) for n in valid_list if n in auth_args) return plugin(**args) + + def _open(self): + """Open the connection. + + NOTE(thowe): Have this set up some lazy loader instead. + """ + for service in self.session.get_services(): + self._load(service) + + def _load(self, service): + attr_name = service.get_service_module() + module = service.get_module() + "._proxy" + try: + __import__(module) + proxy = getattr(sys.modules[module], "Proxy") + setattr(self, attr_name, proxy(self.session)) + except Exception as e: + _logger.warn("Unable to load %s: %s" % (module, e)) diff --git a/openstack/database/database_service.py b/openstack/database/database_service.py index b4dc94e76..04d31b12e 100644 --- a/openstack/database/database_service.py +++ b/openstack/database/database_service.py @@ -16,6 +16,8 @@ from openstack.auth import service_filter class DatabaseService(service_filter.ServiceFilter): """The database service.""" + valid_versions = [service_filter.ValidVersion('v1')] + def __init__(self): """Create an database service.""" super(DatabaseService, self).__init__(service_type='database') diff --git a/openstack/database/v1/_proxy.py b/openstack/database/v1/_proxy.py new file mode 100644 index 000000000..025230cf3 --- /dev/null +++ b/openstack/database/v1/_proxy.py @@ -0,0 +1,17 @@ +# 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. + + +class Proxy(object): + + def __init__(self, session): + self.session = session diff --git a/openstack/identity/identity_service.py b/openstack/identity/identity_service.py index 7a5fd5665..de4282a06 100644 --- a/openstack/identity/identity_service.py +++ b/openstack/identity/identity_service.py @@ -16,6 +16,11 @@ from openstack.auth import service_filter class IdentityService(service_filter.ServiceFilter): """The identity service.""" + valid_versions = [ + service_filter.ValidVersion('v3'), + service_filter.ValidVersion('v2'), + ] + def __init__(self, **kwargs): """Create an identity service.""" kwargs['service_type'] = 'identity' diff --git a/openstack/identity/v2/_proxy.py b/openstack/identity/v2/_proxy.py new file mode 100644 index 000000000..025230cf3 --- /dev/null +++ b/openstack/identity/v2/_proxy.py @@ -0,0 +1,17 @@ +# 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. + + +class Proxy(object): + + def __init__(self, session): + self.session = session diff --git a/openstack/identity/v3/_proxy.py b/openstack/identity/v3/_proxy.py new file mode 100644 index 000000000..7246e0043 --- /dev/null +++ b/openstack/identity/v3/_proxy.py @@ -0,0 +1,43 @@ +# 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 openstack.identity.v3 import project + + +class Proxy(object): + + def __init__(self, session): + self.session = session + + def create_project(self, **data): + obj = project.Project(**data) + obj.create(self.session) + return obj + + def get_project(self, r_id): + obj = project.Project({'id': r_id}) + obj.get(self.session) + return obj + + def update_project(self, **data): + obj = project.Project(**data) + obj.update(self.session) + + def delete_project(self, r_id): + obj = project.Project({'id': r_id}) + obj.delete(self.session) + + def list_projects(self, **params): + return project.Project.list(self.session, **params) + + def find_project(self, name_or_id): + return project.Project.find(self.session, name_or_id) diff --git a/openstack/image/image_service.py b/openstack/image/image_service.py index 94e8560e2..8eb6a8fbc 100644 --- a/openstack/image/image_service.py +++ b/openstack/image/image_service.py @@ -16,6 +16,8 @@ from openstack.auth import service_filter class ImageService(service_filter.ServiceFilter): """The image service.""" + valid_versions = [service_filter.ValidVersion('v1')] + def __init__(self): """Create an image service.""" super(ImageService, self).__init__(service_type='image') diff --git a/openstack/image/v1/_proxy.py b/openstack/image/v1/_proxy.py new file mode 100644 index 000000000..025230cf3 --- /dev/null +++ b/openstack/image/v1/_proxy.py @@ -0,0 +1,17 @@ +# 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. + + +class Proxy(object): + + def __init__(self, session): + self.session = session diff --git a/openstack/network/network_service.py b/openstack/network/network_service.py index c98d4293e..1708ee171 100644 --- a/openstack/network/network_service.py +++ b/openstack/network/network_service.py @@ -16,6 +16,8 @@ from openstack.auth import service_filter class NetworkService(service_filter.ServiceFilter): """The network service.""" + valid_versions = [service_filter.ValidVersion('v2', 'v2.0')] + def __init__(self): """Create an network service.""" super(NetworkService, self).__init__(service_type='network') diff --git a/openstack/network/v2/_proxy.py b/openstack/network/v2/_proxy.py new file mode 100644 index 000000000..025230cf3 --- /dev/null +++ b/openstack/network/v2/_proxy.py @@ -0,0 +1,17 @@ +# 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. + + +class Proxy(object): + + def __init__(self, session): + self.session = session diff --git a/openstack/object_store/object_store_service.py b/openstack/object_store/object_store_service.py index 0757e7ad3..f3c8469a3 100644 --- a/openstack/object_store/object_store_service.py +++ b/openstack/object_store/object_store_service.py @@ -16,6 +16,8 @@ from openstack.auth import service_filter class ObjectStoreService(service_filter.ServiceFilter): """The object store service.""" + valid_versions = [service_filter.ValidVersion('v1')] + def __init__(self): """Create an object store service.""" super(ObjectStoreService, self).__init__(service_type='object-store') diff --git a/openstack/object_store/v1/_proxy.py b/openstack/object_store/v1/_proxy.py new file mode 100644 index 000000000..025230cf3 --- /dev/null +++ b/openstack/object_store/v1/_proxy.py @@ -0,0 +1,17 @@ +# 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. + + +class Proxy(object): + + def __init__(self, session): + self.session = session diff --git a/openstack/orchestration/orchestration_service.py b/openstack/orchestration/orchestration_service.py index 1e581a525..bb85f45cb 100644 --- a/openstack/orchestration/orchestration_service.py +++ b/openstack/orchestration/orchestration_service.py @@ -16,6 +16,8 @@ from openstack.auth import service_filter class OrchestrationService(service_filter.ServiceFilter): """The orchestration service.""" + valid_versions = [service_filter.ValidVersion('v1')] + def __init__(self): """Create an orchestration service.""" super(OrchestrationService, self).__init__( diff --git a/openstack/orchestration/v1/_proxy.py b/openstack/orchestration/v1/_proxy.py new file mode 100644 index 000000000..025230cf3 --- /dev/null +++ b/openstack/orchestration/v1/_proxy.py @@ -0,0 +1,17 @@ +# 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. + + +class Proxy(object): + + def __init__(self, session): + self.session = session diff --git a/openstack/telemetry/telemetry_service.py b/openstack/telemetry/telemetry_service.py index dfd5df5e0..6a156abb0 100644 --- a/openstack/telemetry/telemetry_service.py +++ b/openstack/telemetry/telemetry_service.py @@ -16,6 +16,8 @@ from openstack.auth import service_filter class TelemetryService(service_filter.ServiceFilter): """The telemetry service.""" + valid_versions = [service_filter.ValidVersion('v2')] + def __init__(self): """Create a telemetry service.""" super(TelemetryService, self).__init__(service_type='metering') diff --git a/openstack/telemetry/v2/_proxy.py b/openstack/telemetry/v2/_proxy.py new file mode 100644 index 000000000..025230cf3 --- /dev/null +++ b/openstack/telemetry/v2/_proxy.py @@ -0,0 +1,17 @@ +# 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. + + +class Proxy(object): + + def __init__(self, session): + self.session = session diff --git a/openstack/tests/auth/test_service_filter.py b/openstack/tests/auth/test_service_filter.py index 5b690c07a..399711dc2 100644 --- a/openstack/tests/auth/test_service_filter.py +++ b/openstack/tests/auth/test_service_filter.py @@ -15,6 +15,7 @@ import testtools from openstack.auth import service_filter as filt from openstack import exceptions +from openstack.identity import identity_service class TestServiceFilter(testtools.TestCase): @@ -124,3 +125,15 @@ class TestServiceFilter(testtools.TestCase): self.assertEqual('internal', sot.visibility) sot.set_visibility("ADMINURL") self.assertEqual('admin', sot.visibility) + + def test_get_module(self): + sot = identity_service.IdentityService() + self.assertEqual('openstack.identity.v3', sot.get_module()) + self.assertEqual('identity', sot.get_service_module()) + + +class TestValidVersion(testtools.TestCase): + def test_constructor(self): + sot = filt.ValidVersion('v1.0', 'v1') + self.assertEqual('v1.0', sot.module) + self.assertEqual('v1', sot.path) diff --git a/openstack/tests/compute/test_compute_service.py b/openstack/tests/compute/test_compute_service.py index 115cf9d8d..449f813dd 100644 --- a/openstack/tests/compute/test_compute_service.py +++ b/openstack/tests/compute/test_compute_service.py @@ -23,3 +23,6 @@ class TestComputeService(testtools.TestCase): self.assertEqual('public', sot.visibility) self.assertIsNone(sot.region) self.assertIsNone(sot.service_name) + self.assertEqual(1, len(sot.valid_versions)) + self.assertEqual('v2', sot.valid_versions[0].module) + self.assertEqual('v2', sot.valid_versions[0].path) diff --git a/openstack/tests/database/test_database_service.py b/openstack/tests/database/test_database_service.py index 676c572ac..236670f6c 100644 --- a/openstack/tests/database/test_database_service.py +++ b/openstack/tests/database/test_database_service.py @@ -23,3 +23,6 @@ class TestDatabaseService(testtools.TestCase): self.assertEqual('public', sot.visibility) self.assertIsNone(sot.region) self.assertIsNone(sot.service_name) + self.assertEqual(1, len(sot.valid_versions)) + self.assertEqual('v1', sot.valid_versions[0].module) + self.assertEqual('v1', sot.valid_versions[0].path) diff --git a/openstack/tests/identity/test_identity_service.py b/openstack/tests/identity/test_identity_service.py index a095dcbe8..d13560b83 100644 --- a/openstack/tests/identity/test_identity_service.py +++ b/openstack/tests/identity/test_identity_service.py @@ -23,6 +23,11 @@ class TestIdentityService(testtools.TestCase): self.assertEqual('public', sot.visibility) self.assertIsNone(sot.region) self.assertIsNone(sot.service_name) + self.assertEqual(2, len(sot.valid_versions)) + self.assertEqual('v3', sot.valid_versions[0].module) + self.assertEqual('v3', sot.valid_versions[0].path) + self.assertEqual('v2', sot.valid_versions[1].module) + self.assertEqual('v2', sot.valid_versions[1].path) def test_admin_service(self): sot = identity_service.AdminService() diff --git a/openstack/tests/image/test_image_service.py b/openstack/tests/image/test_image_service.py index cfe763213..8346888a3 100644 --- a/openstack/tests/image/test_image_service.py +++ b/openstack/tests/image/test_image_service.py @@ -23,3 +23,6 @@ class TestImageService(testtools.TestCase): self.assertEqual('public', sot.visibility) self.assertIsNone(sot.region) self.assertIsNone(sot.service_name) + self.assertEqual(1, len(sot.valid_versions)) + self.assertEqual('v1', sot.valid_versions[0].module) + self.assertEqual('v1', sot.valid_versions[0].path) diff --git a/openstack/tests/network/test_network_service.py b/openstack/tests/network/test_network_service.py index 78a72a530..b888c1043 100644 --- a/openstack/tests/network/test_network_service.py +++ b/openstack/tests/network/test_network_service.py @@ -23,3 +23,6 @@ class TestNetworkService(testtools.TestCase): self.assertEqual('public', sot.visibility) self.assertIsNone(sot.region) self.assertIsNone(sot.service_name) + self.assertEqual(1, len(sot.valid_versions)) + self.assertEqual('v2', sot.valid_versions[0].module) + self.assertEqual('v2.0', sot.valid_versions[0].path) diff --git a/openstack/tests/object_store/test_object_store_service.py b/openstack/tests/object_store/test_object_store_service.py index b607bfaa4..96b2af666 100644 --- a/openstack/tests/object_store/test_object_store_service.py +++ b/openstack/tests/object_store/test_object_store_service.py @@ -23,3 +23,6 @@ class TestObjectStoreService(testtools.TestCase): self.assertEqual('public', sot.visibility) self.assertIsNone(sot.region) self.assertIsNone(sot.service_name) + self.assertEqual(1, len(sot.valid_versions)) + self.assertEqual('v1', sot.valid_versions[0].module) + self.assertEqual('v1', sot.valid_versions[0].path) diff --git a/openstack/tests/orchestration/test_orchestration_service.py b/openstack/tests/orchestration/test_orchestration_service.py index 91900d078..54ca77795 100644 --- a/openstack/tests/orchestration/test_orchestration_service.py +++ b/openstack/tests/orchestration/test_orchestration_service.py @@ -23,3 +23,6 @@ class TestOrchestrationService(testtools.TestCase): self.assertEqual('public', sot.visibility) self.assertIsNone(sot.region) self.assertIsNone(sot.service_name) + self.assertEqual(1, len(sot.valid_versions)) + self.assertEqual('v1', sot.valid_versions[0].module) + self.assertEqual('v1', sot.valid_versions[0].path) diff --git a/openstack/tests/telemetry/test_telemetry_service.py b/openstack/tests/telemetry/test_telemetry_service.py index e4defb7d5..56e0f0d6d 100644 --- a/openstack/tests/telemetry/test_telemetry_service.py +++ b/openstack/tests/telemetry/test_telemetry_service.py @@ -23,3 +23,6 @@ class TestTelemetryService(testtools.TestCase): self.assertEqual('public', sot.visibility) self.assertIsNone(sot.region) self.assertIsNone(sot.service_name) + self.assertEqual(1, len(sot.valid_versions)) + self.assertEqual('v2', sot.valid_versions[0].module) + self.assertEqual('v2', sot.valid_versions[0].path) diff --git a/openstack/tests/test_connection.py b/openstack/tests/test_connection.py index 586a0454a..77e2e7fea 100644 --- a/openstack/tests/test_connection.py +++ b/openstack/tests/test_connection.py @@ -10,12 +10,21 @@ # License for the specific language governing permissions and limitations # under the License. +from openstack.auth.identity import v2 from openstack import connection from openstack import exceptions from openstack.tests import base +from openstack import transport +from openstack import user_preference class TestConnection(base.TestCase): + def setUp(self): + super(TestConnection, self).setUp() + self.xport = transport.Transport() + self.auth = v2.Auth(auth_url='http://127.0.0.1/v2', token='b') + self.pref = user_preference.UserPreference() + def test_create_transport(self): conn = connection.Connection(authenticator='2', verify=True, user_agent='1') @@ -73,8 +82,28 @@ class TestConnection(base.TestCase): ) def test_create_session(self): - args = {'transport': '0', 'authenticator': '1', 'preference': '2'} + args = { + 'transport': self.xport, + 'authenticator': self.auth, + 'preference': self.pref, + } conn = connection.Connection(**args) - self.assertEqual('0', conn.session.transport) - self.assertEqual('1', conn.session.authenticator) - self.assertEqual('2', conn.session.preference) + self.assertEqual(self.xport, conn.session.transport) + self.assertEqual(self.auth, conn.session.authenticator) + self.assertEqual(self.pref, conn.session.preference) + self.assertEqual('openstack.compute.v2._proxy', + conn.compute.__class__.__module__) + self.assertEqual('openstack.database.v1._proxy', + conn.database.__class__.__module__) + self.assertEqual('openstack.identity.v3._proxy', + conn.identity.__class__.__module__) + self.assertEqual('openstack.image.v1._proxy', + conn.image.__class__.__module__) + self.assertEqual('openstack.network.v2._proxy', + conn.network.__class__.__module__) + self.assertEqual('openstack.object_store.v1._proxy', + conn.object_store.__class__.__module__) + self.assertEqual('openstack.orchestration.v1._proxy', + conn.orchestration.__class__.__module__) + self.assertEqual('openstack.telemetry.v2._proxy', + conn.telemetry.__class__.__module__)