我正在我们的Puppet项目中集成RSPEC-PUPPET测试,并且我正在尝试自动生成"应该为所有主机编译"规格(最终可能是其他资源)。这是为了确保一切至少成功编译。
给定节点列表,我可以用:
来完成此操作。hosts.each do |host|
describe host, type: :host do
it { should compile }
end
end
问题是如何实际获取主机列表。我可以使用Regex来解析节点文件,但这显然会导致精神错乱...由于Puppet Gem已经存在并用于通过RSPEC-PUPPET GEM加载目录,所以我可以使用它来获取主机列表吗?
编辑:
我最终使用了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
可以查看https://github.com/nwops/puppet-retrospec,它提供了解析表现和对现有模块的模板测试。