diff options
author | Thom May <thom@may.lt> | 2018-03-05 18:29:08 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-03-05 18:29:08 +0000 |
commit | 68ae89fc8cb7022ce29eba917d4578cfedfb7a79 (patch) | |
tree | efe38c4c2d8cefcdc3fa750ecddf228807bb891f | |
parent | 86a8e51cf16d87cbc57c2635324ab8a8a04a49d9 (diff) | |
parent | 34763d721029ec1c32010449195496711d1b576e (diff) | |
download | chef-68ae89fc8cb7022ce29eba917d4578cfedfb7a79.tar.gz |
Merge pull request #6927 from chef/jcowie/poise-hoist
Add attribute hoisting into core
-rw-r--r-- | lib/chef/policy_builder/policyfile.rb | 10 | ||||
-rw-r--r-- | spec/unit/policy_builder/policyfile_spec.rb | 76 |
2 files changed, 84 insertions, 2 deletions
diff --git a/lib/chef/policy_builder/policyfile.rb b/lib/chef/policy_builder/policyfile.rb index 545d36cb0e..e1293190f8 100644 --- a/lib/chef/policy_builder/policyfile.rb +++ b/lib/chef/policy_builder/policyfile.rb @@ -263,6 +263,16 @@ class Chef def apply_policyfile_attributes node.attributes.role_default = policy["default_attributes"] node.attributes.role_override = policy["override_attributes"] + hoist_policyfile_attributes(node.policy_group) if node.policy_group + end + + # @api private + # + # Hoists attributes from role_X[policy_group] up to the equivalent role_X level + def hoist_policyfile_attributes(policy_group) + Chef::Log.debug("Running attribute Hoist for group #{policy_group}") + Chef::Mixin::DeepMerge.hash_only_merge!(node.role_default, node.role_default[policy_group]) if node.role_default.include?(policy_group) + Chef::Mixin::DeepMerge.hash_only_merge!(node.role_override, node.role_override[policy_group]) if node.role_override.include?(policy_group) end # @api private diff --git a/spec/unit/policy_builder/policyfile_spec.rb b/spec/unit/policy_builder/policyfile_spec.rb index 466d0f970b..b8cf56750d 100644 --- a/spec/unit/policy_builder/policyfile_spec.rb +++ b/spec/unit/policy_builder/policyfile_spec.rb @@ -70,8 +70,44 @@ describe Chef::PolicyBuilder::Policyfile do } end - let(:policyfile_default_attributes) { { "policyfile_default_attr" => "policyfile_default_value" } } - let(:policyfile_override_attributes) { { "policyfile_override_attr" => "policyfile_override_value" } } + let(:policyfile_default_attributes) do + { + "policyfile_default_attr" => "policyfile_default_value", + "top_level_attr" => "hat", + "baseline_attr" => { + "one" => 1, + "two" => 2, + "deep" => { + "three" => 3, + "four" => [4], + "five" => [5], + }, + }, + "policy_group_value" => { + "baseline_attr" => { + "one" => 111, + }, + }, + } + end + + let(:policyfile_override_attributes) do + { + "policyfile_override_attr" => "policyfile_override_value", + "baseline_attr" => { + "deep" => { + "three" => 333 }, + }, + "policy_group_value" => { + "top_level_attr" => "cat", + "baseline_attr" => { + "deep" => { + "four" => [444], + }, + }, + }, + } + end let(:policyfile_run_list) { ["recipe[example1::default]", "recipe[example2::server]"] } @@ -636,6 +672,42 @@ describe Chef::PolicyBuilder::Policyfile do end end + + describe "hoisting attribute values" do + context "with no policy group set" do + it "does not hoist policy_group specific attributes" do + expect( node["top_level_attr"] ).to eql("hat") + expect( node["baseline_attr"]["one"] ).to eql(1) + expect( node["baseline_attr"]["two"] ).to eql(2) + expect( node["baseline_attr"]["deep"]["three"] ).to eql(333) + expect( node["baseline_attr"]["deep"]["four"] ).to eql([4]) + expect( node["baseline_attr"]["deep"]["five"] ).to eql([5]) + end + end + + context "with a policy group set" do + before do + Chef::Config[:policy_group] = "policy_group_value" + policy_builder.finish_load_node(node) + policy_builder.build_node + end + + it "hoists default attributes" do + expect( node["top_level_attr"] ).to eql("cat") + expect( node["baseline_attr"]["one"]).to eql(111) + expect( node["baseline_attr"]["two"] ).to eql(2) + expect( node["baseline_attr"]["deep"]["five"] ).to eql([5]) + end + + it "hoists override attributes" do + expect( node["top_level_attr"] ).to eql("cat") + expect( node["baseline_attr"]["two"] ).to eql(2) + expect( node["baseline_attr"]["deep"]["three"] ).to eql(333) + expect( node["baseline_attr"]["deep"]["four"] ).to eql([444]) + expect( node["baseline_attr"]["deep"]["five"] ).to eql([5]) + end + end + end end describe "fetching the desired cookbook set" do |