diff options
author | danielsdeleo <dan@getchef.com> | 2014-03-13 21:12:29 -0700 |
---|---|---|
committer | danielsdeleo <dan@getchef.com> | 2014-03-14 14:09:37 -0700 |
commit | becb0427f813f787fd492798f6c97de67fdd732c (patch) | |
tree | ea01bc7e6ee4860eee8111c2fa9a3a382c891207 /spec/unit | |
parent | 8c2a9753bdf8ee43226082825eb0a0531c94e202 (diff) | |
download | chef-becb0427f813f787fd492798f6c97de67fdd732c.tar.gz |
Raise an error when including a recipe from an unreachable cookbook
Fixes CHEF-4367.
When attempting to load a recipe belonging to a cookbook that is not in
the run_list or any dependencies of cookbooks in the run_list, chef
will now produce an error like this:
Chef::Exceptions::MissingCookbookDependency
-------------------------------------------
Recipe `ancient::aliens` is not in the run_list, and cookbook 'ancient'
is not a dependency of any cookbook in the run_list. To load thisrecipe,
first add a dependency on cookbook 'ancient' in the cookbook you're
including it from in that cookbook's metadata.
This error will occur when chef-solo users use `include_recipe` without
specifying the dependency in metadata; prior to this patch, chef would
typically fail reading an undefined attribute, which commonly would
result in a NoMethodError for nil.
Diffstat (limited to 'spec/unit')
-rw-r--r-- | spec/unit/cookbook_spec.rb | 10 | ||||
-rw-r--r-- | spec/unit/recipe_spec.rb | 4 | ||||
-rw-r--r-- | spec/unit/run_context/cookbook_compiler_spec.rb | 12 | ||||
-rw-r--r-- | spec/unit/run_context_spec.rb | 5 |
4 files changed, 21 insertions, 10 deletions
diff --git a/spec/unit/cookbook_spec.rb b/spec/unit/cookbook_spec.rb index ca4f4adc08..9bcea97d98 100644 --- a/spec/unit/cookbook_spec.rb +++ b/spec/unit/cookbook_spec.rb @@ -68,16 +68,6 @@ describe Chef::CookbookVersion do @cookbook.preferred_filename(@node, :files, 'a-filename', 'the-checksum').should be_nil end - it "should allow you to include a fully-qualified recipe using the DSL" do - # DSL method include_recipe allows multiple arguments, so extract the first - @node.should_receive(:loaded_recipe).with(:openldap, "gigantor") - recipe = @run_context.include_recipe("openldap::gigantor").first - - recipe.recipe_name.should == "gigantor" - recipe.cookbook_name.should == :openldap - @run_context.resource_collection[0].name.should == "blanket" - end - it "should raise an ArgumentException if you try to load a bad recipe name" do lambda { @cookbook.load_recipe("doesnt_exist", @node) }.should raise_error(ArgumentError) end diff --git a/spec/unit/recipe_spec.rb b/spec/unit/recipe_spec.rb index b0cd04b245..2bdf470143 100644 --- a/spec/unit/recipe_spec.rb +++ b/spec/unit/recipe_spec.rb @@ -339,6 +339,7 @@ describe Chef::Recipe do describe "include_recipe" do it "should evaluate another recipe with include_recipe" do node.should_receive(:loaded_recipe).with(:openldap, "gigantor") + run_context.stub(:unreachable_cookbook?).with(:openldap).and_return(false) run_context.include_recipe "openldap::gigantor" res = run_context.resource_collection.resources(:cat => "blanket") res.name.should eql("blanket") @@ -347,6 +348,7 @@ describe Chef::Recipe do it "should load the default recipe for a cookbook if include_recipe is called without a ::" do node.should_receive(:loaded_recipe).with(:openldap, "default") + run_context.stub(:unreachable_cookbook?).with(:openldap).and_return(false) run_context.include_recipe "openldap" res = run_context.resource_collection.resources(:cat => "blanket") res.name.should eql("blanket") @@ -355,12 +357,14 @@ describe Chef::Recipe do it "should store that it has seen a recipe in the run_context" do node.should_receive(:loaded_recipe).with(:openldap, "default") + run_context.stub(:unreachable_cookbook?).with(:openldap).and_return(false) run_context.include_recipe "openldap" run_context.loaded_recipe?("openldap").should be_true end it "should not include the same recipe twice" do node.should_receive(:loaded_recipe).with(:openldap, "default").exactly(:once) + run_context.stub(:unreachable_cookbook?).with(:openldap).and_return(false) cookbook_collection[:openldap].should_receive(:load_recipe).with("default", run_context) recipe.include_recipe "openldap" cookbook_collection[:openldap].should_not_receive(:load_recipe).with("default", run_context) diff --git a/spec/unit/run_context/cookbook_compiler_spec.rb b/spec/unit/run_context/cookbook_compiler_spec.rb index 52f4772206..5c50c3dd4b 100644 --- a/spec/unit/run_context/cookbook_compiler_spec.rb +++ b/spec/unit/run_context/cookbook_compiler_spec.rb @@ -170,5 +170,17 @@ describe Chef::RunContext::CookbookCompiler do :"circular-dep1", :"test-with-circular-deps"] end + + it "determines if a cookbook is in the list of cookbooks reachable by dependency" do + node.run_list("test-with-deps::default", "test-with-deps::server") + compiler.cookbook_order.should == [:dependency1, :dependency2, :"test-with-deps"] + compiler.unreachable_cookbook?(:dependency1).should be_false + compiler.unreachable_cookbook?(:dependency2).should be_false + compiler.unreachable_cookbook?(:'test-with-deps').should be_false + compiler.unreachable_cookbook?(:'circular-dep1').should be_true + compiler.unreachable_cookbook?(:'circular-dep2').should be_true + end + + end end diff --git a/spec/unit/run_context_spec.rb b/spec/unit/run_context_spec.rb index 39b8a8a50d..f885f49770 100644 --- a/spec/unit/run_context_spec.rb +++ b/spec/unit/run_context_spec.rb @@ -79,6 +79,11 @@ describe Chef::RunContext do @node.include_attribute("test::george") end + it "raises an error when attempting to include_recipe from a cookbook not reachable by run list or dependencies" do + lambda do + @run_context.include_recipe("ancient::aliens") + end.should raise_error(Chef::Exceptions::MissingCookbookDependency) + end end |