diff --git a/.travis.yml b/.travis.yml index 6b4d894..74a7cf3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -72,37 +72,67 @@ jobs: ## Define the rest of the matrix based on Kitchen testing # Make sure the instances listed below match up with # the `platforms` defined in `kitchen.yml` + # - env: INSTANCE=default-debian-10-master-py3 - env: INSTANCE=modules-debian-10-master-py3 - # env: INSTANCE=modules-ubuntu-1804-master-py3 + # - env: INSTANCE=default-ubuntu-1804-master-py3 + # - env: INSTANCE=modules-ubuntu-1804-master-py3 + # - env: INSTANCE=default-centos-8-master-py3 - env: INSTANCE=modules-centos-8-master-py3 + # - env: INSTANCE=default-fedora-31-master-py3 - env: INSTANCE=modules-fedora-31-master-py3 + # - env: INSTANCE=default-opensuse-leap-151-master-py3 - env: INSTANCE=modules-opensuse-leap-151-master-py3 - # https://community.letsencrypt.org/t/localhost-crt-does-not-exist-or-is-empty/103979 - env: INSTANCE=default-amazonlinux-2-master-py3 - + # - env: INSTANCE=modules-amazonlinux-2-master-py3 + # - env: INSTANCE=default-debian-10-2019-2-py3 # - env: INSTANCE=modules-debian-10-2019-2-py3 + # - env: INSTANCE=default-debian-9-2019-2-py3 # - env: INSTANCE=modules-debian-9-2019-2-py3 + # - env: INSTANCE=default-ubuntu-1804-2019-2-py3 - env: INSTANCE=modules-ubuntu-1804-2019-2-py3 + # - env: INSTANCE=default-centos-8-2019-2-py3 # - env: INSTANCE=modules-centos-8-2019-2-py3 + # - env: INSTANCE=default-fedora-31-2019-2-py3 # - env: INSTANCE=modules-fedora-31-2019-2-py3 - # - env: INSTANCE=suse-opensuse-leap-151-2019-2-py3 + # - env: INSTANCE=default-opensuse-leap-151-2019-2-py3 + # - env: INSTANCE=modules-opensuse-leap-151-2019-2-py3 + # - env: INSTANCE=default-centos-7-2019-2-py2 - env: INSTANCE=modules-centos-7-2019-2-py2 - # env: INSTANCE=default-amazonlinux-2-2019-2-py3 + # - env: INSTANCE=default-amazonlinux-2-2019-2-py3 + # - env: INSTANCE=modules-amazonlinux-2-2019-2-py3 + # - env: INSTANCE=default-arch-base-latest-2019-2-py2 # - env: INSTANCE=modules-arch-base-latest-2019-2-py2 - # env: INSTANCE=modules-fedora-30-2018-3-py3 + # - env: INSTANCE=arch-arch-base-latest-2019-2-py2 + # - env: INSTANCE=default-fedora-30-2018-3-py3 + # - env: INSTANCE=modules-fedora-30-2018-3-py3 + # - env: INSTANCE=default-debian-9-2018-3-py2 # - env: INSTANCE=modules-debian-9-2018-3-py2 + # - env: INSTANCE=default-ubuntu-1604-2018-3-py2 # - env: INSTANCE=modules-ubuntu-1604-2018-3-py2 + # - env: INSTANCE=default-centos-7-2018-3-py2 # - env: INSTANCE=modules-centos-7-2018-3-py2 + # - env: INSTANCE=default-opensuse-leap-151-2018-3-py2 # - env: INSTANCE=modules-opensuse-leap-151-2018-3-py2 + # - env: INSTANCE=default-amazonlinux-1-2018-3-py2 # - env: INSTANCE=modules-amazonlinux-1-2018-3-py2 + # - env: INSTANCE=default-arch-base-latest-2018-3-py2 # - env: INSTANCE=modules-arch-base-latest-2018-3-py2 + # - env: INSTANCE=arch-arch-base-latest-2018-3-py2 + # - env: INSTANCE=default-debian-8-2017-7-py2 # - env: INSTANCE=modules-debian-8-2017-7-py2 + # - env: INSTANCE=default-ubuntu-1604-2017-7-py2 # - env: INSTANCE=modules-ubuntu-1604-2017-7-py2 - # env: INSTANCE=default-centos-6-2017-7-py2 + # - env: INSTANCE=default-centos-6-2017-7-py2 + # - env: INSTANCE=modules-centos-6-2017-7-py2 + # - env: INSTANCE=default-fedora-30-2017-7-py2 # - env: INSTANCE=modules-fedora-30-2017-7-py2 + # - env: INSTANCE=default-opensuse-leap-151-2017-7-py2 # - env: INSTANCE=modules-opensuse-leap-151-2017-7-py2 + # - env: INSTANCE=default-amazonlinux-1-2017-7-py2 # - env: INSTANCE=modules-amazonlinux-1-2017-7-py2 + # - env: INSTANCE=default-arch-base-latest-2017-7-py2 + # - env: INSTANCE=modules-arch-base-latest-2017-7-py2 - env: INSTANCE=arch-arch-base-latest-2017-7-py2 ## Define the release stage that runs `semantic-release` diff --git a/.yamllint b/.yamllint index cc08fef..7a773aa 100644 --- a/.yamllint +++ b/.yamllint @@ -13,7 +13,6 @@ ignore: | test/**/states/**/*.sls .kitchen/ test/salt/pillar/modules.sls - test/salt/pillar/default.sls pillar.example yaml-files: diff --git a/CODEOWNERS b/CODEOWNERS index d32abbf..8444c19 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,12 +1,8 @@ # https://help.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners # SECTION: Owner(s) for everything in the repo, unless a later match takes precedence -# ************************************************************************** -# *** NO GLOBAL OWNER(S) SPECIFIED *** -# *** Ideally this will be defined for a healthy, well-maintained repo *** -# ************************************************************************** # FILE PATTERN OWNER(S) -* @NONE +* @noelmcloughlin # SECTION: Owner(s) for specific directories # FILE PATTERN OWNER(S) diff --git a/apache/libsaltcli.jinja b/apache/libsaltcli.jinja deleted file mode 100644 index 5c3593e..0000000 --- a/apache/libsaltcli.jinja +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# vim: ft=jinja - -{#- Get the relevant values from the `opts` dict #} -{%- set opts_cli = opts.get('__cli', '') %} -{%- set opts_masteropts_cli = opts | traverse('__master_opts__:__cli', '') %} - -{#- Determine the type of salt command being run #} -{%- if opts_cli == 'salt-minion' %} -{%- set cli = 'minion' %} -{%- elif opts_cli == 'salt-call' %} -{%- set cli = 'ssh' if opts_masteropts_cli in ('salt-ssh', 'salt-master') else 'local' %} -{%- else %} -{%- set cli = 'unknown' %} -{%- endif %} -{%- do salt['log.debug']('[libsaltcli] the salt command type has been identified to be: ' ~ cli) %} diff --git a/apache/libtofs.jinja b/apache/libtofs.jinja index 0668925..f39fd42 100644 --- a/apache/libtofs.jinja +++ b/apache/libtofs.jinja @@ -1,40 +1,37 @@ -{%- macro files_switch(source_files, - lookup=None, - default_files_switch=['id', 'os_family'], - indent_width=6, - use_subpath=False) %} - {#- +{%- macro files_switch( + source_files, + lookup=None, + default_files_switch=["id", "os_family"], + indent_width=6, + use_subpath=False + ) %} +{#- Returns a valid value for the "source" parameter of a "file.managed" state function. This makes easier the usage of the Template Override and Files Switch (TOFS) pattern. - Params: * source_files: ordered list of files to look for - * lookup: key under ':tofs:source_files' to prepend to the + * lookup: key under ":tofs:source_files" to prepend to the list of source files * default_files_switch: if there's no config (e.g. pillar) - ':tofs:files_switch' this is the ordered list of grains to + ":tofs:files_switch" this is the ordered list of grains to use as selector switch of the directories under "/files" * indent_width: indentation of the result value to conform to YAML * use_subpath: defaults to `False` but if set, lookup the source file recursively from the current state directory up to `tplroot` - Example (based on a `tplroot` of `xxx`): - If we have a state: - Deploy configuration: file.managed: - name: /etc/yyy/zzz.conf - - source: {{ files_switch(['/etc/yyy/zzz.conf', '/etc/yyy/zzz.conf.jinja'], - lookup='Deploy configuration' - ) }} + - source: {{ files_switch( + ["/etc/yyy/zzz.conf", "/etc/yyy/zzz.conf.jinja"], + lookup="Deploy configuration", + ) }} - template: jinja - In a minion with id=theminion and os_family=RedHat, it's going to be rendered as: - Deploy configuration: file.managed: - name: /etc/yyy/zzz.conf @@ -46,67 +43,73 @@ - salt://xxx/files/default/etc/yyy/zzz.conf - salt://xxx/files/default/etc/yyy/zzz.conf.jinja - template: jinja - #} - {#- Get the `tplroot` from `tpldir` #} - {%- set tplroot = tpldir.split('/')[0] %} - {%- set path_prefix = salt['config.get'](tplroot ~ ':tofs:path_prefix', tplroot) %} - {%- set files_dir = salt['config.get'](tplroot ~ ':tofs:dirs:files', 'files') %} - {%- set files_switch_list = salt['config.get']( - tplroot ~ ':tofs:files_switch', - default_files_switch - ) %} - {#- Lookup source_files (v2), files (v1), or fallback to an empty list #} - {%- set src_files = salt['config.get']( - tplroot ~ ':tofs:source_files:' ~ lookup, - salt['config.get'](tplroot ~ ':tofs:files:' ~ lookup, []) - ) %} - {#- Append the default source_files #} - {%- set src_files = src_files + source_files %} - {#- Only add to [''] when supporting older TOFS implementations #} - {%- set path_prefix_exts = [''] %} - {%- if use_subpath and tplroot != tpldir %} - {#- Walk directory tree to find {{ files_dir }} #} - {%- set subpath_parts = tpldir.lstrip(tplroot).lstrip('/').split('/') %} - {%- for path in subpath_parts %} - {%- set subpath = subpath_parts[0:loop.index] | join('/') %} - {%- do path_prefix_exts.append('/' ~ subpath) %} - {%- endfor %} - {%- endif %} - {%- for path_prefix_ext in path_prefix_exts|reverse %} - {%- set path_prefix_inc_ext = path_prefix ~ path_prefix_ext %} - {#- For older TOFS implementation, use `files_switch` from the config #} - {#- Use the default, new method otherwise #} - {%- set fsl = salt['config.get']( - tplroot ~ path_prefix_ext|replace('/', ':') ~ ':files_switch', - files_switch_list - ) %} - {#- Append an empty value to evaluate as `default` in the loop below #} - {%- if '' not in fsl %} - {%- set fsl = fsl + [''] %} - {%- endif %} - {%- for fs in fsl %} - {%- for src_file in src_files %} - {%- if fs %} - {%- set fs_dirs = salt['config.get'](fs, fs) %} - {%- else %} - {%- set fs_dirs = salt['config.get'](tplroot ~ ':tofs:dirs:default', 'default') %} - {%- endif %} - {#- Force the `config.get` lookup result as a list where necessary #} - {#- since we need to also handle grains that are lists #} - {%- if fs_dirs is string %} - {%- set fs_dirs = [fs_dirs] %} - {%- endif %} - {%- for fs_dir in fs_dirs %} - {%- set url = [ - '- salt:/', - path_prefix_inc_ext.strip('/'), - files_dir.strip('/'), - fs_dir.strip('/'), - src_file.strip('/'), - ] | select | join('/') %} +#} +{#- Get the `tplroot` from `tpldir` #} +{%- set tplroot = tpldir.split("/")[0] %} +{%- set path_prefix = salt["config.get"](tplroot ~ ":tofs:path_prefix", tplroot) %} +{%- set files_dir = salt["config.get"](tplroot ~ ":tofs:dirs:files", "files") %} +{%- set files_switch_list = salt["config.get"]( + tplroot ~ ":tofs:files_switch", default_files_switch + ) %} +{#- Lookup source_files (v2), files (v1), or fallback to an empty list #} +{%- set src_files = salt["config.get"]( + tplroot ~ ":tofs:source_files:" ~ lookup, + salt["config.get"](tplroot ~ ":tofs:files:" ~ lookup, []), + ) %} +{#- Append the default source_files #} +{%- set src_files = src_files + source_files %} +{#- Only add to [""] when supporting older TOFS implementations #} +{%- set path_prefix_exts = [""] %} +{%- if use_subpath and tplroot != tpldir %} +{#- Walk directory tree to find {{ files_dir }} #} +{%- set subpath_parts = tpldir.lstrip(tplroot).lstrip("/").split("/") %} +{%- for path in subpath_parts %} +{%- set subpath = subpath_parts[0 : loop.index] | join("/") %} +{%- do path_prefix_exts.append("/" ~ subpath) %} +{%- endfor %} +{%- endif %} +{%- for path_prefix_ext in path_prefix_exts | reverse %} +{%- set path_prefix_inc_ext = path_prefix ~ path_prefix_ext %} +{#- For older TOFS implementation, use `files_switch` from the config #} +{#- Use the default, new method otherwise #} +{%- set fsl = salt["config.get"]( + tplroot ~ path_prefix_ext | replace("/", ":") ~ ":files_switch", + files_switch_list, + ) %} +{#- Append an empty value to evaluate as `default` in the loop below #} +{%- if "" not in fsl %} +{%- set fsl = fsl + [""] %} +{%- endif %} +{%- for fs in fsl %} +{%- for src_file in src_files %} +{%- if fs %} +{%- set fs_dirs = salt["config.get"](fs, fs) %} +{%- else %} +{%- set fs_dirs = salt["config.get"]( + tplroot ~ ":tofs:dirs:default", "default" + ) %} +{%- endif %} +{#- Force the `config.get` lookup result as a list where necessary #} +{#- since we need to also handle grains that are lists #} +{%- if fs_dirs is string %} +{%- set fs_dirs = [fs_dirs] %} +{%- endif %} +{%- for fs_dir in fs_dirs %} +{#- strip empty elements by using a select #} +{%- set url = ( + [ + "- salt:/", + path_prefix_inc_ext.strip("/"), + files_dir.strip("/"), + fs_dir.strip("/"), + src_file.strip("/"), + ] + | select + | join("/") + ) %} {{ url | indent(indent_width, true) }} - {%- endfor %} - {%- endfor %} - {%- endfor %} - {%- endfor %} +{%- endfor %} +{%- endfor %} +{%- endfor %} +{%- endfor %} {%- endmacro %} diff --git a/kitchen.yml b/kitchen.yml index 55ae442..4711b0f 100644 --- a/kitchen.yml +++ b/kitchen.yml @@ -188,6 +188,10 @@ suites: inspec_tests: - path: test/integration/modules - name: arch + includes: + - arch-base-latest-2019-2-py2 + - arch-base-latest-2018-3-py2 + - arch-base-latest-2017-7-py2 provisioner: state_top: base: