Files
zaza-openstack-tests/zaza/openstack/charm_tests/kerberos/setup.py
Camille Rodriguez 3f8a09605e Add functional tests for charm-keystone-kerberos (#206)
* kerberos authentication tests

* kerberos authentication setup and test

* kerberos authentication setup and test

* kerberos authentication setup and test

* pep8 corrections

* pep8 corrections

* remove hardcoded code

* add logging

* fix keytab location

* add logging

* add logging and custom exception for kerberos test server errors

* syntax list

* adding empty keytab in setup

* pep8

* Kerberos custom exception

* date

* fix creation of empty file

* logging

* wait until workload is active

* wait until workload is active

* Edit tests for optimal configuration and logging

* remove empty lines

* add logging to tests

* add logging to tests, import subprocess

* tests.py need setup.py get_unit_full_hostname function

* token retrieval test

* add dns to test host as well as keystone

* test keystone token

* user needs to be the one created in the kerberos system (i.e admin)

* openstack token issue to confirm authentication

* openstack token issue to confirm authentication

* pep8

* cmd has to be formatted differently for subprocess call

* fix error

* piping password to the kinit prompt

* add a verification for the cached kerberos token file

* add a verification for the cached kerberos token file

* must wait for subprocess to go through to check result

* change config to run the kerberos client tests on a ubuntu vm

* change config to run the kerberos client tests on a ubuntu vm

* change config to run the kerberos client tests on a ubuntu vm

* install krb5-client on ubuntu test host

* install krb5-client on ubuntu test host

* retrieve openstack token

* stderr is a dict

* adding python-pip and keystoneauth1[kerberos]

* adding python-pip and keystoneauth1[kerberos]

* adding python-pip and keystoneauth1[kerberos]

* add other mandatory packages to test host

* pep8

* unused exception, removing

* revert change

* rename run_all_tests for run_all_configuration_tests

* install the python3 packages
2020-03-30 16:36:50 -05:00

229 lines
9.2 KiB
Python

# Copyright 2020 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.
"""Setup for keystone-kerberos tests."""
import logging
import tempfile
import zaza.model
from zaza.openstack.utilities import openstack as openstack_utils
from zaza.openstack.charm_tests.kerberos import KerberosConfigurationError
def get_unit_full_hostname(unit_name):
"""Retrieve the full hostname of a unit."""
for unit in zaza.model.get_units(unit_name):
result = zaza.model.run_on_unit(unit.entity_id, 'hostname -f')
hostname = result['Stdout'].rstrip()
return hostname
def add_empty_resource_file_to_keystone_kerberos():
"""Add an empty resource to keystone kerberos to complete the setup."""
logging.info('Attaching an empty keystone keytab to the keystone-kerberos'
' unit')
tmp_file = '/tmp/empty.keytab'
with open(tmp_file, 'w'):
pass
zaza.model.attach_resource('keystone-kerberos',
'keystone_keytab',
tmp_file)
logging.info('Waiting for keystone-kerberos unit to be active and idle')
unit_name = zaza.model.get_units('keystone-kerberos')[0].name
zaza.model.block_until_unit_wl_status(unit_name, "active")
zaza.model.block_until_all_units_idle()
def add_dns_entry(kerberos_hostname="kerberos.testubuntu.com"):
"""Add a dns entry in /etc/hosts for the kerberos test server.
:param kerberos_hostname: FQDN of Kerberos server
:type kerberos_hostname: string
"""
logging.info('Retrieving kerberos IP and hostname')
kerberos_ip = zaza.model.get_app_ips("kerberos-server")[0]
cmd = "sudo sed -i '/localhost/i\\{}\t{}' /etc/hosts"\
.format(kerberos_ip, kerberos_hostname)
app_names = ['keystone', 'ubuntu-test-host']
for app_name in app_names:
logging.info('Adding dns entry to the {} unit'.format(app_name))
zaza_unit = zaza.model.get_units(app_name)[0]
zaza.model.run_on_unit(zaza_unit.entity_id, cmd)
def configure_keystone_service_in_kerberos():
"""Configure the keystone service in Kerberos.
A principal needs to be added to the kerberos server to get a keytab for
this service. The keytab is used for the authentication of the keystone
service.
"""
logging.info('Configure keystone service in Kerberos')
unit = zaza.model.get_units('kerberos-server')[0]
keystone_hostname = get_unit_full_hostname('keystone')
commands = ['sudo kadmin.local -q "addprinc -randkey -clearpolicy '
'HTTP/{}"'.format(keystone_hostname),
'sudo kadmin.local -q "ktadd '
'-k /home/ubuntu/keystone.keytab '
'HTTP/{}"'.format(keystone_hostname),
'sudo chmod 777 /home/ubuntu/keystone.keytab']
try:
for command in commands:
logging.info(
'Sending command to the kerberos-server: {}'.format(command))
result = zaza.model.run_on_unit(unit.name, command)
if result['Stderr']:
raise KerberosConfigurationError
elif result['Stdout']:
logging.info('Stdout: {}'.format(result['Stdout']))
except KerberosConfigurationError:
logging.error('An error occured : {}'.format(result['Stderr']))
def retrieve_and_attach_keytab():
"""Retrieve and attach the keytab to the keystone-kerberos unit."""
kerberos_server = zaza.model.get_units('kerberos-server')[0]
dump_file = "keystone.keytab"
remote_file = "/home/ubuntu/keystone.keytab"
with tempfile.TemporaryDirectory() as tmpdirname:
tmp_file = "{}/{}".format(tmpdirname, dump_file)
logging.info('Retrieving keystone.keytab from the kerberos server.')
zaza.model.scp_from_unit(
kerberos_server.name,
remote_file,
tmp_file)
logging.info('Attaching the keystone_keytab resource to '
'keystone-kerberos')
zaza.model.attach_resource('keystone-kerberos',
'keystone_keytab',
tmp_file)
def openstack_setup_kerberos():
"""Create a test domain, project, and user for kerberos tests."""
kerberos_domain = 'k8s'
kerberos_project = 'k8s'
kerberos_user = 'admin'
kerberos_password = 'password123'
role = 'admin'
logging.info('Retrieving a keystone session and client.')
keystone_session = openstack_utils.get_overcloud_keystone_session()
keystone_client = openstack_utils.get_keystone_session_client(
keystone_session)
logging.info('Creating domain, project and user for Kerberos tests.')
domain = keystone_client.domains.create(kerberos_domain,
description='Kerberos Domain',
enabled=True)
project = keystone_client.projects.create(kerberos_project,
domain,
description='Test project',
enabled=True)
demo_user = keystone_client.users.create(kerberos_user,
domain=domain,
project=project,
password=kerberos_password,
email='demo@demo.com',
description='Demo User',
enabled=True)
admin_role = keystone_client.roles.find(name=role)
keystone_client.roles.grant(
admin_role,
user=demo_user,
project_domain=domain,
project=project
)
keystone_client.roles.grant(
admin_role,
user=demo_user,
domain=domain
)
def setup_kerberos_configuration_for_test_host():
"""Retrieve the keytab and krb5.conf to setup the ubuntu test host."""
kerberos_server = zaza.model.get_units('kerberos-server')[0]
ubuntu_test_host = zaza.model.get_units('ubuntu-test-host')[0]
dump_file = "krb5.keytab"
remote_file = "/etc/krb5.keytab"
host_keytab_path = '/home/ubuntu/krb5.keytab'
with tempfile.TemporaryDirectory() as tmpdirname:
tmp_file = "{}/{}".format(tmpdirname, dump_file)
logging.info("Retrieving {} from {}.".format(remote_file,
kerberos_server.name))
zaza.model.scp_from_unit(
kerberos_server.name,
remote_file,
tmp_file)
logging.info("SCP {} to {} on {}.".format(tmp_file,
host_keytab_path,
ubuntu_test_host.name))
zaza.model.scp_to_unit(
ubuntu_test_host.name,
tmp_file,
host_keytab_path)
dump_file = "krb5.conf"
remote_file = "/etc/krb5.conf"
temp_krb5_path = "/home/ubuntu/krb5.conf"
with tempfile.TemporaryDirectory() as tmpdirname:
tmp_file = "{}/{}".format(tmpdirname, dump_file)
logging.info("Retrieving {} from {}".format(remote_file,
kerberos_server.name))
zaza.model.scp_from_unit(
kerberos_server.name,
remote_file,
tmp_file)
logging.info("SCP {} to {} on {}.".format(tmp_file,
temp_krb5_path,
ubuntu_test_host))
zaza.model.scp_to_unit(
ubuntu_test_host.name,
tmp_file,
temp_krb5_path)
logging.info('Moving {} to {} on {}.'.format(temp_krb5_path,
remote_file, ubuntu_test_host.name))
zaza.model.run_on_unit(ubuntu_test_host.name, ('sudo mv {} {}'.
format(temp_krb5_path, remote_file)))
def install_apt_packages_on_ubuntu_test_host():
"""Install apt packages on a zaza unit."""
ubuntu_test_host = zaza.model.get_units('ubuntu-test-host')[0]
packages = ['krb5-user', 'python3-openstackclient',
'python3-requests-kerberos']
for package in packages:
logging.info('Installing {}'.format(package))
result = zaza.model.run_on_unit(ubuntu_test_host.name,
"apt install {} -y".format(package))
assert result['Code'] == '0', result['Stderr']
def run_all_configuration_steps():
"""Execute all the necessary functions for the tests setup."""
add_empty_resource_file_to_keystone_kerberos()
add_dns_entry()
configure_keystone_service_in_kerberos()
retrieve_and_attach_keytab()
openstack_setup_kerberos()
setup_kerberos_configuration_for_test_host()
install_apt_packages_on_ubuntu_test_host()