noah 0.0.5-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/.autotest +13 -0
- data/.gitignore +7 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +83 -0
- data/README.md +213 -0
- data/Rakefile +105 -0
- data/autotest/discover.rb +1 -0
- data/bin/noah +8 -0
- data/config.ru +3 -0
- data/doc/coverage/index.html +138 -0
- data/doc/coverage/jquery-1.3.2.min.js +19 -0
- data/doc/coverage/jquery.tablesorter.min.js +15 -0
- data/doc/coverage/lib-helpers_rb.html +393 -0
- data/doc/coverage/lib-models_rb.html +1449 -0
- data/doc/coverage/noah_rb.html +2019 -0
- data/doc/coverage/print.css +12 -0
- data/doc/coverage/rcov.js +42 -0
- data/doc/coverage/screen.css +270 -0
- data/lib/noah/app.rb +317 -0
- data/lib/noah/applications.rb +46 -0
- data/lib/noah/configurations.rb +49 -0
- data/lib/noah/helpers.rb +57 -0
- data/lib/noah/hosts.rb +54 -0
- data/lib/noah/models.rb +5 -0
- data/lib/noah/services.rb +57 -0
- data/lib/noah/version.rb +3 -0
- data/lib/noah/watchers.rb +18 -0
- data/lib/noah.rb +18 -0
- data/noah.gemspec +44 -0
- data/spec/application_spec.rb +83 -0
- data/spec/configuration_spec.rb +25 -0
- data/spec/host_spec.rb +119 -0
- data/spec/noahapp_application_spec.rb +108 -0
- data/spec/noahapp_configuration_spec.rb +112 -0
- data/spec/noahapp_host_spec.rb +116 -0
- data/spec/noahapp_service_spec.rb +121 -0
- data/spec/noahapp_spec.rb +20 -0
- data/spec/service_spec.rb +112 -0
- data/spec/spec_helper.rb +105 -0
- data/views/200.erb +1 -0
- data/views/404.erb +1 -0
- data/views/500.erb +1 -0
- data/views/index.haml +49 -0
- metadata +309 -0
@@ -0,0 +1,49 @@
|
|
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/helpers.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'models')
|
2
|
+
module Noah
|
3
|
+
module SinatraHelpers
|
4
|
+
extend(Ohm)
|
5
|
+
|
6
|
+
def host(opts = {})
|
7
|
+
Host.find(opts).first
|
8
|
+
end
|
9
|
+
|
10
|
+
def hosts(opts = {})
|
11
|
+
Hosts.all(opts)
|
12
|
+
end
|
13
|
+
|
14
|
+
def service(opts = {})
|
15
|
+
Service.find(options)
|
16
|
+
end
|
17
|
+
|
18
|
+
def services(opts = {})
|
19
|
+
Services.all(opts)
|
20
|
+
end
|
21
|
+
|
22
|
+
def host_service(hostname, servicename)
|
23
|
+
h = Host.find(:name => hostname).first
|
24
|
+
if h.nil?
|
25
|
+
nil
|
26
|
+
else
|
27
|
+
Service.find(:host_id => h.id, :name => servicename).first
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def host_services(hostname)
|
32
|
+
h = Host.find(:name => hostname).first
|
33
|
+
if h.nil?
|
34
|
+
nil
|
35
|
+
else
|
36
|
+
Services.all(:host_id => id)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def application(opts = {})
|
41
|
+
Application.find(opts).first
|
42
|
+
end
|
43
|
+
|
44
|
+
def applications(opts = {})
|
45
|
+
Applications.all(opts)
|
46
|
+
end
|
47
|
+
|
48
|
+
def configuration(opts = {})
|
49
|
+
Configuration.find(opts).first
|
50
|
+
end
|
51
|
+
|
52
|
+
def configurations(opts = {})
|
53
|
+
Configurations.all(opts)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
data/lib/noah/hosts.rb
ADDED
@@ -0,0 +1,54 @@
|
|
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
|
data/lib/noah/models.rb
ADDED
@@ -0,0 +1,5 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__),'hosts')
|
2
|
+
require File.join(File.dirname(__FILE__),'services')
|
3
|
+
require File.join(File.dirname(__FILE__),'applications')
|
4
|
+
require File.join(File.dirname(__FILE__),'configurations')
|
5
|
+
require File.join(File.dirname(__FILE__),'watchers')
|
@@ -0,0 +1,57 @@
|
|
1
|
+
class Service < 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
|
+
reference :host, Host
|
10
|
+
|
11
|
+
index :name
|
12
|
+
index :status
|
13
|
+
|
14
|
+
def validate
|
15
|
+
assert_present :name
|
16
|
+
assert_present :status
|
17
|
+
assert_present :host_id
|
18
|
+
assert_unique [:name, :host_id]
|
19
|
+
assert_member :status, ["up", "down", "pending"]
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_hash
|
23
|
+
super.merge(:name => name, :status => status, :updated_at => updated_at, :host => Host[host_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
|
+
# convert passed host object to host_id if passed
|
34
|
+
if opts.has_key?(:host)
|
35
|
+
opts.merge!({:host_id => opts[:host].id})
|
36
|
+
opts.reject!{|key, value| key == :host}
|
37
|
+
end
|
38
|
+
# exclude requested status from lookup
|
39
|
+
s = find(opts.reject{|key,value| key == :status}).first
|
40
|
+
service = s.nil? ? create(opts) : s
|
41
|
+
service.status = opts[:status]
|
42
|
+
if service.valid?
|
43
|
+
service.save
|
44
|
+
end
|
45
|
+
service
|
46
|
+
rescue Exception => e
|
47
|
+
e.message
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
class Services
|
54
|
+
def self.all(options = {})
|
55
|
+
options.empty? ? Service.all.sort : Service.find(options).sort
|
56
|
+
end
|
57
|
+
end
|
data/lib/noah/version.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
class Watcher < Ohm::Model #NYI
|
2
|
+
include Ohm::Typecast
|
3
|
+
include Ohm::Timestamping
|
4
|
+
include Ohm::Callbacks
|
5
|
+
|
6
|
+
attribute :client
|
7
|
+
attribute :endpoint
|
8
|
+
attribute :event
|
9
|
+
attribute :action
|
10
|
+
|
11
|
+
index :client
|
12
|
+
index :event
|
13
|
+
|
14
|
+
def validate
|
15
|
+
assert_present :client, :endpoint, :event, :action
|
16
|
+
assert_unique [:client, :endpoint, :event, :action]
|
17
|
+
end
|
18
|
+
end
|
data/lib/noah.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'ohm'
|
2
|
+
require 'ohm/contrib'
|
3
|
+
begin
|
4
|
+
require 'yajl'
|
5
|
+
rescue LoadError
|
6
|
+
require 'json'
|
7
|
+
end
|
8
|
+
require 'haml'
|
9
|
+
require 'yaml'
|
10
|
+
require 'sinatra/base'
|
11
|
+
require 'sinatra/namespace'
|
12
|
+
|
13
|
+
require File.join(File.dirname(__FILE__), 'noah','hosts')
|
14
|
+
require File.join(File.dirname(__FILE__), 'noah','services')
|
15
|
+
require File.join(File.dirname(__FILE__), 'noah','applications')
|
16
|
+
require File.join(File.dirname(__FILE__), 'noah','configurations')
|
17
|
+
require File.join(File.dirname(__FILE__), 'noah','watchers')
|
18
|
+
require File.join(File.dirname(__FILE__), 'noah','app')
|
data/noah.gemspec
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "noah/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "noah"
|
7
|
+
s.version = Noah::VERSION
|
8
|
+
s.platform = RUBY_ENGINE
|
9
|
+
s.authors = ["lusis"]
|
10
|
+
s.email = ["lusis.org+rubygems.org@gmail.com"]
|
11
|
+
s.homepage = "https://github.com/lusis/noah"
|
12
|
+
s.summary = %q{Application registry based on Apache Zookeeper}
|
13
|
+
s.description = %q{Application registry based on Apache Zookeeper}
|
14
|
+
|
15
|
+
s.rubyforge_project = "noah"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.add_dependency("rake", ["= 0.8.7"])
|
23
|
+
s.add_dependency("sinatra", ["= 1.1.2"])
|
24
|
+
s.add_dependency("sinatra-namespace", ["0.6.1"])
|
25
|
+
s.add_dependency("ohm", ["= 0.1.3"])
|
26
|
+
s.add_dependency("ohm-contrib", ["= 0.1.0"])
|
27
|
+
s.add_dependency("haml", ["= 3.0.25"])
|
28
|
+
s.add_dependency("vegas", ["= 0.1.8"])
|
29
|
+
s.add_dependency("yajl-ruby", ["= 0.7.9"]) if s.platform.to_s == 'ruby'
|
30
|
+
s.add_dependency("jruby-json", ["= 1.5.0"]) if s.platform.to_s == 'jruby'
|
31
|
+
s.add_dependency("thin", ["= 1.2.7"]) if s.platform.to_s == 'ruby'
|
32
|
+
s.add_dependency("json-jruby", ["= 1.4.6"]) if s.platform.to_s == 'jruby'
|
33
|
+
s.add_dependency("jruby-openssl", ["= 0.7.3"]) if s.platform.to_s == 'jruby'
|
34
|
+
|
35
|
+
s.add_development_dependency("sinatra-reloader", ["= 0.5.0"])
|
36
|
+
s.add_development_dependency("rspec", ["= 2.4.0"])
|
37
|
+
s.add_development_dependency("rcov", ["= 0.9.9"]) if s.platform.to_s == 'ruby'
|
38
|
+
s.add_development_dependency("rack-test", ["= 0.5.7"])
|
39
|
+
s.add_development_dependency("ZenTest", ["= 4.4.2"])
|
40
|
+
s.add_development_dependency("autotest", ["= 4.4.6"])
|
41
|
+
s.add_development_dependency("autotest-growl", ["= 0.2.9"])
|
42
|
+
s.add_development_dependency("warbler", ["= 1.2.1"]) if s.platform.to_s == 'java'
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "Using the Application Model", :reset_redis => true do
|
4
|
+
before(:all) do
|
5
|
+
@appdata1 = {:name => "my_application"}
|
6
|
+
@appdata2 = {:name => "my_other_app"}
|
7
|
+
@appconf_string = {:name => "mystringconf", :format => "string", :body => "some_var"}
|
8
|
+
@appconf_json = {:name => "myjsonconf", :format => "json", :body => @appconf_string.to_json}
|
9
|
+
end
|
10
|
+
before(:each) do
|
11
|
+
Ohm.redis.flushdb
|
12
|
+
end
|
13
|
+
after(:each) do
|
14
|
+
Ohm.redis.flushdb
|
15
|
+
end
|
16
|
+
describe "should" do
|
17
|
+
it "create a new Application" do
|
18
|
+
a = Application.create(@appdata1)
|
19
|
+
a.valid?.should == true
|
20
|
+
a.is_new?.should == true
|
21
|
+
b = Application.find(@appdata1).first
|
22
|
+
b.should == a
|
23
|
+
end
|
24
|
+
it "create a new Application with Configurations" do
|
25
|
+
a = Application.create(@appdata1)
|
26
|
+
a.configurations << Configuration.create(@appconf_string.merge({:application => a}))
|
27
|
+
a.valid?.should == true
|
28
|
+
a.is_new?.should == true
|
29
|
+
a.save
|
30
|
+
b = Application.find(@appdata1).first
|
31
|
+
b.should == a
|
32
|
+
b.configurations.size.should == 1
|
33
|
+
b.configurations.first.name.should == @appconf_string[:name]
|
34
|
+
b.configurations.first.format.should == @appconf_string[:format]
|
35
|
+
b.configurations.first.body.should == @appconf_string[:body]
|
36
|
+
end
|
37
|
+
it "create a new Application via find_or_create" do
|
38
|
+
a = Application.find_or_create(@appdata2)
|
39
|
+
a.valid?.should == true
|
40
|
+
a.is_new?.should == true
|
41
|
+
b = Application.find(@appdata2).first
|
42
|
+
b.should == a
|
43
|
+
end
|
44
|
+
it "update an existing Application via find_or_create" do
|
45
|
+
a = Application.create(@appdata1)
|
46
|
+
a.is_new?.should == true
|
47
|
+
sleep 2
|
48
|
+
b = Application.find_or_create(@appdata1)
|
49
|
+
b.is_new?.should == false
|
50
|
+
end
|
51
|
+
it "delete an existing Application" do
|
52
|
+
a = Application.create(@appdata1)
|
53
|
+
b = Application.find(@appdata1).first
|
54
|
+
b.should == a
|
55
|
+
b.delete
|
56
|
+
c = Application.find(@appdata1).first
|
57
|
+
c.nil?.should == true
|
58
|
+
end
|
59
|
+
it "return all Applications" do
|
60
|
+
a = Application.create(@appdata1)
|
61
|
+
b = Application.create(@appdata2)
|
62
|
+
c = Applications.all
|
63
|
+
c.size.should == 2
|
64
|
+
c.member?(a).should == true
|
65
|
+
c.member?(b).should == true
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "should not" do
|
70
|
+
it "should not create a new Application without a name" do
|
71
|
+
a = Application.create
|
72
|
+
a.valid?.should == false
|
73
|
+
a.errors.should == [[:name, :not_present]]
|
74
|
+
end
|
75
|
+
it "should not create a duplicate Application" do
|
76
|
+
a = Application.create(@appdata1)
|
77
|
+
a.valid?.should == true
|
78
|
+
b = Application.create(@appdata1)
|
79
|
+
b.valid?.should == false
|
80
|
+
b.errors.should == [[:name, :not_unique]]
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "Using the Configuration Model", :reset_redis => true do
|
4
|
+
|
5
|
+
describe "should" do
|
6
|
+
|
7
|
+
it "create a new Configuration"
|
8
|
+
it "create a new Configuration via find_or_create"
|
9
|
+
it "update an existing Configuration via find_or_create"
|
10
|
+
it "delete an existing Configuration"
|
11
|
+
it "return all Configurations"
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "should not" do
|
16
|
+
|
17
|
+
it "create a new Configuration without a name"
|
18
|
+
it "create a new Configuration without a format"
|
19
|
+
it "create a new Configuration without a body"
|
20
|
+
it "create a new Configuration without an Application"
|
21
|
+
it "create a duplicate Configuration"
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
data/spec/host_spec.rb
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "Using the Host Model", :reset_redis => true do
|
4
|
+
|
5
|
+
describe "should" do
|
6
|
+
it "create a new Host with no services" do
|
7
|
+
hostname = "host1.domain.com"
|
8
|
+
hoststatus = "up"
|
9
|
+
host = Host.create(:name => hostname, :status => hoststatus)
|
10
|
+
host.valid?.should == true
|
11
|
+
host.save
|
12
|
+
host.name.should == hostname
|
13
|
+
host.status.should == hoststatus
|
14
|
+
host.services.size.should == 0
|
15
|
+
end
|
16
|
+
|
17
|
+
it "create a new Host with services" do
|
18
|
+
hostname = "host2.domain.com"
|
19
|
+
hoststatus = "down"
|
20
|
+
servicename = 'myservice'
|
21
|
+
servicestatus = 'pending'
|
22
|
+
host = Host.create(:name => hostname, :status => hoststatus)
|
23
|
+
host.valid?.should == true
|
24
|
+
host.save
|
25
|
+
host.services << Service.create(:name => servicename, :status => servicestatus, :host => host)
|
26
|
+
host.name.should == hostname
|
27
|
+
host.status.should == hoststatus
|
28
|
+
host.services.size.should == 1
|
29
|
+
host.services[1].valid?.should == true
|
30
|
+
host.services[1].name.should == servicename
|
31
|
+
host.services[1].status.should == servicestatus
|
32
|
+
host.services[1].host_id.should == host.id
|
33
|
+
end
|
34
|
+
|
35
|
+
it "create a Host via find_or_create" do
|
36
|
+
hostname = "host3.domain.com"
|
37
|
+
hoststatus = "up"
|
38
|
+
host = Host.find_or_create(:name => hostname, :status => hoststatus)
|
39
|
+
host.valid?.should == true
|
40
|
+
host.save
|
41
|
+
host.is_new?.should == true
|
42
|
+
end
|
43
|
+
|
44
|
+
it "update a Host via find_or_create" do
|
45
|
+
hostname = "host3.domain.com"
|
46
|
+
hoststatus = "pending"
|
47
|
+
newstatus = "down"
|
48
|
+
host = Host.find_or_create(:name => hostname, :status => hoststatus)
|
49
|
+
host.valid?.should == true
|
50
|
+
host.save
|
51
|
+
host.is_new?.should == true
|
52
|
+
sleep 1
|
53
|
+
host1 = Host.find_or_create(:name => hostname, :status => newstatus)
|
54
|
+
host1.save
|
55
|
+
host1.is_new?.should == false
|
56
|
+
end
|
57
|
+
|
58
|
+
it "delete a Host" do
|
59
|
+
hostname = "host3.domain.com"
|
60
|
+
hoststatus = "pending"
|
61
|
+
host = Host.create(:name => hostname, :status => hoststatus)
|
62
|
+
host.save
|
63
|
+
host.delete
|
64
|
+
Host.find(:name => hostname).empty?.should == true
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should return all Hosts" do
|
68
|
+
hostname1 = "host1.domain.com"
|
69
|
+
status1 = "up"
|
70
|
+
hostname2 = "host2.domain.com"
|
71
|
+
status2= "down"
|
72
|
+
host1 = Host.create(:name => hostname1, :status => status1)
|
73
|
+
host2 = Host.create(:name => hostname2, :status => status2)
|
74
|
+
host1.save
|
75
|
+
host2.save
|
76
|
+
Hosts.all.class.should == Array
|
77
|
+
Hosts.all.size.should == 2
|
78
|
+
Hosts.all.first.name.should == hostname1
|
79
|
+
Hosts.all.first.status.should == status1
|
80
|
+
Hosts.all.last.name.should == hostname2
|
81
|
+
Hosts.all.last.status.should == status2
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe "should not" do
|
86
|
+
it "create a new Host with missing status" do
|
87
|
+
hostname ="host3.domain.com"
|
88
|
+
host = Host.create(:name => hostname)
|
89
|
+
host.valid?.should == false
|
90
|
+
host.errors.should == [[:status, :not_present], [:status, :not_member]]
|
91
|
+
end
|
92
|
+
|
93
|
+
it "create a new Host with missing hostname" do
|
94
|
+
status = "up"
|
95
|
+
host = Host.create(:status => status)
|
96
|
+
host.valid?.should == false
|
97
|
+
host.errors.should == [[:name, :not_present]]
|
98
|
+
end
|
99
|
+
|
100
|
+
it "create a new Host with an invalid status" do
|
101
|
+
hostname = "host3.domain.com"
|
102
|
+
status = "online"
|
103
|
+
host = Host.create(:name => hostname, :status => status)
|
104
|
+
host.valid?.should == false
|
105
|
+
host.errors.should == [[:status, :not_member]]
|
106
|
+
end
|
107
|
+
|
108
|
+
it "create a duplicate Host" do
|
109
|
+
hostname = "host1.domain.com"
|
110
|
+
status = "up"
|
111
|
+
host1 = Host.create(:name => hostname, :status => status)
|
112
|
+
host1.save
|
113
|
+
host2 = Host.create(:name => hostname, :status => status)
|
114
|
+
host2.valid?.should == false
|
115
|
+
host2.errors.should == [[:name, :not_unique]]
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "Using the Application API", :reset_redis => false do
|
4
|
+
before(:all) do
|
5
|
+
@a = Application.create(:name => 'rspec_sample_app')
|
6
|
+
@a.configurations << Configuration.create(:name => 'rspec_config', :format => 'string', :body => 'rspec is great', :application => @a)
|
7
|
+
@a.save
|
8
|
+
@c = @a.configurations.first
|
9
|
+
end
|
10
|
+
describe "calling" do
|
11
|
+
|
12
|
+
describe "GET" do
|
13
|
+
it "all applications should work" do
|
14
|
+
get '/a'
|
15
|
+
last_response.should be_ok
|
16
|
+
response = last_response.should return_json
|
17
|
+
response.is_a?(Array).should == true
|
18
|
+
end
|
19
|
+
it "named application should work" do
|
20
|
+
get '/a/rspec_sample_app'
|
21
|
+
last_response.should be_ok
|
22
|
+
response = last_response.should return_json
|
23
|
+
|
24
|
+
response["id"].should == @a.id
|
25
|
+
response["name"].should == @a.name
|
26
|
+
c = response["configurations"].first
|
27
|
+
c["id"].should == @c.id
|
28
|
+
c["name"].should == @c.name
|
29
|
+
c["body"].should == @c.body
|
30
|
+
c["format"].should == @c.format
|
31
|
+
end
|
32
|
+
it "named configuration for application should work" do
|
33
|
+
get "/a/#{@a.name}/#{@c.name}"
|
34
|
+
last_response.should be_ok
|
35
|
+
response = last_response.should return_json
|
36
|
+
|
37
|
+
response["id"].should == @c.id
|
38
|
+
response["name"].should == @c.name
|
39
|
+
response["format"].should == @c.format
|
40
|
+
response["body"].should == @c.body
|
41
|
+
response["application"].should == @a.name
|
42
|
+
end
|
43
|
+
it "invalid application should not work" do
|
44
|
+
get "/a/should_not_exist"
|
45
|
+
last_response.should be_missing
|
46
|
+
end
|
47
|
+
it "invalid configuration for application should not work" do
|
48
|
+
get "/a/should_not_exist/should_not_exist"
|
49
|
+
last_response.should be_missing
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "PUT" do
|
54
|
+
before(:all) do
|
55
|
+
@appdata = {:name => "should_now_exist"}
|
56
|
+
end
|
57
|
+
it "new application should work" do
|
58
|
+
put "/a/#{@appdata[:name]}", @appdata.to_json, "CONTENT_TYPE" => "application/json"
|
59
|
+
last_response.should be_ok
|
60
|
+
response = last_response.should return_json
|
61
|
+
response["result"].should == "success"
|
62
|
+
response["id"].nil?.should == false
|
63
|
+
response["name"].should == @appdata[:name]
|
64
|
+
response["action"].should == "create"
|
65
|
+
Application.find(:name => @appdata[:name]).size.should == 1
|
66
|
+
Application.find(:name => @appdata[:name]).first.is_new?.should == true
|
67
|
+
end
|
68
|
+
it "new application with missing name should not work" do
|
69
|
+
put "/a/should_not_work", '{"foo":"bar"}', "CONTENT_TYPE" => "application/json"
|
70
|
+
last_response.should be_invalid
|
71
|
+
end
|
72
|
+
it "existing application should work" do
|
73
|
+
sleep 3
|
74
|
+
|
75
|
+
put "/a/#{@appdata[:name]}", @appdata.to_json, "CONTENT_TYPE" => "application/json"
|
76
|
+
last_response.should be_ok
|
77
|
+
response = last_response.should return_json
|
78
|
+
response["result"].should == "success"
|
79
|
+
response["id"].nil?.should == false
|
80
|
+
response["name"].should == @appdata[:name]
|
81
|
+
response["action"].should == "update"
|
82
|
+
Application.find(:name => @appdata[:name]).size.should == 1
|
83
|
+
Application.find(:name => @appdata[:name]).first.is_new?.should == false
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe "DELETE" do
|
88
|
+
before(:each) do
|
89
|
+
@appdata = {:name => "should_now_exist"}
|
90
|
+
end
|
91
|
+
it "existing application should work" do
|
92
|
+
delete "/a/#{@appdata[:name]}"
|
93
|
+
last_response.should be_ok
|
94
|
+
response = last_response.should return_json
|
95
|
+
response["result"].should == "success"
|
96
|
+
response["action"].should == "delete"
|
97
|
+
response["id"].nil?.should == false
|
98
|
+
response["name"].should == @appdata[:name]
|
99
|
+
response["configurations"].should == "0"
|
100
|
+
end
|
101
|
+
it "invalid application should not work" do
|
102
|
+
delete "/a/should_not_work"
|
103
|
+
last_response.should be_missing
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
end
|