2016-07-01 17:22:19 +01:00
|
|
|
# Copyright 2016 Canonical Ltd
|
|
|
|
#
|
|
|
|
# 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.
|
|
|
|
|
2015-01-14 13:17:50 +00:00
|
|
|
from mock import patch, call, MagicMock, Mock
|
2014-04-02 12:45:02 +02:00
|
|
|
from test_utils import CharmTestCase
|
|
|
|
import os
|
2016-04-12 15:52:58 -07:00
|
|
|
from base64 import b64encode
|
2014-04-02 12:45:02 +02:00
|
|
|
|
|
|
|
os.environ['JUJU_UNIT_NAME'] = 'keystone'
|
|
|
|
with patch('charmhelpers.core.hookenv.config') as config:
|
|
|
|
import keystone_utils as utils
|
|
|
|
|
|
|
|
TO_PATCH = [
|
2014-04-03 14:21:01 +02:00
|
|
|
'api_port',
|
2014-04-02 12:45:02 +02:00
|
|
|
'config',
|
|
|
|
'os_release',
|
|
|
|
'log',
|
2014-04-03 14:21:01 +02:00
|
|
|
'get_ca',
|
|
|
|
'create_role',
|
|
|
|
'create_service_entry',
|
|
|
|
'create_endpoint_template',
|
|
|
|
'get_admin_token',
|
2014-04-04 10:18:04 +02:00
|
|
|
'get_local_endpoint',
|
2014-04-03 14:21:01 +02:00
|
|
|
'get_requested_roles',
|
|
|
|
'get_service_password',
|
|
|
|
'get_os_codename_install_source',
|
2016-06-24 12:49:30 +00:00
|
|
|
'git_clone_and_install',
|
|
|
|
'git_pip_venv_dir',
|
|
|
|
'git_src_dir',
|
2014-04-03 14:21:01 +02:00
|
|
|
'grant_role',
|
|
|
|
'configure_installation_source',
|
2015-01-05 17:49:38 +00:00
|
|
|
'is_elected_leader',
|
2015-02-03 12:56:40 +00:00
|
|
|
'is_ssl_cert_master',
|
2014-04-03 14:21:01 +02:00
|
|
|
'https',
|
2016-06-24 12:49:30 +00:00
|
|
|
'lsb_release',
|
2014-09-25 10:51:37 +01:00
|
|
|
'peer_store_and_set',
|
2016-06-24 12:49:30 +00:00
|
|
|
'service_restart',
|
2014-04-03 14:21:01 +02:00
|
|
|
'service_stop',
|
|
|
|
'service_start',
|
|
|
|
'relation_get',
|
|
|
|
'relation_set',
|
2015-01-22 18:44:33 +00:00
|
|
|
'relation_ids',
|
|
|
|
'relation_id',
|
2016-06-24 12:49:30 +00:00
|
|
|
'render',
|
2015-01-22 18:44:33 +00:00
|
|
|
'local_unit',
|
|
|
|
'related_units',
|
2014-04-03 14:21:01 +02:00
|
|
|
'https',
|
2015-01-14 13:17:50 +00:00
|
|
|
'is_relation_made',
|
|
|
|
'peer_store',
|
2015-05-08 12:36:59 +00:00
|
|
|
'pip_install',
|
2014-04-03 14:21:01 +02:00
|
|
|
# generic
|
|
|
|
'apt_update',
|
|
|
|
'apt_upgrade',
|
|
|
|
'apt_install',
|
|
|
|
'subprocess',
|
|
|
|
'time',
|
|
|
|
'pwgen',
|
2016-09-20 12:19:37 +01:00
|
|
|
'os_application_version_set',
|
2014-04-02 12:45:02 +02:00
|
|
|
]
|
|
|
|
|
2015-03-18 20:15:45 +00:00
|
|
|
openstack_origin_git = \
|
|
|
|
"""repositories:
|
|
|
|
- {name: requirements,
|
|
|
|
repository: 'git://git.openstack.org/openstack/requirements',
|
|
|
|
branch: stable/juno}
|
|
|
|
- {name: keystone,
|
|
|
|
repository: 'git://git.openstack.org/openstack/keystone',
|
|
|
|
branch: stable/juno}"""
|
|
|
|
|
2014-04-10 17:00:28 +01:00
|
|
|
|
2014-04-02 12:45:02 +02:00
|
|
|
class TestKeystoneUtils(CharmTestCase):
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
super(TestKeystoneUtils, self).setUp(utils, TO_PATCH)
|
|
|
|
self.config.side_effect = self.test_config.get
|
|
|
|
|
|
|
|
self.ctxt = MagicMock()
|
|
|
|
self.rsc_map = {
|
|
|
|
'/etc/keystone/keystone.conf': {
|
|
|
|
'services': ['keystone'],
|
|
|
|
'contexts': [self.ctxt],
|
|
|
|
},
|
|
|
|
'/etc/apache2/sites-available/openstack_https_frontend': {
|
|
|
|
'services': ['apache2'],
|
|
|
|
'contexts': [self.ctxt],
|
|
|
|
},
|
|
|
|
'/etc/apache2/sites-available/openstack_https_frontend.conf': {
|
|
|
|
'services': ['apache2'],
|
|
|
|
'contexts': [self.ctxt],
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@patch('charmhelpers.contrib.openstack.templating.OSConfigRenderer')
|
|
|
|
@patch('os.path.exists')
|
|
|
|
@patch.object(utils, 'resource_map')
|
|
|
|
def test_register_configs_apache(self, resource_map, exists, renderer):
|
|
|
|
exists.return_value = False
|
|
|
|
self.os_release.return_value = 'havana'
|
|
|
|
fake_renderer = MagicMock()
|
|
|
|
fake_renderer.register = MagicMock()
|
|
|
|
renderer.return_value = fake_renderer
|
|
|
|
|
|
|
|
resource_map.return_value = self.rsc_map
|
|
|
|
utils.register_configs()
|
|
|
|
renderer.assert_called_with(
|
|
|
|
openstack_release='havana', templates_dir='templates/')
|
|
|
|
|
|
|
|
ex_reg = [
|
|
|
|
call('/etc/keystone/keystone.conf', [self.ctxt]),
|
2014-04-10 17:00:28 +01:00
|
|
|
call(
|
|
|
|
'/etc/apache2/sites-available/openstack_https_frontend',
|
|
|
|
[self.ctxt]),
|
|
|
|
call(
|
|
|
|
'/etc/apache2/sites-available/openstack_https_frontend.conf',
|
|
|
|
[self.ctxt]),
|
2014-04-02 12:45:02 +02:00
|
|
|
]
|
|
|
|
self.assertEquals(fake_renderer.register.call_args_list, ex_reg)
|
|
|
|
|
|
|
|
def test_determine_ports(self):
|
2014-04-10 17:00:28 +01:00
|
|
|
self.test_config.set('admin-port', '80')
|
|
|
|
self.test_config.set('service-port', '81')
|
2014-04-02 12:45:02 +02:00
|
|
|
result = utils.determine_ports()
|
|
|
|
self.assertEquals(result, ['80', '81'])
|
|
|
|
|
2014-12-16 22:37:59 +00:00
|
|
|
@patch('charmhelpers.contrib.openstack.utils.config')
|
|
|
|
def test_determine_packages(self, _config):
|
2015-03-30 16:04:34 +00:00
|
|
|
_config.return_value = None
|
2014-04-02 12:45:02 +02:00
|
|
|
result = utils.determine_packages()
|
2015-03-13 09:52:11 +00:00
|
|
|
ex = utils.BASE_PACKAGES + ['keystone', 'python-keystoneclient']
|
2014-12-16 22:37:59 +00:00
|
|
|
self.assertEquals(set(ex), set(result))
|
|
|
|
|
|
|
|
@patch('charmhelpers.contrib.openstack.utils.config')
|
|
|
|
def test_determine_packages_git(self, _config):
|
2015-03-18 20:15:45 +00:00
|
|
|
_config.return_value = openstack_origin_git
|
2014-12-16 22:37:59 +00:00
|
|
|
result = utils.determine_packages()
|
2016-04-05 11:53:09 +01:00
|
|
|
ex = utils.BASE_PACKAGES + utils.BASE_GIT_PACKAGES
|
2014-12-16 22:37:59 +00:00
|
|
|
for p in utils.GIT_PACKAGE_BLACKLIST:
|
|
|
|
ex.remove(p)
|
2014-04-02 12:45:02 +02:00
|
|
|
self.assertEquals(set(ex), set(result))
|
2014-04-03 14:21:01 +02:00
|
|
|
|
2016-06-07 16:49:14 +01:00
|
|
|
@patch('os.path.exists')
|
|
|
|
@patch.object(utils, 'run_in_apache')
|
2014-04-03 14:21:01 +02:00
|
|
|
@patch.object(utils, 'determine_packages')
|
|
|
|
@patch.object(utils, 'migrate_database')
|
2014-04-10 17:00:28 +01:00
|
|
|
def test_openstack_upgrade_leader(
|
2016-06-07 16:49:14 +01:00
|
|
|
self, migrate_database, determine_packages,
|
|
|
|
run_in_apache, os_path_exists):
|
2016-03-02 11:04:09 +00:00
|
|
|
configs = MagicMock()
|
2016-06-07 16:49:14 +01:00
|
|
|
self.test_config.set('openstack-origin', 'cloud:xenial-newton')
|
2014-04-03 14:21:01 +02:00
|
|
|
determine_packages.return_value = []
|
2015-01-05 17:49:38 +00:00
|
|
|
self.is_elected_leader.return_value = True
|
2016-06-07 16:49:14 +01:00
|
|
|
os_path_exists.return_value = True
|
|
|
|
run_in_apache.return_value = True
|
2014-04-03 14:21:01 +02:00
|
|
|
|
|
|
|
utils.do_openstack_upgrade(configs)
|
|
|
|
|
2016-06-07 16:49:14 +01:00
|
|
|
self.get_os_codename_install_source.assert_called_with(
|
|
|
|
'cloud:xenial-newton'
|
|
|
|
)
|
|
|
|
self.configure_installation_source.assert_called_with(
|
|
|
|
'cloud:xenial-newton'
|
|
|
|
)
|
2014-04-04 14:25:37 +02:00
|
|
|
self.assertTrue(self.apt_update.called)
|
2014-04-03 14:21:01 +02:00
|
|
|
|
|
|
|
dpkg_opts = [
|
|
|
|
'--option', 'Dpkg::Options::=--force-confnew',
|
|
|
|
'--option', 'Dpkg::Options::=--force-confdef',
|
|
|
|
]
|
2014-04-10 17:00:28 +01:00
|
|
|
self.apt_upgrade.assert_called_with(
|
|
|
|
options=dpkg_opts,
|
|
|
|
fatal=True,
|
|
|
|
dist=True)
|
|
|
|
self.apt_install.assert_called_with(
|
|
|
|
packages=[],
|
|
|
|
options=dpkg_opts,
|
|
|
|
fatal=True)
|
2014-04-03 14:21:01 +02:00
|
|
|
|
|
|
|
self.assertTrue(configs.set_release.called)
|
|
|
|
self.assertTrue(configs.write_all.called)
|
2014-04-04 14:25:37 +02:00
|
|
|
self.assertTrue(migrate_database.called)
|
2016-06-07 16:49:14 +01:00
|
|
|
os_path_exists.assert_called_with(
|
|
|
|
utils.PACKAGE_KEYSTONE_CONF
|
|
|
|
)
|
|
|
|
self.subprocess.check_call.assert_called_with(
|
|
|
|
['a2dissite', 'keystone']
|
|
|
|
)
|
2014-04-03 14:21:01 +02:00
|
|
|
|
|
|
|
def test_migrate_database(self):
|
|
|
|
utils.migrate_database()
|
|
|
|
|
|
|
|
self.service_stop.assert_called_with('keystone')
|
|
|
|
cmd = ['sudo', '-u', 'keystone', 'keystone-manage', 'db_sync']
|
|
|
|
self.subprocess.check_output.assert_called_with(cmd)
|
2015-09-30 10:40:18 -04:00
|
|
|
self.service_start.assert_called_with('keystone')
|
2014-04-03 14:21:01 +02:00
|
|
|
|
2016-06-28 08:20:27 +00:00
|
|
|
@patch.object(utils, 'get_admin_domain_id')
|
|
|
|
@patch.object(utils, 'get_api_version')
|
2016-03-07 09:10:53 +00:00
|
|
|
@patch.object(utils, 'get_manager')
|
2015-06-02 14:30:32 -07:00
|
|
|
@patch.object(utils, 'resolve_address')
|
2014-04-03 14:21:01 +02:00
|
|
|
@patch.object(utils, 'b64encode')
|
2014-04-10 17:00:28 +01:00
|
|
|
def test_add_service_to_keystone_clustered_https_none_values(
|
2016-06-28 08:20:27 +00:00
|
|
|
self, b64encode, _resolve_address, _get_manager,
|
|
|
|
_get_api_version, _get_admin_domain_id):
|
|
|
|
_get_api_version.return_value = 2
|
|
|
|
_get_admin_domain_id.return_value = None
|
2014-04-03 14:21:01 +02:00
|
|
|
relation_id = 'identity-service:0'
|
|
|
|
remote_unit = 'unit/0'
|
2015-06-02 14:30:32 -07:00
|
|
|
_resolve_address.return_value = '10.10.10.10'
|
2014-04-03 14:21:01 +02:00
|
|
|
self.https.return_value = True
|
|
|
|
self.test_config.set('https-service-endpoints', 'True')
|
|
|
|
self.test_config.set('vip', '10.10.10.10')
|
|
|
|
self.test_config.set('admin-port', 80)
|
|
|
|
self.test_config.set('service-port', 81)
|
|
|
|
b64encode.return_value = 'certificate'
|
2014-04-10 17:00:28 +01:00
|
|
|
self.get_requested_roles.return_value = ['role1', ]
|
2014-04-03 14:21:01 +02:00
|
|
|
|
|
|
|
self.relation_get.return_value = {'service': 'keystone',
|
|
|
|
'region': 'RegionOne',
|
|
|
|
'public_url': 'None',
|
|
|
|
'admin_url': '10.0.0.2',
|
|
|
|
'internal_url': '192.168.1.2'}
|
|
|
|
|
2014-04-10 17:00:28 +01:00
|
|
|
utils.add_service_to_keystone(
|
|
|
|
relation_id=relation_id,
|
|
|
|
remote_unit=remote_unit)
|
2014-04-04 14:25:37 +02:00
|
|
|
self.assertTrue(self.https.called)
|
|
|
|
self.assertTrue(self.create_role.called)
|
2014-04-03 14:21:01 +02:00
|
|
|
|
2015-03-30 00:00:15 +01:00
|
|
|
relation_data = {'auth_host': '10.10.10.10',
|
|
|
|
'service_host': '10.10.10.10',
|
|
|
|
'auth_protocol': 'https',
|
2014-04-03 14:21:01 +02:00
|
|
|
'service_protocol': 'https',
|
|
|
|
'auth_port': 80,
|
|
|
|
'service_port': 81,
|
|
|
|
'https_keystone': 'True',
|
2014-12-01 22:11:52 -07:00
|
|
|
'ca_cert': 'certificate',
|
2016-06-28 08:20:27 +00:00
|
|
|
'region': 'RegionOne',
|
|
|
|
'api_version': 2,
|
|
|
|
'admin_domain_id': None}
|
2015-02-24 13:35:09 +00:00
|
|
|
self.peer_store_and_set.assert_called_with(relation_id=relation_id,
|
|
|
|
**relation_data)
|
2014-04-03 14:21:01 +02:00
|
|
|
|
2016-06-28 08:20:27 +00:00
|
|
|
@patch.object(utils, 'get_api_version')
|
|
|
|
@patch.object(utils, 'get_admin_domain_id')
|
2016-03-15 09:48:29 -07:00
|
|
|
@patch.object(utils, 'create_user')
|
2015-06-02 14:30:32 -07:00
|
|
|
@patch.object(utils, 'resolve_address')
|
2014-04-03 14:21:01 +02:00
|
|
|
@patch.object(utils, 'ensure_valid_service')
|
|
|
|
@patch.object(utils, 'add_endpoint')
|
2016-03-07 09:10:53 +00:00
|
|
|
@patch.object(utils, 'get_manager')
|
2014-04-10 17:00:28 +01:00
|
|
|
def test_add_service_to_keystone_no_clustered_no_https_complete_values(
|
2015-06-02 14:30:32 -07:00
|
|
|
self, KeystoneManager, add_endpoint, ensure_valid_service,
|
2016-06-28 08:20:27 +00:00
|
|
|
_resolve_address, create_user, get_admin_domain_id,
|
2016-11-02 13:21:07 +01:00
|
|
|
get_api_version, test_api_version=2):
|
2016-06-28 08:20:27 +00:00
|
|
|
get_admin_domain_id.return_value = None
|
2016-11-02 13:21:07 +01:00
|
|
|
get_api_version.return_value = test_api_version
|
2014-04-03 14:21:01 +02:00
|
|
|
relation_id = 'identity-service:0'
|
|
|
|
remote_unit = 'unit/0'
|
|
|
|
self.get_admin_token.return_value = 'token'
|
|
|
|
self.get_service_password.return_value = 'password'
|
|
|
|
self.test_config.set('service-tenant', 'tenant')
|
2016-11-02 13:21:07 +01:00
|
|
|
self.test_config.set('admin-role', 'Admin')
|
2014-04-10 17:00:28 +01:00
|
|
|
self.get_requested_roles.return_value = ['role1', ]
|
2015-06-02 14:30:32 -07:00
|
|
|
_resolve_address.return_value = '10.0.0.3'
|
2014-04-03 14:21:01 +02:00
|
|
|
self.test_config.set('admin-port', 80)
|
|
|
|
self.test_config.set('service-port', 81)
|
|
|
|
self.https.return_value = False
|
|
|
|
self.test_config.set('https-service-endpoints', 'False')
|
2014-04-04 12:26:08 +02:00
|
|
|
self.get_local_endpoint.return_value = 'http://localhost:80/v2.0/'
|
2015-03-10 12:02:11 +00:00
|
|
|
self.relation_ids.return_value = ['cluster/0']
|
2014-04-04 12:26:08 +02:00
|
|
|
|
2016-11-02 13:21:07 +01:00
|
|
|
service_domain = None
|
|
|
|
service_role = 'Admin'
|
|
|
|
if test_api_version > 2:
|
|
|
|
service_domain = 'service_domain'
|
|
|
|
service_role = 'service'
|
|
|
|
|
2014-04-04 12:26:08 +02:00
|
|
|
mock_keystone = MagicMock()
|
|
|
|
mock_keystone.resolve_tenant_id.return_value = 'tenant_id'
|
|
|
|
KeystoneManager.return_value = mock_keystone
|
2014-04-03 14:21:01 +02:00
|
|
|
|
|
|
|
self.relation_get.return_value = {'service': 'keystone',
|
|
|
|
'region': 'RegionOne',
|
|
|
|
'public_url': '10.0.0.1',
|
|
|
|
'admin_url': '10.0.0.2',
|
|
|
|
'internal_url': '192.168.1.2'}
|
|
|
|
|
2014-04-10 17:00:28 +01:00
|
|
|
utils.add_service_to_keystone(
|
|
|
|
relation_id=relation_id,
|
|
|
|
remote_unit=remote_unit)
|
2014-04-03 14:21:01 +02:00
|
|
|
ensure_valid_service.assert_called_with('keystone')
|
|
|
|
add_endpoint.assert_called_with(region='RegionOne', service='keystone',
|
2014-04-10 17:00:28 +01:00
|
|
|
publicurl='10.0.0.1',
|
|
|
|
adminurl='10.0.0.2',
|
2014-04-03 14:21:01 +02:00
|
|
|
internalurl='192.168.1.2')
|
2014-04-04 14:25:37 +02:00
|
|
|
self.assertTrue(self.get_admin_token.called)
|
2014-04-03 14:21:01 +02:00
|
|
|
self.get_service_password.assert_called_with('keystone')
|
2016-11-02 13:21:07 +01:00
|
|
|
create_user.assert_called_with('keystone', 'password',
|
|
|
|
domain=service_domain,
|
|
|
|
tenant='tenant')
|
|
|
|
self.grant_role.assert_called_with('keystone', service_role,
|
|
|
|
project_domain=service_domain,
|
|
|
|
tenant='tenant',
|
|
|
|
user_domain=service_domain)
|
|
|
|
self.create_role.assert_called_with('role1', user='keystone',
|
|
|
|
tenant='tenant',
|
|
|
|
domain=service_domain)
|
|
|
|
|
|
|
|
relation_data = {'admin_domain_id': None,
|
|
|
|
'auth_host': '10.0.0.3',
|
2016-06-28 08:20:27 +00:00
|
|
|
'service_host': '10.0.0.3', 'admin_token': 'token',
|
|
|
|
'service_port': 81, 'auth_port': 80,
|
|
|
|
'service_username': 'keystone',
|
2014-04-10 17:00:28 +01:00
|
|
|
'service_password': 'password',
|
2016-11-02 13:21:07 +01:00
|
|
|
'service_domain': service_domain,
|
2014-04-10 17:00:28 +01:00
|
|
|
'service_tenant': 'tenant',
|
2015-03-10 12:02:11 +00:00
|
|
|
'https_keystone': '__null__',
|
|
|
|
'ssl_cert': '__null__', 'ssl_key': '__null__',
|
2015-03-10 16:17:27 +00:00
|
|
|
'ca_cert': '__null__',
|
2014-04-04 12:26:08 +02:00
|
|
|
'auth_protocol': 'http', 'service_protocol': 'http',
|
2016-11-02 13:21:07 +01:00
|
|
|
'service_tenant_id': 'tenant_id',
|
|
|
|
'api_version': test_api_version}
|
2015-03-10 12:02:11 +00:00
|
|
|
|
|
|
|
filtered = {}
|
|
|
|
for k, v in relation_data.iteritems():
|
|
|
|
if v == '__null__':
|
|
|
|
filtered[k] = None
|
|
|
|
else:
|
|
|
|
filtered[k] = v
|
|
|
|
|
2015-03-10 16:17:27 +00:00
|
|
|
self.assertTrue(self.relation_set.called)
|
2015-04-09 11:30:15 +01:00
|
|
|
self.peer_store_and_set.assert_called_with(relation_id=relation_id,
|
|
|
|
**relation_data)
|
|
|
|
self.relation_set.assert_called_with(relation_id=relation_id,
|
|
|
|
**filtered)
|
2014-04-03 14:21:01 +02:00
|
|
|
|
2016-11-02 13:21:07 +01:00
|
|
|
def test_add_service_to_keystone_no_clustered_no_https_complete_values_v3(
|
|
|
|
self):
|
|
|
|
return self.\
|
|
|
|
test_add_service_to_keystone_no_clustered_no_https_complete_values(
|
|
|
|
test_api_version=3)
|
|
|
|
|
2015-08-19 10:48:04 +03:00
|
|
|
@patch('charmhelpers.contrib.openstack.ip.config')
|
2014-04-03 14:21:01 +02:00
|
|
|
@patch.object(utils, 'ensure_valid_service')
|
|
|
|
@patch.object(utils, 'add_endpoint')
|
2016-03-07 09:10:53 +00:00
|
|
|
@patch.object(utils, 'get_manager')
|
2014-04-10 17:00:28 +01:00
|
|
|
def test_add_service_to_keystone_nosubset(
|
2015-08-19 10:48:04 +03:00
|
|
|
self, KeystoneManager, add_endpoint, ensure_valid_service,
|
|
|
|
ip_config):
|
2014-04-03 14:21:01 +02:00
|
|
|
relation_id = 'identity-service:0'
|
|
|
|
remote_unit = 'unit/0'
|
|
|
|
|
|
|
|
self.relation_get.return_value = {'ec2_service': 'nova',
|
|
|
|
'ec2_region': 'RegionOne',
|
|
|
|
'ec2_public_url': '10.0.0.1',
|
|
|
|
'ec2_admin_url': '10.0.0.2',
|
|
|
|
'ec2_internal_url': '192.168.1.2'}
|
2014-04-04 12:26:08 +02:00
|
|
|
self.get_local_endpoint.return_value = 'http://localhost:80/v2.0/'
|
|
|
|
KeystoneManager.resolve_tenant_id.return_value = 'tenant_id'
|
2014-04-03 14:21:01 +02:00
|
|
|
|
2014-04-10 17:00:28 +01:00
|
|
|
utils.add_service_to_keystone(
|
|
|
|
relation_id=relation_id,
|
|
|
|
remote_unit=remote_unit)
|
2014-04-03 14:21:01 +02:00
|
|
|
ensure_valid_service.assert_called_with('nova')
|
|
|
|
add_endpoint.assert_called_with(region='RegionOne', service='nova',
|
2014-04-10 17:00:28 +01:00
|
|
|
publicurl='10.0.0.1',
|
|
|
|
adminurl='10.0.0.2',
|
|
|
|
internalurl='192.168.1.2')
|
2014-04-03 14:21:01 +02:00
|
|
|
|
2015-03-30 21:06:31 +01:00
|
|
|
@patch.object(utils, 'user_exists')
|
2015-03-30 20:17:16 +01:00
|
|
|
@patch.object(utils, 'grant_role')
|
|
|
|
@patch.object(utils, 'create_role')
|
|
|
|
@patch.object(utils, 'create_user')
|
2015-03-30 21:42:39 +01:00
|
|
|
def test_create_user_credentials_no_roles(self, mock_create_user,
|
|
|
|
mock_create_role,
|
|
|
|
mock_grant_role,
|
|
|
|
mock_user_exists):
|
2015-03-30 21:06:31 +01:00
|
|
|
mock_user_exists.return_value = False
|
2016-03-07 09:10:53 +00:00
|
|
|
utils.create_user_credentials('userA', 'passA', tenant='tenantA')
|
2016-11-02 13:21:07 +01:00
|
|
|
mock_create_user.assert_has_calls([call('userA', 'passA',
|
|
|
|
domain=None,
|
|
|
|
tenant='tenantA')])
|
2015-03-30 20:17:16 +01:00
|
|
|
mock_create_role.assert_has_calls([])
|
|
|
|
mock_grant_role.assert_has_calls([])
|
|
|
|
|
2015-03-30 21:06:31 +01:00
|
|
|
@patch.object(utils, 'user_exists')
|
2015-03-30 20:17:16 +01:00
|
|
|
@patch.object(utils, 'grant_role')
|
|
|
|
@patch.object(utils, 'create_role')
|
|
|
|
@patch.object(utils, 'create_user')
|
2015-03-30 21:42:39 +01:00
|
|
|
def test_create_user_credentials(self, mock_create_user, mock_create_role,
|
|
|
|
mock_grant_role, mock_user_exists):
|
2015-03-30 21:06:31 +01:00
|
|
|
mock_user_exists.return_value = False
|
2016-03-07 09:10:53 +00:00
|
|
|
utils.create_user_credentials('userA', 'passA', tenant='tenantA',
|
2015-03-30 21:42:39 +01:00
|
|
|
grants=['roleA'], new_roles=['roleB'])
|
2016-11-02 13:21:07 +01:00
|
|
|
mock_create_user.assert_has_calls([call('userA', 'passA',
|
|
|
|
tenant='tenantA',
|
|
|
|
domain=None)])
|
|
|
|
mock_create_role.assert_has_calls([call('roleB', user='userA',
|
|
|
|
tenant='tenantA',
|
|
|
|
domain=None)])
|
|
|
|
mock_grant_role.assert_has_calls([call('userA', 'roleA',
|
|
|
|
tenant='tenantA',
|
|
|
|
user_domain=None,
|
|
|
|
project_domain=None)])
|
2015-03-30 20:17:16 +01:00
|
|
|
|
2015-03-30 21:06:31 +01:00
|
|
|
@patch.object(utils, 'update_user_password')
|
|
|
|
@patch.object(utils, 'user_exists')
|
|
|
|
@patch.object(utils, 'grant_role')
|
|
|
|
@patch.object(utils, 'create_role')
|
|
|
|
@patch.object(utils, 'create_user')
|
2015-03-30 21:42:39 +01:00
|
|
|
def test_create_user_credentials_user_exists(self, mock_create_user,
|
|
|
|
mock_create_role,
|
|
|
|
mock_grant_role,
|
|
|
|
mock_user_exists,
|
|
|
|
mock_update_user_password):
|
2015-03-30 21:06:31 +01:00
|
|
|
mock_user_exists.return_value = True
|
2016-03-07 09:10:53 +00:00
|
|
|
utils.create_user_credentials('userA', 'passA', tenant='tenantA',
|
2015-03-30 21:42:39 +01:00
|
|
|
grants=['roleA'], new_roles=['roleB'])
|
2015-03-30 21:06:31 +01:00
|
|
|
mock_create_user.assert_has_calls([])
|
2016-11-02 13:21:07 +01:00
|
|
|
mock_create_role.assert_has_calls([call('roleB', user='userA',
|
|
|
|
tenant='tenantA',
|
|
|
|
domain=None)])
|
|
|
|
mock_grant_role.assert_has_calls([call('userA', 'roleA',
|
|
|
|
tenant='tenantA',
|
|
|
|
user_domain=None,
|
|
|
|
project_domain=None)])
|
2015-03-30 21:06:31 +01:00
|
|
|
mock_update_user_password.assert_has_calls([call('userA', 'passA')])
|
|
|
|
|
2016-03-15 09:48:29 -07:00
|
|
|
@patch.object(utils, 'get_manager')
|
|
|
|
def test_create_user_case_sensitivity(self, KeystoneManager):
|
|
|
|
""" Test case sensitivity of check for existence in
|
|
|
|
the user creation process """
|
|
|
|
mock_keystone = MagicMock()
|
|
|
|
KeystoneManager.return_value = mock_keystone
|
|
|
|
|
|
|
|
mock_user = MagicMock()
|
|
|
|
mock_keystone.resolve_user_id.return_value = mock_user
|
|
|
|
mock_keystone.api.users.list.return_value = [mock_user]
|
|
|
|
|
|
|
|
# User found is the same i.e. userA == userA
|
|
|
|
mock_user.name = 'userA'
|
|
|
|
utils.create_user('userA', 'passA')
|
|
|
|
mock_keystone.resolve_user_id.assert_called_with('userA',
|
|
|
|
user_domain=None)
|
|
|
|
mock_keystone.create_user.assert_not_called()
|
|
|
|
|
|
|
|
# User found has different case but is the same
|
|
|
|
# i.e. Usera != userA
|
|
|
|
mock_user.name = 'Usera'
|
|
|
|
utils.create_user('userA', 'passA')
|
|
|
|
mock_keystone.resolve_user_id.assert_called_with('userA',
|
|
|
|
user_domain=None)
|
|
|
|
mock_keystone.create_user.assert_not_called()
|
|
|
|
|
|
|
|
# User is different i.e. UserB != userA
|
|
|
|
mock_user.name = 'UserB'
|
|
|
|
utils.create_user('userA', 'passA')
|
|
|
|
mock_keystone.resolve_user_id.assert_called_with('userA',
|
|
|
|
user_domain=None)
|
|
|
|
mock_keystone.create_user.assert_called_with(name='userA',
|
|
|
|
password='passA',
|
|
|
|
tenant_id=None,
|
|
|
|
domain_id=None,
|
|
|
|
email='juju@localhost')
|
|
|
|
|
2015-03-30 21:06:31 +01:00
|
|
|
@patch.object(utils, 'get_service_password')
|
2015-03-30 21:42:39 +01:00
|
|
|
@patch.object(utils, 'create_user_credentials')
|
|
|
|
def test_create_service_credentials(self, mock_create_user_credentials,
|
2015-03-30 21:06:31 +01:00
|
|
|
mock_get_service_password):
|
|
|
|
mock_get_service_password.return_value = 'passA'
|
2016-03-07 09:10:53 +00:00
|
|
|
cfg = {'service-tenant': 'tenantA', 'admin-role': 'Admin',
|
|
|
|
'preferred-api-version': 2}
|
2015-03-30 20:17:16 +01:00
|
|
|
self.config.side_effect = lambda key: cfg.get(key, None)
|
2016-03-07 09:10:53 +00:00
|
|
|
calls = [call('serviceA', 'passA', domain=None, grants=['Admin'],
|
|
|
|
new_roles=None, tenant='tenantA')]
|
|
|
|
|
2015-03-30 20:17:16 +01:00
|
|
|
utils.create_service_credentials('serviceA')
|
2015-03-30 21:42:39 +01:00
|
|
|
mock_create_user_credentials.assert_has_calls(calls)
|
2015-03-30 20:17:16 +01:00
|
|
|
|
2014-04-03 14:21:01 +02:00
|
|
|
def test_ensure_valid_service_incorrect(self):
|
|
|
|
utils.ensure_valid_service('fakeservice')
|
|
|
|
self.log.assert_called_with("Invalid service requested: 'fakeservice'")
|
|
|
|
self.relation_set.assert_called_with(admin_token=-1)
|
|
|
|
|
|
|
|
def test_add_endpoint(self):
|
|
|
|
publicurl = '10.0.0.1'
|
|
|
|
adminurl = '10.0.0.2'
|
|
|
|
internalurl = '10.0.0.3'
|
2014-04-10 17:00:28 +01:00
|
|
|
utils.add_endpoint(
|
|
|
|
'RegionOne',
|
|
|
|
'nova',
|
|
|
|
publicurl,
|
|
|
|
adminurl,
|
|
|
|
internalurl)
|
|
|
|
self.create_service_entry.assert_called_with(
|
|
|
|
'nova',
|
|
|
|
'compute',
|
|
|
|
'Nova Compute Service')
|
|
|
|
self.create_endpoint_template.asssert_called_with(
|
|
|
|
region='RegionOne', service='nova',
|
|
|
|
publicurl=publicurl, adminurl=adminurl,
|
|
|
|
internalurl=internalurl)
|
2014-12-16 22:37:59 +00:00
|
|
|
|
2014-12-12 18:47:36 +00:00
|
|
|
@patch.object(utils, 'uuid')
|
2014-12-12 15:21:32 +00:00
|
|
|
@patch.object(utils, 'relation_set')
|
|
|
|
@patch.object(utils, 'relation_get')
|
|
|
|
@patch.object(utils, 'relation_ids')
|
|
|
|
@patch.object(utils, 'is_elected_leader')
|
2014-12-16 23:48:42 +00:00
|
|
|
def test_send_notifications(self, mock_is_elected_leader,
|
|
|
|
mock_relation_ids, mock_relation_get,
|
|
|
|
mock_relation_set, mock_uuid):
|
2014-12-12 19:36:10 +00:00
|
|
|
relation_id = 'testrel:0'
|
2014-12-12 18:47:36 +00:00
|
|
|
mock_uuid.uuid4.return_value = '1234'
|
2014-12-12 20:21:44 +00:00
|
|
|
mock_relation_ids.return_value = [relation_id]
|
2014-12-12 15:21:32 +00:00
|
|
|
mock_is_elected_leader.return_value = False
|
2014-12-16 23:48:42 +00:00
|
|
|
utils.send_notifications({'foo-endpoint-changed': 1})
|
2014-12-12 19:36:10 +00:00
|
|
|
self.assertFalse(mock_relation_set.called)
|
|
|
|
|
|
|
|
mock_is_elected_leader.return_value = True
|
2014-12-16 23:48:42 +00:00
|
|
|
utils.send_notifications({})
|
2014-12-12 15:21:32 +00:00
|
|
|
self.assertFalse(mock_relation_set.called)
|
|
|
|
|
2014-12-12 18:47:36 +00:00
|
|
|
settings = {'foo-endpoint-changed': 1}
|
2014-12-16 23:48:42 +00:00
|
|
|
utils.send_notifications(settings)
|
2014-12-12 18:47:36 +00:00
|
|
|
self.assertTrue(mock_relation_set.called)
|
2014-12-12 19:36:10 +00:00
|
|
|
mock_relation_set.assert_called_once_with(relation_id=relation_id,
|
2014-12-12 18:47:36 +00:00
|
|
|
relation_settings=settings)
|
|
|
|
mock_relation_set.reset_mock()
|
|
|
|
settings = {'foo-endpoint-changed': 1}
|
2014-12-17 13:21:10 +00:00
|
|
|
utils.send_notifications(settings, force=True)
|
2014-12-12 15:21:32 +00:00
|
|
|
self.assertTrue(mock_relation_set.called)
|
2014-12-12 18:47:36 +00:00
|
|
|
settings['trigger'] = '1234'
|
2014-12-12 19:36:10 +00:00
|
|
|
mock_relation_set.assert_called_once_with(relation_id=relation_id,
|
2014-12-12 18:47:36 +00:00
|
|
|
relation_settings=settings)
|
2015-01-14 13:17:50 +00:00
|
|
|
|
|
|
|
def test_get_admin_passwd_pwd_set(self):
|
|
|
|
self.test_config.set('admin-password', 'supersecret')
|
|
|
|
self.assertEqual(utils.get_admin_passwd(), 'supersecret')
|
|
|
|
|
|
|
|
@patch('os.path.isfile')
|
|
|
|
def test_get_admin_passwd_pwd_file_load(self, isfile):
|
|
|
|
self.test_config.set('admin-password', '')
|
|
|
|
isfile.return_value = True
|
|
|
|
with patch('__builtin__.open') as mock_open:
|
|
|
|
mock_open.return_value.__enter__ = lambda s: s
|
|
|
|
mock_open.return_value.__exit__ = Mock()
|
|
|
|
mock_open.return_value.readline.return_value = 'supersecretfilepwd'
|
|
|
|
self.assertEqual(utils.get_admin_passwd(), 'supersecretfilepwd')
|
|
|
|
|
|
|
|
@patch.object(utils, 'store_admin_passwd')
|
|
|
|
@patch('os.path.isfile')
|
|
|
|
def test_get_admin_passwd_genpass(self, isfile, store_admin_passwd):
|
|
|
|
self.test_config.set('admin-password', '')
|
|
|
|
isfile.return_value = False
|
|
|
|
self.subprocess.check_output.return_value = 'supersecretgen'
|
|
|
|
self.assertEqual(utils.get_admin_passwd(), 'supersecretgen')
|
2015-01-16 19:36:22 +00:00
|
|
|
|
2015-01-22 18:44:33 +00:00
|
|
|
def test_is_db_ready(self):
|
2015-02-02 13:49:05 +00:00
|
|
|
allowed_units = None
|
|
|
|
|
|
|
|
def fake_rel_get(attribute=None, *args, **kwargs):
|
|
|
|
if attribute == 'allowed_units':
|
|
|
|
return allowed_units
|
|
|
|
|
|
|
|
self.relation_get.side_effect = fake_rel_get
|
|
|
|
|
2015-01-22 18:44:33 +00:00
|
|
|
self.relation_id.return_value = 'shared-db:0'
|
2015-02-02 13:49:05 +00:00
|
|
|
self.relation_ids.return_value = ['shared-db:0']
|
2015-01-22 18:44:33 +00:00
|
|
|
self.local_unit.return_value = 'unit/0'
|
2015-02-02 13:49:05 +00:00
|
|
|
allowed_units = 'unit/0'
|
2015-01-22 18:44:33 +00:00
|
|
|
self.assertTrue(utils.is_db_ready(use_current_context=True))
|
|
|
|
|
2015-03-26 16:13:15 -07:00
|
|
|
self.relation_id.return_value = 'shared-db:0'
|
|
|
|
self.relation_ids.return_value = ['shared-db:0']
|
|
|
|
self.local_unit.return_value = 'unit/0'
|
|
|
|
allowed_units = 'unit/1'
|
|
|
|
self.assertFalse(utils.is_db_ready(use_current_context=True))
|
|
|
|
|
2015-01-22 18:44:33 +00:00
|
|
|
self.relation_ids.return_value = ['acme:0']
|
|
|
|
self.assertRaises(utils.is_db_ready, use_current_context=True)
|
|
|
|
|
2015-03-26 16:13:15 -07:00
|
|
|
allowed_units = 'unit/0'
|
2015-01-22 18:44:33 +00:00
|
|
|
self.related_units.return_value = ['unit/0']
|
2015-02-02 13:49:05 +00:00
|
|
|
self.relation_ids.return_value = ['shared-db:0', 'shared-db:1']
|
2015-01-22 18:44:33 +00:00
|
|
|
self.assertTrue(utils.is_db_ready())
|
|
|
|
|
2015-02-02 13:49:05 +00:00
|
|
|
allowed_units = 'unit/1'
|
2015-01-22 18:44:33 +00:00
|
|
|
self.assertFalse(utils.is_db_ready())
|
|
|
|
|
|
|
|
self.related_units.return_value = []
|
|
|
|
self.assertTrue(utils.is_db_ready())
|
2015-01-27 22:21:37 +00:00
|
|
|
|
|
|
|
@patch.object(utils, 'peer_units')
|
2015-12-07 15:04:38 +01:00
|
|
|
def test_ensure_ssl_cert_master_ssl_no_peers(self, mock_peer_units):
|
2015-02-03 12:56:40 +00:00
|
|
|
def mock_rel_get(unit=None, **kwargs):
|
|
|
|
return None
|
2015-01-27 22:21:37 +00:00
|
|
|
|
2015-02-03 12:56:40 +00:00
|
|
|
self.relation_get.side_effect = mock_rel_get
|
|
|
|
self.relation_ids.return_value = ['cluster:0']
|
|
|
|
self.local_unit.return_value = 'unit/0'
|
|
|
|
self.related_units.return_value = []
|
2015-01-27 22:21:37 +00:00
|
|
|
mock_peer_units.return_value = []
|
2015-02-03 12:56:40 +00:00
|
|
|
# This should get ignored since we are overriding
|
|
|
|
self.is_ssl_cert_master.return_value = False
|
|
|
|
self.is_elected_leader.return_value = False
|
2015-01-27 22:21:37 +00:00
|
|
|
self.assertTrue(utils.ensure_ssl_cert_master())
|
|
|
|
settings = {'ssl-cert-master': 'unit/0'}
|
|
|
|
self.relation_set.assert_called_with(relation_id='cluster:0',
|
|
|
|
relation_settings=settings)
|
|
|
|
|
2015-02-03 12:56:40 +00:00
|
|
|
@patch.object(utils, 'peer_units')
|
|
|
|
def test_ensure_ssl_cert_master_ssl_master_no_peers(self,
|
|
|
|
mock_peer_units):
|
|
|
|
def mock_rel_get(unit=None, **kwargs):
|
|
|
|
if unit == 'unit/0':
|
|
|
|
return 'unit/0'
|
|
|
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
self.relation_get.side_effect = mock_rel_get
|
|
|
|
self.relation_ids.return_value = ['cluster:0']
|
|
|
|
self.local_unit.return_value = 'unit/0'
|
|
|
|
self.related_units.return_value = []
|
|
|
|
mock_peer_units.return_value = []
|
|
|
|
# This should get ignored since we are overriding
|
|
|
|
self.is_ssl_cert_master.return_value = False
|
|
|
|
self.is_elected_leader.return_value = False
|
|
|
|
self.assertTrue(utils.ensure_ssl_cert_master())
|
2015-01-27 22:21:37 +00:00
|
|
|
settings = {'ssl-cert-master': 'unit/0'}
|
|
|
|
self.relation_set.assert_called_with(relation_id='cluster:0',
|
|
|
|
relation_settings=settings)
|
|
|
|
|
2015-02-03 12:56:40 +00:00
|
|
|
@patch.object(utils, 'peer_units')
|
2015-12-07 15:04:38 +01:00
|
|
|
def test_ensure_ssl_cert_master_ssl_not_leader(self, mock_peer_units):
|
2015-02-03 12:56:40 +00:00
|
|
|
self.relation_ids.return_value = ['cluster:0']
|
|
|
|
self.local_unit.return_value = 'unit/0'
|
|
|
|
mock_peer_units.return_value = ['unit/1']
|
|
|
|
self.is_ssl_cert_master.return_value = False
|
|
|
|
self.is_elected_leader.return_value = False
|
|
|
|
self.assertFalse(utils.ensure_ssl_cert_master())
|
|
|
|
self.assertFalse(self.relation_set.called)
|
|
|
|
|
|
|
|
@patch.object(utils, 'peer_units')
|
|
|
|
def test_ensure_ssl_cert_master_is_leader_new_peer(self,
|
|
|
|
mock_peer_units):
|
|
|
|
def mock_rel_get(unit=None, **kwargs):
|
|
|
|
if unit == 'unit/0':
|
|
|
|
return 'unit/0'
|
|
|
|
|
|
|
|
return 'unknown'
|
|
|
|
|
|
|
|
self.relation_get.side_effect = mock_rel_get
|
|
|
|
self.relation_ids.return_value = ['cluster:0']
|
|
|
|
self.local_unit.return_value = 'unit/0'
|
|
|
|
mock_peer_units.return_value = ['unit/1']
|
|
|
|
self.related_units.return_value = ['unit/1']
|
|
|
|
self.is_ssl_cert_master.return_value = False
|
|
|
|
self.is_elected_leader.return_value = True
|
2015-01-27 22:21:37 +00:00
|
|
|
self.assertFalse(utils.ensure_ssl_cert_master())
|
|
|
|
settings = {'ssl-cert-master': 'unit/0'}
|
|
|
|
self.relation_set.assert_called_with(relation_id='cluster:0',
|
|
|
|
relation_settings=settings)
|
2015-02-03 12:56:40 +00:00
|
|
|
|
|
|
|
@patch.object(utils, 'peer_units')
|
|
|
|
def test_ensure_ssl_cert_master_is_leader_no_new_peer(self,
|
|
|
|
mock_peer_units):
|
|
|
|
def mock_rel_get(unit=None, **kwargs):
|
|
|
|
if unit == 'unit/0':
|
|
|
|
return 'unit/0'
|
|
|
|
|
|
|
|
return 'unit/0'
|
|
|
|
|
|
|
|
self.relation_get.side_effect = mock_rel_get
|
|
|
|
self.relation_ids.return_value = ['cluster:0']
|
|
|
|
self.local_unit.return_value = 'unit/0'
|
|
|
|
mock_peer_units.return_value = ['unit/1']
|
|
|
|
self.related_units.return_value = ['unit/1']
|
|
|
|
self.is_ssl_cert_master.return_value = False
|
|
|
|
self.is_elected_leader.return_value = True
|
|
|
|
self.assertFalse(utils.ensure_ssl_cert_master())
|
|
|
|
self.assertFalse(self.relation_set.called)
|
|
|
|
|
2015-06-02 14:30:32 -07:00
|
|
|
@patch('charmhelpers.contrib.openstack.ip.unit_get')
|
|
|
|
@patch('charmhelpers.contrib.openstack.ip.is_clustered')
|
|
|
|
@patch('charmhelpers.contrib.openstack.ip.config')
|
|
|
|
@patch.object(utils, 'create_keystone_endpoint')
|
|
|
|
@patch.object(utils, 'create_tenant')
|
|
|
|
@patch.object(utils, 'create_user_credentials')
|
|
|
|
@patch.object(utils, 'create_service_entry')
|
|
|
|
def test_ensure_initial_admin_public_name(self,
|
|
|
|
_create_service_entry,
|
|
|
|
_create_user_creds,
|
|
|
|
_create_tenant,
|
|
|
|
_create_keystone_endpoint,
|
|
|
|
_ip_config,
|
|
|
|
_is_clustered,
|
|
|
|
_unit_get):
|
|
|
|
_is_clustered.return_value = False
|
|
|
|
_ip_config.side_effect = self.test_config.get
|
|
|
|
_unit_get.return_value = '10.0.0.1'
|
2015-06-03 11:24:05 -07:00
|
|
|
self.test_config.set('os-public-hostname', 'keystone.example.com')
|
2015-06-02 14:30:32 -07:00
|
|
|
utils.ensure_initial_admin(self.config)
|
|
|
|
_create_keystone_endpoint.assert_called_with(
|
|
|
|
public_ip='keystone.example.com',
|
|
|
|
service_port=5000,
|
|
|
|
internal_ip='10.0.0.1',
|
|
|
|
admin_ip='10.0.0.1',
|
|
|
|
auth_port=35357,
|
2016-03-07 09:10:53 +00:00
|
|
|
region='RegionOne',
|
2015-06-02 14:30:32 -07:00
|
|
|
)
|
|
|
|
|
2015-02-03 12:56:40 +00:00
|
|
|
@patch.object(utils, 'peer_units')
|
|
|
|
def test_ensure_ssl_cert_master_is_leader_bad_votes(self,
|
|
|
|
mock_peer_units):
|
|
|
|
counter = {0: 0}
|
|
|
|
|
|
|
|
def mock_rel_get(unit=None, **kwargs):
|
|
|
|
"""Returns a mix of votes."""
|
|
|
|
if unit == 'unit/0':
|
|
|
|
return 'unit/0'
|
|
|
|
|
|
|
|
ret = 'unit/%d' % (counter[0])
|
|
|
|
counter[0] += 1
|
|
|
|
return ret
|
|
|
|
|
|
|
|
self.relation_get.side_effect = mock_rel_get
|
|
|
|
self.relation_ids.return_value = ['cluster:0']
|
|
|
|
self.local_unit.return_value = 'unit/0'
|
|
|
|
mock_peer_units.return_value = ['unit/1']
|
|
|
|
self.related_units.return_value = ['unit/1']
|
|
|
|
self.is_ssl_cert_master.return_value = False
|
|
|
|
self.is_elected_leader.return_value = True
|
|
|
|
self.assertFalse(utils.ensure_ssl_cert_master())
|
|
|
|
self.assertFalse(self.relation_set.called)
|
2015-03-11 11:45:09 +00:00
|
|
|
|
2014-12-16 22:37:59 +00:00
|
|
|
@patch.object(utils, 'git_install_requested')
|
|
|
|
@patch.object(utils, 'git_post_install')
|
|
|
|
@patch.object(utils, 'git_pre_install')
|
2016-06-24 12:49:30 +00:00
|
|
|
def test_git_install(self, git_requested, git_pre, git_post):
|
2015-03-18 20:15:45 +00:00
|
|
|
projects_yaml = openstack_origin_git
|
2014-12-16 22:37:59 +00:00
|
|
|
git_requested.return_value = True
|
2015-03-18 20:15:45 +00:00
|
|
|
utils.git_install(projects_yaml)
|
2014-12-16 22:37:59 +00:00
|
|
|
self.assertTrue(git_pre.called)
|
2016-06-24 12:49:30 +00:00
|
|
|
self.git_clone_and_install.assert_called_with(openstack_origin_git,
|
|
|
|
core_project='keystone')
|
2014-12-16 22:37:59 +00:00
|
|
|
self.assertTrue(git_post.called)
|
|
|
|
|
|
|
|
@patch.object(utils, 'mkdir')
|
|
|
|
@patch.object(utils, 'write_file')
|
|
|
|
@patch.object(utils, 'add_user_to_group')
|
|
|
|
@patch.object(utils, 'add_group')
|
|
|
|
@patch.object(utils, 'adduser')
|
|
|
|
def test_git_pre_install(self, adduser, add_group, add_user_to_group,
|
|
|
|
write_file, mkdir):
|
|
|
|
utils.git_pre_install()
|
|
|
|
adduser.assert_called_with('keystone', shell='/bin/bash',
|
2016-06-24 12:49:30 +00:00
|
|
|
system_user=True,
|
|
|
|
home_dir='/var/lib/keystone')
|
2014-12-16 22:37:59 +00:00
|
|
|
add_group.assert_called_with('keystone', system_group=True)
|
|
|
|
add_user_to_group.assert_called_with('keystone', 'keystone')
|
|
|
|
expected = [
|
|
|
|
call('/var/lib/keystone', owner='keystone',
|
2015-04-17 12:10:54 +00:00
|
|
|
group='keystone', perms=0755, force=False),
|
2014-12-16 22:37:59 +00:00
|
|
|
call('/var/lib/keystone/cache', owner='keystone',
|
2015-04-17 12:10:54 +00:00
|
|
|
group='keystone', perms=0755, force=False),
|
2014-12-16 22:37:59 +00:00
|
|
|
call('/var/log/keystone', owner='keystone',
|
2015-04-17 12:10:54 +00:00
|
|
|
group='keystone', perms=0755, force=False),
|
2014-12-16 22:37:59 +00:00
|
|
|
]
|
|
|
|
self.assertEquals(mkdir.call_args_list, expected)
|
|
|
|
write_file.assert_called_with('/var/log/keystone/keystone.log',
|
|
|
|
'', owner='keystone', group='keystone',
|
|
|
|
perms=0600)
|
|
|
|
|
2015-03-18 20:15:45 +00:00
|
|
|
@patch('os.path.join')
|
2015-04-13 18:03:02 +00:00
|
|
|
@patch('os.path.exists')
|
2015-05-07 17:05:18 +00:00
|
|
|
@patch('os.symlink')
|
2015-04-13 18:03:02 +00:00
|
|
|
@patch('shutil.copytree')
|
|
|
|
@patch('shutil.rmtree')
|
2015-05-07 17:05:18 +00:00
|
|
|
@patch('subprocess.check_call')
|
|
|
|
def test_git_post_install(self, check_call, rmtree, copytree, symlink,
|
2016-06-24 12:49:30 +00:00
|
|
|
exists, join):
|
2015-03-18 20:15:45 +00:00
|
|
|
projects_yaml = openstack_origin_git
|
|
|
|
join.return_value = 'joined-string'
|
2016-06-24 12:49:30 +00:00
|
|
|
self.git_pip_venv_dir.return_value = '/mnt/openstack-git/venv'
|
|
|
|
self.lsb_release.return_value = {'DISTRIB_RELEASE': '15.04'}
|
2015-03-18 20:15:45 +00:00
|
|
|
utils.git_post_install(projects_yaml)
|
2014-12-16 22:37:59 +00:00
|
|
|
expected = [
|
2015-04-13 18:03:02 +00:00
|
|
|
call('joined-string', '/etc/keystone'),
|
2014-12-16 22:37:59 +00:00
|
|
|
]
|
2015-04-13 18:03:02 +00:00
|
|
|
copytree.assert_has_calls(expected)
|
2015-05-07 17:05:18 +00:00
|
|
|
expected = [
|
|
|
|
call('joined-string', '/usr/local/bin/keystone-manage'),
|
|
|
|
]
|
|
|
|
symlink.assert_has_calls(expected, any_order=True)
|
2014-12-16 22:37:59 +00:00
|
|
|
keystone_context = {
|
|
|
|
'service_description': 'Keystone API server',
|
|
|
|
'service_name': 'Keystone',
|
|
|
|
'user_name': 'keystone',
|
|
|
|
'start_dir': '/var/lib/keystone',
|
|
|
|
'process_name': 'keystone',
|
2015-05-05 19:54:36 +00:00
|
|
|
'executable_name': 'joined-string',
|
2015-04-08 18:18:07 +00:00
|
|
|
'config_files': ['/etc/keystone/keystone.conf'],
|
2015-03-30 11:57:01 +00:00
|
|
|
'log_file': '/var/log/keystone/keystone.log',
|
2014-12-16 22:37:59 +00:00
|
|
|
}
|
|
|
|
expected = [
|
2015-04-13 13:59:56 +00:00
|
|
|
call('git/logging.conf', '/etc/keystone/logging.conf', {},
|
2014-12-16 22:37:59 +00:00
|
|
|
perms=0o644),
|
2015-03-18 20:15:45 +00:00
|
|
|
call('git.upstart', '/etc/init/keystone.conf',
|
|
|
|
keystone_context, perms=0o644, templates_dir='joined-string'),
|
2014-12-16 22:37:59 +00:00
|
|
|
]
|
2016-06-24 12:49:30 +00:00
|
|
|
self.assertEquals(self.render.call_args_list, expected)
|
|
|
|
self.service_restart.assert_called_with('keystone')
|
2016-01-13 15:13:10 +00:00
|
|
|
|
2016-03-07 09:10:53 +00:00
|
|
|
@patch.object(utils, 'get_manager')
|
2016-01-12 11:09:46 +00:00
|
|
|
def test_is_service_present(self, KeystoneManager):
|
|
|
|
mock_keystone = MagicMock()
|
|
|
|
mock_keystone.resolve_service_id.return_value = 'sid1'
|
|
|
|
KeystoneManager.return_value = mock_keystone
|
|
|
|
self.assertTrue(utils.is_service_present('bob', 'bill'))
|
|
|
|
|
2016-03-07 09:10:53 +00:00
|
|
|
@patch.object(utils, 'get_manager')
|
2016-01-12 11:09:46 +00:00
|
|
|
def test_is_service_present_false(self, KeystoneManager):
|
|
|
|
mock_keystone = MagicMock()
|
|
|
|
mock_keystone.resolve_service_id.return_value = None
|
|
|
|
KeystoneManager.return_value = mock_keystone
|
|
|
|
self.assertFalse(utils.is_service_present('bob', 'bill'))
|
|
|
|
|
2016-03-07 09:10:53 +00:00
|
|
|
@patch.object(utils, 'get_manager')
|
2016-01-12 11:09:46 +00:00
|
|
|
def test_delete_service_entry(self, KeystoneManager):
|
|
|
|
mock_keystone = MagicMock()
|
|
|
|
mock_keystone.resolve_service_id.return_value = 'sid1'
|
|
|
|
KeystoneManager.return_value = mock_keystone
|
|
|
|
utils.delete_service_entry('bob', 'bill')
|
|
|
|
mock_keystone.api.services.delete.assert_called_with('sid1')
|
2016-01-19 08:54:03 -08:00
|
|
|
|
2016-03-02 11:04:09 +00:00
|
|
|
@patch('os.path.isfile')
|
2016-09-23 09:05:46 +00:00
|
|
|
def test_get_file_stored_domain_id(self, isfile_mock):
|
2016-03-02 11:04:09 +00:00
|
|
|
isfile_mock.return_value = False
|
2016-09-23 09:05:46 +00:00
|
|
|
x = utils.get_file_stored_domain_id('/a/file')
|
2016-03-02 11:04:09 +00:00
|
|
|
assert x is None
|
|
|
|
from sys import version_info
|
|
|
|
if version_info.major == 2:
|
|
|
|
import __builtin__ as builtins
|
|
|
|
else:
|
|
|
|
import builtins
|
|
|
|
from mock import mock_open
|
|
|
|
with patch.object(builtins, 'open', mock_open(
|
|
|
|
read_data="some_data\n")):
|
|
|
|
isfile_mock.return_value = True
|
2016-09-23 09:05:46 +00:00
|
|
|
x = utils.get_file_stored_domain_id('/a/file')
|
2016-03-02 11:04:09 +00:00
|
|
|
self.assertEquals(x, 'some_data')
|
|
|
|
|
2016-09-23 09:05:46 +00:00
|
|
|
@patch.object(utils, 'get_file_stored_domain_id')
|
|
|
|
def test_get_admin_domain_id(self, mock_get_file_stored_domain_id):
|
|
|
|
utils.get_admin_domain_id()
|
|
|
|
mock_get_file_stored_domain_id.assert_called_with(
|
|
|
|
'/var/lib/keystone/keystone.admin_domain_id')
|
|
|
|
|
|
|
|
@patch.object(utils, 'get_file_stored_domain_id')
|
|
|
|
def test_get_default_domain_id(self, mock_get_file_stored_domain_id):
|
|
|
|
utils.get_default_domain_id()
|
|
|
|
mock_get_file_stored_domain_id.assert_called_with(
|
|
|
|
'/var/lib/keystone/keystone.default_domain_id')
|
|
|
|
|
2016-03-02 11:04:09 +00:00
|
|
|
def test_assess_status(self):
|
|
|
|
with patch.object(utils, 'assess_status_func') as asf:
|
|
|
|
callee = MagicMock()
|
|
|
|
asf.return_value = callee
|
|
|
|
utils.assess_status('test-config')
|
|
|
|
asf.assert_called_once_with('test-config')
|
|
|
|
callee.assert_called_once_with()
|
2016-09-20 12:19:37 +01:00
|
|
|
self.os_application_version_set.assert_called_with(
|
|
|
|
utils.VERSION_PACKAGE
|
|
|
|
)
|
2016-03-02 11:04:09 +00:00
|
|
|
|
2016-06-15 14:05:01 +00:00
|
|
|
@patch.object(utils, 'get_optional_interfaces')
|
2016-03-02 11:04:09 +00:00
|
|
|
@patch.object(utils, 'REQUIRED_INTERFACES')
|
|
|
|
@patch.object(utils, 'check_optional_relations')
|
|
|
|
@patch.object(utils, 'services')
|
|
|
|
@patch.object(utils, 'determine_ports')
|
|
|
|
@patch.object(utils, 'make_assess_status_func')
|
|
|
|
def test_assess_status_func(self,
|
|
|
|
make_assess_status_func,
|
|
|
|
determine_ports,
|
|
|
|
services,
|
|
|
|
check_optional_relations,
|
2016-06-15 14:05:01 +00:00
|
|
|
REQUIRED_INTERFACES,
|
|
|
|
get_optional_interfaces):
|
2016-03-02 11:04:09 +00:00
|
|
|
services.return_value = 's1'
|
|
|
|
determine_ports.return_value = 'p1'
|
2016-06-15 14:05:01 +00:00
|
|
|
REQUIRED_INTERFACES.copy.return_value = {'int': ['test 1']}
|
|
|
|
get_optional_interfaces.return_value = {'opt': ['test 2']}
|
2016-03-02 11:04:09 +00:00
|
|
|
utils.assess_status_func('test-config')
|
|
|
|
make_assess_status_func.assert_called_once_with(
|
2016-06-15 14:05:01 +00:00
|
|
|
'test-config',
|
|
|
|
{'int': ['test 1'], 'opt': ['test 2']},
|
2016-03-02 11:04:09 +00:00
|
|
|
charm_func=check_optional_relations, services='s1', ports='p1')
|
|
|
|
|
|
|
|
def test_pause_unit_helper(self):
|
|
|
|
with patch.object(utils, '_pause_resume_helper') as prh:
|
|
|
|
utils.pause_unit_helper('random-config')
|
|
|
|
prh.assert_called_once_with(utils.pause_unit, 'random-config')
|
|
|
|
with patch.object(utils, '_pause_resume_helper') as prh:
|
|
|
|
utils.resume_unit_helper('random-config')
|
|
|
|
prh.assert_called_once_with(utils.resume_unit, 'random-config')
|
|
|
|
|
|
|
|
@patch.object(utils, 'services')
|
|
|
|
@patch.object(utils, 'determine_ports')
|
|
|
|
def test_pause_resume_helper(self, determine_ports, services):
|
|
|
|
f = MagicMock()
|
|
|
|
services.return_value = 's1'
|
|
|
|
determine_ports.return_value = 'p1'
|
|
|
|
with patch.object(utils, 'assess_status_func') as asf:
|
|
|
|
asf.return_value = 'assessor'
|
|
|
|
utils._pause_resume_helper(f, 'some-config')
|
|
|
|
asf.assert_called_once_with('some-config')
|
|
|
|
f.assert_called_once_with('assessor', services='s1', ports='p1')
|
2016-04-08 16:57:02 +00:00
|
|
|
|
|
|
|
@patch.object(utils, 'run_in_apache')
|
|
|
|
@patch.object(utils, 'restart_pid_check')
|
|
|
|
def test_restart_function_map(self, restart_pid_check, run_in_apache):
|
|
|
|
run_in_apache.return_value = True
|
|
|
|
self.assertEqual(utils.restart_function_map(),
|
|
|
|
{'apache2': restart_pid_check})
|
|
|
|
|
|
|
|
@patch.object(utils, 'run_in_apache')
|
|
|
|
def test_restart_function_map_legacy(self, run_in_apache):
|
|
|
|
run_in_apache.return_value = False
|
|
|
|
self.assertEqual(utils.restart_function_map(), {})
|
|
|
|
|
|
|
|
def test_restart_pid_check(self):
|
|
|
|
self.subprocess.call.return_value = 1
|
|
|
|
utils.restart_pid_check('apache2')
|
|
|
|
self.service_stop.assert_called_once_with('apache2')
|
|
|
|
self.service_start.assert_called_once_with('apache2')
|
|
|
|
self.subprocess.call.assert_called_once_with(['pgrep', 'apache2'])
|
|
|
|
|
|
|
|
def test_restart_pid_check_ptable_string(self):
|
|
|
|
self.subprocess.call.return_value = 1
|
|
|
|
utils.restart_pid_check('apache2', ptable_string='httpd')
|
|
|
|
self.service_stop.assert_called_once_with('apache2')
|
|
|
|
self.service_start.assert_called_once_with('apache2')
|
|
|
|
self.subprocess.call.assert_called_once_with(['pgrep', 'httpd'])
|
|
|
|
|
2016-04-12 15:52:58 -07:00
|
|
|
# Do not sleep() to speed up manual runs.
|
|
|
|
@patch('charmhelpers.core.decorators.time')
|
|
|
|
def test_restart_pid_check_ptable_string_retry(self, mock_time):
|
2016-04-08 16:57:02 +00:00
|
|
|
call_returns = [1, 0, 0]
|
|
|
|
self.subprocess.call.side_effect = lambda x: call_returns.pop()
|
|
|
|
utils.restart_pid_check('apache2', ptable_string='httpd')
|
|
|
|
self.service_stop.assert_called_once_with('apache2')
|
|
|
|
self.service_start.assert_called_once_with('apache2')
|
|
|
|
# self.subprocess.call.assert_called_once_with(['pgrep', 'httpd'])
|
|
|
|
expected = [
|
|
|
|
call(['pgrep', 'httpd']),
|
|
|
|
call(['pgrep', 'httpd']),
|
|
|
|
call(['pgrep', 'httpd']),
|
|
|
|
]
|
|
|
|
self.assertEquals(self.subprocess.call.call_args_list, expected)
|
2016-04-12 15:52:58 -07:00
|
|
|
|
|
|
|
def test_get_requested_grants(self):
|
|
|
|
settings = {'requested_grants': 'Admin,Member'}
|
|
|
|
expected_results = ['Admin', 'Member']
|
|
|
|
self.assertEqual(utils.get_requested_grants(settings),
|
|
|
|
expected_results)
|
|
|
|
settings = {'not_requsted_grants': 'something else'}
|
|
|
|
expected_results = []
|
|
|
|
self.assertEqual(utils.get_requested_grants(settings),
|
|
|
|
expected_results)
|
|
|
|
|
|
|
|
@patch.object(utils, 'https')
|
|
|
|
def test_get_protocol(self, https):
|
|
|
|
# http
|
|
|
|
https.return_value = False
|
|
|
|
protocol = utils.get_protocol()
|
|
|
|
self.assertEqual(protocol, 'http')
|
|
|
|
# https
|
|
|
|
https.return_value = True
|
|
|
|
protocol = utils.get_protocol()
|
|
|
|
self.assertEqual(protocol, 'https')
|
|
|
|
|
|
|
|
def test_get_ssl_ca_settings(self):
|
|
|
|
CA = MagicMock()
|
|
|
|
CA.get_ca_bundle.return_value = 'certstring'
|
|
|
|
self.test_config.set('https-service-endpoints', 'True')
|
|
|
|
self.get_ca.return_value = CA
|
|
|
|
expected_settings = {'https_keystone': 'True',
|
|
|
|
'ca_cert': b64encode('certstring')}
|
|
|
|
settings = utils.get_ssl_ca_settings()
|
|
|
|
self.assertEqual(settings, expected_settings)
|
|
|
|
|
|
|
|
@patch.object(utils, 'get_manager')
|
|
|
|
def test_add_credentials_keystone_not_ready(self, get_manager):
|
|
|
|
""" Verify add_credentials_to_keystone when the relation
|
|
|
|
data is incomplete """
|
|
|
|
relation_id = 'identity-credentials:0'
|
|
|
|
remote_unit = 'unit/0'
|
|
|
|
self.relation_get.return_value = {}
|
|
|
|
utils.add_credentials_to_keystone(
|
|
|
|
relation_id=relation_id,
|
|
|
|
remote_unit=remote_unit)
|
|
|
|
self.log.assert_called_with('identity-credentials peer has not yet '
|
|
|
|
'set username')
|
|
|
|
|
|
|
|
@patch.object(utils, 'create_user_credentials')
|
|
|
|
@patch.object(utils, 'get_protocol')
|
|
|
|
@patch.object(utils, 'resolve_address')
|
|
|
|
@patch.object(utils, 'get_api_version')
|
|
|
|
@patch.object(utils, 'get_manager')
|
|
|
|
def test_add_credentials_keystone_username_only(self, get_manager,
|
|
|
|
get_api_version,
|
|
|
|
resolve_address,
|
|
|
|
get_protocol,
|
|
|
|
create_user_credentials):
|
|
|
|
""" Verify add_credentials with only username """
|
|
|
|
manager = MagicMock()
|
|
|
|
manager.resolve_tenant_id.return_value = 'abcdef0123456789'
|
|
|
|
get_manager.return_value = manager
|
|
|
|
remote_unit = 'unit/0'
|
|
|
|
relation_id = 'identity-credentials:0'
|
|
|
|
get_api_version.return_value = 2
|
|
|
|
get_protocol.return_value = 'http'
|
|
|
|
resolve_address.return_value = '10.10.10.10'
|
|
|
|
create_user_credentials.return_value = 'password'
|
|
|
|
self.relation_get.return_value = {'username': 'requester'}
|
|
|
|
self.get_service_password.return_value = 'password'
|
|
|
|
self.get_requested_roles.return_value = []
|
|
|
|
self.test_config.set('admin-port', 80)
|
|
|
|
self.test_config.set('service-port', 81)
|
|
|
|
self.test_config.set('service-tenant', 'services')
|
|
|
|
relation_data = {'auth_host': '10.10.10.10',
|
|
|
|
'credentials_host': '10.10.10.10',
|
|
|
|
'credentials_port': 81,
|
|
|
|
'auth_port': 80,
|
|
|
|
'auth_protocol': 'http',
|
|
|
|
'credentials_username': 'requester',
|
|
|
|
'credentials_protocol': 'http',
|
|
|
|
'credentials_password': 'password',
|
|
|
|
'credentials_project': 'services',
|
|
|
|
'credentials_project_id': 'abcdef0123456789',
|
|
|
|
'region': 'RegionOne',
|
|
|
|
'api_version': 2}
|
|
|
|
|
|
|
|
utils.add_credentials_to_keystone(
|
|
|
|
relation_id=relation_id,
|
|
|
|
remote_unit=remote_unit)
|
|
|
|
create_user_credentials.assert_called_with('requester', 'password',
|
|
|
|
domain=None,
|
|
|
|
new_roles=[],
|
|
|
|
grants=['Admin'],
|
2016-05-04 08:52:11 -07:00
|
|
|
tenant='services')
|
2016-04-12 15:52:58 -07:00
|
|
|
self.peer_store_and_set.assert_called_with(relation_id=relation_id,
|
|
|
|
**relation_data)
|
|
|
|
|
|
|
|
@patch.object(utils, 'create_user_credentials')
|
|
|
|
@patch.object(utils, 'get_protocol')
|
|
|
|
@patch.object(utils, 'resolve_address')
|
|
|
|
@patch.object(utils, 'get_api_version')
|
|
|
|
@patch.object(utils, 'get_manager')
|
|
|
|
def test_add_credentials_keystone_kv3(self, get_manager,
|
|
|
|
get_api_version,
|
|
|
|
resolve_address,
|
|
|
|
get_protocol,
|
|
|
|
create_user_credentials):
|
|
|
|
""" Verify add_credentials with Keystone V3 """
|
|
|
|
manager = MagicMock()
|
|
|
|
manager.resolve_tenant_id.return_value = 'abcdef0123456789'
|
|
|
|
get_manager.return_value = manager
|
|
|
|
remote_unit = 'unit/0'
|
|
|
|
relation_id = 'identity-credentials:0'
|
|
|
|
get_api_version.return_value = 3
|
|
|
|
get_protocol.return_value = 'http'
|
|
|
|
resolve_address.return_value = '10.10.10.10'
|
|
|
|
create_user_credentials.return_value = 'password'
|
|
|
|
self.relation_get.return_value = {'username': 'requester',
|
|
|
|
'domain': 'Non-Default'}
|
|
|
|
self.get_service_password.return_value = 'password'
|
|
|
|
self.get_requested_roles.return_value = []
|
|
|
|
self.test_config.set('admin-port', 80)
|
|
|
|
self.test_config.set('service-port', 81)
|
|
|
|
relation_data = {'auth_host': '10.10.10.10',
|
|
|
|
'credentials_host': '10.10.10.10',
|
|
|
|
'credentials_port': 81,
|
|
|
|
'auth_port': 80,
|
|
|
|
'auth_protocol': 'http',
|
|
|
|
'credentials_username': 'requester',
|
|
|
|
'credentials_protocol': 'http',
|
|
|
|
'credentials_password': 'password',
|
|
|
|
'credentials_project': 'services',
|
|
|
|
'credentials_project_id': 'abcdef0123456789',
|
|
|
|
'region': 'RegionOne',
|
|
|
|
'api_version': 3}
|
|
|
|
|
|
|
|
utils.add_credentials_to_keystone(
|
|
|
|
relation_id=relation_id,
|
|
|
|
remote_unit=remote_unit)
|
|
|
|
create_user_credentials.assert_called_with('requester', 'password',
|
|
|
|
domain='Non-Default',
|
|
|
|
new_roles=[],
|
2016-11-02 13:21:07 +01:00
|
|
|
grants=['service'],
|
2016-05-04 08:52:11 -07:00
|
|
|
tenant='services')
|
2016-04-12 15:52:58 -07:00
|
|
|
self.peer_store_and_set.assert_called_with(relation_id=relation_id,
|
|
|
|
**relation_data)
|
|
|
|
|
|
|
|
@patch.object(utils, 'create_tenant')
|
|
|
|
@patch.object(utils, 'create_user_credentials')
|
|
|
|
@patch.object(utils, 'get_protocol')
|
|
|
|
@patch.object(utils, 'resolve_address')
|
|
|
|
@patch.object(utils, 'get_api_version')
|
|
|
|
@patch.object(utils, 'get_manager')
|
|
|
|
def test_add_credentials_keystone_roles_grants(self, get_manager,
|
|
|
|
get_api_version,
|
|
|
|
resolve_address,
|
|
|
|
get_protocol,
|
|
|
|
create_user_credentials,
|
|
|
|
create_tenant):
|
|
|
|
""" Verify add_credentials with all relation settings """
|
|
|
|
manager = MagicMock()
|
|
|
|
manager.resolve_tenant_id.return_value = 'abcdef0123456789'
|
|
|
|
get_manager.return_value = manager
|
|
|
|
remote_unit = 'unit/0'
|
|
|
|
relation_id = 'identity-credentials:0'
|
|
|
|
get_api_version.return_value = 2
|
|
|
|
get_protocol.return_value = 'http'
|
|
|
|
resolve_address.return_value = '10.10.10.10'
|
|
|
|
create_user_credentials.return_value = 'password'
|
|
|
|
self.relation_get.return_value = {'username': 'requester',
|
|
|
|
'project': 'myproject',
|
|
|
|
'requested_roles': 'New,Member',
|
|
|
|
'requested_grants': 'New,Member'}
|
|
|
|
self.get_service_password.return_value = 'password'
|
|
|
|
self.get_requested_roles.return_value = ['New', 'Member']
|
|
|
|
self.test_config.set('admin-port', 80)
|
|
|
|
self.test_config.set('service-port', 81)
|
|
|
|
relation_data = {'auth_host': '10.10.10.10',
|
|
|
|
'credentials_host': '10.10.10.10',
|
|
|
|
'credentials_port': 81,
|
|
|
|
'auth_port': 80,
|
|
|
|
'auth_protocol': 'http',
|
|
|
|
'credentials_username': 'requester',
|
|
|
|
'credentials_protocol': 'http',
|
|
|
|
'credentials_password': 'password',
|
|
|
|
'credentials_project': 'myproject',
|
|
|
|
'credentials_project_id': 'abcdef0123456789',
|
|
|
|
'region': 'RegionOne',
|
|
|
|
'api_version': 2}
|
|
|
|
|
|
|
|
utils.add_credentials_to_keystone(
|
|
|
|
relation_id=relation_id,
|
|
|
|
remote_unit=remote_unit)
|
2016-11-02 13:21:07 +01:00
|
|
|
create_tenant.assert_called_with('myproject', None)
|
2016-04-12 15:52:58 -07:00
|
|
|
create_user_credentials.assert_called_with('requester', 'password',
|
|
|
|
domain=None,
|
|
|
|
new_roles=['New', 'Member'],
|
|
|
|
grants=['New', 'Member'],
|
2016-05-04 08:52:11 -07:00
|
|
|
tenant='myproject')
|
2016-04-12 15:52:58 -07:00
|
|
|
self.peer_store_and_set.assert_called_with(relation_id=relation_id,
|
|
|
|
**relation_data)
|
|
|
|
|
|
|
|
@patch.object(utils, 'get_ssl_ca_settings')
|
|
|
|
@patch.object(utils, 'create_user_credentials')
|
|
|
|
@patch.object(utils, 'get_protocol')
|
|
|
|
@patch.object(utils, 'resolve_address')
|
|
|
|
@patch.object(utils, 'get_api_version')
|
|
|
|
@patch.object(utils, 'get_manager')
|
|
|
|
def test_add_credentials_keystone_ssl(self, get_manager,
|
|
|
|
get_api_version,
|
|
|
|
resolve_address,
|
|
|
|
get_protocol,
|
|
|
|
create_user_credentials,
|
|
|
|
get_ssl_ca_settings):
|
|
|
|
""" Verify add_credentials with SSL """
|
|
|
|
manager = MagicMock()
|
|
|
|
manager.resolve_tenant_id.return_value = 'abcdef0123456789'
|
|
|
|
get_manager.return_value = manager
|
|
|
|
remote_unit = 'unit/0'
|
|
|
|
relation_id = 'identity-credentials:0'
|
|
|
|
get_api_version.return_value = 2
|
|
|
|
get_protocol.return_value = 'https'
|
|
|
|
resolve_address.return_value = '10.10.10.10'
|
|
|
|
create_user_credentials.return_value = 'password'
|
|
|
|
get_ssl_ca_settings.return_value = {'https_keystone': 'True',
|
|
|
|
'ca_cert': 'base64certstring'}
|
|
|
|
self.relation_get.return_value = {'username': 'requester'}
|
|
|
|
self.get_service_password.return_value = 'password'
|
|
|
|
self.get_requested_roles.return_value = []
|
|
|
|
self.test_config.set('admin-port', 80)
|
|
|
|
self.test_config.set('service-port', 81)
|
|
|
|
self.test_config.set('https-service-endpoints', 'True')
|
|
|
|
relation_data = {'auth_host': '10.10.10.10',
|
|
|
|
'credentials_host': '10.10.10.10',
|
|
|
|
'credentials_port': 81,
|
|
|
|
'auth_port': 80,
|
|
|
|
'auth_protocol': 'https',
|
|
|
|
'credentials_username': 'requester',
|
|
|
|
'credentials_protocol': 'https',
|
|
|
|
'credentials_password': 'password',
|
|
|
|
'credentials_project': 'services',
|
|
|
|
'credentials_project_id': 'abcdef0123456789',
|
|
|
|
'region': 'RegionOne',
|
|
|
|
'api_version': 2,
|
|
|
|
'https_keystone': 'True',
|
|
|
|
'ca_cert': 'base64certstring'}
|
|
|
|
|
|
|
|
utils.add_credentials_to_keystone(
|
|
|
|
relation_id=relation_id,
|
|
|
|
remote_unit=remote_unit)
|
|
|
|
create_user_credentials.assert_called_with('requester', 'password',
|
|
|
|
domain=None,
|
|
|
|
new_roles=[],
|
|
|
|
grants=['Admin'],
|
2016-05-04 08:52:11 -07:00
|
|
|
tenant='services')
|
2016-04-12 15:52:58 -07:00
|
|
|
self.peer_store_and_set.assert_called_with(relation_id=relation_id,
|
|
|
|
**relation_data)
|