2017-12-11 15 views
0

私は単体テストを書く必要がある非常に非正統なシェフコードを持っていますが、正しく実行する方法がわかりません。ChefSpecと動的属性のループ

残念なことに、環境ファイルの構造のために、これらのforループはすべて以下のように必要です。それに書かれた料理の数十が既に存在しているように、環境ファイルが対処することはできません

コードは基本的に次のようになります。

# Redis Sentinel information 
node['os_setup']['zones'].each do |_zone| 
    _zone['nodes'].each do |_node| 
    if _node['nodename'] =~ /mpredis/i #is it a redis node? 
     node['db']['redis_sentinels'] << _node['hostname'] 
    end 
    end 
end 

# generate /etc/hosts entries for Redis Sentinels 
node['db']['redis_sentinels'].each do |_hostname| 
    # add entry for INTERSITE network 
    hostsfile_entry findIPfrom_host(_hostname, 'REDIS') do 
    hostname "#{_hostname}.#{node['domain']}" 
    aliases [_hostname] 
    unique true 
    comment "appended by recipe[#{cookbook_name}::#{recipe_name}]" 
    action :create 
    end 

    # add entry for TRAFFIC network 
    hostsfile_entry findIPfrom_host(_hostname, 'TRAFFIC') do 
    hostname "#{_hostname}db.#{node['domain']}" 
    aliases ["#{_hostname}db"] 
    unique true 
    comment "appended by recipe[#{cookbook_name}::#{recipe_name}]" 
    action :create 
    end 
end 

findIPfrom_host()機能が異なる料理から図書館で見つけ、それが見えていますこのように:

def getIPfrom_host(hostname, interface) 
    ip_addr = nil 
    node['os_setup']['zones'].each do |_zone| 
    _zone['nodes'].each do |_node| 
     if _node['hostname'] == hostname 
     _node['interfaces'].each do |_nic| 
      if _nic['device'] == node['interface_definitions'][interface.upcase] 
      ip_addr = _nic['ipaddress'] 
      end 
     end 
     end 
    end 
    end 
    return ip_addr 
end 

私は完全にこれに固執しています。 ChefSpecのマニュアルや例で見つけられるものはありません。

ここに詳しい人はいますか?

ありがとうございます!

答えて

0

特別なことは何もありません。いくつかのノード属性を持つランナーを設定し、正しいhostsfile_entryリソース(it { expect(chef_run).to create_hostsfile_entry('asdf') }など)を確認するだけです。

関連する問題