diff options
Diffstat (limited to 'lib/chef/resource_platform_map.rb')
-rw-r--r-- | lib/chef/resource_platform_map.rb | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/lib/chef/resource_platform_map.rb b/lib/chef/resource_platform_map.rb new file mode 100644 index 0000000000..ad27aa91c1 --- /dev/null +++ b/lib/chef/resource_platform_map.rb @@ -0,0 +1,151 @@ +# +# Author:: Seth Chisamore (<schisamo@opscode.com>) +# Copyright:: Copyright (c) 2011 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/mixin/params_validate' +require 'chef/mixin/convert_to_class_name' + +class Chef + class Resource + class PlatformMap + + include Chef::Mixin::ParamsValidate + include Chef::Mixin::ConvertToClassName + + attr_reader :map + + def initialize(map={:default => {}}) + @map = map + end + + def filter(platform, version) + resource_map = map[:default].clone + platform_sym = platform + if platform.kind_of?(String) + platform.downcase! + platform.gsub!(/\s/, "_") + platform_sym = platform.to_sym + end + + if map.has_key?(platform_sym) + if map[platform_sym].has_key?(version) + if map[platform_sym].has_key?(:default) + resource_map.merge!(map[platform_sym][:default]) + end + resource_map.merge!(map[platform_sym][version]) + elsif map[platform_sym].has_key?(:default) + resource_map.merge!(map[platform_sym][:default]) + end + end + resource_map + end + + def set(args) + validate( + args, + { + :platform => { + :kind_of => Symbol, + :required => false + }, + :version => { + :kind_of => String, + :required => false + }, + :short_name => { + :kind_of => Symbol, + :required => true + }, + :resource => { + :kind_of => [ String, Symbol, Class ], + :required => true + } + } + ) + if args.has_key?(:platform) + if args.has_key?(:version) + if map.has_key?(args[:platform]) + if map[args[:platform]].has_key?(args[:version]) + map[args[:platform]][args[:version]][args[:short_name].to_sym] = args[:resource] + else + map[args[:platform]][args[:version]] = { + args[:short_name].to_sym => args[:resource] + } + end + else + map[args[:platform]] = { + args[:version] => { + args[:short_name].to_sym => args[:resource] + } + } + end + else + if map.has_key?(args[:platform]) + if map[args[:platform]].has_key?(:default) + map[args[:platform]][:default][args[:short_name].to_sym] = args[:resource] + else + map[args[:platform]] = { :default => { args[:short_name].to_sym => args[:resource] } } + end + else + map[args[:platform]] = { + :default => { + args[:short_name].to_sym => args[:resource] + } + } + end + end + else + if map.has_key?(:default) + map[:default][args[:short_name].to_sym] = args[:resource] + else + map[:default] = { + args[:short_name].to_sym => args[:resource] + } + end + end + end + + def get(short_name, platform=nil, version=nil) + resource_klass = platform_resource(short_name, platform, version) || + resource_matching_short_name(short_name) + + raise NameError, "Cannot find a resource for #{short_name} on #{platform} version #{version}" if resource_klass.nil? + + resource_klass + end + + private + + def platform_resource(short_name, platform, version) + pmap = filter(platform, version) + rtkey = short_name.kind_of?(Chef::Resource) ? short_name.resource_name.to_sym : short_name + + pmap.has_key?(rtkey) ? pmap[rtkey] : nil + end + + def resource_matching_short_name(short_name) + begin + rname = convert_to_class_name(short_name.to_s) + Chef::Resource.const_get(rname) + rescue NameError + nil + end + end + + end + end +end |