Files @ 35140b3eb5b8
Branch filter:

Location: majic-ansible-roles/roles/backup_client/molecule/default/tests/test_default.py

branko
MAR-198: Implement removal of expired backups via backup_client role:

- In addition to expired backup removals, ensure that the backup
does not proceed if previous execution step has failed. This means
that pre-scripts now have to run without errors for the main backup
to kick-in.
- Could not use full _and_ chaining of duply. For example, if we have
A_and_B_and_C (where A/B/C are duply backup commands), if A
fails, B will be skipped, but C will still run because B has ran
without_errors.
import os

import testinfra.utils.ansible_runner


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


def test_installed_packages(host):
    """
    Tests if the necessary packages are installed.
    """

    expected_package_name = "python3-pexpect"

    assert host.package(expected_package_name).is_installed
    assert host.package('duply').is_installed
    assert host.package('duplicity').is_installed


def test_duply_directories(host):
    """
    Tests if Duply directories have been set-up correctly.
    """

    with host.sudo():

        for directory_path in ["/etc/duply",
                               "/etc/duply/main",
                               "/etc/duply/main/patterns",
                               "/etc/duply/main/gnupg",
                               "/etc/duply/main/ssh",
                               "/var/cache/duply",
                               "/var/cache/duply/main"]:
            directory = host.file(directory_path)

            assert directory.is_directory
            assert directory.user == 'root'
            assert directory.group == 'root'
            assert directory.mode == 0o700


def test_gnupg_private_keys_file(host):
    """
    Tests if file containing GnuPG private keys has been created and has correct
    permissions.
    """

    with host.sudo():

        gnupg_private_keys = host.file('/etc/duply/main/private_keys.asc')

        assert gnupg_private_keys.is_file
        assert gnupg_private_keys.user == 'root'
        assert gnupg_private_keys.group == 'root'
        assert gnupg_private_keys.mode == 0o600


def test_gnupg_public_keys_file(host):
    """
    Tests if file containing additional GnuPG public keys used for encryption
    has been created and has correct permissions.
    """

    with host.sudo():

        gnupg_public_keys = host.file('/etc/duply/main/public_keys.asc')

        assert gnupg_public_keys.is_file
        assert gnupg_public_keys.user == 'root'
        assert gnupg_public_keys.group == 'root'
        assert gnupg_public_keys.mode == 0o600


def test_private_ssh_key_file(host):
    """
    Tests if the file containing client SSH key used for logging-in into the
    backup server has been deployed and has correct permissions.
    """

    with host.sudo():

        ssh_key = host.file('/etc/duply/main/ssh/identity')

        assert ssh_key.is_file
        assert ssh_key.user == 'root'
        assert ssh_key.group == 'root'
        assert ssh_key.mode == 0o600


def test_known_hosts(host):
    """
    Tests if the Duply known_hosts file has been deployed and has correct
    permissions.
    """

    with host.sudo():

        known_hosts = host.file('/etc/duply/main/ssh/known_hosts')

        assert known_hosts.is_file
        assert known_hosts.user == 'root'
        assert known_hosts.group == 'root'
        assert known_hosts.mode == 0o600


def test_duply_configuration(host):
    """
    Tests if Duply configuraiton file has been deployed and has correct file
    permissions.
    """

    with host.sudo():

        duply_configuration = host.file('/etc/duply/main/conf')

        assert duply_configuration.is_file
        assert duply_configuration.user == 'root'
        assert duply_configuration.group == 'root'
        assert duply_configuration.mode == 0o600


def test_exclude_file(host):

    with host.sudo():

        exclude = host.file('/etc/duply/main/exclude')

        assert exclude.is_file
        assert exclude.user == 'root'
        assert exclude.group == 'root'
        assert exclude.mode == 0o600
        assert exclude.content_string == "- **"


def test_pre_backup_script_directory(host):

    with host.sudo():

        pre_backup_dir = host.file('/etc/duply/main/pre.d')

        assert pre_backup_dir.is_directory
        assert pre_backup_dir.user == 'root'
        assert pre_backup_dir.group == 'root'
        assert pre_backup_dir.mode == 0o700


def test_pre_backup_script(host):
    """
    Tests if the script used for running pre-backup handles has been deployed
    and has correct permissions.x
    """

    with host.sudo():

        pre_backup_script = host.file('/etc/duply/main/pre')

        assert pre_backup_script.is_file
        assert pre_backup_script.user == 'root'
        assert pre_backup_script.group == 'root'
        assert pre_backup_script.mode == 0o700


def test_cron_entry(host):
    """
    Tests if cron job has been correctly set-up for running backups.
    """

    cron = host.file('/etc/cron.d/backup')

    assert cron.is_file
    assert cron.user == 'root'
    assert cron.group == 'root'
    assert cron.mode == 0o644
    assert cron.content_string == "#Ansible: backup\n0 2 * * * root /usr/bin/duply main pre_and_bkp && /usr/bin/duply main post_and_purge --force\n"


def test_duply_include_file(host):
    """
    Tests include file existence and permissions.
    """

    with host.sudo():

        include = host.file('/etc/duply/main/include')

        assert include.is_file
        assert include.user == 'root'
        assert include.group == 'root'
        assert include.mode == 0o600


def test_backup_and_restore(host):
    """
    Tests a simple backup and restore to a directory. Includes tests for
    checking if the pre-backup handles are run correctly.
    """

    with host.sudo():

        # Remove this file so we can be sure the pre-backup script has been run.
        host.ansible("file", "path=/var/lib/pre-backup-test state=absent")

        backup_run = host.run('duply main pre_and_bkp')

        assert backup_run.rc == 0
        assert host.file('/var/lib/pre-backup-test').is_file

        # Remove restore directory in order to make sure restore has worked
        # correctly.
        host.ansible("file", "path=/root/restore state=absent")

        restore_run = host.run('duply main restore /root/restore')
        assert restore_run.rc == 0
        assert host.file('/root/restore').is_directory