summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLamont Granquist <lamont@scriptkiddie.org>2021-10-22 14:03:16 -0700
committerTim Smith <tsmith84@gmail.com>2021-10-27 12:38:25 -0700
commit4600606675d223f82a763ffd6f2df01e68c54f3f (patch)
tree87dbd9eb3ab566d078214f0db5326e1f22fb8cc7
parentd61840ae9c1d0e089e927b2761242bdf219e61cc (diff)
downloadchef-4600606675d223f82a763ffd6f2df01e68c54f3f.tar.gz
Fix reporting/data_collector for @recipe_filesreporting
When individual recipes are invoked like 'chef-client ./whatever.rb' those files get a cookbook_name of `@recipe_files` which is a magic value that nees to be handled specially to avoid the reporting classes from blowing up. Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
-rw-r--r--lib/chef/data_collector/run_end_message.rb2
-rw-r--r--lib/chef/resource.rb2
-rw-r--r--lib/chef/resource_reporter.rb2
-rw-r--r--spec/unit/data_collector_spec.rb25
-rw-r--r--spec/unit/resource_spec.rb5
5 files changed, 32 insertions, 4 deletions
diff --git a/lib/chef/data_collector/run_end_message.rb b/lib/chef/data_collector/run_end_message.rb
index 91cf21e643..48b1d55aff 100644
--- a/lib/chef/data_collector/run_end_message.rb
+++ b/lib/chef/data_collector/run_end_message.rb
@@ -128,7 +128,7 @@ class Chef
if new_resource.cookbook_name
hash["cookbook_name"] = new_resource.cookbook_name
- hash["cookbook_version"] = new_resource.cookbook_version.version
+ hash["cookbook_version"] = new_resource.cookbook_version&.version
hash["recipe_name"] = new_resource.recipe_name
end
diff --git a/lib/chef/resource.rb b/lib/chef/resource.rb
index 15fdd87c84..99ee1c3046 100644
--- a/lib/chef/resource.rb
+++ b/lib/chef/resource.rb
@@ -1513,7 +1513,7 @@ class Chef
# @return Chef::CookbookVersion The cookbook in which this Resource was defined.
#
def cookbook_version
- if cookbook_name
+ if cookbook_name && cookbook_name != "@recipe_files"
run_context.cookbook_collection[cookbook_name]
end
end
diff --git a/lib/chef/resource_reporter.rb b/lib/chef/resource_reporter.rb
index 4051ac2f49..5fb3d4eba4 100644
--- a/lib/chef/resource_reporter.rb
+++ b/lib/chef/resource_reporter.rb
@@ -41,7 +41,7 @@ class Chef
as_hash["result"] = action_record.action.to_s
if new_resource.cookbook_name
as_hash["cookbook_name"] = new_resource.cookbook_name
- as_hash["cookbook_version"] = new_resource.cookbook_version.version
+ as_hash["cookbook_version"] = new_resource.cookbook_version&.version
end
as_hash
diff --git a/spec/unit/data_collector_spec.rb b/spec/unit/data_collector_spec.rb
index 24f8807d2e..eb698d6661 100644
--- a/spec/unit/data_collector_spec.rb
+++ b/spec/unit/data_collector_spec.rb
@@ -164,7 +164,7 @@ describe Chef::DataCollector do
"after" => after_resource&.state_for_resource_reporter || {},
"before" => before_resource&.state_for_resource_reporter || {},
"cookbook_name" => cookbook_name,
- "cookbook_version" => cookbook_version.version,
+ "cookbook_version" => cookbook_version&.version,
"delta" => resource_has_diff(new_resource, status) ? new_resource.diff : "",
"duration" => duration,
"id" => new_resource.identity,
@@ -567,6 +567,29 @@ describe Chef::DataCollector do
it_behaves_like "sends a converge message"
end
+ context "when the run contains a file resource that is up-to-date from a @recipe_files, returns nil for the version" do
+ let(:total_resource_count) { 1 }
+ let(:updated_resource_count) { 0 }
+ let(:cookbook_name) { "@recipe_files" }
+ let(:resource_record) { [ resource_record_for(new_resource, current_resource, after_resource, :create, "up-to-date", "1234") ] }
+ let(:status) { "success" }
+ let(:cookbook_version) { nil }
+
+ before do
+ allow(new_resource).to receive(:cookbook_version).and_call_original
+ events.resource_action_start(new_resource, :create)
+ events.resource_current_state_loaded(new_resource, :create, current_resource)
+ events.resource_up_to_date(new_resource, :create)
+ events.resource_after_state_loaded(new_resource, :create, after_resource)
+ new_resource.instance_variable_set(:@elapsed_time, 1.2345)
+ events.resource_completed(new_resource)
+ events.converge_complete
+ run_status.stop_clock
+ end
+
+ it_behaves_like "sends a converge message"
+ end
+
context "when the run contains a file resource that is updated" do
let(:total_resource_count) { 1 }
let(:updated_resource_count) { 1 }
diff --git a/spec/unit/resource_spec.rb b/spec/unit/resource_spec.rb
index f7109cc680..b8c1a031e2 100644
--- a/spec/unit/resource_spec.rb
+++ b/spec/unit/resource_spec.rb
@@ -348,6 +348,11 @@ describe Chef::Resource do
it "should recognize dynamically defined resources" do
expect(resource.defined_at).to eq("dynamically defined")
end
+
+ it "should return nil for the cookbook_version when the cookbook_name is @recipe_files" do
+ resource.cookbook_name = "@recipe_files"
+ expect(resource.cookbook_version).to be nil
+ end
end
describe "to_s" do