在 chefSpec 中访问环境变量
Accessing environment variable in chefSpec
我正在尝试使用 ChefSpec 为我的食谱编写一些测试。
这是我要测试的一段代码:
file node[:storm][:job_dir] + node[:storm_work_gen][:jar_name] do
owner node[:storm][:user]
group node[:storm][:user]
action :delete
only_if { File.exist? node[:storm][:job_dir]+node[:storm_work_gen][:jar_name] }
end
此处 node[:storm_work_gen][:jar_name]
的值来自环境文件。我的 env 文件的内容是:
# coding: UTF-8
name 'sro_work_gen_dev'
description 'Sro Work Generator Environment for dev cluster'
override_attributes()
default_attributes(
storm_work_gen: {
cache_prop: {
expire_time: '30',
max_record_size: '100'
},
parallelism_hint: {
kafka_spout_brq_sfq_ph: '1',
kafka_spout_ftl_ph: '1',
data_marshaller_ph: '1',
data_processor_ph: '1',
item_lookup_ph: '1',
rule_applier_ph: '1',
worlist_writer_ph: '1'
},
num_workers: '2',
Topology_Name: 'WorkGen-tplgy-json-version',
Kafka_Zookeepers: '...',
Kafka_Broker: '...',
repo_url: '...',
jar_name: 'wlm-workgenerator-topology-0.0.1-SNAPSHOT.jar'
}
)
我的规格如下:
describe 'storm_wlm_deploy::_artifact' do
# let(:chef_run) { ChefSpec::SoloRunner.new.converge(described_recipe) }
let(:chef_run) do
ChefSpec::SoloRunner.new do |node|
env = Chef::Environment.new
env.name 'storm_work_gen'
allow(node).to receive(:chef_environment).and_return(env.name)
allow(Chef::Environment).to receive(:load).and_return(env)
end.converge(described_recipe)
end
it 'delete the jar:/opt/swlm/storm_jobs/wlm-workgenerator-topology-0.0.1-SNAPSHOT.jar if it exists' do
expect(chef_run).to delete_file('/opt/swlm/storm_jobs/wlm-workgenerator-topology-0.0.1-SNAPSHOT.jar')
end
end
规范失败并显示消息:
NoMethodError
-------------
undefined method `[]' for nil:NilClass
at line file node[:storm][:job_dir] + node[:storm_work_gen][:jar_name] do
我想知道如何在 chefSpec 运行时从环境文件中获取节点[:storm_work_gen][:jar_name]
您正在设置一个模拟环境,但实际上并没有告诉 Chef 将其用于任何事情。此外,您没有在其中放入任何数据。虽然它与文件中的环境同名,但两者没有任何关系。
对于那些正在寻找此解决方案但不清楚如何根据上述评论配置节点值的人,这里是基于上述示例的细分:
最初:
describe 'storm_wlm_deploy::_artifact' do
let(:chef_run) do
ChefSpec::SoloRunner.new do |node|
env = Chef::Environment.new
env.name 'storm_work_gen'
allow(node).to receive(:chef_environment).and_return(env.name)
allow(Chef::Environment).to receive(:load).and_return(env)
end.converge(described_recipe)
end
it 'delete the jar:/opt/swlm/storm_jobs/wlm-workgenerator-topology-0.0.1-SNAPSHOT.jar if it exists' do
expect(chef_run).to delete_file('/opt/swlm/storm_jobs/wlm-workgenerator-topology-0.0.1-SNAPSHOT.jar')
end
end
更新:
describe 'storm_wlm_deploy::_artifact' do
let(:chef_run) do
ChefSpec::SoloRunner.new do |node|
node.set[:storm_work_gen][:jar_name] = 'wlm-workgenerator-topology-0.0.1-SNAPSHOT.jar'
end.converge(described_recipe)
end
it 'delete the jar:/opt/swlm/storm_jobs/wlm-workgenerator-topology-0.0.1-SNAPSHOT.jar if it exists' do
expect(chef_run).to delete_file('/opt/swlm/storm_jobs/wlm-workgenerator-topology-0.0.1-SNAPSHOT.jar')
end
end
我正在尝试使用 ChefSpec 为我的食谱编写一些测试。
这是我要测试的一段代码:
file node[:storm][:job_dir] + node[:storm_work_gen][:jar_name] do
owner node[:storm][:user]
group node[:storm][:user]
action :delete
only_if { File.exist? node[:storm][:job_dir]+node[:storm_work_gen][:jar_name] }
end
此处 node[:storm_work_gen][:jar_name]
的值来自环境文件。我的 env 文件的内容是:
# coding: UTF-8
name 'sro_work_gen_dev'
description 'Sro Work Generator Environment for dev cluster'
override_attributes()
default_attributes(
storm_work_gen: {
cache_prop: {
expire_time: '30',
max_record_size: '100'
},
parallelism_hint: {
kafka_spout_brq_sfq_ph: '1',
kafka_spout_ftl_ph: '1',
data_marshaller_ph: '1',
data_processor_ph: '1',
item_lookup_ph: '1',
rule_applier_ph: '1',
worlist_writer_ph: '1'
},
num_workers: '2',
Topology_Name: 'WorkGen-tplgy-json-version',
Kafka_Zookeepers: '...',
Kafka_Broker: '...',
repo_url: '...',
jar_name: 'wlm-workgenerator-topology-0.0.1-SNAPSHOT.jar'
}
)
我的规格如下:
describe 'storm_wlm_deploy::_artifact' do
# let(:chef_run) { ChefSpec::SoloRunner.new.converge(described_recipe) }
let(:chef_run) do
ChefSpec::SoloRunner.new do |node|
env = Chef::Environment.new
env.name 'storm_work_gen'
allow(node).to receive(:chef_environment).and_return(env.name)
allow(Chef::Environment).to receive(:load).and_return(env)
end.converge(described_recipe)
end
it 'delete the jar:/opt/swlm/storm_jobs/wlm-workgenerator-topology-0.0.1-SNAPSHOT.jar if it exists' do
expect(chef_run).to delete_file('/opt/swlm/storm_jobs/wlm-workgenerator-topology-0.0.1-SNAPSHOT.jar')
end
end
规范失败并显示消息:
NoMethodError
-------------
undefined method `[]' for nil:NilClass
at line file node[:storm][:job_dir] + node[:storm_work_gen][:jar_name] do
我想知道如何在 chefSpec 运行时从环境文件中获取节点[:storm_work_gen][:jar_name]
您正在设置一个模拟环境,但实际上并没有告诉 Chef 将其用于任何事情。此外,您没有在其中放入任何数据。虽然它与文件中的环境同名,但两者没有任何关系。
对于那些正在寻找此解决方案但不清楚如何根据上述评论配置节点值的人,这里是基于上述示例的细分:
最初:
describe 'storm_wlm_deploy::_artifact' do
let(:chef_run) do
ChefSpec::SoloRunner.new do |node|
env = Chef::Environment.new
env.name 'storm_work_gen'
allow(node).to receive(:chef_environment).and_return(env.name)
allow(Chef::Environment).to receive(:load).and_return(env)
end.converge(described_recipe)
end
it 'delete the jar:/opt/swlm/storm_jobs/wlm-workgenerator-topology-0.0.1-SNAPSHOT.jar if it exists' do
expect(chef_run).to delete_file('/opt/swlm/storm_jobs/wlm-workgenerator-topology-0.0.1-SNAPSHOT.jar')
end
end
更新:
describe 'storm_wlm_deploy::_artifact' do
let(:chef_run) do
ChefSpec::SoloRunner.new do |node|
node.set[:storm_work_gen][:jar_name] = 'wlm-workgenerator-topology-0.0.1-SNAPSHOT.jar'
end.converge(described_recipe)
end
it 'delete the jar:/opt/swlm/storm_jobs/wlm-workgenerator-topology-0.0.1-SNAPSHOT.jar if it exists' do
expect(chef_run).to delete_file('/opt/swlm/storm_jobs/wlm-workgenerator-topology-0.0.1-SNAPSHOT.jar')
end
end