mirror of
https://github.com/saltstack/salt.git
synced 2025-04-16 09:40:20 +00:00
add first kitchen test
This commit is contained in:
parent
662d8bd68c
commit
7410ffd92a
18 changed files with 634 additions and 3 deletions
|
@ -12,10 +12,14 @@ provisioner:
|
||||||
name: salt_solo
|
name: salt_solo
|
||||||
salt_install: pip
|
salt_install: pip
|
||||||
pip_pkg: <%= ENV['SALT_SDIST_PATH'] || 'salt' %>
|
pip_pkg: <%= ENV['SALT_SDIST_PATH'] || 'salt' %>
|
||||||
|
pip_index_url: https://pypi.c7.saltstack.net/simple
|
||||||
|
pip_extra_index_url:
|
||||||
|
- https://pypi.python.org/simple
|
||||||
require_chef: false
|
require_chef: false
|
||||||
formula: states
|
formula: states
|
||||||
<% if File.exists?('dependencies.yml') %>
|
log_level: debug
|
||||||
<% File.read('dependencies.yml').split(/\n/).each do |line| %>
|
<% if File.exists?('provisioner.yml') %>
|
||||||
|
<% File.read('provisioner.yml').split(/\n/).each do |line| %>
|
||||||
<%= line %>
|
<%= line %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
@ -50,12 +54,17 @@ platforms:
|
||||||
run_command: /usr/lib/systemd/systemd
|
run_command: /usr/lib/systemd/systemd
|
||||||
provision_command:
|
provision_command:
|
||||||
- systemctl enable sshd.service
|
- systemctl enable sshd.service
|
||||||
|
- zypper install -y python-pip python-devel gcc git gcc-c++
|
||||||
- name: ubuntu
|
- name: ubuntu
|
||||||
driver_config:
|
driver_config:
|
||||||
run_command: /lib/systemd/systemd
|
run_command: /lib/systemd/systemd
|
||||||
|
provision_command:
|
||||||
|
- DEBIAN_FRONTEND=noninteractive apt-get install -y python-pip python-dev gcc git
|
||||||
- name: debian
|
- name: debian
|
||||||
driver_config:
|
driver_config:
|
||||||
run_command: /lib/systemd/systemd
|
run_command: /lib/systemd/systemd
|
||||||
|
provision_command:
|
||||||
|
- DEBIAN_FRONTEND=noninteractive apt-get install -y python-pip python-dev gcc git
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<% if File.exists?('suites.yml') %>
|
<% if File.exists?('suites.yml') %>
|
||||||
|
@ -71,5 +80,5 @@ suites:
|
||||||
verifier:
|
verifier:
|
||||||
name: shell
|
name: shell
|
||||||
remote_exec: false
|
remote_exec: false
|
||||||
command: pytest --junitxml= -v tests/integration/$KITCHEN_SUITE
|
command: pytest -v tests/integration/$KITCHEN_SUITE
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
1
tests/kitchen/__init__.py
Normal file
1
tests/kitchen/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
75
tests/kitchen/test_kitchen.py
Normal file
75
tests/kitchen/test_kitchen.py
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
import os
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from tests.support.unit import TestCase, skipIf
|
||||||
|
import setup
|
||||||
|
|
||||||
|
import salt.utils.path
|
||||||
|
from salt.modules import cmdmod as cmd
|
||||||
|
|
||||||
|
CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
@skipIf(not salt.utils.path.which('bundle'), 'Bundler is not installed')
|
||||||
|
class KitchenTestCase(TestCase):
|
||||||
|
'''
|
||||||
|
Test kitchen environments
|
||||||
|
'''
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
'''
|
||||||
|
setup kitchen tests
|
||||||
|
'''
|
||||||
|
cls.topdir = '/' + os.path.join(*CURRENT_DIR.split('/')[:-2])
|
||||||
|
cls.use_vt = int(os.environ.get('TESTS_LOG_LEVEL')) >= 3
|
||||||
|
cmd.run('python setup.py sdist', cwd=cls.topdir)
|
||||||
|
cmd.run('bundle install', cwd=CURRENT_DIR)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def tearDownClass(cls):
|
||||||
|
del cls.topdir
|
||||||
|
|
||||||
|
|
||||||
|
def func_builder(testdir):
|
||||||
|
def func(self):
|
||||||
|
env = {
|
||||||
|
'KITCHEN_YAML': os.path.join(CURRENT_DIR, '.kitchen.yml'),
|
||||||
|
'SALT_SDIST_PATH': os.path.join(self.topdir, 'dist', 'salt-{0}.tar.gz'.format(setup.__version__)),
|
||||||
|
}
|
||||||
|
if 'TESTS_XML_OUTPUT_DIR' in os.environ:
|
||||||
|
env['PYTEST_ADDOPTS'] = '--junit-xml {0}/kitchen.tests.{1}.xml'.format(
|
||||||
|
os.environ.get('TESTS_XML_OUTPUT_DIR'),
|
||||||
|
testdir,
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
cmd.retcode(
|
||||||
|
'bundle exec kitchen create -c 4 all',
|
||||||
|
cwd=os.path.join(CURRENT_DIR, 'tests', testdir),
|
||||||
|
env=env,
|
||||||
|
use_vt=self.use_vt,
|
||||||
|
),
|
||||||
|
0
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
cmd.retcode(
|
||||||
|
'bundle exec kitchen verify all',
|
||||||
|
cwd=os.path.join(CURRENT_DIR, 'tests', testdir),
|
||||||
|
env=env,
|
||||||
|
use_vt=self.use_vt,
|
||||||
|
),
|
||||||
|
0
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
cmd.retcode(
|
||||||
|
'bundle exec kitchen destroy all',
|
||||||
|
cwd=os.path.join(CURRENT_DIR, 'tests', testdir),
|
||||||
|
env=env,
|
||||||
|
use_vt=self.use_vt,
|
||||||
|
),
|
||||||
|
0
|
||||||
|
)
|
||||||
|
return func
|
||||||
|
|
||||||
|
for testdir in os.listdir(os.path.join(CURRENT_DIR, 'tests')):
|
||||||
|
setattr(KitchenTestCase, 'test_kitchen_{0}'.format(testdir), func_builder(testdir))
|
107
tests/kitchen/tests/wordpress/_modules/wordpress.py
Normal file
107
tests/kitchen/tests/wordpress/_modules/wordpress.py
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
'''
|
||||||
|
Manage wordpress plugins
|
||||||
|
'''
|
||||||
|
import re
|
||||||
|
import pprint
|
||||||
|
import collections
|
||||||
|
|
||||||
|
import salt.utils
|
||||||
|
|
||||||
|
Plugin = collections.namedtuple('Plugin', 'name status update versino')
|
||||||
|
|
||||||
|
|
||||||
|
def __virtual__():
|
||||||
|
if salt.utils.which('wp'):
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def _get_plugins(stuff):
|
||||||
|
return Plugin(stuff)
|
||||||
|
|
||||||
|
def list_plugins(path, user):
|
||||||
|
"""
|
||||||
|
Check if plugin is activated in path
|
||||||
|
"""
|
||||||
|
ret = []
|
||||||
|
resp = __salt__['cmd.shell']((
|
||||||
|
'wp --path={0} plugin list'
|
||||||
|
).format(path), runas=user)
|
||||||
|
for line in resp.split('\n')[1:]:
|
||||||
|
ret.append(line.split('\t'))
|
||||||
|
return [plugin.__dict__ for plugin in map(_get_plugins, ret)]
|
||||||
|
|
||||||
|
|
||||||
|
def show_plugin(name, path, user):
|
||||||
|
ret = {'name': name}
|
||||||
|
resp = __salt__['cmd.shell']((
|
||||||
|
'wp --path={0} plugin status {1}'
|
||||||
|
).format(path, name), runas=user).split('\n')
|
||||||
|
for line in resp:
|
||||||
|
if 'Status' in line:
|
||||||
|
ret['status'] = line.split(' ')[-1].lower()
|
||||||
|
elif 'Version' in line:
|
||||||
|
ret['version'] = line.split(' ')[-1].lower()
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
def activate(name, path, user):
|
||||||
|
check = show_plugin(name, path, user)
|
||||||
|
if check['status'] == 'active':
|
||||||
|
# already active
|
||||||
|
return None
|
||||||
|
resp = __salt__['cmd.shell']((
|
||||||
|
'wp --path={0} plugin activate {1}'
|
||||||
|
).format(path, name), runas=user)
|
||||||
|
if 'Success' in resp:
|
||||||
|
return True
|
||||||
|
elif show_plugin(name, path, user)['status'] == 'active':
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def deactivate(name, path, user):
|
||||||
|
check = show_plugin(name, path, user)
|
||||||
|
if check['status'] == 'inactive':
|
||||||
|
# already inactive
|
||||||
|
return None
|
||||||
|
resp = __salt__['cmd.shell']((
|
||||||
|
'wp --path={0} plugin deactivate {1}'
|
||||||
|
).format(path, name), runas=user)
|
||||||
|
if 'Success' in resp:
|
||||||
|
return True
|
||||||
|
elif show_plugin(name, path, user)['status'] == 'inactive':
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def is_installed(path, user=None):
|
||||||
|
retcode = __salt__['cmd.retcode']((
|
||||||
|
'wp --path={0} core is-installed'
|
||||||
|
).format(path), runas=user)
|
||||||
|
if retcode == 0:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def install(path, user, admin_user, admin_password, admin_email, title, url):
|
||||||
|
retcode = __salt__['cmd.retcode']((
|
||||||
|
'wp --path={0} core install '
|
||||||
|
'--title="{1}" '
|
||||||
|
'--admin_user={2} '
|
||||||
|
"--admin_password='{3}' "
|
||||||
|
'--admin_email={4} '
|
||||||
|
'--url={5}'
|
||||||
|
).format(
|
||||||
|
path,
|
||||||
|
title,
|
||||||
|
admin_user,
|
||||||
|
admin_password,
|
||||||
|
admin_email,
|
||||||
|
url
|
||||||
|
), runas=user)
|
||||||
|
|
||||||
|
if retcode == 0:
|
||||||
|
return True
|
||||||
|
return False
|
114
tests/kitchen/tests/wordpress/_states/wordpress.py
Normal file
114
tests/kitchen/tests/wordpress/_states/wordpress.py
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
'''
|
||||||
|
Manage wordpress plugins
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
def __virtual__():
|
||||||
|
return 'wordpress.show_plugin' in __salt__
|
||||||
|
|
||||||
|
|
||||||
|
def installed(name, path, user, admin_user, admin_password, admin_email, title, url):
|
||||||
|
ret = {'name': name,
|
||||||
|
'changes': {},
|
||||||
|
'comment': '',
|
||||||
|
'result': False}
|
||||||
|
|
||||||
|
check = __salt__['wordpress.is_installed'](path, user)
|
||||||
|
|
||||||
|
if check:
|
||||||
|
ret['result'] = True
|
||||||
|
ret['comment'] = 'Wordpress is already installed: {0}'.format(name)
|
||||||
|
return ret
|
||||||
|
elif __opts__['test']:
|
||||||
|
ret['result'] = None
|
||||||
|
ret['comment'] = 'Wordpress will be installed: {0}'.format(name)
|
||||||
|
return ret
|
||||||
|
|
||||||
|
resp = __salt__['wordpress.install'](path, user, admin_user, admin_password, admin_email, title, url)
|
||||||
|
if resp:
|
||||||
|
ret['result'] = True
|
||||||
|
ret['comment'] = 'Wordpress Installed: {0}'.format(name)
|
||||||
|
ret['changes'] = {
|
||||||
|
'new': resp
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
ret['comment'] = 'Failed to install wordpress: {0}'.format(name)
|
||||||
|
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
def activated(name, path, user):
|
||||||
|
ret = {'name': name,
|
||||||
|
'changes': {},
|
||||||
|
'comment': '',
|
||||||
|
'result': False}
|
||||||
|
|
||||||
|
check = __salt__['wordpress.show_plugin'](name, path, user)
|
||||||
|
|
||||||
|
if check['status'] == 'active':
|
||||||
|
ret['result'] = True
|
||||||
|
ret['comment'] = 'Plugin already activated: {0}'.format(name)
|
||||||
|
return ret
|
||||||
|
elif __opts__['test']:
|
||||||
|
ret['result'] = None
|
||||||
|
ret['comment'] = 'Plugin will be activated: {0}'.format(name)
|
||||||
|
return ret
|
||||||
|
|
||||||
|
resp = __salt__['wordpress.activate'](name, path, user)
|
||||||
|
if resp is True:
|
||||||
|
ret['result'] = True
|
||||||
|
ret['comment'] = 'Plugin activated: {0}'.format(name)
|
||||||
|
ret['changes'] = {
|
||||||
|
'old': check,
|
||||||
|
'new': __salt__['wordpress.show_plugin'](name, path, user)
|
||||||
|
}
|
||||||
|
elif resp is None:
|
||||||
|
ret['result'] = True
|
||||||
|
ret['comment'] = 'Plugin already activated: {0}'.format(name)
|
||||||
|
ret['changes'] = {
|
||||||
|
'old': check,
|
||||||
|
'new': __salt__['wordpress.show_plugin'](name, path, user)
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
ret['comment'] = 'Plugin failed to activate: {0}'.format(name)
|
||||||
|
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
def deactivated(name, path, user):
|
||||||
|
ret = {'name': name,
|
||||||
|
'changes': {},
|
||||||
|
'comment': '',
|
||||||
|
'result': False}
|
||||||
|
|
||||||
|
check = __salt__['wordpress.show_plugin'](name, path, user)
|
||||||
|
|
||||||
|
if check['status'] == 'inactive':
|
||||||
|
ret['result'] = True
|
||||||
|
ret['comment'] = 'Plugin already deactivated: {0}'.format(name)
|
||||||
|
return ret
|
||||||
|
elif __opts__['test']:
|
||||||
|
ret['result'] = None
|
||||||
|
ret['comment'] = 'Plugin will be deactivated: {0}'.format(name)
|
||||||
|
return ret
|
||||||
|
|
||||||
|
resp = __salt__['wordpress.deactivate'](name, path, user)
|
||||||
|
if resp is True:
|
||||||
|
ret['result'] = True
|
||||||
|
ret['comment'] = 'Plugin deactivated: {0}'.format(name)
|
||||||
|
ret['changes'] = {
|
||||||
|
'old': check,
|
||||||
|
'new': __salt__['wordpress.show_plugin'](name, path, user)
|
||||||
|
}
|
||||||
|
elif resp is None:
|
||||||
|
ret['result'] = True
|
||||||
|
ret['comment'] = 'Plugin already deactivated: {0}'.format(name)
|
||||||
|
ret['changes'] = {
|
||||||
|
'old': check,
|
||||||
|
'new': __salt__['wordpress.show_plugin'](name, path, user)
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
ret['comment'] = 'Plugin failed to deactivate: {0}'.format(name)
|
||||||
|
|
||||||
|
return ret
|
43
tests/kitchen/tests/wordpress/conftest.py
Normal file
43
tests/kitchen/tests/wordpress/conftest.py
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
import functools
|
||||||
|
import os
|
||||||
|
import pytest
|
||||||
|
import subprocess
|
||||||
|
import testinfra
|
||||||
|
|
||||||
|
if os.environ.get('KITCHEN_USERNAME') == 'vagrant':
|
||||||
|
if 'windows' in os.environ.get('KITCHEN_INSTANCE'):
|
||||||
|
test_host = testinfra.get_host('winrm://{KITCHEN_USERNAME}:{KITCHEN_PASSWORD}@{KITCHEN_HOSTNAME}:{KITCHEN_PORT}'.format(**os.environ), no_ssl=True)
|
||||||
|
else:
|
||||||
|
test_host = testinfra.get_host('paramiko://{KITCHEN_USERNAME}@{KITCHEN_HOSTNAME}:{KITCHEN_PORT}'.format(**os.environ),
|
||||||
|
ssh_identity_file=os.environ.get('KITCHEN_SSH_KEY'))
|
||||||
|
else:
|
||||||
|
test_host = testinfra.get_host('docker://{KITCHEN_USERNAME}@{KITCHEN_CONTAINER_ID}'.format(**os.environ))
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def host():
|
||||||
|
return test_host
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def salt():
|
||||||
|
if 'windows' in os.environ.get('KITCHEN_INSTANCE'):
|
||||||
|
tmpconf = r'c:\Users\vagrant\AppData\Local\Temp\kitchen\etc\salt'
|
||||||
|
else:
|
||||||
|
test_host.run('sudo chown -R {0} /tmp/kitchen'.format(os.environ.get('KITCHEN_USERNAME')))
|
||||||
|
tmpconf = '/tmp/kitchen/etc/salt'
|
||||||
|
return functools.partial(test_host.salt, config=tmpconf)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def http_port():
|
||||||
|
return subprocess.check_output(
|
||||||
|
['docker', 'inspect',
|
||||||
|
'-f', '{{(index (index .NetworkSettings.Ports "80/tcp") 0).HostPort}}',
|
||||||
|
os.environ.get('KITCHEN_CONTAINER_ID')]
|
||||||
|
).strip().decode()
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def host_ip():
|
||||||
|
return os.environ.get('KITCHEN_HOSTNAME')
|
2
tests/kitchen/tests/wordpress/driver.yml
Normal file
2
tests/kitchen/tests/wordpress/driver.yml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
forward:
|
||||||
|
- 80
|
23
tests/kitchen/tests/wordpress/pillars.yml
Normal file
23
tests/kitchen/tests/wordpress/pillars.yml
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
pillars:
|
||||||
|
top.sls:
|
||||||
|
base:
|
||||||
|
"*":
|
||||||
|
- wordpress
|
||||||
|
wordpress.sls:
|
||||||
|
mysql:
|
||||||
|
database:
|
||||||
|
- wordpress
|
||||||
|
user:
|
||||||
|
wordpress:
|
||||||
|
password: quair9aiqueeShae4toh
|
||||||
|
host: localhost
|
||||||
|
databases:
|
||||||
|
- database: wordpress
|
||||||
|
grants:
|
||||||
|
- all privileges
|
||||||
|
wordpress:
|
||||||
|
lookup:
|
||||||
|
admin_user: gtmanfred
|
||||||
|
admin_email: daniel@gtmanfred.com
|
||||||
|
title: "GtManfred's Blog"
|
||||||
|
url: http://blog.manfred.io
|
10
tests/kitchen/tests/wordpress/provisioner.yml
Normal file
10
tests/kitchen/tests/wordpress/provisioner.yml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
dependencies:
|
||||||
|
- name: apache
|
||||||
|
repo: git
|
||||||
|
source: https://github.com/saltstack-formulas/apache-formula.git
|
||||||
|
- name: mysql
|
||||||
|
repo: git
|
||||||
|
source: https://github.com/saltstack-formulas/mysql-formula.git
|
||||||
|
- name: php
|
||||||
|
repo: git
|
||||||
|
source: https://github.com/saltstack-formulas/php-formula.git
|
29
tests/kitchen/tests/wordpress/states/defaults.yaml
Normal file
29
tests/kitchen/tests/wordpress/states/defaults.yaml
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
{%- load_yaml as rawmap %}
|
||||||
|
Debian:
|
||||||
|
user: www-data
|
||||||
|
group: www-data
|
||||||
|
dir: /var/www/html/
|
||||||
|
admin_user: wordpress
|
||||||
|
admin_password: "{{salt.grains.get_or_set_hash('generated:wordpress:password')}}"
|
||||||
|
admin_email: test@example.com
|
||||||
|
title: Wordpress
|
||||||
|
url: http://localhost/
|
||||||
|
RedHat:
|
||||||
|
user: apache
|
||||||
|
group: apache
|
||||||
|
dir: /var/www/html/
|
||||||
|
admin_user: wordpress
|
||||||
|
admin_password: "{{salt.grains.get_or_set_hash('generated:wordpress:password')}}"
|
||||||
|
admin_email: test@example.com
|
||||||
|
title: Wordpress
|
||||||
|
url: http://localhost/
|
||||||
|
Suse:
|
||||||
|
user: wwwrun
|
||||||
|
group: www
|
||||||
|
dir: /srv/www/htdocs/
|
||||||
|
admin_user: wordpress
|
||||||
|
admin_password: "{{salt.grains.get_or_set_hash('generated:wordpress:password')}}"
|
||||||
|
admin_email: test@example.com
|
||||||
|
title: Wordpress
|
||||||
|
url: http://localhost/
|
||||||
|
{%- endload %}
|
7
tests/kitchen/tests/wordpress/states/init.sls
Normal file
7
tests/kitchen/tests/wordpress/states/init.sls
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
include:
|
||||||
|
- php.ng
|
||||||
|
- php.ng.mysql
|
||||||
|
- php.ng.apache2
|
||||||
|
- apache
|
||||||
|
- mysql
|
||||||
|
- .setup
|
78
tests/kitchen/tests/wordpress/states/setup.sls
Normal file
78
tests/kitchen/tests/wordpress/states/setup.sls
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
{% from "states/defaults.yaml" import rawmap with context %}
|
||||||
|
{%- set config = salt['grains.filter_by'](rawmap, grain='os_family', merge=salt['config.get']('wordpress:lookup')) %}
|
||||||
|
|
||||||
|
download wordpress archive:
|
||||||
|
pkg.latest:
|
||||||
|
- name: tar
|
||||||
|
|
||||||
|
archive.extracted:
|
||||||
|
- name: {{config.dir}}
|
||||||
|
- source_hash: a99115b3b6d6d7a1eb6c5617d4e8e704ed50f450
|
||||||
|
- source: https://wordpress.org/wordpress-4.8.2.tar.gz
|
||||||
|
- options: --strip-components=1
|
||||||
|
- enforce_toplevel: false
|
||||||
|
grains.present:
|
||||||
|
- name: wordpressdir
|
||||||
|
- value: {{config.dir}}
|
||||||
|
|
||||||
|
configure wordpress:
|
||||||
|
file.managed:
|
||||||
|
- name: {{config.dir}}/wp-config.php
|
||||||
|
- source: salt://states/wp-config.php.j2
|
||||||
|
- user: {{config.user}}
|
||||||
|
- group: {{config.group}}
|
||||||
|
- template: jinja
|
||||||
|
|
||||||
|
{%- if grains.os_family in ('Suse',) %}
|
||||||
|
suse setup:
|
||||||
|
pkg.latest:
|
||||||
|
- pkgs:
|
||||||
|
- php5-phar
|
||||||
|
- apache2-mod_php5
|
||||||
|
- listen_in:
|
||||||
|
- service: apache
|
||||||
|
file.managed:
|
||||||
|
- name: /etc/apache2/conf.d/mod_php.conf
|
||||||
|
- contents: |
|
||||||
|
LoadModule php5_module /usr/lib64/apache2/mod_php5.so
|
||||||
|
- listen_in:
|
||||||
|
- service: apache
|
||||||
|
{%- elif grains.os_family in ('Debian',) %}
|
||||||
|
remove default index.html:
|
||||||
|
file.absent:
|
||||||
|
- name: /var/www/html/index.html
|
||||||
|
{%- endif %}
|
||||||
|
|
||||||
|
get wp manager script:
|
||||||
|
|
||||||
|
file.managed:
|
||||||
|
- name: /usr/local/bin/wp
|
||||||
|
- user: root
|
||||||
|
- group: root
|
||||||
|
- mode: 755
|
||||||
|
- source: salt://states/wp-cli.phar
|
||||||
|
- source_hash: a647367c1e6c34c7357e380515d59e15fbc86fa2
|
||||||
|
- reload_modules: True
|
||||||
|
|
||||||
|
do install:
|
||||||
|
wordpress.installed:
|
||||||
|
- path: {{config.dir}}
|
||||||
|
- user: {{config.user}}
|
||||||
|
- admin_user: {{config.admin_user}}
|
||||||
|
- admin_password: "{{config.admin_password}}"
|
||||||
|
- admin_email: "{{config.admin_email}}"
|
||||||
|
- title: "{{config.title}}"
|
||||||
|
- url: "{{config.url}}"
|
||||||
|
- retry:
|
||||||
|
attempts: 5
|
||||||
|
|
||||||
|
file.directory:
|
||||||
|
- name: {{config.dir}}
|
||||||
|
- user: {{config.user}}
|
||||||
|
- group: {{config.group}}
|
||||||
|
- file_mode: 644
|
||||||
|
- dir_mode: 2775
|
||||||
|
- recurse:
|
||||||
|
- user
|
||||||
|
- group
|
||||||
|
- mode
|
BIN
tests/kitchen/tests/wordpress/states/wp-cli.phar
Normal file
BIN
tests/kitchen/tests/wordpress/states/wp-cli.phar
Normal file
Binary file not shown.
82
tests/kitchen/tests/wordpress/states/wp-config.php.j2
Normal file
82
tests/kitchen/tests/wordpress/states/wp-config.php.j2
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* The base configuration for WordPress
|
||||||
|
*
|
||||||
|
* The wp-config.php creation script uses this file during the
|
||||||
|
* installation. You don't have to use the web site, you can
|
||||||
|
* copy this file to "wp-config.php" and fill in the values.
|
||||||
|
*
|
||||||
|
* This file contains the following configurations:
|
||||||
|
*
|
||||||
|
* * MySQL settings
|
||||||
|
* * Secret keys
|
||||||
|
* * Database table prefix
|
||||||
|
* * ABSPATH
|
||||||
|
*
|
||||||
|
* @link https://codex.wordpress.org/Editing_wp-config.php
|
||||||
|
*
|
||||||
|
* @package WordPress
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ** MySQL settings - You can get this info from your web host ** //
|
||||||
|
/** The name of the database for WordPress */
|
||||||
|
define('DB_NAME', 'wordpress');
|
||||||
|
|
||||||
|
/** MySQL database username */
|
||||||
|
define('DB_USER', 'wordpress');
|
||||||
|
|
||||||
|
/** MySQL database password */
|
||||||
|
define('DB_PASSWORD', 'quair9aiqueeShae4toh');
|
||||||
|
|
||||||
|
/** MySQL hostname */
|
||||||
|
define('DB_HOST', 'localhost');
|
||||||
|
|
||||||
|
/** Database Charset to use in creating database tables. */
|
||||||
|
define('DB_CHARSET', 'utf8');
|
||||||
|
|
||||||
|
/** The Database Collate type. Don't change this if in doubt. */
|
||||||
|
define('DB_COLLATE', '');
|
||||||
|
|
||||||
|
/**#@+
|
||||||
|
* Authentication Unique Keys and Salts.
|
||||||
|
*
|
||||||
|
* Change these to different unique phrases!
|
||||||
|
* You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
|
||||||
|
* You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
|
||||||
|
*
|
||||||
|
* @since 2.6.0
|
||||||
|
*/
|
||||||
|
{%- do salt['http.query']('https://api.wordpress.org/secret-key/1.1/salt/') %}
|
||||||
|
|
||||||
|
/**#@-*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* WordPress Database Table prefix.
|
||||||
|
*
|
||||||
|
* You can have multiple installations in one database if you give each
|
||||||
|
* a unique prefix. Only numbers, letters, and underscores please!
|
||||||
|
*/
|
||||||
|
$table_prefix = 'wp_';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For developers: WordPress debugging mode.
|
||||||
|
*
|
||||||
|
* Change this to true to enable the display of notices during development.
|
||||||
|
* It is strongly recommended that plugin and theme developers use WP_DEBUG
|
||||||
|
* in their development environments.
|
||||||
|
*
|
||||||
|
* For information on other constants that can be used for debugging,
|
||||||
|
* visit the Codex.
|
||||||
|
*
|
||||||
|
* @link https://codex.wordpress.org/Debugging_in_WordPress
|
||||||
|
*/
|
||||||
|
define('WP_DEBUG', false);
|
||||||
|
|
||||||
|
/* That's all, stop editing! Happy blogging. */
|
||||||
|
|
||||||
|
/** Absolute path to the WordPress directory. */
|
||||||
|
if ( !defined('ABSPATH') )
|
||||||
|
define('ABSPATH', dirname(__FILE__) . '/');
|
||||||
|
|
||||||
|
/** Sets up WordPress vars and included files. */
|
||||||
|
require_once(ABSPATH . 'wp-settings.php');
|
|
@ -0,0 +1,8 @@
|
||||||
|
def test_formula(salt):
|
||||||
|
formulas = {'wordpress',}
|
||||||
|
dirs = salt('cp.list_master_dirs')
|
||||||
|
assert all([formula in dirs for formula in formulas])
|
||||||
|
|
||||||
|
def test_wordpress_module(salt):
|
||||||
|
wordpressdir = salt('grains.get', 'wordpressdir')
|
||||||
|
assert salt('wordpress.is_installed', path=wordpressdir)
|
|
@ -0,0 +1,6 @@
|
||||||
|
import requests
|
||||||
|
|
||||||
|
|
||||||
|
def test_server(host_ip, http_port):
|
||||||
|
resp = requests.get('http://{0}:{1}'.format(host_ip, http_port), headers={'Host': 'blog.manfred.io'})
|
||||||
|
assert resp.status_code == 200
|
|
@ -735,6 +735,39 @@ class SaltTestsuiteParser(SaltCoverageTestingParser):
|
||||||
status.append(results)
|
status.append(results)
|
||||||
return status
|
return status
|
||||||
|
|
||||||
|
def run_kitchen_tests(self):
|
||||||
|
'''
|
||||||
|
Execute the kitchen tests
|
||||||
|
'''
|
||||||
|
named_kitchen_test = []
|
||||||
|
if self.options.name:
|
||||||
|
for test in self.options.name:
|
||||||
|
if not test.startswith(('tests.kitchen.', 'kitchen.')):
|
||||||
|
continue
|
||||||
|
named_kitchen_test.append(test)
|
||||||
|
|
||||||
|
if not self.options.kitchen and not named_kitchen_test:
|
||||||
|
# We are not explicitly running the unit tests and none of the
|
||||||
|
# names passed to --name is a unit test.
|
||||||
|
return [True]
|
||||||
|
|
||||||
|
status = []
|
||||||
|
if self.options.kitchen:
|
||||||
|
results = self.run_suite(
|
||||||
|
os.path.join(TEST_DIR, 'kitchen'), 'Kitchen', suffix='test_*.py'
|
||||||
|
)
|
||||||
|
status.append(results)
|
||||||
|
# We executed ALL unittests, we can skip running unittests by name
|
||||||
|
# below
|
||||||
|
return status
|
||||||
|
|
||||||
|
for name in named_kitchen_test:
|
||||||
|
results = self.run_suite(
|
||||||
|
os.path.join(TEST_DIR, 'kitchen'), name, suffix='test_*.py', load_from_name=True
|
||||||
|
)
|
||||||
|
status.append(results)
|
||||||
|
return status
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
'''
|
'''
|
||||||
|
@ -755,6 +788,8 @@ def main():
|
||||||
overall_status.extend(status)
|
overall_status.extend(status)
|
||||||
status = parser.run_unit_tests()
|
status = parser.run_unit_tests()
|
||||||
overall_status.extend(status)
|
overall_status.extend(status)
|
||||||
|
status = parser.run_kitchen_tests()
|
||||||
|
overall_status.extend(status)
|
||||||
false_count = overall_status.count(False)
|
false_count = overall_status.count(False)
|
||||||
|
|
||||||
if false_count > 0:
|
if false_count > 0:
|
||||||
|
|
|
@ -384,6 +384,7 @@ class SaltTestingParser(optparse.OptionParser):
|
||||||
if self.xml_output_dir is not None and self.options.xml_out:
|
if self.xml_output_dir is not None and self.options.xml_out:
|
||||||
if not os.path.isdir(self.xml_output_dir):
|
if not os.path.isdir(self.xml_output_dir):
|
||||||
os.makedirs(self.xml_output_dir)
|
os.makedirs(self.xml_output_dir)
|
||||||
|
os.environ['TESTS_XML_OUTPUT_DIR'] = self.xml_output_dir
|
||||||
print(
|
print(
|
||||||
' * Generated unit test XML reports will be stored '
|
' * Generated unit test XML reports will be stored '
|
||||||
'at {0!r}'.format(self.xml_output_dir)
|
'at {0!r}'.format(self.xml_output_dir)
|
||||||
|
@ -455,6 +456,7 @@ class SaltTestingParser(optparse.OptionParser):
|
||||||
logging_level = logging.INFO
|
logging_level = logging.INFO
|
||||||
else:
|
else:
|
||||||
logging_level = logging.ERROR
|
logging_level = logging.ERROR
|
||||||
|
os.environ['TESTS_LOG_LEVEL'] = six.text_type(self.options.verbosity)
|
||||||
consolehandler.setLevel(logging_level)
|
consolehandler.setLevel(logging_level)
|
||||||
logging.root.addHandler(consolehandler)
|
logging.root.addHandler(consolehandler)
|
||||||
log.info('Runtests logging has been setup')
|
log.info('Runtests logging has been setup')
|
||||||
|
|
Loading…
Add table
Reference in a new issue