summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorsdelano <stephen@opscode.com>2017-04-06 09:21:46 -0700
committersdelano <stephen@opscode.com>2017-04-06 10:00:35 -0700
commitadb0a55cb63f394ed23450e41f8a93cd017d225a (patch)
tree0aff07ce4b93eac5d5a31641596ea20653867bcd /spec
parentc36bf3013e7c1f54efc6635145a5fb28daf17c7a (diff)
downloadchef-adb0a55cb63f394ed23450e41f8a93cd017d225a.tar.gz
server enforced required recipe
when the chef-server is configured to serve a requried recipe, chef-client shall load the recipe into the run context and execute it as part of the converge phase. if the chef-server is NOT configured, it will return a 404 and chef-client will continue normally. Signed-off-by: Stephen Delano <stephen@chef.io>
Diffstat (limited to 'spec')
-rw-r--r--spec/integration/client/client_spec.rb23
-rw-r--r--spec/support/shared/context/client.rb7
-rw-r--r--spec/unit/client_spec.rb49
3 files changed, 79 insertions, 0 deletions
diff --git a/spec/integration/client/client_spec.rb b/spec/integration/client/client_spec.rb
index 00086c75ca..55212b6dcf 100644
--- a/spec/integration/client/client_spec.rb
+++ b/spec/integration/client/client_spec.rb
@@ -592,4 +592,27 @@ EOM
expect(command.stdout).not_to include("INFO")
end
end
+
+ context "when connected to a Chef Server" do
+
+ let(:chef_client_cmd) { "#{chef_client} -c #{path_to('config/client.rb')}" }
+
+ before do
+ directory "config"
+ directory "cache"
+
+ file "config/client.rb", <<EOM
+chef_server_url "http://localhost:8900"
+cache_path "#{path_to("cache")}"
+client_key "#{path_to("config/client.pem")}"
+EOM
+ end
+
+ when_the_chef_server "is empty with a basic config" do
+ it "a chef-client run should succeed" do
+ result = shell_out(chef_client_cmd)
+ result.error!
+ end
+ end
+ end
end
diff --git a/spec/support/shared/context/client.rb b/spec/support/shared/context/client.rb
index 3c86e49882..19ce82fa15 100644
--- a/spec/support/shared/context/client.rb
+++ b/spec/support/shared/context/client.rb
@@ -135,6 +135,12 @@ shared_context "a client run" do
and_return({})
end
+ def stub_for_required_recipe
+ response = Net::HTTPNotFound.new("1.1", "404", "Not Found")
+ exception = Net::HTTPServerException.new('404 "Not Found"', response)
+ expect(http_node_load).to receive(:get).with("required_recipe").and_raise(exception)
+ end
+
def stub_for_converge
# define me
end
@@ -165,6 +171,7 @@ shared_context "a client run" do
stub_for_data_collector_init
stub_for_node_load
stub_for_sync_cookbooks
+ stub_for_required_recipe
stub_for_converge
stub_for_audit
stub_for_node_save
diff --git a/spec/unit/client_spec.rb b/spec/unit/client_spec.rb
index a2bb573e15..528dbd4b4e 100644
--- a/spec/unit/client_spec.rb
+++ b/spec/unit/client_spec.rb
@@ -394,6 +394,55 @@ describe Chef::Client do
end
end
+ describe "load_required_recipe" do
+ let(:rest) { double("Chef::ServerAPI (required recipe)") }
+ let(:run_context) { double("Chef::RunContext") }
+ let(:recipe) { double("Chef::Recipe (required recipe)") }
+ let(:required_recipe) {
+ <<EOM
+fake_recipe_variable = "for reals"
+EOM
+ }
+
+ context "when required_recipe is configured" do
+
+ before(:each) do
+ expect(rest).to receive(:get).with("required_recipe").and_return(required_recipe)
+ expect(Chef::Recipe).to receive(:new).with(nil, nil, run_context).and_return(recipe)
+ expect(recipe).to receive(:from_file)
+ end
+
+ it "fetches the recipe and adds it to the run context" do
+ client.load_required_recipe(rest, run_context)
+ end
+
+ context "when the required_recipe has bad contents" do
+ let(:required_recipe) {
+ <<EOM
+this is not a recipe
+EOM
+ }
+ it "should not raise an error" do
+ expect { client.load_required_recipe(rest, run_context) }.not_to raise_error()
+ end
+ end
+ end
+
+ context "when required_recipe returns 404" do
+ let(:http_response) { Net::HTTPNotFound.new("1.1", "404", "Not Found") }
+ let(:http_exception) { Net::HTTPServerException.new('404 "Not Found"', http_response) }
+
+ before(:each) do
+ expect(rest).to receive(:get).with("required_recipe").and_raise(http_exception)
+ end
+
+ it "should log and continue on" do
+ expect(Chef::Log).to receive(:info)
+ client.load_required_recipe(rest, run_context)
+ end
+ end
+ end
+
describe "windows_admin_check" do
context "platform is not windows" do
before do