Используйте puppet gem для анализа файлов узлов и создания спецификаций для каждого хоста.

Я интегрирую тесты rspec-puppet в наш кукольный проект и пытаюсь автоматически сгенерировать "следует скомпилировать " спецификации для всех хостов (и в конечном итоге, возможно, другой ресурс). Это делается для того, чтобы все, по крайней мере, успешно скомпилировалось.

Учитывая список узлов, я могу сделать это:

hosts.each do |host|
  describe host, type: :host do
    it { should compile }
  end
end

Проблема в том, как на самом деле получить список хостов. Я могу использовать регулярное выражение для анализа файлов узлов, но это, очевидно, приводит к безумие... Поскольку гем puppet уже присутствует и используется для загрузки каталогов гемом rspec-puppet, могу ли я использовать его для получения списка хостов?

РЕДАКТИРОВАТЬ:

В конце концов мне удалось сделать это с помощью системы puppet pops но я не уверен, что это лучший способ сделать это или есть какая-то абстракция более высокого уровня, которую было бы проще использовать:

require 'spec_helper'
require 'puppet/pops'

code_dirs = [RSpec.configuration.module_path, RSpec.configuration.manifest_dir]
definitions =
    Dir["{#{code_dirs.join(',')}}/**/*.pp"].
        map {|file| Puppet::Pops::Parser::Parser.new.parse_file file}.
        flat_map {|parsed_manifest| parsed_manifest.definitions}

hosts = definitions.
    select {|definition| definition.is_a? Puppet::Pops::Model::NodeDefinition}.
    flat_map {|node_definition| node_definition.host_matches}.
    select {|host_match| host_match.is_a? Puppet::Pops::Model::LiteralString}.
    map {|string_host_match| string_host_match.value}

classes = definitions.
    select {|definition| definition.is_a? Puppet::Pops::Model::HostClassDefinition}.
    map {|host_class_definition| host_class_definition.name}

hosts.each do |host|
  describe host, type: :host do
    it {should compile}
  end
end

classes.each do |klass|
  describe klass, type: :class do
    it {should compile}
  end
end

person eirc    schedule 14.09.2017    source источник
comment
Это выходит за рамки модульного тестирования (rspec-puppet) и относится к области приемочного тестирования. Изучите Beaker и Test-Kitchen (рекомендуется) с поставщиками Serverspec (рекомендуется), Goss и Testinfra. Это будет намного легче для вас. Это также может подпадать под область тестирования дыма, если вы хотите меньше надежности, чем приемочное тестирование, что означает проверить octocatalog-diff. Это также было бы намного проще для вас.   -  person Matt Schuchard    schedule 14.09.2017
comment
Спасибо за рекомендации, я давно не занимался тестированием марионеток, и большинство из них не было в моем поле зрения. В конце концов я придумал схему, которая кажется приемлемой: я создал задачу rake smoke:generate с всплывающими окнами, как в опубликованном мной примере, чтобы создать простые файлы спецификаций should compile для каждого класса, хоста и определения в папке spec/smoke. По крайней мере, это должно помочь нам остановить коммит кода, который даже не компилируется. Я думаю, что octocatalog может помочь, как они упоминают, посмотреть, что нового в каталоге, прежде чем запускать его на реальных хостах. Интеграционные тесты с Beaker & Friends скоро появятся.   -  person eirc    schedule 15.09.2017
comment
Да, я думаю, что octocatalog-diff ближе всего к тому, что вы хотите, за исключением того, что они сделали это с идеей компиляции каталога, а не модуля. Тем не менее, его можно немного изменить только для модуля, и вы можете легко перебирать узлы с его помощью. Команда Github SRE использует несколько строк Ruby для распараллеливания своих тестов на всех узлах. Наконец, Кевин Паулис проделывает большую работу по его поддержке и развитию, так что вы знаете, что он будет поддерживаться.   -  person Matt Schuchard    schedule 15.09.2017


Ответы (1)


Взгляните на https://github.com/nwops/puppet-retrospec , который предоставляет синтаксический анализ манифестов и создание тестов по существующим модулям.

person David Schmitt    schedule 02.10.2017