X-Git-Url: https://review.fuel-infra.org/gitweb?a=blobdiff_plain;f=lib%2Fmcollective%2Fdata.rb;fp=lib%2Fmcollective%2Fdata.rb;h=2d848c2b19569a765a0c788ec25f8438563a8b7c;hb=b87d2f4e68281062df1913440ca5753ae63314a9;hp=0000000000000000000000000000000000000000;hpb=ab0ea530b8ac956091f17b104ab2311336cfc250;p=packages%2Fprecise%2Fmcollective.git diff --git a/lib/mcollective/data.rb b/lib/mcollective/data.rb new file mode 100644 index 0000000..2d848c2 --- /dev/null +++ b/lib/mcollective/data.rb @@ -0,0 +1,91 @@ +module MCollective + module Data + autoload :Base, "mcollective/data/base" + autoload :Result, "mcollective/data/result" + + def self.load_data_sources + PluginManager.find_and_load("data") + + PluginManager.grep(/_data$/).each do |plugin| + begin + unless PluginManager[plugin].class.activate? + Log.debug("Disabling data plugin %s due to plugin activation policy" % plugin) + PluginManager.delete(plugin) + end + rescue Exception => e + Log.debug("Disabling data plugin %s due to exception #{e.class}: #{e}" % plugin) + PluginManager.delete(plugin) + end + end + end + + def self.pluginname(plugin) + plugin.to_s =~ /_data$/i ? plugin.to_s.downcase : "%s_data" % plugin.to_s.downcase + end + + def self.[](plugin) + PluginManager[pluginname(plugin)] + end + + # Data.package("httpd").architecture + def self.method_missing(method, *args) + super unless PluginManager.include?(pluginname(method)) + + PluginManager[pluginname(method)].lookup(args.first) + end + + def self.ddl(plugin) + DDL.new(pluginname(plugin), :data) + end + + def self.ddl_validate(ddl, argument) + name = ddl.meta[:name] + query = ddl.entities[:data] + + DDL.validation_fail!(:PLMC31, "No dataquery has been defined in the DDL for data plugin '%{plugin}'", :error, :plugin => name) unless query + + input = query.fetch(:input, {}) + output = query.fetch(:output, {}) + + DDL.validation_fail!(:PLMC32, "No output has been defined in the DDL for data plugin %{plugin}", :error, :plugin => name) if output.keys.empty? + + if input[:query] + return true if argument.nil? && input[:query][:optional] + + ddl.validate_input_argument(input, :query, argument) + else + DDL.validation_fail!(:PLMC33, "No data plugin argument was declared in the '%{plugin}' DDL but an input was supplied", :error, :plugin => name) if argument + return true + end + end + + def self.ddl_has_output?(ddl, output) + ddl.entities[:data][:output].include?(output.to_sym) rescue false + end + + # For an input where the DDL requests a boolean or some number + # this will convert the input to the right type where possible + # else just returns the origin input unedited + # + # if anything here goes wrong just return the input value + # this is not really the end of the world or anything since + # all that will happen is that DDL validation will fail and + # the user will get an error, no need to be too defensive here + def self.ddl_transform_input(ddl, input) + begin + type = ddl.entities[:data][:input][:query][:type] + + case type + when :boolean + return DDL.string_to_boolean(input) + + when :number, :integer, :float + return DDL.string_to_number(input) + end + rescue + end + + return input + end + end +end