noah 0.0.5-jruby → 0.1-jruby
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gemtest +0 -0
- data/.gitignore +10 -0
- data/LICENSE +201 -0
- data/README.md +68 -212
- data/Rakefile +65 -41
- data/TODO.md +65 -0
- data/bin/noah +2 -1
- data/bin/noah-watcher.rb +103 -0
- data/config.ru +6 -3
- data/config/warble.rb +18 -0
- data/examples/README.md +116 -0
- data/examples/cluster.ru +2 -0
- data/examples/custom-watcher.rb +10 -0
- data/examples/httpclient-server.rb +7 -0
- data/examples/httpclient.rb +12 -0
- data/examples/httpclient2.rb +28 -0
- data/examples/js/FABridge.js +1452 -0
- data/examples/js/WebSocketMain.swf +830 -0
- data/examples/js/swfobject.js +851 -0
- data/examples/js/web_socket.js +312 -0
- data/examples/logger.rb +11 -0
- data/examples/reconfiguring-sinatra-watcher.rb +11 -0
- data/examples/reconfiguring-sinatra.rb +33 -0
- data/examples/simple-post.rb +17 -0
- data/examples/websocket.html +24 -0
- data/examples/websocket.rb +41 -0
- data/lib/noah.rb +6 -8
- data/lib/noah/app.rb +20 -268
- data/lib/noah/application_routes.rb +70 -0
- data/lib/noah/ark.rb +0 -0
- data/lib/noah/configuration_routes.rb +81 -0
- data/lib/noah/custom_watcher.rb +79 -0
- data/lib/noah/ephemeral_routes.rb +47 -0
- data/lib/noah/helpers.rb +37 -14
- data/lib/noah/host_routes.rb +69 -0
- data/lib/noah/models.rb +86 -5
- data/lib/noah/models/applications.rb +41 -0
- data/lib/noah/models/configurations.rb +49 -0
- data/lib/noah/models/ephemerals.rb +54 -0
- data/lib/noah/models/hosts.rb +56 -0
- data/lib/noah/models/services.rb +54 -0
- data/lib/noah/models/watchers.rb +62 -0
- data/lib/noah/passthrough.rb +11 -0
- data/lib/noah/service_routes.rb +71 -0
- data/lib/noah/validations.rb +1 -0
- data/lib/noah/validations/watcher_validations.rb +48 -0
- data/lib/noah/version.rb +1 -1
- data/lib/noah/watcher_routes.rb +45 -0
- data/noah.gemspec +25 -17
- data/spec/application_spec.rb +30 -30
- data/spec/configuration_spec.rb +78 -14
- data/spec/ephemeral_spec.rb +59 -0
- data/spec/host_spec.rb +21 -21
- data/spec/noahapp_application_spec.rb +6 -6
- data/spec/noahapp_configuration_spec.rb +5 -5
- data/spec/noahapp_ephemeral_spec.rb +115 -0
- data/spec/noahapp_host_spec.rb +3 -3
- data/spec/noahapp_service_spec.rb +10 -10
- data/spec/noahapp_watcher_spec.rb +123 -0
- data/spec/service_spec.rb +27 -27
- data/spec/spec_helper.rb +13 -22
- data/spec/support/db/.keep +0 -0
- data/spec/support/test-redis.conf +8 -0
- data/spec/watcher_spec.rb +62 -0
- data/views/index.haml +21 -15
- metadata +189 -146
- data/Gemfile.lock +0 -83
- data/doc/coverage/index.html +0 -138
- data/doc/coverage/jquery-1.3.2.min.js +0 -19
- data/doc/coverage/jquery.tablesorter.min.js +0 -15
- data/doc/coverage/lib-helpers_rb.html +0 -393
- data/doc/coverage/lib-models_rb.html +0 -1449
- data/doc/coverage/noah_rb.html +0 -2019
- data/doc/coverage/print.css +0 -12
- data/doc/coverage/rcov.js +0 -42
- data/doc/coverage/screen.css +0 -270
- data/lib/noah/applications.rb +0 -46
- data/lib/noah/configurations.rb +0 -49
- data/lib/noah/hosts.rb +0 -54
- data/lib/noah/services.rb +0 -57
- data/lib/noah/watchers.rb +0 -18
data/doc/coverage/print.css
DELETED
data/doc/coverage/rcov.js
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
function toggleCode( id ) {
|
2
|
-
if ( document.getElementById ) {
|
3
|
-
elem = document.getElementById( id );
|
4
|
-
} else if ( document.all ) {
|
5
|
-
elem = eval( "document.all." + id );
|
6
|
-
} else {
|
7
|
-
return false;
|
8
|
-
}
|
9
|
-
|
10
|
-
elemStyle = elem.style;
|
11
|
-
|
12
|
-
if ( elemStyle.display != "block" ) {
|
13
|
-
elemStyle.display = "block";
|
14
|
-
} else {
|
15
|
-
elemStyle.display = "none";
|
16
|
-
}
|
17
|
-
|
18
|
-
return true;
|
19
|
-
}
|
20
|
-
|
21
|
-
function restripe() {
|
22
|
-
i = 0;
|
23
|
-
$('table#report_table tbody tr').each(function(){
|
24
|
-
if (this.style.display != "none") {
|
25
|
-
i += 1;
|
26
|
-
classes = this.className.split(" ");
|
27
|
-
if ($.inArray("even",classes) != -1) {
|
28
|
-
classes.splice($.inArray("even",classes),1);
|
29
|
-
} else if ($.inArray("odd",classes) != -1) {
|
30
|
-
classes.splice($.inArray("odd",classes),1);
|
31
|
-
}
|
32
|
-
if (i % 2 === 0) {
|
33
|
-
this.className = classes.join(" ") + " odd";
|
34
|
-
} else {
|
35
|
-
this.className = classes.join(" ") + " even";
|
36
|
-
}
|
37
|
-
}
|
38
|
-
});
|
39
|
-
}
|
40
|
-
|
41
|
-
// Fix IE's lack of support for indexOf (!)
|
42
|
-
if (!Array.indexOf) { Array.prototype.indexOf = function(obj){ for(var i=0; i<this.length; i++){ if(this[i]==obj){return i;} } return -1; }}
|
data/doc/coverage/screen.css
DELETED
@@ -1,270 +0,0 @@
|
|
1
|
-
/* @group General */
|
2
|
-
|
3
|
-
body {
|
4
|
-
font-family: Verdana, Helvetica, Arial, Sans-Serif;
|
5
|
-
font-size: 12px;
|
6
|
-
color: #4C4C4C;
|
7
|
-
background-color: #F4F2ED;
|
8
|
-
padding: 1em;
|
9
|
-
}
|
10
|
-
|
11
|
-
a:link {
|
12
|
-
color: #191919;
|
13
|
-
}
|
14
|
-
|
15
|
-
a:visited {
|
16
|
-
color: #191919;
|
17
|
-
}
|
18
|
-
|
19
|
-
pre, code {
|
20
|
-
color: #000000;
|
21
|
-
font-family: "Bitstream Vera Sans Mono","Monaco","Courier New",monospace;
|
22
|
-
font-size: 95%;
|
23
|
-
line-height: 1.3em;
|
24
|
-
margin-top: 0;
|
25
|
-
margin-bottom: 0;
|
26
|
-
padding: 0;
|
27
|
-
word-wrap: break-word;
|
28
|
-
}
|
29
|
-
|
30
|
-
h1, h2, h3, h4, h5, h6 {
|
31
|
-
margin: 0em 0em 1em 0em;
|
32
|
-
color: #666666;
|
33
|
-
}
|
34
|
-
|
35
|
-
h1 {
|
36
|
-
display: block;
|
37
|
-
font-size: 2em;
|
38
|
-
letter-spacing: -1px;
|
39
|
-
}
|
40
|
-
|
41
|
-
h2 {
|
42
|
-
margin-top: -1em;
|
43
|
-
}
|
44
|
-
|
45
|
-
fieldset {
|
46
|
-
display: inline;
|
47
|
-
border: 0px;
|
48
|
-
padding: 0px;
|
49
|
-
margin-right: 1em;
|
50
|
-
}
|
51
|
-
|
52
|
-
div.filters {
|
53
|
-
margin-bottom: 1em;
|
54
|
-
}
|
55
|
-
|
56
|
-
.hidden {
|
57
|
-
display: none;
|
58
|
-
}
|
59
|
-
|
60
|
-
/* @end */
|
61
|
-
|
62
|
-
/* @group Cross-References */
|
63
|
-
|
64
|
-
span.cross-ref-title {
|
65
|
-
font-size: 140%;
|
66
|
-
}
|
67
|
-
|
68
|
-
span.cross-ref a {
|
69
|
-
text-decoration: none;
|
70
|
-
}
|
71
|
-
|
72
|
-
span.cross-ref {
|
73
|
-
background-color:#f3f7fa;
|
74
|
-
border: 1px dashed #333;
|
75
|
-
margin: 1em;
|
76
|
-
padding: 0.5em;
|
77
|
-
overflow: hidden;
|
78
|
-
}
|
79
|
-
|
80
|
-
a.crossref-toggle {
|
81
|
-
text-decoration: none;
|
82
|
-
}
|
83
|
-
|
84
|
-
/* @end */
|
85
|
-
|
86
|
-
/* @group Report Table */
|
87
|
-
|
88
|
-
div.report_table_wrapper {
|
89
|
-
min-width: 900px;
|
90
|
-
}
|
91
|
-
|
92
|
-
table.report {
|
93
|
-
border-collapse: collapse;
|
94
|
-
border: 1px solid #666666;
|
95
|
-
width: 100%;
|
96
|
-
margin-bottom: 1em;
|
97
|
-
}
|
98
|
-
|
99
|
-
table.report tr {
|
100
|
-
line-height: 1.75em;
|
101
|
-
}
|
102
|
-
|
103
|
-
table.report th {
|
104
|
-
background: #666666;
|
105
|
-
color: #ffffff;
|
106
|
-
text-align: right;
|
107
|
-
text-transform: uppercase;
|
108
|
-
font-size: .8em;
|
109
|
-
font-weight: bold;
|
110
|
-
padding: 0em .5em;
|
111
|
-
border: 1px solid #666666;
|
112
|
-
}
|
113
|
-
|
114
|
-
table.report tfoot tr {
|
115
|
-
background: #dddddd;
|
116
|
-
font-weight: bold;
|
117
|
-
padding: .5em;
|
118
|
-
border: 1px solid #666666;
|
119
|
-
}
|
120
|
-
|
121
|
-
th.left_align, td.left_align {
|
122
|
-
text-align: left !important;
|
123
|
-
}
|
124
|
-
|
125
|
-
th.right_align, td.right_align {
|
126
|
-
text-align: right;
|
127
|
-
padding-right: 2em !important;
|
128
|
-
}
|
129
|
-
|
130
|
-
table.report th.header:hover {
|
131
|
-
cursor: pointer;
|
132
|
-
text-decoration: underline;
|
133
|
-
}
|
134
|
-
|
135
|
-
table.report th.headerSortUp:after{
|
136
|
-
content: "\25BC";
|
137
|
-
margin-left: 1em;
|
138
|
-
}
|
139
|
-
|
140
|
-
table.report th.headerSortDown:after {
|
141
|
-
content: "\25B2";
|
142
|
-
margin-left: 1em;
|
143
|
-
}
|
144
|
-
|
145
|
-
table.report tr.summary_row {
|
146
|
-
background: #cccccc;
|
147
|
-
border: 1px solid #cccccc;
|
148
|
-
}
|
149
|
-
|
150
|
-
table.report tr.summary_row td {
|
151
|
-
padding-left: .2em !important;
|
152
|
-
color: #333333;
|
153
|
-
font-weight: bold;
|
154
|
-
}
|
155
|
-
|
156
|
-
table.report td {
|
157
|
-
padding: .2em .5em .2em .5em;
|
158
|
-
}
|
159
|
-
|
160
|
-
table.report td a {
|
161
|
-
text-decoration: none;
|
162
|
-
}
|
163
|
-
|
164
|
-
table.report tbody tr:hover {
|
165
|
-
background: #cccccc !important;
|
166
|
-
}
|
167
|
-
|
168
|
-
table.report tr.summary_row td {
|
169
|
-
border-bottom: 1px solid #aaaaaa;
|
170
|
-
}
|
171
|
-
|
172
|
-
table.report tr {
|
173
|
-
background-color: #eeeeee;
|
174
|
-
}
|
175
|
-
|
176
|
-
table.report tr.odd {
|
177
|
-
background-color: #dddddd;
|
178
|
-
}
|
179
|
-
|
180
|
-
/* @end */
|
181
|
-
|
182
|
-
/* @group Percentage Graphs */
|
183
|
-
|
184
|
-
div.percent_graph_legend {
|
185
|
-
width: 5.5em;
|
186
|
-
float: left;
|
187
|
-
margin: .5em 1em .5em 0em;
|
188
|
-
height: 1em;
|
189
|
-
line-height: 1em;
|
190
|
-
}
|
191
|
-
|
192
|
-
div.percent_graph {
|
193
|
-
height: 1em;
|
194
|
-
border: #333333 1px solid;
|
195
|
-
empty-cells: show;
|
196
|
-
padding: 0px;
|
197
|
-
border-collapse: collapse;
|
198
|
-
width: 100px !important;
|
199
|
-
float: left;
|
200
|
-
margin: .5em 1em .5em 0em;
|
201
|
-
}
|
202
|
-
|
203
|
-
div.percent_graph div {
|
204
|
-
float: left;
|
205
|
-
height: 1em;
|
206
|
-
padding: 0px !important;
|
207
|
-
}
|
208
|
-
|
209
|
-
div.percent_graph div.covered {
|
210
|
-
background: #649632;
|
211
|
-
}
|
212
|
-
|
213
|
-
div.percent_graph div.uncovered {
|
214
|
-
background: #a92730;
|
215
|
-
}
|
216
|
-
|
217
|
-
div.percent_graph div.NA {
|
218
|
-
background: #eaeaea;
|
219
|
-
}
|
220
|
-
|
221
|
-
/* @end */
|
222
|
-
|
223
|
-
/* @group Details page */
|
224
|
-
|
225
|
-
table.details {
|
226
|
-
margin-top: 1em;
|
227
|
-
border-collapse: collapse;
|
228
|
-
width: 100%;
|
229
|
-
border: 1px solid #666666;
|
230
|
-
}
|
231
|
-
|
232
|
-
table.details tr {
|
233
|
-
line-height: 1.75em;
|
234
|
-
}
|
235
|
-
|
236
|
-
table.details td {
|
237
|
-
padding: .25em;
|
238
|
-
}
|
239
|
-
|
240
|
-
span.inferred, span.inferred1, span.marked, span.marked1, span.uncovered, span.uncovered1 {
|
241
|
-
display: block;
|
242
|
-
padding: .25em;
|
243
|
-
}
|
244
|
-
|
245
|
-
tr.inferred td, span.inferred {
|
246
|
-
background-color: #e0dedb;
|
247
|
-
}
|
248
|
-
|
249
|
-
tr.inferred1 td, span.inferred1 {
|
250
|
-
background-color: #e0dedb;
|
251
|
-
}
|
252
|
-
|
253
|
-
tr.marked td, span.marked, span.marked1 {
|
254
|
-
background-color: #bed2be;
|
255
|
-
}
|
256
|
-
|
257
|
-
tr.uncovered td, span.uncovered {
|
258
|
-
background-color: #ce8b8c;
|
259
|
-
}
|
260
|
-
|
261
|
-
tr.uncovered1 td, span.uncovered1 {
|
262
|
-
background-color: #ce8b8c;
|
263
|
-
}
|
264
|
-
|
265
|
-
div.key {
|
266
|
-
border: 1px solid #666666;
|
267
|
-
margin: 1em 0em;
|
268
|
-
}
|
269
|
-
|
270
|
-
/* @end */
|
data/lib/noah/applications.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
class Application < Ohm::Model
|
2
|
-
include Ohm::Typecast
|
3
|
-
include Ohm::Timestamping
|
4
|
-
include Ohm::Callbacks
|
5
|
-
include Ohm::ExtraValidations
|
6
|
-
|
7
|
-
attribute :name
|
8
|
-
collection :configurations, Configuration
|
9
|
-
|
10
|
-
index :name
|
11
|
-
|
12
|
-
def validate
|
13
|
-
assert_present :name
|
14
|
-
assert_unique :name
|
15
|
-
end
|
16
|
-
|
17
|
-
def to_hash
|
18
|
-
arr = []
|
19
|
-
configurations.sort.each {|c| arr << c.to_hash}
|
20
|
-
super.merge(:name => name, :updated_at => updated_at, :configurations => arr)
|
21
|
-
end
|
22
|
-
|
23
|
-
def is_new?
|
24
|
-
self.created_at == self.updated_at
|
25
|
-
end
|
26
|
-
|
27
|
-
class << self
|
28
|
-
def find_or_create(opts = {})
|
29
|
-
begin
|
30
|
-
find(opts).first.nil? ? (app = create(opts)) : (app = find(opts).first)
|
31
|
-
if app.valid?
|
32
|
-
app.save
|
33
|
-
end
|
34
|
-
app
|
35
|
-
rescue Exception => e
|
36
|
-
e.message
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
class Applications
|
43
|
-
def self.all(options = {})
|
44
|
-
options.empty? ? Application.all.sort : Application.find(options).sort
|
45
|
-
end
|
46
|
-
end
|
data/lib/noah/configurations.rb
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
class Configuration < Ohm::Model
|
2
|
-
include Ohm::Typecast
|
3
|
-
include Ohm::Timestamping
|
4
|
-
include Ohm::Callbacks
|
5
|
-
include Ohm::ExtraValidations
|
6
|
-
|
7
|
-
attribute :name
|
8
|
-
attribute :format
|
9
|
-
attribute :body
|
10
|
-
attribute :new_record
|
11
|
-
reference :application, Application
|
12
|
-
|
13
|
-
index :name
|
14
|
-
|
15
|
-
def validate
|
16
|
-
assert_present :name
|
17
|
-
assert_present :format
|
18
|
-
assert_present :body
|
19
|
-
assert_unique [:name, :application_id]
|
20
|
-
end
|
21
|
-
|
22
|
-
def to_hash
|
23
|
-
super.merge(:name => name, :format => format, :body => body, :update_at => updated_at, :application => Application[application_id].name)
|
24
|
-
end
|
25
|
-
|
26
|
-
def is_new?
|
27
|
-
self.created_at == self.updated_at
|
28
|
-
end
|
29
|
-
|
30
|
-
class << self
|
31
|
-
def find_or_create(opts={})
|
32
|
-
begin
|
33
|
-
if find(opts).first.nil?
|
34
|
-
conf = create(opts)
|
35
|
-
else
|
36
|
-
conf = find(opts).first
|
37
|
-
end
|
38
|
-
rescue Exception => e
|
39
|
-
e.message
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
class Configurations
|
46
|
-
def self.all(options = {})
|
47
|
-
options.empty? ? Configuration.all.sort : Configuration.find(options).sort
|
48
|
-
end
|
49
|
-
end
|
data/lib/noah/hosts.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
class Host < Ohm::Model
|
2
|
-
include Ohm::Typecast
|
3
|
-
include Ohm::Timestamping
|
4
|
-
include Ohm::Callbacks
|
5
|
-
include Ohm::ExtraValidations
|
6
|
-
|
7
|
-
attribute :name
|
8
|
-
attribute :status
|
9
|
-
collection :services, Service
|
10
|
-
|
11
|
-
index :name
|
12
|
-
index :status
|
13
|
-
|
14
|
-
def validate
|
15
|
-
assert_present :name
|
16
|
-
assert_present :status
|
17
|
-
assert_unique :name
|
18
|
-
assert_member :status, ["up","down","pending"]
|
19
|
-
end
|
20
|
-
|
21
|
-
def to_hash
|
22
|
-
arr = []
|
23
|
-
services.sort.each {|s| arr << s.to_hash}
|
24
|
-
h = {:name => name, :status => status, :created_at => created_at, :updated_at => updated_at, :services => arr}
|
25
|
-
super.merge(h)
|
26
|
-
end
|
27
|
-
|
28
|
-
def is_new?
|
29
|
-
self.created_at == self.updated_at
|
30
|
-
end
|
31
|
-
|
32
|
-
class << self
|
33
|
-
def find_or_create(opts = {})
|
34
|
-
begin
|
35
|
-
# exclude requested status from lookup
|
36
|
-
h = find(opts.reject{|key,value| key == :status}).first
|
37
|
-
host = h.nil? ? create(opts) : h
|
38
|
-
host.status = opts[:status]
|
39
|
-
if host.valid?
|
40
|
-
host.save
|
41
|
-
end
|
42
|
-
host
|
43
|
-
rescue Exception => e
|
44
|
-
e.message
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
class Hosts
|
51
|
-
def self.all(options = {})
|
52
|
-
options.empty? ? Host.all.sort : Host.find(options).sort
|
53
|
-
end
|
54
|
-
end
|