From e441d37d36eedbd73b37166f982536b8702ff4fb Mon Sep 17 00:00:00 2001 From: danielsdeleo Date: Mon, 14 Sep 2015 17:25:56 -0700 Subject: Set the precedence of policyfile attrs and propagate them everywhere --- lib/chef/policy_builder/policyfile.rb | 43 ++++++++ spec/unit/policy_builder/policyfile_spec.rb | 158 ++++++++++++++++++++++++++++ 2 files changed, 201 insertions(+) diff --git a/lib/chef/policy_builder/policyfile.rb b/lib/chef/policy_builder/policyfile.rb index 5bcdd5f52f..ef3b7838cb 100644 --- a/lib/chef/policy_builder/policyfile.rb +++ b/lib/chef/policy_builder/policyfile.rb @@ -114,6 +114,7 @@ class Chef def finish_load_node(node) @node = node + select_policy_name_and_group validate_policyfile events.policyfile_loaded(policy) end @@ -295,6 +296,48 @@ class Chef Chef::Config[:policy_name] end + def select_policy_name_and_group + policy_name_to_set = + policy_name_from_json_attribs || + policy_name_from_config || + policy_name_from_node + + policy_group_to_set = + policy_group_from_json_attribs || + policy_group_from_config || + policy_group_from_node + + node.policy_name = policy_name_to_set + node.policy_group = policy_group_to_set + + Chef::Config[:policy_name] = policy_name_to_set + Chef::Config[:policy_group] = policy_group_to_set + end + + def policy_group_from_json_attribs + json_attribs["policy_group"] + end + + def policy_name_from_json_attribs + json_attribs["policy_name"] + end + + def policy_group_from_config + Chef::Config[:policy_group] + end + + def policy_name_from_config + Chef::Config[:policy_name] + end + + def policy_group_from_node + node.policy_group + end + + def policy_name_from_node + node.policy_name + end + # Builds a 'cookbook_hash' map of the form # "COOKBOOK_NAME" => "IDENTIFIER" # diff --git a/spec/unit/policy_builder/policyfile_spec.rb b/spec/unit/policy_builder/policyfile_spec.rb index 82ca1a2bb3..da14222339 100644 --- a/spec/unit/policy_builder/policyfile_spec.rb +++ b/spec/unit/policy_builder/policyfile_spec.rb @@ -330,11 +330,169 @@ describe Chef::PolicyBuilder::Policyfile do describe "building the node object" do + let(:extra_chef_config) { {} } + before do + # must be set before #build_node is called to have the proper effect + extra_chef_config.each do |key, value| + Chef::Config[key] = value + end + policy_builder.finish_load_node(node) policy_builder.build_node end + # it sets policy_name and policy_group in the following priority order: + # -j JSON > config file > node object + + describe "selecting policy_name and policy_group from the various sources" do + + context "when only set in node JSON" do + + let(:json_attribs) do + { + "policy_name" => "policy_name_from_node_json", + "policy_group" => "policy_group_from_node_json" + } + end + + it "sets policy_name and policy_group on Chef::Config" do + expect(Chef::Config[:policy_name]).to eq("policy_name_from_node_json") + expect(Chef::Config[:policy_group]).to eq("policy_group_from_node_json") + end + + it "sets policy_name and policy_group on the node object" do + expect(node.policy_name).to eq("policy_name_from_node_json") + expect(node.policy_group).to eq("policy_group_from_node_json") + end + + end + + context "when only set in Chef::Config" do + + let(:extra_chef_config) do + { + policy_name: "policy_name_from_config", + policy_group: "policy_group_from_config" + } + end + + it "sets policy_name and policy_group on the node object" do + expect(node.policy_name).to eq("policy_name_from_config") + expect(node.policy_group).to eq("policy_group_from_config") + end + + end + + context "when only set on the node" do + + let(:node) do + node = Chef::Node.new + node.name(node_name) + node.policy_name = "policy_name_from_node" + node.policy_group = "policy_group_from_node" + node + end + + it "sets policy_name and policy_group on Chef::Config" do + expect(Chef::Config[:policy_name]).to eq("policy_name_from_node") + expect(Chef::Config[:policy_group]).to eq("policy_group_from_node") + end + + end + + context "when set in Chef::Config and the fetched node" do + + let(:node) do + node = Chef::Node.new + node.name(node_name) + node.policy_name = "policy_name_from_node" + node.policy_group = "policy_group_from_node" + node + end + + let(:extra_chef_config) do + { + policy_name: "policy_name_from_config", + policy_group: "policy_group_from_config" + } + end + + it "prefers the policy_name and policy_group from Chef::Config" do + expect(node.policy_name).to eq("policy_name_from_config") + expect(node.policy_group).to eq("policy_group_from_config") + end + + end + + context "when set in node json and the fetched node" do + + let(:json_attribs) do + { + "policy_name" => "policy_name_from_node_json", + "policy_group" => "policy_group_from_node_json" + } + end + + let(:node) do + node = Chef::Node.new + node.name(node_name) + node.policy_name = "policy_name_from_node" + node.policy_group = "policy_group_from_node" + node + end + + + it "prefers the policy_name and policy_group from the node json" do + expect(policy_builder.policy_name).to eq("policy_name_from_node_json") + expect(policy_builder.policy_group).to eq("policy_group_from_node_json") + + expect(Chef::Config[:policy_name]).to eq("policy_name_from_node_json") + expect(Chef::Config[:policy_group]).to eq("policy_group_from_node_json") + expect(node.policy_name).to eq("policy_name_from_node_json") + expect(node.policy_group).to eq("policy_group_from_node_json") + end + + end + + context "when set in all sources" do + + let(:json_attribs) do + { + "policy_name" => "policy_name_from_node_json", + "policy_group" => "policy_group_from_node_json" + } + end + + let(:node) do + node = Chef::Node.new + node.name(node_name) + node.policy_name = "policy_name_from_node" + node.policy_group = "policy_group_from_node" + node + end + + let(:extra_chef_config) do + { + policy_name: "policy_name_from_config", + policy_group: "policy_group_from_config" + } + end + + it "prefers the policy_name and group from node json" do + expect(policy_builder.policy_name).to eq("policy_name_from_node_json") + expect(policy_builder.policy_group).to eq("policy_group_from_node_json") + + expect(Chef::Config[:policy_name]).to eq("policy_name_from_node_json") + expect(Chef::Config[:policy_group]).to eq("policy_group_from_node_json") + expect(node.policy_name).to eq("policy_name_from_node_json") + expect(node.policy_group).to eq("policy_group_from_node_json") + end + + end + + end + it "resets default and override data" do expect(node["default_key"]).to be_nil expect(node["override_key"]).to be_nil -- cgit v1.2.1