# -*- coding: utf-8 -*-
'''
Test AnsibleGate State Module
'''
from __future__ import absolute_import, unicode_literals, print_function

# Import python libraries
import os
import shutil
import tempfile
import yaml

# Import salt libraries
import salt.utils.files
import salt.utils.path

# Import testing libraries
from tests.support.case import ModuleCase
from tests.support.helpers import (
    destructiveTest,
    requires_sshd_server,
    requires_system_grains,
    flaky
)
from tests.support.mixins import SaltReturnAssertsMixin
from tests.support.runtests import RUNTIME_VARS
from tests.support.unit import skipIf


@destructiveTest
@requires_sshd_server
@skipIf(not salt.utils.path.which('ansible-playbook'), 'ansible-playbook is not installed')
class AnsiblePlaybooksTestCase(ModuleCase, SaltReturnAssertsMixin):
    '''
    Test ansible.playbooks states
    '''

    @requires_system_grains
    def setUp(self, grains=None):
        if grains.get('os_family') == 'RedHat' and grains.get('osmajorrelease') == 6:
            self.skipTest('This test hangs the test suite on RedHat 6. Skipping for now.')

        priv_file = os.path.join(RUNTIME_VARS.TMP_CONF_DIR, 'key_test')
        data = {
            'all': {
                'hosts': {
                    'localhost': {
                        'ansible_host': '127.0.0.1',
                        'ansible_port': 2827,
                        'ansible_user': RUNTIME_VARS.RUNNING_TESTS_USER,
                        'ansible_ssh_private_key_file': priv_file,
                        'ansible_ssh_extra_args': (
                            '-o StrictHostKeyChecking=false '
                            '-o UserKnownHostsFile=/dev/null '
                        )
                    },
                },
            },
        }
        self.tempdir = tempfile.mkdtemp()
        self.inventory = self.tempdir + 'inventory'
        with salt.utils.files.fopen(self.inventory, 'w') as yaml_file:
            yaml.dump(data, yaml_file, default_flow_style=False)

    def tearDown(self):
        shutil.rmtree(self.tempdir)
        delattr(self, 'tempdir')
        delattr(self, 'inventory')

    @flaky
    def test_ansible_playbook(self):
        ret = self.run_state(
            'ansible.playbooks',
            name='remove.yml',
            git_repo='git://github.com/gtmanfred/playbooks.git',
            ansible_kwargs={'inventory': self.inventory}
        )
        self.assertSaltTrueReturn(ret)
        ret = self.run_state(
            'ansible.playbooks',
            name='install.yml',
            git_repo='git://github.com/gtmanfred/playbooks.git',
            ansible_kwargs={'inventory': self.inventory}
        )
        self.assertSaltTrueReturn(ret)
