Grzegorz Grasza e404fe19a8 Update to new quay.io images
This updates the freeipa-server image to fedora-36 and
molecule images to stream9.

Change-Id: I026207760d917524cee69dddd41448f3bc0245d2
2022-08-03 09:51:26 +02:00

255 lines
8.6 KiB
Python

import ipaddress
import os
import pytest
import testinfra
import testinfra.utils.ansible_runner
inventory = os.environ['MOLECULE_INVENTORY_FILE']
testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
inventory).get_hosts('centos9')
def setup_module(module):
for host in testinfra_hosts:
testinfra.get_host('ansible://' + host,
ansible_inventory=inventory
).check_output('echo password123 | kinit admin')
def teardown_module(module):
for host in testinfra_hosts:
testinfra.get_host('ansible://' + host,
ansible_inventory=inventory
).check_output('kdestroy')
@pytest.mark.parametrize('pkg', [
'ipa-client',
])
def test_pkg(host, pkg):
package = host.package(pkg)
assert package.is_installed
@pytest.mark.parametrize('svc', [
'dbus',
'sssd',
])
def test_svc(host, svc):
service = host.service(svc)
assert service.is_running
assert service.is_enabled
@pytest.mark.parametrize('file, content', [
("/etc/ipa/default.conf", "ipa.example.test"),
("/etc/hosts", "test-0.example.test"),
("/etc/resolv.conf", "10.88.0.22"),
("/etc/novajoin/krb5.keytab", "test-0.example.test"),
])
def test_files(host, file, content):
file = host.file(file)
assert file.exists
assert file.contains(content)
@pytest.mark.parametrize('perm', [
{'name': 'Modify host password', 'right': "write",
'type': "host", 'attrs': "userpassword"},
{'name': 'Write host certificate', 'right': "write",
'type': "host", 'attrs': "usercertificate"},
{'name': 'Modify host userclass', 'right': "write",
'type': "host", 'attrs': "userclass"},
{'name': 'Modify service managedBy attribute', 'right': "write",
'type': "service", 'attrs': "managedby"},
])
def test_permissions(host, perm):
result = host.check_output('ipa permission-find "{name}"'.format(**perm))
assert '1 permission matched' in result
assert 'Granted rights: {right}'.format(**perm) in result
assert 'Type: {type}'.format(**perm) in result
assert 'Effective attributes: {attrs}'.format(**perm) in result
@pytest.mark.parametrize('pri', [
'Nova Host Management',
])
def test_privilages(host, pri):
result = host.check_output('ipa privilege-find "{}"'.format(pri))
assert '1 privilege matched' in result
assert 'Privilege name: {}'.format(pri) in result
assert 'Description: {}'.format(pri) in result
def test_privilege_permissions(host):
pri = 'Nova Host Management'
perms = [
'System: add hosts',
'System: remove hosts',
'Modify host password',
'Modify host userclass',
'System: Modify hosts',
'Modify service managedBy attribute',
'System: Add krbPrincipalName to a Host',
'System: Add Services',
'System: Remove Services',
'Revoke certificate',
'System: manage host keytab',
'System: Manage host certificates',
'System: modify services',
'System: manage service keytab',
'System: read dns entries',
'System: remove dns entries',
'System: add dns entries',
'System: update dns entries',
'Retrieve Certificates from the CA',
]
result = host.check_output('ipa privilege-show "{}"'.format(pri))
assert 'Privilege name: {}'.format(pri) in result
for perm in perms:
assert perm.lower() in result.lower()
def test_role(host):
role = 'Nova Host Manager'
pri = 'Nova Host Management'
result = host.check_output('ipa role-show "{}"'.format(role))
assert 'Role name: {}'.format(role) in result
assert 'Description: {}'.format(role) in result
assert 'Privileges: {}'.format(pri) in result
assert 'Member services: nova/test-0.example.test@EXAMPLE.TEST, nova/dummy.example.test@EXAMPLE.TEST' in result
@pytest.mark.parametrize('name', [
'test-0.example.test',
'test-0.ctlplane.example.test',
'test-0.external.example.test',
'test-0.internalapi.example.test',
'test-0.storage.example.test',
'test-0.storagemgmt.example.test',
])
def test_hosts(host, name):
result = host.check_output('ipa host-find {}'.format(name))
assert '1 host matched' in result
@pytest.mark.parametrize('service, subhost', [
('HTTP', 'ctlplane'),
('HTTP', 'external'),
('HTTP', 'internalapi'),
('HTTP', 'storage'),
('HTTP', 'storagemgmt'),
('haproxy', 'ctlplane'),
('haproxy', 'internalapi'),
('haproxy', 'storage'),
('haproxy', 'storagemgmt'),
('libvirt-vnc', 'internalapi'),
('mysql', 'internalapi'),
('neutron_ovn', 'internalapi'),
('novnc-proxy', 'internalapi'),
('ovn_controller', 'internalapi'),
('ovn_dbs', 'internalapi'),
('rabbitmq', 'internalapi'),
('redis', 'internalapi'),
])
def test_services(host, service, subhost):
result = host.check_output(
'ipa service-show {}/test-0.{}.example.test@EXAMPLE.TEST'.format(
service, subhost))
assert 'Principal name: {}/test-0.{}.example.test@EXAMPLE.TEST'.format(
service, subhost) in result
assert 'Principal alias: {}/test-0.{}.example.test@EXAMPLE.TEST'.format(
service, subhost) in result
'Roles: Nova Host Manager' in result
assert 'Managed by: test-0.{}.example.test, test-0.example.test'.format(
subhost) in result
@pytest.mark.parametrize('ip, name', [
('2001:0db8:85a3:0000:0000:8a2e:0370:7333', 'foo'),
('2001:0db8:85a3:0000:0000:8a2e:0370:7333', 'bar'),
('192.168.24.111', 'bar'),
('192.168.24.1', 'undercloud.ctlplane'),
('192.168.24.115', 'overcloud.ctlplane'),
('10.0.0.135', 'overcloud'),
('172.17.0.15', 'overcloud.internalapi'),
('172.18.0.231', 'overcloud.storage'),
('172.19.0.164', 'overcloud.storagemgmt'),
('172.17.0.46', 'overcloud-controller-0'),
('10.0.0.116', 'overcloud-controller-0.external'),
('172.17.0.46', 'overcloud-controller-0.internalapi'),
('172.18.0.185', 'overcloud-controller-0.storage'),
('172.19.0.107', 'overcloud-controller-0.storagemgmt'),
('172.16.0.72', 'overcloud-controller-0.tenant'),
('192.168.24.122', 'overcloud-controller-0.ctlplane'),
('172.17.0.110', 'overcloud-novacompute-0'),
('172.17.0.110', 'overcloud-novacompute-0.internalapi'),
('172.18.0.243', 'overcloud-novacompute-0.storage'),
('172.16.0.195', 'overcloud-novacompute-0.tenant'),
('192.168.24.128', 'overcloud-novacompute-0.ctlplane')])
def test_dns(host, ip, name):
name += '.ooo.test'
record_name, zone_name = name.split('.', 1)
result = host.check_output(
'ipa dnsrecord-find {} --name={}'.format(
zone_name, record_name))
assert 'record: {}'.format(ip) in result
@pytest.mark.parametrize('ip, name', [
('192.168.24.10', '.baz'),
('192.168.24.11', 'baz.different.domain'),
])
def test_dns_absent(host, ip, name):
record_name, zone_name = name.split('.', 1)
host.run_expect(
[1, 2], 'ipa dnsrecord-find {} --name={}'.format(
zone_name, record_name))
@pytest.mark.parametrize('ip, name', [
('2001:0db8:85a3:0000:0000:8a2e:0370:7334', 'foo'),
('2001:0db8:85a3:0000:0000:8a2e:0370:7333', 'bar'),
('192.168.24.111', 'bar'),
('192.168.24.1', 'undercloud.ctlplane'),
('192.168.24.115', 'overcloud.ctlplane'),
('10.0.0.135', 'overcloud'),
('172.17.0.15', 'overcloud.internalapi'),
('172.18.0.231', 'overcloud.storage'),
('172.19.0.164', 'overcloud.storagemgmt'),
('172.17.0.46', 'overcloud-controller-0'),
('10.0.0.116', 'overcloud-controller-0.external'),
('172.17.0.46', 'overcloud-controller-0.internalapi'),
('172.18.0.185', 'overcloud-controller-0.storage'),
('172.19.0.107', 'overcloud-controller-0.storagemgmt'),
('172.16.0.72', 'overcloud-controller-0.tenant'),
('192.168.24.122', 'overcloud-controller-0.ctlplane'),
('172.17.0.110', 'overcloud-novacompute-0'),
('172.17.0.110', 'overcloud-novacompute-0.internalapi'),
('172.18.0.243', 'overcloud-novacompute-0.storage'),
('172.16.0.195', 'overcloud-novacompute-0.tenant'),
('192.168.24.128', 'overcloud-novacompute-0.ctlplane')])
def test_reverse_dns(host, ip, name):
reverse = ipaddress.ip_address(ip).reverse_pointer
record, zone = reverse.split('.', 1)
result = host.check_output(
'ipa dnsrecord-find {} --name={}'.format(
zone, record))
assert 'record: {}'.format(name) in result
@pytest.mark.parametrize('ip, name', [
('192.168.24.10', '.baz'),
('192.168.24.11', 'baz.different.domain'),
])
def test_reverse_dns_absent(host, ip, name):
reverse = ipaddress.ip_address(ip).reverse_pointer
record, zone = reverse.split('.', 1)
host.run_expect(
[1, 2], 'ipa dnsrecord-find {} --name={}'.format(
zone, record))