summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordanielsdeleo <dan@chef.io>2015-09-14 17:25:56 -0700
committerdanielsdeleo <dan@chef.io>2015-09-17 14:29:49 -0700
commite441d37d36eedbd73b37166f982536b8702ff4fb (patch)
treeb6f0c06ca7d10c5c5329ab43f4c878953d281540
parent2890a01b06d7b341d8483f946eee788063baecc9 (diff)
downloadchef-e441d37d36eedbd73b37166f982536b8702ff4fb.tar.gz
Set the precedence of policyfile attrs and propagate them everywhere
-rw-r--r--lib/chef/policy_builder/policyfile.rb43
-rw-r--r--spec/unit/policy_builder/policyfile_spec.rb158
2 files changed, 201 insertions, 0 deletions
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