summaryrefslogtreecommitdiff
path: root/lib/chef/guard_interpreter
diff options
context:
space:
mode:
authorAdam Edwards <adamed@opscode.com>2014-03-28 14:08:27 -0700
committerAdam Edwards <adamed@opscode.com>2014-03-29 00:21:12 -0700
commitdfe1ebf9bf59d02aa78c1fdef8787af1665a22fd (patch)
tree3df2b552435c442bf5f1e9b4d4562e969dc31998 /lib/chef/guard_interpreter
parente0b02d69aaf9f408cfd9dbe9ea47561f694815bf (diff)
downloadchef-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.rb36
-rw-r--r--lib/chef/guard_interpreter/resource_guard_interpreter.rb113
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