class Sensu::Extensions::Loader

Attributes

loaded_files[R]

@!attribute [r] loaded_files

@return [Array] loaded extension files.
loaded_gems[R]

@!attribute [r] loaded_gems

@return [Array] loaded extension gems.
warnings[R]

@!attribute [r] warnings

@return [Array] loader warnings.

Public Class Methods

create_category_methods() click to toggle source

Create extension category accessors and methods to test the existence of extensions. Called in initialize().

# File lib/sensu/extensions/loader.rb, line 47
def self.create_category_methods
  Extension::CATEGORIES.each do |category|
    define_method(category) do
      extension_category(category)
    end
    method_name = category.to_s.chop + "_exists?"
    define_method(method_name.to_sym) do |name|
      extension_exists?(category, name)
    end
  end
end
new() click to toggle source
# File lib/sensu/extensions/loader.rb, line 34
def initialize
  @warnings = []
  @loaded_files = []
  @loaded_gems = []
  @extensions = {}
  Extension::CATEGORIES.each do |category|
    @extensions[category] = {}
  end
  self.class.create_category_methods
end

Public Instance Methods

[](key) click to toggle source

Retrieve the extension object corresponding to a key, acting like a Hash object.

@param key [Symbol] @return [Object] value for key.

# File lib/sensu/extensions/loader.rb, line 64
def [](key)
  @extensions[key]
end
all() click to toggle source

Retrieve all extension instances.

@return [Array<object>] extensions.

# File lib/sensu/extensions/loader.rb, line 71
def all
  @extensions.map { |category, extensions|
    extensions.map { |name, extension|
      extension
    }.uniq
  }.flatten
end
load_directory(directory) click to toggle source

Load extensions from files in a directory. Files may be in nested directories.

@param [String] directory path.

# File lib/sensu/extensions/loader.rb, line 97
def load_directory(directory)
  warning("loading extension files from directory", :directory => directory)
  path = directory.gsub(/\\(?=\S)/, "/")
  Dir.glob(File.join(path, "**{,/*/**}/*.rb")).each do |file|
    load_file(file)
  end
end
load_file(file) click to toggle source

Load an extension from a file.

@param [String] file path.

# File lib/sensu/extensions/loader.rb, line 82
def load_file(file)
  warning("loading extension file", :file => file)
  begin
    require File.expand_path(file)
    @loaded_files << file
  rescue ScriptError, StandardError => error
    warning("failed to require extension", :file => file, :error => error)
    warning("ignoring extension", :file => file)
  end
end
load_gem(raw_gem, version=nil) click to toggle source

Load an extension from a Rubygem.

@param [String] gem name.

# File lib/sensu/extensions/loader.rb, line 108
def load_gem(raw_gem, version=nil)
  warning("loading extension gem", :gem => raw_gem, :version => version)
  begin
    gem(raw_gem, version) if version
    if raw_gem.start_with?(GEM_PREFIX)
      lib = raw_gem.sub(/^#{GEM_PREFIX}/, "")
      require_path = "sensu/extensions/#{lib}"
    else
      require_path = raw_gem
    end
    warning("requiring extension gem", :require => require_path)
    require require_path
    @loaded_gems << raw_gem
  rescue ScriptError, StandardError => error
    warning("failed to require extension", {
      :gem => raw_gem,
      :version => version,
      :error => error
    })
    warning("ignoring extension", :gem => raw_gem)
  end
end
load_instances(service=nil) click to toggle source

Load instances of the loaded extensions.

@param [String] sensu service to load extensions for.

# File lib/sensu/extensions/loader.rb, line 134
def load_instances(service=nil)
  service ||= sensu_service_name
  categories_to_load(service).each do |category|
    extension_type = category.to_s.chop
    Extension.const_get(extension_type.capitalize).descendants.each do |klass|
      extension = klass.new
      @extensions[category][extension.name] = extension
      if extension.name_alias
        @extensions[category][extension.name_alias] = extension
      end
      warning("loaded extension", {
        :type => extension_type,
        :name => extension.name,
        :description => extension.description
      })
    end
  end
end

Private Instance Methods

categories_to_load(service) click to toggle source

Determine which extension categories to load for the given sensu service.

@param [String] sensu service to load extensions for. @return [Array] extension categories.

# File lib/sensu/extensions/loader.rb, line 186
def categories_to_load(service)
  case service
  when "client"
    [:checks]
  when "server"
    Extension::CATEGORIES.reject { |category| category == :checks }
  else
    Extension::CATEGORIES
  end
end
extension_category(category) click to toggle source

Retrieve extension category definitions.

@param [Symbol] category to retrive. @return [Array<Hash>] category definitions.

# File lib/sensu/extensions/loader.rb, line 159
def extension_category(category)
  @extensions[category].map { |name, extension|
    extension.definition
  }.uniq
end
extension_exists?(category, name) click to toggle source

Check to see if an extension exists in a category.

@param [Symbol] category to inspect for the extension. @param [String] name of extension. @return [TrueClass, FalseClass]

# File lib/sensu/extensions/loader.rb, line 170
def extension_exists?(category, name)
  @extensions[category].has_key?(name)
end
sensu_service_name() click to toggle source

Retrieve Sensu service name.

@return [String] service name.

# File lib/sensu/extensions/loader.rb, line 177
def sensu_service_name
  File.basename($0).split("-").last
end
warning(message, data={}) click to toggle source

Record a warning.

@param message [String] warning message. @param data [Hash] warning context. @return [Array] current warnings.

# File lib/sensu/extensions/loader.rb, line 202
def warning(message, data={})
  @warnings << {
    :message => message
  }.merge(data)
end