Skip to content

Commit

Permalink
feat(tofs): add tofs pattern
Browse files Browse the repository at this point in the history
  • Loading branch information
n-rodriguez committed Sep 20, 2019
1 parent 566e38d commit 1a7dd94
Show file tree
Hide file tree
Showing 7 changed files with 667 additions and 9 deletions.
8 changes: 7 additions & 1 deletion apt-cacher/ng/client/config/file.sls
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
{#- Get the `tplroot` from `tpldir` #}
{%- set tplroot = tpldir.split('/')[0] %}
{%- from tplroot ~ "/ng/map.jinja" import apt_cacher_ng with context %}
{%- from tplroot ~ "/ng/libtofs.jinja" import files_switch with context %}
{%- if grains['os_family'] == 'Debian' %}
{%- if apt_cacher_ng.server_address %}
Expand All @@ -14,7 +15,12 @@ apt-cacher-ng/config/client_config:
- user: root
- group: root
- mode: '644'
- source: salt://apt-cacher/ng/files/client.conf
- source: {{ files_switch(['client.conf.tmpl'],
lookup='apt-cacher-ng/config/client_config'
)
}}
- template: jinja
- context:
apt_cacher_ng: {{ apt_cacher_ng | json }}
{%- endif %}
{%- endif %}
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
{% from "apt-cacher/ng/map.jinja" import apt_cacher_ng with context -%}
########################################################################
# File managed by Salt at <{{ source }}>.
# Your changes will be overwritten.
########################################################################

Acquire::http::Proxy "http://{{ apt_cacher_ng.server_address }}:{{ apt_cacher_ng.server_port }}";
Acquire::https::Proxy "{{ apt_cacher_ng.https_proxy }}";
{% for host in apt_cacher_ng.local_mirrors -%}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
########################################################################
# File managed by Salt at <{{ source }}>.
# Your changes will be overwritten.
########################################################################

# This file contains confidential data and should be protected with file
# permissions from being read by untrusted users.
Expand All @@ -7,10 +11,6 @@

# Basic authentication with username and password, required to
# visit pages with administrative functionality. Format: username:password
{%- set cfg = salt['pillar.get']('apt_cacher_ng', {}) %}
{%- set admin_account = cfg.get('admin_account', False) %}
{%- set admin_passwd = cfg.get('admin_passwd', False) %}
{%- if admin_account and admin_passwd %}
AdminAuth: {{ admin_account }}:{{ admin_passwd }}
{%- endif %}

Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
{% from "apt-cacher/ng/map.jinja" import apt_cacher_ng with context %}
########################################################################
# File managed by Salt at <{{ source }}>.
# Your changes will be overwritten.
########################################################################

BindAddress: {{ apt_cacher_ng.server_bind_address }}
CacheDir: {{ apt_cacher_ng.server_cache_dir }}
LogDir: {{ apt_cacher_ng.server_log_dir }}
Expand Down
112 changes: 112 additions & 0 deletions apt-cacher/ng/libtofs.jinja
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
{%- 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 '<tplroot>:tofs:source_files' to prepend to the
list of source files
* default_files_switch: if there's no config (e.g. pillar)
'<tplroot>:tofs:files_switch' this is the ordered list of grains to
use as selector switch of the directories under
"<path_prefix>/files"
* indent_witdh: 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'
) }}
- 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
- source:
- salt://xxx/files/theminion/etc/yyy/zzz.conf
- salt://xxx/files/theminion/etc/yyy/zzz.conf.jinja
- salt://xxx/files/RedHat/etc/yyy/zzz.conf
- salt://xxx/files/RedHat/etc/yyy/zzz.conf.jinja
- 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 %}
{%- do fsl.append('') %}
{%- 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('/') %}
{{ url | indent(indent_width, true) }}
{%- endfor %}
{%- endfor %}
{%- endfor %}
{%- endfor %}
{%- endmacro %}
18 changes: 16 additions & 2 deletions apt-cacher/ng/server/config/file.sls
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
{%- set tplroot = tpldir.split('/')[0] %}
{%- set sls_package_install = tplroot ~ '.ng.server.package.install' %}
{%- from tplroot ~ "/ng/map.jinja" import apt_cacher_ng with context %}
{%- from tplroot ~ "/ng/libtofs.jinja" import files_switch with context %}
include:
- {{ sls_package_install }}
Expand All @@ -30,10 +31,16 @@ apt-cacher-ng/config/server_config:
- user: root
- group: {{ apt_cacher_ng.root_group }}
- mode: '644'
- source: salt://apt-cacher/ng/files/server.conf
- source: {{ files_switch(['server.conf.tmpl'],
lookup='apt-cacher-ng/config/server_config',
use_subpath=True
)
}}
- template: jinja
- require:
- sls: {{ sls_package_install }}
- context:
apt_cacher_ng: {{ apt_cacher_ng | json }}
apt-cacher-ng/config/server_cache_dir:
file.directory:
Expand All @@ -57,5 +64,12 @@ apt-cacher-ng/config/credentials:
- user: {{ apt_cacher_ng.user }}
- group: {{ apt_cacher_ng.group }}
- mode: '600'
- source: salt://apt-cacher/ng/files/security.conf
- source: {{ files_switch(['security.conf.tmpl'],
lookup='apt-cacher-ng/config/credentials',
use_subpath=True
)
}}
- template: jinja
- context:
admin_account: {{ apt_cacher_ng.get('admin_account', False) }}
admin_passwd: {{ apt_cacher_ng.get('admin_passwd', False) }}
Loading

0 comments on commit 1a7dd94

Please sign in to comment.