我如何模拟事实来测试对事实进行十进制乘法的Puppet模板?

时间:2016-04-25 21:49:59

标签: rspec type-conversion puppet facter rspec-puppet

上下文

我有一个木偶模板,可以在渲染时解决count事实的processors子组件。这个事实存在于我的所有客户身上。

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

我想:

  1. 将我的模板化代码部署到生产主机。
  2. 为我的模板编写健壮的单元测试,因此我可以确定它会正确呈现,给出了各种合理的事实值。
  3. 我尝试过的事情:

    首先,我尝试使用sigils:<%= 0.9 * @processors[:count] %>。如果我用rspec-puppet嘲笑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失败而失败。

    然后,我尝试使用stringy值。模板仍然读取<%= 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或类似的模拟值在生产代表类型中进行可靠的单元测试?

2 个答案:

答案 0 :(得分:1)

为了它的价值,我对你的问题做了一些调查,并在我的测试床上对处理器进行了调查。事实上,虽然运行facter processors时的哈希值实际上是一个字符串,一旦它进入Puppet / templates并且它没有任何分隔符(IE&#34; modelsIntel(R)Core(TM)i7-2760QM CPU @ 2.40GHzcount1physicalcount1&#34;是原始值)。我通过使用&#39; @ processors.class&#39;来验证了这一点。在我的ruby模板中,以及其他一些测试确定。我的测试平台运行Puppet 3.8.3和Facter 2.4.6,以防万一。

所以我建议的解决方案是:

  1. 使用@processorcount事实,它始终是一个整数,在单元测试中应该可以正常工作。
  2. 直接在模板中使用Facter(非常非傀儡,但它有效)

    • <%= Facter.value(:processors)['count'] %>
  3. 使用正则表达式字符串解析(我不推荐这个,因为它很脆弱,但是它可以做到这一点)

    • count=@processors.dup.gsub!(/physicalcount/,'physical').gsub!(/.*count([0-9])+.*/,'\1')
  4. 很有可能在不同版本的Puppet / Facter中这不是一个问题,但希望这足以让你朝着正确的方向前进。

答案 1 :(得分:1)

这里有一些事情在发挥作用。

正如Josh Souza所说,旧版本的Facter不支持哈希或数组。因此,根据你使用的Puppet和Facter的版本,我会检查stringify_facts config的值是什么。

如果将此设置为true(它将在较旧的Puppet上),则事实不会以哈希形式出现,它们会被转换为清单中的字符串,从而导致没有分离的混合字符串(例如。{ {1}})。请注意modelsIntel(R) Core(TM) i7-2760QM CPU @ 2.40GHzcount1physicalcount1,原始哈希中的count1

您可以使用rspec-puppet中的spec_helper中的:count => 1设置&gt; = 2.2进行测试。

因此,如果您运行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 1}}模板。我很确定它应该总是返回一个整数。

如果您感觉非常勇敢,可以创建一个函数将值转换为数字并在清单中使用它(例如https://github.com/kwilczynski/puppet-functions/blob/master/lib/puppet/parser/functions/str2num.rb

所以你的代码看起来像是:

.erb

总而言之,它有点凌乱,你可以在Puppet 4中看到原因we have a much tighter typing system!