diff --git a/rabbitmq/_mapdata/_mapdata.jinja b/rabbitmq/_mapdata/_mapdata.jinja index ad54eaad..aa9649cf 100644 --- a/rabbitmq/_mapdata/_mapdata.jinja +++ b/rabbitmq/_mapdata/_mapdata.jinja @@ -1,9 +1,9 @@ # yamllint disable rule:indentation rule:line-length -# {{ grains.get('osfinger', grains.os) }} +# {{ grains.get("osfinger", grains.os) }} --- {#- use salt.slsutil.serialize to avoid encoding errors on some platforms #} -{{ salt['slsutil.serialize']( - 'yaml', +{{ salt["slsutil.serialize"]( + "yaml", map, default_flow_style=False, allow_unicode=True, diff --git a/rabbitmq/_mapdata/init.sls b/rabbitmq/_mapdata/init.sls index f3198d72..9fa34ee3 100644 --- a/rabbitmq/_mapdata/init.sls +++ b/rabbitmq/_mapdata/init.sls @@ -2,13 +2,18 @@ # vim: ft=sls --- {#- Get the `tplroot` from `tpldir` #} -{%- set tplroot = tpldir.split('/')[0] %} -{%- from tplroot ~ "/package-map.jinja" import pkgs as mapdata with context %} +{%- set tplroot = tpldir.split("/")[0] %} +{%- from tplroot ~ "/package-map.jinja" import pkgs with context %} -{%- do salt['log.debug']('### MAP.JINJA DUMP ###\n' ~ mapdata | yaml(False)) %} +{%- set _mapdata = { + "values": { + "pkgs": pkgs, + } + } %} +{%- do salt["log.debug"]("### MAP.JINJA DUMP ###\n" ~ _mapdata | yaml(False)) %} -{%- set output_dir = '/temp' if grains.os_family == 'Windows' else '/tmp' %} -{%- set output_file = output_dir ~ '/salt_mapdata_dump.yaml' %} +{%- set output_dir = "/temp" if grains.os_family == "Windows" else "/tmp" %} +{%- set output_file = output_dir ~ "/salt_mapdata_dump.yaml" %} {{ tplroot }}-mapdata-dump: file.managed: @@ -16,4 +21,4 @@ - source: salt://{{ tplroot }}/_mapdata/_mapdata.jinja - template: jinja - context: - map: {{ mapdata | yaml }} + map: {{ _mapdata | yaml }} diff --git a/test/integration/default/controls/_mapdata_spec.rb b/test/integration/default/controls/_mapdata_spec.rb index 2cced0a4..64635323 100644 --- a/test/integration/default/controls/_mapdata_spec.rb +++ b/test/integration/default/controls/_mapdata_spec.rb @@ -5,19 +5,43 @@ control '`map.jinja` YAML dump' do title 'should match the comparison file' - # Strip the `platform[:finger]` version number down to the "OS major release" - mapdata_file = "_mapdata/#{system.platform[:finger].split('.').first}.yaml" + ### Method + # The steps below for each file appear convoluted but they are both required + # and similar in nature: + # 1. The earliest method was to simply compare the files textually but this often + # led to false positives due to inconsistencies (e.g. spacing, ordering) + # 2. The next method was to load the files back into YAML structures and then + # compare but InSpec provided block diffs this way, unusable by end users + # 3. The final step was to dump the YAML structures back into a string to use + # for the comparison; this both worked and provided human-friendly diffs - # Load the mapdata from profile https://docs.chef.io/inspec/profiles/#profile-files - mapdata_dump = YAML.safe_load(inspec.profile.file(mapdata_file)) + ### Comparison file for the specific platform + ### Static, adjusted as part of code contributions, as map data is changed + # Strip the `platform[:finger]` version number down to the "OS major release" + platform_finger = system.platform[:finger].split('.').first.to_s + # Use that to set the path to the file (relative to the InSpec suite directory) + mapdata_file_path = "_mapdata/#{platform_finger}.yaml" + # Load the mapdata from profile, into a YAML structure + # https://docs.chef.io/inspec/profiles/#profile-files + mapdata_file_yaml = YAML.safe_load(inspec.profile.file(mapdata_file_path)) + # Dump the YAML back into a string for comparison + mapdata_file_dump = YAML.dump(mapdata_file_yaml) - # Derive the location of the dumped mapdata + ### Output file produced by running the `_mapdata` state + ### Dynamic, generated during Kitchen's `converge` phase + # Derive the location of the dumped mapdata (differs for Windows) output_dir = platform[:family] == 'windows' ? '/temp' : '/tmp' - output_file = "#{output_dir}/salt_mapdata_dump.yaml" + # Use that to set the path to the file (absolute path, i.e. within the container) + output_file_path = "#{output_dir}/salt_mapdata_dump.yaml" + # Load the output into a YAML structure using InSpec's `yaml` resource + # https://github.com/inspec/inspec/blob/49b7d10/lib/inspec/resources/yaml.rb#L29 + output_file_yaml = yaml(output_file_path).params + # Dump the YAML back into a string for comparison + output_file_dump = YAML.dump(output_file_yaml) describe 'File content' do it 'should match profile map data exactly' do - expect(yaml(output_file).params).to eq(mapdata_dump) + expect(output_file_dump).to eq(mapdata_file_dump) end end end diff --git a/test/integration/default/files/_mapdata/centos-7.yaml b/test/integration/default/files/_mapdata/centos-7.yaml index 4dcf1f95..ffbec897 100644 --- a/test/integration/default/files/_mapdata/centos-7.yaml +++ b/test/integration/default/files/_mapdata/centos-7.yaml @@ -1,4 +1,6 @@ # yamllint disable rule:indentation rule:line-length # CentOS Linux-7 --- -rabbitmq-server: rabbitmq-server +values: + pkgs: + rabbitmq-server: rabbitmq-server diff --git a/test/integration/default/files/_mapdata/centos-8.yaml b/test/integration/default/files/_mapdata/centos-8.yaml index 241a6a5a..adf95373 100644 --- a/test/integration/default/files/_mapdata/centos-8.yaml +++ b/test/integration/default/files/_mapdata/centos-8.yaml @@ -1,4 +1,6 @@ # yamllint disable rule:indentation rule:line-length # CentOS Linux-8 --- -rabbitmq-server: rabbitmq-server +values: + pkgs: + rabbitmq-server: rabbitmq-server diff --git a/test/integration/default/files/_mapdata/debian-10.yaml b/test/integration/default/files/_mapdata/debian-10.yaml index f6e3d63e..f003ed4e 100644 --- a/test/integration/default/files/_mapdata/debian-10.yaml +++ b/test/integration/default/files/_mapdata/debian-10.yaml @@ -1,4 +1,6 @@ # yamllint disable rule:indentation rule:line-length # Debian-10 --- -rabbitmq-server: rabbitmq-server +values: + pkgs: + rabbitmq-server: rabbitmq-server diff --git a/test/integration/default/files/_mapdata/debian-9.yaml b/test/integration/default/files/_mapdata/debian-9.yaml index d969ee57..330f0a24 100644 --- a/test/integration/default/files/_mapdata/debian-9.yaml +++ b/test/integration/default/files/_mapdata/debian-9.yaml @@ -1,4 +1,6 @@ # yamllint disable rule:indentation rule:line-length # Debian-9 --- -rabbitmq-server: rabbitmq-server +values: + pkgs: + rabbitmq-server: rabbitmq-server diff --git a/test/integration/default/files/_mapdata/fedora-30.yaml b/test/integration/default/files/_mapdata/fedora-30.yaml index e3ed02c7..bbd8ebc7 100644 --- a/test/integration/default/files/_mapdata/fedora-30.yaml +++ b/test/integration/default/files/_mapdata/fedora-30.yaml @@ -1,4 +1,6 @@ # yamllint disable rule:indentation rule:line-length # Fedora-30 --- -rabbitmq-server: rabbitmq-server +values: + pkgs: + rabbitmq-server: rabbitmq-server diff --git a/test/integration/default/files/_mapdata/fedora-31.yaml b/test/integration/default/files/_mapdata/fedora-31.yaml index 2ff65973..c13b9210 100644 --- a/test/integration/default/files/_mapdata/fedora-31.yaml +++ b/test/integration/default/files/_mapdata/fedora-31.yaml @@ -1,4 +1,6 @@ # yamllint disable rule:indentation rule:line-length # Fedora-31 --- -rabbitmq-server: rabbitmq-server +values: + pkgs: + rabbitmq-server: rabbitmq-server diff --git a/test/integration/default/files/_mapdata/opensuse-15.yaml b/test/integration/default/files/_mapdata/opensuse-15.yaml index 4d4484b3..45634cf0 100644 --- a/test/integration/default/files/_mapdata/opensuse-15.yaml +++ b/test/integration/default/files/_mapdata/opensuse-15.yaml @@ -1,4 +1,6 @@ # yamllint disable rule:indentation rule:line-length # Leap-15 --- -rabbitmq-server: rabbitmq-server +values: + pkgs: + rabbitmq-server: rabbitmq-server diff --git a/test/integration/default/files/_mapdata/ubuntu-16.yaml b/test/integration/default/files/_mapdata/ubuntu-16.yaml index 7ea62cb4..c54f4922 100644 --- a/test/integration/default/files/_mapdata/ubuntu-16.yaml +++ b/test/integration/default/files/_mapdata/ubuntu-16.yaml @@ -1,4 +1,6 @@ # yamllint disable rule:indentation rule:line-length # Ubuntu-16.04 --- -rabbitmq-server: rabbitmq-server +values: + pkgs: + rabbitmq-server: rabbitmq-server diff --git a/test/integration/default/files/_mapdata/ubuntu-18.yaml b/test/integration/default/files/_mapdata/ubuntu-18.yaml index 8b271229..27b2072e 100644 --- a/test/integration/default/files/_mapdata/ubuntu-18.yaml +++ b/test/integration/default/files/_mapdata/ubuntu-18.yaml @@ -1,4 +1,6 @@ # yamllint disable rule:indentation rule:line-length # Ubuntu-18.04 --- -rabbitmq-server: rabbitmq-server +values: + pkgs: + rabbitmq-server: rabbitmq-server