summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordanielsdeleo <dan@getchef.com>2015-02-11 14:49:40 -0800
committerdanielsdeleo <dan@getchef.com>2015-02-12 08:40:56 -0800
commit3cf27d446c8f0777de4920fb065f7a8e6ce70261 (patch)
tree623d45ccc4dca58a7bf6191ed7f1fdf01d4a0205
parent481eba08b04f6fb661b9074268ec732c9f38e35e (diff)
downloadchef-3cf27d446c8f0777de4920fb065f7a8e6ce70261.tar.gz
Fetch cookbooks from cookbook_artifacts/ in native api mode
-rw-r--r--lib/chef/policy_builder/policyfile.rb34
-rw-r--r--spec/unit/policy_builder/policyfile_spec.rb32
2 files changed, 55 insertions, 11 deletions
diff --git a/lib/chef/policy_builder/policyfile.rb b/lib/chef/policy_builder/policyfile.rb
index ff8e067bf6..26c4f0c6c8 100644
--- a/lib/chef/policy_builder/policyfile.rb
+++ b/lib/chef/policy_builder/policyfile.rb
@@ -335,13 +335,11 @@ class Chef
# cookbooks are fetched by the "dotted_decimal_identifier": a
# representation of a SHA1 in the traditional x.y.z version format.
def manifest_for(cookbook_name, lock_data)
- xyz_version = lock_data["dotted_decimal_identifier"]
- http_api.get("cookbooks/#{cookbook_name}/#{xyz_version}")
- rescue Exception => e
- message = "Error loading cookbook #{cookbook_name} at version #{xyz_version}: #{e.class} - #{e.message}"
- err = Chef::Exceptions::CookbookNotFound.new(message)
- err.set_backtrace(e.backtrace)
- raise err
+ if Chef::Config[:policy_document_native_api]
+ artifact_manifest_for(cookbook_name, lock_data)
+ else
+ compat_mode_manifest_for(cookbook_name, lock_data)
+ end
end
def cookbook_locks
@@ -356,6 +354,28 @@ class Chef
Chef::Config
end
+ private
+
+ def compat_mode_manifest_for(cookbook_name, lock_data)
+ xyz_version = lock_data["dotted_decimal_identifier"]
+ http_api.get("cookbooks/#{cookbook_name}/#{xyz_version}")
+ rescue Exception => e
+ message = "Error loading cookbook #{cookbook_name} at version #{xyz_version}: #{e.class} - #{e.message}"
+ err = Chef::Exceptions::CookbookNotFound.new(message)
+ err.set_backtrace(e.backtrace)
+ raise err
+ end
+
+ def artifact_manifest_for(cookbook_name, lock_data)
+ xyz_version = lock_data["dotted_decimal_identifier"]
+ http_api.get("cookbook_artifacts/#{cookbook_name}/#{xyz_version}")
+ rescue Exception => e
+ message = "Error loading cookbook #{cookbook_name} at version #{xyz_version}: #{e.class} - #{e.message}"
+ err = Chef::Exceptions::CookbookNotFound.new(message)
+ err.set_backtrace(e.backtrace)
+ raise err
+ end
+
end
end
end
diff --git a/spec/unit/policy_builder/policyfile_spec.rb b/spec/unit/policy_builder/policyfile_spec.rb
index ce0a24859a..8460fc593d 100644
--- a/spec/unit/policy_builder/policyfile_spec.rb
+++ b/spec/unit/policy_builder/policyfile_spec.rb
@@ -415,7 +415,7 @@ describe Chef::PolicyBuilder::Policyfile do
policy_builder.load_node
policy_builder.build_node
- expect(http_api).to receive(:get).with("cookbooks/example1/#{example1_xyz_version}").
+ expect(http_api).to receive(:get).with(cookbook1_url).
and_raise(error404)
end
@@ -432,9 +432,9 @@ describe Chef::PolicyBuilder::Policyfile do
policy_builder.load_node
policy_builder.build_node
- expect(http_api).to receive(:get).with("cookbooks/example1/#{example1_xyz_version}").
+ expect(http_api).to receive(:get).with(cookbook1_url).
and_return(example1_cookbook_object)
- expect(http_api).to receive(:get).with("cookbooks/example2/#{example2_xyz_version}").
+ expect(http_api).to receive(:get).with(cookbook2_url).
and_return(example2_cookbook_object)
allow(Chef::CookbookSynchronizer).to receive(:new).
@@ -463,8 +463,32 @@ describe Chef::PolicyBuilder::Policyfile do
end # shared_examples_for "fetching cookbooks"
context "when using compatibility mode (policy_document_native_api == false)" do
- include_examples "fetching cookbooks"
+ include_examples "fetching cookbooks" do
+
+ let(:cookbook1_url) { "cookbooks/example1/#{example1_xyz_version}" }
+ let(:cookbook2_url) { "cookbooks/example2/#{example2_xyz_version}" }
+
+ end
+
+ end
+
+ context "when using native API mode (policy_document_native_api == true)" do
+
+ before do
+ Chef::Config[:policy_document_native_api] = true
+ Chef::Config[:policy_group] = "policy-stage"
+ Chef::Config[:policy_name] = "example"
+ end
+
+ include_examples "fetching cookbooks" do
+
+ let(:cookbook1_url) { "cookbook_artifacts/example1/#{example1_xyz_version}" }
+ let(:cookbook2_url) { "cookbook_artifacts/example2/#{example2_xyz_version}" }
+
+ end
+
end
+
end
end