Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

CHEF-3090: shellout loglevel compat #288

Merged
merged 4 commits into from

2 participants

@hosh

Fixes CHEF-3090 (http://tickets.opscode.com/browse/CHEF-3090)

Chef 10.8 uses mixlib-shellout. However, certain option keys have now changed:

  • :command_log_level -> :log_level
  • :command_log_prepend -> :log_tag

This patch adds a compatibility layer. It will rewrite the legacy options and emit deprecation notices.

@btm btm merged commit bfe2b06 into chef:master
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on May 8, 2012
  1. @hosh
Commits on May 9, 2012
  1. @hosh

    [CHEF-3090][SHELL_OUT] Mixin::ShellOut.shell_out! should convert lega…

    hosh authored
    …cy run_command options specified as strings
  2. @hosh

    [CHEF-3090][SHELL_OUT] Mixin::ShellOut.shell_out! should emit depreca…

    hosh authored
    …tion warnings when converting legacy run_command options
Commits on May 10, 2012
  1. @hosh
This page is out of date. Refresh to see the latest.
View
30 chef/lib/chef/mixin/shell_out.rb
@@ -23,7 +23,7 @@ module Mixin
module ShellOut
def shell_out(*command_args)
- cmd = Mixlib::ShellOut.new(*command_args)
+ cmd = Mixlib::ShellOut.new(*run_command_compatible_options(command_args))
if STDOUT.tty? && !Chef::Config[:daemon] && Chef::Log.debug?
cmd.live_stream = STDOUT
end
@@ -36,6 +36,34 @@ def shell_out!(*command_args)
cmd.error!
cmd
end
+
+ DEPRECATED_OPTIONS =
+ [ [:command_log_level, :log_level],
+ [:command_log_prepend, :log_tag] ]
+
+ # CHEF-3090: Deprecate command_log_level and command_log_prepend
+ # Patterned after https://github.com/opscode/chef/commit/e1509990b559984b43e428d4d801c394e970f432
+ def run_command_compatible_options(command_args)
+ return command_args unless command_args.last.is_a?(Hash)
+
+ _command_args = command_args.dup
+ _options = _command_args.last
+
+ DEPRECATED_OPTIONS.each do |old_option, new_option|
+ # Edge case: someone specifies :command_log_level and 'command_log_level' in the option hash
+ next unless value = _options.delete(old_option) || _options.delete(old_option.to_s)
+ deprecate_option old_option, new_option
+ _options[new_option] = value
+ end
+
+ return _command_args
+ end
+
+ private
+
+ def deprecate_option(old_option, new_option)
+ Chef::Log.logger.warn "DEPRECATION: Chef::Mixin::ShellOut option :#{old_option} is deprecated. Use :#{new_option}"
+ end
end
end
end
View
109 chef/spec/unit/mixin/shell_out_spec.rb
@@ -0,0 +1,109 @@
+#
+# Author:: Ho-Sheng Hsiao (hosh@opscode.com)
+# Code derived from spec/unit/mixin/command_spec.rb
+#
+# Original header:
+# Author:: Hongli Lai (hongli@phusion.nl)
+# Copyright:: Copyright (c) 2009 Phusion
+# 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 'spec_helper'
+
+describe Chef::Mixin::ShellOut do
+ include Chef::Mixin::ShellOut
+
+ describe '#run_command_compatible_options' do
+ subject { run_command_compatible_options(command_args) }
+ let(:command_args) { [ cmd, options ] }
+ let(:cmd) { "echo '#{rand(1000)}'" }
+
+ let(:output) { StringIO.new }
+ let(:capture_log_output) { Chef::Log.logger = Logger.new(output) }
+ let(:assume_deprecation_log_level) { Chef::Log.stub!(:level).and_return(:warn) }
+
+ context 'without options' do
+ let(:command_args) { [ cmd ] }
+
+ it 'should not edit command args' do
+ should eql(command_args)
+ end
+ end
+
+ context 'without deprecated options' do
+ let(:options) { { :environment => environment } }
+ let(:environment) { { 'LC_ALL' => 'C' } }
+
+ it 'should not edit command args' do
+ should eql(command_args)
+ end
+ end
+
+ def self.should_emit_deprecation_warning_about(old_option, new_option)
+ it 'should emit a deprecation warning' do
+ assume_deprecation_log_level and capture_log_output
+ subject
+ output.string.should match /DEPRECATION:/
+ output.string.should match Regexp.escape(old_option.to_s)
+ output.string.should match Regexp.escape(new_option.to_s)
+ end
+ end
+
+ context 'with :command_log_level option' do
+ let(:options) { { :command_log_level => command_log_level } }
+ let(:command_log_level) { :warn }
+
+ it 'should convert :command_log_level to :log_level' do
+ should eql [ cmd, { :log_level => command_log_level } ]
+ end
+
+ should_emit_deprecation_warning_about :command_log_level, :log_level
+ end
+
+ context 'with :command_log_prepend option' do
+ let(:options) { { :command_log_prepend => command_log_prepend } }
+ let(:command_log_prepend) { 'PROVIDER:' }
+
+ it 'should convert :command_log_prepend to :log_tag' do
+ should eql [ cmd, { :log_tag => command_log_prepend } ]
+ end
+
+ should_emit_deprecation_warning_about :command_log_prepend, :log_tag
+ end
+
+ context "with 'command_log_level' option" do
+ let(:options) { { 'command_log_level' => command_log_level } }
+ let(:command_log_level) { :warn }
+
+ it "should convert 'command_log_level' to :log_level" do
+ should eql [ cmd, { :log_level => command_log_level } ]
+ end
+
+ should_emit_deprecation_warning_about :command_log_level, :log_level
+ end
+
+ context "with 'command_log_prepend' option" do
+ let(:options) { { 'command_log_prepend' => command_log_prepend } }
+ let(:command_log_prepend) { 'PROVIDER:' }
+
+ it "should convert 'command_log_prepend' to :log_tag" do
+ should eql [ cmd, { :log_tag => command_log_prepend } ]
+ end
+
+ should_emit_deprecation_warning_about :command_log_prepend, :log_tag
+ end
+
+ end
+end
Something went wrong with that request. Please try again.