Merge lp:~niedbalski/charm-helpers/lp1667478-2 into lp:charm-helpers

Proposed by Jorge Niedbalski
Status: Merged
Merged at revision: 699
Proposed branch: lp:~niedbalski/charm-helpers/lp1667478-2
Merge into: lp:charm-helpers
Diff against target: 199 lines (+93/-23)
2 files modified
charmhelpers/contrib/openstack/keystone.py (+45/-11)
tests/contrib/openstack/test_keystone_utils.py (+48/-12)
To merge this branch: bzr merge lp:~niedbalski/charm-helpers/lp1667478-2
Reviewer Review Type Date Requested Status
Shane Peters (community) Approve
Felipe Reyes (community) Approve
Review via email: mp+318505@code.launchpad.net

Description of the change

This commit adds the following changes:

  1) Support to load a keystone manager from a identityservice context.
  2) The service_exists function ensures that service_type and service_name are
  separated terms to search by.

To post a comment you must log in.
706. By Jorge Niedbalski

Properly test the identityservicecontext class

Revision history for this message
Felipe Reyes (freyes) wrote :

LGTM! thanks jorge

review: Approve
Revision history for this message
Shane Peters (shaner) wrote :

LGTM

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'charmhelpers/contrib/openstack/keystone.py'
2--- charmhelpers/contrib/openstack/keystone.py 2017-02-24 21:31:23 +0000
3+++ charmhelpers/contrib/openstack/keystone.py 2017-02-28 17:12:23 +0000
4@@ -16,6 +16,11 @@
5
6 import six
7 from charmhelpers.fetch import apt_install
8+from charmhelpers.contrib.openstack.context import IdentityServiceContext
9+from charmhelpers.core.hookenv import (
10+ log,
11+ ERROR,
12+)
13
14
15 def get_api_suffix(api_version):
16@@ -24,7 +29,7 @@
17 @returns the api suffix formatted according to the given api
18 version
19 """
20- return 'v2.0' if api_version == 2 else 'v3'
21+ return 'v2.0' if api_version in (2, "2.0") else 'v3'
22
23
24 def format_endpoint(schema, addr, port, api_version):
25@@ -54,23 +59,52 @@
26 raise ValueError('No manager found for api version {}'.format(api_version))
27
28
29+def get_keystone_manager_from_identity_service_context():
30+ """Return a keystonmanager generated from a
31+ instance of charmhelpers.contrib.openstack.context.IdentityServiceContext
32+ @returns keystonamenager instance
33+ """
34+ context = IdentityServiceContext()()
35+ if not context:
36+ msg = "Identity service context cannot be generated"
37+ log(msg, level=ERROR)
38+ raise ValueError(msg)
39+
40+ endpoint = format_endpoint(context['service_protocol'],
41+ context['service_host'],
42+ context['service_port'],
43+ context['api_version'])
44+
45+ if context['api_version'] in (2, "2.0"):
46+ api_version = 2
47+ else:
48+ api_version = 3
49+
50+ return get_keystone_manager(endpoint, api_version,
51+ username=context['admin_user'],
52+ password=context['admin_password'],
53+ tenant_name=context['admin_tenant_name'])
54+
55+
56 class KeystoneManager(object):
57
58- def resolve_service_id(self, name, service_type=None):
59+ def resolve_service_id(self, service_name=None, service_type=None):
60 """Find the service_id of a given service"""
61 services = [s._info for s in self.api.services.list()]
62
63+ service_name = service_name.lower()
64 for s in services:
65- if service_type:
66- if (name.lower() == s['name'].lower() and
67- service_type == s['type']):
68- return s['id']
69- else:
70- if name.lower() == s['name'].lower():
71- return s['id']
72+ name = s['name'].lower()
73+ if service_type and service_name:
74+ if (service_name == name and service_type == s['type']):
75+ return s['id']
76+ elif service_name and service_name == name:
77+ return s['id']
78+ elif service_type and service_type == s['type']:
79+ return s['id']
80 return None
81
82- def service_exists(self, service_name, service_type=None):
83+ def service_exists(self, service_name=None, service_type=None):
84 """Determine if the given service exists on the service list"""
85 return self.resolve_service_id(service_name, service_type) is not None
86
87@@ -138,7 +172,7 @@
88 auth = v3.Password(auth_url=endpoint,
89 user_id=kwargs.get("username"),
90 password=kwargs.get("password"),
91- project_id=kwargs.get("tenant_id"))
92+ project_id=kwargs.get("tenant_name"))
93 sess = session.Session(auth=auth)
94
95 self.api = client.Client(session=sess)
96
97=== modified file 'tests/contrib/openstack/test_keystone_utils.py'
98--- tests/contrib/openstack/test_keystone_utils.py 2017-02-24 21:28:56 +0000
99+++ tests/contrib/openstack/test_keystone_utils.py 2017-02-28 17:12:23 +0000
100@@ -8,6 +8,9 @@
101
102 TO_PATCH = [
103 'apt_install',
104+ "log",
105+ "ERROR",
106+ "IdentityServiceContext",
107 ]
108
109
110@@ -40,7 +43,7 @@
111 def __iter__(self):
112 class Service(object):
113 _info = {
114- 'type': 'openstack',
115+ 'type': 'metering',
116 'name': "ceilometer",
117 'id': "uuid-uuid",
118 }
119@@ -49,19 +52,18 @@
120 manager = keystone.get_keystone_manager('test-endpoint', 2,
121 token="1234")
122 manager.api.services.list = PropertyMock(return_value=ServiceList())
123- self.assertTrue(manager.service_exists("ceilometer"))
124- self.assertFalse(manager.service_exists("barbican"))
125- self.assertFalse(manager.service_exists("barbican",
126+ self.assertTrue(manager.service_exists(service_name="ceilometer",
127+ service_type="metering"))
128+ self.assertFalse(manager.service_exists(service_name="barbican"))
129+ self.assertFalse(manager.service_exists(service_name="barbican",
130 service_type="openstack"))
131- self.assertTrue(manager.service_exists("ceilometer",
132- service_type="openstack"))
133
134 def test_resolve_sevice_id_v3(self):
135 class ServiceList(list):
136 def __iter__(self):
137 class Service(object):
138 _info = {
139- 'type': 'openstack',
140+ 'type': 'metering',
141 'name': "ceilometer",
142 'id': "uuid-uuid",
143 }
144@@ -70,12 +72,11 @@
145 manager = keystone.get_keystone_manager('test-endpoint', 3,
146 token="12345")
147 manager.api.services.list = PropertyMock(return_value=ServiceList())
148- self.assertTrue(manager.service_exists("ceilometer"))
149- self.assertFalse(manager.service_exists("barbican"))
150- self.assertFalse(manager.service_exists("barbican",
151+ self.assertTrue(manager.service_exists(service_name="ceilometer",
152+ service_type="metering"))
153+ self.assertFalse(manager.service_exists(service_name="barbican"))
154+ self.assertFalse(manager.service_exists(service_name="barbican",
155 service_type="openstack"))
156- self.assertTrue(manager.service_exists("ceilometer",
157- service_type="openstack"))
158
159 def test_get_api_suffix(self):
160 self.assertEquals(keystone.get_api_suffix(2), "v2.0")
161@@ -84,3 +85,38 @@
162 def test_format_endpoint(self):
163 self.assertEquals(keystone.format_endpoint(
164 "http", "10.0.0.5", "5000", 2), "http://10.0.0.5:5000/v2.0/")
165+
166+ def test_get_keystone_manager_from_identity_service_context(self):
167+ class FakeIdentityServiceV2(object):
168+ def __call__(self, *args, **kwargs):
169+ return {
170+ "service_protocol": "https",
171+ "service_host": "10.5.0.5",
172+ "service_port": "5000",
173+ "api_version": "2.0",
174+ "admin_user": "amdin",
175+ "admin_password": "admin",
176+ "admin_tenant_name": "admin_tenant"
177+ }
178+
179+ self.IdentityServiceContext.return_value = FakeIdentityServiceV2()
180+
181+ manager = keystone.get_keystone_manager_from_identity_service_context()
182+ self.assertIsInstance(manager, keystone.KeystoneManager2)
183+
184+ class FakeIdentityServiceV3(object):
185+ def __call__(self, *args, **kwargs):
186+ return {
187+ "service_protocol": "https",
188+ "service_host": "10.5.0.5",
189+ "service_port": "5000",
190+ "api_version": "3",
191+ "admin_user": "amdin",
192+ "admin_password": "admin",
193+ "admin_tenant_name": "admin_tenant"
194+ }
195+
196+ self.IdentityServiceContext.return_value = FakeIdentityServiceV3()
197+
198+ manager = keystone.get_keystone_manager_from_identity_service_context()
199+ self.assertIsInstance(manager, keystone.KeystoneManager3)

Subscribers

People subscribed via source and target branches