1d4e926076
Now that we no longer support py27, we can use the standard library unittest.mock module instead of the third party mock lib. Change-Id: I1dca4b2c7eccf1b19482dde60b88a132935b48b8 Signed-off-by: Sean McGinnis <sean.mcginnis@gmail.com>
184 lines
6.7 KiB
Python
184 lines
6.7 KiB
Python
# Copyright 2017 FUJITSU LIMITED
|
|
#
|
|
# 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.
|
|
|
|
import random
|
|
from unittest import mock
|
|
|
|
from oslotest import base
|
|
|
|
from monasca_agent.common import keystone
|
|
from tests.common import base_config
|
|
|
|
|
|
class TestUtils(base.BaseTestCase):
|
|
def test_should_sanitize_config(self):
|
|
config_keys = [
|
|
'keystone_url', 'username', 'password', 'project_name',
|
|
'service_type', 'url', 'endpoint_type', 'region_name'
|
|
]
|
|
config = {c: mock.NonCallableMock() for c in config_keys}
|
|
random_key_for_no_value = random.choice(config_keys)
|
|
config[random_key_for_no_value] = None
|
|
|
|
clean = keystone.get_args(config)
|
|
|
|
self.assertNotIn(random_key_for_no_value, clean)
|
|
|
|
@mock.patch('monasca_agent.common.keystone.discover.Discover')
|
|
@mock.patch('monasca_agent.common.keystone.get_session')
|
|
def test_get_client_should_use_existing_session_if_present(self,
|
|
get_session,
|
|
_):
|
|
sess = mock.Mock()
|
|
sess.auth = mock.PropertyMock()
|
|
sess.auth.get_auth_ref = mock.Mock()
|
|
|
|
config = {
|
|
'session': sess
|
|
}
|
|
keystone.get_client(**config)
|
|
|
|
get_session.assert_not_called()
|
|
|
|
@mock.patch('monasca_agent.common.keystone.discover.Discover')
|
|
@mock.patch('monasca_agent.common.keystone.get_session')
|
|
def test_get_client_should_create_session_if_missing(self,
|
|
get_session,
|
|
_):
|
|
sess = mock.Mock()
|
|
sess.auth = mock.PropertyMock()
|
|
sess.auth.get_auth_ref = mock.Mock()
|
|
|
|
config = {
|
|
'username': __name__,
|
|
'password': str(random.randint(10, 20))
|
|
}
|
|
keystone.get_client(**config)
|
|
|
|
get_session.assert_called_once_with(**config)
|
|
|
|
|
|
class TestKeystone(base.BaseTestCase):
|
|
default_endpoint_type = mock.NonCallableMock()
|
|
default_service_type = mock.NonCallableMock()
|
|
default_region_name = mock.NonCallableMock()
|
|
|
|
def test_keystone_should_be_singleton(self):
|
|
keystone_1 = keystone.Keystone({})
|
|
keystone_2 = keystone.Keystone({})
|
|
keystone_3 = keystone.Keystone({})
|
|
|
|
self.assertTrue(keystone_1 is keystone_2)
|
|
self.assertTrue(keystone_1 is keystone_3)
|
|
|
|
def test_should_call_service_catalog_for_endpoint(self):
|
|
keystone.Keystone.instance = None
|
|
with mock.patch('keystoneauth1.identity.Password') as password, \
|
|
mock.patch('keystoneauth1.session.Session') as session, \
|
|
mock.patch('keystoneclient.discover.Discover') as discover:
|
|
client = mock.Mock()
|
|
discover.return_value = d = mock.Mock()
|
|
d.create_client = mock.Mock(return_value=client)
|
|
|
|
config = base_config.get_config('Api')
|
|
config.update({
|
|
'url': None,
|
|
'service_type': self.default_service_type,
|
|
'endpoint_type': self.default_endpoint_type,
|
|
'region_name': self.default_region_name
|
|
})
|
|
|
|
k = keystone.Keystone(config)
|
|
k.get_monasca_url()
|
|
|
|
password.assert_called_once()
|
|
session.assert_called_once()
|
|
discover.assert_called_once()
|
|
|
|
client.auth_ref.service_catalog.url_for.assert_called_once_with(**{
|
|
'service_type': self.default_service_type,
|
|
'interface': self.default_endpoint_type,
|
|
'region_name': self.default_region_name
|
|
})
|
|
|
|
def test_should_use_url_from_config_catalog_config_present(self):
|
|
keystone.Keystone.instance = None
|
|
with mock.patch('keystoneauth1.identity.Password') as password, \
|
|
mock.patch('keystoneauth1.session.Session') as session, \
|
|
mock.patch('keystoneclient.discover.Discover') as discover:
|
|
client = mock.Mock()
|
|
discover.return_value = d = mock.Mock()
|
|
d.create_client = mock.Mock(return_value=client)
|
|
|
|
monasca_url = mock.NonCallableMock()
|
|
|
|
config = base_config.get_config('Api')
|
|
config.update({
|
|
'url': monasca_url,
|
|
'service_type': self.default_service_type,
|
|
'endpoint_type': self.default_endpoint_type,
|
|
'region_name': self.default_region_name
|
|
})
|
|
|
|
k = keystone.Keystone(config)
|
|
k.get_monasca_url()
|
|
|
|
password.assert_not_called()
|
|
session.assert_not_called()
|
|
discover.assert_not_called()
|
|
client.auth_ref.service_catalog.url_for.assert_not_called()
|
|
|
|
def test_should_use_url_from_config_if_catalog_config_missing(self):
|
|
keystone.Keystone.instance = None
|
|
with mock.patch('keystoneauth1.identity.Password') as password, \
|
|
mock.patch('keystoneauth1.session.Session') as session, \
|
|
mock.patch('keystoneclient.discover.Discover') as discover:
|
|
client = mock.Mock()
|
|
discover.return_value = d = mock.Mock()
|
|
d.create_client = mock.Mock(return_value=client)
|
|
|
|
monasca_url = mock.NonCallableMock()
|
|
|
|
config = base_config.get_config('Api')
|
|
config.update({
|
|
'url': monasca_url,
|
|
'service_type': None,
|
|
'endpoint_type': None,
|
|
'region_name': None
|
|
})
|
|
k = keystone.Keystone(config)
|
|
k.get_monasca_url()
|
|
|
|
password.assert_not_called()
|
|
session.assert_not_called()
|
|
discover.assert_not_called()
|
|
client.auth_ref.service_catalog.url_for.assert_not_called()
|
|
|
|
def test_should_init_client_just_once(self):
|
|
keystone.Keystone.instance = None
|
|
|
|
k = keystone.Keystone(config=base_config.get_config('Api'))
|
|
client = mock.Mock()
|
|
|
|
with mock.patch('monasca_agent.common.keystone.get_client') as gc:
|
|
gc.return_value = client
|
|
|
|
for _ in range(random.randint(5, 50)):
|
|
k._init_client()
|
|
|
|
self.assertIsNotNone(k._keystone_client)
|
|
self.assertEqual(client, k._keystone_client)
|
|
|
|
gc.assert_called_once()
|