diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 543e51b..44534b1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,7 +2,7 @@ stages: - test - deploy -test_roles_job: +test_roles: stage: test before_script: - zypper -qn in --no-recommends python3 python3-PyYAML @@ -10,6 +10,19 @@ test_roles_job: tags: - docker +test_show_highstate: + stage: test + before_script: + - zypper -qn in --no-recommends salt git python3 python3-PyYAML + - rm -rf /srv/{salt,pillar} + - ln -s $PWD/salt /srv/salt + - ln -s $PWD/pillar /srv/pillar + - sed -i -e 's/^production:$/base:/' /srv/{salt,pillar}/top.sls + - bin/get_formulas.py -c /srv/formula -s + script: bin/test_show_highstate.py + tags: + - docker + deploy_job: stage: deploy script: salt-call event.fire_master update salt/fileserver/gitfs/update diff --git a/FORMULAS.yaml b/FORMULAS.yaml new file mode 100644 index 0000000..dbc3874 --- /dev/null +++ b/FORMULAS.yaml @@ -0,0 +1,31 @@ +--- +dhcpd: {} +elasticsearch: + namespace: 'cboltz' + pending: + - 'https://github.com/saltstack-formulas/elasticsearch-formula/pull/36' +grains: + namespace: 'tampakrap' +keepalived: {} +limits: + namespace: 'ryancurrah' +locale: {} +mysql: {} +ntp: {} +openldap: {} +openssh: {} +powerdns: {} +salt: {} +sqlite: + namespace: 'tampakrap' +sssd: + original_namespace: 'Spark-Networks' + namespace: 'tampakrap' + pending: + - 'https://github.com/Spark-Networks/salt-sssd-formula/pull/1' + prefix: 'salt-' +sudoers: {} +timezone: {} +users: {} +zypper: + namespace: 'tampakrap' diff --git a/bin/get_formulas.py b/bin/get_formulas.py new file mode 100755 index 0000000..f7c314b --- /dev/null +++ b/bin/get_formulas.py @@ -0,0 +1,51 @@ +#!/usr/bin/python3 + +# For description and usage, see the argparse options at the end of the file + +import argparse +import os +import yaml + + +def clone(DEST, SYMLINK=False): + def use_git_to_clone_or_pull_repo(): + # pygit2 is not available for python3 in Leap, use plain git instead + + import subprocess + + if not os.path.exists(DEST): + os.mkdir(DEST) + if os.path.isdir(FULL_PATH): + subprocess.Popen(['git', 'pull'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + else: + subprocess.Popen(['git', 'clone', url, FULL_PATH], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + + def use_pygit2_to_clone_or_pull_repo(): + import pygit2 + + if os.path.isdir(FULL_PATH): + repo = pygit2.Repository(FULL_PATH) + repo.checkout('HEAD') + else: + pygit2.clone_repository(url, FULL_PATH, bare=False) + + for formula, data in FORMULAS.items(): + namespace = data.get('namespace', 'saltstack-formulas') + prefix = data.get('prefix', '') + url = 'https://github.com/%s/%s%s-formula' % (namespace, prefix, formula) + FULL_PATH = '%s/%s-formula' % (DEST, formula) + use_git_to_clone_or_pull_repo() + if SYMLINK: + os.symlink('%s/%s' % (FULL_PATH, formula), '/srv/salt/%s' % formula) + + +with open('FORMULAS.yaml', 'r') as f: + FORMULAS = yaml.load(f) + +parser = argparse.ArgumentParser(description='Loads the formulas from FORMULAS.yaml and optionally clones them in a specified destination. Optionally it can also create a symlink from the cloned path to /srv/salt, useful for the CI worker.') +parser.add_argument('-c', '--clone', nargs=1, help='Clones the formulas to a specified destination that is passed as option to this argument.') +parser.add_argument('-s', '--symlink', action='store_true', help='Creates symlink from the specified destination to /srv/salt.') +args = parser.parse_args() + +if args.clone: + clone(args.clone[0], args.symlink) diff --git a/bin/test_show_highstate.py b/bin/test_show_highstate.py new file mode 100755 index 0000000..bf70ded --- /dev/null +++ b/bin/test_show_highstate.py @@ -0,0 +1,19 @@ +#!/bin/bash + +# Runs state.show_highstate using all localized grains' combinations + +set -e + +RUN_TEST="salt-call --local --retcode-passthrough state.show_highstate" +ROLES=$(bin/get_roles.py --yaml) + +echo 'domain: infra.opensuse.org' > /etc/salt/grains +printf "city:\ncountry:\nsalt_cluster: opensuse\nvirt_cluster:\n$ROLES" > pillar/id/${HOSTNAME}.sls + +sed -i -e 's/\(city:\).*/\1 nuremberg/' -e 's/\(country:\).*/\1 de/' -e 's/\(virt_cluster:\).*/\1 atreju/' pillar/id/${HOSTNAME}.sls +$RUN_TEST > /dev/null +echo "PASSED: country: de" + +sed -i -e 's/\(city:\).*/\1 provo/' -e 's/\(country:\).*/\1 us/' -e 's/\(virt_cluster:\).*/\1 bryce/' pillar/id/${HOSTNAME}.sls +$RUN_TEST > /dev/null +echo "PASSED: country: us"