sunbeam-charms/charms/keystone-k8s/tests/unit/test_keystone_charm.py
Hemanth Nakkina 3d6d197406 Sync global tox, requirement files
Following changes are done as part of this patch:
* Sync global tox, requirements.txt, test-requirements
from release-tools project
* Resolve flake errors
* Fix templates to handle optional ingress relations
* Remove run_tests script
* Restructure unit tests directory
2022-07-27 12:50:27 +05:30

195 lines
7.5 KiB
Python

#!/usr/bin/env python3
# Copyright 2021 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.
import mock
import json
import charm
import ops_sunbeam.test_utils as test_utils
class _KeystoneXenaOperatorCharm(charm.KeystoneXenaOperatorCharm):
def __init__(self, framework):
self.seen_events = []
super().__init__(framework)
def _log_event(self, event):
self.seen_events.append(type(event).__name__)
def configure_charm(self, event):
super().configure_charm(event)
self._log_event(event)
def public_ingress_address(self) -> str:
return '10.0.0.10'
class TestKeystoneOperatorCharm(test_utils.CharmTestCase):
PATCHES = [
'manager'
]
def add_id_relation(self) -> str:
"""Add amqp relation."""
rel_id = self.harness.add_relation("identity-service", "cinder")
self.harness.add_relation_unit(rel_id, "cinder/0")
self.harness.update_relation_data(
rel_id, "cinder/0", {"ingress-address": "10.0.0.13"}
)
interal_url = "http://10.152.183.228:8776"
public_url = "http://10.152.183.228:8776"
self.harness.update_relation_data(
rel_id,
"cinder",
{
"region": "RegionOne",
"service-endpoints": json.dumps(
[
{
"service_name": "cinderv2",
"type": "volumev2",
"description": "Cinder Volume Service v2",
"internal_url": f"{interal_url}/v2/$(tenant_id)s",
"public_url": f"{public_url}/v2/$(tenant_id)s",
"admin_url": f"{interal_url}/v2/$(tenant_id)s"},
{
"service_name": "cinderv3",
"type": "volumev3",
"description": "Cinder Volume Service v3",
"internal_url": f"{interal_url}/v3/$(tenant_id)s",
"public_url": f"{public_url}/v3/$(tenant_id)s",
"admin_url": f"{interal_url}/v3/$(tenant_id)s"}])})
return rel_id
def ks_manager_mock(self):
def _create_mock(p_name, p_id):
_mock = mock.MagicMock()
type(_mock).name = mock.PropertyMock(
return_value=p_name)
type(_mock).id = mock.PropertyMock(
return_value=p_id)
return _mock
service_domain_mock = _create_mock('sdomain_name', 'sdomain_id')
admin_domain_mock = _create_mock('adomain_name', 'adomain_id')
admin_project_mock = _create_mock('aproject_name', 'aproject_id')
service_user_mock = _create_mock('suser_name', 'suser_id')
admin_user_mock = _create_mock('auser_name', 'auser_id')
admin_role_mock = _create_mock('arole_name', 'arole_id')
km_mock = mock.MagicMock()
km_mock.get_domain.return_value = admin_domain_mock
km_mock.get_project.return_value = admin_project_mock
km_mock.get_user.return_value = admin_user_mock
km_mock.create_domain.return_value = service_domain_mock
km_mock.create_user.return_value = service_user_mock
km_mock.create_role.return_value = admin_role_mock
return km_mock
@mock.patch(
'charms.observability_libs.v0.kubernetes_service_patch.'
'KubernetesServicePatch')
def setUp(self, mock_svc_patch):
super().setUp(charm, self.PATCHES)
self.km_mock = self.ks_manager_mock()
self.manager.KeystoneManager.return_value = self.km_mock
self.harness = test_utils.get_harness(
_KeystoneXenaOperatorCharm,
container_calls=self.container_calls)
self.addCleanup(self.harness.cleanup)
self.harness.begin()
def test_pebble_ready_handler(self):
self.assertEqual(self.harness.charm.seen_events, [])
self.harness.container_pebble_ready('keystone')
self.assertEqual(self.harness.charm.seen_events, ['PebbleReadyEvent'])
def test_id_client(self):
test_utils.add_complete_ingress_relation(self.harness)
self.harness.set_leader()
self.harness.add_relation('peers', 'keystone')
self.harness.container_pebble_ready('keystone')
test_utils.add_db_relation_credentials(
self.harness,
test_utils.add_base_db_relation(self.harness))
identity_rel_id = self.add_id_relation()
rel_data = self.harness.get_relation_data(
identity_rel_id,
self.harness.charm.unit.app.name)
self.maxDiff = None
self.assertEqual(
rel_data,
{
'admin-auth-url': 'http://10.0.0.10:35357',
'admin-domain-id': 'adomain_id',
'admin-domain-name': 'adomain_name',
'admin-project-id': 'aproject_id',
'admin-project-name': 'aproject_name',
'admin-user-id': 'auser_id',
'admin-user-name': 'auser_name',
'api-version': 'v3',
'auth-host': '10.0.0.10',
'auth-port': '5000',
'auth-protocol': 'http',
'internal-auth-url': 'http://internal-url',
'internal-host': '10.0.0.10',
'internal-port': '5000',
'internal-protocol': 'http',
'public-auth-url': 'http://public-url',
'service-domain-id': 'sdomain_id',
'service-domain-name': 'sdomain_name',
'service-host': '10.0.0.10',
'service-password': 'password123',
'service-port': '5000',
'service-project-id': 'aproject_id',
'service-project-name': 'aproject_name',
'service-protocol': 'http',
'service-user-id': 'suser_id',
'service-user-name': 'suser_name'})
def test_leader_bootstraps(self):
test_utils.add_complete_ingress_relation(self.harness)
self.harness.set_leader()
rel_id = self.harness.add_relation('peers', 'keystone')
self.harness.add_relation_unit(
rel_id,
'keystone/1')
self.harness.container_pebble_ready('keystone')
test_utils.add_db_relation_credentials(
self.harness,
test_utils.add_base_db_relation(self.harness))
self.km_mock.setup_keystone.assert_called_once_with()
self.km_mock.setup_initial_projects_and_users.assert_called_once_with()
def test_non_leader_no_bootstraps(self):
test_utils.add_complete_ingress_relation(self.harness)
self.harness.set_leader(False)
rel_id = self.harness.add_relation('peers', 'keystone')
self.harness.add_relation_unit(
rel_id,
'keystone/1')
self.harness.container_pebble_ready('keystone')
test_utils.add_db_relation_credentials(
self.harness,
test_utils.add_base_db_relation(self.harness))
self.assertFalse(
self.km_mock.setup_keystone.called)