lxc:
  pkg.installed
  
lxc-create-symlink:
  file.symlink:
    - name: /lxc
    - target: /var/lib/lxc
    
/etc/systemd/system/start_lxc.service:
  file.managed:
    - source: salt://roles/maintain/lxc/start_lxc.service
    - user: root
    - group: root
    - mode: 644
    
/opt/start_lxc.sh:
  file.managed:
    - source: salt://roles/maintain/lxc/start_lxc.sh
    - user: root
    - group: root
    - mode: 744
    - template: jinja

{%- if pillar['lxc'] is defined -%}
{%- for container in pillar['lxc'] %}
{{container}}-create:
  lxc.present:
    - name: {{container}}
    - profile: base
    
{% set bind_dirs = ['tmp'] %}
{%- set overlay_dirs = ['etc','opt','srv','usr','var','root'] -%}
{%- set hidden_files = ['etc/salt/minion_id','etc/salt/grains','etc/fstab'] -%}
{%- set hidden_dirs = ['etc/systemd/system/multi-user.target.wants','etc/salt/pki','etc/nginx/certs','etc/nginx/conf.d'] -%}
{%- set base_dirs = ['boot','dev','etc','home','mnt','opt','proc','run','srv','sys','tmp','usr','var'] -%}
{%- set symlinks = {'bin':'usr/bin','lib':'usr/lib','lib64':'usr/lib','sbin':'usr/bin'} -%}

{%- if pillar['lxc'][container]['bind_dirs'] is defined -%}
  {% for bind_dir in pillar['lxc'][container]['bind_dirs'] if bind_dir not in bind_dirs %}
    {% do bind_dirs.append(bind_dir) %}
  {% endfor %}
{%- endif -%}
{%- if pillar['lxc'][container]['overlay_dirs'] is defined -%}
  {% for overlay_dir in pillar['lxc'][container]['overlay_dirs'] if overlay_dir not in overlay_dirs %}
    {% do overlay_dirs.append(overlay_dir) %}
  {% endfor -%}
{%- endif -%}
{%- if pillar['lxc'][container]['hidden_files'] is defined -%}
  {% for hidden_file in pillar['lxc'][container]['hidden_files'] if hidden_file not in hidden_files %}
    {% do hidden_files.append(hidden_file) %}
  {% endfor -%}
{%- endif -%}
{%- if pillar['lxc'][container]['hidden_dirs'] is defined -%}
  {% for hidden_dir in pillar['lxc'][container]['hidden_dirs'] if hidden_dir not in hidden_dirs %}
    {% do hidden_dirs.append(hidden_dir) %}
  {% endfor -%}
{%- endif -%}
{%- if pillar['lxc'][container]['symlinks'] is defined -%}
  {% do symlinks.update(pillar['lxc'][container]['symlinks']) %}
{%- endif %}

{{container}}-config:
  file.managed:
    - name: /var/lib/lxc/{{container}}/config
    - source: salt://roles/maintain/lxc/container.conf
    - template: jinja
    - context: 
        container: {{container}}
        bind_dirs: {{bind_dirs}}
        overlay_dirs: {{overlay_dirs}}
        
{{container}}-create-rootfs:
  file.directory:
    - name: /var/lib/lxc/{{container}}/rootfs/
{{container}}-create-upperdirs:
  file.directory:
    - name: /var/lib/lxc/{{container}}/upperdirs/
{{container}}-create-workdirs:
  file.directory:
    - name: /var/lib/lxc/{{container}}/workdirs/

{%- for overlay_dir in overlay_dirs %}
{{container}}-create-upperdir-{{overlay_dir}}:
  file.directory:
    - name: /var/lib/lxc/{{container}}/upperdirs/{{overlay_dir}}
{{container}}-create-workdir-{{overlay_dir}}:
  file.directory:
    - name: /var/lib/lxc/{{container}}/workdirs/{{overlay_dir}}
{{container}}-create-rootfs-{{overlay_dir}}:
  file.directory:
    - name: /var/lib/lxc/{{container}}/rootfs/{{overlay_dir}}
{%- endfor %}

{%- for bind_dir in bind_dirs %}
{{container}}-create-rootfs-{{bind_dir}}:
  file.directory:
    - name: /var/lib/lxc/{{container}}/rootfs/{{bind_dir}}
    - makedirs: true
{%- endfor %}

{%- for base_dir in base_dirs %}
{{container}}-create-{{base_dir}}:
  file.directory:
    - name: /var/lib/lxc/{{container}}/rootfs/{{base_dir}}
{%- endfor %}

{%- for symlink in symlinks %}
{{container}}-create-{{symlink}}:
  file.symlink:
    - name: /var/lib/lxc/{{container}}/rootfs/{{symlink}}
    - target: {{symlinks[symlink]}}
{%- endfor %}

{%- for hidden_file in hidden_files %}
{%- set directory = hidden_file | regex_search('.*\/') -%}
{%- if pillar['lxc'][container]['hidden_dirs'] is defined -%}
{{container}}-mkdir-for-{{hidden_file}}:
  file.directory:
    - name: /var/lib/lxc/{{container}}/upperdirs/{{directory}}
    - makedirs: true
{% endif %}
{{container}}-whiteout-{{hidden_file}}:
  file.mknod:
    - name: /var/lib/lxc/{{container}}/upperdirs/{{hidden_file}}
    - ntype: c
    - major: 0
    - minor: 0
    - user: root
    - group: root
    - mode: 400
    - onlyif: 'test ! -e /var/lib/lxc/{{container}}/upperdirs/{{hidden_file}}'
{%- endfor %}

{%- for hidden_dir in hidden_dirs %}
{{container}}-create-{{hidden_dir}}:
  file.directory:
    - name: /var/lib/lxc/{{container}}/upperdirs/{{hidden_dir}}
    - makedirs: true
{{container}}-hide-{{hidden_dir}}:
  cmd.run:
    - name: 'setfattr -n trusted.overlay.opaque -v y "/var/lib/lxc/{{container}}/upperdirs/{{hidden_dir}}"'
{%- endfor %}
{%- endfor %}
{%- endif %}

start_lxc:
  service.running:
    - enable: true