ChefSpec и для циклов с динамическими атрибутами
У меня есть очень неортодоксальный код Chef, для которого мне нужно написать модульный тест, и я не могу найти способ правильно это сделать.
К сожалению, из-за структуры файла среды все эти циклы 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 или примерах, не помогает.
Кто-нибудь здесь более осведомлен в этой области?
Спасибо!
1 ответ
Там нет ничего особенного, просто настройте бегун с некоторыми атрибутами узла, а затем проверьте правильность hostsfile_entry
Ресурсы (it { expect(chef_run).to create_hostsfile_entry('asdf') }
, так далее).