class StacksOnDeck::App

Public Class Methods

run!() click to toggle source
Calls superclass method
# File lib/stacksondeck/app.rb, line 16
def self.run!
  log.info event: 'run!'

  @@db = {}
  @@db_dump = '--- {}'
  @@last_modified = Time.now

  reconnect!

  Thread.new do
    loop do
      refresh!
      sleep settings.refresh
    end
  end

  super
end

Private Class Methods

log() click to toggle source
# File lib/stacksondeck/app.rb, line 59
def self.log ; settings.log end
reconnect!() click to toggle source
# File lib/stacksondeck/app.rb, line 70
def self.reconnect!
  @@ridley = Ridley.from_chef_config settings.config
end
refresh!() click to toggle source
# File lib/stacksondeck/app.rb, line 74
def self.refresh!
  log.info event: 'refresh!'
  started = Time.now

  hints = refresh_hints!

  nodes = @@ridley.partial_search :node, settings.query, %w[
    name
    hostname
    fqdn
    roles
    chef_environment
    tags
    kernel.machine
    platform_version
    platform_family
    platform
  ], rows: 1_000_000 # A million hosts oughta be enough for anyone!

  @@db = {}

  nodes.each do |n|
    name = n.name
    n = n.automatic
    next if n.hostname.nil?

    node_hints = hints[name] || {}
    username   = settings.username
    remote_url = File.join @@ridley.server_url, 'nodes', name
    edit_url   = File.join remote_url, 'edit'

    tags   = n.tags  || []
    tags  += n.roles || []
    tags ||= []
    tags  << n.chef_environment
    tags   = tags.uniq.compact

    @@db[name] = {
      'hostname' => n.hostname,
      'description' => n.fqdn,
      'osArch' => n.kernel.machine,
      'osVersion' => n.platform_version,
      'osFamily' => n.platform_family,
      'osName' => n.platform,
      'username' => username,
      'remoteUrl' => remote_url,
      'editUrl' => edit_url,
      'tags' => tags
    }.deep_merge!(node_hints)
  end

  @@db_dump = YAML.dump @@db

  @@last_modified = Time.now

  log.info event: 'refreshed', elapsed: (Time.now - started)

  return @@db
rescue => e
  log.error \
    event: 'exception',
    exception: e.inspect,
    class: e.class,
    message: e.message,
    backtrace: e.backtrace,
    remediation: 'reconnecting'
  reconnect!
  return @@db
end
refresh_hints!() click to toggle source
# File lib/stacksondeck/app.rb, line 64
def self.refresh_hints!
  return {} if settings.hints.nil?
  return {} unless File.exist? settings.hints
  JSON.parse File.read(settings.hints)
end

Private Instance Methods

log() click to toggle source
# File lib/stacksondeck/app.rb, line 61
def log ; settings.log end