diff options
-rw-r--r-- | chef/lib/chef/knife/environment_from_file.rb | 49 | ||||
-rw-r--r-- | chef/spec/unit/knife/environment_from_file_spec.rb | 23 |
2 files changed, 64 insertions, 8 deletions
diff --git a/chef/lib/chef/knife/environment_from_file.rb b/chef/lib/chef/knife/environment_from_file.rb index 5a0ce8bef4..af72f84622 100644 --- a/chef/lib/chef/knife/environment_from_file.rb +++ b/chef/lib/chef/knife/environment_from_file.rb @@ -25,26 +25,59 @@ class Chef require 'chef/knife/core/object_loader' end - banner "knife environment from file FILE (options)" + banner "knife environment from file FILE [FILE..] (options)" + + option :all, + :short => "-a", + :long => "--all", + :description => "Upload all environments" def loader @loader ||= Knife::Core::ObjectLoader.new(Chef::Environment, ui) end + def environments_path + @environments_path ||= "environments" + end - def run - if @name_args[0].nil? - show_usage - ui.fatal("You must specify a file to load") - exit 1 - end + def find_all_environments + loader.find_all_objects("./#{environments_path}/") + end + def load_all_environments + environments = find_all_environments + if environments.empty? + ui.fatal("Unable to find any environment files in '#{environments_path}'") + exit(1) + end + environments.each do |env| + load_environment(env) + end + end - updated = loader.load_from("environments", @name_args[0]) + def load_environment(env) + updated = loader.load_from("environments", env) updated.save output(format_for_display(updated)) if config[:print_after] ui.info("Updated Environment #{updated.name}") end + + + def run + if config[:all] == true + load_all_environments + else + if @name_args[0].nil? + show_usage + ui.fatal("You must specify a file to load") + exit 1 + end + + @name_args.each do |arg| + load_environment(arg) + end + end + end end end end diff --git a/chef/spec/unit/knife/environment_from_file_spec.rb b/chef/spec/unit/knife/environment_from_file_spec.rb index 258cab1a03..d2234d9be1 100644 --- a/chef/spec/unit/knife/environment_from_file_spec.rb +++ b/chef/spec/unit/knife/environment_from_file_spec.rb @@ -43,6 +43,29 @@ describe Chef::Knife::EnvironmentFromFile do @knife.run end + context "when handling multiple environments" do + before(:each) do + @env_apple = @environment.dup + @env_apple.name("apple") + @knife.loader.stub!(:load_from).with("apple.rb").and_return @env_apple + end + + it "loads multiple environments if given" do + @knife.name_args = [ "spec.rb", "apple.rb" ] + @environment.should_receive(:save).twice + @knife.run + end + + it "loads all environments with -a" do + File.stub!(:expand_path).with("./environments/*.{json,rb}").and_return("/tmp/environments") + Dir.stub!(:glob).with("/tmp/environments").and_return(["spec.rb", "apple.rb"]) + @knife.name_args = [] + @knife.stub!(:config).and_return({:all => true}) + @environment.should_receive(:save).twice + @knife.run + end + end + it "should not print the environment" do @knife.should_not_receive(:output) @knife.run |