在 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