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__