lib/nutcracker/web/app.rb in nutcracker-web-0.0.4 vs lib/nutcracker/web/app.rb in nutcracker-web-0.0.5

- old
+ new

@@ -1,17 +1,20 @@ +require 'open-uri' +require 'json' require 'haml' require 'sinatra' require 'json' module Nutcracker module Web class App < Sinatra::Base enable :inline_templates set :root, File.expand_path('../'*4,__FILE__) - def initialize(nutcracker = nil) + def initialize(nutcracker, external_servers = []) @nutcracker = nutcracker + @external_servers = external_servers super() end get '/' do haml :index @@ -19,24 +22,38 @@ get '/overview.json' do content_type :json overview.to_json end - - def overview - @nutcracker.overview rescue - JSON.parse File.read File.join(settings.root,"example.json") - end - + def self.assets require 'sprockets' Sprockets::Environment.new { |env| %w(javascripts stylesheets templates).each { |asset| env.append_path File.join(settings.root,"assets/#{asset}") } } end - + + private + + def overview + JSON.parse(@nutcracker.overview.to_json).tap do |internal| + internal["clusters"] += overview_from_external_servers["clusters"] + end + end + + def overview_from_external_servers + {"clusters" => []}.tap do |data| + Queue.new.tap do |q| + @external_servers.map do |server| + Thread.new { q.push JSON.parse(open("http://#{server}/overview.json").read) } + end.each(&:join) + data["clusters"] += q.pop["clusters"] while not q.empty? + end # queue + end # data + end # def + end end end __END__