2016-04-25 59 views
1

语境:我该如何模拟事实来测试一个在事实上做小数乘法的Puppet模板?

我有解决的,当它呈现的processors事实count子组件的傀儡模板。这一事实存在于我的所有客户身上。

事实的用例是在模板行中对其执行小数运算,例如:MyConfigVar=<%= 0.9 * @processors['count'] %>在某些.erb文件中。

我想:

  1. 让我的模板代码部署到生产主机。
  2. 为我的模板编写强大的单元测试,所以我可以确定它会正确渲染,给出事实的各种合理值。

我试了一下:

首先,我试图与印记:<%= 0.9 * @processors[:count] %>。如果我嘲笑,与rspec傀儡,像facts = { :processors => { :count => 10 } },我的测试全部通过。清单应用程序不起作用;它有一个“不能乘以nil”的错误。 Sigils显然已经出局了。

然后,我试着用粘滞键:<%= 0.9 * @processors['count'] %>。我用sigil(facts = { :processors => { :count => 10 } })进行的测试没有找到,但我的值已正确找到并与facts = { :processors => { 'count' => 10 } }相乘。所有的测试都通过了。但是,清单应用程序失败,出现Can't coerce String into Int失败。

然后,我试着用粘性值。该模板仍然读取<%= 0.9 * @processors['count'].to_i %>,我测试了字符串和整数值,例如

let(:facts) { :processors => { 'count' => '10' } } 
# tests with string value 
let(:facts) { :processors => { 'count' => 10 } } 
# tests with integer value 

测试全部通过,但明显呈现应用为0.0的事实值。

问题:

两个主要问题:

  1. 我怎样才能获得在线十进制数学与此(或任何)其实的工作,可靠的?
  2. 如何可靠地使用rspec-puppet或类似的模拟值进行单元测试与生产代表类型?

回答

1

这里有一些东西在玩。

正如Josh Souza所说,旧版本的Facter不支持散列或数组。因此,根据您使用的Puppet和Facter的版本,我会检查配置的值为stringify_facts。如果这设置为true(它将在较旧的Puppet上),那么事实将不会以散列形式出现,它们将被转换为清单中的字符串,从而导致无法分离的字符串(例如, modelsIntel(R) Core(TM) i7-2760QM CPU @ 2.40GHzcount1physicalcount1)。请注意0​​,在原始散列中应该是:count => 1

您可以在rspec-puppet> = 2.2的spec_helper中使用stringify_facts设置对此进行测试。

所以有一些遗留的事实不属于哈希的,如果你运行facter -p,你可以看到:

$ facter -p | grep processor 
processorcount => 8 
processors => {"count"=>8, "speed"=>"2.5 GHz"} 
sp_current_processor_speed => 2.5 GHz 
sp_number_processors => 4 

所以我建议使用$::processorcount事实上,这应该是一个整数,因为这是价值返回,但您可以使用to_i确保您的.erb模板中。我很确定它应该总是返回一个整数。

如果你感觉真的很勇敢,你可以创建一个函数的值转换为数字和使用,在你的清单(例如https://github.com/kwilczynski/puppet-functions/blob/master/lib/puppet/parser/functions/str2num.rb

所以你必须代码看起来像:

if (is_integer($::processorcount)) { 
    $processor_as_int = $::processorcount 
} else { 
    $processor_as_int = str2num($::processorcount) 
} 

总而言之,这是一个有点乱,你可以看到为什么在日伪4 we have a much tighter typing system!

1

对于它的价值,我做了一些调查,您的问题,在我的测试台的“处理器”事实上,运行facter processors当而散,实际上是一个字符串,一旦它使得其进入木偶/模板并且它没有任何分隔符(IE“modelsIntel(R)Core(TM)i7-2760QM CPU @ 2.40GHzcount1physicalcount1”是原始值)。我通过在我的ruby模板中使用'@ processors.class'来验证这一点,以及其他一些测试。我的测试平台运行Puppet 3.8.3和Facter 2.4.6,以防受到影响。

所以我提出的解决方案是:

  1. 使用@processorcount的事实,这将永远是一个整数,应该只是在你的单元测试印记罚款。
  2. 使用Facter直接在模板内(这是非常不puppety,但它的工作原理)

    • <%= Facter.value(:processors)['count'] %>
  3. 使用正则表达式的字符串解析(我不建议这样做,因为它是脆弱的,哈克,但它确实做的伎俩)

很可能在不同版本的Puppet/Facter中这不是问题,但希望这足以让您朝正确的方向滚动。

相关问题