diff options
author | Adam Edwards <adamed@opscode.com> | 2014-03-28 14:08:27 -0700 |
---|---|---|
committer | Adam Edwards <adamed@opscode.com> | 2014-03-29 00:21:12 -0700 |
commit | dfe1ebf9bf59d02aa78c1fdef8787af1665a22fd (patch) | |
tree | 3df2b552435c442bf5f1e9b4d4562e969dc31998 /lib/chef/guard_interpreter | |
parent | e0b02d69aaf9f408cfd9dbe9ea47561f694815bf (diff) | |
download | chef-dfe1ebf9bf59d02aa78c1fdef8787af1665a22fd.tar.gz |
Fix namespacing issues caused by moving guard_interpreter logic out of Chef::Resource
Diffstat (limited to 'lib/chef/guard_interpreter')
-rw-r--r-- | lib/chef/guard_interpreter/default_guard_interpreter.rb | 36 | ||||
-rw-r--r-- | lib/chef/guard_interpreter/resource_guard_interpreter.rb | 113 |
2 files changed, 149 insertions, 0 deletions
diff --git a/lib/chef/guard_interpreter/default_guard_interpreter.rb b/lib/chef/guard_interpreter/default_guard_interpreter.rb new file mode 100644 index 0000000000..f7d039c1cf --- /dev/null +++ b/lib/chef/guard_interpreter/default_guard_interpreter.rb @@ -0,0 +1,36 @@ +# +# Author:: Adam Edwards (<adamed@getchef.com>) +# Copyright:: Copyright (c) 2014 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. +# + +class Chef + class GuardInterpreter + class DefaultGuardInterpreter + + protected + + def initialize + end + + public + + def translate_command_block(command, opts, &block) + [command, block] + end + end + end +end + diff --git a/lib/chef/guard_interpreter/resource_guard_interpreter.rb b/lib/chef/guard_interpreter/resource_guard_interpreter.rb new file mode 100644 index 0000000000..946ee2ba49 --- /dev/null +++ b/lib/chef/guard_interpreter/resource_guard_interpreter.rb @@ -0,0 +1,113 @@ +# +# Author:: Adam Edwards (<adamed@getchef.com>) +# Copyright:: Copyright (c) 2014 Opscode, 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 'chef/guard_interpreter/default_guard_interpreter' + +class Chef + class GuardInterpreter + class ResourceGuardInterpreter < DefaultGuardInterpreter + + def translate_command_block(command, opts, &block) + merge_inherited_attributes + if command && ! block_given? + block_attributes = opts.merge({:code => command}) + translated_block = to_block(block_attributes) + [nil, translated_block] + else + super + end + end + + def initialize(resource_symbol, parent_resource) + @parent_resource = parent_resource + + resource_class = get_resource_class(parent_resource, resource_symbol) + + raise ArgumentError, "Specified guard_interpreter resource #{resource_symbol.to_s} unknown for this platform" if resource_class.nil? + + empty_events = Chef::EventDispatch::Dispatcher.new + anonymous_run_context = Chef::RunContext.new(parent_resource.node, {}, empty_events) + + @resource = resource_class.new('Guard resource', anonymous_run_context) + + if ! @resource.kind_of?(Chef::Resource::Script) + raise ArgumentError, "Specified guard interpreter class #{resource_class} must be a kind of Chef::Resource::Script resource" + end + end + + protected + + def evaluate_action(action=nil, &block) + @resource.instance_eval(&block) + + run_action = action || @resource.action + + begin + @resource.run_action(run_action) + resource_updated = @resource.updated + rescue Mixlib::ShellOut::ShellCommandFailed + resource_updated = nil + end + + resource_updated + end + + def to_block(attributes, action=nil) + resource_block = block_from_attributes(attributes) + Proc.new do + evaluate_action(action, &resource_block) + end + end + + def get_resource_class(parent_resource, resource_symbol) + if parent_resource.nil? || parent_resource.node.nil? + raise ArgumentError, "Node for guard resource parent must not be nil" + end + Chef::Resource.resource_for_node(resource_symbol, parent_resource.node) + end + + def block_from_attributes(attributes) + Proc.new do + attributes.keys.each do |attribute_name| + send(attribute_name, attributes[attribute_name]) if respond_to?(attribute_name) + end + end + end + + def merge_inherited_attributes + inherited_attributes = [] + + if @parent_resource.respond_to?(:guard_inherited_attributes) + inherited_attributes = @parent_resource.send(:guard_inherited_attributes) + end + + if inherited_attributes + inherited_attributes.each do |attribute| + if @parent_resource.respond_to?(attribute) && @resource.respond_to?(attribute) + parent_value = @parent_resource.send(attribute) + child_value = @resource.send(attribute) + if parent_value || child_value + @resource.send(attribute, parent_value) + end + end + end + end + end + end + end +end |