noah 0.8.2-jruby → 0.8.4-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/README.md +2 -0
- data/lib/noah/agent.rb +1 -0
- data/lib/noah/agents/rundeck_agent.rb +38 -0
- data/lib/noah/app.rb +1 -1
- data/lib/noah/helpers.rb +4 -137
- data/lib/noah/helpers/base_helpers.rb +138 -0
- data/lib/noah/helpers/link_helpers.rb +0 -0
- data/lib/noah/helpers/tag_helpers.rb +0 -0
- data/lib/noah/helpers/watch_helpers.rb +0 -0
- data/lib/noah/models/link.rb +1 -0
- data/lib/noah/models/tags.rb +25 -0
- data/lib/noah/routes/applications.rb +8 -0
- data/lib/noah/routes/configurations.rb +8 -1
- data/lib/noah/routes/ephemerals.rb +1 -1
- data/lib/noah/routes/hosts.rb +9 -0
- data/lib/noah/routes/services.rb +8 -0
- data/lib/noah/taggable.rb +19 -0
- data/lib/noah/version.rb +1 -1
- data/noah.gemspec +1 -1
- data/spec/link_spec.rb +88 -0
- data/spec/noahapp_application_spec.rb +42 -3
- data/spec/tag_spec.rb +25 -0
- metadata +10 -3
data/README.md
CHANGED
data/lib/noah/agent.rb
CHANGED
@@ -4,6 +4,7 @@ require 'noah'
|
|
4
4
|
require 'noah/agents/http_agent'
|
5
5
|
require 'noah/agents/https_agent'
|
6
6
|
require 'noah/agents/dummy_agent'
|
7
|
+
require 'noah/agents/rundeck_agent'
|
7
8
|
begin
|
8
9
|
candidates = []
|
9
10
|
Gem.source_index.find_all {|g| candidates << g[1].name if g[1].name =~ /^noah-agents-.*/}
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'base_agent')
|
2
|
+
require 'em-http/middleware/cookie_jar'
|
3
|
+
require 'uri'
|
4
|
+
|
5
|
+
module Noah::Agents
|
6
|
+
class RunDeckAgent < Base
|
7
|
+
|
8
|
+
PREFIX = "rundeck://"
|
9
|
+
NAME = self.class.to_s
|
10
|
+
DEFAULT_CONCURRENCY = 50
|
11
|
+
|
12
|
+
def work!(ep, message)
|
13
|
+
logger.info("Sending message to (#{ep})")
|
14
|
+
uri = URI.parse(ep)
|
15
|
+
credentials = {:j_username => uri.user, :j_password => uri.password}
|
16
|
+
EM::HttpRequest.use EM::Middleware::CookieJar
|
17
|
+
conn = EM::HttpRequest.new("http://#{uri.host}:#{uri.port}/j_security_check")
|
18
|
+
http = conn.post :body => credentials
|
19
|
+
http.callback {
|
20
|
+
logger.info("Logged in to RunDeck. Calling path")
|
21
|
+
conn2 = EM::HttpRequest.new("http://#{uri.host}:#{uri.port}#{uri.path}?#{uri.query}")
|
22
|
+
exec = conn2.get
|
23
|
+
exec.callback {
|
24
|
+
logger.info("Successfully called #{ep}")
|
25
|
+
logger.info("Response from RunDeck:")
|
26
|
+
logger.info("#{exec.response}")
|
27
|
+
}
|
28
|
+
exec.errback {
|
29
|
+
logger.error("Something went wrong with #{ep}")
|
30
|
+
}
|
31
|
+
}
|
32
|
+
http.errback {
|
33
|
+
logger.error("Something went wrong with #{ep}")
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
data/lib/noah/app.rb
CHANGED
data/lib/noah/helpers.rb
CHANGED
@@ -1,137 +1,4 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
error_messages = model.errors.present do |e|
|
6
|
-
# Missing attributes
|
7
|
-
e.on [:name, :not_present], "Name attribute missing"
|
8
|
-
e.on [:status, :not_present], "Status attribute missing"
|
9
|
-
e.on [:format, :not_present], "Format attribute missing"
|
10
|
-
e.on [:body, :not_present], "Body attribute missing"
|
11
|
-
e.on [:application_id, :not_present], "Application attribute missing"
|
12
|
-
e.on [:path, :not_present], "Path attribute missing"
|
13
|
-
e.on [:pattern, :not_present], "Pattern attribute missing"
|
14
|
-
e.on [:endpoint, :not_present], "Endpoint attribute missing"
|
15
|
-
# Invalid option
|
16
|
-
e.on [:status, :not_member], "Status must be up, down or pending"
|
17
|
-
# Duplicate keys
|
18
|
-
e.on [[:name, :application_id], :not_unique], "Record already exists"
|
19
|
-
e.on [[:name, :host_id], :not_unique], "Record already exists"
|
20
|
-
e.on [[:endpoint, :pattern], :not_unique], "Record already exists"
|
21
|
-
e.on [:path, :not_unique], "Record already exists"
|
22
|
-
# Custom exceptions
|
23
|
-
e.on [:pattern, :already_provided], "Pattern is already provided"
|
24
|
-
e.on [:pattern, :replaces_existing], "Pattern would overwrite existing"
|
25
|
-
e.on [:path, :reserved_path], "Path is reserved"
|
26
|
-
end
|
27
|
-
error_messages.first
|
28
|
-
end
|
29
|
-
|
30
|
-
def host(opts = {})
|
31
|
-
Noah::Host.find(opts).first
|
32
|
-
end
|
33
|
-
|
34
|
-
def hosts(opts = {})
|
35
|
-
Noah::Hosts.all(opts)
|
36
|
-
end
|
37
|
-
|
38
|
-
def service(opts = {})
|
39
|
-
Noah::Service.find(options)
|
40
|
-
end
|
41
|
-
|
42
|
-
def services(opts = {})
|
43
|
-
Noah::Services.all(opts)
|
44
|
-
end
|
45
|
-
|
46
|
-
def host_service(hostname, servicename)
|
47
|
-
h = Noah::Host.find(:name => hostname).first
|
48
|
-
if h.nil?
|
49
|
-
nil
|
50
|
-
else
|
51
|
-
Noah::Service.find(:host_id => h.id, :name => servicename).first
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def host_services(hostname)
|
56
|
-
h = Noah::Host.find(:name => hostname).first
|
57
|
-
if h.nil?
|
58
|
-
nil
|
59
|
-
else
|
60
|
-
Noah::Services.all(:host_id => id)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def find_hosts_by_service(servicename)
|
65
|
-
affected_hosts = []
|
66
|
-
s = Noah::Service.find(:name => servicename)
|
67
|
-
if s.nil?
|
68
|
-
affected_hosts
|
69
|
-
else
|
70
|
-
Noah::Host.all.each {|x| affected_hosts << x if (x.services.to_a & s.to_a).length > 0}
|
71
|
-
affected_hosts
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def delete_service_from_host(servicename, hostname)
|
76
|
-
host = Noah::Host.find(:name => hostname).first
|
77
|
-
(halt 404) if host.nil?
|
78
|
-
service = Noah::Service.find(:name => servicename, :host_id => host.id).first
|
79
|
-
(halt 404) if service.nil?
|
80
|
-
service.delete
|
81
|
-
r = {"action" => "delete", "result" => "success", "id" => service.id, "host" => host.name, "service" => servicename}
|
82
|
-
r.to_json
|
83
|
-
end
|
84
|
-
|
85
|
-
def find_named_link(path)
|
86
|
-
link = Noah::Link.find(:path => "/"+path).first
|
87
|
-
if link.nil?
|
88
|
-
# try finding it wihtout the slash
|
89
|
-
link = Noah::Link.find(:path => path).first
|
90
|
-
(halt 404) if link.nil?
|
91
|
-
end
|
92
|
-
return link
|
93
|
-
end
|
94
|
-
def add_config_to_app(appname, config_hash)
|
95
|
-
begin
|
96
|
-
config = Noah::Configuration.find_or_create(config_hash)
|
97
|
-
if config.valid?
|
98
|
-
dep_action = config.is_new? ? "create" : "update"
|
99
|
-
else
|
100
|
-
raise "#{format_errors(config)}"
|
101
|
-
end
|
102
|
-
app = Noah::Application.find_or_create(:name => appname)
|
103
|
-
if app.valid?
|
104
|
-
action = app.is_new? ? "create" : "update"
|
105
|
-
app.configurations << config
|
106
|
-
r = {"result" => "success", "id" => "#{app.id}", "name" => "#{app.name}", "action" => action, "configuration" => {"action" => dep_action, "id" => "#{config.id}", "item" => "#{config.name}"}}
|
107
|
-
r.to_json
|
108
|
-
else
|
109
|
-
raise "#{format_errors(app)}"
|
110
|
-
end
|
111
|
-
rescue Exception => e
|
112
|
-
e.message
|
113
|
-
ensure
|
114
|
-
# Clean up partial objects
|
115
|
-
app.delete if app.valid? == false
|
116
|
-
config.delete if config.valid? == false
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
def application(opts = {})
|
121
|
-
Noah::Application.find(opts).first
|
122
|
-
end
|
123
|
-
|
124
|
-
def applications(opts = {})
|
125
|
-
Noah::Applications.all(opts)
|
126
|
-
end
|
127
|
-
|
128
|
-
def configuration(opts = {})
|
129
|
-
Noah::Configuration.find(opts).first
|
130
|
-
end
|
131
|
-
|
132
|
-
def configurations(opts = {})
|
133
|
-
Noah::Configurations.all(opts)
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
end
|
1
|
+
require File.join(File.dirname(__FILE__), 'helpers', 'base_helpers')
|
2
|
+
require File.join(File.dirname(__FILE__), 'helpers', 'tag_helpers')
|
3
|
+
require File.join(File.dirname(__FILE__), 'helpers', 'link_helpers')
|
4
|
+
require File.join(File.dirname(__FILE__), 'helpers', 'watch_helpers')
|
@@ -0,0 +1,138 @@
|
|
1
|
+
module Noah
|
2
|
+
module SinatraBaseHelpers
|
3
|
+
|
4
|
+
def format_errors(model)
|
5
|
+
error_messages = model.errors.present do |e|
|
6
|
+
# Missing attributes
|
7
|
+
e.on [:name, :not_present], "Name attribute missing"
|
8
|
+
e.on [:status, :not_present], "Status attribute missing"
|
9
|
+
e.on [:format, :not_present], "Format attribute missing"
|
10
|
+
e.on [:body, :not_present], "Body attribute missing"
|
11
|
+
e.on [:application_id, :not_present], "Application attribute missing"
|
12
|
+
e.on [:path, :not_present], "Path attribute missing"
|
13
|
+
e.on [:pattern, :not_present], "Pattern attribute missing"
|
14
|
+
e.on [:endpoint, :not_present], "Endpoint attribute missing"
|
15
|
+
# Invalid option
|
16
|
+
e.on [:status, :not_member], "Status must be up, down or pending"
|
17
|
+
# Duplicate keys
|
18
|
+
e.on [[:name, :application_id], :not_unique], "Record already exists"
|
19
|
+
e.on [[:name, :host_id], :not_unique], "Record already exists"
|
20
|
+
e.on [[:endpoint, :pattern], :not_unique], "Record already exists"
|
21
|
+
e.on [:path, :not_unique], "Record already exists"
|
22
|
+
# Custom exceptions
|
23
|
+
e.on [:pattern, :already_provided], "Pattern is already provided"
|
24
|
+
e.on [:pattern, :replaces_existing], "Pattern would overwrite existing"
|
25
|
+
e.on [:path, :reserved_path], "Path is reserved"
|
26
|
+
end
|
27
|
+
error_messages.first
|
28
|
+
end
|
29
|
+
|
30
|
+
def host(opts = {})
|
31
|
+
Noah::Host.find(opts).first
|
32
|
+
end
|
33
|
+
|
34
|
+
def hosts(opts = {})
|
35
|
+
Noah::Hosts.all(opts)
|
36
|
+
end
|
37
|
+
|
38
|
+
def service(opts = {})
|
39
|
+
Noah::Service.find(options)
|
40
|
+
end
|
41
|
+
|
42
|
+
def services(opts = {})
|
43
|
+
Noah::Services.all(opts)
|
44
|
+
end
|
45
|
+
|
46
|
+
def host_service(hostname, servicename)
|
47
|
+
h = Noah::Host.find(:name => hostname).first
|
48
|
+
if h.nil?
|
49
|
+
nil
|
50
|
+
else
|
51
|
+
Noah::Service.find(:host_id => h.id, :name => servicename).first
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def host_services(hostname)
|
56
|
+
h = Noah::Host.find(:name => hostname).first
|
57
|
+
if h.nil?
|
58
|
+
nil
|
59
|
+
else
|
60
|
+
Noah::Services.all(:host_id => id)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def find_hosts_by_service(servicename)
|
65
|
+
affected_hosts = []
|
66
|
+
s = Noah::Service.find(:name => servicename)
|
67
|
+
if s.nil?
|
68
|
+
affected_hosts
|
69
|
+
else
|
70
|
+
Noah::Host.all.each {|x| affected_hosts << x if (x.services.to_a & s.to_a).length > 0}
|
71
|
+
affected_hosts
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def delete_service_from_host(servicename, hostname)
|
76
|
+
host = Noah::Host.find(:name => hostname).first
|
77
|
+
(halt 404) if host.nil?
|
78
|
+
service = Noah::Service.find(:name => servicename, :host_id => host.id).first
|
79
|
+
(halt 404) if service.nil?
|
80
|
+
service.delete
|
81
|
+
r = {"action" => "delete", "result" => "success", "id" => service.id, "host" => host.name, "service" => servicename}
|
82
|
+
r.to_json
|
83
|
+
end
|
84
|
+
|
85
|
+
def find_named_link(path)
|
86
|
+
link = Noah::Link.find(:path => "/"+path).first
|
87
|
+
if link.nil?
|
88
|
+
# try finding it wihtout the slash
|
89
|
+
link = Noah::Link.find(:path => path).first
|
90
|
+
(halt 404) if link.nil?
|
91
|
+
end
|
92
|
+
return link
|
93
|
+
end
|
94
|
+
|
95
|
+
def add_config_to_app(appname, config_hash)
|
96
|
+
begin
|
97
|
+
config = Noah::Configuration.find_or_create(config_hash)
|
98
|
+
if config.valid?
|
99
|
+
dep_action = config.is_new? ? "create" : "update"
|
100
|
+
else
|
101
|
+
raise "#{format_errors(config)}"
|
102
|
+
end
|
103
|
+
app = Noah::Application.find_or_create(:name => appname)
|
104
|
+
if app.valid?
|
105
|
+
action = app.is_new? ? "create" : "update"
|
106
|
+
app.configurations << config
|
107
|
+
r = {"result" => "success", "id" => "#{app.id}", "name" => "#{app.name}", "action" => action, "configuration" => {"action" => dep_action, "id" => "#{config.id}", "item" => "#{config.name}"}}
|
108
|
+
r.to_json
|
109
|
+
else
|
110
|
+
raise "#{format_errors(app)}"
|
111
|
+
end
|
112
|
+
rescue Exception => e
|
113
|
+
e.message
|
114
|
+
ensure
|
115
|
+
# Clean up partial objects
|
116
|
+
app.delete if app.valid? == false
|
117
|
+
config.delete if config.valid? == false
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def application(opts = {})
|
122
|
+
Noah::Application.find(opts).first
|
123
|
+
end
|
124
|
+
|
125
|
+
def applications(opts = {})
|
126
|
+
Noah::Applications.all(opts)
|
127
|
+
end
|
128
|
+
|
129
|
+
def configuration(opts = {})
|
130
|
+
Noah::Configuration.find(opts).first
|
131
|
+
end
|
132
|
+
|
133
|
+
def configurations(opts = {})
|
134
|
+
Noah::Configurations.all(opts)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
data/lib/noah/models/link.rb
CHANGED
data/lib/noah/models/tags.rb
CHANGED
@@ -6,6 +6,15 @@ module Noah
|
|
6
6
|
index :members
|
7
7
|
index :name
|
8
8
|
|
9
|
+
def delete
|
10
|
+
self.members.each_value do |member_array|
|
11
|
+
member_array.each do |mem|
|
12
|
+
delete_member(mem)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
super
|
16
|
+
end
|
17
|
+
|
9
18
|
def validate
|
10
19
|
super
|
11
20
|
assert_present :name
|
@@ -29,6 +38,22 @@ module Noah
|
|
29
38
|
hsh
|
30
39
|
end
|
31
40
|
|
41
|
+
def delete_member(node)
|
42
|
+
nc = class_to_lower(node.class.to_s)+"s"
|
43
|
+
# Need to refactor. Essentially there are conditions we need to check for before trying to delete a member
|
44
|
+
# Are there any members at all?
|
45
|
+
# Are there any members of a given class?
|
46
|
+
# Not pretty but it works for now
|
47
|
+
if self.members.size == 0 || self.members.has_key?(nc.to_sym) == false
|
48
|
+
# no match so save and be done with it
|
49
|
+
self.save
|
50
|
+
elsif self.members[nc.to_sym].include?(node)
|
51
|
+
Ohm.redis.srem("#{self.key}:members", "#{node.key}")
|
52
|
+
node.untag!(self.name) if node.tags.include?(self)
|
53
|
+
self.save
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
32
57
|
def to_hash
|
33
58
|
h = {:name => name, :created_at => created_at, :updated_at => updated_at}
|
34
59
|
h.merge!(members_to_hash)
|
@@ -21,6 +21,14 @@ class Noah::App
|
|
21
21
|
a.to_json
|
22
22
|
end
|
23
23
|
|
24
|
+
delete '/applications/:appname/tag' do |appname|
|
25
|
+
required_params = ["tags"]
|
26
|
+
data = JSON.parse(request.body.read)
|
27
|
+
(data.keys.sort == required_params.sort) ? (a=Noah::Application.find(:name=>appname).first) : (raise "Missing Parameters")
|
28
|
+
a.nil? ? (halt 404) : (a.untag!(data['tags']))
|
29
|
+
a.to_json
|
30
|
+
end
|
31
|
+
|
24
32
|
put '/applications/:appname/watch' do |appname|
|
25
33
|
required_params = ["endpoint"]
|
26
34
|
data = JSON.parse(request.body.read)
|
@@ -38,7 +38,14 @@ class Noah::App
|
|
38
38
|
(data.keys.sort == required_params.sort) ? (c=Noah::Configuration.find(:name=>configname).first) : (raise "Missing Parameters")
|
39
39
|
c.nil? ? (halt 404) : (c.tag!(data['tags']))
|
40
40
|
c.to_json
|
41
|
-
|
41
|
+
end
|
42
|
+
# Delete a tag[s] from a configuration object
|
43
|
+
delete '/configurations/:configname/tag' do |configname|
|
44
|
+
required_params = ["tags"]
|
45
|
+
data = JSON.parse(request.body.read)
|
46
|
+
(data.keys.sort == required_params.sort) ? (c=Noah::Configuration.find(:name=>configname).first) : (raise "Missing Parameters")
|
47
|
+
c.nil? ? (halt 404) : (c.untag!(data['tags']))
|
48
|
+
c.to_json
|
42
49
|
end
|
43
50
|
# Add a watch to a configuration object
|
44
51
|
put '/configurations/:configname/watch' do |configname|
|
@@ -25,7 +25,7 @@ class Noah::App
|
|
25
25
|
e = Noah::Ephemeral.find_or_create(opts)
|
26
26
|
if e.valid?
|
27
27
|
action = e.is_new? ? "create" : "update"
|
28
|
-
r = {"action" => action, "result" => "success", "id" => e.id, "path" => e.path, "data" => e.data}
|
28
|
+
r = {"action" => action, "result" => "success", "id" => e.id, "path" => e.path, "data" => e.data, "created_at" => e.created_at, "updated_at" => e.updated_at}
|
29
29
|
r.to_json
|
30
30
|
else
|
31
31
|
raise "#{format_errors(e)}"
|
data/lib/noah/routes/hosts.rb
CHANGED
@@ -41,6 +41,15 @@ class Noah::App
|
|
41
41
|
a.to_json
|
42
42
|
end
|
43
43
|
|
44
|
+
delete '/hosts/:hostname/tag' do |hostname|
|
45
|
+
required_params = ["tags"]
|
46
|
+
data = JSON.parse(request.body.read)
|
47
|
+
raise "Missing parameters" if data.nil?
|
48
|
+
(data.keys.sort == required_params.sort) ? (a=Noah::Host.find(:name=>hostname).first) : (raise "Missing Parameters")
|
49
|
+
a.nil? ? (halt 404) : (a.untag!(data['tags']))
|
50
|
+
a.to_json
|
51
|
+
end
|
52
|
+
|
44
53
|
put '/hosts/:hostname/watch' do |hostname|
|
45
54
|
required_params = ["endpoint"]
|
46
55
|
data = JSON.parse(request.body.read)
|
data/lib/noah/routes/services.rb
CHANGED
@@ -46,6 +46,14 @@ class Noah::App
|
|
46
46
|
a.to_json
|
47
47
|
end
|
48
48
|
|
49
|
+
delete '/services/:servicename/:hostname/tag' do |servicename, hostname|
|
50
|
+
required_params = ["tags"]
|
51
|
+
data = JSON.parse(request.body.read)
|
52
|
+
(data.keys.sort == required_params.sort) ? (a=host_service(hostname, servicename)) : (raise "Missing Parameters")
|
53
|
+
a.nil? ? (halt 404) : (a.untag!(data['tags']))
|
54
|
+
a.to_json
|
55
|
+
end
|
56
|
+
|
49
57
|
put '/services/:servicename/watch' do |servicename|
|
50
58
|
required_params = ["endpoint"]
|
51
59
|
data = JSON.parse(request.body.read)
|
data/lib/noah/taggable.rb
CHANGED
@@ -17,9 +17,19 @@ module Noah::Taggable
|
|
17
17
|
tags << my_tag
|
18
18
|
my_tag.members = self
|
19
19
|
end
|
20
|
+
self.save
|
20
21
|
end
|
21
22
|
|
22
23
|
def untag!(tag_name)
|
24
|
+
case tag_name.class.to_s
|
25
|
+
when "Array"
|
26
|
+
tag_name.each do |t|
|
27
|
+
remove_tag(t)
|
28
|
+
end
|
29
|
+
else
|
30
|
+
remove_tag(tag_name)
|
31
|
+
end
|
32
|
+
self.save
|
23
33
|
end
|
24
34
|
|
25
35
|
def to_hash
|
@@ -27,4 +37,13 @@ module Noah::Taggable
|
|
27
37
|
self.tags.sort.each {|t| tag_arr << t.name} if self.tags.size != 0
|
28
38
|
super.merge(:tags => tag_arr)
|
29
39
|
end
|
40
|
+
|
41
|
+
protected
|
42
|
+
def remove_tag(tag_name)
|
43
|
+
my_tag = ::Noah::Tag.find(:name => tag_name).first
|
44
|
+
if self.tags.member?(my_tag)
|
45
|
+
self.tags.key.srem "#{my_tag.id}"
|
46
|
+
my_tag.delete_member(self)
|
47
|
+
end
|
48
|
+
end
|
30
49
|
end
|
data/lib/noah/version.rb
CHANGED
data/noah.gemspec
CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new do |s|
|
|
22
22
|
s.require_paths = ["lib"]
|
23
23
|
|
24
24
|
s.add_dependency("eventmachine", ["1.0.0.beta.3"])
|
25
|
-
s.add_dependency("em-http-request", ["1.0.0.beta.
|
25
|
+
s.add_dependency("em-http-request", ["1.0.0.beta.4"])
|
26
26
|
s.add_dependency("redis", ["= 2.2.0"])
|
27
27
|
s.add_dependency("nest", ["= 1.1.0"])
|
28
28
|
s.add_dependency("rack", ["= 1.2.2"])
|
data/spec/link_spec.rb
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "Using the Link Model", :reset_redis => true do
|
4
|
+
before(:each) do
|
5
|
+
Ohm.redis.flushdb
|
6
|
+
@link = "/myorg"
|
7
|
+
@host = Noah::Host.create(:name => 'linked_host', :status => 'up')
|
8
|
+
@service = Noah::Service.create(:name => 'linked_service', :status => 'down', :host_id => @host.id)
|
9
|
+
@application = Noah::Application.create(:name => "linked_application")
|
10
|
+
@configuration = Noah::Configuration.create(:name => "linked_configuration", :format => "string", :body => "some_string")
|
11
|
+
@ephemeral = Noah::Ephemeral.create(:path => "/linked/ephemeral")
|
12
|
+
end
|
13
|
+
after(:each) do
|
14
|
+
Ohm.redis.flushdb
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "should" do
|
18
|
+
it "create a new Noah::Link" do
|
19
|
+
l = Noah::Link.new(:path => @link)
|
20
|
+
l.valid?.should == true
|
21
|
+
l.save
|
22
|
+
l.is_new?.should == true
|
23
|
+
xl = Noah::Link.find(:path => @link).first
|
24
|
+
xl.should == l
|
25
|
+
end
|
26
|
+
it "create a new Noah::Link and add a single member" do
|
27
|
+
l = Noah::Link.create(:path => @link)
|
28
|
+
l.nodes = @host
|
29
|
+
@host.links.member?(l).should == true
|
30
|
+
@host.links.size.should == 1
|
31
|
+
l.nodes.size.should == 1
|
32
|
+
l.nodes.member?(@host.key).should == true
|
33
|
+
end
|
34
|
+
|
35
|
+
it "create a new Noah::Link and add multiple members" do
|
36
|
+
l = Noah::Link.create(:path => @link)
|
37
|
+
l.nodes = [@host, @service, @application, @configuration, @ephemeral]
|
38
|
+
l.nodes.size.should == 5
|
39
|
+
[@host, @service, @application, @configuration, @ephemeral].each do |node|
|
40
|
+
l.nodes.member?(node.key).should == true
|
41
|
+
node.links.member?(l).should == true
|
42
|
+
node.links.size.should == 1
|
43
|
+
end
|
44
|
+
end
|
45
|
+
it "link! an existing object to a single link" do
|
46
|
+
@host.link!(@link)
|
47
|
+
l = Noah::Link.find(:path => @link).first
|
48
|
+
@host.links.member?(l).should == true
|
49
|
+
@host.links.size.should == 1
|
50
|
+
l.nodes.member?(@host.key).should == true
|
51
|
+
l.nodes.size.should == 1
|
52
|
+
end
|
53
|
+
it "return a hash of all nodes" do
|
54
|
+
l = Noah::Link.create(:path => @link)
|
55
|
+
l.nodes = [@host, @service, @application, @configuration, @ephemeral]
|
56
|
+
h = l.to_hash
|
57
|
+
h[:id].should == l.id
|
58
|
+
h[:name].should == l.name
|
59
|
+
h[:updated_at].should == l.updated_at
|
60
|
+
h[:created_at].should == l.created_at
|
61
|
+
h[:hosts].has_key?(@host.name).should == true
|
62
|
+
h[:hosts][@host.name].keys.sort.should == [:id, :status, :tags, :services].sort
|
63
|
+
h[:services].has_key?(@service.name).should == true
|
64
|
+
h[:services][@service.name][@host.name].keys.sort.should == [:id, :status, :tags].sort
|
65
|
+
h[:applications].has_key?(@application.name).should == true
|
66
|
+
h[:applications][@application.name].keys.sort.should == [:id, :tags, :configurations].sort
|
67
|
+
h[:configurations].has_key?(@configuration.name).should == true
|
68
|
+
h[:configurations][@configuration.name].keys.sort.should == [:id, :tags, :format, :body].sort
|
69
|
+
h[:ephemerals].has_key?(@ephemeral.name).should == true
|
70
|
+
h[:ephemerals][@ephemeral.name].keys.sort.should == [:id, :tags, :path, :data].sort
|
71
|
+
end
|
72
|
+
end
|
73
|
+
describe "should not" do
|
74
|
+
it "create a new Noah::Link without a path" do
|
75
|
+
l = Noah::Link.create
|
76
|
+
l.valid?.should == false
|
77
|
+
l.errors.should == [[:path, :not_present]]
|
78
|
+
end
|
79
|
+
it "create a link with a duplicate name" do
|
80
|
+
l = Noah::Link.create(:path => @link)
|
81
|
+
ln = Noah::Link.create(:path => @link)
|
82
|
+
ln.valid?.should == false
|
83
|
+
ln.errors.should == [[:path, :not_unique]]
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
|
@@ -75,11 +75,26 @@ describe "Using the Application API", :reset_redis => false do
|
|
75
75
|
Noah::Application.find(:name => @appdata[:name]).size.should == 1
|
76
76
|
Noah::Application.find(:name => @appdata[:name]).first.is_new?.should == true
|
77
77
|
end
|
78
|
-
|
78
|
+
|
79
|
+
it "new application with new configuration should work" do
|
80
|
+
post_json = '{"body":"awesome_string","format":"string"}'
|
81
|
+
put "/applications/my_awesome_app/configurations/my_awesome_config", post_json, "CONTENT_TYPE" => "application/json"
|
82
|
+
last_response.should be_ok
|
83
|
+
response = last_response.should return_json
|
84
|
+
response["result"].should == "success"
|
85
|
+
response["id"].nil?.should == false
|
86
|
+
response["name"].should == "my_awesome_app"
|
87
|
+
response["action"].should == "create"
|
88
|
+
response["configuration"]["action"].should == "create"
|
89
|
+
response["configuration"]["id"].nil?.should == false
|
90
|
+
response["configuration"]["item"].should == "my_awesome_config"
|
91
|
+
end
|
92
|
+
|
79
93
|
it "new application with missing name should not work" do
|
80
94
|
put "/applications/should_not_work", '{"foo":"bar"}', "CONTENT_TYPE" => "application/json"
|
81
95
|
last_response.should be_invalid
|
82
96
|
end
|
97
|
+
|
83
98
|
it "existing application should work" do
|
84
99
|
sleep 3
|
85
100
|
|
@@ -93,8 +108,32 @@ describe "Using the Application API", :reset_redis => false do
|
|
93
108
|
Noah::Application.find(:name => @appdata[:name]).size.should == 1
|
94
109
|
Noah::Application.find(:name => @appdata[:name]).first.is_new?.should == false
|
95
110
|
end
|
96
|
-
|
97
|
-
it "existing application with
|
111
|
+
|
112
|
+
it "existing application with new configuration" do
|
113
|
+
post_json = '{"body":"derp","format":"string"}'
|
114
|
+
put "/applications/#{@appdata[:name]}/configurations/herp", post_json, "CONTENT_TYPE" => "application/json"
|
115
|
+
last_response.should be_ok
|
116
|
+
response = last_response.should return_json
|
117
|
+
response["result"].should == "success"
|
118
|
+
response["action"].should == "update"
|
119
|
+
response["configuration"]["action"].should == "create"
|
120
|
+
response["configuration"]["id"].nil?.should == false
|
121
|
+
response["configuration"]["item"].should == "herp"
|
122
|
+
end
|
123
|
+
|
124
|
+
it "existing application with existing configuration" do
|
125
|
+
post_json = '{"body":"derp","format":"string"}'
|
126
|
+
put "/applications/#{@appdata[:name]}/configurations/herp", post_json, "CONTENT_TYPE" => "application/json"
|
127
|
+
sleep 3
|
128
|
+
put "/applications/#{@appdata[:name]}/configurations/herp", post_json, "CONTENT_TYPE" => "application/json"
|
129
|
+
last_response.should be_ok
|
130
|
+
response = last_response.should return_json
|
131
|
+
response["result"].should == "success"
|
132
|
+
response["action"].should == "update"
|
133
|
+
response["configuration"]["action"].should == "update"
|
134
|
+
response["configuration"]["id"].nil?.should == false
|
135
|
+
response["configuration"]["item"].should == "herp"
|
136
|
+
end
|
98
137
|
end
|
99
138
|
|
100
139
|
describe "DELETE" do
|
data/spec/tag_spec.rb
CHANGED
@@ -60,6 +60,31 @@ describe "Using the Tag Model", :reset_redis => true do
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
end
|
63
|
+
it "should untag! a single tag from an object" do
|
64
|
+
@application.tag! "foobarspec"
|
65
|
+
t = Noah::Tag.find(:name => 'foobarspec').first
|
66
|
+
t.nil?.should == false
|
67
|
+
@application.tags.size.should == 1
|
68
|
+
@application.tags.include?(t).should == true
|
69
|
+
t.members.size.should == 1
|
70
|
+
t.members[:applications].include?(@application).should == true
|
71
|
+
@application.untag! "foobarspec"
|
72
|
+
@application.tags.size.should == 0
|
73
|
+
t.members.size.should == 0
|
74
|
+
end
|
75
|
+
it "should untag! an array of tags from an object" do
|
76
|
+
tagz = %w{foo bar baz bang}
|
77
|
+
@application.tag! tagz
|
78
|
+
@application.tags.size.should == tagz.size
|
79
|
+
@application.untag! tagz
|
80
|
+
@application.tags.size.should == 0
|
81
|
+
tagz.each do |tag|
|
82
|
+
t = Noah::Tag.find(:name => tag).first
|
83
|
+
t.nil?.should == false
|
84
|
+
Noah::Tag.all.size.should == tagz.size
|
85
|
+
t.members.has_key?(:applications).should == false
|
86
|
+
end
|
87
|
+
end
|
63
88
|
end
|
64
89
|
|
65
90
|
describe "should not" do
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: noah
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.8.
|
5
|
+
version: 0.8.4
|
6
6
|
platform: jruby
|
7
7
|
authors:
|
8
8
|
- John E. Vincent
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-
|
13
|
+
date: 2011-06-08 00:00:00 -04:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
requirements:
|
33
33
|
- - "="
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version: 1.0.0.beta.
|
35
|
+
version: 1.0.0.beta.4
|
36
36
|
type: :runtime
|
37
37
|
version_requirements: *id002
|
38
38
|
- !ruby/object:Gem::Dependency
|
@@ -282,11 +282,16 @@ files:
|
|
282
282
|
- lib/noah/agents/dummy_agent.rb
|
283
283
|
- lib/noah/agents/http_agent.rb
|
284
284
|
- lib/noah/agents/https_agent.rb
|
285
|
+
- lib/noah/agents/rundeck_agent.rb
|
285
286
|
- lib/noah/app.rb
|
286
287
|
- lib/noah/ark.rb
|
287
288
|
- lib/noah/custom_watcher.rb
|
288
289
|
- lib/noah/exceptions.rb
|
289
290
|
- lib/noah/helpers.rb
|
291
|
+
- lib/noah/helpers/base_helpers.rb
|
292
|
+
- lib/noah/helpers/link_helpers.rb
|
293
|
+
- lib/noah/helpers/tag_helpers.rb
|
294
|
+
- lib/noah/helpers/watch_helpers.rb
|
290
295
|
- lib/noah/linkable.rb
|
291
296
|
- lib/noah/log.rb
|
292
297
|
- lib/noah/models.rb
|
@@ -317,6 +322,7 @@ files:
|
|
317
322
|
- spec/configuration_spec.rb
|
318
323
|
- spec/ephemeral_spec.rb
|
319
324
|
- spec/host_spec.rb
|
325
|
+
- spec/link_spec.rb
|
320
326
|
- spec/noahapp_application_spec.rb
|
321
327
|
- spec/noahapp_configuration_spec.rb
|
322
328
|
- spec/noahapp_ephemeral_spec.rb
|
@@ -368,6 +374,7 @@ test_files:
|
|
368
374
|
- spec/configuration_spec.rb
|
369
375
|
- spec/ephemeral_spec.rb
|
370
376
|
- spec/host_spec.rb
|
377
|
+
- spec/link_spec.rb
|
371
378
|
- spec/noahapp_application_spec.rb
|
372
379
|
- spec/noahapp_configuration_spec.rb
|
373
380
|
- spec/noahapp_ephemeral_spec.rb
|