summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThom May <thom@chef.io>2016-04-04 16:35:28 -0700
committerThom May <thom@chef.io>2016-04-04 16:42:50 -0700
commitfb7ad1505d0257a10a4dcc984fbb898d02e9754d (patch)
tree77756de0187b779cbbbf4fad2a84eb5de9a86936
parent90cf8d0a1c64bea5c06bf1957c8e84ebdbf66dd2 (diff)
downloadchef-fb7ad1505d0257a10a4dcc984fbb898d02e9754d.tar.gz
Add a NoOp providertm/provider_no_op
This allows one to have a resource which is really only appropriate for one platform, but available everywhere. Then you simply allow noop to provide the resource everywhere besides where it's supposed to be.
-rw-r--r--lib/chef/provider/noop.rb37
-rw-r--r--lib/chef/providers.rb1
-rw-r--r--spec/integration/recipes/noop_resource_spec.rb24
3 files changed, 62 insertions, 0 deletions
diff --git a/lib/chef/provider/noop.rb b/lib/chef/provider/noop.rb
new file mode 100644
index 0000000000..207bf7dedb
--- /dev/null
+++ b/lib/chef/provider/noop.rb
@@ -0,0 +1,37 @@
+#
+# Author:: Thom May (<thom@chef.io>)
+# Copyright:: Copyright (c) 2016 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 Provider
+ class Noop < Chef::Provider
+ def load_current_resource; end
+
+ def respond_to_missing?(method_sym, include_private = false)
+ method_sym.to_s.start_with?("action_") || super
+ end
+
+ def method_missing(method_sym, *arguments, &block)
+ if method_sym.to_s =~ /^action_/
+ Chef::Log.debug("NoOp-ing for #{method_sym}")
+ else
+ super
+ end
+ end
+ end
+ end
+end
diff --git a/lib/chef/providers.rb b/lib/chef/providers.rb
index 6fd67e0068..80fadfc8c2 100644
--- a/lib/chef/providers.rb
+++ b/lib/chef/providers.rb
@@ -41,6 +41,7 @@ require "chef/provider/log"
require "chef/provider/ohai"
require "chef/provider/mdadm"
require "chef/provider/mount"
+require "chef/provider/noop"
require "chef/provider/package"
require "chef/provider/powershell_script"
require "chef/provider/osx_profile"
diff --git a/spec/integration/recipes/noop_resource_spec.rb b/spec/integration/recipes/noop_resource_spec.rb
new file mode 100644
index 0000000000..c8ff3e6b5e
--- /dev/null
+++ b/spec/integration/recipes/noop_resource_spec.rb
@@ -0,0 +1,24 @@
+require "support/shared/integration/integration_helper"
+
+describe "Resources with a no-op provider" do
+ include IntegrationSupport
+
+ context "with noop provider providing foo" do
+ before(:context) {
+ class NoOpFoo < Chef::Resource
+ resource_name "hi_there"
+ default_action :update
+ end
+ Chef::Provider::Noop.provides :hi_there
+ }
+
+ it "does not blow up a run with a noop'd resource" do
+ recipe = converge {
+ hi_there "blah" do
+ action :update
+ end
+ }
+ expect(recipe.logged_warnings).to eq ""
+ end
+ end
+end