Using keystone discover to find V3 auth_url

This patch uses keystone client discover to find correct V3
auth_url which is expected by heat collector.

Change-Id: I2b8b5a768bdeb1cd1d20fab3b4234306c1429d6d
Closes-Bug: #1341936
This commit is contained in:
Yanyan Hu 2014-07-17 04:22:32 -05:00
parent 7d61ca940c
commit 47bb4bddb2
5 changed files with 59 additions and 8 deletions

View File

@ -16,6 +16,7 @@ import hashlib
import os import os
from dogpile import cache from dogpile import cache
from keystoneclient import discover as ks_discover
from keystoneclient import exceptions as ks_exc from keystoneclient import exceptions as ks_exc
from keystoneclient.v3 import client as ks_keystoneclient from keystoneclient.v3 import client as ks_keystoneclient
from oslo.config import cfg from oslo.config import cfg
@ -50,11 +51,19 @@ class Keystone(object):
Uses keystoneclient.v3 if unspecified. Uses keystoneclient.v3 if unspecified.
''' '''
self.keystoneclient = keystoneclient or ks_keystoneclient self.keystoneclient = keystoneclient or ks_keystoneclient
self.auth_url = auth_url
self.user_id = user_id self.user_id = user_id
self.password = password self.password = password
self.project_id = project_id self.project_id = project_id
self._client = None self._client = None
try:
discover = ks_discover.Discover(auth_url=auth_url)
v3_auth_url = discover.url_for('3.0')
if v3_auth_url:
self.auth_url = v3_auth_url
else:
self.auth_url = auth_url
except ks_exc.ClientException:
self.auth_url = auth_url.replace('/v2.0', '/v3')
if CONF.keystone.cache_dir: if CONF.keystone.cache_dir:
if not os.path.isdir(CONF.keystone.cache_dir): if not os.path.isdir(CONF.keystone.cache_dir):
os.makedirs(CONF.keystone.cache_dir, mode=0o700) os.makedirs(CONF.keystone.cache_dir, mode=0o700)

View File

@ -17,11 +17,13 @@ import copy
import extras import extras
import fixtures import fixtures
import json import json
import mock
import os import os
import signal import signal
import sys import sys
import tempfile import tempfile
from keystoneclient import discover as ks_discover
from oslo.config import cfg from oslo.config import cfg
import testtools import testtools
from testtools import matchers from testtools import matchers
@ -335,8 +337,12 @@ class TestCollectAll(testtools.TestCase):
cfg.CONF.heat.stack_id = 'a/c482680f-7238-403d-8f76-36acf0c8e0aa' cfg.CONF.heat.stack_id = 'a/c482680f-7238-403d-8f76-36acf0c8e0aa'
cfg.CONF.heat.resource_name = 'server' cfg.CONF.heat.resource_name = 'server'
def _call_collect_all( @mock.patch.object(ks_discover.Discover, '__init__')
self, store, collector_kwargs_map=None, collectors=None): @mock.patch.object(ks_discover.Discover, 'url_for')
def _call_collect_all(self, mock_url_for, mock___init__, store,
collector_kwargs_map=None, collectors=None):
mock___init__.return_value = None
mock_url_for.return_value = cfg.CONF.heat.auth_url
if collector_kwargs_map is None: if collector_kwargs_map is None:
collector_kwargs_map = { collector_kwargs_map = {
'ec2': {'requests_impl': test_ec2.FakeRequests}, 'ec2': {'requests_impl': test_ec2.FakeRequests},

View File

@ -12,7 +12,10 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import mock
import fixtures import fixtures
from keystoneclient import discover as ks_discover
from keystoneclient import exceptions as ks_exc from keystoneclient import exceptions as ks_exc
from oslo.config import cfg from oslo.config import cfg
import testtools import testtools
@ -126,7 +129,11 @@ class TestHeatBase(testtools.TestCase):
class TestHeat(TestHeatBase): class TestHeat(TestHeatBase):
def test_collect_heat(self): @mock.patch.object(ks_discover.Discover, '__init__')
@mock.patch.object(ks_discover.Discover, 'url_for')
def test_collect_heat(self, mock_url_for, mock___init__):
mock___init__.return_value = None
mock_url_for.return_value = cfg.CONF.heat.auth_url
heat_md = heat.Collector(keystoneclient=FakeKeystoneClient(self), heat_md = heat.Collector(keystoneclient=FakeKeystoneClient(self),
heatclient=FakeHeatClient(self)).collect() heatclient=FakeHeatClient(self)).collect()
self.assertThat(heat_md, matchers.IsInstance(list)) self.assertThat(heat_md, matchers.IsInstance(list))
@ -137,9 +144,17 @@ class TestHeat(TestHeatBase):
self.assertIn(k, heat_md) self.assertIn(k, heat_md)
self.assertEqual(heat_md[k], META_DATA[k]) self.assertEqual(heat_md[k], META_DATA[k])
self.assertEqual('', self.log.output) # FIXME(yanyanhu): Temporary hack to deal with possible log
# level setting for urllib3.connectionpool.
self.assertTrue(
self.log.output == '' or
self.log.output == 'Starting new HTTP connection (1): 127.0.0.1\n')
def test_collect_heat_fail(self): @mock.patch.object(ks_discover.Discover, '__init__')
@mock.patch.object(ks_discover.Discover, 'url_for')
def test_collect_heat_fail(self, mock_url_for, mock___init__):
mock___init__.return_value = None
mock_url_for.return_value = cfg.CONF.heat.auth_url
heat_collect = heat.Collector( heat_collect = heat.Collector(
keystoneclient=FakeFailKeystoneClient(self), keystoneclient=FakeFailKeystoneClient(self),
heatclient=FakeHeatClient(self)) heatclient=FakeHeatClient(self))

View File

@ -12,9 +12,11 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import mock
import tempfile import tempfile
import fixtures import fixtures
from keystoneclient import discover as ks_discover
from keystoneclient import exceptions as ks_exc from keystoneclient import exceptions as ks_exc
from oslo.config import cfg from oslo.config import cfg
import testtools import testtools
@ -50,19 +52,37 @@ class KeystoneTest(testtools.TestCase):
self.cachedir = tempfile.mkdtemp() self.cachedir = tempfile.mkdtemp()
cfg.CONF.set_override('cache_dir', self.cachedir, group='keystone') cfg.CONF.set_override('cache_dir', self.cachedir, group='keystone')
def test_cache_is_created(self): @mock.patch.object(ks_discover.Discover, '__init__')
@mock.patch.object(ks_discover.Discover, 'url_for')
def test_discover_fail(self, mock_url_for, mock___init__):
mock___init__.return_value = None
mock_url_for.side_effect = ks_exc.DiscoveryFailure()
ks = keystone.Keystone(
'http://server.test:5000/v2.0', 'auser', 'apassword', 'aproject',
test_heat.FakeKeystoneClient(self))
self.assertEqual(ks.auth_url, 'http://server.test:5000/v3')
@mock.patch.object(ks_discover.Discover, '__init__')
@mock.patch.object(ks_discover.Discover, 'url_for')
def test_cache_is_created(self, mock_url_for, mock___init__):
mock___init__.return_value = None
mock_url_for.return_value = 'http://server.test:5000/'
ks = keystone.Keystone( ks = keystone.Keystone(
'http://server.test:5000/', 'auser', 'apassword', 'aproject', 'http://server.test:5000/', 'auser', 'apassword', 'aproject',
test_heat.FakeKeystoneClient(self)) test_heat.FakeKeystoneClient(self))
self.assertIsNotNone(ks.cache) self.assertIsNotNone(ks.cache)
def _make_ks(self, client): @mock.patch.object(ks_discover.Discover, '__init__')
@mock.patch.object(ks_discover.Discover, 'url_for')
def _make_ks(self, client, mock_url_for, mock___init__):
class Configs(object): class Configs(object):
auth_url = 'http://server.test:5000/' auth_url = 'http://server.test:5000/'
user_id = 'auser' user_id = 'auser'
password = 'apassword' password = 'apassword'
project_id = 'aproject' project_id = 'aproject'
mock___init__.return_value = None
mock_url_for.return_value = Configs.auth_url
return keystone.Keystone( return keystone.Keystone(
'http://server.test:5000/', 'auser', 'apassword', 'aproject', 'http://server.test:5000/', 'auser', 'apassword', 'aproject',
client(self, Configs)) client(self, Configs))

View File

@ -2,6 +2,7 @@ coverage>=3.6
discover discover
fixtures>=0.3.14 fixtures>=0.3.14
hacking>=0.8.0,<0.9 hacking>=0.8.0,<0.9
mock>=1.0
python-subunit>=0.0.18 python-subunit>=0.0.18
sphinx>=1.1.2,!=1.2.0,<1.3 sphinx>=1.1.2,!=1.2.0,<1.3
testrepository>=0.0.18 testrepository>=0.0.18