2016-04-25 2 views
1

コンテキスト:ファクトを10進数乗算するパペットテンプレートをテストするためにファクトをモックできますか?

私はそれがレンダリングされるprocessors実際のcountサブコンポーネントを扱う人形テンプレートを持っています。その事実は私のすべてのクライアントに存在します。

事実のユースケースは、小数点演算を行うテンプレート行にあります。たとえば、.erbファイルの場合はMyConfigVar=<%= 0.9 * @processors['count'] %>です。

私がしたい:

  1. 私のテンプレートのコードは、生産宿主に配備取得します。
  2. 私のテンプレートのための堅牢な単体テストを書くので、事実のためのさまざまな妥当な値が与えられれば、正しくレンダリングされることを確信できます。

は、私が試したもの:

まず、私はシギルを試してみました:<%= 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などを使用して、ファクトリアの値を生産代理タイプで確実に単体テストできますか?
  3. 何が価値があるために

答えて

1

ここにはいくつかのことがあります。

Josh Souzaによると、古いバージョンのFacterではハッシュや配列をサポートしていませんでした。だから、PuppetとFacterのバージョンに応じて、私はstringify_factsの値を調べるでしょう。

これをtrueに設定した場合(これは古いパペットになります)、ファクトはハッシュとして出力されず、マニフェストの文字列にキャストされ、分離のないマッシュアップされた文字列になります。 modelsIntel(R) Core(TM) i7-2760QM CPU @ 2.40GHzcount1physicalcount1)。元のハッシュで:count => 1だったcount1に注意してください。

これは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事実を、使用することをお勧めしたいです値は返されますが、.erbテンプレートにはto_iを使用してください。私はそれが常に整数を返すべきであると確信しています。

あなたが本当に勇敢な感じている場合は、数値に値をキャストし、(たとえば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 "モデルIntel(R)Core(TM)i7-2760QM CPU @ 2.40GHzcount1物理量1"は生の値ではありません)が欠けています。私はこれを、Rubyテンプレートの '@ processors.class'と他のいくつかのテストを使って確認しました。私のテストベッドは影響を受けたものの場合、Puppet 3.8.3とFacter 2.4.6を実行しています。

だから私は提案できる解決策は以下のとおりです。

  1. 常に整数になりますし、あなたのユニットテストでシギルでうまく動作するはず@processorcountの事実を、使用してください。
  2. 使用(非常に非puppetyであるが、それは動作します)直接テンプレート内Facter

    • <%= Facter.value(:processors)['count'] %>
  3. 使用正規表現文字列の解析(それはだとして、私は、これはお勧めしません。 )壊れやすいとハックが、それはトリックを行うDOES

Puppet/Facterのさまざまなバージョンではこれは問題ではない可能性がありますが、うまくいけばこれで正しい方向に進むことができます。

関連する問題