Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CI: add more tests #13

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions molecule/custom-all/molecule.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
---
dependency:
name: galaxy
driver:
name: docker
lint:
name: yamllint
platforms:
- name: instance
image: "geerlingguy/docker-${MOLECULE_DISTRO:-centos7}-ansible:latest"
command: ${MOLECULE_DOCKER_COMMAND:-""}
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:ro
privileged: true
pre_build_image: true
provisioner:
name: ansible
lint:
name: ansible-lint
verifier:
name: testinfra
lint:
name: flake8
34 changes: 34 additions & 0 deletions molecule/custom-all/playbook.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
---
- name: Converge
hosts: all
vars:
- theo_url: https://theo.example.com
- theo_client_token: zdOPNza4jjtceH5F2rU0iOkIJ2xlV4hGUauKT4cNe8HAp+AMnzYEzSc0EIBGM+MJuqL7gLd6bwIP
- theo_agent_path: /usr/local/bin/theo
- theo_agent_user: theo
- theo_agent_cache_dir: /var/cache/theo
- theo_agent_config_dir: /var/lib/theo
- theo_agent_config_path: /var/lib/theo/theo.yml
- theo_agent_verify_signature: true
- theo_agent_public_key: |
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwVhHEBTVqEpBOpguARtg
//WyDBEoCT2F2OjnHB6fxJ9oopYJZB2Y4jj5cxo1O41r65XmMRT4lqeHWS6Iovde
kzlJ0bH91gl7/iNziUMN4ONiIR0SU3PiBGQ0XKq6rUxpsOhe+tFPfBQYhkkAiQeG
WC1GYQynYjZ/MTEDIPnd5YjSl0agzm7BMRujEcjWyYqEBuZjtDqP6AICz8nkFo9i
CWBONYbCujDl+1sei3WUfeGcUdGiPNwQGU/TW4sfcRWQzayw3XQEl3ERNRMihVsb
in2529O4+JMKdKn22mzTmWsraP/ZakVeti0VtpGZEe1YSTW8+SCz7DnTadnuUZAO
5JFVTmFcbF7/d/H0atKVVAeTC5nqYNeDrW4jtIQalUZeaHrBkWK7i/yxDYFlC2AW
ZEu4IQZtGfNJCaZFuYSiN96yzlnMWRp1nUGaBxoax4K8rBwX8EWxT4EAyN1mtan0
ZQITjiZTqDvnhr8iSIvn9hy3942GYi3upOsBeqfb90vzS7BAmoplyWPS0D+UWweB
+sjv96Gtb4BFpc96qwptLCnVFFOVlq0bq0u1FN6sZ4RApl2IaSJV9JGsJjeeJowh
GCK9sSDVI5XY3wy6UYMo9SZQGIglyRPrnd3R82O277lAyOVC/NNp1vq5WH/Mi1Mu
JK85kX7Atut+tgWgwuwT5vcCAwEAAQ==
-----END PUBLIC KEY-----
pre_tasks:
- name: Import common tasks
import_tasks: ../resources/playbooks/pre-tasks.yml


roles:
- role: ansible-theo-agent
108 changes: 108 additions & 0 deletions molecule/custom-all/tests/test_default.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
import os

import testinfra.utils.ansible_runner

testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('all')


def test_theo_binary_file(host):
f = host.file('/usr/local/bin/theo')
assert f.exists
assert f.is_file
assert f.user == 'root'
assert f.group == 'root'
print("{} vs {}".format(f.mode, oct(f.mode)))
assert oct(f.mode) == '0o755'


def test_theo_cache_dir(host):
f = host.file('/var/cache/theo')
assert f.exists
assert f.is_directory
assert f.user == 'theo'
assert f.group == 'root'


def test_theo_config_file(host):
f = host.file('/var/lib/theo/theo.yml')
assert f.exists
assert f.is_file
assert f.user == 'root'
assert f.group == 'root'
conf = f.content
'''
url: https://theo.example.com
token: \
zdOPNza4jjtceH5F2rU0iOkIJ2xlV4hGUauKT4cNe8HAp+AMnzYEzSc0EIBGM+MJuqL7gLd6bwIP
cachedir: /var/cache/theo
verify: True
public_key: /var/lib/theo/public.pem
'''
expected = [
b'url: https://theo.example.com',
b'token: zdOPNza4jjtceH5F2rU0iOkIJ2xlV4hGUauKT4cNe8HAp'
b'+AMnzYEzSc0EIBGM+MJuqL7gLd6bwIP',
b'cachedir: /var/cache/theo',
b'verify: True',
b'public_key: /var/lib/theo/public.pem'
]
for line in expected:
assert line in conf


def test_theo_public_key_file(host):
f = host.file('/var/lib/theo/public.pem')
assert f.exists
assert f.is_file
assert f.user == 'root'
assert f.group == 'root'


def test_sshd_config(host):
distro = os.getenv('MOLECULE_DISTRO', 'centos7')
if distro == 'debian8':
expected = get_sshd_config_pre_v69()
elif distro == 'ubuntu1404':
expected = get_sshd_config_pre_v69()
else:
expected = get_sshd_config_v69()
f = host.file('/etc/ssh/sshd_config')
config = f.content
configlines = []
for line in config.splitlines():
if not line.startswith(b'#'):
configlines.append(line)
'''
I don't want to use something like:
assert set(expected).issubset(configlines)
Because there's no detail of the missing line(s)
'''
errors = []
for line in expected:
if line not in configlines:
errors.append(line)

if len(errors):
print('Failed test_sshd_config, missing line(s)')
for error in errors:
print(error)
assert False


def get_sshd_config_pre_v69():
return [
b'AuthorizedKeysCommandUser theo',
b'AuthorizedKeysCommand /usr/local/bin/theo '
b'-config-file /var/lib/theo/theo.yml %u',
b'AuthorizedKeysFile /var/cache/theo/%u'
]


def get_sshd_config_v69():
return [
b'AuthorizedKeysCommandUser theo',
b'AuthorizedKeysCommand /usr/local/bin/theo '
b'-config-file /var/lib/theo/theo.yml -fingerprint %f %u',
b'AuthorizedKeysFile /var/cache/theo/%u'
]
4 changes: 2 additions & 2 deletions runMolecule.sh
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/usr/bin/env bash

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suggest to add some short description of the purpose of the file and how to use it in 'must succes' and 'must fail scenarios'.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice suggestion, added

SCENARIOS="default signature custom-bin-file custom-config-file custom-config-dir"
SCENARIOS="default signature custom-bin-file custom-config-file custom-config-dir custom-all"

MUST_FAIL="centos6:custom-config-file centos6:custom-config-dir"
MUST_FAIL="centos6:custom-config-file centos6:custom-config-dir centos6:custom-all"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I get the feeling there is too much of must fail scenarios. Anyway to fix this to actually make it pass, without getting isane ;-) ?
Or maybe just drop centos6.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The point is to be sure that the role correctly fails in that cases so none will be unable to login. So I think it safer to keep it as it is

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess @nvtkaszpir is more or less about touching the point we have been struggling with lately. Regardless how many "must fail" scenarios we want to maintain, we didn't find a sane way to cleanly test a "must fail scenario" within the molecule test framework. I mean, how to write a test that's successful when Ansible complains in applying the role to a specific (incompatible) scenario with a given error message? It would have been nice if Ansible had a builtin mechanism to early fail based on some distro compatibility metadata, but I'm not aware of any. I'm also very concerned about long term maintenance of this runMolecule.sh. As @macno pointed out, trying to forcefully apply the role to well known "must fail" scenarios could render the system unaccessible. Then we need to be extra safe here. Suggestions for a better approach here are hugely appreciated!


function has_right_to_fail {
for i in ${MUST_FAIL}; do
Expand Down