Skip to content

Instantly share code, notes, and snippets.

@mapledyne
Last active September 16, 2015 20:31
Show Gist options
  • Save mapledyne/69feb81f2b1c01375cac to your computer and use it in GitHub Desktop.
Save mapledyne/69feb81f2b1c01375cac to your computer and use it in GitHub Desktop.
Dynamically creating dashing.io dashboards
<%
require 'rubygems'
require 'json'
class Widget
def initialize(id,title,view,order)
@widget_id = id
@widget_view = view
@widget_title = title
@widget_order = order
end
def view
@widget_view
end
def title
@widget_title
end
def order
@widget_order.to_i
end
def id
@widget_id
end
def print
return "{" + @widget_id.to_s + "," + @widget_title.to_s + "," + @widget_view.to_s + "," + @widget_order.to_s + "}"
end
end
env = File.basename(__FILE__, File.extname(__FILE__))
skynet = `/opt/skynet/skynet.py -a vms #{env.to_s}`
parsed = JSON.parse(skynet)
row = 0
vms = Hash.new
parsed['vms'].each do |key|
vms[key["id"]] = key["runstate"]
end
%>
<script type='text/javascript'>
$(function() {
// These settings override the defaults set in application.coffee. You can do this on a per dashboard basis.
Dashing.widget_base_dimensions = [200, 250]
Dashing.widget_margins = [5, 5]
Dashing.numColumns = 6
});
</script>
<% content_for :title do %>Sktap Environmet: <%= env %><% end %>
<div class="gridster">
<ul>
<%
vms.each do |vm, runstate|
row = row + 1
if runstate != "running"
%>
<li data-row="<%=row%>" data-col="1" data-sizex="1" data-sizey="1">
<div data-id="<%=vm%>-title" data-view="Textsm" data-title="Skytap VM" data-text="<%=vm%>"></div>
</li>
<li data-row="<%=row%>" data-col="2" data-sizex="2" data-sizey="1">
<div data-id="<%=vm%>_suspended" data-view="Textsm" data-title="State" data-text="<%=runstate%>"></div>
</li>
<% else
widgets = Sinatra::Application.settings.history
widget_list = []
widgets.each do |key, value|
if key.to_s.index(vm.to_s) != nil
view="Numbersm"
title=""
order_index = 1
order = value.gsub("data: ","").split(",")
order.each do |o|
set = o.split(":")
if (set[0].to_s.index("order") != nil)
order_index = set[1].gsub("\"","")
end
if (set[0].to_s.index("view") != nil)
view = set[1].gsub("\"","")
end
if (set[0].to_s.index("title") != nil)
title = set[1].gsub("\"","")
end
end
item = Widget.new(key,title,view,order_index)
widget_list.push(item)
end #if key.index(vm) != nil
end #widgets.each do |key, value|
widget_list.sort! { |a,b| a.order <=> b.order }
col = 0
widget_list.each do |w|
col = col + 1
%>
<li data-row="<%=row%>" data-col="<%=col%>" data-sizex="1" data-sizey="1">
<div data-id="<%=w.id%>" data-view="<%=w.view%>" ></div>
</li>
<%
end # widget_list.each do |w|
end #if runstate != "running"
end #vms.each do |vm, runstate|
%>
</ul>
</div>
# This script is the one that gets a list of all of our environments and
# creates symlinks for the appropriate <environment>.erb file from
# the template erb file in the assets/templates/ folder.
require 'rubygems'
require 'json'
def update_environments
status = 'normal'
service = 'Skytap'
template = '/opt/dashboard/assets/templates/environment.erb'
env_path = '/opt/dashboard/dashboards/'
widget = 'skytap_environments'
skynet = `/opt/skynet/skynet.py -a env`
parsed = JSON.parse(skynet)
total = 0
parsed.each do |value|
total += 1
erb = env_path + value.to_s + '.erb'
next if File.file?(erb)
puts 'Creating template link: ' + erb.to_s
File.symlink(template, erb)
end
Dir[env_path + '*.erb'].each do |f|
next unless File.symlink?(f)
next if parsed.include? File.basename(f, '.erb')
puts 'Deleting template link (Environment not found): ' + f.to_s
File.delete(f)
end
send_event(widget.to_s, value: total.to_i, current: total.to_i,
service: service, status: status)
end
update_environments
SCHEDULER.every '60m' do
update_environments
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment