diff options
author | Lamont Granquist <lamont@scriptkiddie.org> | 2019-04-12 18:39:34 -0700 |
---|---|---|
committer | Lamont Granquist <lamont@scriptkiddie.org> | 2019-04-12 18:45:55 -0700 |
commit | 6607b130fe16fa9f28300548d01561d04da54eae (patch) | |
tree | 5a317c6e770683e3b99f177f4fbb3fe1346d32b6 /lib | |
parent | 3a87c705090c7f44d51666c0bf88add9c2445e9a (diff) | |
download | chef-6607b130fe16fa9f28300548d01561d04da54eae.tar.gz |
Allow empty strings in -o to result in empty override run listlcg/empty-override-runlist
Previously this was not possible. Now you can do this:
```
chef-client -o "" ./foo.rb
```
And it will only run foo.rb and not any of the recipes in your
run_list at all. Node will not be saved at the end.
Useful to one-shot something like keyrotation (which still needs
keys and needs to talk to the chef server API, so this is a
different use case from simple chef-apply).
Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/chef/application.rb | 3 | ||||
-rw-r--r-- | lib/chef/node.rb | 30 | ||||
-rw-r--r-- | lib/chef/policy_builder/expand_node_object.rb | 8 |
3 files changed, 32 insertions, 9 deletions
diff --git a/lib/chef/application.rb b/lib/chef/application.rb index a63d8218f4..817cdf051d 100644 --- a/lib/chef/application.rb +++ b/lib/chef/application.rb @@ -1,7 +1,7 @@ # # Author:: AJ Christensen (<aj@chef.io>) # Author:: Mark Mzyk (mmzyk@chef.io) -# Copyright:: Copyright 2008-2018, Chef Software Inc. +# Copyright:: Copyright 2008-2019, Chef Software Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -260,7 +260,6 @@ class Chef Chef::LocalMode.with_server_connectivity do override_runlist = config[:override_runlist] - override_runlist ||= [] if specific_recipes.size > 0 @chef_client = Chef::Client.new( @chef_client_json, override_runlist: override_runlist, diff --git a/lib/chef/node.rb b/lib/chef/node.rb index 9b67f27f14..c945bb640f 100644 --- a/lib/chef/node.rb +++ b/lib/chef/node.rb @@ -300,13 +300,37 @@ class Chef @primary_runlist end - attr_writer :override_runlist + # This boolean can be useful to determine if an override_runlist is set, it can be true + # even if the override_runlist is empty. + # + # (Mutators can set the override_runlist so any non-empty override_runlist is considered set) + # + # @return [Boolean] if the override run list has been set + def override_runlist_set? + !!@override_runlist_set || !override_runlist.empty? + end + + # Accessor for override_runlist (this cannot set an empty override run list) + # + # @params args [Array] override run list to set + # @return [Chef::RunList] the override run list def override_runlist(*args) - args.length > 0 ? @override_runlist.reset!(args) : @override_runlist + return @override_runlist if args.length == 0 + @override_runlist_set = true + @override_runlist.reset!(args) + end + + # Setter for override_runlist which allows setting an empty override run list and marking it to be used + # + # @params array [Array] override run list to set + # @return [Chef::RunList] the override run list + def override_runlist=(array) + @override_runlist_set = true + @override_runlist.reset!(array) end def select_run_list - @override_runlist.empty? ? @primary_runlist : @override_runlist + override_runlist_set? ? @override_runlist : @primary_runlist end # Returns an Array of roles and recipes, in the order they will be applied. diff --git a/lib/chef/policy_builder/expand_node_object.rb b/lib/chef/policy_builder/expand_node_object.rb index dda4a2b4c3..eea5a37edd 100644 --- a/lib/chef/policy_builder/expand_node_object.rb +++ b/lib/chef/policy_builder/expand_node_object.rb @@ -214,7 +214,7 @@ class Chef # override_runlist was provided. Chef::Client uses this to decide whether # to do the final node save at the end of the run or not. def temporary_policy? - !node.override_runlist.empty? + node.override_runlist_set? end ######################################## @@ -222,9 +222,9 @@ class Chef ######################################## def setup_run_list_override - runlist_override_sanity_check! - unless override_runlist.empty? - node.override_runlist(*override_runlist) + unless override_runlist.nil? + runlist_override_sanity_check! + node.override_runlist = override_runlist Chef::Log.warn "Run List override has been provided." Chef::Log.warn "Original Run List: [#{node.primary_runlist}]" Chef::Log.warn "Overridden Run List: [#{node.run_list}]" |