diff options
author | Claire McQuin <claire@getchef.com> | 2015-07-09 12:50:35 -0700 |
---|---|---|
committer | Claire McQuin <claire@getchef.com> | 2015-07-21 09:47:50 -0700 |
commit | 542eebb54f20bde83612cff37ea1d7156ca0ffd1 (patch) | |
tree | 9a556c6aedc740c4ced9439ba7dac4792e89246c | |
parent | 8225589a536259273136d6cd6127b0e1cffd74cd (diff) | |
download | ohai-542eebb54f20bde83612cff37ea1d7156ca0ffd1.tar.gz |
Add ohai config context and deprecate top-level config.
-rw-r--r-- | Gemfile | 2 | ||||
-rw-r--r-- | lib/ohai/application.rb | 7 | ||||
-rw-r--r-- | lib/ohai/config.rb | 112 | ||||
-rw-r--r-- | ohai.gemspec | 1 | ||||
-rw-r--r-- | spec/unit/application_spec.rb | 88 | ||||
-rw-r--r-- | spec/unit/config_spec.rb | 140 |
6 files changed, 331 insertions, 19 deletions
@@ -8,6 +8,6 @@ group :development do gem "sigar", :platform => "ruby" gem 'plist' - # gem 'pry-debugger' + # gem 'pry-byebug' # gem 'pry-stack_explorer' end diff --git a/lib/ohai/application.rb b/lib/ohai/application.rb index 477b4a6f..264df0f2 100644 --- a/lib/ohai/application.rb +++ b/lib/ohai/application.rb @@ -74,9 +74,10 @@ class Ohai::Application @attributes = parse_options @attributes = nil if @attributes.empty? - Ohai::Config.merge!(config) - if Ohai::Config[:directory] - Ohai::Config[:plugin_path] << Ohai::Config[:directory] + Ohai::Config.merge_deprecated_config + Ohai.config.merge!(config) + if Ohai.config[:directory] + Ohai.config[:plugin_path] << Ohai.config[:directory] end end diff --git a/lib/ohai/config.rb b/lib/ohai/config.rb index 4c51e08a..988c2328 100644 --- a/lib/ohai/config.rb +++ b/lib/ohai/config.rb @@ -1,6 +1,7 @@ # # Author:: Adam Jacob (<adam@opscode.com>) -# Copyright:: Copyright (c) 2008 Opscode, Inc. +# Author:: Claire McQuin (<claire@chef.io>) +# Copyright:: Copyright (c) 2008-2015 Chef Software, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,28 +17,109 @@ # limitations under the License. # -require 'mixlib/config' require 'ohai/log' +require 'chef-config/logger' + +ChefConfig::Logger = Ohai::Log + +require 'chef-config/config' module Ohai + Config = ChefConfig::Config + + # Reopens ChefConfig::Config to add Ohai configuration settings. + # see: https://github.com/chef/chef/blob/master/lib/chef/config.rb class Config - extend Mixlib::Config - - # from chef/config.rb, should maybe be moved to mixlib-config? - def self.platform_specific_path(path) - if RUBY_PLATFORM =~ /mswin|mingw|windows/ - # turns /etc/chef/client.rb into C:/chef/client.rb - path = File.join(ENV['SYSTEMDRIVE'], path.split('/')[2..-1]) - # ensure all forward slashes are backslashes - path.gsub!(File::SEPARATOR, (File::ALT_SEPARATOR || '\\')) + # These methods need to be defined before they are used as config defaults, + # otherwise they will get method_missing'd to nil. + private + def self.default_hints_path + [ platform_specific_path('/etc/chef/ohai/hints') ] + end + + def self.default_plugin_path + [ File.expand_path(File.join(File.dirname(__FILE__), 'plugins')) ] + end + + public + # Copy deprecated configuration options into the ohai config context. + def self.merge_deprecated_config + [ :hints_path, :plugin_path ].each do |option| + if has_key?(option) && send(option) != send("default_#{option}".to_sym) + Ohai::Log.warn(option_deprecated(option)) + end end - path + + ohai.merge!(configuration) end + # Keep "old" config defaults around so anyone calling Ohai::Config[:key] + # won't be broken. Also allows users to append to configuration options + # (e.g., Ohai::Config[:plugin_path] << some_path) in their config files. + default :disabled_plugins, [] + default :hints_path, default_hints_path default :log_level, :info default :log_location, STDERR - default :plugin_path, [ File.expand_path(File.join(File.dirname(__FILE__), 'plugins'))] - default :disabled_plugins, [] - default(:hints_path) { [ platform_specific_path('/etc/chef/ohai/hints') ] } + default :plugin_path, default_plugin_path + + # Log deprecation warning when a top-level configuration option is set. + # TODO: Should we implement a config_attr_reader so that deprecation + # warnings will be generatd on read? + [ + :directory, + :disabled_plugins, + :log_level, + :log_location, + :version + ].each do |option| + # https://docs.chef.io/config_rb_client.html#ohai-settings + # hints_path and plugin_path are intentionally excluded here; warnings for + # setting these attributes are generated in merge_deprecated_config since + # append (<<) operations bypass the config writer. + config_attr_writer option do |value| + # log_level and log_location are common configuration options for chef + # and other chef applications. When configuration files are read there + # is no distinction between log_level and Ohai::Config[:log_level] and + # we may emit a false deprecation warning. The deprecation warnings for + # these settings reflect that possibility. + # Furthermore, when the top-level config settings are removed we will + # need to ensure that Ohai.config[:log_level] can be set by writing + # log_level in a configuration file for consistent behavior with chef. + deprecation_warning = [ :log_level, :log_location ].include?(value) ? + option_might_be_deprecated(option) : option_deprecated(option) + Ohai::Log.warn(deprecation_warning) + value + end + end + + config_context :ohai do + default :disabled_plugins, [] + default :hints_path, Ohai::Config.default_hints_path + default :log_level, :info + default :log_location, STDERR + default :plugin_path, Ohai::Config.default_plugin_path + end + + private + def self.option_deprecated(option) + <<-EOM.chomp!.gsub("\n", " ") +Ohai::Config[:#{option}] is set. Ohai::Config[:#{option}] is deprecated and will +be removed in future releases of ohai. Use ohai.#{option} in your configuration +file to configure :#{option} for ohai. +EOM + end + + def self.option_might_be_deprecated(option) + option_deprecated(option) + <<-EOM.chomp!.gsub("\n", " ") + If your configuration file is used with other applications which configure +:#{option}, and you have not configured Ohai::Config[:#{option}], you may +disregard this warning. +EOM + end + end + + # Shortcut for Ohai::Config.ohai + def self.config + Config::ohai end end diff --git a/ohai.gemspec b/ohai.gemspec index 8760f1ce..359e456f 100644 --- a/ohai.gemspec +++ b/ohai.gemspec @@ -25,6 +25,7 @@ Gem::Specification.new do |s| s.add_dependency "ipaddress" s.add_dependency "wmi-lite", "~> 1.0" s.add_dependency "ffi", "~> 1.9" + s.add_dependency "chef-config", "~> 12.4" s.add_dependency "rake", "~> 10.1" s.add_development_dependency "rspec-core", "~> 3.0" diff --git a/spec/unit/application_spec.rb b/spec/unit/application_spec.rb new file mode 100644 index 00000000..32b6f8e1 --- /dev/null +++ b/spec/unit/application_spec.rb @@ -0,0 +1,88 @@ +# +# Author:: Claire McQuin <claire@chef.io> +# Copyright:: Copyright (c) 2015 Chef Software, Inc. +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +require_relative '../spec_helper' + +require 'ohai/application' + +RSpec.describe 'Ohai::Application' do + + let(:argv) { [] } + let(:app) { Ohai::Application.new } + + before(:each) do + @original_argv = ARGV + ARGV.replace(argv) + end + + after(:each) do + ARGV.replace(@original_argv) + end + + describe '#configure_ohai' do + it 'merges deprecated config settings into the ohai config context' do + expect(Ohai::Config).to receive(:merge_deprecated_config) + app.configure_ohai + end + + context 'when CLI options are provided' do + let(:argv) { [ '-d', directory ] } + let(:directory) { '/some/fantastic/plugins' } + + it 'does not generate deprecated config warnings for cli options' do + expect(Ohai::Log).to_not receive(:warn). + with(/Ohai::Config\[:directory\] is deprecated/) + app.configure_ohai + end + + it 'merges CLI options into the ohai config context' do + app.configure_ohai + expect(Ohai.config[:directory]).to eq(directory) + end + end + + context 'when directory is configured' do + let(:directory) { '/some/fantastic/plugins' } + + shared_examples_for 'directory' do + it 'adds directory to plugin_path' do + app.configure_ohai + expect(Ohai.config[:plugin_path]).to include(directory) + end + end + + context 'in a configuration file' do + before do + allow(Ohai::Log).to receive(:warn). + with(/Ohai::Config\[:directory\] is deprecated/) + Ohai::Config[:directory] = directory + end + + include_examples 'directory' + end + + context 'as a command line option' do + let(:argv) { ['-d', directory] } + + include_examples 'directory' + end + end + + end + +end diff --git a/spec/unit/config_spec.rb b/spec/unit/config_spec.rb new file mode 100644 index 00000000..52538cab --- /dev/null +++ b/spec/unit/config_spec.rb @@ -0,0 +1,140 @@ +# +# Author:: Claire McQuin (<claire@chef.io>) +# Copyright:: Copyright (c) 2015 Chef Software, Inc. +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +require_relative '../spec_helper' + +require 'ohai/config' + +RSpec.describe Ohai::Config do + + describe "top-level configuration options" do + shared_examples_for "option" do + it "logs a deprecation warning and sets the value" do + expect(Ohai::Log).to receive(:warn). + with(/Ohai::Config\[:#{option}\] is deprecated/) + Ohai::Config[option] = value + expect(Ohai::Config[option]).to eq(value) + end + end + + shared_examples_for "appendable option" do + it "sets the value" do + expect(Ohai::Log).to_not receive(:warn) + Ohai::Config[option] << value + expect(Ohai::Config[option]).to include(value) + end + end + + describe ":directory" do + include_examples "option" do + let(:option) { :directory } + let(:value) { "/some/fantastic/plugins" } + end + end + + describe ":disabled_plugins" do + include_examples "option" do + let(:option) { :disabled_plugins } + let(:value) { [ :Foo, :Baz ] } + end + end + + describe ":hints_path" do + include_examples "appendable option" do + let(:option) { :hints_path } + let(:value) { "/some/helpful/hints" } + end + end + + describe ":log_level" do + include_examples "option" do + let(:option) { :log_level } + let(:value) { :cheese } + end + end + + describe ":log_location" do + include_examples "option" do + let(:option) { :log_location } + let(:value) { "/etc/chef/cache/loooogs" } + end + end + + describe ":plugin_path" do + include_examples "appendable option" do + let(:option) { :plugin_path } + let(:value) { "/some/fantastic/plugins" } + end + end + + describe ":version" do + include_examples "option" do + let(:option) { :version } + let(:value) { "8.2.0" } + end + end + end + + describe "::merge_deprecated_config" do + before(:each) do + allow(Ohai::Log).to receive(:warn) + configure_ohai + end + + def configure_ohai + Ohai::Config[:directory] = "/some/fantastic/plugins" + Ohai::Config[:disabled_plugins] = [ :Foo, :Baz ] + Ohai::Config[:log_level] = :debug + end + + it "merges top-level config values into the ohai config context" do + Ohai::Config.merge_deprecated_config + expect(Ohai::Config.ohai.configuration).to eq (Ohai::Config.configuration) + end + + shared_examples_for "delayed warn" do + it "logs a deprecation warning and merges the value" do + expect(Ohai::Log).to receive(:warn). + with(/Ohai::Config\[:#{option}\] is deprecated/) + Ohai::Config[option] << value + Ohai::Config.merge_deprecated_config + expect(Ohai::Config.ohai[option]).to include(value) + end + end + + context "when :hints_path is set" do + include_examples "delayed warn" do + let(:option) { :hints_path } + let(:value) { "/some/helpful/hints" } + end + end + + context "when :plugin_path is set" do + include_examples "delayed warn" do + let(:option) { :plugin_path } + let(:value) { "/some/fantastic/plugins" } + end + end + end + + describe "Ohai.config" do + it "returns the ohai config context" do + expect(Ohai.config).to eq(Ohai::Config.ohai) + end + end +end |