dhall-diff: add new job
This change adds a new dhall-diff job to verify generated config is idempotent. Change-Id: I96a335dc78c4fa74564b854997433e5be0b5e633
This commit is contained in:
parent
0fdaf8d36b
commit
4903ecd30b
@ -2,6 +2,7 @@ General Purpose Jobs
|
|||||||
====================
|
====================
|
||||||
|
|
||||||
.. zuul:autojob:: dco-license
|
.. zuul:autojob:: dco-license
|
||||||
|
.. zuul:autojob:: dhall-diff
|
||||||
.. zuul:autojob:: unittests
|
.. zuul:autojob:: unittests
|
||||||
.. zuul:autojob:: markdownlint
|
.. zuul:autojob:: markdownlint
|
||||||
.. zuul:autojob:: multinode
|
.. zuul:autojob:: multinode
|
||||||
|
@ -15,6 +15,7 @@ General Purpose Roles
|
|||||||
.. zuul:autorole:: emit-job-header
|
.. zuul:autorole:: emit-job-header
|
||||||
.. zuul:autorole:: enable-netconsole
|
.. zuul:autorole:: enable-netconsole
|
||||||
.. zuul:autorole:: ensure-bazelisk
|
.. zuul:autorole:: ensure-bazelisk
|
||||||
|
.. zuul:autorole:: ensure-dhall
|
||||||
.. zuul:autorole:: ensure-dstat-graph
|
.. zuul:autorole:: ensure-dstat-graph
|
||||||
.. zuul:autorole:: ensure-markdownlint
|
.. zuul:autorole:: ensure-markdownlint
|
||||||
.. zuul:autorole:: fetch-markdownlint
|
.. zuul:autorole:: fetch-markdownlint
|
||||||
@ -33,6 +34,7 @@ General Purpose Roles
|
|||||||
.. zuul:autorole:: remove-build-sshkey
|
.. zuul:autorole:: remove-build-sshkey
|
||||||
.. zuul:autorole:: remove-gpgkey
|
.. zuul:autorole:: remove-gpgkey
|
||||||
.. zuul:autorole:: remove-sshkey
|
.. zuul:autorole:: remove-sshkey
|
||||||
|
.. zuul:autorole:: render-diff
|
||||||
.. zuul:autorole:: revoke-sudo
|
.. zuul:autorole:: revoke-sudo
|
||||||
.. zuul:autorole:: run-dstat
|
.. zuul:autorole:: run-dstat
|
||||||
.. zuul:autorole:: sign-artifacts
|
.. zuul:autorole:: sign-artifacts
|
||||||
|
3
playbooks/dhall/diff.yaml
Normal file
3
playbooks/dhall/diff.yaml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
- hosts: all
|
||||||
|
roles:
|
||||||
|
- render-diff
|
25
playbooks/dhall/prepare.yaml
Normal file
25
playbooks/dhall/prepare.yaml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
- hosts: all
|
||||||
|
tasks:
|
||||||
|
- name: Check for tools
|
||||||
|
command: type make git bzip2
|
||||||
|
failed_when: false
|
||||||
|
register: _tools
|
||||||
|
|
||||||
|
- name: Install tools
|
||||||
|
package:
|
||||||
|
name:
|
||||||
|
- git
|
||||||
|
- bzip2
|
||||||
|
- make
|
||||||
|
become: true
|
||||||
|
when: _tools.rc != 0
|
||||||
|
|
||||||
|
- name: Check for dhall command
|
||||||
|
command: type -p dhall-to-json
|
||||||
|
failed_when: false
|
||||||
|
register: _dhall_tools
|
||||||
|
|
||||||
|
- name: Install dhall
|
||||||
|
include_role:
|
||||||
|
name: ensure-dhall
|
||||||
|
when: _dhall_tools.rc != 0
|
10
roles/ensure-dhall/README.rst
Normal file
10
roles/ensure-dhall/README.rst
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
Ensure dhall is installed
|
||||||
|
|
||||||
|
Installs the specified version of the haskell implementation.
|
||||||
|
|
||||||
|
**Role Variables**
|
||||||
|
|
||||||
|
.. zuul:rolevar:: dhall_version
|
||||||
|
:default: 1.31.1
|
||||||
|
|
||||||
|
The dhall version.
|
9
roles/ensure-dhall/defaults/main.yaml
Normal file
9
roles/ensure-dhall/defaults/main.yaml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
dhall_version: 1.31.1
|
||||||
|
dhall_versions:
|
||||||
|
"1.31.1":
|
||||||
|
- url: https://github.com/dhall-lang/dhall-haskell/releases/download/1.31.1/dhall-1.31.1-x86_64-linux.tar.bz2
|
||||||
|
checksum: sha256:f8312727bbd4af74d183efce2e22f7b7807246a600fcc85600945f4790e4294a
|
||||||
|
- url: https://github.com/dhall-lang/dhall-haskell/releases/download/1.31.1/dhall-json-1.6.3-x86_64-linux.tar.bz2
|
||||||
|
checksum: sha256:7ec6b54f70f077d8876bb40633905f2a0a2c69e83a3ce0bd3d9f7577e1210489
|
||||||
|
- url: https://github.com/dhall-lang/dhall-haskell/releases/download/1.31.1/dhall-yaml-1.0.3-x86_64-linux.tar.bz2
|
||||||
|
checksum: sha256:04d95773f9e96340a29f2857a55fb718735b83596abacf1d7b9fa3f6004067cb
|
33
roles/ensure-dhall/tasks/main.yaml
Normal file
33
roles/ensure-dhall/tasks/main.yaml
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
- name: Create temp directory
|
||||||
|
tempfile:
|
||||||
|
state: directory
|
||||||
|
register: dhall_archive_tempdir
|
||||||
|
|
||||||
|
- name: Check requested version
|
||||||
|
fail:
|
||||||
|
msg: |
|
||||||
|
Unknown dhall version: {{ dhall_version }}.
|
||||||
|
It needs to be defined in {{ opendev_url }}/roles/ensure-dhall/defaults/main.yaml
|
||||||
|
when: dhall_versions[dhall_version] is not defined
|
||||||
|
vars:
|
||||||
|
opendev_url: https://opendev.org/zuul/zuul-jobs/src/branch/master/
|
||||||
|
|
||||||
|
- name: Download tools
|
||||||
|
get_url:
|
||||||
|
url: "{{ zj_dhall_tool_item.url }}"
|
||||||
|
dest: "{{ dhall_archive_tempdir.path }}/{{ zj_dhall_tool_item.url | basename }}"
|
||||||
|
checksum: "{{ zj_dhall_tool_item.checksum }}"
|
||||||
|
loop: "{{ dhall_versions[dhall_version] }}"
|
||||||
|
loop_control:
|
||||||
|
loop_var: zj_dhall_tool_item
|
||||||
|
|
||||||
|
- name: Unpack tools
|
||||||
|
command: "tar -xf {{ dhall_archive_tempdir.path }}/{{ zj_dhall_tool_item.url | basename }} --strip-components=2 -j --mode='a+x' -C /usr/local/bin"
|
||||||
|
become: yes
|
||||||
|
# ANSIBLE0006: Skip linting since it triggers on the "tar" command,
|
||||||
|
# but we prefer the command above
|
||||||
|
tags:
|
||||||
|
- skip_ansible_lint
|
||||||
|
loop: "{{ dhall_versions[dhall_version] }}"
|
||||||
|
loop_control:
|
||||||
|
loop_var: zj_dhall_tool_item
|
15
roles/render-diff/README.rst
Normal file
15
roles/render-diff/README.rst
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
Run render command and ensure there are no resulting differences.
|
||||||
|
|
||||||
|
Ensure that generated configuration files are idempotent.
|
||||||
|
|
||||||
|
**Role Variables**
|
||||||
|
|
||||||
|
.. zuul:jobvar:: render_command
|
||||||
|
:default: make
|
||||||
|
|
||||||
|
The command that render the configuration files.
|
||||||
|
|
||||||
|
.. zuul:rolevar:: zuul_work_dir
|
||||||
|
:default: {{ zuul.project.src_dir }}
|
||||||
|
|
||||||
|
Directory to run the render command in.
|
4
roles/render-diff/defaults/main.yaml
Normal file
4
roles/render-diff/defaults/main.yaml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
render_command: make
|
||||||
|
|
||||||
|
zuul_work_dir: "{{ zuul.project.src_dir }}"
|
||||||
|
diff_ignore_errors: false
|
38
roles/render-diff/tasks/main.yaml
Normal file
38
roles/render-diff/tasks/main.yaml
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
- name: "Run render command: {{ render_command }}"
|
||||||
|
command: "{{ render_command }}"
|
||||||
|
args:
|
||||||
|
chdir: "{{ zuul_work_dir }}"
|
||||||
|
|
||||||
|
- name: Check for diff
|
||||||
|
command: git diff
|
||||||
|
args:
|
||||||
|
chdir: "{{ zuul_work_dir }}"
|
||||||
|
register: render_diff
|
||||||
|
# ANSIBLE0006: Skip linting since it triggers on the "git" command,
|
||||||
|
# but diff is not supported by ansible git module.
|
||||||
|
tags:
|
||||||
|
- skip_ansible_lint
|
||||||
|
|
||||||
|
- name: Abort on diff
|
||||||
|
when:
|
||||||
|
- render_diff.stdout
|
||||||
|
- not diff_ignore_errors
|
||||||
|
failed_when: true
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
The repository content is not consistent.
|
||||||
|
Please run `{{ render_command }}` before `git commit`
|
||||||
|
|
||||||
|
{% if render_diff.stdout | regex_search('^-') %}
|
||||||
|
You commited change in a configuration file without using the equivalent source file.
|
||||||
|
Please update the source file first and run {{ render_command }}.
|
||||||
|
|
||||||
|
{% else %}
|
||||||
|
You commited change in a file without running make.
|
||||||
|
Please run `{{ render_command }}` before `git commit`.
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
The difference is:
|
||||||
|
|
||||||
|
{{ git_diff.stdout }}
|
23
test-playbooks/dhall/setup-project.yaml
Normal file
23
test-playbooks/dhall/setup-project.yaml
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
- hosts: all
|
||||||
|
tasks:
|
||||||
|
- name: Setup files
|
||||||
|
copy:
|
||||||
|
content: "{{ item.content }}"
|
||||||
|
dest: "{{ zuul.project.src_dir }}/{{ item.dest }}"
|
||||||
|
loop:
|
||||||
|
- content: "all:\n\tdhall-to-yaml < test.dhall > test.yaml"
|
||||||
|
dest: Makefile
|
||||||
|
- content: "21 + 21"
|
||||||
|
dest: test.dhall
|
||||||
|
- content: "42\n"
|
||||||
|
dest: test.yaml
|
||||||
|
|
||||||
|
- name: Commit changes
|
||||||
|
shell: |
|
||||||
|
if ! test -f ~/.gitconfig && ! test -d ~/.config/git ; then
|
||||||
|
git config --global user.email "you@example.com"
|
||||||
|
git config --global user.name "Your Name"
|
||||||
|
fi
|
||||||
|
git add Makefile test.dhall test.yaml && git commit -m "test content"
|
||||||
|
args:
|
||||||
|
chdir: "{{ zuul.project.src_dir }}"
|
31
test-playbooks/dhall/test-dhall-diff.yaml
Normal file
31
test-playbooks/dhall/test-dhall-diff.yaml
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
- hosts: all
|
||||||
|
tasks:
|
||||||
|
- name: Success dhall-diff
|
||||||
|
include_role:
|
||||||
|
name: render-diff
|
||||||
|
|
||||||
|
- name: Ensure dhall-diff succeeded
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- render_diff.stdout == ''
|
||||||
|
|
||||||
|
- name: Introduce a difference
|
||||||
|
copy:
|
||||||
|
content: "44"
|
||||||
|
dest: "{{ zuul.project.src_dir }}/test.yaml"
|
||||||
|
|
||||||
|
- name: Commit the difference
|
||||||
|
command: git commit -a -m "test update"
|
||||||
|
args:
|
||||||
|
chdir: "{{ zuul.project.src_dir }}"
|
||||||
|
|
||||||
|
- name: Failed dhall-diff
|
||||||
|
include_role:
|
||||||
|
name: render-diff
|
||||||
|
vars:
|
||||||
|
diff_ignore_errors: yes
|
||||||
|
|
||||||
|
- name: Ensure dhall-diff failed
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- render_diff.stdout != ''
|
17
zuul-tests.d/dhall.yaml
Normal file
17
zuul-tests.d/dhall.yaml
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
- job:
|
||||||
|
name: zuul-jobs-test-dhall-diff
|
||||||
|
description: Test the dhall-diff job and roles
|
||||||
|
parent: dhall-diff
|
||||||
|
files:
|
||||||
|
- playbooks/dhall/.*
|
||||||
|
- roles/ensure-dhall/.*
|
||||||
|
- roles/render-diff/.*
|
||||||
|
pre-run: test-playbooks/dhall/setup-project.yaml
|
||||||
|
run: test-playbooks/dhall/test-dhall-diff.yaml
|
||||||
|
|
||||||
|
- project:
|
||||||
|
check:
|
||||||
|
jobs: &id001
|
||||||
|
- zuul-jobs-test-dhall-diff
|
||||||
|
gate:
|
||||||
|
jobs: *id001
|
@ -93,3 +93,24 @@
|
|||||||
Override the default searching above with explicit
|
Override the default searching above with explicit
|
||||||
domain/path references (see validate-zone-db role)
|
domain/path references (see validate-zone-db role)
|
||||||
run: playbooks/validate-zone-db/run.yaml
|
run: playbooks/validate-zone-db/run.yaml
|
||||||
|
|
||||||
|
- job:
|
||||||
|
name: dhall-diff
|
||||||
|
description: |
|
||||||
|
Ensure that generated configuration files are idempotent.
|
||||||
|
|
||||||
|
This job runs a render command and check that no files are
|
||||||
|
modified.
|
||||||
|
|
||||||
|
.. zuul:jobvar:: dhall_render_command
|
||||||
|
:default: make
|
||||||
|
|
||||||
|
The command that render the configuration files.
|
||||||
|
|
||||||
|
.. zuul:jobvar:: dhall_version
|
||||||
|
:default: 1.31.1
|
||||||
|
|
||||||
|
The dhall version.
|
||||||
|
|
||||||
|
pre-run: playbooks/dhall/prepare.yaml
|
||||||
|
run: playbooks/dhall/diff.yaml
|
||||||
|
Loading…
Reference in New Issue
Block a user