noah 0.4 → 0.6.pre
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/Rakefile +2 -69
- data/lib/noah/agent.rb +1 -0
- data/lib/noah/agents/base_agent.rb +4 -2
- data/lib/noah/agents/http_agent.rb +1 -1
- data/lib/noah/agents/https_agent.rb +6 -0
- data/lib/noah/app.rb +8 -6
- data/lib/noah/exceptions.rb +0 -0
- data/lib/noah/linkable.rb +21 -0
- data/lib/noah/models/applications.rb +19 -9
- data/lib/noah/models/configurations.rb +32 -13
- data/lib/noah/models/ephemerals.rb +7 -6
- data/lib/noah/models/hosts.rb +11 -5
- data/lib/noah/models/link.rb +70 -29
- data/lib/noah/models/services.rb +11 -2
- data/lib/noah/models/tags.rb +86 -5
- data/lib/noah/models/watchers.rb +0 -1
- data/lib/noah/models.rb +14 -25
- data/lib/noah/{application_routes.rb → routes/applications.rb} +31 -27
- data/lib/noah/routes/configurations.rb +77 -0
- data/lib/noah/{ephemeral_routes.rb → routes/ephemerals.rb} +5 -5
- data/lib/noah/{host_routes.rb → routes/hosts.rb} +16 -1
- data/lib/noah/routes/links.rb +16 -0
- data/lib/noah/{service_routes.rb → routes/services.rb} +28 -12
- data/lib/noah/routes/tags.rb +15 -0
- data/lib/noah/{watcher_routes.rb → routes/watchers.rb} +0 -0
- data/lib/noah/taggable.rb +30 -0
- data/lib/noah/version.rb +1 -1
- data/lib/noah.rb +1 -0
- data/noah.gemspec +5 -4
- data/spec/application_spec.rb +3 -3
- data/spec/configuration_spec.rb +19 -12
- data/spec/host_spec.rb +5 -5
- data/spec/noahapp_application_spec.rb +11 -13
- data/spec/noahapp_configuration_spec.rb +63 -40
- data/spec/noahapp_ephemeral_spec.rb +15 -15
- data/spec/noahapp_host_spec.rb +4 -6
- data/spec/noahapp_service_spec.rb +8 -7
- data/spec/service_spec.rb +2 -2
- data/spec/spec_helper.rb +5 -5
- data/spec/support/sample_data.rb +87 -0
- data/spec/tag_spec.rb +78 -0
- data/views/index.haml +7 -1
- metadata +23 -16
- data/lib/noah/configuration_routes.rb +0 -81
- data/lib/noah/models/link_member.rb +0 -18
data/lib/noah/models.rb
CHANGED
@@ -10,8 +10,7 @@ module Noah
|
|
10
10
|
model.send :include, Ohm::Callbacks
|
11
11
|
model.send :include, Ohm::ExtraValidations
|
12
12
|
|
13
|
-
model.send :attribute, :
|
14
|
-
model.send :index, :tag
|
13
|
+
model.send :attribute, :metadata
|
15
14
|
|
16
15
|
# removing this as it's simply redundant
|
17
16
|
# model.after :save, :notify_via_redis_save
|
@@ -33,30 +32,24 @@ module Noah
|
|
33
32
|
self.created_at == self.updated_at
|
34
33
|
end
|
35
34
|
|
36
|
-
def tag(tags = self.tags)
|
37
|
-
tags.to_s.split(/\s*,\s*/).uniq
|
38
|
-
end
|
39
|
-
|
40
35
|
def link!(path)
|
41
36
|
base_pattern = "#{self.patternize_me}"
|
42
37
|
path.nil? ? (raise ArgumentError, "Must provide a path") : p=path
|
43
38
|
|
44
39
|
begin
|
45
|
-
l = Link.
|
46
|
-
l.
|
47
|
-
l.name
|
40
|
+
l = Link.find_or_create :path => p
|
41
|
+
l.nodes = self
|
48
42
|
rescue Exception => e
|
49
43
|
e.message
|
50
44
|
end
|
51
45
|
end
|
52
46
|
|
53
|
-
def watch!(opts={:endpoint => nil
|
47
|
+
def watch!(opts={:endpoint => nil})
|
54
48
|
base_pattern = "#{self.patternize_me}"
|
55
49
|
opts[:endpoint].nil? ? (raise ArgumentError, "Need an endpoint") : endpoint=opts[:endpoint]
|
56
|
-
opts[:pattern].nil? ? pattern=base_pattern : pattern=opts[:pattern]
|
57
50
|
|
58
51
|
begin
|
59
|
-
w = Watcher.new :pattern =>
|
52
|
+
w = Watcher.new :pattern => base_pattern, :endpoint => endpoint
|
60
53
|
w.valid? ? w.save : (raise "#{w.errors}")
|
61
54
|
w.name
|
62
55
|
rescue Exception => e
|
@@ -65,17 +58,18 @@ module Noah
|
|
65
58
|
end
|
66
59
|
|
67
60
|
protected
|
68
|
-
def patternize_me
|
61
|
+
def patternize_me(opts = {:namespace => nil})
|
62
|
+
opts[:namespace].nil? ? namespace="//noah/#{self.class_to_lower}s" : namespace="//noah/#{opts[:namespace]}/#{self.class_to_lower}s"
|
69
63
|
name.match(/^\//) ? n = name.gsub(/^\//, '') : n = name
|
70
|
-
"
|
64
|
+
"#{namespace}/#{n}"
|
71
65
|
end
|
72
66
|
|
73
67
|
def stash_name
|
74
68
|
@deleted_name = self.name
|
75
69
|
end
|
76
70
|
|
77
|
-
def class_to_lower
|
78
|
-
|
71
|
+
def class_to_lower(class_name = self.class.to_s)
|
72
|
+
class_name.gsub(/(.*)::(\w)/,'\2').downcase
|
79
73
|
end
|
80
74
|
|
81
75
|
def dbnum
|
@@ -85,15 +79,6 @@ module Noah
|
|
85
79
|
o[:db].nil? ? "#{o[:url].split('/').last}" : "#{o[:db]}"
|
86
80
|
end
|
87
81
|
|
88
|
-
def before_update
|
89
|
-
return if new?
|
90
|
-
tag(read_remote(:tags)).map(&Tag).each {|t| t.decr :total}
|
91
|
-
end
|
92
|
-
|
93
|
-
def after_save
|
94
|
-
tag.map(&Tag).each {|t| t.incr :total }
|
95
|
-
end
|
96
|
-
|
97
82
|
["create", "update", "delete"].each do |meth|
|
98
83
|
class_eval do
|
99
84
|
define_method("notify_via_redis_#{meth}".to_sym) do
|
@@ -126,7 +111,11 @@ module Noah
|
|
126
111
|
|
127
112
|
end
|
128
113
|
|
114
|
+
require File.join(File.dirname(__FILE__), 'linkable')
|
115
|
+
require File.join(File.dirname(__FILE__), 'models','link')
|
116
|
+
require File.join(File.dirname(__FILE__), 'taggable')
|
129
117
|
require File.join(File.dirname(__FILE__), 'models','tags')
|
118
|
+
require File.join(File.dirname(__FILE__), 'models','link')
|
130
119
|
require File.join(File.dirname(__FILE__), 'models','hosts')
|
131
120
|
require File.join(File.dirname(__FILE__), 'models','services')
|
132
121
|
require File.join(File.dirname(__FILE__), 'models','applications')
|
@@ -2,21 +2,23 @@ class Noah::App
|
|
2
2
|
# Application URIs
|
3
3
|
get '/applications/:appname/:config/?' do |appname, config|
|
4
4
|
app = Noah::Application.find(:name => appname).first
|
5
|
-
if app.nil?
|
6
|
-
|
7
|
-
|
8
|
-
c = Noah::Configuration.find(:name => config, :application_id => app.id).first
|
9
|
-
c.to_json
|
10
|
-
end
|
5
|
+
(halt 404) if app.nil?
|
6
|
+
c = app.configurations.find(:name => config).first
|
7
|
+
c.to_json
|
11
8
|
end
|
12
9
|
|
13
10
|
get '/applications/:appname/?' do |appname|
|
14
11
|
app = Noah::Application.find(:name => appname).first
|
15
|
-
if app.nil?
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
12
|
+
(halt 404) if app.nil?
|
13
|
+
app.to_json
|
14
|
+
end
|
15
|
+
|
16
|
+
put '/applications/:appname/tag' do |appname|
|
17
|
+
required_params = ["tags"]
|
18
|
+
data = JSON.parse(request.body.read)
|
19
|
+
(data.keys.sort == required_params.sort) ? (a=Noah::Application.find(:name=>appname).first) : (raise "Missing Parameters")
|
20
|
+
a.nil? ? (halt 404) : (a.tag!(data['tags']))
|
21
|
+
a.to_json
|
20
22
|
end
|
21
23
|
|
22
24
|
put '/applications/:appname/watch' do |appname|
|
@@ -27,6 +29,14 @@ class Noah::App
|
|
27
29
|
w.to_json
|
28
30
|
end
|
29
31
|
|
32
|
+
put '/applications/:appname/link' do |appname|
|
33
|
+
required_params = ["link_name"]
|
34
|
+
data = JSON.parse(request.body.read)
|
35
|
+
(data.keys.sort == required_params.sort) ? (a = Noah::Application.find(:name => appname).first) : (raise "Missing Parameters")
|
36
|
+
a.nil? ? (halt 404) : (a.link! data["link_name"])
|
37
|
+
a.to_json
|
38
|
+
end
|
39
|
+
|
30
40
|
put '/applications/:appname/?' do |appname|
|
31
41
|
required_params = ["name"]
|
32
42
|
data = JSON.parse(request.body.read)
|
@@ -47,24 +57,18 @@ class Noah::App
|
|
47
57
|
|
48
58
|
delete '/applications/:appname/?' do |appname|
|
49
59
|
app = Noah::Application.find(:name => appname).first
|
50
|
-
if app.nil?
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
r.to_json
|
58
|
-
end
|
60
|
+
(halt 404) if app.nil?
|
61
|
+
app.delete
|
62
|
+
r = {"result" => "success", "action" => "delete", "id" => "#{app.id}", "name" => "#{appname}"}
|
63
|
+
r.to_json
|
64
|
+
end
|
65
|
+
|
66
|
+
delete '/applications/:appname/configurations/:configname/?' do |appname, configname|
|
59
67
|
end
|
60
68
|
|
61
69
|
get '/applications/?' do
|
62
|
-
apps =
|
63
|
-
|
64
|
-
|
65
|
-
halt 404
|
66
|
-
else
|
67
|
-
apps.to_json
|
68
|
-
end
|
70
|
+
apps = Noah::Applications.all
|
71
|
+
(halt 404) if apps.size == 0
|
72
|
+
apps.to_json
|
69
73
|
end
|
70
74
|
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
class Noah::App
|
2
|
+
content_type_mapping = {
|
3
|
+
:yaml => "text/x-yaml",
|
4
|
+
:json => "application/json",
|
5
|
+
:xml => "text/xml",
|
6
|
+
:string => "text/plain"
|
7
|
+
}
|
8
|
+
# GET the raw data of a configuration object
|
9
|
+
get '/configurations/:configname/data/?' do |configname|
|
10
|
+
c = Noah::Configuration.find(:name => configname).first
|
11
|
+
(halt 404) if c.nil?
|
12
|
+
content_type content_type_mapping[c.format.to_sym] if content_type_mapping[c.format.to_sym]
|
13
|
+
response.headers['Content-Disposition'] = "attachment; filename=#{configname}"
|
14
|
+
c.body
|
15
|
+
end
|
16
|
+
# GET the JSON representation of a configuration object
|
17
|
+
get '/configurations/:configname/?' do |configname|
|
18
|
+
c = Noah::Configuration.find(:name => configname).first
|
19
|
+
(halt 404) if c.nil?
|
20
|
+
c.to_json
|
21
|
+
end
|
22
|
+
# GET all configurations
|
23
|
+
get '/configurations/?' do
|
24
|
+
configs = Noah::Configurations.all.to_hash
|
25
|
+
(halt 404) if configs.size == 0
|
26
|
+
configs.to_json
|
27
|
+
end
|
28
|
+
# Add configuration object to a custom link hierarchy
|
29
|
+
put '/configurations/:configname/link' do |configname|
|
30
|
+
required_params = ["link_name"]
|
31
|
+
data = JSON.parse(request.body.read)
|
32
|
+
(data.keys.sort == required_params.sort) ? (a = Noah::Configuration.find(:name => configname).first) : (raise "Missing Parameters")
|
33
|
+
a.nil? ? (halt 404) : (a.link! data["link_name"])
|
34
|
+
a.to_json
|
35
|
+
end
|
36
|
+
# Add a tag to a configuration object
|
37
|
+
put '/configurations/:configname/tag' do |configname|
|
38
|
+
required_params = ["tags"]
|
39
|
+
data = JSON.parse(request.body.read)
|
40
|
+
(data.keys.sort == required_params.sort) ? (c=Noah::Configuration.find(:name=>configname).first) : (raise "Missing Parameters")
|
41
|
+
c.nil? ? (halt 404) : (c.tag!(data['tags']))
|
42
|
+
c.to_json
|
43
|
+
|
44
|
+
end
|
45
|
+
# Add a watch to a configuration object
|
46
|
+
put '/configurations/:configname/watch' do |configname|
|
47
|
+
required_params = ["endpoint"]
|
48
|
+
data = JSON.parse(request.body.read)
|
49
|
+
(data.keys.sort == required_params.sort) ? (c = Noah::Configuration.find(:name => configname).first) : (raise "Missing Parameters")
|
50
|
+
c.nil? ? (halt 404) : (w = c.watch!(:endpoint => data['endpoint']))
|
51
|
+
w.to_json
|
52
|
+
end
|
53
|
+
# Attach a configuration object to an application object
|
54
|
+
put '/configurations/:configname/?' do |configname|
|
55
|
+
required_params = ["format", "body"]
|
56
|
+
data = JSON.parse(request.body.read)
|
57
|
+
data.keys.sort == required_params.sort ? config=Noah::Configuration.find_or_create(:name => configname) : (raise "Missing Parameters")
|
58
|
+
config.body = data["body"]
|
59
|
+
config.format = data["format"]
|
60
|
+
if config.valid?
|
61
|
+
config.save
|
62
|
+
action = config.is_new? ? "create" : "update"
|
63
|
+
r = {"result" => "success","id" => "#{config.id}", "action" => action, "item" => config.name}
|
64
|
+
r.to_json
|
65
|
+
else
|
66
|
+
raise "#{format_errors(config)}"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
delete '/configurations/:configname/?' do |configname|
|
71
|
+
cfg = Noah::Configuration.find(:name => configname).first
|
72
|
+
(halt 404) if cfg.nil?
|
73
|
+
cfg.delete
|
74
|
+
r = {"result" => "success", "id" => cfg.id, "action" => "delete", "affected_applications" => cfg.affected_applications, "item" => cfg.name}
|
75
|
+
r.to_json
|
76
|
+
end
|
77
|
+
end
|
@@ -1,16 +1,16 @@
|
|
1
1
|
class Noah::App
|
2
|
-
get '/
|
2
|
+
get '/ephemerals/?' do
|
3
3
|
halt 404
|
4
4
|
end
|
5
5
|
|
6
|
-
get '/
|
6
|
+
get '/ephemerals/*' do
|
7
7
|
params["splat"].size == 0 ? (halt 404) : (e=Noah::Ephemeral.find(:path => "/#{params["splat"][0]}").first)
|
8
8
|
(halt 404) if e.nil?
|
9
9
|
content_type "application/octet-stream"
|
10
10
|
e.data.nil? ? "" : "#{e.data}"
|
11
11
|
end
|
12
12
|
|
13
|
-
put '/
|
13
|
+
put '/ephemerals/*/watch' do
|
14
14
|
required_params = ["endpoint"]
|
15
15
|
data = JSON.parse(request.body.read)
|
16
16
|
(data.keys.sort == required_params.sort) ? (e = Noah::Watcher.find(:path => params[:splat][0]).first) : (raise "Missing Parameters")
|
@@ -18,7 +18,7 @@ class Noah::App
|
|
18
18
|
w.to_json
|
19
19
|
end
|
20
20
|
|
21
|
-
put '/
|
21
|
+
put '/ephemerals/*' do
|
22
22
|
raise("Data too large") if request.body.size > 512
|
23
23
|
d = request.body.read || nil
|
24
24
|
opts = {:path => "/#{params[:splat][0]}", :data => d}
|
@@ -32,7 +32,7 @@ class Noah::App
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
delete '/
|
35
|
+
delete '/ephemerals/*' do
|
36
36
|
p = params[:splat][0]
|
37
37
|
e = Noah::Ephemeral.find(:path => "/"+p).first
|
38
38
|
if e
|
@@ -25,7 +25,6 @@ class Noah::App
|
|
25
25
|
|
26
26
|
# GET all {Hosts}
|
27
27
|
get '/hosts/?' do
|
28
|
-
hosts.map {|h| h.to_hash}
|
29
28
|
if hosts.size == 0
|
30
29
|
halt 404
|
31
30
|
else
|
@@ -33,6 +32,14 @@ class Noah::App
|
|
33
32
|
end
|
34
33
|
end
|
35
34
|
|
35
|
+
put '/hosts/:hostname/tag' do |hostname|
|
36
|
+
required_params = ["tags"]
|
37
|
+
data = JSON.parse(request.body.read)
|
38
|
+
(data.keys.sort == required_params.sort) ? (a=Noah::Host.find(:name=>hostname).first) : (raise "Missing Parameters")
|
39
|
+
a.nil? ? (halt 404) : (a.tag!(data['tags']))
|
40
|
+
a.to_json
|
41
|
+
end
|
42
|
+
|
36
43
|
put '/hosts/:hostname/watch' do |hostname|
|
37
44
|
required_params = ["endpoint"]
|
38
45
|
data = JSON.parse(request.body.read)
|
@@ -41,6 +48,14 @@ class Noah::App
|
|
41
48
|
w.to_json
|
42
49
|
end
|
43
50
|
|
51
|
+
put '/hosts/:hostname/link' do |hostname|
|
52
|
+
required_params = ["link_name"]
|
53
|
+
data = JSON.parse(request.body.read)
|
54
|
+
(data.keys.sort == required_params.sort) ? (a = Noah::Host.find(:name => hostname).first) : (raise "Missing Parameters")
|
55
|
+
a.nil? ? (halt 404) : (a.link! data["link_name"])
|
56
|
+
a.to_json
|
57
|
+
end
|
58
|
+
|
44
59
|
put '/hosts/:hostname/?' do |hostname|
|
45
60
|
required_params = ["name", "status"]
|
46
61
|
data = JSON.parse(request.body.read)
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class Noah::App
|
2
|
+
|
3
|
+
get '/:link_name/:model_name/?' do |path, model|
|
4
|
+
link_name = Noah::Link.find(:path => "/"+path).first
|
5
|
+
(halt 404) if link_name.nil?
|
6
|
+
(halt 404) if link_name.to_hash.has_key?(model.to_sym) == false
|
7
|
+
link_name.to_hash[model.to_sym].to_json
|
8
|
+
end
|
9
|
+
|
10
|
+
get '/:link_name/?' do |path|
|
11
|
+
link_name = Noah::Link.find(:path => "/"+path).first
|
12
|
+
(halt 404) if link_name.nil?
|
13
|
+
link_name.to_json
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -13,21 +13,37 @@ class Noah::App
|
|
13
13
|
|
14
14
|
get '/services/:servicename/?' do |servicename|
|
15
15
|
s = services(:name => servicename)
|
16
|
-
s.
|
17
|
-
|
18
|
-
halt 404
|
19
|
-
else
|
20
|
-
s.to_json
|
21
|
-
end
|
16
|
+
(halt 404) if s.size == 0
|
17
|
+
s.to_json
|
22
18
|
end
|
23
19
|
|
24
20
|
get '/services/?' do
|
25
|
-
if services.
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
21
|
+
(halt 404) if services.size == 0
|
22
|
+
services.to_json
|
23
|
+
end
|
24
|
+
|
25
|
+
put '/services/:servicename/link' do |appname|
|
26
|
+
required_params = ["link_name"]
|
27
|
+
data = JSON.parse(request.body.read)
|
28
|
+
(data.keys.sort == required_params.sort) ? (a = Noah::Service.find(:name => servicename).first) : (raise "Missing Parameters")
|
29
|
+
a.nil? ? (halt 404) : (a.link! data["link_name"])
|
30
|
+
a.to_json
|
31
|
+
end
|
32
|
+
|
33
|
+
put '/services/:servicename/:hostname/link' do |servicename, hostname|
|
34
|
+
required_params = ["link_name"]
|
35
|
+
data = JSON.parse(request.body.read)
|
36
|
+
(data.keys.sort == required_params.sort) ? (a=host_service(hostname, servicename)) : (raise "Missing Parameters")
|
37
|
+
a.nil? ? (halt 404) : (a.link! data["link_name"])
|
38
|
+
a.to_json
|
39
|
+
end
|
40
|
+
|
41
|
+
put '/services/:servicename/:hostname/tag' do |servicename, hostname|
|
42
|
+
required_params = ["tags"]
|
43
|
+
data = JSON.parse(request.body.read)
|
44
|
+
(data.keys.sort == required_params.sort) ? (a=host_service(hostname, servicename)) : (raise "Missing Parameters")
|
45
|
+
a.nil? ? (halt 404) : (a.tag!(data['tags']))
|
46
|
+
a.to_json
|
31
47
|
end
|
32
48
|
|
33
49
|
put '/services/:servicename/watch' do |servicename|
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class Noah::App
|
2
|
+
|
3
|
+
get '/tags/:tagname/?' do |tagname|
|
4
|
+
tags = Noah::Tags.all(:name => tagname).to_hash
|
5
|
+
(halt 404) if tags.size == 0
|
6
|
+
tags.to_json
|
7
|
+
end
|
8
|
+
|
9
|
+
get '/tags/?' do
|
10
|
+
tags = Noah::Tags.all.to_hash
|
11
|
+
(halt 404) if tags.size == 0
|
12
|
+
tags.to_json
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
File without changes
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Noah::Taggable
|
2
|
+
def self.included(model)
|
3
|
+
model.send :set, :tags, ::Noah::Tag
|
4
|
+
model.send :index, :tags
|
5
|
+
end
|
6
|
+
|
7
|
+
def tag!(tag_name)
|
8
|
+
case tag_name.class.to_s
|
9
|
+
when "Array"
|
10
|
+
tag_name.each do |t|
|
11
|
+
my_tag = ::Noah::Tag.find_or_create(:name => t)
|
12
|
+
tags << my_tag
|
13
|
+
my_tag.members = self
|
14
|
+
end
|
15
|
+
else
|
16
|
+
my_tag = ::Noah::Tag.find_or_create(:name => tag_name)
|
17
|
+
tags << my_tag
|
18
|
+
my_tag.members = self
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def untag!(tag_name)
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_hash
|
26
|
+
tag_arr = Array.new
|
27
|
+
self.tags.sort.each {|t| tag_arr << t.name} if self.tags.size != 0
|
28
|
+
super.merge(:tags => tag_arr)
|
29
|
+
end
|
30
|
+
end
|
data/lib/noah/version.rb
CHANGED
data/lib/noah.rb
CHANGED
@@ -17,6 +17,7 @@ require 'yaml'
|
|
17
17
|
require 'sinatra/base'
|
18
18
|
|
19
19
|
require File.join(File.dirname(__FILE__), 'noah', 'log')
|
20
|
+
require File.join(File.dirname(__FILE__), 'noah', 'exceptions')
|
20
21
|
require File.join(File.dirname(__FILE__), 'noah', 'custom_watcher')
|
21
22
|
require File.join(File.dirname(__FILE__), 'noah','validations')
|
22
23
|
require File.join(File.dirname(__FILE__), 'noah','models')
|
data/noah.gemspec
CHANGED
@@ -4,7 +4,8 @@ require "noah/version"
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = "noah"
|
7
|
-
s.version = Noah::VERSION
|
7
|
+
s.version = "#{Noah::VERSION}.pre"
|
8
|
+
s.post_install_message = %q{This release has backwards incompatible changes to the API. Please watch http://goo.gl/jYqp2 for details}
|
8
9
|
s.platform = Gem::Platform::RUBY
|
9
10
|
#s.platform = "jruby"
|
10
11
|
s.authors = ["John E. Vincent"]
|
@@ -22,11 +23,11 @@ Gem::Specification.new do |s|
|
|
22
23
|
|
23
24
|
s.add_dependency("eventmachine", ["1.0.0.beta.3"])
|
24
25
|
s.add_dependency("em-http-request", ["1.0.0.beta.3"])
|
25
|
-
s.add_dependency("redis", ["= 2.
|
26
|
+
s.add_dependency("redis", ["= 2.2.0"])
|
26
27
|
s.add_dependency("nest", ["= 1.1.0"])
|
27
|
-
s.add_dependency("rack", ["= 1.2.
|
28
|
+
s.add_dependency("rack", ["= 1.2.2"])
|
28
29
|
s.add_dependency("tilt", ["= 1.2.2"])
|
29
|
-
s.add_dependency("sinatra", ["= 1.2.
|
30
|
+
s.add_dependency("sinatra", ["= 1.2.3"])
|
30
31
|
s.add_dependency("ohm", ["= 0.1.3"])
|
31
32
|
s.add_dependency("ohm-contrib", ["= 0.1.1"])
|
32
33
|
s.add_dependency("haml", ["= 3.0.25"])
|
data/spec/application_spec.rb
CHANGED
@@ -23,7 +23,7 @@ describe "Using the Application Model", :reset_redis => true do
|
|
23
23
|
end
|
24
24
|
it "create a new Noah::Application with Configurations" do
|
25
25
|
a = Noah::Application.create(@appdata1)
|
26
|
-
a.configurations << Noah::Configuration.create(@appconf_string
|
26
|
+
a.configurations << Noah::Configuration.create(@appconf_string)
|
27
27
|
a.valid?.should == true
|
28
28
|
a.is_new?.should == true
|
29
29
|
a.save
|
@@ -61,8 +61,8 @@ describe "Using the Application Model", :reset_redis => true do
|
|
61
61
|
b = Noah::Application.create(@appdata2)
|
62
62
|
c = Noah::Applications.all
|
63
63
|
c.size.should == 2
|
64
|
-
c.member?(a).should == true
|
65
|
-
c.member?(b).should == true
|
64
|
+
c.keys.member?(a.name).should == true
|
65
|
+
c.keys.member?(b.name).should == true
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
data/spec/configuration_spec.rb
CHANGED
@@ -3,13 +3,11 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
3
3
|
describe "Using the Configuration Model", :reset_redis => true do
|
4
4
|
before(:each) do
|
5
5
|
Ohm.redis.flushdb
|
6
|
-
|
7
|
-
@
|
8
|
-
@appconf_json = {:name => "myjsonconf", :format => "json", :body => @appconf_string.to_json, :application_id => app.id}
|
6
|
+
@appconf_string = {:name => "mystringconf", :format => "string", :body => "some_var"}
|
7
|
+
@appconf_json = {:name => "myjsonconf", :format => "json", :body => @appconf_string.to_json}
|
9
8
|
@appconf_missing_name = @appconf_string.reject {|k, v| k == :name}
|
10
9
|
@appconf_missing_format = @appconf_string.reject {|k, v| k == :format}
|
11
10
|
@appconf_missing_body = @appconf_string.reject {|k, v| k == :body}
|
12
|
-
@appconf_missing_application = @appconf_string.reject {|k, v| k == :application_id}
|
13
11
|
end
|
14
12
|
after(:each) do
|
15
13
|
Ohm.redis.flushdb
|
@@ -48,13 +46,27 @@ describe "Using the Configuration Model", :reset_redis => true do
|
|
48
46
|
c = Noah::Configuration.find(@appconf_string).first
|
49
47
|
c.nil?.should == true
|
50
48
|
end
|
49
|
+
it "delete from Application when deleting Configuration" do
|
50
|
+
# We have to test this because we override delete in Configuration
|
51
|
+
a = Noah::Configuration.find_or_create(@appconf_string)
|
52
|
+
b = Noah::Configuration.find(@appconf_string).first
|
53
|
+
c = Noah::Application.create(:name => "somerandomapp1234")
|
54
|
+
c.configurations << a
|
55
|
+
b.should == a
|
56
|
+
a.delete
|
57
|
+
d = Noah::Configuration.find(@appconf_string).first
|
58
|
+
d.nil?.should == true
|
59
|
+
a.affected_applications.member?(c.name).should == true
|
60
|
+
c.configurations.size.should == 0
|
61
|
+
end
|
51
62
|
it "return all Configurations" do
|
52
63
|
a = Noah::Configuration.find_or_create(@appconf_string)
|
53
64
|
b = Noah::Configuration.find_or_create(@appconf_json)
|
54
65
|
c = Noah::Configurations.all
|
66
|
+
c.class.to_s.should == 'Hash'
|
55
67
|
c.size.should == 2
|
56
|
-
c.
|
57
|
-
c.
|
68
|
+
c.has_key?(a.name).should == true
|
69
|
+
c.has_key?(b.name).should == true
|
58
70
|
end
|
59
71
|
end
|
60
72
|
|
@@ -74,15 +86,10 @@ describe "Using the Configuration Model", :reset_redis => true do
|
|
74
86
|
a.valid?.should == false
|
75
87
|
a.errors.should == [[:body, :not_present]]
|
76
88
|
end
|
77
|
-
it "create a new Confguration without an application" do
|
78
|
-
a = Noah::Configuration.create(@appconf_missing_application)
|
79
|
-
a.valid?.should == false
|
80
|
-
a.errors.should == [[:application_id, :not_present]]
|
81
|
-
end
|
82
89
|
it "create a duplicate Configuration" do
|
83
90
|
a = Noah::Configuration.create(@appconf_string)
|
84
91
|
b = Noah::Configuration.create(@appconf_string)
|
85
|
-
b.errors.should == [[
|
92
|
+
b.errors.should == [[:name, :not_unique]]
|
86
93
|
end
|
87
94
|
end
|
88
95
|
|
data/spec/host_spec.rb
CHANGED
@@ -73,12 +73,12 @@ describe "Using the Host Model", :reset_redis => true do
|
|
73
73
|
host2 = Noah::Host.create(:name => hostname2, :status => status2)
|
74
74
|
host1.save
|
75
75
|
host2.save
|
76
|
-
Noah::Hosts.all.class.should ==
|
76
|
+
Noah::Hosts.all.class.should == Hash
|
77
77
|
Noah::Hosts.all.size.should == 2
|
78
|
-
Noah::Hosts.all.
|
79
|
-
Noah::Hosts.all
|
80
|
-
Noah::Hosts.all.
|
81
|
-
Noah::Hosts.all
|
78
|
+
Noah::Hosts.all.has_key?(hostname1).should == true
|
79
|
+
Noah::Hosts.all[hostname1][:status].should == status1
|
80
|
+
Noah::Hosts.all.has_key?(hostname2).should == true
|
81
|
+
Noah::Hosts.all[hostname2][:status].should == status2
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
@@ -3,9 +3,9 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
3
3
|
describe "Using the Application API", :reset_redis => false do
|
4
4
|
before(:all) do
|
5
5
|
@a = Noah::Application.create(:name => 'rspec_sample_app')
|
6
|
-
@
|
6
|
+
@c = Noah::Configuration.create(:name => 'rspec_config', :format => 'string', :body => 'rspec is great')
|
7
|
+
@a.configurations << @c
|
7
8
|
@a.save
|
8
|
-
@c = @a.configurations.first
|
9
9
|
end
|
10
10
|
describe "calling" do
|
11
11
|
|
@@ -14,20 +14,20 @@ describe "Using the Application API", :reset_redis => false do
|
|
14
14
|
get '/applications'
|
15
15
|
last_response.should be_ok
|
16
16
|
response = last_response.should return_json
|
17
|
-
response.is_a?(
|
17
|
+
response.is_a?(Hash).should == true
|
18
18
|
end
|
19
19
|
it "named application should work" do
|
20
20
|
get '/applications/rspec_sample_app'
|
21
21
|
last_response.should be_ok
|
22
22
|
response = last_response.should return_json
|
23
|
-
|
24
|
-
response[
|
25
|
-
response[
|
26
|
-
|
27
|
-
c["
|
28
|
-
c
|
29
|
-
c["
|
30
|
-
c["
|
23
|
+
response.has_key?(@a.name).should == true
|
24
|
+
response[@a.name].class.to_s.should == 'Hash'
|
25
|
+
response[@a.name]["id"].should == @a.id.to_s
|
26
|
+
response[@a.name].has_key?("configurations").should == true
|
27
|
+
c = response[@a.name]["configurations"]
|
28
|
+
c.has_key?(@c.name).should == true
|
29
|
+
c["#{@c.name}"]["format"].should == "#{@c.format}"
|
30
|
+
c["#{@c.name}"]["body"].should == "#{@c.body}"
|
31
31
|
end
|
32
32
|
it "named configuration for application should work" do
|
33
33
|
get "/applications/#{@a.name}/#{@c.name}"
|
@@ -38,7 +38,6 @@ describe "Using the Application API", :reset_redis => false do
|
|
38
38
|
response["name"].should == @c.name
|
39
39
|
response["format"].should == @c.format
|
40
40
|
response["body"].should == @c.body
|
41
|
-
response["application"].should == @a.name
|
42
41
|
end
|
43
42
|
it "invalid application should not work" do
|
44
43
|
get "/applications/should_not_exist"
|
@@ -96,7 +95,6 @@ describe "Using the Application API", :reset_redis => false do
|
|
96
95
|
response["action"].should == "delete"
|
97
96
|
response["id"].nil?.should == false
|
98
97
|
response["name"].should == @appdata[:name]
|
99
|
-
response["configurations"].should == "0"
|
100
98
|
end
|
101
99
|
it "invalid application should not work" do
|
102
100
|
delete "/applications/should_not_work"
|