noah 0.4 → 0.6.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/Rakefile +2 -69
  2. data/lib/noah/agent.rb +1 -0
  3. data/lib/noah/agents/base_agent.rb +4 -2
  4. data/lib/noah/agents/http_agent.rb +1 -1
  5. data/lib/noah/agents/https_agent.rb +6 -0
  6. data/lib/noah/app.rb +8 -6
  7. data/lib/noah/exceptions.rb +0 -0
  8. data/lib/noah/linkable.rb +21 -0
  9. data/lib/noah/models/applications.rb +19 -9
  10. data/lib/noah/models/configurations.rb +32 -13
  11. data/lib/noah/models/ephemerals.rb +7 -6
  12. data/lib/noah/models/hosts.rb +11 -5
  13. data/lib/noah/models/link.rb +70 -29
  14. data/lib/noah/models/services.rb +11 -2
  15. data/lib/noah/models/tags.rb +86 -5
  16. data/lib/noah/models/watchers.rb +0 -1
  17. data/lib/noah/models.rb +14 -25
  18. data/lib/noah/{application_routes.rb → routes/applications.rb} +31 -27
  19. data/lib/noah/routes/configurations.rb +77 -0
  20. data/lib/noah/{ephemeral_routes.rb → routes/ephemerals.rb} +5 -5
  21. data/lib/noah/{host_routes.rb → routes/hosts.rb} +16 -1
  22. data/lib/noah/routes/links.rb +16 -0
  23. data/lib/noah/{service_routes.rb → routes/services.rb} +28 -12
  24. data/lib/noah/routes/tags.rb +15 -0
  25. data/lib/noah/{watcher_routes.rb → routes/watchers.rb} +0 -0
  26. data/lib/noah/taggable.rb +30 -0
  27. data/lib/noah/version.rb +1 -1
  28. data/lib/noah.rb +1 -0
  29. data/noah.gemspec +5 -4
  30. data/spec/application_spec.rb +3 -3
  31. data/spec/configuration_spec.rb +19 -12
  32. data/spec/host_spec.rb +5 -5
  33. data/spec/noahapp_application_spec.rb +11 -13
  34. data/spec/noahapp_configuration_spec.rb +63 -40
  35. data/spec/noahapp_ephemeral_spec.rb +15 -15
  36. data/spec/noahapp_host_spec.rb +4 -6
  37. data/spec/noahapp_service_spec.rb +8 -7
  38. data/spec/service_spec.rb +2 -2
  39. data/spec/spec_helper.rb +5 -5
  40. data/spec/support/sample_data.rb +87 -0
  41. data/spec/tag_spec.rb +78 -0
  42. data/views/index.haml +7 -1
  43. metadata +23 -16
  44. data/lib/noah/configuration_routes.rb +0 -81
  45. data/lib/noah/models/link_member.rb +0 -18
@@ -1,34 +1,61 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
- describe "Using the Configuration API", :reset_redis => false, :populate_sample_data => true do
3
+ SAMPLE_YAML = <<EOY
4
+ development:
5
+ database: development_database
6
+ adapter: mysql
7
+ username: dev_user
8
+ password: dev_password
9
+ EOY
10
+
11
+ SAMPLE_JSON = <<EOJ
12
+ {
13
+ "id":"hostname",
14
+ "data":"localhost"
15
+ }
16
+ EOJ
17
+
18
+ describe "Using the Configuration API", :reset_redis => true, :populate_sample_data => false do
4
19
  describe "calling" do
20
+ before(:each) do
21
+ Ohm.redis.flushdb
22
+ @redis_config = Noah::Configuration.create(:name => 'redis_url', :format => 'string', :body => 'redis://127.0.0.1:6379/0')
23
+ @json_config = Noah::Configuration.create(:name => 'json_config', :format => 'json', :body => SAMPLE_JSON)
24
+ @yaml_config = Noah::Configuration.create(:name => 'yaml_config', :format => 'yaml', :body => SAMPLE_YAML)
25
+ @sample_application = Noah::Application.create(:name => 'rspec_application')
26
+ end
27
+ after(:each) do
28
+ Ohm.redis.flushdb
29
+ end
5
30
 
6
31
  describe "GET" do
7
32
  it "all configurations should work" do
8
33
  get '/configurations'
9
34
  last_response.should be_ok
10
- last_response.should return_json
11
- end
12
- it "named application should work" do
13
- get '/configurations/noah'
14
- last_response.should be_ok
15
35
  response = last_response.should return_json
16
-
17
- response.is_a?(Array).should == true
18
- response.first["name"].should == "redis"
19
- response.first["format"].should == "string"
20
- response.first["body"].should == "redis://127.0.0.1:6379/0"
21
- response.first["application"].should == "noah"
36
+ response.keys.size.should == 3
37
+ %w[redis_url json_config yaml_config].each do |c|
38
+ response.keys.member?(c).should == true
39
+ %w[id tags links format body created_at updated_at].each do |ck|
40
+ response[c].keys.member?(ck).should == true
41
+ end
42
+ end
22
43
  end
23
- it "named configuration for application should work" do
24
- get '/configurations/noah/redis'
44
+ it "named configuration should work" do
45
+ get '/configurations/redis_url'
25
46
  last_response.should be_ok
26
- response = last_response.body
27
- response.should == "redis://127.0.0.1:6379/0"
47
+ response = last_response.should return_json
48
+ response.is_a?(Hash).should == true
49
+ response['name'].should == @redis_config.name
50
+ response['id'].should == @redis_config.id
51
+ response["format"].should == @redis_config.format
52
+ response["body"].should == @redis_config.body
53
+ response["tags"].size.should == 0
54
+ response["links"].size.should == 0
28
55
  end
29
56
  it "named configuration should work with mime-type" do
30
57
  require 'yaml'
31
- get '/configurations/myrailsapp1/database.yml'
58
+ get '/configurations/yaml_config/data'
32
59
  last_response.should be_ok
33
60
  last_response.headers["Content-Type"].should == "text/x-yaml;charset=utf-8"
34
61
  response = YAML.load(last_response.body)
@@ -37,12 +64,12 @@ describe "Using the Configuration API", :reset_redis => false, :populate_sample_
37
64
  response["development"].keys.sort.should == ["adapter", "database", "password", "username"]
38
65
  response["development"].values.sort.should == ["dev_password", "dev_user", "development_database", "mysql"]
39
66
  end
40
- it "invalid application should not work" do
41
- get '/configurations/badapp'
67
+ it "invalid configuration should not work" do
68
+ get '/configurations/badconfig'
42
69
  last_response.should be_missing
43
70
  end
44
- it "invalid configuration for application should not work" do
45
- get '/configurations/badapp/badconfig'
71
+ it "invalid configuration data should not work" do
72
+ get '/configurations/badconfig/data'
46
73
  last_response.should be_missing
47
74
  end
48
75
  end
@@ -50,60 +77,56 @@ describe "Using the Configuration API", :reset_redis => false, :populate_sample_
50
77
  describe "PUT" do
51
78
  it "new configuration should work" do
52
79
  config_data = {:format => "string", :body => "sample_config_entry"}.to_json
53
- put '/configurations/newapp/newconfig', config_data, "CONTENT_TYPE" => "application/json"
80
+ put '/configurations/newconfig', config_data, "CONTENT_TYPE" => "application/json"
54
81
  last_response.should be_ok
55
82
  response = last_response.should return_json
56
83
  response["result"].should == "success"
57
84
  response["action"].should == "create"
58
- response["dependencies"].should == "created"
59
- response["application"].should == "newapp"
60
85
  response["item"].should == "newconfig"
61
86
  end
62
87
  it "existing configuration should work" do
63
88
  config_data = {:format => "string", :body => "sample_config_entry"}.to_json
89
+ put '/configurations/newconfig', config_data, "CONTENT_TYPE" => "application/json"
64
90
  sleep 3
65
- put '/configurations/newapp/newconfig', config_data, "CONTENT_TYPE" => "application/json"
91
+ put '/configurations/newconfig', config_data, "CONTENT_TYPE" => "application/json"
66
92
  last_response.should be_ok
67
93
  response = last_response.should return_json
68
94
  response["result"].should == "success"
69
95
  response["action"].should == "update"
70
- response["dependencies"].should == "updated"
71
- response["application"].should == "newapp"
72
96
  response["item"].should == "newconfig"
73
97
  end
74
98
  it "new configuration with missing format should not work" do
75
99
  config_data = {:body => "a string"}.to_json
76
- put '/configurations/newnewapp/someconfig', config_data, "CONTENT_TYPE" => "application/json"
100
+ put '/configurations/someconfig', config_data, "CONTENT_TYPE" => "application/json"
77
101
  last_response.should be_invalid
78
102
  end
79
103
  it "new configuration with missing body should not work" do
80
104
  config_data = {:body => "a string"}.to_json
81
- put '/configurations/newnewapp/someconfig', config_data, "CONTENT_TYPE" => "application/json"
105
+ put '/configurations/someconfig', config_data, "CONTENT_TYPE" => "application/json"
82
106
  last_response.should be_invalid
83
107
  end
84
108
  end
85
109
 
86
110
  describe "DELETE" do
87
- before(:all) do
88
- @a = Noah::Application.create(:name => 'delete_test_app')
89
- cparms = {:name => 'a', :format => 'string', :body => 'asdf', :application_id => @a.id}
90
- @a.configurations << Noah::Configuration.create(cparms)
91
- @a.save
92
- @c = @a.configurations.first
93
- end
94
-
95
111
  it "existing configuration should work" do
96
- delete "/configurations/#{@a.name}/#{@c.name}"
112
+ @a = Noah::Application.create(:name => 'delete_test_app')
113
+ cparms = {:name => 'asdf', :format => 'string', :body => 'asdf'}
114
+ @c = Noah::Configuration.create(cparms)
115
+ @a.configurations << @c
116
+ get "/configurations/asdf"
117
+ p last_response
118
+ delete "/configurations/#{@c.name}"
119
+ p last_response
97
120
  last_response.should be_ok
98
121
  response = last_response.should return_json
99
122
  response["result"].should == "success"
100
123
  response["id"].should == @c.id
101
124
  response["action"].should == "delete"
102
- response["application"].should == @a.name
125
+ response["affected_applications"].member?(@a.name).should == true
103
126
  response["item"].should == @c.name
104
127
  end
105
128
  it "invalid configuration should not work" do
106
- delete "/configurations/#{@a.name}/#{@c.name}"
129
+ delete "/configurations/somethingthatshouldnotexist"
107
130
  last_response.should be_missing
108
131
  end
109
132
  end
@@ -13,7 +13,7 @@ describe "Using the Ephemeral API", :reset_redis => true do
13
13
 
14
14
  describe "GET" do
15
15
  it "all ephemerals should return 404" do
16
- get '/e'
16
+ get '/ephemerals'
17
17
  last_response.should_not be_ok
18
18
  last_response.status.should == 404
19
19
  response = last_response.should return_json
@@ -22,13 +22,13 @@ describe "Using the Ephemeral API", :reset_redis => true do
22
22
  end
23
23
 
24
24
  it "named path with data should work" do
25
- get '/e/foo/bar/baz'
25
+ get '/ephemerals/foo/bar/baz'
26
26
  last_response.should be_ok
27
27
  last_response.body.should == 'value1'
28
28
  end
29
29
 
30
30
  it "named path without data should work" do
31
- get '/e/baz/bar'
31
+ get '/ephemerals/baz/bar'
32
32
  last_response.status.should == 200
33
33
  last_response.body.should == ""
34
34
  end
@@ -45,7 +45,7 @@ describe "Using the Ephemeral API", :reset_redis => true do
45
45
 
46
46
  describe "PUT" do
47
47
  it "new ephemeral with data should work" do
48
- put '/e/whiz/bang/', 'value3'
48
+ put '/ephemerals/whiz/bang/', 'value3'
49
49
  last_response.should be_ok
50
50
  response = last_response.should return_json
51
51
  response['result'].should == 'success'
@@ -55,7 +55,7 @@ describe "Using the Ephemeral API", :reset_redis => true do
55
55
  end
56
56
 
57
57
  it "new ephemeral without data should work" do
58
- put '/e/bang/whiz'
58
+ put '/ephemerals/bang/whiz'
59
59
  last_response.should be_ok
60
60
  response = last_response.should return_json
61
61
  response['result'].should == 'success'
@@ -67,35 +67,35 @@ describe "Using the Ephemeral API", :reset_redis => true do
67
67
 
68
68
  it "existing ephemeral with data should work" do
69
69
  Noah::Ephemeral.create(:path => '/new/ephemeral', :data => 'old_value')
70
- get '/e/new/ephemeral'
70
+ get '/ephemerals/new/ephemeral'
71
71
  last_response.should be_ok
72
72
  last_response.body.should == 'old_value'
73
- put '/e/new/ephemeral', 'new_value'
73
+ put '/ephemerals/new/ephemeral', 'new_value'
74
74
  last_response.should be_ok
75
- get '/e/new/ephemeral'
75
+ get '/ephemerals/new/ephemeral'
76
76
  last_response.should be_ok
77
77
  last_response.body.should == 'new_value'
78
78
  end
79
79
  it "existing ephemeral without data should work" do
80
80
  Noah::Ephemeral.create(:path => '/a/random/key')
81
- get '/e/a/random/key'
81
+ get '/ephemerals/a/random/key'
82
82
  last_response.should be_ok
83
83
  last_response.body.should == ""
84
- put '/e/a/random/key', 'a new value'
84
+ put '/ephemerals/a/random/key', 'a new value'
85
85
  last_response.should be_ok
86
- get '/e/a/random/key'
86
+ get '/ephemerals/a/random/key'
87
87
  last_response.should be_ok
88
88
  last_response.body.should == 'a new value'
89
89
  end
90
90
  it "ephemeral with reserved word in subpath should work" do
91
91
  Noah::PROTECTED_PATHS.each do |path|
92
- put "/e/a/valid/path/with/#{path}"
92
+ put "/ephemerals/a/valid/path/with/#{path}"
93
93
  last_response.should be_ok
94
94
  end
95
95
  end
96
96
  it "ephemeral with reserved word as path should not work" do
97
97
  Noah::PROTECTED_PATHS.each do |path|
98
- put "/e/#{path}/other/stuff"
98
+ put "/ephemerals/#{path}/other/stuff"
99
99
  last_response.should_not be_ok
100
100
  response = last_response.should return_json
101
101
  response['error_message'].should == 'Path is reserved'
@@ -108,7 +108,7 @@ describe "Using the Ephemeral API", :reset_redis => true do
108
108
  it "existing path should work" do
109
109
  e = Noah::Ephemeral.new(:path => '/slart/i/bart/fast', :data => 'someddata')
110
110
  e.save
111
- delete "/e/slart/i/bart/fast"
111
+ delete "/ephemerals/slart/i/bart/fast"
112
112
  last_response.should be_ok
113
113
  response = last_response.should return_json
114
114
  response['result'].should == 'success'
@@ -118,7 +118,7 @@ describe "Using the Ephemeral API", :reset_redis => true do
118
118
  end
119
119
 
120
120
  it "invalid path should not work" do
121
- delete '/e/fork/spoon/knife'
121
+ delete '/ephemerals/fork/spoon/knife'
122
122
  last_response.should_not be_ok
123
123
  last_response.status.should == 404
124
124
  response = last_response.should return_json
@@ -20,12 +20,10 @@ describe "Using the Host API", :reset_redis => false, :populate_sample_data => t
20
20
  response["name"].should == "localhost"
21
21
  response["status"].should == "up"
22
22
  services.size.should == 2
23
- services.first["name"].should == "redis"
24
- services.first["status"].should == "up"
25
- services.first["host"].should == "localhost"
26
- services.last["name"].should == "noah"
27
- services.last["status"].should == "up"
28
- services.last["host"].should == "localhost"
23
+ services.has_key?("redis").should == true
24
+ services.has_key?("noah").should == true
25
+ services["redis"].should == "up"
26
+ services["noah"].should == "up"
29
27
  end
30
28
 
31
29
  it "named service for host should work" do
@@ -16,18 +16,19 @@ describe "Using the Service API", :reset_redis => false, :populate_sample_data =
16
16
  get '/services'
17
17
  last_response.should be_ok
18
18
  response = last_response.should return_json
19
- response.is_a?(Array).should == true
19
+ response.is_a?(Hash).should == true
20
20
  end
21
21
  it "all named services should work" do
22
22
  get "/services/#{@sample_service[:name]}"
23
23
  last_response.should be_ok
24
24
  response = last_response.should return_json
25
- response.is_a?(Array).should == true
26
- s = response.first
27
- s["id"].should == @s.id
28
- s["name"].should == @s.name
29
- s["status"].should == @s.status
30
- s["host"].should == @h.name
25
+ response.is_a?(Hash).should == true
26
+ response.has_key?(@s.name).should == true
27
+ response[@s.name].is_a?(Hash).should == true
28
+ response[@s.name].has_key?(@h.name).should == true
29
+ response[@s.name][@h.name].is_a?(Hash).should == true
30
+ response[@s.name][@h.name]["id"].should == @s.id
31
+ response[@s.name][@h.name]["status"].should == @s.status
31
32
  end
32
33
  it "named service for host should work" do
33
34
  get "/services/#{@sample_service[:name]}/#{@sample_host[:name]}"
data/spec/service_spec.rb CHANGED
@@ -57,8 +57,8 @@ describe "Noah Service Model", :reset_redis => true do
57
57
  h.save
58
58
  end
59
59
  Noah::Services.all.size.should == 2
60
- Noah::Services.all.first.name.should == "s1"
61
- Noah::Services.all.last.name.should == "s2"
60
+ Noah::Services.all.has_key?("s1").should == true
61
+ Noah::Services.all.has_key?("s2").should == true
62
62
  end
63
63
 
64
64
  end
data/spec/spec_helper.rb CHANGED
@@ -29,9 +29,9 @@ RSpec.configure do |config|
29
29
 
30
30
  a = Noah::Application.create(:name => 'noah')
31
31
  if a.save
32
- cr = Noah::Configuration.create(:name => 'redis', :format => 'string', :body => 'redis://127.0.0.1:6379/0', :application => a)
33
- ch = Noah::Configuration.create(:name => 'host', :format => 'string', :body => 'localhost', :application => a)
34
- cp = Noah::Configuration.create(:name => 'port', :format => 'string', :body => '9292', :application => a)
32
+ cr = Noah::Configuration.create(:name => 'redis', :format => 'string', :body => 'redis://127.0.0.1:6379/0')
33
+ ch = Noah::Configuration.create(:name => 'host', :format => 'string', :body => 'localhost')
34
+ cp = Noah::Configuration.create(:name => 'port', :format => 'string', :body => '9292')
35
35
  %w[cr ch cp].each do |c|
36
36
  a.configurations << eval(c)
37
37
  end
@@ -53,13 +53,13 @@ EOJ
53
53
 
54
54
  a1 = Noah::Application.create(:name => 'myrailsapp1')
55
55
  if a1.save
56
- c1 = Noah::Configuration.create(:name => 'database.yml', :format => 'yaml', :body => my_yaml, :application => a1)
56
+ c1 = Noah::Configuration.create(:name => 'database.yml', :format => 'yaml', :body => my_yaml)
57
57
  a1.configurations << c1
58
58
  end
59
59
 
60
60
  a2 = Noah::Application.create(:name => 'myrestapp1')
61
61
  if a2.save
62
- c2 = Noah::Configuration.create(:name => 'config.json', :format => 'json', :body => my_json, :application => a2)
62
+ c2 = Noah::Configuration.create(:name => 'config.json', :format => 'json', :body => my_json)
63
63
  a2.configurations << c2
64
64
  end
65
65
  end
@@ -0,0 +1,87 @@
1
+ require 'noah'
2
+
3
+ Ohm::redis.flushdb
4
+ puts "Creating sample entries - Watchers"
5
+ Noah::Watcher.create :endpoint => "dummy://applications", :pattern => "//noah/applications"
6
+ Noah::Watcher.create :endpoint => "dummy://configurations", :pattern => "//noah/configurations"
7
+ Noah::Watcher.create :endpoint => "dummy://hosts", :pattern => "//noah/hosts"
8
+ Noah::Watcher.create :endpoint => "dummy://services", :pattern => "//noah/services"
9
+ Noah::Watcher.create :endpoint => "dummy://ephemerals", :pattern => "//noah/ephemerals"
10
+ puts "Creating Host entry for 'localhost'"
11
+ h = Noah::Host.create(:name => 'localhost', :status => "up")
12
+ if h.save
13
+ %w[redis noah].each do |service|
14
+ puts "Create Service entry for #{service}"
15
+ s = Noah::Service.create(:name => service, :status => "up", :host_id => h.id)
16
+ end
17
+ end
18
+
19
+ puts "Creating Application entry for 'noah'"
20
+ a = Noah::Application.create(:name => 'noah')
21
+ if a.save
22
+ puts "Creating Configuration entry for 'noah'"
23
+ cr = Noah::Configuration.create(:name => 'redis_url', :format => 'string', :body => 'redis://127.0.0.1:6379/0')
24
+ ch = Noah::Configuration.create(:name => 'noah_host', :format => 'string', :body => 'localhost')
25
+ cp = Noah::Configuration.create(:name => 'noah_port', :format => 'string', :body => '9292')
26
+ [cr,ch,cp].each do |c|
27
+ a.configurations << c
28
+ end
29
+ end
30
+
31
+ puts "Creating sample entries - Host and Service"
32
+ %w[host1.domain.com host2.domain.com host3.domain.com].each do |host|
33
+ h = Noah::Host.create(:name => host, :status => "up")
34
+ if h.save
35
+ %w[http https smtp mysql].each do |service|
36
+ s = Noah::Service.create(:name => service, :status => "pending", :host_id => h.id)
37
+ h.services << s
38
+ end
39
+ end
40
+ end
41
+
42
+ puts "Creating sample entries - Application and Configuration"
43
+ my_yaml = <<EOY
44
+ development:
45
+ database: development_database
46
+ adapter: mysql
47
+ username: dev_user
48
+ password: dev_password
49
+ EOY
50
+ my_json = <<EOJ
51
+ {
52
+ "id":"hostname",
53
+ "data":"localhost"
54
+ }
55
+ EOJ
56
+
57
+ a1 = Noah::Application.create(:name => 'myrailsapp1')
58
+ if a1.save
59
+ c1 = Noah::Configuration.create(:name => 'database.yml', :format => 'yaml', :body => my_yaml)
60
+ a1.configurations << c1
61
+ end
62
+
63
+ a2 = Noah::Application.create(:name => 'myrestapp1')
64
+ if a2.save
65
+ c2 = Noah::Configuration.create(:name => 'config.json', :format => 'json', :body => my_json)
66
+ a2.configurations << c2
67
+ end
68
+
69
+ puts "Creating sample entries - Ephemerals"
70
+ e1 = Noah::Ephemeral.create(:path => '/some/random/path/item1', :data => 'some_data')
71
+ e2 = Noah::Ephemeral.create(:path => '/some/random/path/', :data => '{"children":["item1", "item2"]}')
72
+
73
+ puts "Creating sample entries - Links and Tags"
74
+ l1 = Noah::Link.new
75
+ l1.path = "/my_sample_organization"
76
+ l1.save
77
+ l1.nodes = [a1, c2, Noah::Host.find(:name => 'localhost').first, Noah::Service.find(:name => 'redis').first, e1, e2]
78
+ a1.tag! ["production", "sample_data"]
79
+ e2.tag! ["ephemeral", "development"]
80
+ c1.tag! "development"
81
+ Noah::Service[1].tag! "development"
82
+ Noah::Service[2].tag! ["development", "out-of-service"]
83
+ Noah::Service[2].link! "/my_sample_organization"
84
+
85
+
86
+ puts "Sample data populated!"
87
+
data/spec/tag_spec.rb ADDED
@@ -0,0 +1,78 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Using the Tag Model", :reset_redis => true do
4
+ before(:each) do
5
+ Ohm.redis.flushdb
6
+ @tags1 = ["production", "databases", "in-service"]
7
+ @tags2 = "out-of-service"
8
+ @host = Noah::Host.create(:name => 'tagged_host', :status => 'up')
9
+ @service = Noah::Service.create(:name => 'tagged_service', :status => 'down', :host_id => @host.id)
10
+ @application = Noah::Application.create(:name => 'tagged_application')
11
+ @configuration = Noah::Configuration.create(:name => 'tagged_configuration', :format => 'string', :body => 'some_string')
12
+ @ephemeral = Noah::Ephemeral.create(:path => '/tagged/ephemeral')
13
+ end
14
+ after(:each) do
15
+ Ohm.redis.flushdb
16
+ end
17
+ describe "should" do
18
+ it "create a new Noah::Tag" do
19
+ t = Noah::Tag.new(:name => 'some_tag')
20
+ t.valid?.should == true
21
+ t.save
22
+ t.is_new?.should == true
23
+ b = Noah::Tag.find(:name => 'some_tag').first
24
+ b.should == t
25
+ end
26
+ it "create a new Noah::Tag and add a member" do
27
+ t = Noah::Tag.create(:name => 'some_tag')
28
+ t.members = @host
29
+ @host.tags.member?(t).should == true
30
+ t.members[:hosts].size.should == 1
31
+ t.members[:hosts].member?(@host).should == true
32
+ end
33
+ it "tag! an existing object with a single tag" do
34
+ @host.tag! @tags2
35
+ t = Noah::Tag.find(:name => @tags2).first
36
+ @host.tags.member?(t).should == true
37
+ t.members[:hosts].size.should == 1
38
+ t.members[:hosts].member?(@host).should == true
39
+ end
40
+ it "tag! an existing object with an array of tags" do
41
+ @host.tag! @tags1
42
+ @tags1.each do |tag|
43
+ t = Noah::Tag.find(:name => tag).first
44
+ @host.tags.member?(t).should == true
45
+ t.members[:hosts].size.should == 1
46
+ t.members[:hosts].member?(@host).should == true
47
+ end
48
+ Noah::Tag.all.size.should == 3
49
+ end
50
+ it "tag all object types and find via tagged" do
51
+ @host.tag! @tags1
52
+ @ephemeral.tag! @tags1
53
+ @configuration.tag! @tags1
54
+ @application.tag! @tags1
55
+ @service.tag! @tags1
56
+ @tags1.each do |tag|
57
+ Noah::Tags.tagged(tag).size.should == 5
58
+ [@host, @service, @application, @configuration, @ephemeral].each do |o|
59
+ Noah::Tags.tagged(tag).values.flatten.member?(o).should == true
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ describe "should not" do
66
+ it "create a new Noah::Tag without a name" do
67
+ a = Noah::Tag.create
68
+ a.valid?.should == false
69
+ a.errors.should == [[:name, :not_present]]
70
+ end
71
+ it "create a tag with a duplicate name" do
72
+ a = Noah::Tag.create(:name => 'tag1')
73
+ b = Noah::Tag.create(:name => 'tag1')
74
+ b.valid?.should == false
75
+ b.errors.should == [[:name, :not_unique]]
76
+ end
77
+ end
78
+ end
data/views/index.haml CHANGED
@@ -52,4 +52,10 @@
52
52
  %a{:href => "configurations/myrailsapp1/database.yml"} database.yml file for myrailsapp1 (should return the proper content-type)
53
53
  %li
54
54
  %a{:href => "configurations/myrestapp1/config.json"} config.json file for myrestapp1
55
-
55
+ #header
56
+ %h2 Links
57
+ %ul
58
+ %li
59
+ %a{:href => "my_sample_organization"} Sample Organization Link
60
+ %li
61
+ %a{:href => "my_sample_organization/hosts"} Sample Organization Link - Hosts
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: noah
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: "0.4"
4
+ prerelease: 4
5
+ version: 0.6.pre
6
6
  platform: ruby
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-03-27 00:00:00 -04:00
13
+ date: 2011-04-18 00:00:00 -04:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -43,7 +43,7 @@ dependencies:
43
43
  requirements:
44
44
  - - "="
45
45
  - !ruby/object:Gem::Version
46
- version: 2.1.1
46
+ version: 2.2.0
47
47
  type: :runtime
48
48
  version_requirements: *id003
49
49
  - !ruby/object:Gem::Dependency
@@ -65,7 +65,7 @@ dependencies:
65
65
  requirements:
66
66
  - - "="
67
67
  - !ruby/object:Gem::Version
68
- version: 1.2.1
68
+ version: 1.2.2
69
69
  type: :runtime
70
70
  version_requirements: *id005
71
71
  - !ruby/object:Gem::Dependency
@@ -87,7 +87,7 @@ dependencies:
87
87
  requirements:
88
88
  - - "="
89
89
  - !ruby/object:Gem::Version
90
- version: 1.2.0
90
+ version: 1.2.3
91
91
  type: :runtime
92
92
  version_requirements: *id007
93
93
  - !ruby/object:Gem::Dependency
@@ -270,14 +270,13 @@ files:
270
270
  - lib/noah/agents/base_agent.rb
271
271
  - lib/noah/agents/dummy_agent.rb
272
272
  - lib/noah/agents/http_agent.rb
273
+ - lib/noah/agents/https_agent.rb
273
274
  - lib/noah/app.rb
274
- - lib/noah/application_routes.rb
275
275
  - lib/noah/ark.rb
276
- - lib/noah/configuration_routes.rb
277
276
  - lib/noah/custom_watcher.rb
278
- - lib/noah/ephemeral_routes.rb
277
+ - lib/noah/exceptions.rb
279
278
  - lib/noah/helpers.rb
280
- - lib/noah/host_routes.rb
279
+ - lib/noah/linkable.rb
281
280
  - lib/noah/log.rb
282
281
  - lib/noah/models.rb
283
282
  - lib/noah/models/applications.rb
@@ -285,17 +284,23 @@ files:
285
284
  - lib/noah/models/ephemerals.rb
286
285
  - lib/noah/models/hosts.rb
287
286
  - lib/noah/models/link.rb
288
- - lib/noah/models/link_member.rb
289
287
  - lib/noah/models/services.rb
290
288
  - lib/noah/models/tags.rb
291
289
  - lib/noah/models/watchers.rb
292
290
  - lib/noah/passthrough.rb
293
- - lib/noah/service_routes.rb
291
+ - lib/noah/routes/applications.rb
292
+ - lib/noah/routes/configurations.rb
293
+ - lib/noah/routes/ephemerals.rb
294
+ - lib/noah/routes/hosts.rb
295
+ - lib/noah/routes/links.rb
296
+ - lib/noah/routes/services.rb
297
+ - lib/noah/routes/tags.rb
298
+ - lib/noah/routes/watchers.rb
299
+ - lib/noah/taggable.rb
294
300
  - lib/noah/validations.rb
295
301
  - lib/noah/validations/ephemeral_validations.rb
296
302
  - lib/noah/validations/watcher_validations.rb
297
303
  - lib/noah/version.rb
298
- - lib/noah/watcher_routes.rb
299
304
  - noah.gemspec
300
305
  - spec/application_spec.rb
301
306
  - spec/configuration_spec.rb
@@ -311,7 +316,9 @@ files:
311
316
  - spec/service_spec.rb
312
317
  - spec/spec_helper.rb
313
318
  - spec/support/db/.keep
319
+ - spec/support/sample_data.rb
314
320
  - spec/support/test-redis.conf
321
+ - spec/tag_spec.rb
315
322
  - spec/watcher_spec.rb
316
323
  - views/200.erb
317
324
  - views/404.erb
@@ -321,7 +328,7 @@ has_rdoc: true
321
328
  homepage: https://github.com/lusis/noah
322
329
  licenses: []
323
330
 
324
- post_install_message:
331
+ post_install_message: This release has backwards incompatible changes to the API. Please watch http://goo.gl/jYqp2 for details
325
332
  rdoc_options: []
326
333
 
327
334
  require_paths:
@@ -335,9 +342,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
335
342
  required_rubygems_version: !ruby/object:Gem::Requirement
336
343
  none: false
337
344
  requirements:
338
- - - ">="
345
+ - - ">"
339
346
  - !ruby/object:Gem::Version
340
- version: "0"
347
+ version: 1.3.1
341
348
  requirements: []
342
349
 
343
350
  rubyforge_project: noah